From 9fbf91db06a6d4f4b5cd8bb45389a731bb86bf22 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 13 Apr 2025 18:48:02 +0100 Subject: initial --- site/app/twine/twine.csd | 413 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 413 insertions(+) create mode 100644 site/app/twine/twine.csd (limited to 'site/app/twine/twine.csd') 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 @@ + + +-odac + + +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 + + + + +f0 z + + \ No newline at end of file -- cgit v1.2.3