diff options
Diffstat (limited to 'site/app/twine/twine.csd')
-rw-r--r-- | site/app/twine/twine.csd | 413 |
1 files changed, 413 insertions, 0 deletions
diff --git a/site/app/twine/twine.csd b/site/app/twine/twine.csd new file mode 100644 index 0000000..1f31907 --- /dev/null +++ b/site/app/twine/twine.csd @@ -0,0 +1,413 @@ +<CsoundSynthesizer>
+<CsOptions>
+-odac
+</CsOptions>
+<CsInstruments>
+sr = 44100
+ksmps = 64
+nchnls = 2
+0dbfs = 1
+seed 0
+
+#define ECP_NORECORDING ##
+
+;#include "scss/elasticlip_sequencer.udo"
+#include "/scss/elasticlip.udo"
+;#include "scss/mixer/base.udo"
+#include "/interop.udo"
+#include "/host_platform.udo"
+#include "/bussing.udo"
+#include "/table_tools.udo"
+#include "/lagdetect.udo"
+
+#include "/twigs/twigs.udo"
+#include "/twist/twist.udo"
+
+
+
+instr twine_automaterun
+endin
+
+opcode _twine_playrecurse, i, ikiioj
+ iplayfn, ktimes, imaxchannels, iplayfnsize, index, iusedchanfn xin
+ if (iusedchanfn == -1) then
+ iusedchanfn ftgentmp 0, 0, -imaxchannels, -2, 0
+ endif
+
+ iclipindex tab_i index, iplayfn
+ istart tab_i index + 1, iplayfn
+ iduration tab_i index + 2, iplayfn
+ ichannel tab_i index + 3, iplayfn
+ istartoffset tab_i index + 4, iplayfn
+ tabw_i 1, ichannel, iusedchanfn
+
+ if (ktimes >= istart && ktimes <= istart + iduration) then
+ if (iclipindex < 0) then
+ aL, aR subinstr sprintf("twinescript%d", -iclipindex), iduration, istartoffset
+ else
+ aL, aR subinstr "ecp_playback_tst", -1, iclipindex, iduration, istartoffset ; sort out channels
+ endif
+ bus_mix sprintf("mxchan%d", ichannel), aL, aR
+ endif
+
+ if (index + 5 < iplayfnsize) then
+ i_ _twine_playrecurse iplayfn, ktimes, imaxchannels, iplayfnsize, index + 5, iusedchanfn
+ endif
+ xout iusedchanfn
+endop
+
+opcode _twine_channelrecurse, 0, io
+ iusedchanfn, index xin
+ if (tab_i(index, iusedchanfn) == 1) then
+ a_ subinstr sprintf("twine_channel%d", index)
+ endif
+
+ if (index + 1 < ftlen(iusedchanfn)) then
+ _twine_channelrecurse iusedchanfn, index + 1
+ endif
+endop
+
+opcode twine_playback, aa, ikii
+ iplayfn, ktimes, imaxchannels, iplayfnsize xin
+ gitwst_tf_state[0] = 1
+ gitwst_tf_state[1] = 1
+ iusedchanfn _twine_playrecurse iplayfn, ktimes, imaxchannels, iplayfnsize
+ _twine_channelrecurse iusedchanfn
+ a_ subinstr "twine_automaterun"
+ aL, aR bus_read "twine_master"
+ kamp chnget "twine_masteramp"
+ aL *= kamp
+ aR *= kamp
+ xout aL, aR
+endop
+
+instr twine_masteroutput
+ aL, aR bus_read "twine_master"
+ outs aL, aR
+endin
+
+instr twine_createtable
+ icbid = p4
+ ilen = p5
+ ifn ftgen 0, 0, -ilen, -2, 0
+ io_sendstring("callback", sprintf("{\"cbid\":%d,\"table\":%d}", icbid, ifn))
+ turnoff
+endin
+
+
+instr twine_removetable
+ icbid = p4
+ ifn = p5
+ ftfree ifn, 0
+ io_sendstring("callback", sprintf("{\"cbid\":%d}", icbid))
+ turnoff
+endin
+
+
+instr twine_removeclip
+ icbid = p4
+ iclipindex = p5
+ ecp_removeclip iclipindex
+ io_sendstring("callback", sprintf("{\"cbid\":%d,\"status\":1}", icbid))
+ turnoff
+endin
+
+
+instr twine_render_complete
+ icbid = p4
+ ifnoutL = p5
+ ifnoutR = p6
+ io_sendstring("callback", sprintf("{\"cbid\":%d,\"status\":1,\"fnL\":%d,\"fnR\":%d}", icbid, ifnoutL, ifnoutR))
+ turnoff
+endin
+
+
+instr twine_convertsr_complete
+ icbid = p4
+ io_sendstring("callback", sprintf("{\"cbid\":%d,\"status\":1}", icbid))
+ turnoff
+endin
+
+instr twine_convertsr
+ icbid = p4
+ iclipindex = p5
+ isourcesr = p6
+ ifndata = giecp_fnclips[iclipindex]
+ ifnL tab_i 0, ifndata
+ ifnR tab_i 1, ifndata
+ if (ifnR > 0) then
+ ifnnewL, ifnnewR, kdone tab_samplerateconvert ifnL, ifnR, 1, isourcesr
+ else
+ ifnnewL, kdone tab_samplerateconvert ifnL, 1, isourcesr
+ ifnnewR = 0
+ endif
+ tabw_i ifnnewL, 0, ifndata
+ tabw_i ifnnewR, 1, ifndata
+ if (kdone == 1) then
+ schedulek("twine_convertsr_complete", 0, 1, icbid)
+ turnoff
+ endif
+endin
+
+instr twine_render
+ icbid = p4
+ ifn = p5
+ imaxchannels = p6
+ iduration = p7
+ itarget = p8 ; 0 = ftable, 1 = file,
+ ifnsize = p9
+ ifreeplaybacktable = p11
+ if (itarget == 1) then
+ Spath = strget(p10)
+ ifnoutL = 0
+ ifnoutR = 0
+ else
+ Spath = ""
+ ioutlen = iduration * sr
+ if (ioutlen >= gihost_max32bitftlen) then ; limitation with WASM Csound build at the moment
+ io_sendstring("callback", sprintf("{\"cbid\":%d,\"status\":-2}", icbid))
+ turnoff
+ endif
+ ifnoutL ftgen 0, 0, -ioutlen, -2, 0
+ ifnoutR ftgen 0, 0, -ioutlen, -2, 0
+ endif
+
+ if (ifreeplaybacktable == 1) then
+ ftfree ifn, 1
+ endif
+ p3 = 3600
+
+ iblocks = 100
+
+ ikcycles = round(iduration * kr)
+
+ if (ikcycles < iblocks) then
+ ikcyclesperblock = ikcycles
+ else
+ ikcyclesperblock = round(ikcycles / iblocks)
+ endif
+ ktotalcount init 0
+ klastpercent init 100
+
+ if (ktotalcount < ikcycles) then
+ kcount = 0
+ while (kcount < ikcyclesperblock) do
+ aL, aR twine_playback ifn, ktotalcount / kr, imaxchannels, ifnsize
+ if (itarget == 0) then
+ apos lphasor 1
+ tablew aL, apos, ifnoutL
+ tablew aR, apos, ifnoutR
+ else
+ fout Spath, 14, aL, aR
+ endif
+ kcount += 1
+ ktotalcount += 1
+ od
+ kpercent = round((100 / ikcycles) * ktotalcount)
+ if (kpercent != klastpercent) then
+ io_send "percent", kpercent
+ klastpercent = kpercent
+ endif
+ else
+ schedulek("twine_render_complete", 0, 1, icbid, ifnoutL, ifnoutR)
+ turnoff
+ endif
+endin
+
+instr twine_getsr
+ icbid = p4
+ io_sendstring("callback", sprintf("{\"cbid\":%d,\"sr\":%d}", icbid, sr))
+ turnoff
+endin
+
+instr twine_playback_complete
+ icbid = p4
+ io_sendstring("callback", sprintf("{\"cbid\":%d,\"status\":0}", icbid))
+ turnoff
+endin
+
+instr twine_playback_lag
+ icbid = p4
+ turnoff2 "twine_playback", 0, 0
+ io_sendstring("callback", sprintf("{\"cbid\":%d,\"status\":-1}", icbid))
+ turnoff
+endin
+
+instr twine_playback
+ icbid = p4
+ ifn = p5
+ imaxchannels = p6
+ ifnsize = p7
+ ifreeplaybacktable = p8
+ io_sendstring("callback", sprintf("{\"cbid\":%d,\"status\":1}", icbid))
+
+ if (ifreeplaybacktable == 1) then
+ ftfree ifn, 1
+ endif
+
+ ktimes timeinsts
+ chnset ktimes, "twine_playpos"
+ aL, aR twine_playback ifn, ktimes, imaxchannels, ifnsize
+ klevel = rms:k((aL + aR) / 2) * 1.4
+ chnset klevel, "twine_mastervu"
+ outs aL, aR
+
+ klagging lagdetect 1.1
+ if (klagging == 1) then
+ schedulek("twine_playback_lag", 0, 1, icbid)
+ endif
+
+ kreleasing init 0
+ if (lastcycle:k() == 1 || (kreleasing == 0 && release:k() == 1)) then
+ kreleasing = 1
+ schedulek("twine_playback_complete", 0, 1, icbid)
+ endif
+endin
+
+instr twine_playback_complete
+ icbid = p4
+ io_sendstring("callback", sprintf("{\"cbid\":%d,\"status\":0}", icbid))
+ turnoff
+endin
+
+instr twine_playbackwatchdog
+ icbid = p4
+ kreleasing init 0
+ if (lastcycle:k() == 1 || (kreleasing == 0 && release:k() == 1)) then
+ kreleasing = 1
+ schedulek("twine_playback_complete", 0, 1, icbid)
+ endif
+endin
+
+
+instr twine_stopplayback
+ turnoff2 "ecp_playback", 0, 1
+ turnoff3 "ecp_playback"
+ turnoff2 "twine_playback", 0, 1
+ turnoff2 "twine_playbackwatchdog", 0, 1
+ turnoff
+endin
+
+
+
+instr twine_setbpm
+ ibpm = p4
+ gkseq_tempo init ibpm
+ turnoff
+endin
+
+
+instr twine_createblankclip
+ icbid = p4
+ istereo = p5
+ iduration = p6
+ ilen = iduration * sr
+ ifnL ftgen 0, 0, -ilen, 2, 0
+ if (istereo == 1) then
+ ifnR ftgen 0, 0, -ilen, 2, 0
+ else
+ ifnR = 0
+ endif
+
+ iclipindex ecp_addclip "", ifnL, ifnR, 4, 4
+ Sresponse = sprintf("{\"cbid\":%d,\"status\":1,\"data\":{\"clipindex\":%d,\"datatable\":%d}}", icbid, iclipindex, giecp_fnclips[iclipindex])
+ io_sendstring("callback", Sresponse)
+ turnoff
+endin
+
+instr twine_importclip
+ icbid = p4
+ idatafn = p5
+ iclipindex ecp_importclip idatafn
+ Sresponse = sprintf("{\"cbid\":%d,\"status\":1,\"data\":{\"clipindex\":%d,\"datatable\":%d}}", icbid, iclipindex, idatafn)
+ io_sendstring("callback", Sresponse)
+ turnoff
+endin
+
+instr twine_loadftables
+ icbid = p4
+ ifnL = p5
+ ifnR = p6
+ istatus = -10
+ Sdata = "{}"
+
+ if (ifnL <= 0) then
+ istatus = -1
+ goto complete
+ endif
+
+ iclipindex ecp_addclip "", ifnL, ifnR, 4, 4 ; name not really required any more, beats contentious, analyse and also set warp mode
+ Sdata = sprintf("{\"clipindex\":%d,\"datatable\":%d}", iclipindex, giecp_fnclips[iclipindex])
+
+complete:
+ Sresponse = sprintf("{\"cbid\":%d,\"status\":%d,\"data\":%s}", icbid, istatus, Sdata)
+ io_sendstring("callback", Sresponse)
+ turnoff
+endin
+
+instr twine_loadpath
+ icbid = p4
+ Spath = strget(p5)
+ iforcemono = p6
+ istatus = -10
+ Sdata = "{}"
+
+ if (filevalid(Spath) != 1) then
+ istatus = -1
+ goto complete
+ endif
+
+ ifilesr = filesr(Spath)
+ ilens = filelen(Spath)
+ ilen = round(ilens * ifilesr)
+
+ if (ilen >= gihost_max32bitftlen || ilens * sr >= gihost_max32bitftlen) then ; limitation with WASM Csound build at the moment
+ istatus = -2
+ goto complete
+ endif
+
+ iclipindex ecp_loadsound Spath, 4, iforcemono ; beats contentious, analyse and also set warp mode, also SR conversion
+ Sdata = sprintf("{\"clipindex\":%d,\"datatable\":%d}", iclipindex, giecp_fnclips[iclipindex])
+
+ istatus = 1
+
+complete:
+ Sresponse = sprintf("{\"cbid\":%d,\"status\":%d,\"data\":%s}", icbid, istatus, Sdata)
+ io_sendstring("callback", Sresponse)
+ turnoff
+endin
+
+instr twine_setclipaudiounique
+ icbid = p4
+ iclipindex = p5
+ ecp_setaudiounique iclipindex
+ io_sendstring("callback", sprintf("{\"cbid\":%d}", icbid))
+ turnoff
+endin
+
+instr twine_cloneclip
+ icbid = p4
+ iclipindex = p5
+
+ inewclipindex ecp_cloneclip iclipindex
+ io_sendstring("callback", sprintf("{\"cbid\":%d,\"clipindex\":%d,\"datatable\":%d}", icbid, inewclipindex, giecp_fnclips[inewclipindex]))
+ turnoff
+endin
+
+
+instr twine_clipreplacetables
+ icbid = p4
+ iclipindex = p5
+ ifnL = p6
+ ifnR = p7
+ ecp_replacetables iclipindex, ifnL, ifnR
+ io_sendstring("callback", sprintf("{\"cbid\":%d,\"clipindex\":%d,\"datatable\":%d}", icbid, iclipindex, giecp_fnclips[iclipindex]))
+ turnoff
+endin
+
+
+</CsInstruments>
+<CsScore>
+f0 z
+</CsScore>
+</CsoundSynthesizer>
\ No newline at end of file |