From 9fbf91db06a6d4f4b5cd8bb45389a731bb86bf22 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 13 Apr 2025 18:48:02 +0100 Subject: initial --- site/udo/twigs/checkpointing.udo | 120 +++++++++++ site/udo/twigs/transforms.udo | 285 +++++++++++++++++++++++++ site/udo/twigs/twigs.udo | 444 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 849 insertions(+) create mode 100755 site/udo/twigs/checkpointing.udo create mode 100755 site/udo/twigs/transforms.udo create mode 100755 site/udo/twigs/twigs.udo (limited to 'site/udo/twigs') diff --git a/site/udo/twigs/checkpointing.udo b/site/udo/twigs/checkpointing.udo new file mode 100755 index 0000000..bd2594e --- /dev/null +++ b/site/udo/twigs/checkpointing.udo @@ -0,0 +1,120 @@ +#ifndef UDO_TWIGS_CHECKPOINTING +#define UDO_TWIGS_CHECKPOINTING ## + +gitwgs_maxundolevels = 32 +gitwgs_checkpoints[] init gitwgs_maxundolevels +gitwgs_checkpointstate = 0 +gitwgs_checkpointencodemult = 10000 + + +opcode twgs_checkpoint_encode, i, ii + ifnL, ifnR xin + iencoded = (ifnL * gitwgs_checkpointencodemult) + (ifnR / gitwgs_checkpointencodemult) + xout iencoded +endop + +opcode twgs_checkpoint_decode, ii, i + iencoded xin + ifnL = int(iencoded) / gitwgs_checkpointencodemult + ifnR = frac(iencoded) * gitwgs_checkpointencodemult + xout ifnL, ifnR +endop + +opcode twgs_checkpoint_clear, 0, 0 + icheckpointnumber = gitwgs_checkpointstate + while (icheckpointnumber >= 0) do + ifnL, ifnR twgs_checkpoint_decode gitwgs_checkpoints[icheckpointnumber] + if (ifnL > 0 && ftexists(ifnL) == 1) then + tpvf_destroy ifnL + endif + if (ifnR > 0 && ftexists(ifnR) == 1) then + tpvf_destroy ifnR + endif + icheckpointnumber -= 1 + od + gitwgs_checkpointstate = 0 +endop + +opcode twgs_checkpoint, 0, 0 + imaxundo chnget "twgs_maxundo" + imaxundo = (imaxundo == -1) ? gitwgs_maxundolevels : imaxundo + if (imaxundo == 0 || imaxundo > gitwgs_maxundolevels) then + goto complete + endif + + icheckpointnumber = gitwgs_checkpointstate + if (icheckpointnumber >= imaxundo) then + ifnL, ifnR twgs_checkpoint_decode gitwgs_checkpoints[0] + if (ifnL > 0 && ftexists(ifnL) == 1) then + tpvf_destroy ifnL + endif + if (ifnR > 0 && ftexists(ifnR) == 1) then + tpvf_destroy ifnR + endif + index = 1 + itemp[] = gitwgs_checkpoints + while (index <= imaxundo) do + gitwgs_checkpoints[index - 1] = itemp[index] + index += 1 + od + gitwgs_checkpointstate = icheckpointnumber ;- 1 + else + gitwgs_checkpointstate = icheckpointnumber + 1 + endif + + ifnL = gitwgs_tpvfHandleL + ifnR = gitwgs_tpvfHandleR + + ifnCheckpointL tpvf_clone ifnL +print ifnCheckpointL + if (ifnR > 0) then + ifnCheckpointR tpvf_clone ifnR + else + ifnCheckpointR = 0 + endif + + iencoded twgs_checkpoint_encode ifnCheckpointL, ifnCheckpointR + gitwgs_checkpoints[icheckpointnumber] = iencoded + +complete: +endop + +opcode twgs_undo, i, p + iapplyundo xin + + icheckpointnumber = gitwgs_checkpointstate + + icheckpointnumber -= 1 + if (icheckpointnumber < 0) then + istatus = -1 + goto complete + endif + + gitwgs_checkpointstate = icheckpointnumber + ifnL, ifnR twgs_checkpoint_decode gitwgs_checkpoints[icheckpointnumber] + + if (iapplyundo == 1) then ; apply or just step back and forget + if (ifnL > 0 && ftexists(ifnL) = 1) then + tpvf_destroy gitwgs_tpvfHandleL + gitwgs_tpvfHandleL = ifnL + endif + if (ifnR > 0 && ftexists(ifnR) == 1) then + tpvf_destroy gitwgs_tpvfHandleR + gitwgs_tpvfHandleR = ifnR + endif + else + if (ifnL > 0 && ftexists(ifnL) = 1) then + tpvf_destroy ifnL + endif + if (ifnL > 0 && ftexists(ifnR) = 1) then + tpvf_destroy ifnR + endif + endif + + istatus = 1 + +complete: + xout istatus +endop + +#end diff --git a/site/udo/twigs/transforms.udo b/site/udo/twigs/transforms.udo new file mode 100755 index 0000000..c5a7239 --- /dev/null +++ b/site/udo/twigs/transforms.udo @@ -0,0 +1,285 @@ +#ifndef UDO_TWIGS_TRANSFORMS +#define UDO_TWIGS_TRANSFORMS ## +/* + Twigs transforms + + This file is part of the SONICS UDO collection by Richard Knight 2024, 2025 + License: GPL-2.0-or-later + http://1bpm.net +*/ + +instr twgs_freqshift + icbid = p4 + ishift = p5 + inocheckpoint = p6 + p3 = 3600 + + if (inocheckpoint != 1) then + twgs_checkpoint() + endif + + indexbin = 0 + ifnfreqL tab_i 3, gitwgs_tpvfHandleL + if (gitwgs_channels == 2) then + ifnfreqR tab_i 3, gitwgs_tpvfHandleR + endif + ibins = ftlen(gitwgs_fnbinselection) + while (indexbin < ftlen(gitwgs_fnbinselection)) do + if (tab_i(indexbin, gitwgs_fnbinselection) == 1) then + index, iendindex twgs_getselectionindexes indexbin + while (index < iendindex) do + ival = tab_i(index, ifnfreqL) + ival = max(min(ival + ishift, sr / 2), 0) + tabw_i(ival, index, ifnfreqL) + if (gitwgs_channels == 2) then + ival = tab_i(index, ifnfreqR) + ival = max(min(ival + ishift, sr / 2), 0) + tabw_i(ival, index, ifnfreqR) + endif + index += ibins + od + endif + indexbin += 1 + od + io_sendstring("callback", twgs_refreshviewresponse(icbid)) + turnoff +endin + +instr twgs_amplify + icbid = p4 + ifactor = p5 + p3 = 3600 + + twgs_checkpoint() + + indexbin = 0 + ifnampL tab_i 2, gitwgs_tpvfHandleL + if (gitwgs_channels == 2) then + ifnampR tab_i 2, gitwgs_tpvfHandleR + endif + ibins = ftlen(gitwgs_fnbinselection) + while (indexbin < ftlen(gitwgs_fnbinselection)) do + if (tab_i(indexbin, gitwgs_fnbinselection) == 1) then + index, iendindex twgs_getselectionindexes indexbin + while (index < iendindex) do + ival = tab_i(index, ifnampL) + ival *= ifactor + tabw_i(ival, index, ifnampL) + if (gitwgs_channels == 2) then + ival = tab_i(index, ifnampR) + ival *= ifactor + tabw_i(ival, index, ifnampR) + endif + index += ibins + od + endif + indexbin += 1 + od + io_sendstring("callback", twgs_refreshviewresponse(icbid)) + turnoff +endin + + +instr twgs_movement + icbid = p4 + iframeshift = p5 + + twgs_checkpoint() + + itype chnget "twgs_movementtype" + interpolatevoid chnget "twgs_interpolatevoid" + interpratio chnget "twgs_interpolateratio" + icopy = 0 + imoveinterp = 0 + if (itype == 0) then + icopy = 1 + else + if (itype == 1) then + imovemode = 0 + else + imoveinterp = interpolatevoid + imovemode = itype - 1 + endif + endif + + p3 = 3600 + ifnAmpL tab_i 2, gitwgs_tpvfHandleL + ifnFreqL tab_i 3, gitwgs_tpvfHandleL + if (gitwgs_channels == 2) then + ifnAmpR tab_i 2, gitwgs_tpvfHandleR + ifnFreqR tab_i 3, gitwgs_tpvfHandleR + endif + itablen = ftlen(ifnAmpL) + ifftsize tab_i 0, gitwgs_tpvfHandleL + ibins = ifftsize / 2 + indexbin = 0 + while (indexbin < ftlen(gitwgs_fnbinselection)) do + if (tab_i(indexbin, gitwgs_fnbinselection) == 1) then + istartindex, iendindex twgs_getselectionindexes indexbin +;prints sprintf("bin %d, start %f, end %f\n", indexbin, istartindex / ibins, iendindex / ibins) + if (interpratio > 0) then + interpframes = floor(interpratio * ((iendindex - istartindex) / ibins)) + interpaddIndex = interpframes * ibins + + interpendaddAmpLend = (tab_i(iendindex, ifnAmpL) - tab_i(iendindex - interpaddIndex, ifnAmpL)) / interpframes + interpendaddFreqLend = (tab_i(iendindex, ifnFreqL) - tab_i(iendindex - interpaddIndex, ifnFreqL)) / interpframes + interpendaddAmpLstart = (tab_i(istartindex + interpaddIndex, ifnAmpL) - tab_i(istartindex, ifnAmpL)) / interpframes + interpendaddFreqLstart = (tab_i(istartindex + interpaddIndex, ifnFreqL) - tab_i(istartindex, ifnFreqL)) / interpframes + if (gitwgs_channels == 2) then + interpendaddAmpRend = (tab_i(istartindex + interpaddIndex, ifnAmpR) - tab_i(istartindex, ifnAmpR)) / interpframes + interpendaddFreqRend = (tab_i(istartindex + interpaddIndex, ifnFreqR) - tab_i(istartindex, ifnFreqR)) / interpframes + interpendaddAmpRstart = (tab_i(istartindex + interpaddIndex, ifnAmpR) - tab_i(istartindex, ifnAmpR)) / interpframes + interpendaddFreqRstart = (tab_i(istartindex + interpaddIndex, ifnFreqR) - tab_i(istartindex, ifnFreqR)) / interpframes + endif + endif + itemplen = ceil((iendindex - istartindex) / ibins) + ifntempAmpL ftgen 0, 0, -itemplen, 2, 0 + ifntempFreqL ftgen 0, 0, -itemplen, 2, 0 + if (gitwgs_channels == 2) then + ifntempAmpR ftgen 0, 0, -itemplen, 2, 0 + ifntempFreqR ftgen 0, 0, -itemplen, 2, 0 + endif + + index = istartindex + iwriteindex = 0 + while (index < iendindex) do + tabw_i(tab_i(index, ifnAmpL), iwriteindex, ifntempAmpL) + tabw_i(tab_i(index, ifnFreqL), iwriteindex, ifntempFreqL) + if (gitwgs_channels == 2) then + tabw_i(tab_i(index, ifnAmpR), iwriteindex, ifntempAmpR) + tabw_i(tab_i(index, ifnFreqR), iwriteindex, ifntempFreqR) + endif + index += ibins + iwriteindex += 1 + od + + isetvalAmpL = -1 + isetvalFreqL = -1 + isetvalAmpR = -1 + isetvalFreqR = -1 + interpvalAmpL = -1 + interpvalFreqL = -1 + interpvalAmpR = -1 + interpvalFreqR = -1 + + if (imovemode == 0) then + isetvalAmpL = 0 + isetvalFreqL = 0 + isetvalAmpR = 0 + isetvalFreqR = 0 + else ; hold last: 1 = amp and freq, 2 = amp, 3 = freq + ilastindex = istartindex - ibins + if (ilastindex < 0) then + ilastindex = istartindex + endif + if (imovemode == 2 || imovemode == 1) then + isetvalAmpL = tab_i(ilastindex, ifnAmpL) + if (imoveinterp == 1) then + interpvalAmpL = (tab_i(iendindex, ifnAmpL) - isetvalAmpL) / abs:i(iframeshift) + endif + if (gitwgs_channels == 2) then + isetvalAmpR = tab_i(ilastindex, ifnAmpR) + if (imoveinterp == 1) then + interpvalAmpR = (tab_i(iendindex, ifnAmpR) - isetvalAmpR) / abs:i(iframeshift) + endif + endif + endif + if (imovemode == 3 || imovemode == 1) then + isetvalFreqL = tab_i(ilastindex, ifnFreqL) + if (imoveinterp == 1) then + interpvalFreqL = (tab_i(iendindex, ifnFreqL) - isetvalFreqL) / abs:i(iframeshift) + endif + if (gitwgs_channels == 2) then + isetvalFreqR = tab_i(ilastindex, ifnFreqR) + if (imoveinterp == 1) then + interpvalFreqR = (tab_i(iendindex, ifnFreqR) - isetvalFreqR) / abs:i(iframeshift) + endif + endif + endif + endif + + index = istartindex + iabsindex = 0 + ireadindex = 0 + while (index < iendindex) do + inewindex = index + (iframeshift * ibins) + + if (inewindex >= itablen - 1) then + inewindex = itablen - 1 + elseif (inewindex < 0) then + inewindex = 0 + endif + if (icopy == 0) then + if (imoveinterp == 1) then + isetvalAmpL = (isetvalAmpL != -1) ? isetvalAmpL + interpvalAmpL : -1 + isetvalFreqL = (isetvalFreqL != -1) ? isetvalFreqL + interpvalFreqL : -1 + if (gitwgs_channels == 2) then + isetvalAmpR = (isetvalAmpR != -1) ? isetvalAmpR + interpvalAmpR : -1 + isetvalFreqR = (isetvalFreqR != -1) ? isetvalFreqR + interpvalFreqR : -1 + endif + endif + + if (isetvalAmpL > 0) then + tabw_i(isetvalAmpL, index, ifnAmpL) + endif + if (isetvalFreqL > 0) then + tabw_i(isetvalFreqL, index, ifnFreqL) + endif + if (gitwgs_channels > 0) then + if (isetvalAmpR != -1) then + tabw_i(isetvalAmpR, index, ifnAmpR) + endif + if (isetvalFreqR > 0) then + tabw_i(isetvalFreqR, index, ifnFreqR) + endif + endif + endif + ivalAmpL = tab_i(ireadindex, ifntempAmpL) + ivalFreqL = tab_i(ireadindex, ifntempFreqL) + if (interpratio > 0) then + if (iabsindex < istartindex + interpaddIndex) then + ivalAmpL += interpendaddAmpLstart + ivalFreqL += interpendaddFreqLstart + elseif (iabsindex > iendindex - interpaddIndex) then + ivalAmpL += interpendaddAmpLend + ivalFreqL += interpendaddFreqLend + endif + endif + tabw_i(ivalAmpL, inewindex, ifnAmpL) + tabw_i(ivalFreqL, inewindex, ifnFreqL) + + if (gitwgs_channels == 2) then + ivalAmpR = tab_i(ireadindex, ifntempAmpR) + ivalFreqR = tab_i(ireadindex, ifntempFreqR) + if (interpratio > 0) then + if (iabsindex < istartindex + interpaddIndex) then + ivalAmpR += interpendaddAmpRstart + ivalFreqR += interpendaddFreqRstart + elseif (iabsindex > iendindex - interpaddIndex) then + ivalAmpR += interpendaddAmpRend + ivalFreqR += interpendaddFreqRend + endif + endif + tabw_i(ivalAmpR, inewindex, ifnAmpR) + tabw_i(ivalFreqR, inewindex, ifnFreqR) + endif + index += ibins + iabsindex += ibins + ireadindex += 1 + od + + ftfree ifntempAmpL, 0 + ftfree ifntempFreqL, 0 + if (gitwgs_channels == 2) then + ftfree ifntempAmpR, 0 + ftfree ifntempFreqR, 0 + endif + endif + indexbin += 1 + od + + io_sendstring("callback", twgs_refreshviewresponse(icbid)) + turnoff +endin + +#end diff --git a/site/udo/twigs/twigs.udo b/site/udo/twigs/twigs.udo new file mode 100755 index 0000000..a4bda3f --- /dev/null +++ b/site/udo/twigs/twigs.udo @@ -0,0 +1,444 @@ +#ifndef UDO_TWIGS +#define UDO_TWIGS ## +/* + Twigs + Spectral transformer + + This file is part of the SONICS UDO collection by Richard Knight 2024, 2025 + License: GPL-2.0-or-later + http://1bpm.net +*/ + +#include "/pvs_fulltabproc.udo" +#include "/host_platform.udo" +#include "/lagdetect.udo" +#include "/interop.udo" + +gitwgs_bufferL = -1 +gitwgs_bufferR = -1 +gitwgs_tpvfHandleL = -1 +gitwgs_tpvfHandleR = -1 +gitwgs_channels = -1 +gitwgs_userstopped = 0 +gitwgs_fnbinselection = -1 +gitwgs_fnbintimeselection = -1 + +#include "/twigs/checkpointing.udo" + +opcode twgs_getselectionindexes, ii, i + indexbin xin + ibins = ftlen(gitwgs_fnbinselection) + itablen = ftlen(tab_i(2, gitwgs_tpvfHandleL)) + iframes = itablen / ibins + istartindex = (round(tab_i(indexbin, gitwgs_fnbintimeselection) * iframes) * ibins) + indexbin + iendindex = (round(tab_i(indexbin + ibins, gitwgs_fnbintimeselection) * iframes) * ibins) + indexbin + if (iendindex > itablen) then + iendindex = itablen + endif + +;print tab_i(indexbin, gitwgs_fnbintimeselection) +;print istartindex +;print tab_i(indexbin + ibins, gitwgs_fnbintimeselection) +;print iendindex + xout istartindex, iendindex +endop + +opcode twgs_failresponse, S, ij + icbid, istatus xin + xout sprintf("{\"cbid\":%d,\"status\":%d}", icbid, istatus) +endop + + +opcode twgs_refreshviewresponse, S, i + icbid xin + ifnampL tab_i 2, gitwgs_tpvfHandleL + ifnfreqL tab_i 3, gitwgs_tpvfHandleL + iduration tab_i 4, gitwgs_tpvfHandleL + if (gitwgs_channels == 2) then + ifnampR tab_i 2, gitwgs_tpvfHandleR + ifnfreqR tab_i 3, gitwgs_tpvfHandleR + else + ifnampR = -1 + ifnfreqR = -1 + endif + xout sprintf("{\"cbid\":%d,\"status\":1,\"tables\":[%d,%d,%d,%d],\"duration\":%f,\"undolevel\":%d}", icbid, ifnampL, ifnfreqL, ifnampR, ifnfreqR, iduration, gitwgs_checkpointstate) +endop + + +opcode twgs_clearbuffers, 0, pp + ihandles, ibuffers xin + if (ibuffers == 1) then + if (gitwgs_bufferL > 0 && ftexists(gitwgs_bufferL) == 1) then + ftfree gitwgs_bufferL, 0 + gitwgs_bufferL = -1 + endif + if (gitwgs_bufferR > 0 && ftexists(gitwgs_bufferR) == 1) then + ftfree gitwgs_bufferR, 0 + gitwgs_bufferR = -1 + endif + endif + + if (ihandles == 1) then + if (gitwgs_tpvfHandleL > 0 && ftexists(gitwgs_tpvfHandleL) == 1) then + ftfree gitwgs_tpvfHandleL, 0 + gitwgs_tpvfHandleL = -1 + endif + if (gitwgs_tpvfHandleR > 0 && ftexists(gitwgs_tpvfHandleR) == 1) then + ftfree gitwgs_tpvfHandleR, 0 + gitwgs_tpvfHandleR = -1 + endif + gitwgs_channels = -1 + endif +endop + +opcode twgs_loadfile, ik, Sjj + Spath, ifftsize, ifftdecimation xin + kdone init 0 + if (filevalid(Spath) != 1) then + iresponse = -1 + goto complete + endif + + ifilesr = filesr(Spath) + ifilechannels = filenchnls(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 + iresponse = -2 + goto complete + endif + + gitwgs_channels = ifilechannels + twgs_clearbuffers() + twgs_checkpoint_clear() + + gitwgs_bufferL = ftgen(0, 0, -ilen, 1, Spath, 0, 0, 1) + if (gitwgs_channels == 2) then + gitwgs_bufferR = ftgen(0, 0, -ilen, 1, Spath, 0, 0, 2) + imono = 0 + else + imono = 1 + endif + + if (sr != ifilesr) then ; different sr causes issues in table reading opcodes, convert.. + inewlen = ilens * sr + ifnnewL ftgen 0, 0, -inewlen, -2, 0 + if (imono == 0) then + ifnnewR ftgen 0, 0, -inewlen, -2, 0 + endif + ktimek timeinstk + ikcycles = ilens * kr + if (ktimek == 1) then + kcount = 0 + while (kcount < ikcycles) do + aposw linseg 0, ilens, inewlen - 1 + aposr linseg 0, ilens, ilen - 1 + asig table3 aposr, gitwgs_bufferL + tablew asig, aposw, ifnnewL + if (imono == 0) then + asig table3 aposr, gitwgs_bufferR + tablew asig, aposw, ifnnewR + endif + kcount += 1 + od + else + kdone = 1 + endif + + ftfree gitwgs_bufferL, 1 + gitwgs_bufferL = ifnnewL + if (imono == 0) then + ftfree gitwgs_bufferR, 1 + gitwgs_bufferR = ifnnewR + endif + else + kdone = 1 + endif + + iresponse = 1 +complete: + xout iresponse, kdone +endop + + +#include "/twigs/transforms.udo" + + +instr twgs_undo + icbid = p4 + + istatus twgs_undo + if (istatus < 0) then + Sresponse = twgs_failresponse(icbid) + else + Sresponse = twgs_refreshviewresponse(icbid) + endif + + io_sendstring("callback", Sresponse) + turnoff +endin + + +instr twgs_stop + gitwgs_userstopped = 1 + turnoff2 "twgs_play", 0, 1 + turnoff +endin + +instr twgs_playcomplete_response + icbid = p4 + istatus = 0 + if (gitwgs_userstopped == 1) then + istatus = 3 + endif + io_sendstring("callback", sprintf("{\"cbid\":%d,\"status\":%d}", icbid, istatus)) + turnoff +endin + +instr twgs_playlag_response + icbid = p4 + turnoff2 "twgs_play", 0, 0 + io_sendstring("callback", sprintf("{\"cbid\":%d,\"status\":-1}", icbid)) + turnoff +endin + +instr twgs_play + icbid = p4 + iplaytype = p5 ; 0 = from analysis, 1 = from buffer + iselectedonly = p6 + istart = p7 + iend = p8 + iresynthtype = p9 ; 0 = pvsynth, 1 = pvsadsyn + gitwgs_userstopped = 0 + io_sendstring("callback", sprintf("{\"cbid\":%d,\"status\":1}", icbid)) + + ilen = tab_i(4, gitwgs_tpvfHandleL) + p3 = ilen * (iend - istart) + + if (iplaytype == 0) then + if (iselectedonly == 1) then + ibinselection = gitwgs_fnbinselection + else + ibinselection = -1 + endif + + istartframe = tpvf_framecount(gitwgs_tpvfHandleL) * istart + aL, k_ tpvf_resynth gitwgs_tpvfHandleL, ibinselection, iresynthtype, 0, istartframe + aL dcblock aL + if (gitwgs_channels == 2) then + aR, k_ tpvf_resynth gitwgs_tpvfHandleR, ibinselection, iresynthtype, istartframe + aR dcblock aR + else + aR = aL + endif + else + apos lphasor 1 + apos += (istart * ftlen(gitwgs_bufferL)) + aL table3 apos, gitwgs_bufferL + if (gitwgs_channels == 2) then + aR table3 apos, gitwgs_bufferR + else + aR = aL + endif + endif + + kpos linseg istart, p3, iend + chnset kpos, "twgs_playposratio" + + klagging lagdetect 1.1 + if (klagging == 1) then + schedulek("twgs_playlag_response", 0, 1, icbid) + endif + + kreleasing init 0 + ktimek timeinstk + iduration = (p3 * kr) ;+ (iextracycles / sr) + krelease release + if (kreleasing == 0 && (krelease == 1 || ktimek >= iduration)) then + kreleasing = 1 + schedulek("twgs_playcomplete_response", 0, 1, icbid) + turnoff + endif + outs aL, aR +endin + + +instr twgs_resynth_response + icbid = p4 + io_sendstring("callback", sprintf("{\"cbid\":%d,\"status\":1}", icbid)) + turnoff +endin + +instr twgs_resynth + icbid = p4 + Snext = strget(p5) + iresynthtype = p6 ; 0 = pvsynth, 1 = pvsadsyn + p3 = 3600 + io_sendstring("callback", sprintf("{\"cbid\":%d,\"status\":5}", icbid)) + twgs_clearbuffers(0, 1) + kdone init 0 + gitwgs_bufferL, kdoneL tpvf_resynth_offline gitwgs_tpvfHandleL, iresynthtype + if (gitwgs_channels == 2) then + gitwgs_bufferR, kdoneR tpvf_resynth_offline gitwgs_tpvfHandleR, iresynthtype + else + kdoneR init 1 + endif + if (kdoneL == 1 && kdoneR == 1) then + schedulek(Snext, 0, 1, icbid, 1) + turnoff + endif +endin + +instr twgs_getbuffers + icbid = p4 + if (gitwgs_channels == 2) then + Stables = sprintf("[%d,%d]", gitwgs_bufferL, gitwgs_bufferR) + else + Stables = sprintf("[%d]", gitwgs_bufferL) + endif + io_sendstring("callback", sprintf("{\"cbid\":%d,\"status\":1,\"tables\":%s}", icbid, Stables)) + turnoff +endin + + +instr twgs_savefile_response + icbid = p4 + Spath = p5 + io_sendstring("callback", sprintf("{\"cbid\":%d,\"status\":1,\"path\":\"%s\"}", icbid, Spath)) + turnoff +endin + + +instr twgs_savefile + icbid = p4 + Spath = strget(p5) + + ktimek timeinstk + idurations = ftlen(gitwgs_bufferL) / sr + ikcycles = idurations * kr + if (ktimek == 1) then + kcount init 0 + while (kcount < ikcycles) do + apos lphasor 1 + aL table apos, gitwgs_bufferR + if (gitwgs_channels == 1) then + fout Spath, 14, aL + else + aR table3 apos, gitwgs_bufferL + fout Spath, 14, aL, aR + endif + kcount += 1 + od + else + schedulek("twgs_savefile_response", 0, 1, icbid, Spath) + turnoff + endif +endin + + + +instr twgs_loadfilecomplete_response + icbid = p4 + ifftsize tab_i 0, gitwgs_tpvfHandleL + ifftdecimation tab_i 1, gitwgs_tpvfHandleL + ifnampL tab_i 2, gitwgs_tpvfHandleL + ifnfreqL tab_i 3, gitwgs_tpvfHandleL + iduration tab_i 4, gitwgs_tpvfHandleL + if (gitwgs_channels == 2) then + ifnampR tab_i 2, gitwgs_tpvfHandleR + ifnfreqR tab_i 3, gitwgs_tpvfHandleR + else + ifnampR = -1 + ifnfreqR = -1 + endif + + Sresponse = sprintf("{\"cbid\":%d,\"status\":1,\"channels\":%d,\"tables\":[%d,%d,%d,%d],\"bins\":%d,\"binseltab\":%d,\"bintimeseltab\":%d,\"duration\":%f,\"undolevel\":%d,\"fftdecim\":%d,\"sr\":%d}", icbid, gitwgs_channels, ifnampL, ifnfreqL, ifnampR, ifnfreqR, ifftsize / 2, gitwgs_fnbinselection, gitwgs_fnbintimeselection, iduration, gitwgs_checkpointstate, ifftdecimation, sr) + io_sendstring("callback", Sresponse) + turnoff +endin + +instr twgs_loadfile_analysis + icbid = p4 + ifftsize = p5 + ifftdecimation = p6 + + itablen = tpvf_tablen(ftlen(gitwgs_bufferL), ifftsize, ifftdecimation) + if (itablen >= gihost_max32bitftlen) then + io_sendstring("callback", twgs_failresponse(icbid, -2)) + turnoff + endif + + kdoneL, gitwgs_tpvfHandleL tpvf_analyse gitwgs_bufferL, ifftsize, ifftdecimation + ftfree gitwgs_bufferL, 1 + if (gitwgs_channels == 2) then + kdoneR, gitwgs_tpvfHandleR tpvf_analyse gitwgs_bufferR, ifftsize, ifftdecimation + ftfree gitwgs_bufferR, 1 + else + istatusR = 1 + kdoneR init 1 + endif + + if (gitwgs_fnbinselection > 0) then + ftfree gitwgs_fnbinselection, 0 + endif + gitwgs_fnbinselection ftgen 0, 0, -(ifftsize / 2), -2, 0 + + if (gitwgs_fnbintimeselection > 0) then + ftfree gitwgs_fnbintimeselection, 0 + endif + gitwgs_fnbintimeselection ftgen 0, 0, -ifftsize, -2, 0 + + if (kdoneL == 1 && kdoneR == 1) then + schedule("twgs_loadfilecomplete_response", 0, 1, icbid) + turnoff + endif +endin + + +instr twgs_loadftable + icbid = p4 + ifftsize = p5 + ifftdecimation = p6 + ifnL = p7 + ifnR = p8 + iclearaudiobuffers = p9 + + if (ifnL <= 0 || ftexists(ifnL) == 0 || (ifnR > 0 && ftexists(ifnR) == 0)) then + io_sendstring("callback", twgs_failresponse(icbid, -1)) + turnoff + endif + + twgs_clearbuffers(1, iclearaudiobuffers) + twgs_checkpoint_clear() + + gitwgs_bufferL = ifnL + if (ifnR > 0) then + gitwgs_bufferR = ifnR + gitwgs_channels = 2 + else + gitwgs_channels = 1 + endif + + schedule("twgs_loadfile_analysis", 0, 1, icbid, ifftsize, ifftdecimation) + turnoff +endin + +instr twgs_loadfile + icbid = p4 + Spath = strget(p5) + ifftsize = p6 + ifftdecimation = p7 + istatus, kdone twgs_loadfile Spath + if (istatus < 0) then + io_sendstring("callback", twgs_failresponse(icbid, istatus)) + turnoff + else + if (kdone == 1) then + schedulek("twgs_loadfile_analysis", 0, 1, icbid, ifftsize, ifftdecimation) + turnoff + endif + endif +endin + +#end -- cgit v1.2.3