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/transforms.udo | 285 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 285 insertions(+) create mode 100755 site/udo/twigs/transforms.udo (limited to 'site/udo/twigs/transforms.udo') 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 -- cgit v1.2.3