#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