diff options
author | Richard <q@1bpm.net> | 2025-04-13 18:48:02 +0100 |
---|---|---|
committer | Richard <q@1bpm.net> | 2025-04-13 18:48:02 +0100 |
commit | 9fbf91db06a6d4f4b5cd8bb45389a731bb86bf22 (patch) | |
tree | 291bd79ce340e67affa755a8a6b4f6a83cce93ea /site/udo/twigs/transforms.udo | |
download | apps.csound.1bpm.net-9fbf91db06a6d4f4b5cd8bb45389a731bb86bf22.tar.gz apps.csound.1bpm.net-9fbf91db06a6d4f4b5cd8bb45389a731bb86bf22.tar.bz2 apps.csound.1bpm.net-9fbf91db06a6d4f4b5cd8bb45389a731bb86bf22.zip |
initial
Diffstat (limited to 'site/udo/twigs/transforms.udo')
-rwxr-xr-x | site/udo/twigs/transforms.udo | 285 |
1 files changed, 285 insertions, 0 deletions
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
|