diff options
Diffstat (limited to 'site/udo/twigs')
-rwxr-xr-x | site/udo/twigs/checkpointing.udo | 120 | ||||
-rwxr-xr-x | site/udo/twigs/transforms.udo | 285 | ||||
-rwxr-xr-x | site/udo/twigs/twigs.udo | 444 |
3 files changed, 849 insertions, 0 deletions
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
|