aboutsummaryrefslogtreecommitdiff
path: root/sonics/frequency_tools.udo
diff options
context:
space:
mode:
Diffstat (limited to 'sonics/frequency_tools.udo')
-rwxr-xr-xsonics/frequency_tools.udo359
1 files changed, 359 insertions, 0 deletions
diff --git a/sonics/frequency_tools.udo b/sonics/frequency_tools.udo
new file mode 100755
index 0000000..c74739f
--- /dev/null
+++ b/sonics/frequency_tools.udo
@@ -0,0 +1,359 @@
+#ifndef UDO_FREQUENCYTOOLS
+#define UDO_FREQUENCYTOOLS ##
+/*
+ Frequency tools/effects: shifters, ring modulation, delays, chorus etc
+ Slim excerpt for Partial Emergence
+
+ This file is part of the SONICS UDO collection by Richard Knight 2021
+ License: GPL-2.0-or-later
+ http://1bpm.net
+*/
+
+#include "sonics/wavetables.udo"
+
+
+
+/*
+ Mono frequency shifter with hilbert transform
+
+ aoutput freqshift1 ainput, kfrequency
+
+ aoutput output audio
+ ainput input audio
+ kfrequency shift frequency [MIN(-10000) MAX(10000) DEFAULT(-500)]
+*/
+opcode freqshift1, a, ak
+ ain, kfreq xin
+ asin oscili 1, kfreq, gifnSine
+ acos oscili 1, kfreq, gifnSine, .25
+ areal, aimag hilbert ain
+ amod1 = areal * acos
+ amod2 = aimag * asin
+ ashift = (amod1 - amod2) * 0.7
+ xout ashift
+endop
+
+
+/*
+ Stereo frequency shifter with hilbert transform
+
+ aoutputL, aoutputR freqshift1 ainputL, ainputR, kfrequency
+
+ aoutputL output audio left
+ aoutputR output audio right
+ ainputL input audio left
+ ainputR input audio right
+ kfrequency shift frequency [MIN(-10000) MAX(10000) DEFAULT(-500)]
+*/
+opcode freqshift1, aa, aak
+ ainL, ainR, kfreq xin
+ asin oscili 1, kfreq, gifnSine
+ acos oscili 1, kfreq, gifnSine, .25
+ arealL, aimagL hilbert ainL
+ arealR, aimagR hilbert ainR
+ amod1L = arealL * acos
+ amod2L = aimagL * asin
+ amod1R = arealR * acos
+ amod2R = aimagR * asin
+ ashiftL = (amod1L - amod2L) * 0.7
+ ashiftR = (amod1R - amod2R) * 0.7
+ xout ashiftL, ashiftR
+endop
+
+
+/*
+ Mono ring modulator with hilbert transform
+
+ aoutput ringmod1 ainput, kfrequency
+
+ aoutput output audio
+ ainput input audio
+ kfrequency modulation frequency [MIN(0) MAX(10000) DEFAULT(440)]
+*/
+opcode ringmod1, a, ak
+ ain, kfreq xin
+ asin oscili 1, kfreq, gifnSine
+ acos oscili 1, kfreq, gifnSine, .25
+ areal, aimag hilbert ain
+ amod1 = areal * acos
+ amod2 = aimag * asin
+ aupshift = (amod1 - amod2) * 0.7
+ adownshift = (amod1 + amod2) * 0.7
+ xout aupshift+adownshift
+endop
+
+/*
+ Stereo ring modulator with hilbert transform
+
+ aoutputL, aoutputR ringmod1 ainputL, ainputR, kfrequency
+
+ aoutputL output audio left
+ aoutputR output audio right
+ ainputL input audio left
+ ainputR input audio right
+ kfrequency modulation frequency [MIN(0) MAX(10000) DEFAULT(440)]
+*/
+opcode ringmod1, aa, aak
+ ainL, ainR, kfreq xin
+ asin oscili 1, kfreq, gifnSine
+ acos oscili 1, kfreq, gifnSine, .25
+ arealL, aimagL hilbert ainL
+ arealR, aimagR hilbert ainR
+ amod1L = arealL * acos
+ amod2L = aimagL * asin
+ amod1R = arealR * acos
+ amod2R = aimagR * asin
+ aupshiftL = (amod1L - amod2L) * 0.7
+ adownshiftL = (amod1L + amod2L) * 0.7
+ aupshiftR = (amod1R - amod2R) * 0.7
+ adownshiftR = (amod1R + amod2R) * 0.7
+ xout aupshiftL+adownshiftL, aupshiftR+adownshiftR
+endop
+
+
+/*
+ Mono frequency shifter with direct modulation
+
+ aoutput freqshift2 ainput, kfrequency, [kshiftmode=1]
+
+ aoutput output audio
+ ainput input audio
+ kfrequency shift frequency [MIN(-10000) MAX(10000) DEFAULT(-500)]
+ kshiftmode shift mode [TYPE(bool) DEFAULT(1)]
+*/
+opcode freqshift2, a, akP
+ ain, kfreq, kshiftmode xin
+ isr4 = sr * 0.25
+
+ ko1frq = isr4 - (1 - kshiftmode) * kfreq
+ aqo1r oscil 1.0, ko1frq, gifnSine, 0.25 ; cosine
+ aqo1i oscil 1.0, ko1frq, gifnSine, 0.0 ; sine
+
+ ko2frq = isr4 + kshiftmode * kfreq
+ aqo2r oscil 1.0, ko2frq, gifnSine, 0.25 ; cosine
+ aqo2i oscil 1.0, ko2frq, gifnSine, 0.0 ; sine
+ awq1r = ain * aqo1r
+
+ awf1r biquad awq1r, 1, 1.6375276435, 1, 1, -0.93027644018, 0.37171017225
+ awf2r biquad awf1r, 1, 0.56037176307, 1, 1, -0.40320752514, 0.73736786626
+ awf3r biquad awf2r, 1, 0.19165327787, 1, 1, -0.15398586410, 0.94001488557
+ aw1fr = awf3r * 0.051532459925
+ awq2r = aw1fr * aqo2r
+
+ awq1i = ain * aqo1i
+ awf1i biquad awq1i, 1, 1.6375276435, 1, 1, -0.93027644018, 0.37171017225
+ awf2i biquad awf1i, 1, 0.56037176307, 1, 1, -0.40320752514, 0.73736786626
+ awf3i biquad awf2i, 1, 0.19165327787, 1, 1, -0.15398586410, 0.94001488557
+
+ aw1fi = awf3i * 0.051532459925
+ awq2i = aw1fi * aqo2i
+ aout = awq2r + awq2i
+ xout aout
+endop
+
+
+/*
+ Stereo frequency shifter with direct modulation
+
+ aoutputL, aoutputR freqshift2 ainputL, ainputR, kfrequency, [kshiftmode=1]
+
+ aoutputL output audio left
+ aoutputR output audio right
+ ainputL input audio left
+ ainputR input audio right
+ kfrequency shift frequency [MIN(-10000) MAX(10000) DEFAULT(-500)]
+ kshiftmode shift mode [TYPE(bool) DEFAULT(1)]
+*/
+opcode freqshift2, aa, aakP
+ ainL, ainR, kfreq, kshiftmode xin
+ isr4 = sr * 0.25
+
+ ko1frq = isr4 - (1 - kshiftmode) * kfreq
+ aqo1r oscil 1.0, ko1frq, gifnSine, 0.25 ; cosine
+ aqo1i oscil 1.0, ko1frq, gifnSine, 0.0 ; sine
+ ko2frq = isr4 + kshiftmode * kfreq
+ aqo2r oscil 1.0, ko2frq, gifnSine, 0.25 ; cosine
+ aqo2i oscil 1.0, ko2frq, gifnSine, 0.0 ; sine
+
+ awq1rL = ainL * aqo1r
+ awq1rR = ainR * aqo1r
+
+ ; Left
+ awf1rL biquad awq1rL, 1, 1.6375276435, 1, 1, -0.93027644018, 0.37171017225
+ awf2rL biquad awf1rL, 1, 0.56037176307, 1, 1, -0.40320752514, 0.73736786626
+ awf3rL biquad awf2rL, 1, 0.19165327787, 1, 1, -0.15398586410, 0.94001488557
+ aw1frL = awf3rL * 0.051532459925
+ awq2rL = aw1frL * aqo2r
+
+ awq1iL = ainL * aqo1i
+ awf1iL biquad awq1iL, 1, 1.6375276435, 1, 1, -0.93027644018, 0.37171017225
+ awf2iL biquad awf1iL, 1, 0.56037176307, 1, 1, -0.40320752514, 0.73736786626
+ awf3iL biquad awf2iL, 1, 0.19165327787, 1, 1, -0.15398586410, 0.94001488557
+
+ aw1fiL = awf3iL * 0.051532459925
+ awq2iL = aw1fiL * aqo2i
+ aoutL = awq2rL + awq2iL
+
+ ; Right
+ awf1rR biquad awq1rR, 1, 1.6375276435, 1, 1, -0.93027644018, 0.37171017225
+ awf2rR biquad awf1rR, 1, 0.56037176307, 1, 1, -0.40320752514, 0.73736786626
+ awf3rR biquad awf2rR, 1, 0.19165327787, 1, 1, -0.15398586410, 0.94001488557
+ aw1frR = awf3rR * 0.051532459925
+ awq2rR = aw1frR * aqo2r
+
+ awq1iR = ainR * aqo1i
+ awf1iR biquad awq1iR, 1, 1.6375276435, 1, 1, -0.93027644018, 0.37171017225
+ awf2iR biquad awf1iR, 1, 0.56037176307, 1, 1, -0.40320752514, 0.73736786626
+ awf3iR biquad awf2iR, 1, 0.19165327787, 1, 1, -0.15398586410, 0.94001488557
+
+ aw1fiR = awf3iR * 0.051532459925
+ awq2iR = aw1fiR * aqo2i
+ aoutR = awq2rR + awq2iR
+
+ xout aoutL, aoutR
+endop
+
+
+
+/*
+ Bit depth reducer/crusher
+
+ aout bitcrush ain, [krush=16]
+
+ aout crushed signal
+ ain input signal
+ krush bits to reduce to [TYPE(int) MIN(1) MAX(128) DEFAULT(16)]
+
+*/
+opcode bitcrush, a, aJ
+ a1, krush xin
+ krush = (krush == -1) ? 16 : krush
+ a1 = round:a(a1 * krush) / krush
+ xout a1
+endop
+
+
+/*
+ Bit depth reducer/crusher (stereo)
+
+ aoutL, aoutR bitcrush ainL, ainR, [krush=16]
+
+ aoutL crushed signal left
+ aoutR crushed signal right
+ ainL input signal left
+ ainR input signal right
+ krush bits to reduce to [TYPE(int) MIN(1) MAX(128) DEFAULT(16)]
+
+*/
+opcode bitcrush, aa, aaJ
+ aL, aR, krush xin
+ krush = (krush == -1) ? 16 : krush
+ aL = round:a(aL * krush) / krush
+ aR = round:a(aR * krush) / krush
+ xout aL, aR
+endop
+
+
+
+/*
+ Resonant delay based tuner
+
+ aout delaytuner ain, kfrequency, kfeedback
+
+ aout tuned/delayed signal summed with input
+ ain input signal
+ kfrequency cps to tune to [MIN(20) MAX(10000) DEFAULT(440)]
+ kfeedback feedback amount [MIN(0) MAX(1) DEFAULT(0.5)]
+*/
+opcode delaytuner, a, akk
+ ain, kfrequency, kfeedback xin
+ adump delayr 1
+ adelayed deltap (1/kfrequency)
+ delayw ain + (adelayed * kfeedback)
+ aout = ain + adelayed
+ xout aout
+endop
+
+
+/*
+ Resonant delay based tuner (stereo)
+
+ aoutL, aoutR delaytuner ainL, ainR, kfrequency, kfeedback
+
+ aoutL, aoutR tuned/delayed signal summed with input
+ ainL, ainR input signal
+ kfrequency cps to tune to [MIN(20) MAX(10000) DEFAULT(440)]
+ kfeedback feedback amount [MIN(0) MAX(1) DEFAULT(0.5)]
+*/
+opcode delaytuner, aa, aakk
+ ainL, ainR, kfrequency, kfeedback xin
+ aoutL delaytuner ainL, kfrequency, kfeedback
+ aoutR delaytuner ainR, kfrequency, kfeedback
+ xout aoutL, aoutR
+endop
+
+
+/*
+ Resonant delay based tuner with hold control. When held, only outputs effected, not dry
+
+ aout glitchtuner ain, kfrequency, ktrig
+
+ aout output signal
+ ain input signal
+ kfrequency cps to tune to [MIN(20) MAX(10000) DEFAULT(440)]
+ khold apply if 1, bypass if 0
+*/
+opcode glitchtuner, a, akk
+ ain, kfrequency, khold xin
+ adump delayr 1
+ adelayed deltap (1/kfrequency)
+ if (khold >= 1) then
+ aout = adelayed
+ else
+ aout = ain
+ endif
+ delayw aout
+ xout aout
+endop
+
+
+/*
+ Resonant delay based tuner with hold control (stereo). When held, only outputs effected, not dry
+
+ aout glitchtuner ain, kfrequency, ktrig
+
+ aoutL, aoutR output signal
+ ainL, ainR input signal
+ kfrequency cps to tune to [MIN(20) MAX(10000) DEFAULT(440)]
+ khold apply if 1, bypass if 0
+*/
+opcode glitchtuner, aa, aakk
+ ainL, ainR, kfrequency, khold xin
+ aoutL glitchtuner ainL, kfrequency, khold
+ aoutR glitchtuner ainR, kfrequency, khold
+ xout aoutL, aoutR
+endop
+
+
+
+/*
+ Simple chorus
+
+ aoutL, aoutR simplechorus ainL, ainR, irateL, irateR
+
+ aoutL, aoutR output signal
+ ainL, ainR input signal
+ irateL delay rate in Hz left
+ irateR delay rate in Hz right
+*/
+opcode simplechorus, aa, aaii
+ aL, aR, irateL, irateR xin
+ alfoL oscil irateL, unirand(1)
+ alfoR oscil irateR, unirand(1)
+ aL vdelay3 aL, (0.01 + alfoL) * 1000, 1000
+ aR vdelay3 aR, (0.01 + alfoR) * 1000, 1000
+ xout aL, aR
+endop
+
+#end
+