summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--objects/env-bp.axs118
-rw-r--r--objects/env/ad m.axo60
-rw-r--r--objects/exp-xfade.axs226
-rw-r--r--objects/faust/karplus.axo98
-rw-r--r--objects/faust/moog_vcf.axo205
-rw-r--r--objects/faust/phaser_mono.wip90
-rw-r--r--objects/faust/phaser_mono_float.axo36
-rw-r--r--objects/faust/phaser_mono_float.cpp129
-rw-r--r--objects/faust/phaser_stereo_float.axo70
-rw-r--r--objects/faust/phaser_stereo_float.cpp215
-rw-r--r--objects/faust/phaser_stereo_optimised.axo180
-rw-r--r--objects/limiter.axs126
-rw-r--r--objects/murf.axs561
-rw-r--r--objects/octaver.axs238
-rw-r--r--objects/pattern-editor.axs278
-rw-r--r--objects/read-interp-slow.axo76
-rw-r--r--objects/sel b 32 pulse.axo29
-rw-r--r--objects/sqrt-distortion.axs157
-rw-r--r--objects/wip/pitch_detect_fft.axo179
-rw-r--r--objects/xfade-env.axs167
-rw-r--r--patches/.gitkeep0
-rw-r--r--patches/demo-xfade.axp313
-rw-r--r--patches/demo.axp179
-rw-r--r--patches/distortion-demo.axp36
-rw-r--r--patches/faust-phaser-demo.axp246
-rw-r--r--patches/murf-demo.axp461
-rw-r--r--patches/stick-pedalboard.axp101
27 files changed, 4574 insertions, 0 deletions
diff --git a/objects/env-bp.axs b/objects/env-bp.axs
new file mode 100644
index 0000000..2d88679
--- /dev/null
+++ b/objects/env-bp.axs
@@ -0,0 +1,118 @@
+<patch-1.0>
+ <obj type="patch/inlet f" sha="8e69e1ab7ccd8afaefdc23146c50149809b64955" uuid="5c585d2dcd9c05631e345ac09626a22a639d7c13" name="attack" x="84" y="14">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="filter/bp svf m" sha="24097930d951f375e0839b70f065d71a782d8b23" uuid="90abfee2793172fc193ec82288a454727134cb31" name="bp_2" x="224" y="14">
+ <params>
+ <frac32.s.map name="pitch" onParent="true" value="-63.0"/>
+ <frac32.u.map name="reso" value="0.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet f" sha="8e69e1ab7ccd8afaefdc23146c50149809b64955" uuid="5c585d2dcd9c05631e345ac09626a22a639d7c13" name="decay" x="84" y="70">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="gain/vca" sha="c904cdd24d65968df2f5796e107db3747dd691a6" uuid="a9f2dcd18043e2f47364e45cb8814f63c2a37c0d" name="vca_1" x="336" y="98">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="mux/mux 2" sha="10c5b6d774e8c972b6bb863dad23e83034e0990f" uuid="539c246f4c360ac476e128cfbfa84348fb7f7e73" name="mux_1" x="406" y="98">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet a" sha="9e7e04867e1d37837b0924c9bf18c44ac68602e6" uuid="abd8c5fd3b0524a6630f65cad6dc27f6c58e2a3e" name="out" x="490" y="98">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet b" sha="17c8e188371661163bfa55cea9974eecb785fb06" uuid="3b0d3eacb5bb978cb05d1372aa2714d5a4790844" name="gate" x="84" y="126">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet b" sha="17c8e188371661163bfa55cea9974eecb785fb06" uuid="3b0d3eacb5bb978cb05d1372aa2714d5a4790844" name="animate" x="84" y="168">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="env/ad m" sha="b5f72335c41e5dec8763a23bed395833a6694bab" uuid="41eb0117872a4d0579752cffdc0ec28182bd55cb" name="ad_1" x="224" y="168">
+ <params>
+ <frac32.s.map name="a" value="0.0"/>
+ <frac32.u.map name="d" value="0.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet a" sha="709c10aa648c6e5a3c00da4b5dd238899a7c109c" uuid="b577fe41e0a6bc7b5502ce33cb8a3129e2e28ee5" name="in" x="84" y="224">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet f" sha="c0c4ce40c7dec73dfbb009fd86c9b89c068b137a" uuid="d18a9a550bcaaebac94e25983bd0e27dbfd7233c" name="outlet_1" x="490" y="238">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet f" sha="8e69e1ab7ccd8afaefdc23146c50149809b64955" uuid="5c585d2dcd9c05631e345ac09626a22a639d7c13" name="pitch" x="84" y="294">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet f" sha="8e69e1ab7ccd8afaefdc23146c50149809b64955" uuid="5c585d2dcd9c05631e345ac09626a22a639d7c13" name="reso" x="84" y="350">
+ <params/>
+ <attribs/>
+ </obj>
+ <nets>
+ <net>
+ <source obj="attack" outlet="inlet"/>
+ <dest obj="ad_1" inlet="a"/>
+ </net>
+ <net>
+ <source obj="decay" outlet="inlet"/>
+ <dest obj="ad_1" inlet="d"/>
+ </net>
+ <net>
+ <source obj="reso" outlet="inlet"/>
+ <dest obj="bp_2" inlet="reso"/>
+ </net>
+ <net>
+ <source obj="in" outlet="inlet"/>
+ <dest obj="bp_2" inlet="in"/>
+ </net>
+ <net>
+ <source obj="vca_1" outlet="o"/>
+ <dest obj="mux_1" inlet="i2"/>
+ </net>
+ <net>
+ <source obj="ad_1" outlet="env"/>
+ <dest obj="vca_1" inlet="v"/>
+ <dest obj="outlet_1" inlet="outlet"/>
+ </net>
+ <net>
+ <source obj="gate" outlet="inlet"/>
+ <dest obj="ad_1" inlet="trig"/>
+ </net>
+ <net>
+ <source obj="bp_2" outlet="out"/>
+ <dest obj="vca_1" inlet="a"/>
+ <dest obj="mux_1" inlet="i1"/>
+ </net>
+ <net>
+ <source obj="pitch" outlet="inlet"/>
+ <dest obj="bp_2" inlet="pitch"/>
+ </net>
+ <net>
+ <source obj="mux_1" outlet="o"/>
+ <dest obj="out" inlet="outlet"/>
+ </net>
+ <net>
+ <source obj="animate" outlet="inlet"/>
+ <dest obj="mux_1" inlet="s"/>
+ </net>
+ </nets>
+ <settings>
+ <subpatchmode>no</subpatchmode>
+ </settings>
+ <notes><![CDATA[]]></notes>
+ <windowPos>
+ <x>0</x>
+ <y>31</y>
+ <width>1280</width>
+ <height>769</height>
+ </windowPos>
+</patch-1.0> \ No newline at end of file
diff --git a/objects/env/ad m.axo b/objects/env/ad m.axo
new file mode 100644
index 0000000..9ae76f1
--- /dev/null
+++ b/objects/env/ad m.axo
@@ -0,0 +1,60 @@
+<objdefs>
+ <obj.normal id="ad m" uuid="9045d727a260ba66aa68c68f684eea2148aaf338" sha="b5f72335c41e5dec8763a23bed395833a6694bab">
+ <sDescription>attack decay envelope with modulation inputs</sDescription>
+ <author>Ricardo Wurmus</author>
+ <license>GPL</license>
+ <helpPatch>env.axh</helpPatch>
+ <inlets>
+ <frac32 name="a" description="attack time"/>
+ <frac32 name="d" description="decay time"/>
+ <bool32.rising name="trig" description="trigger"/>
+ </inlets>
+ <outlets>
+ <frac32.positive name="env" description="envelope output"/>
+ </outlets>
+ <displays/>
+ <params>
+ <frac32.s.map name="a"/>
+ <frac32.u.map.kdecaytime name="d"/>
+ </params>
+ <attribs/>
+ <code.declaration><![CDATA[
+int8_t stage;
+int ntrig;
+int32_t val;
+]]></code.declaration>
+ <code.init><![CDATA[
+ntrig = 0;
+val = 0;
+]]></code.init>
+ <code.krate><![CDATA[
+if ((inlet_trig>0) && !ntrig) {
+ ntrig = 1;
+ stage = 1;
+} else if (!(inlet_trig>0)) {
+ ntrig = 0;
+}
+
+// decay
+if (stage == 0) {
+ val = ___SMMLA(val,(-1<<26)+(param_d>>1)+(inlet_d>>1),val);
+
+// attack
+} else {
+ int32_t a;
+ MTOF(- param_a - inlet_a,a);
+
+ // shift to let val rise more slowly
+ a = a >> 4;
+ val = val + a;
+
+ // switch to decay phase at max
+ if (val > 0x07FFFFFF) {
+ val = 0x07FFFFFF;
+ stage = 0;
+ }
+}
+outlet_env = val;
+]]></code.krate>
+ </obj.normal>
+</objdefs>
diff --git a/objects/exp-xfade.axs b/objects/exp-xfade.axs
new file mode 100644
index 0000000..926ddbb
--- /dev/null
+++ b/objects/exp-xfade.axs
@@ -0,0 +1,226 @@
+<patch-1.0>
+ <obj type="mix/mix 2 g" sha="921aefdda41b92a27cc93c53b5154554d0ce6d3b" uuid="221f038da51943034a75e442c90624fcebfe6112" name="mix_1" x="434" y="28">
+ <params>
+ <frac32.u.map name="gain1" value="32.0"/>
+ <frac32.u.map name="gain2" value="32.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet a" sha="9e7e04867e1d37837b0924c9bf18c44ac68602e6" uuid="abd8c5fd3b0524a6630f65cad6dc27f6c58e2a3e" name="outlet_1" x="574" y="28">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="gain/vca" sha="c904cdd24d65968df2f5796e107db3747dd691a6" uuid="a9f2dcd18043e2f47364e45cb8814f63c2a37c0d" name="vca_1" x="336" y="42">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet a" sha="709c10aa648c6e5a3c00da4b5dd238899a7c109c" uuid="b577fe41e0a6bc7b5502ce33cb8a3129e2e28ee5" name="i1" x="210" y="56">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet a" sha="9e7e04867e1d37837b0924c9bf18c44ac68602e6" uuid="abd8c5fd3b0524a6630f65cad6dc27f6c58e2a3e" name="outlet_2" x="574" y="70">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet a" sha="709c10aa648c6e5a3c00da4b5dd238899a7c109c" uuid="b577fe41e0a6bc7b5502ce33cb8a3129e2e28ee5" name="i2" x="210" y="98">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="gain/vca" sha="c904cdd24d65968df2f5796e107db3747dd691a6" uuid="a9f2dcd18043e2f47364e45cb8814f63c2a37c0d" name="vca_2" x="336" y="112">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet a" sha="9e7e04867e1d37837b0924c9bf18c44ac68602e6" uuid="abd8c5fd3b0524a6630f65cad6dc27f6c58e2a3e" name="outlet_3" x="574" y="112">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet b" sha="17c8e188371661163bfa55cea9974eecb785fb06" uuid="3b0d3eacb5bb978cb05d1372aa2714d5a4790844" name="trigger" x="210" y="140">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/inv" sha="527f9ea38e810968a5d209b2913f846bcc5cbfea" uuid="565521d3699b36d8095aa1c79b9ad0046fb133ce" name="inv_2" x="462" y="182">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/+c" sha="d0aea6063c88e27c97acf08b33a056fec3e150f1" uuid="13eec32bd8ad57dd0bb18a02566cc0a117d320e3" name="+c_4" x="518" y="182">
+ <params>
+ <frac32.u.map name="c" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="math/inv" sha="527f9ea38e810968a5d209b2913f846bcc5cbfea" uuid="565521d3699b36d8095aa1c79b9ad0046fb133ce" name="abs_1" x="392" y="294">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/+c" sha="d0aea6063c88e27c97acf08b33a056fec3e150f1" uuid="13eec32bd8ad57dd0bb18a02566cc0a117d320e3" name="+c_2" x="448" y="294">
+ <params>
+ <frac32.u.map name="c" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="math/exp" sha="2ac6f1fe7b85cbd855f836a65df6a49bcd2c0f62" uuid="3f0e6db61bc98c04b42a940e7a93abbf8a178317" name="exp_2" x="504" y="294">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/inv" sha="527f9ea38e810968a5d209b2913f846bcc5cbfea" uuid="565521d3699b36d8095aa1c79b9ad0046fb133ce" name="inv_1" x="574" y="294">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/+c" sha="d0aea6063c88e27c97acf08b33a056fec3e150f1" uuid="13eec32bd8ad57dd0bb18a02566cc0a117d320e3" name="+c_3" x="630" y="294">
+ <params>
+ <frac32.u.map name="c" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet f" sha="c0c4ce40c7dec73dfbb009fd86c9b89c068b137a" uuid="d18a9a550bcaaebac94e25983bd0e27dbfd7233c" name="env" x="826" y="308">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet f" sha="c0c4ce40c7dec73dfbb009fd86c9b89c068b137a" uuid="d18a9a550bcaaebac94e25983bd0e27dbfd7233c" name="env_" x="854" y="364">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="mux/mux 2" sha="73ba55fbf61b80b78dd5cb4f0c4bd5cbbdd54ea0" uuid="3bcb8a666381ed18b8962eda50b1aa679136f618" name="mux_1" x="700" y="392">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/-c" sha="13ae165692448bd5e8159b2e283e45005ef14cdf" uuid="bc70bed87e5405985ade03f4806b9450609a9093" name="shift zero" x="168" y="406">
+ <params>
+ <frac32.u.map name="c" value="32.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="math/&gt;&gt;" sha="79ac9605aac7bf23c0eba17a4a6d8b179ea37f34" uuid="d883beaf50b7aae4803ed9941e8f123e87e1e3aa" name="slope" x="238" y="406">
+ <params/>
+ <attribs>
+ <spinner attributeName="shift" value="2"/>
+ </attribs>
+ </obj>
+ <obj type="filter/integrator" sha="6535fb81a607b8ddac63cb09ba808e9afa93e070" uuid="e4d9391b099e543aa867bc3ec9565dd4d6f7df60" name="smoothen" x="336" y="406">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/half" sha="b3b4af52a3096adbd7fa08352261fbe186ec45e7" uuid="d3aa9c64dbf1ec7871bbc3e2d8905f8e443c9823" name="half_1" x="448" y="406">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/+c" sha="d0aea6063c88e27c97acf08b33a056fec3e150f1" uuid="13eec32bd8ad57dd0bb18a02566cc0a117d320e3" name="+c_1" x="532" y="406">
+ <params>
+ <frac32.u.map name="c" value="32.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="math/exp" sha="2ac6f1fe7b85cbd855f836a65df6a49bcd2c0f62" uuid="3f0e6db61bc98c04b42a940e7a93abbf8a178317" name="exp_1" x="602" y="406">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/*c" sha="60143a29e35f452025e9edaa2dec6e660ecb9c6e" uuid="7d5ef61c3bcd571ee6bbd8437ef3612125dfb225" name="*c_1" x="266" y="504">
+ <params>
+ <frac32.u.map name="amp" onParent="true" value="0.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <nets>
+ <net>
+ <source obj="+c_1" outlet="out"/>
+ <dest obj="abs_1" inlet="in"/>
+ <dest obj="exp_1" inlet="a"/>
+ </net>
+ <net>
+ <source obj="exp_1" outlet="result"/>
+ <dest obj="mux_1" inlet="i2"/>
+ </net>
+ <net>
+ <source obj="exp_2" outlet="result"/>
+ <dest obj="inv_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="+c_2" outlet="out"/>
+ <dest obj="exp_2" inlet="a"/>
+ </net>
+ <net>
+ <source obj="abs_1" outlet="out"/>
+ <dest obj="+c_2" inlet="in"/>
+ </net>
+ <net>
+ <source obj="inv_1" outlet="out"/>
+ <dest obj="+c_3" inlet="in"/>
+ </net>
+ <net>
+ <source obj="+c_3" outlet="out"/>
+ <dest obj="mux_1" inlet="i1"/>
+ </net>
+ <net>
+ <source obj="smoothen" outlet="out"/>
+ <dest obj="half_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="shift zero" outlet="out"/>
+ <dest obj="slope" inlet="a"/>
+ </net>
+ <net>
+ <source obj="half_1" outlet="out"/>
+ <dest obj="+c_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="trigger" outlet="inlet"/>
+ <dest obj="shift zero" inlet="in"/>
+ <dest obj="mux_1" inlet="s"/>
+ </net>
+ <net>
+ <source obj="mux_1" outlet="o"/>
+ <dest obj="env" inlet="outlet"/>
+ <dest obj="vca_2" inlet="v"/>
+ <dest obj="inv_2" inlet="in"/>
+ </net>
+ <net>
+ <source obj="i1" outlet="inlet"/>
+ <dest obj="vca_1" inlet="a"/>
+ </net>
+ <net>
+ <source obj="i2" outlet="inlet"/>
+ <dest obj="vca_2" inlet="a"/>
+ </net>
+ <net>
+ <source obj="vca_2" outlet="o"/>
+ <dest obj="mix_1" inlet="in2"/>
+ <dest obj="outlet_3" inlet="outlet"/>
+ </net>
+ <net>
+ <source obj="mix_1" outlet="out"/>
+ <dest obj="outlet_1" inlet="outlet"/>
+ </net>
+ <net>
+ <source obj="inv_2" outlet="out"/>
+ <dest obj="+c_4" inlet="in"/>
+ </net>
+ <net>
+ <source obj="+c_4" outlet="out"/>
+ <dest obj="vca_1" inlet="v"/>
+ <dest obj="env_" inlet="outlet"/>
+ </net>
+ <net>
+ <source obj="vca_1" outlet="o"/>
+ <dest obj="mix_1" inlet="in1"/>
+ <dest obj="outlet_2" inlet="outlet"/>
+ </net>
+ <net>
+ <source obj="*c_1" outlet="out"/>
+ <dest obj="smoothen" inlet="in"/>
+ </net>
+ <net>
+ <source obj="slope" outlet="result"/>
+ <dest obj="*c_1" inlet="in"/>
+ </net>
+ </nets>
+ <settings>
+ <subpatchmode>no</subpatchmode>
+ </settings>
+ <notes><![CDATA[]]></notes>
+ <windowPos>
+ <x>0</x>
+ <y>31</y>
+ <width>1274</width>
+ <height>766</height>
+ </windowPos>
+</patch-1.0> \ No newline at end of file
diff --git a/objects/faust/karplus.axo b/objects/faust/karplus.axo
new file mode 100644
index 0000000..60035a6
--- /dev/null
+++ b/objects/faust/karplus.axo
@@ -0,0 +1,98 @@
+<objdefs>
+ <obj.normal id="karplus" uuid="36d552a0297885559841ed95a25ec5e5589bf5c3" sha="39267e0b01468fb54a8799d8114d535c594a007b">
+ <sDescription>Karplus (from Faust)</sDescription>
+ <author>Ricardo Wurmus</author>
+ <license>GPL</license>
+ <helpPatch>filter.axh</helpPatch>
+ <outlets>
+ <frac32buffer.bipolar name="out" description="filter output"/>
+ </outlets>
+ <params>
+ <bool32.mom name="b" noLabel="true"/>
+ <frac32.s.map name="a"/>
+ </params>
+ <displays/>
+ <includes>
+ <include>arm_math.h</include>
+ </includes>
+ <attribs/>
+ <code.declaration><![CDATA[
+ // convert float to fixed point notation
+ // * take absolute value
+ // * multiply with constant to keep precision;
+ // to get a fixed point at x:y we multiply by 2^y,
+ // e.g. for 24:8 (24 significant bits before decimal point)
+ // we multiply f by 2^8 (1<<8).
+ // * truncate and cast to int32_t
+ // * invert bits if negative
+ int32_t floatToFrac32(float f) {
+ // was 1 000 000 000 and then >> 2
+ // now is 2^27 = 134 217 728
+ // 2^32 = 4 294 967 296
+ // 2^29 = 536 870 912 (3:29)
+ int32_t preout = int32_t(((f < 0) ? (-f) : f) * (1<<29));
+ return ((f < 0) ? ~preout : preout);
+ }
+ // convert fixed point to float
+ // * invert bits if sign bit is set (0x08000000, or (1<<27))
+ // * cast int to float
+ // * divide by constant to shift decimal point
+ // * multiply by -1 if sign bit was set
+ float frac32ToFloat(int32_t frac) {
+ bool neg = (((1<<27) & frac) != 0);
+ float res = (float)(neg ? frac : ~frac);
+ res = res / (float(1<<29));
+ return (neg ? (-1 * res) : res);
+ }
+
+ float fslider0;
+ float fVec0[2];
+ float fRec1[2];
+ int iRec2[2];
+ float fslider1;
+ float fslider2;
+ int IOTA;
+ float fVec1[512];
+ float fslider3;
+ float fRec0[3];
+]]></code.declaration>
+ <code.init><![CDATA[
+ fslider0 = 128.0f; // duration or excitation
+ for (int i=0; i<2; i++) fVec0[i] = 0;
+ for (int i=0; i<2; i++) fRec1[i] = 0;
+ for (int i=0; i<2; i++) iRec2[i] = 0;
+ fslider1 = 0.5f; // level
+ fslider2 = 0.01f; // attenuation, was 0.1f
+ IOTA = 0;
+ for (int i=0; i<512; i++) fVec1[i] = 0;
+ fslider3 = 128.0f; // duration or excitation
+ for (int i=0; i<3; i++) fRec0[i] = 0;
+]]></code.init>
+ <code.krate><![CDATA[
+ float fSlow0 = (1.0f / float(fslider0));
+ float fSlow1 = float(param_b);
+ float fSlow2 = (4.656612875245797e-10f * float(fslider1));
+ float fSlow3 = (0.5f * (1.0f - float(fslider2)));
+ int iSlow4 = int((int((float(fslider3) - 1.5f)) & 4095));
+
+ int32_t* output0 = outlet_out;
+ for (int i=0; i<BUFSIZE; i++) {
+ fVec0[0] = fSlow1;
+ fRec1[0] = ((fRec1[1] + ((fSlow1 - fVec0[1]) > 0.0f)) - (fSlow0 * (fRec1[1] > 0.0f)));
+ iRec2[0] = (12345 + (1103515245 * iRec2[1]));
+ fVec1[IOTA&511] = ((fSlow3 * (fRec0[1] + fRec0[2])) + (fSlow2 * (iRec2[0] * (fRec1[0] > 0.0f))));
+ fRec0[0] = fVec1[(IOTA-iSlow4)&511];
+
+arm_float_to_q31(&fRec0[0], &output0[i], 0);
+// output0[i] = floatToFrac32(fRec0[0]);
+
+ // post processing
+ fRec0[2] = fRec0[1]; fRec0[1] = fRec0[0];
+ IOTA = IOTA+1;
+ iRec2[1] = iRec2[0];
+ fRec1[1] = fRec1[0];
+ fVec0[1] = fVec0[0];
+ }
+]]></code.krate>
+ </obj.normal>
+</objdefs>
diff --git a/objects/faust/moog_vcf.axo b/objects/faust/moog_vcf.axo
new file mode 100644
index 0000000..8abb697
--- /dev/null
+++ b/objects/faust/moog_vcf.axo
@@ -0,0 +1,205 @@
+<objdefs>
+ <obj.normal id="moog_vcf" uuid="9329f089dced01ba64f7e22ac77fd78fbec47db9" sha="6b8d84e43d5934e94f32e1d50318f8feede69769">
+ <sDescription>Moog VCF (from Faust)</sDescription>
+ <author>Ricardo Wurmus</author>
+ <license>GPL</license>
+ <helpPatch>filter.axh</helpPatch>
+ <includes>
+ <include>math.h</include>
+ </includes>
+ <inlets>
+ <frac32buffer name="in" description="filter input"/>
+ </inlets>
+ <outlets>
+ <frac32buffer name="out" description="filter output"/>
+ </outlets>
+ <displays/>
+ <attribs/>
+ <code.declaration><![CDATA[
+ // convert float to fixed point notation
+ // * take absolute value
+ // * multiply with constant to keep precision;
+ // to get a fixed point at x:y we multiply by 2^y,
+ // e.g. for 24:8 (24 significant bits before decimal point)
+ // we multiply f by 2^8 (1<<8).
+ // * truncate and cast to int32_t
+ // * invert bits if negative
+ int32_t floatToFrac32(float f) {
+ // was 1 000 000 000 and then >> 2
+ // now is 2^27 = 134 217 728
+ // 2^32 = 4 294 967 296
+ // 2^29 = 536 870 912 (3:29)
+ int32_t preout = int32_t(((f < 0) ? (-f) : f) * (1<<29));
+ return ((f < 0) ? ~preout : preout);
+ }
+ // convert fixed point to float
+ // * invert bits if sign bit is set (0x08000000, or (1<<27))
+ // * cast int to float
+ // * divide by constant to shift decimal point
+ // * multiply by -1 if sign bit was set
+ float frac32ToFloat(int32_t frac) {
+ bool neg = (((1<<27) & frac) != 0);
+ float res = (float)(neg ? frac : ~frac);
+ res = res / (float(1<<29));
+ return (neg ? (-1 * res) : res);
+ }
+
+
+ float fslider0;
+ float fslider1;
+ float fslider2;
+ float fcheckbox0;
+ float fcheckbox1;
+ float fcheckbox2;
+
+ float fRec0[2];
+ float fRec1[2];
+ float fRec2[2];
+ float fRec3[2];
+ float fRec4[2];
+ float fRec5[2];
+ float fRec6[3];
+ float fRec7[3];
+ float fRec8[2];
+ float fRec10[2];
+ float fRec11[2];
+ float fRec13[2];
+ float fRec14[2];
+
+ float fConst1;
+ float fConst2;
+ float fSqrtTwo;
+ inline float faustpower2(float x) {
+ return powf(x,2);
+ }
+ inline float faustpower4(float x) {
+ return powf(x,4);
+ }
+
+ // template <int N> inline float faustpower(float x) { return powf(x,N); }
+ // template <int N> inline double faustpower(double x) { return pow(x,N); }
+ // template <int N> inline int faustpower(int x) { return faustpower<N/2>(x) * faustpower<N-N/2>(x); }
+ // template <> inline int faustpower<0>(int x) { return 1; }
+ // template <> inline int faustpower<1>(int x) { return x; }
+]]></code.declaration>
+ <code.init><![CDATA[
+ fConst1 = ((2 * PI_F) / float(SAMPLERATE));
+ fConst2 = (PI_F / float(SAMPLERATE));
+ fSqrtTwo = 1.4142135623730951f;
+ fcheckbox0 = 0.0;
+ fcheckbox1 = 0.0;
+ fcheckbox2 = 0.0;
+ fslider0 = 25.0f;
+ fslider1 = 0.9f;
+ fslider2 = 5.0f;
+
+ for (int i=0; i<2; i++) fRec0[i] = 0;
+ for (int i=0; i<2; i++) fRec1[i] = 0;
+ for (int i=0; i<2; i++) fRec2[i] = 0;
+ for (int i=0; i<2; i++) fRec3[i] = 0;
+ for (int i=0; i<2; i++) fRec4[i] = 0;
+ for (int i=0; i<2; i++) fRec5[i] = 0;
+ for (int i=0; i<3; i++) fRec6[i] = 0;
+ for (int i=0; i<3; i++) fRec7[i] = 0;
+ for (int i=0; i<2; i++) fRec8[i] = 0;
+ for (int i=0; i<2; i++) fRec10[i] = 0;
+ for (int i=0; i<2; i++) fRec11[i] = 0;
+ for (int i=0; i<2; i++) fRec13[i] = 0;
+ for (int i=0; i<2; i++) fRec14[i] = 0;
+
+]]></code.init>
+ <code.krate><![CDATA[
+ float fSlow0 = (0.4400000000000004f * powf(2.0f,(0.08333333333333333f * (float(fslider0) - 49.0f))));
+ int iSlow1 = int(float(fcheckbox0));
+ float fSlow2 = float(fslider1);
+ float fSlow3 = (0 - (4.0f * fmaxf((float)0, fminf(faustpower4(fSlow2), 0.999999f))));
+ float fSlow4 = fminf(1.412799348810722f, (fSqrtTwo * fSlow2));
+ float fSlow5 = (fSqrtTwo * fSlow4);
+ float fSlow6 = 2 - fSlow5;
+ float fSlow7 = 1 + (fSlow4 * (fSlow4 - fSqrtTwo));
+ float fSlow8 = 2 + fSlow5;
+ float fSlow9 = 1 + (fSlow4 * (fSqrtTwo + fSlow4));
+ float fSlow10 = 2 * fSlow2;
+ float fSlow11 = 2 - fSlow10;
+ float fSlow12 = faustpower2((1.412799348810722f * fSlow2));
+ float fSlow13 = ((1 + fSlow12) - fSlow10);
+ float fSlow14 = (2 + fSlow10);
+ float fSlow15 = (1 + (fSlow10 + fSlow12));
+ int iSlow16 = int(float(fcheckbox1));
+ int iSlow17 = int(float(fcheckbox2));
+ float fSlow18 = (0.001f * powf(10,(0.05f * float(fslider2))));
+ //const int32_t* input0 = inlet_in;
+ int32_t* output0 = outlet_out;
+ for (int i=0; i<BUFSIZE; i++) {
+ fRec1[0] = (fSlow0 + (0.999f * fRec1[1]));
+ float fTemp0 = (fConst1 * fRec1[0]);
+ float fTemp1 = (1.0f - fTemp0);
+ float fTemp2 = frac32ToFloat(inlet_in[i]);
+ float fTemp3 = ((iSlow1)?0:fTemp2);
+ fRec5[0] = ((fSlow3 * fRec0[1]) + (fTemp3 + (fTemp1 * fRec5[1])));
+ fRec4[0] = (fRec5[0] + (fTemp1 * fRec4[1]));
+ fRec3[0] = (fRec4[0] + (fTemp1 * fRec3[1]));
+ fRec2[0] = (fRec3[0] + (fRec2[1] * fTemp1));
+ fRec0[0] = (fRec2[0] * powf(fTemp0,4.0f));
+ float fTemp4 = tanf((fConst2 * fmaxf((float)20, fminf((float)10000, fRec1[0]))));
+ float fTemp5 = (1.0f / fTemp4);
+ float fTemp6 = (fSlow7 + ((fSlow6 + fTemp5) / fTemp4));
+ float fTemp7 = (1.0f / faustpower2(fTemp4));
+ float fTemp8 = (fSlow9 + ((fSlow8 + fTemp5) / fTemp4));
+ fRec7[0] = (fTemp3 - (((fRec7[2] * (fSlow9 + ((fTemp5 - fSlow8) / fTemp4))) + (2 * (fRec7[1] * (fSlow9 - fTemp7)))) / fTemp8));
+ fRec6[0] = (((fRec7[2] + (fRec7[0] + (2.0f * fRec7[1]))) / fTemp8) - (((fRec6[2] * (fSlow7 + ((fTemp5 - fSlow6) / fTemp4))) + (2 * (fRec6[1] * (fSlow7 - fTemp7)))) / fTemp6));
+ float fTemp9 = tanf((fConst2 * fmaxf(fRec1[0], (float)20)));
+ float fTemp10 = (1.0f / fTemp9);
+ float fTemp11 = (fSlow13 + ((fSlow11 + fTemp10) / fTemp9));
+ float fTemp12 = ((fSlow13 + ((fTemp10 - fSlow11) / fTemp9)) / fTemp11);
+ float fTemp13 = (1.0f / faustpower2(fTemp9));
+ float fTemp14 = (fSlow13 - fTemp13);
+ float fTemp15 = fmaxf(-0.9999f, fminf(0.9999f, (2 * (fTemp14 / (fTemp11 * (1 + fTemp12))))));
+ float fTemp16 = (1 - faustpower2(fTemp15));
+ float fTemp17 = fmaxf(-0.9999f, fminf(0.9999f, fTemp12));
+ float fTemp18 = (1 - faustpower2(fTemp17));
+ float fTemp19 = sqrtf(fTemp18);
+ float fTemp20 = (2.0f - (2.0f * (fTemp14 / fTemp11)));
+ float fTemp21 = sqrtf(fmaxf((float)0, fTemp16));
+ float fTemp22 = (fSlow15 + ((fSlow14 + fTemp10) / fTemp9));
+ float fTemp23 = sqrtf(fmaxf((float)0, fTemp18));
+ float fTemp24 = ((fSlow15 + ((fTemp10 - fSlow14) / fTemp9)) / fTemp22);
+ float fTemp25 = (fSlow15 - fTemp13);
+ float fTemp26 = fmaxf(-0.9999f, fminf(0.9999f, (2 * (fTemp25 / (fTemp22 * (1 + fTemp24))))));
+ float fTemp27 = (1 - faustpower2(fTemp26));
+ float fTemp28 = fmaxf(-0.9999f, fminf(0.9999f, fTemp24));
+ float fTemp29 = (1 - faustpower2(fTemp28));
+ float fTemp30 = sqrtf(fTemp29);
+ float fTemp31 = (2.0f - (2.0f * (fTemp25 / fTemp22)));
+ float fTemp32 = sqrtf(fmaxf((float)0, fTemp27));
+ float fTemp33 = sqrtf(fmaxf((float)0, fTemp29));
+ float fTemp34 = ((fRec11[1] * (0 - fTemp28)) + (fTemp3 * fTemp33));
+ fRec13[0] = ((fRec13[1] * (0 - fTemp26)) + (fTemp34 * fTemp32));
+ fRec11[0] = ((fTemp34 * fTemp26) + (fRec13[1] * fTemp32));
+ float fRec12 = fRec13[0];
+ float fTemp35 = ((((fTemp3 * fTemp28) + (fRec11[1] * fTemp33)) + ((fRec11[0] * fTemp31) / fTemp30)) + ((fRec12 * ((1.0f - fTemp24) - (fTemp26 * fTemp31))) / (fTemp30 * sqrtf(fTemp27))));
+ float fTemp36 = ((fRec8[1] * (0 - fTemp17)) + ((fTemp35 * fTemp23) / fTemp22));
+ fRec10[0] = ((fRec10[1] * (0 - fTemp15)) + (fTemp36 * fTemp21));
+ fRec8[0] = ((fTemp36 * fTemp15) + (fRec10[1] * fTemp21));
+ float fRec9 = fRec10[0];
+ fRec14[0] = ((0.999f * fRec14[1]) + fSlow18);
+ float fTemp37 = ((iSlow1)?fTemp2:(fRec14[0] * ((iSlow17)?((iSlow16)?((((((fTemp35 * fTemp17) / fTemp22) + (fRec8[1] * fTemp23)) + ((fRec8[0] * fTemp20) / fTemp19)) + ((fRec9 * ((1.0f - fTemp12) - (fTemp15 * fTemp20))) / (fTemp19 * sqrtf(fTemp16)))) / fTemp11):((fRec6[2] + (fRec6[0] + (2.0f * fRec6[1]))) / fTemp6)):fRec0[0])));
+ output0[i] = floatToFrac32(fTemp37);
+ // post processing
+ fRec14[1] = fRec14[0];
+ fRec8[1] = fRec8[0];
+ fRec10[1] = fRec10[0];
+ fRec11[1] = fRec11[0];
+ fRec13[1] = fRec13[0];
+ fRec6[2] = fRec6[1]; fRec6[1] = fRec6[0];
+ fRec7[2] = fRec7[1]; fRec7[1] = fRec7[0];
+ fRec0[1] = fRec0[0];
+ fRec2[1] = fRec2[0];
+ fRec3[1] = fRec3[0];
+ fRec4[1] = fRec4[0];
+ fRec5[1] = fRec5[0];
+ fRec1[1] = fRec1[0];
+ }
+]]></code.krate>
+ </obj.normal>
+</objdefs>
diff --git a/objects/faust/phaser_mono.wip b/objects/faust/phaser_mono.wip
new file mode 100644
index 0000000..9966c00
--- /dev/null
+++ b/objects/faust/phaser_mono.wip
@@ -0,0 +1,90 @@
+
+ virtual void instanceInit(int samplingFreq) {
+ }
+ virtual void compute (int count, FAUSTFLOAT** input, FAUSTFLOAT** output) {
+ // TODO: find replacements for: expf, cosf, sinf
+ // values must be scaled to fit into the range expected by arm_{cos,sin}_q31
+ // they all take radians!
+ // cosf --> arm_cos_q31
+ // sinf --> arm_sin_q31
+
+ int32_t fSlow0 = param_fcheckbox0 ? 0x00200000 /*"1"*/ : (param_fslider0>>1);
+ int32_t fSlow1 = param_fcheckbox1 ? __QSUB(0, fSlow0) : fSlow0;
+ // TODO: find replacement for expf
+ // e ^ -1 * const1 * pi * slider3
+ // It's a value between 0.72 and 1.0, but for now we pretend it's just the value of fslider3.
+ // float fSlow4 = expf((fConst1 * (0 - (3.141592653589793f * float(fslider3)))));
+ int32_t fSlow4 = param_fslider3;
+ int32_t fSlow5 = __SMMUL(fSlow4, fSlow4);
+ int32_t fSlow6 = __SMMUL(fConst2, param_fslider4);
+ int32_t fSlow7 = arm_cos_q31(fSlow6);
+ int32_t fSlow8 = arm_sin_q31(fSlow6);
+ int32_t fSlow9 = __QSUB(0, fSlow8);
+ int32_t fSlow11 = ___SMMUL(TAU, param_fslider5);
+ int32_t fSlow12 = (__SMMUL(TAU, MAX(param_fslider5, param_fslider6)) - fSlow11) >>1;
+ int32_t fSlow15 = __QSUB(0, fSlow4<<1);
+ int32_t fSlow14 = __SMMUL(fConst1, param_fslider7);
+ int32_t fSlow16 = __SMMUL(fSlow14, param_fslider7);
+ int32_t fSlow17 = __SMMUL(fSlow16, param_fslider7);
+ int32_t fSlow18 = __SMMUL(fSlow17, param_fslider7);
+ int32_t fSlow19 = __QSUB(1, fSlow0);
+
+ int32_t* input0 = input[0];
+ int32_t* input1 = input[1];
+ int32_t* output0 = output[0];
+ int32_t* output1 = output[1];
+
+ for (int i=0; i<BUFSIZE; i++) {
+ iVec0[0] = 1;
+ fRec5[0] = fSlow8 * fRec6[1] + fSlow7 * fRec5[1];
+ fRec6[0] = (1 + ((fSlow7 * fRec6[1]) + (fSlow9 * fRec5[1]))) - iVec0[1];
+
+ {
+ int32_t fTemp0 = input0[i];
+ int32_t fTemp1 = fSlow11 + (fSlow12 * (1 - fRec5[0]));
+ int32_t fTemp2 = fRec4[1] * cosf((fSlow14 * fTemp1));
+ fRec4[0] = __QSUB(0, ((__SMMUL(fSlow15, fTemp2) + __SMMUL(fSlow5, fRec4[2])) - (fTemp0 + __SMMUL(param_fslider1, fRec0[1]))));
+ int32_t fTemp3 = fRec3[1] * cosf((fSlow16 * fTemp1));
+ fRec3[0] = (fSlow15 * (fTemp2 - fTemp3)) + (fRec4[2] + (fSlow5 * (fRec4[0] - fRec3[2])));
+ int32_t fTemp4 = (fRec2[1] * cosf((fSlow17 * fTemp1)));
+ fRec2[0] = (fSlow15 * (fTemp3 - fTemp4)) + (fRec3[2] + (fSlow5 * (fRec3[0] - fRec2[2])));
+ int32_t fTemp5 = fRec1[1] * cosf((fSlow18 * fTemp1));
+ fRec1[0] = (fSlow15 * (fTemp4 - fTemp5)) + (fRec2[2] + (fSlow5 * (fRec2[0] - fRec1[2])));
+ fRec0[0] = (fSlow5 * fRec1[0]) + ((fSlow15 * fTemp5) + fRec1[2]);
+ output0[i] = (fTemp0 * fSlow19) + (fRec0[0] * fSlow1);
+ }
+
+ {
+ int32_t fTemp6 = input1[i];
+ int32_t fTemp7 = fSlow11 + (fSlow12 * (1 - fRec6[0]));
+ int32_t fTemp8 = fRec11[1] * cosf(__SMMUL(fSlow14, fTemp7));
+ fRec11[0] = __QSUB(0, (__SMMUL(fSlow15, fTemp8) + __SMMUL(fSlow5, fRec11[2]) - (fTemp6 + __SMMUL(param_fslider1, fRec7[1]))));
+ int32_t fTemp9 = fRec10[1] * cosf(__SMMUL(fSlow16, fTemp7));
+ fRec10[0] = ((fSlow15 * (fTemp8 - fTemp9)) + (fRec11[2] + (fSlow5 * (fRec11[0] - fRec10[2]))));
+ int32_t fTemp10 = fRec9[1] * cosf(__SMMUL(fSlow17, fTemp7));
+ fRec9[0] = ((fSlow15 * (fTemp9 - fTemp10)) + (fRec10[2] + (fSlow5 * (fRec10[0] - fRec9[2]))));
+ int32_t fTemp11 = fRec8[1] * cosf(__SMMUL(fSlow18, fTemp7));
+ fRec8[0] = ((fSlow15 * (fTemp10 - fTemp11)) + (fRec9[2] + (fSlow5 * (fRec9[0] - fRec8[2]))));
+ fRec7[0] = ((fSlow5 * fRec8[0]) + ((fSlow15 * fTemp11) + fRec8[2]));
+ output1[i] = (fTemp6 * fSlow19) + (fRec7[0] * fSlow1);
+ }
+
+ // post processing
+ fRec7[1] = fRec7[0];
+ fRec8[2] = fRec8[1]; fRec8[1] = fRec8[0];
+ fRec9[2] = fRec9[1]; fRec9[1] = fRec9[0];
+ fRec10[2] = fRec10[1]; fRec10[1] = fRec10[0];
+ fRec11[2] = fRec11[1]; fRec11[1] = fRec11[0];
+ fRec0[1] = fRec0[0];
+ fRec1[2] = fRec1[1]; fRec1[1] = fRec1[0];
+ fRec2[2] = fRec2[1]; fRec2[1] = fRec2[0];
+ fRec3[2] = fRec3[1]; fRec3[1] = fRec3[0];
+ fRec4[2] = fRec4[1]; fRec4[1] = fRec4[0];
+ fRec6[1] = fRec6[0];
+ fRec5[1] = fRec5[0];
+ iVec0[1] = iVec0[0];
+ }
+ }
+};
+
+
diff --git a/objects/faust/phaser_mono_float.axo b/objects/faust/phaser_mono_float.axo
new file mode 100644
index 0000000..f2d990c
--- /dev/null
+++ b/objects/faust/phaser_mono_float.axo
@@ -0,0 +1,36 @@
+<objdefs>
+ <obj.normal id="phaser_mono_float" uuid="d2dad834546ee8864e74efad2a1e9b1d7e26ace8" sha="f3858c3689b98a6a07f4a083d6854e56fe5ba43b">
+ <sDescription>Phaser Mono (from Faust)</sDescription>
+ <author>Ricardo Wurmus</author>
+ <license>GPL</license>
+ <helpPatch/>
+ <inlets>
+ <frac32buffer name="in" description="in"/>
+ </inlets>
+ <outlets>
+ <frac32buffer.bipolar name="out" description="output"/>
+ </outlets>
+ <params>
+ <!-- values are given as: default, min, max, increment? -->
+ <!-- 0.5f, 0.0f, 1e+01f, 0.01f -->
+ <frac32.u.map description="Speed (Hz)" name="speed"/>
+ </params>
+ <displays/>
+ <attribs/>
+ <includes>
+ <include>./phaser_mono_float.cpp</include>
+ </includes>
+ <code.declaration><![CDATA[
+Dsp phaser;
+]]></code.declaration>
+ <code.init><![CDATA[
+ phaser.init(48000);
+ ]]></code.init>
+ <code.krate><![CDATA[
+ phaser.compute(BUFSIZE,
+ &inlet_in,
+ &outlet_out[0],
+ param_speed);
+]]></code.krate>
+ </obj.normal>
+</objdefs>
diff --git a/objects/faust/phaser_mono_float.cpp b/objects/faust/phaser_mono_float.cpp
new file mode 100644
index 0000000..d3cc774
--- /dev/null
+++ b/objects/faust/phaser_mono_float.cpp
@@ -0,0 +1,129 @@
+//-----------------------------------------------------
+// name: "Phaser Mono"
+//
+// Code generated with Faust 0.9.67 (http://faust.grame.fr)
+//-----------------------------------------------------
+/* link with */
+#ifndef FAUSTPOWER
+#define FAUSTPOWER
+#define faustpower4(x) ((x)*(x)*(x)*(x))
+#define faustpower3(x) ((x)*(x)*(x))
+#define faustpower2(x) ((x)*(x))
+#define max(a, b) ((a) > (b) ? (a) : (b))
+#define min(a, b) ((a) < (b) ? (a) : (b))
+#endif
+//----------------------------------------------------------------------------
+// FAUST generated signal processor
+//----------------------------------------------------------------------------
+
+#ifndef FAUSTFLOAT
+#define FAUSTFLOAT float
+#endif
+
+#ifndef FAUSTCLASS
+#define FAUSTCLASS mydsp
+#endif
+
+class Dsp {
+ private:
+ int iVec0[2];
+ int iConst0;
+ float fConst1;
+ float fConst2;
+ FAUSTFLOAT speed; //default: 0.5f; range: 0..10
+ float fConst3;
+ float fRec5[2];
+ float fRec6[2];
+ float fConst4;
+ float fConst5;
+ float fRec4[3];
+ float fConst6;
+ float fRec3[3];
+ float fConst7;
+ float fRec2[3];
+ float fConst8;
+ float fRec1[3];
+ float fRec0[2];
+ public:
+ static void classInit(int samplingFreq) {
+ }
+ virtual void instanceInit(int samplingFreq) {
+ int fSamplingFreq = samplingFreq;
+ for (int i=0; i<2; i++) iVec0[i] = 0;
+ iConst0 = min(192000, max(1, fSamplingFreq));
+ fConst1 = 0.9366460212365959; //expf((0 - (3141.592653589793f / float(iConst0))));
+ fConst2 = faustpower2(fConst1);
+ speed = 0.5f;
+ fConst3 = (6.283185307179586f / float(iConst0));
+ for (int i=0; i<2; i++) fRec5[i] = 0;
+ for (int i=0; i<2; i++) fRec6[i] = 0;
+ fConst4 = (2.0f / float(iConst0));
+ fConst5 = (0 - (2 * fConst1));
+ for (int i=0; i<3; i++) fRec4[i] = 0;
+ fConst6 = (4.0f / float(iConst0));
+ for (int i=0; i<3; i++) fRec3[i] = 0;
+ fConst7 = (8.0f / float(iConst0));
+ for (int i=0; i<3; i++) fRec2[i] = 0;
+ fConst8 = (16.0f / float(iConst0));
+ for (int i=0; i<3; i++) fRec1[i] = 0;
+ for (int i=0; i<2; i++) fRec0[i] = 0;
+ }
+ virtual void init(int samplingFreq) {
+ classInit(samplingFreq);
+ instanceInit(samplingFreq);
+ }
+ // convert fixed point to float
+ // * invert bits if sign bit is set (0x08000000, or (1<<27))
+ // * cast int to float
+ // * divide by constant to shift decimal point
+ // * multiply by -1 if sign bit was set
+ float ConvertFracToFloat(int32_t frac) {
+ bool neg = (((1<<27) & frac) != 0);
+ float res = (float)(neg ? frac : ~frac);
+ res = res / (float(1<<29));
+ return (neg ? (-1 * res) : res);
+ }
+
+ virtual void compute (int count,
+ const int32_t** input,
+ int32_t* output,
+ int32_t speed) {
+ float fSlow0 = 100;
+ float fSlow1 = 0.01f * fSlow0;
+ float fSlow2 = (fConst3 * 10*ConvertFracToFloat(speed));
+ float fSlow3 = cosf(fSlow2);
+ float fSlow4 = sinf(fSlow2);
+ float fSlow5 = (0 - fSlow4);
+ float fSlow6 = (1 - (0.01f * fSlow0));
+ const int32_t* input0 = *input;
+ int32_t* output0 = output;
+ for (int i=0; i<count; i++) {
+ iVec0[0] = 1;
+ float fTemp0 = ConvertFracToFloat(input0[i]);
+ fRec5[0] = ((fSlow4 * fRec6[1]) + (fSlow3 * fRec5[1]));
+ fRec6[0] = ((1 + ((fSlow3 * fRec6[1]) + (fSlow5 * fRec5[1]))) - iVec0[1]);
+ float fTemp1 = (628.3185307179587f + (2199.1148575128555f * (1 - fRec5[0])));
+ float fTemp2 = (fRec4[1] * cosf((fConst4 * fTemp1)));
+ fRec4[0] = (0 - (((fConst5 * fTemp2) + (fConst2 * fRec4[2])) - ((fSlow1 * fTemp0) + (0.5f * fRec0[1]))));
+ float fTemp3 = (fRec3[1] * cosf((fConst6 * fTemp1)));
+ fRec3[0] = ((fConst5 * (fTemp2 - fTemp3)) + (fRec4[2] + (fConst2 * (fRec4[0] - fRec3[2]))));
+ float fTemp4 = (fRec2[1] * cosf((fConst7 * fTemp1)));
+ fRec2[0] = ((fConst5 * (fTemp3 - fTemp4)) + (fRec3[2] + (fConst2 * (fRec3[0] - fRec2[2]))));
+ float fTemp5 = (fRec1[1] * cosf((fConst8 * fTemp1)));
+ fRec1[0] = ((fConst5 * (fTemp4 - fTemp5)) + (fRec2[2] + (fConst2 * (fRec2[0] - fRec1[2]))));
+ fRec0[0] = ((fConst2 * fRec1[0]) + ((fConst5 * fTemp5) + fRec1[2]));
+ output0[i] = ConvertFloatToFrac((fSlow6 * fTemp0) - fRec0[0]) <<7;
+ // post processing
+ fRec0[1] = fRec0[0];
+ fRec1[2] = fRec1[1]; fRec1[1] = fRec1[0];
+ fRec2[2] = fRec2[1]; fRec2[1] = fRec2[0];
+ fRec3[2] = fRec3[1]; fRec3[1] = fRec3[0];
+ fRec4[2] = fRec4[1]; fRec4[1] = fRec4[0];
+ fRec6[1] = fRec6[0];
+ fRec5[1] = fRec5[0];
+ iVec0[1] = iVec0[0];
+ }
+ }
+};
+
+
diff --git a/objects/faust/phaser_stereo_float.axo b/objects/faust/phaser_stereo_float.axo
new file mode 100644
index 0000000..b5632bd
--- /dev/null
+++ b/objects/faust/phaser_stereo_float.axo
@@ -0,0 +1,70 @@
+<objdefs>
+ <obj.normal id="phaser_stereo_float" uuid="c5fac2db26a58c24e984c8fc7ac529193898cad1" sha="2148880b2a099a2582ec29deabcc2fd80cba0195">
+ <sDescription>Phaser Stereo (from Faust)</sDescription>
+ <author>Ricardo Wurmus</author>
+ <license>GPL</license>
+ <helpPatch/>
+ <inlets>
+ <frac32buffer name="in" description="in"/>
+ </inlets>
+ <outlets>
+ <frac32buffer.bipolar name="left" description="left output"/>
+ <frac32buffer.bipolar name="right" description="right output"/>
+ </outlets>
+ <params>
+ <bool32.tgl name="fcheckbox0" description="VibratoMode: direct/vibrato"/>
+ <bool32.tgl name="fcheckbox1" description="linear/invert"/>
+ <!-- values are given as: default, min, max, increment? -->
+ <!-- They all need to be remapped to the -64.0..0..64.0 range -->
+
+ <!-- 1.0f, 0.0f, 1.0f, 0.01f -->
+ <frac32.u.map description="Depth" name="fslider0"/>
+
+ <!-- 0.0f, 0.0f, 1.0f, 0.01f -->
+ <frac32.u.map description="feedback gain" name="fslider1"/>
+
+ <!-- 1e+03f, 1e+01f, 5e+03f, 1.0f -->
+ <frac32.s.map.pitch description="Notch width (Hz)" name="fslider3"/>
+
+ <!-- 0.5f, 0.0f, 1e+01f, 0.01f -->
+ <frac32.u.map description="Speed (Hz)" name="fslider4"/>
+
+ <!-- 1e+02f, 2e+01f, 5e+03f, 1.0f -->
+ <frac32.s.map.pitch description="MinNotch1Freq (Hz)" name="fslider5"/>
+
+ <!-- 8e+02f, 2e+01f, 1e+04f, 1.0f -->
+ <frac32.s.map.pitch description="MaxNotch1Freq (Hz)" name="fslider6"/>
+
+ <!-- 1.5f, 1.1f, 4.0f, 0.01f -->
+ <frac32.u.map description="NotchFreq (Hz)" name="fslider7"/>
+ </params>
+ <displays/>
+ <attribs/>
+ <includes>
+ <include>./phaser_stereo_float.cpp</include>
+ </includes>
+
+ <code.declaration><![CDATA[
+Dsp phaser;
+]]></code.declaration>
+ <code.init><![CDATA[
+
+ phaser.init(48000);
+ ]]></code.init>
+ <code.krate><![CDATA[
+ phaser.compute(BUFSIZE,
+ &inlet_in,
+ &outlet_left[0],
+ &outlet_right[0],
+ param_fcheckbox0,
+ param_fcheckbox1,
+ param_fslider0,
+ param_fslider1,
+ param_fslider3,
+ param_fslider4,
+ param_fslider5,
+ param_fslider6,
+ param_fslider7);
+]]></code.krate>
+ </obj.normal>
+</objdefs>
diff --git a/objects/faust/phaser_stereo_float.cpp b/objects/faust/phaser_stereo_float.cpp
new file mode 100644
index 0000000..9e3e587
--- /dev/null
+++ b/objects/faust/phaser_stereo_float.cpp
@@ -0,0 +1,215 @@
+//-----------------------------------------------------
+// name: "Phaser"
+//
+// Code generated with Faust 0.9.67 (http://faust.grame.fr)
+//-----------------------------------------------------
+/* link with */
+#ifndef FAUSTPOWER
+#define FAUSTPOWER
+#define faustpower4(x) ((x)*(x)*(x)*(x))
+#define faustpower3(x) ((x)*(x)*(x))
+#define faustpower2(x) ((x)*(x))
+#define max(a, b) ((a) > (b) ? (a) : (b))
+#define min(a, b) ((a) < (b) ? (a) : (b))
+#endif
+/************************************************************************
+ ************************************************************************
+ FAUST Architecture File
+ Copyright (C) 2003-2011 GRAME, Centre National de Creation Musicale
+ ---------------------------------------------------------------------
+
+ This is sample code. This file is provided as an example of minimal
+ FAUST architecture file. Redistribution and use in source and binary
+ forms, with or without modification, in part or in full are permitted.
+ In particular you can create a derived work of this FAUST architecture
+ and distribute that work under terms of your choice.
+
+ This sample code is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ ************************************************************************
+ ************************************************************************/
+
+
+/******************************************************************************
+*******************************************************************************
+
+ VECTOR INTRINSICS
+
+*******************************************************************************
+*******************************************************************************/
+
+
+/******************************************************************************
+*******************************************************************************
+
+ ABSTRACT USER INTERFACE
+
+*******************************************************************************
+*******************************************************************************/
+
+//----------------------------------------------------------------------------
+// FAUST generated signal processor
+//----------------------------------------------------------------------------
+
+#ifndef FAUSTFLOAT
+#define FAUSTFLOAT float
+#endif
+
+class Dsp {
+public:
+ int fSamplingFreq;
+ FAUSTFLOAT fslider0;
+ FAUSTFLOAT fcheckbox0;
+ FAUSTFLOAT fcheckbox1;
+ int iVec0[2];
+ FAUSTFLOAT fslider1;
+ FAUSTFLOAT fslider2;
+ FAUSTFLOAT fslider3;
+ int iConst0;
+ float fConst1;
+ FAUSTFLOAT fslider4;
+ float fConst2;
+ float fRec5[2];
+ float fRec6[2];
+ FAUSTFLOAT fslider5;
+ FAUSTFLOAT fslider6;
+ FAUSTFLOAT fslider7;
+ float fRec4[3];
+ float fRec3[3];
+ float fRec2[3];
+ float fRec1[3];
+ float fRec0[2];
+ float fRec11[3];
+ float fRec10[3];
+ float fRec9[3];
+ float fRec8[3];
+ float fRec7[2];
+
+ void instanceInit(int samplingFreq) {
+ fSamplingFreq = samplingFreq;
+ fslider0 = 1.0f;
+ fcheckbox0 = 0.0;
+ fcheckbox1 = 0.0;
+ for (int i=0; i<2; i++) iVec0[i] = 0;
+ fslider1 = 0.0f;
+ fslider2 = 0.0f;
+ fslider3 = 1e+03f;
+ iConst0 = min(192000, max(1, fSamplingFreq));
+ fConst1 = (1.0f / float(iConst0));
+ fslider4 = 0.5f;
+ fConst2 = (6.283185307179586f / float(iConst0));
+ for (int i=0; i<2; i++) fRec5[i] = 0;
+ for (int i=0; i<2; i++) fRec6[i] = 0;
+ fslider5 = 1e+02f;
+ fslider6 = 8e+02f;
+ fslider7 = 1.5f;
+ for (int i=0; i<3; i++) fRec4[i] = 0;
+ for (int i=0; i<3; i++) fRec3[i] = 0;
+ for (int i=0; i<3; i++) fRec2[i] = 0;
+ for (int i=0; i<3; i++) fRec1[i] = 0;
+ for (int i=0; i<2; i++) fRec0[i] = 0;
+ for (int i=0; i<3; i++) fRec11[i] = 0;
+ for (int i=0; i<3; i++) fRec10[i] = 0;
+ for (int i=0; i<3; i++) fRec9[i] = 0;
+ for (int i=0; i<3; i++) fRec8[i] = 0;
+ for (int i=0; i<2; i++) fRec7[i] = 0;
+ }
+ void init(int samplingFreq) {
+ instanceInit(samplingFreq);
+ }
+ // convert fixed point to float
+ // * invert bits if sign bit is set (0x08000000, or (1<<27))
+ // * cast int to float
+ // * divide by constant to shift decimal point
+ // * multiply by -1 if sign bit was set
+ float ConvertFracToFloat(int32_t frac) {
+ bool neg = (((1<<27) & frac) != 0);
+ float res = (float)(neg ? frac : ~frac);
+ res = res / (float(1<<29));
+ return (neg ? (-1 * res) : res);
+ }
+
+ void compute (int count,
+ const int32_t** input,
+ int32_t* left,
+ int32_t* right,
+ int param_fcheckbox0,
+ int param_fcheckbox1,
+ int param_fslider0,
+ int param_fslider1,
+ int param_fslider3,
+ int param_fslider4,
+ int param_fslider5,
+ int param_fslider6,
+ int param_fslider7) {
+ float fSlow0 = (0.5f * ((int(float(param_fcheckbox0)))?2:float(fslider0)));
+ float fSlow1 = ((int(float(param_fcheckbox1)))?(0 - fSlow0):fSlow0);
+ float fSlow2 = float(fslider1);
+ float fSlow3 = 10; //powf(10,(0.05f * float(fslider2)));
+ float fSlow4 = 0.8; //expf((fConst1 * (0 - (3.141592653589793f * float(fslider3)))));
+ float fSlow5 = faustpower2(fSlow4);
+ float fSlow6 = (fConst2 * 10*ConvertFracToFloat(param_fslider4));
+ float fSlow7 = cosf(fSlow6);
+ float fSlow8 = sinf(fSlow6);
+ float fSlow9 = (0 - fSlow8);
+ float fSlow10 = float(fslider5);
+ float fSlow11 = (6.283185307179586f * fSlow10);
+ float fSlow12 = (0.5f * ((6.283185307179586f * max(fSlow10, float(fslider6))) - fSlow11));
+ float fSlow13 = float(fslider7);
+ float fSlow14 = (fConst1 * fSlow13);
+ float fSlow15 = (0 - (2 * fSlow4));
+ float fSlow16 = (fConst1 * faustpower2(fSlow13));
+ float fSlow17 = (fConst1 * faustpower3(fSlow13));
+ float fSlow18 = (fConst1 * faustpower4(fSlow13));
+ float fSlow19 = (1 - fSlow0);
+ const int32_t* input0 = *input;
+ const int32_t* input1 = *input;
+ int32_t* output0 = left;
+ int32_t* output1 = right;
+ for (int i=0; i<count; i++) {
+ iVec0[0] = 1;
+ float fTemp0 = ConvertFracToFloat(input0[i]);
+ fRec5[0] = ((fSlow8 * fRec6[1]) + (fSlow7 * fRec5[1]));
+ fRec6[0] = ((1 + ((fSlow7 * fRec6[1]) + (fSlow9 * fRec5[1]))) - iVec0[1]);
+ float fTemp1 = (fSlow11 + (fSlow12 * (1 - fRec5[0])));
+ float fTemp2 = (fRec4[1] * cosf((fSlow14 * fTemp1)));
+ fRec4[0] = (0 - (((fSlow15 * fTemp2) + (fSlow5 * fRec4[2])) - ((fSlow3 * fTemp0) + (fSlow2 * fRec0[1]))));
+ float fTemp3 = (fRec3[1] * cosf((fSlow16 * fTemp1)));
+ fRec3[0] = ((fSlow15 * (fTemp2 - fTemp3)) + (fRec4[2] + (fSlow5 * (fRec4[0] - fRec3[2]))));
+ float fTemp4 = (fRec2[1] * cosf((fSlow17 * fTemp1)));
+ fRec2[0] = ((fSlow15 * (fTemp3 - fTemp4)) + (fRec3[2] + (fSlow5 * (fRec3[0] - fRec2[2]))));
+ float fTemp5 = (fRec1[1] * cosf((fSlow18 * fTemp1)));
+ fRec1[0] = ((fSlow15 * (fTemp4 - fTemp5)) + (fRec2[2] + (fSlow5 * (fRec2[0] - fRec1[2]))));
+ fRec0[0] = ((fSlow5 * fRec1[0]) + ((fSlow15 * fTemp5) + fRec1[2]));
+ output0[i] = ConvertFloatToFrac((fSlow3 * (fTemp0 * fSlow19)) + (fRec0[0] * fSlow1));
+
+ float fTemp6 = ConvertFracToFloat(input1[i]);
+ float fTemp7 = (fSlow11 + (fSlow12 * (1 - fRec6[0])));
+ float fTemp8 = (fRec11[1] * cosf((fSlow14 * fTemp7)));
+ fRec11[0] = (0 - (((fSlow15 * fTemp8) + (fSlow5 * fRec11[2])) - ((fSlow3 * fTemp6) + (fSlow2 * fRec7[1]))));
+ float fTemp9 = (fRec10[1] * cosf((fSlow16 * fTemp7)));
+ fRec10[0] = ((fSlow15 * (fTemp8 - fTemp9)) + (fRec11[2] + (fSlow5 * (fRec11[0] - fRec10[2]))));
+ float fTemp10 = (fRec9[1] * cosf((fSlow17 * fTemp7)));
+ fRec9[0] = ((fSlow15 * (fTemp9 - fTemp10)) + (fRec10[2] + (fSlow5 * (fRec10[0] - fRec9[2]))));
+ float fTemp11 = (fRec8[1] * cosf((fSlow18 * fTemp7)));
+ fRec8[0] = ((fSlow15 * (fTemp10 - fTemp11)) + (fRec9[2] + (fSlow5 * (fRec9[0] - fRec8[2]))));
+ fRec7[0] = ((fSlow5 * fRec8[0]) + ((fSlow15 * fTemp11) + fRec8[2]));
+ output1[i] = ConvertFloatToFrac((fSlow3 * (fTemp6 * fSlow19)) + (fRec7[0] * fSlow1));
+ // post processing
+ fRec7[1] = fRec7[0];
+ fRec8[2] = fRec8[1]; fRec8[1] = fRec8[0];
+ fRec9[2] = fRec9[1]; fRec9[1] = fRec9[0];
+ fRec10[2] = fRec10[1]; fRec10[1] = fRec10[0];
+ fRec11[2] = fRec11[1]; fRec11[1] = fRec11[0];
+ fRec0[1] = fRec0[0];
+ fRec1[2] = fRec1[1]; fRec1[1] = fRec1[0];
+ fRec2[2] = fRec2[1]; fRec2[1] = fRec2[0];
+ fRec3[2] = fRec3[1]; fRec3[1] = fRec3[0];
+ fRec4[2] = fRec4[1]; fRec4[1] = fRec4[0];
+ fRec6[1] = fRec6[0];
+ fRec5[1] = fRec5[0];
+ iVec0[1] = iVec0[0];
+ }
+ }
+};
diff --git a/objects/faust/phaser_stereo_optimised.axo b/objects/faust/phaser_stereo_optimised.axo
new file mode 100644
index 0000000..c16ac7d
--- /dev/null
+++ b/objects/faust/phaser_stereo_optimised.axo
@@ -0,0 +1,180 @@
+<objdefs>
+ <obj.normal id="phaser_stereo_optimised" uuid="38e0908ef72eddcefe1acb06ecfdeff201ddf1a9" sha="ae1df574629a5ec71ab34078f5084f686f786742">
+ <sDescription>Phaser Stereo (from Faust) hand-optimised</sDescription>
+ <author>Ricardo Wurmus</author>
+ <license>GPL</license>
+ <helpPatch/>
+ <inlets>
+ <frac32buffer name="in" description="in"/>
+ </inlets>
+ <outlets>
+ <frac32buffer.bipolar name="left" description="left output"/>
+ <frac32buffer.bipolar name="right" description="right output"/>
+ </outlets>
+ <params>
+ <bool32.tgl name="fcheckbox0" description="VibratoMode: direct/vibrato"/>
+ <bool32.tgl name="fcheckbox1" description="linear/invert"/>
+ <!-- values are given as: default, min, max, increment? -->
+ <!-- They all need to be remapped to the -64.0..0..64.0 range -->
+
+ <!-- 1.0f, 0.0f, 1.0f, 0.01f -->
+ <frac32.u.map description="Depth" name="fslider0"/>
+
+ <!-- 0.0f, 0.0f, 1.0f, 0.01f -->
+ <frac32.u.map description="feedback gain" name="fslider1"/>
+
+ <!-- 1e+03f, 1e+01f, 5e+03f, 1.0f -->
+ <frac32.s.map.pitch description="Notch width (Hz)" name="fslider3"/>
+
+ <!-- 0.5f, 0.0f, 1e+01f, 0.01f -->
+ <frac32.u.map description="Speed (Hz)" name="fslider4"/>
+
+ <!-- 1e+02f, 2e+01f, 5e+03f, 1.0f -->
+ <frac32.s.map.pitch description="MinNotch1Freq (Hz)" name="fslider5"/>
+
+ <!-- 8e+02f, 2e+01f, 1e+04f, 1.0f -->
+ <frac32.s.map.pitch description="MaxNotch1Freq (Hz)" name="fslider6"/>
+
+ <!-- 1.5f, 1.1f, 4.0f, 0.01f -->
+ <frac32.u.map description="NotchFreq (Hz)" name="fslider7"/>
+ </params>
+ <displays/>
+ <attribs/>
+ <code.declaration><![CDATA[
+ int iVec0[2];
+ int32_t fConst1;
+ int32_t fConst2;
+ int32_t fRec0[2];
+ int32_t fRec1[3];
+ int32_t fRec2[3];
+ int32_t fRec3[3];
+ int32_t fRec4[3];
+ int32_t fRec5[2];
+ int32_t fRec6[2];
+ int32_t fRec7[2];
+ int32_t fRec8[3];
+ int32_t fRec9[3];
+ int32_t fRec10[3];
+ int32_t fRec11[3];
+ // only valid for positive values!
+ #define MAX(a, b) ((a) > (b) ? (a) : (b))
+ #define cosf arm_cos_q31
+ #define intTAU 0x00c90fdb
+ /*"6.283185307179586f"*/
+]]></code.declaration>
+ <code.init><![CDATA[
+ int32_t intPI = 0x006487ed /*"3.141592653589793f"*/;
+
+
+ // SAMPLERATE is 48000
+ fConst1 = 0x0000002c /*"2.0833333333333333e-5"*/; //1.0f / SAMPLERATE;
+ fConst2 = 0x00000113 /*"1.308996938995747e-4"*/; // TAU / SAMPLERATE;
+
+ for (int i=0; i<2; i++) iVec0[i] = 0;
+ for (int i=0; i<2; i++) fRec0[i] = 0;
+ for (int i=0; i<3; i++) fRec1[i] = 0;
+ for (int i=0; i<3; i++) fRec2[i] = 0;
+ for (int i=0; i<3; i++) fRec3[i] = 0;
+ for (int i=0; i<3; i++) fRec4[i] = 0;
+ for (int i=0; i<2; i++) fRec5[i] = 0;
+ for (int i=0; i<2; i++) fRec6[i] = 0;
+ for (int i=0; i<2; i++) fRec7[i] = 0;
+ for (int i=0; i<3; i++) fRec8[i] = 0;
+ for (int i=0; i<3; i++) fRec9[i] = 0;
+ for (int i=0; i<3; i++) fRec10[i] = 0;
+ for (int i=0; i<3; i++) fRec11[i] = 0;
+]]></code.init>
+ <code.krate><![CDATA[
+ // TODO: find replacements for: expf, cosf, sinf
+ // values must be scaled to fit into the range expected by arm_{cos,sin}_q31
+ // they all take radians!
+ // cosf --> arm_cos_q31
+ // sinf --> arm_sin_q31
+
+ int32_t fSlow0 = param_fcheckbox0 ? 0x00200000 /*"1"*/ : (param_fslider0>>1);
+ int32_t fSlow1 = param_fcheckbox1 ? __QSUB(0, fSlow0) : fSlow0;
+ // TODO: find replacement for expf
+ // e ^ -1 * const1 * pi * slider3
+ // It's a value between 0.72 and 1.0, but for now we pretend it's just the value of fslider3.
+ // float fSlow4 = expf((fConst1 * (0 - (3.141592653589793f * float(fslider3)))));
+ int32_t fSlow4 = 0x00200000; //param_fslider3;
+ int32_t fSlow5 = ___SMMUL(fSlow4, fSlow4);
+ int32_t fSlow6 = ___SMMUL(fConst2, param_fslider4);
+ int32_t fSlow7 = arm_cos_q31(fSlow6);
+ int32_t fSlow8 = arm_sin_q31(fSlow6);
+ int32_t fSlow9 = __QSUB(0, fSlow8);
+
+ int32_t minFreq;
+ MTOF(param_fslider5, minFreq);
+ int32_t maxFreq;
+ MTOF(param_fslider6, maxFreq);
+
+ int32_t fSlow11 = ___SMMUL(intTAU, minFreq);
+ int32_t fSlow12 = __QSUB(___SMMUL(intTAU, MAX(minFreq, maxFreq)), fSlow11) >>1;
+ int32_t fSlow15 = __QSUB(0, fSlow4<<1);
+ int32_t fSlow14 = ___SMMUL(fConst1, param_fslider7);
+ int32_t fSlow16 = ___SMMUL(fSlow14, param_fslider7);
+ int32_t fSlow17 = ___SMMUL(fSlow16, param_fslider7);
+ int32_t fSlow18 = ___SMMUL(fSlow17, param_fslider7);
+ int32_t fSlow19 = __QSUB(0x00200000 /*"1.0"*/, fSlow0);
+
+ const int32_t* input0 = inlet_in;
+ const int32_t* input1 = inlet_in;
+ int32_t* output0 = outlet_left;
+ int32_t* output1 = outlet_right;
+
+ for (int i=0; i<BUFSIZE; i++) {
+ iVec0[0] = 0x00200000 /*"1.0"*/;
+ fRec5[0] = ___SMMUL(fSlow8, fRec6[1]) + ___SMMUL(fSlow7, fRec5[1]);
+ fRec6[0] = __QSUB((1 + (___SMMUL(fSlow7, fRec6[1]) + ___SMMUL(fSlow9, fRec5[1]))), iVec0[1]);
+
+ {
+ int32_t fTemp0 = input0[i];
+ int32_t fTemp1 = fSlow11 + ___SMMUL(fSlow12, __QSUB(0x00200000 /*"1.0"*/, fRec5[0]));
+ int32_t fTemp2 = ___SMMUL(fRec4[1], cosf(___SMMUL(fSlow14, fTemp1)));
+ fRec4[0] = __QSUB(0, __QSUB((___SMMUL(fSlow15, fTemp2) + ___SMMUL(fSlow5, fRec4[2])), (fTemp0 + ___SMMUL(param_fslider1, fRec0[1]))));
+ int32_t fTemp3 = ___SMMUL(fRec3[1], cosf(___SMMUL(fSlow16, fTemp1)));
+ fRec3[0] = ___SMMUL(fSlow15, __QSUB(fTemp2, fTemp3)) + (fRec4[2] + ___SMMUL(fSlow5, __QSUB(fRec4[0], fRec3[2])));
+ int32_t fTemp4 = ___SMMUL(fRec2[1], cosf(___SMMUL(fSlow17, fTemp1)));
+ fRec2[0] = ___SMMUL(fSlow15, __QSUB(fTemp3, fTemp4)) + (fRec3[2] + ___SMMUL(fSlow5, __QSUB(fRec3[0], fRec2[2])));
+ int32_t fTemp5 = ___SMMUL(fRec1[1], cosf(___SMMUL(fSlow18, fTemp1)));
+ fRec1[0] = ___SMMUL(fSlow15, __QSUB(fTemp4, fTemp5)) + (fRec2[2] + ___SMMUL(fSlow5, __QSUB(fRec2[0], fRec1[2])));
+ fRec0[0] = ___SMMUL(fSlow5, fRec1[0]) + (___SMMUL(fSlow15, fTemp5) + fRec1[2]);
+ // TODO: add outlet to see if fRec0 is at all correct
+ output0[i] = ___SMMUL(fTemp0, fSlow19) + ___SMMUL(fRec0[0], fSlow1);
+ }
+
+ {
+ int32_t fTemp6 = input1[i];
+ int32_t fTemp7 = fSlow11 + ___SMMUL(fSlow12, __QSUB(0x00200000 /*"1.0"*/, fRec6[0]));
+ int32_t fTemp8 = ___SMMUL(fRec11[1], cosf(___SMMUL(fSlow14, fTemp7)));
+ fRec11[0] = __QSUB(0, (___SMMUL(fSlow15, fTemp8) + ___SMMUL(fSlow5, fRec11[2]) - (fTemp6 + ___SMMUL(param_fslider1, fRec7[1]))));
+ int32_t fTemp9 = ___SMMUL(fRec10[1], cosf(___SMMUL(fSlow16, fTemp7)));
+ fRec10[0] = (___SMMUL(fSlow15, __QSUB(fTemp8, fTemp9)) + (fRec11[2] + ___SMMUL(fSlow5, __QSUB(fRec11[0], fRec10[2]))));
+ int32_t fTemp10 = ___SMMUL(fRec9[1], cosf(___SMMUL(fSlow17, fTemp7)));
+ fRec9[0] = (___SMMUL(fSlow15, __QSUB(fTemp9, fTemp10)) + (fRec10[2] + ___SMMUL(fSlow5, __QSUB(fRec10[0], fRec9[2]))));
+ int32_t fTemp11 = ___SMMUL(fRec8[1], cosf(___SMMUL(fSlow18, fTemp7)));
+ fRec8[0] = (___SMMUL(fSlow15, __QSUB(fTemp10, fTemp11)) + (fRec9[2] + ___SMMUL(fSlow5, __QSUB(fRec9[0], fRec8[2]))));
+ fRec7[0] = (___SMMUL(fSlow5, fRec8[0]) + (___SMMUL(fSlow15, fTemp11) + fRec8[2]));
+ // TODO: add outlet to see if fRec7 is at all correct
+ output1[i] = ___SMMUL(fTemp6, fSlow19) + ___SMMUL(fRec7[0], fSlow1);
+ }
+
+ // post processing
+ fRec7[1] = fRec7[0];
+ fRec8[2] = fRec8[1]; fRec8[1] = fRec8[0];
+ fRec9[2] = fRec9[1]; fRec9[1] = fRec9[0];
+ fRec10[2] = fRec10[1]; fRec10[1] = fRec10[0];
+ fRec11[2] = fRec11[1]; fRec11[1] = fRec11[0];
+ fRec0[1] = fRec0[0];
+ fRec1[2] = fRec1[1]; fRec1[1] = fRec1[0];
+ fRec2[2] = fRec2[1]; fRec2[1] = fRec2[0];
+ fRec3[2] = fRec3[1]; fRec3[1] = fRec3[0];
+ fRec4[2] = fRec4[1]; fRec4[1] = fRec4[0];
+ fRec6[1] = fRec6[0];
+ fRec5[1] = fRec5[0];
+ iVec0[1] = iVec0[0];
+ }
+]]></code.krate>
+ </obj.normal>
+</objdefs>
diff --git a/objects/limiter.axs b/objects/limiter.axs
new file mode 100644
index 0000000..e724c2a
--- /dev/null
+++ b/objects/limiter.axs
@@ -0,0 +1,126 @@
+<patch-1.0 appVersion="1.0.11">
+ <obj type="math/abs" uuid="f4078fd9b2dff40d4f1551b79900c9ab360c99" name="abs_1" x="238" y="280">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="filter/lp" uuid="1427779cf086ab83c8b03eeeac69c2a97759c651" name="lp_2" x="308" y="280">
+ <params>
+ <frac32.s.map name="pitch" value="-30.0"/>
+ <frac32.u.map name="reso" value="0.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="math/+c" uuid="8a7195df16f4695260af58e8072c656181925b4d" name="+c_1" x="420" y="280">
+ <params>
+ <frac32.u.map name="c" value="1.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="math/reciprocal" uuid="4be823e668871835d067cbfe42407b06f927f91f" name="reciprocal_1" x="490" y="280">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="conv/to f" uuid="bdd08445689602ce174689ccb6be085f627d9892" name="to_1" x="588" y="280">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/smooth2" uuid="9ba3ddec912512e6b63211080e89cb25b6d84834" name="smooth2_1" x="658" y="280">
+ <params>
+ <frac32.u.map name="risetime" onParent="true" value="33.0"/>
+ <frac32.u.map name="falltime" onParent="true" value="28.5"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="math/gain" uuid="6b4dd3da49f98e54900f6c20031f38f4624fa364" name="gain_2" x="756" y="280">
+ <params>
+ <frac32.u.map name="amp" onParent="true" value="4.5"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="math/+c" uuid="13eec32bd8ad57dd0bb18a02566cc0a117d320e3" name="+c_2" x="868" y="280">
+ <params>
+ <frac32.u.map name="c" onParent="true" value="0.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="gain/vca" uuid="a9f2dcd18043e2f47364e45cb8814f63c2a37c0d" name="vca_1" x="938" y="280">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet a" uuid="abd8c5fd3b0524a6630f65cad6dc27f6c58e2a3e" name="audio out" x="1008" y="280">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet a" uuid="b577fe41e0a6bc7b5502ce33cb8a3129e2e28ee5" name="audio in" x="154" y="322">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="delay/echo" uuid="b7e4de60a644f6b30fdee9648ea62f446ecce38d" name="echo_1" x="238" y="434">
+ <params/>
+ <attribs>
+ <spinner attributeName="delaylength" value="128"/>
+ </attribs>
+ </obj>
+ <obj type="patch/outlet f" uuid="d18a9a550bcaaebac94e25983bd0e27dbfd7233c" name="gain" x="938" y="434">
+ <params/>
+ <attribs/>
+ </obj>
+ <nets>
+ <net>
+ <source obj="lp_2" outlet="out"/>
+ <dest obj="+c_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="+c_1" outlet="out"/>
+ <dest obj="reciprocal_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="reciprocal_1" outlet="out"/>
+ <dest obj="to_1" inlet="i"/>
+ </net>
+ <net>
+ <source obj="to_1" outlet="o"/>
+ <dest obj="smooth2_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="smooth2_1" outlet="out"/>
+ <dest obj="gain_2" inlet="in"/>
+ </net>
+ <net>
+ <source obj="gain_2" outlet="out"/>
+ <dest obj="+c_2" inlet="in"/>
+ </net>
+ <net>
+ <source obj="echo_1" outlet="out"/>
+ <dest obj="vca_1" inlet="a"/>
+ </net>
+ <net>
+ <source obj="+c_2" outlet="out"/>
+ <dest obj="vca_1" inlet="v"/>
+ <dest obj="gain" inlet="outlet"/>
+ </net>
+ <net>
+ <source obj="vca_1" outlet="o"/>
+ <dest obj="audio out" inlet="outlet"/>
+ </net>
+ <net>
+ <source obj="abs_1" outlet="out"/>
+ <dest obj="lp_2" inlet="in"/>
+ </net>
+ <net>
+ <source obj="audio in" outlet="inlet"/>
+ <dest obj="echo_1" inlet="in"/>
+ <dest obj="abs_1" inlet="in"/>
+ </net>
+ </nets>
+ <settings>
+ <subpatchmode>no</subpatchmode>
+ </settings>
+ <notes><![CDATA[]]></notes>
+ <windowPos>
+ <x>-5</x>
+ <y>33</y>
+ <width>1290</width>
+ <height>772</height>
+ </windowPos>
+</patch-1.0> \ No newline at end of file
diff --git a/objects/murf.axs b/objects/murf.axs
new file mode 100644
index 0000000..3c63eb2
--- /dev/null
+++ b/objects/murf.axs
@@ -0,0 +1,561 @@
+<patch-1.0>
+ <obj type="ctrl/toggle" sha="f5742cc9eee76fae90a4e570c34596dd327b6c28" uuid="42b8134fa729d54bfc8d62d6ef3fa99498c1de99" name="animate" x="56" y="28">
+ <params>
+ <bool32.tgl name="b" onParent="true" value="0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="logic/change" sha="837ce58b607d311bf1cf34a4ace8f7c43c5699c9" uuid="96e39ae624c3f3c952cec4a95e1986ee0104f718" name="change_1" x="196" y="28">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="./env-bp" uuid="d096215e893865856120e4c05f64b05f61278b02" name="env-bp_1" x="280" y="56">
+ <params>
+ <frac32.s.map name="bp_2:pitch" value="-19.0">
+ <presets>
+ <preset index="2">
+ <f v="-8.649999999999999"/>
+ </preset>
+ <preset index="1">
+ <f v="-19.000000000000068"/>
+ </preset>
+ </presets>
+ </frac32.s.map>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="./env-bp" uuid="d096215e893865856120e4c05f64b05f61278b02" name="env-bp_2" x="406" y="56">
+ <params>
+ <frac32.s.map name="bp_2:pitch" value="-12.509999752044678">
+ <presets>
+ <preset index="2">
+ <f v="-1.6300000000000006"/>
+ </preset>
+ <preset index="1">
+ <f v="-12.509999999999998"/>
+ </preset>
+ </presets>
+ </frac32.s.map>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="./env-bp" uuid="d096215e893865856120e4c05f64b05f61278b02" name="env-bp_3" x="532" y="56">
+ <params>
+ <frac32.s.map name="bp_2:pitch" value="-5.49399995803833">
+ <presets>
+ <preset index="2">
+ <f v="5.389999999999993"/>
+ </preset>
+ <preset index="1">
+ <f v="-5.49399995803833"/>
+ </preset>
+ </presets>
+ </frac32.s.map>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="./env-bp" uuid="d096215e893865856120e4c05f64b05f61278b02" name="env-bp_4" x="658" y="56">
+ <params>
+ <frac32.s.map name="bp_2:pitch" value="1.0399999618530273">
+ <presets>
+ <preset index="2">
+ <f v="12.409000396728516"/>
+ </preset>
+ <preset index="1">
+ <f v="1.0399999618530273"/>
+ </preset>
+ </presets>
+ </frac32.s.map>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="./env-bp" uuid="d096215e893865856120e4c05f64b05f61278b02" name="env-bp_5" x="784" y="56">
+ <params>
+ <frac32.s.map name="bp_2:pitch" value="8.059000015258789">
+ <presets>
+ <preset index="2">
+ <f v="19.220000762939453"/>
+ </preset>
+ <preset index="1">
+ <f v="8.059000015258789"/>
+ </preset>
+ </presets>
+ </frac32.s.map>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="./env-bp" uuid="d096215e893865856120e4c05f64b05f61278b02" name="env-bp_6" x="910" y="56">
+ <params>
+ <frac32.s.map name="bp_2:pitch" value="14.800000190734863">
+ <presets>
+ <preset index="2">
+ <f v="26.23000000000002"/>
+ </preset>
+ <preset index="1">
+ <f v="14.800000190734863"/>
+ </preset>
+ </presets>
+ </frac32.s.map>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="./env-bp" uuid="d096215e893865856120e4c05f64b05f61278b02" name="env-bp_7" x="1036" y="56">
+ <params>
+ <frac32.s.map name="bp_2:pitch" value="22.3700008392334">
+ <presets>
+ <preset index="2">
+ <f v="32.86"/>
+ </preset>
+ <preset index="1">
+ <f v="22.3700008392334"/>
+ </preset>
+ </presets>
+ </frac32.s.map>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="./env-bp" uuid="d096215e893865856120e4c05f64b05f61278b02" name="env-bp_8" x="1162" y="56">
+ <params>
+ <frac32.s.map name="bp_2:pitch" value="29.389999866485596">
+ <presets>
+ <preset index="2">
+ <f v="40.400000000000034"/>
+ </preset>
+ <preset index="1">
+ <f v="29.389999999999997"/>
+ </preset>
+ </presets>
+ </frac32.s.map>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/toggle" sha="f5742cc9eee76fae90a4e570c34596dd327b6c28" uuid="42b8134fa729d54bfc8d62d6ef3fa99498c1de99" name="bass/mid" x="56" y="84">
+ <params>
+ <bool32.tgl name="b" onParent="true" value="0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="math/+1" sha="2e8219f3e40a6f1b07008f9f6233b252761e8f09" uuid="13c1a4574bb81783beb8839e81782b9a34e3fc17" name="+1_1" x="126" y="84">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/preset" sha="9c8ff28c68afe4bd71bf0c853e95d51447cd628e" uuid="f7916cc01d45a5b1bbd444216031e0a02cc0b94c" name="preset_1" x="196" y="84">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/dial p" sha="501c30e07dedf3d701e8d0b33c3c234908c3388e" uuid="cc5d2846c3d50e425f450c4b9851371b54f4d674" name="attack" x="56" y="154">
+ <params>
+ <frac32.u.map name="value" onParent="true" value="42.5"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/dial p" sha="501c30e07dedf3d701e8d0b33c3c234908c3388e" uuid="cc5d2846c3d50e425f450c4b9851371b54f4d674" name="decay" x="126" y="154">
+ <params>
+ <frac32.u.map name="value" onParent="true" value="0.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/dial p" sha="501c30e07dedf3d701e8d0b33c3c234908c3388e" uuid="cc5d2846c3d50e425f450c4b9851371b54f4d674" name="reso" x="196" y="154">
+ <params>
+ <frac32.u.map name="value" onParent="true" value="16.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet f" sha="8e69e1ab7ccd8afaefdc23146c50149809b64955" uuid="5c585d2dcd9c05631e345ac09626a22a639d7c13" name="lfo" x="168" y="252">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="gain/vca" sha="c904cdd24d65968df2f5796e107db3747dd691a6" uuid="a9f2dcd18043e2f47364e45cb8814f63c2a37c0d" name="vca_1" x="336" y="252">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="gain/vca" sha="c904cdd24d65968df2f5796e107db3747dd691a6" uuid="a9f2dcd18043e2f47364e45cb8814f63c2a37c0d" name="vca_2" x="434" y="252">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="gain/vca" sha="c904cdd24d65968df2f5796e107db3747dd691a6" uuid="a9f2dcd18043e2f47364e45cb8814f63c2a37c0d" name="vca_3" x="560" y="252">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="gain/vca" sha="c904cdd24d65968df2f5796e107db3747dd691a6" uuid="a9f2dcd18043e2f47364e45cb8814f63c2a37c0d" name="vca_4" x="672" y="252">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="gain/vca" sha="c904cdd24d65968df2f5796e107db3747dd691a6" uuid="a9f2dcd18043e2f47364e45cb8814f63c2a37c0d" name="vca_5" x="798" y="252">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="gain/vca" sha="c904cdd24d65968df2f5796e107db3747dd691a6" uuid="a9f2dcd18043e2f47364e45cb8814f63c2a37c0d" name="vca_6" x="896" y="252">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="gain/vca" sha="c904cdd24d65968df2f5796e107db3747dd691a6" uuid="a9f2dcd18043e2f47364e45cb8814f63c2a37c0d" name="vca_7" x="1022" y="252">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="gain/vca" sha="c904cdd24d65968df2f5796e107db3747dd691a6" uuid="a9f2dcd18043e2f47364e45cb8814f63c2a37c0d" name="vca_8" x="1148" y="252">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet a" sha="709c10aa648c6e5a3c00da4b5dd238899a7c109c" uuid="b577fe41e0a6bc7b5502ce33cb8a3129e2e28ee5" name="in" x="168" y="322">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="mix/mix 4 g" sha="1026b0e524ad2b22e6faac72bbba11b763ed0c34" uuid="36f472cd81da2e17bd4b4ee11b53b4c82527220c" name="mix_2" x="504" y="378">
+ <params>
+ <frac32.u.map name="gain1" value="32.0"/>
+ <frac32.u.map name="gain2" value="32.0"/>
+ <frac32.u.map name="gain3" value="32.0"/>
+ <frac32.u.map name="gain4" value="32.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet a" sha="9e7e04867e1d37837b0924c9bf18c44ac68602e6" uuid="abd8c5fd3b0524a6630f65cad6dc27f6c58e2a3e" name="left" x="616" y="378">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="mix/mix 4 g" sha="1026b0e524ad2b22e6faac72bbba11b763ed0c34" uuid="36f472cd81da2e17bd4b4ee11b53b4c82527220c" name="mix_3" x="770" y="378">
+ <params>
+ <frac32.u.map name="gain1" value="32.0"/>
+ <frac32.u.map name="gain2" value="32.0"/>
+ <frac32.u.map name="gain3" value="32.0"/>
+ <frac32.u.map name="gain4" value="32.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet a" sha="9e7e04867e1d37837b0924c9bf18c44ac68602e6" uuid="abd8c5fd3b0524a6630f65cad6dc27f6c58e2a3e" name="right" x="882" y="378">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="mix/mix 2 g" sha="921aefdda41b92a27cc93c53b5154554d0ce6d3b" uuid="221f038da51943034a75e442c90624fcebfe6112" name="mix_1" x="966" y="378">
+ <params>
+ <frac32.u.map name="gain1" value="32.0"/>
+ <frac32.u.map name="gain2" value="32.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet a" sha="9e7e04867e1d37837b0924c9bf18c44ac68602e6" uuid="abd8c5fd3b0524a6630f65cad6dc27f6c58e2a3e" name="mono" x="1078" y="378">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet b" sha="17c8e188371661163bfa55cea9974eecb785fb06" uuid="3b0d3eacb5bb978cb05d1372aa2714d5a4790844" name="bp1" x="168" y="392">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet b" sha="17c8e188371661163bfa55cea9974eecb785fb06" uuid="3b0d3eacb5bb978cb05d1372aa2714d5a4790844" name="bp2" x="168" y="434">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/*c" sha="60143a29e35f452025e9edaa2dec6e660ecb9c6e" uuid="7d5ef61c3bcd571ee6bbd8437ef3612125dfb225" name="lfo depth" x="364" y="448">
+ <params>
+ <frac32.u.map name="amp" onParent="true" value="0.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="math/div 16" sha="153e55f554960498908693663e38bb762eb480d8" uuid="19cf8d3358046cb69c1139e51a3e1555742492e0" name="div_1" x="280" y="462">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet b" sha="17c8e188371661163bfa55cea9974eecb785fb06" uuid="3b0d3eacb5bb978cb05d1372aa2714d5a4790844" name="bp3" x="168" y="476">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet b" sha="17c8e188371661163bfa55cea9974eecb785fb06" uuid="3b0d3eacb5bb978cb05d1372aa2714d5a4790844" name="bp4" x="168" y="518">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet b" sha="17c8e188371661163bfa55cea9974eecb785fb06" uuid="3b0d3eacb5bb978cb05d1372aa2714d5a4790844" name="bp5" x="168" y="560">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet b" sha="17c8e188371661163bfa55cea9974eecb785fb06" uuid="3b0d3eacb5bb978cb05d1372aa2714d5a4790844" name="bp6" x="168" y="602">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet b" sha="17c8e188371661163bfa55cea9974eecb785fb06" uuid="3b0d3eacb5bb978cb05d1372aa2714d5a4790844" name="bp7" x="168" y="644">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet b" sha="17c8e188371661163bfa55cea9974eecb785fb06" uuid="3b0d3eacb5bb978cb05d1372aa2714d5a4790844" name="bp8" x="168" y="686">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet f" sha="8e69e1ab7ccd8afaefdc23146c50149809b64955" uuid="5c585d2dcd9c05631e345ac09626a22a639d7c13" name="vol1" x="168" y="742">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet f" sha="8e69e1ab7ccd8afaefdc23146c50149809b64955" uuid="5c585d2dcd9c05631e345ac09626a22a639d7c13" name="vol2" x="252" y="742">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet f" sha="8e69e1ab7ccd8afaefdc23146c50149809b64955" uuid="5c585d2dcd9c05631e345ac09626a22a639d7c13" name="vol3" x="350" y="742">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet f" sha="8e69e1ab7ccd8afaefdc23146c50149809b64955" uuid="5c585d2dcd9c05631e345ac09626a22a639d7c13" name="vol4" x="434" y="742">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet f" sha="8e69e1ab7ccd8afaefdc23146c50149809b64955" uuid="5c585d2dcd9c05631e345ac09626a22a639d7c13" name="vol5" x="518" y="742">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet f" sha="8e69e1ab7ccd8afaefdc23146c50149809b64955" uuid="5c585d2dcd9c05631e345ac09626a22a639d7c13" name="vol6" x="602" y="742">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet f" sha="8e69e1ab7ccd8afaefdc23146c50149809b64955" uuid="5c585d2dcd9c05631e345ac09626a22a639d7c13" name="vol7" x="700" y="742">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet f" sha="8e69e1ab7ccd8afaefdc23146c50149809b64955" uuid="5c585d2dcd9c05631e345ac09626a22a639d7c13" name="vol8" x="784" y="742">
+ <params/>
+ <attribs/>
+ </obj>
+ <nets>
+ <net>
+ <source obj="in" outlet="inlet"/>
+ <dest obj="env-bp_1" inlet="in"/>
+ <dest obj="env-bp_5" inlet="in"/>
+ <dest obj="env-bp_2" inlet="in"/>
+ <dest obj="env-bp_3" inlet="in"/>
+ <dest obj="env-bp_6" inlet="in"/>
+ <dest obj="env-bp_7" inlet="in"/>
+ <dest obj="env-bp_8" inlet="in"/>
+ <dest obj="env-bp_4" inlet="in"/>
+ </net>
+ <net>
+ <source obj="decay" outlet="out"/>
+ <dest obj="env-bp_1" inlet="decay"/>
+ <dest obj="env-bp_4" inlet="decay"/>
+ <dest obj="env-bp_5" inlet="decay"/>
+ <dest obj="env-bp_2" inlet="decay"/>
+ <dest obj="env-bp_8" inlet="decay"/>
+ <dest obj="env-bp_6" inlet="decay"/>
+ <dest obj="env-bp_7" inlet="decay"/>
+ <dest obj="env-bp_3" inlet="decay"/>
+ </net>
+ <net>
+ <source obj="reso" outlet="out"/>
+ <dest obj="env-bp_1" inlet="reso"/>
+ <dest obj="env-bp_4" inlet="reso"/>
+ <dest obj="env-bp_5" inlet="reso"/>
+ <dest obj="env-bp_6" inlet="reso"/>
+ <dest obj="env-bp_7" inlet="reso"/>
+ <dest obj="env-bp_2" inlet="reso"/>
+ <dest obj="env-bp_3" inlet="reso"/>
+ <dest obj="env-bp_8" inlet="reso"/>
+ </net>
+ <net>
+ <source obj="attack" outlet="out"/>
+ <dest obj="env-bp_1" inlet="attack"/>
+ <dest obj="env-bp_4" inlet="attack"/>
+ <dest obj="env-bp_5" inlet="attack"/>
+ <dest obj="env-bp_2" inlet="attack"/>
+ <dest obj="env-bp_8" inlet="attack"/>
+ <dest obj="env-bp_7" inlet="attack"/>
+ <dest obj="env-bp_3" inlet="attack"/>
+ <dest obj="env-bp_6" inlet="attack"/>
+ </net>
+ <net>
+ <source obj="env-bp_1" outlet="out"/>
+ <dest obj="vca_1" inlet="a"/>
+ </net>
+ <net>
+ <source obj="env-bp_2" outlet="out"/>
+ <dest obj="vca_2" inlet="a"/>
+ </net>
+ <net>
+ <source obj="env-bp_3" outlet="out"/>
+ <dest obj="vca_3" inlet="a"/>
+ </net>
+ <net>
+ <source obj="env-bp_5" outlet="out"/>
+ <dest obj="vca_5" inlet="a"/>
+ </net>
+ <net>
+ <source obj="env-bp_6" outlet="out"/>
+ <dest obj="vca_6" inlet="a"/>
+ </net>
+ <net>
+ <source obj="env-bp_7" outlet="out"/>
+ <dest obj="vca_7" inlet="a"/>
+ </net>
+ <net>
+ <source obj="lfo depth" outlet="out"/>
+ <dest obj="env-bp_1" inlet="pitch"/>
+ <dest obj="env-bp_2" inlet="pitch"/>
+ <dest obj="env-bp_3" inlet="pitch"/>
+ <dest obj="env-bp_4" inlet="pitch"/>
+ <dest obj="env-bp_5" inlet="pitch"/>
+ <dest obj="env-bp_6" inlet="pitch"/>
+ <dest obj="env-bp_7" inlet="pitch"/>
+ <dest obj="env-bp_8" inlet="pitch"/>
+ </net>
+ <net>
+ <source obj="mix_2" outlet="out"/>
+ <dest obj="left" inlet="outlet"/>
+ <dest obj="mix_1" inlet="in2"/>
+ </net>
+ <net>
+ <source obj="mix_3" outlet="out"/>
+ <dest obj="right" inlet="outlet"/>
+ <dest obj="mix_1" inlet="in1"/>
+ </net>
+ <net>
+ <source obj="animate" outlet="o"/>
+ <dest obj="env-bp_1" inlet="animate"/>
+ <dest obj="env-bp_2" inlet="animate"/>
+ <dest obj="env-bp_3" inlet="animate"/>
+ <dest obj="env-bp_4" inlet="animate"/>
+ <dest obj="env-bp_5" inlet="animate"/>
+ <dest obj="env-bp_6" inlet="animate"/>
+ <dest obj="env-bp_7" inlet="animate"/>
+ <dest obj="env-bp_8" inlet="animate"/>
+ </net>
+ <net>
+ <source obj="bass/mid" outlet="o"/>
+ <dest obj="+1_1" inlet="a"/>
+ </net>
+ <net>
+ <source obj="+1_1" outlet="result"/>
+ <dest obj="preset_1" inlet="preset"/>
+ <dest obj="change_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="lfo" outlet="inlet"/>
+ <dest obj="div_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="change_1" outlet="trig"/>
+ <dest obj="preset_1" inlet="trig"/>
+ </net>
+ <net>
+ <source obj="bp1" outlet="inlet"/>
+ <dest obj="env-bp_1" inlet="gate"/>
+ </net>
+ <net>
+ <source obj="bp2" outlet="inlet"/>
+ <dest obj="env-bp_2" inlet="gate"/>
+ </net>
+ <net>
+ <source obj="bp3" outlet="inlet"/>
+ <dest obj="env-bp_3" inlet="gate"/>
+ </net>
+ <net>
+ <source obj="bp4" outlet="inlet"/>
+ <dest obj="env-bp_4" inlet="gate"/>
+ </net>
+ <net>
+ <source obj="bp5" outlet="inlet"/>
+ <dest obj="env-bp_5" inlet="gate"/>
+ </net>
+ <net>
+ <source obj="bp6" outlet="inlet"/>
+ <dest obj="env-bp_6" inlet="gate"/>
+ </net>
+ <net>
+ <source obj="bp7" outlet="inlet"/>
+ <dest obj="env-bp_7" inlet="gate"/>
+ </net>
+ <net>
+ <source obj="bp8" outlet="inlet"/>
+ <dest obj="env-bp_8" inlet="gate"/>
+ </net>
+ <net>
+ <source obj="mix_1" outlet="out"/>
+ <dest obj="mono" inlet="outlet"/>
+ </net>
+ <net>
+ <source obj="vca_1" outlet="o"/>
+ <dest obj="mix_2" inlet="in1"/>
+ </net>
+ <net>
+ <source obj="vca_3" outlet="o"/>
+ <dest obj="mix_2" inlet="in2"/>
+ </net>
+ <net>
+ <source obj="vca_5" outlet="o"/>
+ <dest obj="mix_2" inlet="in3"/>
+ </net>
+ <net>
+ <source obj="vca_7" outlet="o"/>
+ <dest obj="mix_2" inlet="in4"/>
+ </net>
+ <net>
+ <source obj="vca_2" outlet="o"/>
+ <dest obj="mix_3" inlet="in1"/>
+ </net>
+ <net>
+ <source obj="vca_4" outlet="o"/>
+ <dest obj="mix_3" inlet="in2"/>
+ </net>
+ <net>
+ <source obj="env-bp_4" outlet="out"/>
+ <dest obj="vca_4" inlet="a"/>
+ </net>
+ <net>
+ <source obj="vca_6" outlet="o"/>
+ <dest obj="mix_3" inlet="in3"/>
+ </net>
+ <net>
+ <source obj="vca_8" outlet="o"/>
+ <dest obj="mix_3" inlet="in4"/>
+ </net>
+ <net>
+ <source obj="env-bp_8" outlet="out"/>
+ <dest obj="vca_8" inlet="a"/>
+ </net>
+ <net>
+ <source obj="vol1" outlet="inlet"/>
+ <dest obj="vca_1" inlet="v"/>
+ </net>
+ <net>
+ <source obj="vol2" outlet="inlet"/>
+ <dest obj="vca_2" inlet="v"/>
+ </net>
+ <net>
+ <source obj="vol3" outlet="inlet"/>
+ <dest obj="vca_3" inlet="v"/>
+ </net>
+ <net>
+ <source obj="vol4" outlet="inlet"/>
+ <dest obj="vca_4" inlet="v"/>
+ </net>
+ <net>
+ <source obj="vol5" outlet="inlet"/>
+ <dest obj="vca_5" inlet="v"/>
+ </net>
+ <net>
+ <source obj="vol6" outlet="inlet"/>
+ <dest obj="vca_6" inlet="v"/>
+ </net>
+ <net>
+ <source obj="vol7" outlet="inlet"/>
+ <dest obj="vca_7" inlet="v"/>
+ </net>
+ <net>
+ <source obj="vol8" outlet="inlet"/>
+ <dest obj="vca_8" inlet="v"/>
+ </net>
+ <net>
+ <source obj="div_1" outlet="out"/>
+ <dest obj="lfo depth" inlet="in"/>
+ </net>
+ </nets>
+ <settings>
+ <subpatchmode>no</subpatchmode>
+ <MidiChannel>1</MidiChannel>
+ <NPresets>8</NPresets>
+ <NPresetEntries>32</NPresetEntries>
+ <NModulationSources>8</NModulationSources>
+ <NModulationTargetsPerSource>8</NModulationTargetsPerSource>
+ </settings>
+ <notes><![CDATA[]]></notes>
+ <windowPos>
+ <x>0</x>
+ <y>31</y>
+ <width>1280</width>
+ <height>769</height>
+ </windowPos>
+</patch-1.0> \ No newline at end of file
diff --git a/objects/octaver.axs b/objects/octaver.axs
new file mode 100644
index 0000000..492038e
--- /dev/null
+++ b/objects/octaver.axs
@@ -0,0 +1,238 @@
+<patch-1.0>
+ <comment type="patch/comment" x="854" y="56" text="write to delayline"/>
+ <obj type="patch/inlet a" sha="709c10aa648c6e5a3c00da4b5dd238899a7c109c" uuid="b577fe41e0a6bc7b5502ce33cb8a3129e2e28ee5" name="audio in" x="756" y="70">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="delay/write" sha="c573b27a5ebc2efb2d1e8ec173ff4793a2acbae2" name="d1" x="854" y="70">
+ <params/>
+ <attribs>
+ <combo attributeName="size" selection="8192 (170ms)"/>
+ </attribs>
+ </obj>
+ <comment type="patch/comment" x="168" y="98" text="direction of pitch change"/>
+ <comment type="patch/comment" x="420" y="98" text="intervals"/>
+ <obj type="patch/inlet b" sha="17c8e188371661163bfa55cea9974eecb785fb06" uuid="3b0d3eacb5bb978cb05d1372aa2714d5a4790844" name="up/down" x="168" y="112">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet i" sha="525f64aba3d51dde5253cccedd116ec84bf5d5d1" uuid="f11927f00c59219df0c50f73056aa19f125540b7" name="interval" x="322" y="112">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="sel/sel dial 4" sha="7b1dd698ae4ee24b56779ec6463575f325706bc0" uuid="2bf0aa0779d8476013c6151d55fa9452b204d852" name="sel_1" x="420" y="112">
+ <params>
+ <frac32.u.map name="v0" value="16.0"/>
+ <frac32.u.map name="v1" value="32.0"/>
+ <frac32.u.map name="v2" value="48.0"/>
+ <frac32.u.map name="v3" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/dial b" sha="b26f881dfa1451f0269e068eb6b3d824b43b41d3" uuid="862e7d7f29093cb1ce4aed72244d118ad4d46692" name="dial_1" x="28" y="182">
+ <params>
+ <frac32.s.map name="value" value="-5.859999656677246"/>
+ </params>
+ <attribs/>
+ </obj>
+ <comment type="patch/comment" x="28" y="294" text="mod frequency tuned to length of delay line"/>
+ <obj type="osc/phasor compl" sha="c95d1332c224aad738fb4504cb00706af8221028" name="phasor3_1" x="28" y="322">
+ <params>
+ <frac32.s.map name="pitch" value="-64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="math/inv" sha="3e213fdc5d4220476cf173e433160725802df77f" uuid="7f4c6cf4dcf79f9b0aa81c2eaf540405875714a3" name="inv_2" x="196" y="322">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/+c" sha="f19b3c5f68040d780d0d778288eae0022b8f5954" uuid="8a7195df16f4695260af58e8072c656181925b4d" name="+c_1" x="266" y="322">
+ <params>
+ <frac32.u.map name="c" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="mux/mux 2" sha="10c5b6d774e8c972b6bb863dad23e83034e0990f" uuid="539c246f4c360ac476e128cfbfa84348fb7f7e73" name="mux_1" x="336" y="322">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/*" sha="c47ceb7366785e0103cf880ce3450321491949f1" name="*c1" x="420" y="322">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="delay/read interp" sha="6fda3a4b04cc8fc49e63240c2fff115695ec7a7" name="delread2__1" x="490" y="322">
+ <params>
+ <frac32.u.map name="time" value="0.0"/>
+ </params>
+ <attribs>
+ <objref attributeName="delayname" obj="d1"/>
+ </attribs>
+ </obj>
+ <obj type="math/*" sha="d67b6c172dd96232df67e96baf19e3062e880e68" name="*1" x="658" y="322">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="mix/mix 2" sha="67c325bf12e5b73ad58df89daf7899831777003c" name="mix21" x="784" y="378">
+ <params>
+ <frac32.u.map name="gain1" value="32.0"/>
+ <frac32.u.map name="gain2" value="32.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet a" sha="9e7e04867e1d37837b0924c9bf18c44ac68602e6" uuid="abd8c5fd3b0524a6630f65cad6dc27f6c58e2a3e" name="audio out" x="882" y="392">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/window" sha="279fd6991b5a8cf4c66e33feefccb9c9deb02f1d" name="window_1" x="490" y="420">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/inv" sha="3e213fdc5d4220476cf173e433160725802df77f" uuid="7f4c6cf4dcf79f9b0aa81c2eaf540405875714a3" name="inv_3" x="196" y="490">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/+c" sha="f19b3c5f68040d780d0d778288eae0022b8f5954" uuid="8a7195df16f4695260af58e8072c656181925b4d" name="+c_2" x="266" y="490">
+ <params>
+ <frac32.u.map name="c" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="mux/mux 2" sha="10c5b6d774e8c972b6bb863dad23e83034e0990f" uuid="539c246f4c360ac476e128cfbfa84348fb7f7e73" name="mux_2" x="336" y="490">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/*" sha="c47ceb7366785e0103cf880ce3450321491949f1" name="*c1_" x="420" y="490">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="delay/read interp" sha="6fda3a4b04cc8fc49e63240c2fff115695ec7a7" name="delread2__1_" x="490" y="490">
+ <params>
+ <frac32.u.map name="time" value="0.0"/>
+ </params>
+ <attribs>
+ <objref attributeName="delayname" obj="d1"/>
+ </attribs>
+ </obj>
+ <obj type="math/*" sha="d67b6c172dd96232df67e96baf19e3062e880e68" name="*1_" x="658" y="490">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/window" sha="279fd6991b5a8cf4c66e33feefccb9c9deb02f1d" name="window_1_" x="490" y="588">
+ <params/>
+ <attribs/>
+ </obj>
+ <nets>
+ <net>
+ <source obj="window_1" outlet="win"/>
+ <dest obj="*1" inlet="b"/>
+ </net>
+ <net>
+ <source obj="delread2__1" outlet="out"/>
+ <dest obj="*1" inlet="a"/>
+ </net>
+ <net>
+ <source obj="mix21" outlet="out"/>
+ <dest obj="audio out" inlet="outlet"/>
+ </net>
+ <net>
+ <source obj="*c1" outlet="result"/>
+ <dest obj="delread2__1" inlet="time"/>
+ </net>
+ <net>
+ <source obj="delread2__1_" outlet="out"/>
+ <dest obj="*1_" inlet="a"/>
+ </net>
+ <net>
+ <source obj="*1" outlet="result"/>
+ <dest obj="mix21" inlet="in1"/>
+ </net>
+ <net>
+ <source obj="*1_" outlet="result"/>
+ <dest obj="mix21" inlet="in2"/>
+ </net>
+ <net>
+ <source obj="window_1_" outlet="win"/>
+ <dest obj="*1_" inlet="b"/>
+ </net>
+ <net>
+ <source obj="phasor3_1" outlet="phasor180"/>
+ <dest obj="inv_3" inlet="in"/>
+ <dest obj="mux_2" inlet="i1"/>
+ </net>
+ <net>
+ <source obj="inv_3" outlet="out"/>
+ <dest obj="+c_2" inlet="in"/>
+ </net>
+ <net>
+ <source obj="*c1_" outlet="result"/>
+ <dest obj="delread2__1_" inlet="time"/>
+ </net>
+ <net>
+ <source obj="+c_1" outlet="out"/>
+ <dest obj="mux_1" inlet="i2"/>
+ </net>
+ <net>
+ <source obj="inv_2" outlet="out"/>
+ <dest obj="+c_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="+c_2" outlet="out"/>
+ <dest obj="mux_2" inlet="i2"/>
+ </net>
+ <net>
+ <source obj="audio in" outlet="inlet"/>
+ <dest obj="d1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="up/down" outlet="inlet"/>
+ <dest obj="mux_1" inlet="s"/>
+ <dest obj="mux_2" inlet="s"/>
+ </net>
+ <net>
+ <source obj="phasor3_1" outlet="phasor0"/>
+ <dest obj="mux_1" inlet="i1"/>
+ <dest obj="inv_2" inlet="in"/>
+ </net>
+ <net>
+ <source obj="mux_1" outlet="o"/>
+ <dest obj="*c1" inlet="a"/>
+ <dest obj="window_1" inlet="phase"/>
+ </net>
+ <net>
+ <source obj="mux_2" outlet="o"/>
+ <dest obj="*c1_" inlet="a"/>
+ <dest obj="window_1_" inlet="phase"/>
+ </net>
+ <net>
+ <source obj="sel_1" outlet="o"/>
+ <dest obj="*c1" inlet="b"/>
+ <dest obj="*c1_" inlet="b"/>
+ </net>
+ <net>
+ <source obj="interval" outlet="inlet"/>
+ <dest obj="sel_1" inlet="s"/>
+ </net>
+ <net>
+ <source obj="dial_1" outlet="out"/>
+ <dest obj="phasor3_1" inlet="pitch"/>
+ </net>
+ </nets>
+ <settings>
+ <subpatchmode>no</subpatchmode>
+ <MidiChannel>1</MidiChannel>
+ <NPresets>8</NPresets>
+ <NPresetEntries>32</NPresetEntries>
+ <NModulationSources>8</NModulationSources>
+ <NModulationTargetsPerSource>8</NModulationTargetsPerSource>
+ <Author>Ricardo</Author>
+ <License>GPL</License>
+ <Attributions></Attributions>
+ </settings>
+ <notes><![CDATA[]]></notes>
+ <windowPos>
+ <x>85</x>
+ <y>33</y>
+ <width>1276</width>
+ <height>771</height>
+ </windowPos>
+</patch-1.0> \ No newline at end of file
diff --git a/objects/pattern-editor.axs b/objects/pattern-editor.axs
new file mode 100644
index 0000000..1b582c7
--- /dev/null
+++ b/objects/pattern-editor.axs
@@ -0,0 +1,278 @@
+<patch-1.0>
+ <obj type="logic/counter" sha="519c79f42a7c84352830b08e68696ecbf5d0bd52" uuid="7a141ba82230e54e5f5cd12da5dbe5a74ba854a5" name="counter_1" x="182" y="14">
+ <params>
+ <int32 name="maximum" onParent="true" value="8"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="logic/counter" sha="519c79f42a7c84352830b08e68696ecbf5d0bd52" uuid="7a141ba82230e54e5f5cd12da5dbe5a74ba854a5" name="counter_2" x="252" y="14">
+ <params>
+ <int32 name="maximum" onParent="true" value="8"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="logic/counter" sha="519c79f42a7c84352830b08e68696ecbf5d0bd52" uuid="7a141ba82230e54e5f5cd12da5dbe5a74ba854a5" name="counter_3" x="322" y="14">
+ <params>
+ <int32 name="maximum" onParent="true" value="8"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="logic/counter" sha="519c79f42a7c84352830b08e68696ecbf5d0bd52" uuid="7a141ba82230e54e5f5cd12da5dbe5a74ba854a5" name="counter_4" x="392" y="14">
+ <params>
+ <int32 name="maximum" onParent="true" value="8"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="logic/counter" sha="519c79f42a7c84352830b08e68696ecbf5d0bd52" uuid="7a141ba82230e54e5f5cd12da5dbe5a74ba854a5" name="counter_5" x="462" y="14">
+ <params>
+ <int32 name="maximum" onParent="true" value="8"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="logic/counter" sha="519c79f42a7c84352830b08e68696ecbf5d0bd52" uuid="7a141ba82230e54e5f5cd12da5dbe5a74ba854a5" name="counter_6" x="532" y="14">
+ <params>
+ <int32 name="maximum" onParent="true" value="8"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="logic/counter" sha="519c79f42a7c84352830b08e68696ecbf5d0bd52" uuid="7a141ba82230e54e5f5cd12da5dbe5a74ba854a5" name="counter_7" x="602" y="14">
+ <params>
+ <int32 name="maximum" onParent="true" value="8"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="logic/counter" sha="519c79f42a7c84352830b08e68696ecbf5d0bd52" uuid="7a141ba82230e54e5f5cd12da5dbe5a74ba854a5" name="counter_8" x="672" y="14">
+ <params>
+ <int32 name="maximum" onParent="true" value="8"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet f" sha="8e69e1ab7ccd8afaefdc23146c50149809b64955" uuid="5c585d2dcd9c05631e345ac09626a22a639d7c13" name="lfo" x="56" y="28">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet b" sha="d53edf73b9c33108cbb6e5487759ac27b809cfcc" uuid="191792f616d4835dba0b55375474a12942e5bcbd" name="outlet_1" x="966" y="28">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet i" sha="9c18b5ec0ea721bb98852ab326891478ca87a360" uuid="aae2176b26209e34e4fdeba5edb1ace82d178655" name="pos1" x="1036" y="28">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet b" sha="17c8e188371661163bfa55cea9974eecb785fb06" uuid="3b0d3eacb5bb978cb05d1372aa2714d5a4790844" name="reset" x="42" y="98">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="rekado/sel b 32 pulse" sha="42339346cf951f33849d48f4292fa61903ccf4c8" uuid="8ad8a3dea3cedd0c5f731045ab90188e437c1260" name="sel_1" x="322" y="98">
+ <params>
+ <bin32 name="b32" onParent="true" value="0">
+ <presets/>
+ </bin32>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet b" sha="d53edf73b9c33108cbb6e5487759ac27b809cfcc" uuid="191792f616d4835dba0b55375474a12942e5bcbd" name="outlet_2" x="966" y="112">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet i" sha="9c18b5ec0ea721bb98852ab326891478ca87a360" uuid="aae2176b26209e34e4fdeba5edb1ace82d178655" name="pos2" x="1036" y="112">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="rekado/sel b 32 pulse" sha="42339346cf951f33849d48f4292fa61903ccf4c8" uuid="8ad8a3dea3cedd0c5f731045ab90188e437c1260" name="sel_2" x="322" y="168">
+ <params>
+ <bin32 name="b32" onParent="true" value="0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet b" sha="d53edf73b9c33108cbb6e5487759ac27b809cfcc" uuid="191792f616d4835dba0b55375474a12942e5bcbd" name="outlet_3" x="966" y="168">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet i" sha="9c18b5ec0ea721bb98852ab326891478ca87a360" uuid="aae2176b26209e34e4fdeba5edb1ace82d178655" name="pos3" x="1036" y="168">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet b" sha="d53edf73b9c33108cbb6e5487759ac27b809cfcc" uuid="191792f616d4835dba0b55375474a12942e5bcbd" name="outlet_4" x="966" y="224">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet i" sha="9c18b5ec0ea721bb98852ab326891478ca87a360" uuid="aae2176b26209e34e4fdeba5edb1ace82d178655" name="pos4" x="1036" y="224">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="rekado/sel b 32 pulse" sha="42339346cf951f33849d48f4292fa61903ccf4c8" uuid="8ad8a3dea3cedd0c5f731045ab90188e437c1260" name="sel_3" x="322" y="238">
+ <params>
+ <bin32 name="b32" onParent="true" value="0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="rekado/sel b 32 pulse" sha="42339346cf951f33849d48f4292fa61903ccf4c8" uuid="8ad8a3dea3cedd0c5f731045ab90188e437c1260" name="sel_4" x="322" y="308">
+ <params>
+ <bin32 name="b32" onParent="true" value="0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet b" sha="d53edf73b9c33108cbb6e5487759ac27b809cfcc" uuid="191792f616d4835dba0b55375474a12942e5bcbd" name="outlet_5" x="966" y="308">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet i" sha="9c18b5ec0ea721bb98852ab326891478ca87a360" uuid="aae2176b26209e34e4fdeba5edb1ace82d178655" name="pos5" x="1036" y="308">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet b" sha="d53edf73b9c33108cbb6e5487759ac27b809cfcc" uuid="191792f616d4835dba0b55375474a12942e5bcbd" name="outlet_6" x="966" y="364">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet i" sha="9c18b5ec0ea721bb98852ab326891478ca87a360" uuid="aae2176b26209e34e4fdeba5edb1ace82d178655" name="pos6" x="1036" y="364">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="rekado/sel b 32 pulse" sha="42339346cf951f33849d48f4292fa61903ccf4c8" uuid="8ad8a3dea3cedd0c5f731045ab90188e437c1260" name="sel_5" x="322" y="378">
+ <params>
+ <bin32 name="b32" onParent="true" value="0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="rekado/sel b 32 pulse" sha="42339346cf951f33849d48f4292fa61903ccf4c8" uuid="8ad8a3dea3cedd0c5f731045ab90188e437c1260" name="sel_6" x="322" y="448">
+ <params>
+ <bin32 name="b32" onParent="true" value="0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet b" sha="d53edf73b9c33108cbb6e5487759ac27b809cfcc" uuid="191792f616d4835dba0b55375474a12942e5bcbd" name="outlet_7" x="966" y="448">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet i" sha="9c18b5ec0ea721bb98852ab326891478ca87a360" uuid="aae2176b26209e34e4fdeba5edb1ace82d178655" name="pos7" x="1036" y="448">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet b" sha="d53edf73b9c33108cbb6e5487759ac27b809cfcc" uuid="191792f616d4835dba0b55375474a12942e5bcbd" name="outlet_8" x="966" y="504">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet i" sha="9c18b5ec0ea721bb98852ab326891478ca87a360" uuid="aae2176b26209e34e4fdeba5edb1ace82d178655" name="pos8" x="1036" y="504">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="rekado/sel b 32 pulse" sha="42339346cf951f33849d48f4292fa61903ccf4c8" uuid="8ad8a3dea3cedd0c5f731045ab90188e437c1260" name="sel_7" x="322" y="518">
+ <params>
+ <bin32 name="b32" onParent="true" value="0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="rekado/sel b 32 pulse" sha="42339346cf951f33849d48f4292fa61903ccf4c8" uuid="8ad8a3dea3cedd0c5f731045ab90188e437c1260" name="sel_8" x="322" y="588">
+ <params>
+ <bin32 name="b32" onParent="true" value="0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <nets>
+ <net>
+ <source obj="lfo" outlet="inlet"/>
+ <dest obj="counter_1" inlet="trig"/>
+ <dest obj="counter_2" inlet="trig"/>
+ <dest obj="counter_3" inlet="trig"/>
+ <dest obj="counter_4" inlet="trig"/>
+ <dest obj="counter_5" inlet="trig"/>
+ <dest obj="counter_6" inlet="trig"/>
+ <dest obj="counter_7" inlet="trig"/>
+ <dest obj="counter_8" inlet="trig"/>
+ </net>
+ <net>
+ <source obj="counter_1" outlet="o"/>
+ <dest obj="pos1" inlet="outlet"/>
+ <dest obj="sel_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="counter_2" outlet="o"/>
+ <dest obj="pos2" inlet="outlet"/>
+ <dest obj="sel_2" inlet="in"/>
+ </net>
+ <net>
+ <source obj="counter_3" outlet="o"/>
+ <dest obj="pos3" inlet="outlet"/>
+ <dest obj="sel_3" inlet="in"/>
+ </net>
+ <net>
+ <source obj="counter_4" outlet="o"/>
+ <dest obj="pos4" inlet="outlet"/>
+ <dest obj="sel_4" inlet="in"/>
+ </net>
+ <net>
+ <source obj="counter_5" outlet="o"/>
+ <dest obj="pos5" inlet="outlet"/>
+ <dest obj="sel_5" inlet="in"/>
+ </net>
+ <net>
+ <source obj="counter_7" outlet="o"/>
+ <dest obj="pos7" inlet="outlet"/>
+ <dest obj="sel_7" inlet="in"/>
+ </net>
+ <net>
+ <source obj="counter_8" outlet="o"/>
+ <dest obj="pos8" inlet="outlet"/>
+ <dest obj="sel_8" inlet="in"/>
+ </net>
+ <net>
+ <source obj="reset" outlet="inlet"/>
+ <dest obj="counter_1" inlet="r"/>
+ <dest obj="counter_2" inlet="r"/>
+ <dest obj="counter_3" inlet="r"/>
+ <dest obj="counter_4" inlet="r"/>
+ <dest obj="counter_5" inlet="r"/>
+ <dest obj="counter_6" inlet="r"/>
+ <dest obj="counter_7" inlet="r"/>
+ <dest obj="counter_8" inlet="r"/>
+ </net>
+ <net>
+ <source obj="counter_6" outlet="o"/>
+ <dest obj="pos6" inlet="outlet"/>
+ <dest obj="sel_6" inlet="in"/>
+ </net>
+ <net>
+ <source obj="sel_1" outlet="o"/>
+ <dest obj="outlet_1" inlet="outlet"/>
+ </net>
+ <net>
+ <source obj="sel_2" outlet="o"/>
+ <dest obj="outlet_2" inlet="outlet"/>
+ </net>
+ <net>
+ <source obj="sel_3" outlet="o"/>
+ <dest obj="outlet_3" inlet="outlet"/>
+ </net>
+ <net>
+ <source obj="sel_4" outlet="o"/>
+ <dest obj="outlet_4" inlet="outlet"/>
+ </net>
+ <net>
+ <source obj="sel_5" outlet="o"/>
+ <dest obj="outlet_5" inlet="outlet"/>
+ </net>
+ <net>
+ <source obj="sel_6" outlet="o"/>
+ <dest obj="outlet_6" inlet="outlet"/>
+ </net>
+ <net>
+ <source obj="sel_7" outlet="o"/>
+ <dest obj="outlet_7" inlet="outlet"/>
+ </net>
+ <net>
+ <source obj="sel_8" outlet="o"/>
+ <dest obj="outlet_8" inlet="outlet"/>
+ </net>
+ </nets>
+ <settings>
+ <subpatchmode>no</subpatchmode>
+ </settings>
+ <notes><![CDATA[]]></notes>
+ <windowPos>
+ <x>0</x>
+ <y>33</y>
+ <width>1280</width>
+ <height>767</height>
+ </windowPos>
+</patch-1.0> \ No newline at end of file
diff --git a/objects/read-interp-slow.axo b/objects/read-interp-slow.axo
new file mode 100644
index 0000000..2919a1f
--- /dev/null
+++ b/objects/read-interp-slow.axo
@@ -0,0 +1,76 @@
+<objdefs>
+ <obj.normal id="read interp slow" uuid="2c605953453ac59b4f0c9fb67024ec9e61ee3376" sha="4f975ff0db958aff6c52f01f837ad750a823625c">
+ <sDescription>delay read slow, linear interpolated</sDescription>
+ <author>Johannes Taelman</author>
+ <license>BSD</license>
+ <helpPatch>delay.axh</helpPatch>
+ <inlets>
+ <frac32buffer name="time" description="delay time (fraction of total delayline size)"/>
+ </inlets>
+ <outlets>
+ <frac32buffer name="out" description="wave"/>
+ </outlets>
+ <displays/>
+ <params>
+ <frac32.u.map name="time" noLabel="true"/>
+ </params>
+ <attribs>
+ <objref name="delayname"/>
+ </attribs>
+ <code.srate><![CDATA[
+ // delay
+ // saturate the delay sum to bit 27
+ // max is 0x07FFFFF
+
+//(ash (- (ash 1 23) 1) (* -1 (- 27 15)))
+ uint32_t tmp_d = __USAT(param_time + inlet_time,27);
+
+ // index for delayed input, strictly less than the write position in the delay line.
+ // What happens when writepos is 0? Is the delay line really a circular buffer?
+
+ /* LENGTHPOW =>
+ 256 (5.33ms) = 8
+ 512 (10.66ms) = 9
+ 1024 (21.33ms) = 10
+ 2048 (42.66ms) = 11
+ 4096 (85.33ms) = 12
+ 8192 (170ms) = 13
+ 16384 (341ms) = 14
+ 32768 (682ms) = 15
+(/ 32768.0 48000)
+48000 = 1000ms
+
+ ,*/
+ // Example: set LENGTHPOW to 12
+ // shift tmp_d right by (- 27 12) = 15
+ // This is supposed to give a number of samples in the past, before writepos
+ // As this runs in a loop over the input buffer we have BUFSIZE samples to process.
+ // Hence (- BUFSIZE + buffer_index -1) starts at -BUFSIZE and is the last sample at the end of the srate loop.
+ uint32_t tmp_di = attr_delayname.writepos - (tmp_d>>(27-attr_delayname.LENGTHPOW+1)) - BUFSIZE + buffer_index -1;
+
+ // get delayed value from delay line
+ int32_t tmp_a1 = attr_delayname.array[tmp_di&attr_delayname.LENGTHMASK]<<16;
+ // get next delayed value from delay line
+ int32_t tmp_a2 = attr_delayname.array[(tmp_di+1)&attr_delayname.LENGTHMASK]<<16;
+
+ // ? what does this value represent?
+ // shift tmp_d left by 18, then mask with max value.
+ uint32_t tmp_w1 = (tmp_d<<(attr_delayname.LENGTHPOW+3)) & 0x3FFFFFFF;
+
+ // ? opposite of w1
+ uint32_t tmp_w2 = (1<<30) - tmp_w1;
+
+ // is this what's happening?
+ // out = (tmp_a2 * tmp_w2) + (tmp_a1 * tmp_w1)
+
+ // multiply value with ...?
+ int32_t tmp_r = ___SMMUL(tmp_a1,tmp_w1);
+
+ // ?
+ // multiply the values from tmp_a2 and tmp_w2, then add the value of
+ // tmp_r to the most significant 32 bits of the product
+ tmp_r = ___SMMLA(tmp_a2,tmp_w2,tmp_r);
+ outlet_out= tmp_a1;//tmp_r;
+]]></code.srate>
+ </obj.normal>
+</objdefs>
diff --git a/objects/sel b 32 pulse.axo b/objects/sel b 32 pulse.axo
new file mode 100644
index 0000000..33f52f0
--- /dev/null
+++ b/objects/sel b 32 pulse.axo
@@ -0,0 +1,29 @@
+<objdefs>
+ <obj.normal id="sel b 32 pulse" uuid="8ad8a3dea3cedd0c5f731045ab90188e437c1260" sha="42339346cf951f33849d48f4292fa61903ccf4c8">
+ <sDescription>select one out of 32 booleans, chainable. Pulse output.</sDescription>
+ <author>Johannes Taelman</author>
+ <license>BSD</license>
+ <inlets>
+ <int32 name="in" description="in"/>
+ <bool32 name="def" description="default value"/>
+ </inlets>
+ <outlets>
+ <int32 name="chain" description="chain out (in-32)"/>
+ <bool32.pulse name="o" description="output"/>
+ </outlets>
+ <displays/>
+ <params>
+ <bin32 name="b32" noLabel="true"/>
+ </params>
+ <attribs/>
+ <code.declaration><![CDATA[int in_prev;
+]]></code.declaration>
+ <code.init><![CDATA[in_prev = 0;
+]]></code.init>
+ <code.krate><![CDATA[if ((inlet_in>=0)&&(inlet_in<32)) outlet_o=(in_prev!=inlet_in)&&(param_b32&(1<<inlet_in));
+else outlet_o = inlet_def;
+outlet_chain = inlet_in-32;
+in_prev = inlet_in;
+]]></code.krate>
+ </obj.normal>
+</objdefs>
diff --git a/objects/sqrt-distortion.axs b/objects/sqrt-distortion.axs
new file mode 100644
index 0000000..0853a04
--- /dev/null
+++ b/objects/sqrt-distortion.axs
@@ -0,0 +1,157 @@
+<patch-1.0 appVersion="1.0.11">
+ <obj type="delay/read interp" uuid="e3d8b8823ab551c588659520bf6cc25c630466c7" name="phase1" x="378" y="0">
+ <params>
+ <frac32.u.map name="time" onParent="true" value="11.5"/>
+ </params>
+ <attribs>
+ <objref attributeName="delayname" obj="write_1"/>
+ </attribs>
+ </obj>
+ <obj type="mix/mix 2 g" uuid="221f038da51943034a75e442c90624fcebfe6112" name="mix_2" x="532" y="28">
+ <params>
+ <frac32.u.map name="gain1" value="64.0"/>
+ <frac32.u.map name="gain2" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="math/inv" uuid="7f4c6cf4dcf79f9b0aa81c2eaf540405875714a3" name="inv_1" x="644" y="28">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/+" uuid="faedbea4612d9bd3644d6d3bf31946d848a70e19" name="+_1" x="714" y="28">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="filter/lp m" uuid="1aa1bc51da479ed92429af700591f9d7b9f45f22" name="lp_1" x="798" y="28">
+ <params>
+ <frac32.s.map name="pitch" value="27.0"/>
+ <frac32.u.map name="reso" value="29.5"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="delay/read interp" uuid="e3d8b8823ab551c588659520bf6cc25c630466c7" name="phase2" x="378" y="112">
+ <params>
+ <frac32.u.map name="time" onParent="true" value="29.5"/>
+ </params>
+ <attribs>
+ <objref attributeName="delayname" obj="write_1"/>
+ </attribs>
+ </obj>
+ <obj type="mix/mix 2 g" uuid="221f038da51943034a75e442c90624fcebfe6112" name="mix_1" x="924" y="140">
+ <params>
+ <frac32.u.map name="gain1" value="64.0"/>
+ <frac32.u.map name="gain2" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="filter/bp m" uuid="f26437572c3a1f6be883bb219c773a9906ff8296" name="bp_1" x="798" y="196">
+ <params>
+ <frac32.s.map name="pitch" value="32.0"/>
+ <frac32.u.map name="reso" value="47.5"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet a" uuid="abd8c5fd3b0524a6630f65cad6dc27f6c58e2a3e" name="audio out" x="1064" y="196">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="delay/write" uuid="bd73958e3830021807ee97a8cff4500a72a5710d" name="write_1" x="378" y="224">
+ <params/>
+ <attribs>
+ <combo attributeName="size" selection="512 (10.66ms)"/>
+ </attribs>
+ </obj>
+ <obj type="math/sqrt" uuid="1b69138b600d63436014c7927b9fc1d60a413331" name="sqrt_1" x="308" y="252">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet f" uuid="5c585d2dcd9c05631e345ac09626a22a639d7c13" name="filter" x="672" y="266">
+ <params/>
+ <attribs/>
+ </obj>
+ <comment type="patch/comment" x="182" y="280" text="cut off the low end"/>
+ <obj type="filter/hp" uuid="7829b56456e975f1d89bda2ad1c7ad678080a73b" name="hp_1" x="182" y="308">
+ <params>
+ <frac32.s.map name="pitch" value="-24.0"/>
+ <frac32.u.map name="reso" value="0.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet a" uuid="b577fe41e0a6bc7b5502ce33cb8a3129e2e28ee5" name="audio in" x="56" y="476">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/gain" uuid="62b1c1a6337c7c8f6aec96408a432477b113cfa0" name="input gain" x="154" y="476">
+ <params>
+ <frac32.u.map name="amp" onParent="true" value="4.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <nets>
+ <net>
+ <source obj="lp_1" outlet="out"/>
+ <dest obj="mix_1" inlet="in1"/>
+ </net>
+ <net>
+ <source obj="mix_2" outlet="out"/>
+ <dest obj="bp_1" inlet="in"/>
+ <dest obj="inv_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="phase1" outlet="out"/>
+ <dest obj="mix_2" inlet="in1"/>
+ </net>
+ <net>
+ <source obj="phase2" outlet="out"/>
+ <dest obj="mix_2" inlet="in2"/>
+ </net>
+ <net>
+ <source obj="bp_1" outlet="out"/>
+ <dest obj="mix_1" inlet="in2"/>
+ </net>
+ <net>
+ <source obj="input gain" outlet="out"/>
+ <dest obj="hp_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="inv_1" outlet="out"/>
+ <dest obj="+_1" inlet="in1"/>
+ </net>
+ <net>
+ <source obj="+_1" outlet="out"/>
+ <dest obj="lp_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="filter" outlet="inlet"/>
+ <dest obj="bp_1" inlet="pitch"/>
+ <dest obj="lp_1" inlet="pitch"/>
+ </net>
+ <net>
+ <source obj="hp_1" outlet="out"/>
+ <dest obj="sqrt_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="sqrt_1" outlet="out"/>
+ <dest obj="write_1" inlet="in"/>
+ <dest obj="+_1" inlet="in2"/>
+ </net>
+ <net>
+ <source obj="audio in" outlet="inlet"/>
+ <dest obj="input gain" inlet="in"/>
+ </net>
+ <net>
+ <source obj="mix_1" outlet="out"/>
+ <dest obj="audio out" inlet="outlet"/>
+ </net>
+ </nets>
+ <settings>
+ <subpatchmode>no</subpatchmode>
+ </settings>
+ <notes><![CDATA[]]></notes>
+ <windowPos>
+ <x>-5</x>
+ <y>33</y>
+ <width>1280</width>
+ <height>767</height>
+ </windowPos>
+</patch-1.0> \ No newline at end of file
diff --git a/objects/wip/pitch_detect_fft.axo b/objects/wip/pitch_detect_fft.axo
new file mode 100644
index 0000000..7692628
--- /dev/null
+++ b/objects/wip/pitch_detect_fft.axo
@@ -0,0 +1,179 @@
+<objdefs>
+ <obj.normal id="pitch detect 128" uuid="89eda14ecd003f22288812e9843218f2d020b7ad" sha="e1ec4fbea98f37a5be48b1f7d3522ed1f7fe3229">
+ <sDescription>spectral analyzer display using 128 input points fft</sDescription>
+ <author>Johannes Taelman, Ricardo Wurmus</author>
+ <license>BSD</license>
+ <inlets>
+ <frac32buffer name="in" description="input"/>
+ <bool32 name="hold" description="hold"/>
+ </inlets>
+ <outlets>
+ <int32 name="pitch" description="pitch"/>
+ </outlets>
+ <params/>
+ <attribs/>
+ <code.declaration><![CDATA[
+#define N 128
+int32_t inbuf[N];
+int32_t outbuf[N];
+// must be twice as wide because the result is
+// stored like {real[0], imag[0], real[1], imag[1]...}
+int32_t fftbuf[2*N];
+arm_rfft_instance_q31 rfft;
+arm_cfft_radix4_instance_q31 cfft;
+int32_t state;
+int32_t max_val = 0;
+uint32_t max_a = 0;
+
+/**
+ * @brief Maximum value of a Q31 vector.
+ * @param[in] *pSrc points to the input vector
+ * @param[in] blockSize length of the input vector
+ * @param[out] *pResult maximum value returned here
+ * @param[out] *pIndex index of maximum value returned here
+ * @return none.
+ */
+
+void arm_max_q31(
+ q31_t * pSrc,
+ uint32_t blockSize,
+ q31_t * pResult,
+ uint32_t * pIndex)
+{
+#ifndef ARM_MATH_CM0_FAMILY
+
+ /* Run the below code for Cortex-M4 and Cortex-M3 */
+ q31_t maxVal1, maxVal2, out; /* Temporary variables to store the output value. */
+ uint32_t blkCnt, outIndex, count; /* loop counter */
+
+ /* Initialise the count value. */
+ count = 0u;
+ /* Initialise the index value to zero. */
+ outIndex = 0u;
+ /* Load first input value that act as reference value for comparision */
+ out = *pSrc++;
+
+ /* Loop unrolling */
+ blkCnt = (blockSize - 1u) >> 2u;
+
+ /* Run the below code for Cortex-M4 and Cortex-M3 */
+ while(blkCnt > 0u)
+ {
+ /* Initialize maxVal to the next consecutive values one by one */
+ maxVal1 = *pSrc++;
+
+ maxVal2 = *pSrc++;
+
+ /* compare for the maximum value */
+ if(out < maxVal1)
+ {
+ /* Update the maximum value and its index */
+ out = maxVal1;
+ outIndex = count + 1u;
+ }
+
+ maxVal1 = *pSrc++;
+
+ /* compare for the maximum value */
+ if(out < maxVal2)
+ {
+ /* Update the maximum value and its index */
+ out = maxVal2;
+ outIndex = count + 2u;
+ }
+
+ maxVal2 = *pSrc++;
+
+ /* compare for the maximum value */
+ if(out < maxVal1)
+ {
+ /* Update the maximum value and its index */
+ out = maxVal1;
+ outIndex = count + 3u;
+ }
+
+ /* compare for the maximum value */
+ if(out < maxVal2)
+ {
+ /* Update the maximum value and its index */
+ out = maxVal2;
+ outIndex = count + 4u;
+ }
+
+ count += 4u;
+
+ /* Decrement the loop counter */
+ blkCnt--;
+ }
+
+ /* if (blockSize - 1u) is not multiple of 4 */
+ blkCnt = (blockSize - 1u) % 4u;
+
+#else
+
+ /* Run the below code for Cortex-M0 */
+ q31_t maxVal1, out; /* Temporary variables to store the output value. */
+ uint32_t blkCnt, outIndex; /* loop counter */
+
+ /* Initialise the index value to zero. */
+ outIndex = 0u;
+ /* Load first input value that act as reference value for comparision */
+ out = *pSrc++;
+
+ blkCnt = (blockSize - 1u);
+
+#endif /* #ifndef ARM_MATH_CM0_FAMILY */
+
+ while(blkCnt > 0u)
+ {
+ /* Initialize maxVal to the next consecutive values one by one */
+ maxVal1 = *pSrc++;
+
+ /* compare for the maximum value */
+ if(out < maxVal1)
+ {
+ /* Update the maximum value and it's index */
+ out = maxVal1;
+ outIndex = blockSize - blkCnt;
+ }
+
+ /* Decrement the loop counter */
+ blkCnt--;
+
+ }
+
+ /* Store the maximum value and its index into destination pointers */
+ *pResult = out;
+ *pIndex = outIndex;
+}
+
+]]></code.declaration>
+ <code.init><![CDATA[
+int i;
+for(i=0;i<N;i++) inbuf[i]=0;
+for(i=0;i<N;i++) outbuf[i]=0;
+state = 0;
+arm_rfft_init_q31(&rfft, &cfft, N,0,1);
+]]></code.init>
+ <code.krate><![CDATA[
+if (state<N){
+ // fill buffer
+ int i;
+ for(i=0;i<BUFSIZE;i++) {
+ inbuf[state++] = inlet_in[i];
+ }
+} else {
+ // compute FFT
+ arm_rfft_q31(&rfft, (q31_t *)inbuf, (q31_t *)fftbuf);
+ // compute magnitude
+ arm_cmplx_mag_q31(fftbuf, outbuf, N);
+
+ // second half is conjugates, so we only look at N/2
+ arm_max_q31(outbuf, N/2, &max_val, &max_a);
+
+ outlet_pitch = max_a;
+ state = 0;
+}
+]]></code.krate>
+ </obj.normal>
+</objdefs>
diff --git a/objects/xfade-env.axs b/objects/xfade-env.axs
new file mode 100644
index 0000000..faccc3b
--- /dev/null
+++ b/objects/xfade-env.axs
@@ -0,0 +1,167 @@
+<patch-1.0>
+ <obj type="math/inv" sha="527f9ea38e810968a5d209b2913f846bcc5cbfea" uuid="565521d3699b36d8095aa1c79b9ad0046fb133ce" name="inv_2" x="462" y="182">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/+c" sha="d0aea6063c88e27c97acf08b33a056fec3e150f1" uuid="13eec32bd8ad57dd0bb18a02566cc0a117d320e3" name="+c_4" x="518" y="182">
+ <params>
+ <frac32.u.map name="c" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet f" sha="c0c4ce40c7dec73dfbb009fd86c9b89c068b137a" uuid="d18a9a550bcaaebac94e25983bd0e27dbfd7233c" name="env_" x="854" y="182">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="patch/outlet f" sha="c0c4ce40c7dec73dfbb009fd86c9b89c068b137a" uuid="d18a9a550bcaaebac94e25983bd0e27dbfd7233c" name="env" x="854" y="238">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/inv" sha="527f9ea38e810968a5d209b2913f846bcc5cbfea" uuid="565521d3699b36d8095aa1c79b9ad0046fb133ce" name="abs_1" x="392" y="294">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/+c" sha="d0aea6063c88e27c97acf08b33a056fec3e150f1" uuid="13eec32bd8ad57dd0bb18a02566cc0a117d320e3" name="+c_2" x="448" y="294">
+ <params>
+ <frac32.u.map name="c" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="math/exp" sha="2ac6f1fe7b85cbd855f836a65df6a49bcd2c0f62" uuid="3f0e6db61bc98c04b42a940e7a93abbf8a178317" name="exp_2" x="504" y="294">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/inv" sha="527f9ea38e810968a5d209b2913f846bcc5cbfea" uuid="565521d3699b36d8095aa1c79b9ad0046fb133ce" name="inv_1" x="574" y="294">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/+c" sha="d0aea6063c88e27c97acf08b33a056fec3e150f1" uuid="13eec32bd8ad57dd0bb18a02566cc0a117d320e3" name="+c_3" x="630" y="294">
+ <params>
+ <frac32.u.map name="c" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="patch/inlet b" sha="17c8e188371661163bfa55cea9974eecb785fb06" uuid="3b0d3eacb5bb978cb05d1372aa2714d5a4790844" name="trigger" x="126" y="322">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="mux/mux 2" sha="73ba55fbf61b80b78dd5cb4f0c4bd5cbbdd54ea0" uuid="3bcb8a666381ed18b8962eda50b1aa679136f618" name="mux_1" x="700" y="392">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/-c" sha="13ae165692448bd5e8159b2e283e45005ef14cdf" uuid="bc70bed87e5405985ade03f4806b9450609a9093" name="shift zero" x="168" y="406">
+ <params>
+ <frac32.u.map name="c" value="32.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="math/&gt;&gt;" sha="79ac9605aac7bf23c0eba17a4a6d8b179ea37f34" uuid="d883beaf50b7aae4803ed9941e8f123e87e1e3aa" name="slope" x="238" y="406">
+ <params/>
+ <attribs>
+ <spinner attributeName="shift" value="2"/>
+ </attribs>
+ </obj>
+ <obj type="filter/integrator" sha="6535fb81a607b8ddac63cb09ba808e9afa93e070" uuid="e4d9391b099e543aa867bc3ec9565dd4d6f7df60" name="smoothen" x="336" y="406">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/half" sha="b3b4af52a3096adbd7fa08352261fbe186ec45e7" uuid="d3aa9c64dbf1ec7871bbc3e2d8905f8e443c9823" name="half_1" x="448" y="406">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/+c" sha="d0aea6063c88e27c97acf08b33a056fec3e150f1" uuid="13eec32bd8ad57dd0bb18a02566cc0a117d320e3" name="+c_1" x="532" y="406">
+ <params>
+ <frac32.u.map name="c" value="32.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="math/exp" sha="2ac6f1fe7b85cbd855f836a65df6a49bcd2c0f62" uuid="3f0e6db61bc98c04b42a940e7a93abbf8a178317" name="exp_1" x="602" y="406">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/*c" sha="60143a29e35f452025e9edaa2dec6e660ecb9c6e" uuid="7d5ef61c3bcd571ee6bbd8437ef3612125dfb225" name="*c_1" x="266" y="504">
+ <params>
+ <frac32.u.map name="amp" onParent="true" value="0.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <nets>
+ <net>
+ <source obj="+c_1" outlet="out"/>
+ <dest obj="abs_1" inlet="in"/>
+ <dest obj="exp_1" inlet="a"/>
+ </net>
+ <net>
+ <source obj="exp_1" outlet="result"/>
+ <dest obj="mux_1" inlet="i2"/>
+ </net>
+ <net>
+ <source obj="exp_2" outlet="result"/>
+ <dest obj="inv_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="+c_2" outlet="out"/>
+ <dest obj="exp_2" inlet="a"/>
+ </net>
+ <net>
+ <source obj="abs_1" outlet="out"/>
+ <dest obj="+c_2" inlet="in"/>
+ </net>
+ <net>
+ <source obj="inv_1" outlet="out"/>
+ <dest obj="+c_3" inlet="in"/>
+ </net>
+ <net>
+ <source obj="+c_3" outlet="out"/>
+ <dest obj="mux_1" inlet="i1"/>
+ </net>
+ <net>
+ <source obj="smoothen" outlet="out"/>
+ <dest obj="half_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="shift zero" outlet="out"/>
+ <dest obj="slope" inlet="a"/>
+ </net>
+ <net>
+ <source obj="half_1" outlet="out"/>
+ <dest obj="+c_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="trigger" outlet="inlet"/>
+ <dest obj="shift zero" inlet="in"/>
+ <dest obj="mux_1" inlet="s"/>
+ </net>
+ <net>
+ <source obj="mux_1" outlet="o"/>
+ <dest obj="env" inlet="outlet"/>
+ <dest obj="inv_2" inlet="in"/>
+ </net>
+ <net>
+ <source obj="inv_2" outlet="out"/>
+ <dest obj="+c_4" inlet="in"/>
+ </net>
+ <net>
+ <source obj="+c_4" outlet="out"/>
+ <dest obj="env_" inlet="outlet"/>
+ </net>
+ <net>
+ <source obj="*c_1" outlet="out"/>
+ <dest obj="smoothen" inlet="in"/>
+ </net>
+ <net>
+ <source obj="slope" outlet="result"/>
+ <dest obj="*c_1" inlet="in"/>
+ </net>
+ </nets>
+ <settings>
+ <subpatchmode>no</subpatchmode>
+ </settings>
+ <notes><![CDATA[]]></notes>
+ <windowPos>
+ <x>0</x>
+ <y>31</y>
+ <width>1274</width>
+ <height>766</height>
+ </windowPos>
+</patch-1.0> \ No newline at end of file
diff --git a/patches/.gitkeep b/patches/.gitkeep
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/patches/.gitkeep
diff --git a/patches/demo-xfade.axp b/patches/demo-xfade.axp
new file mode 100644
index 0000000..cc3d535
--- /dev/null
+++ b/patches/demo-xfade.axp
@@ -0,0 +1,313 @@
+<patch-1.0>
+ <obj type="mix/xfade" sha="46677d62cd61f18b6996ffad67cd94b74cd98f2d" uuid="375dc91d218e96cdc9cbc7e92adb48f705ef701a" name="xfade_2" x="770" y="0">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="rekado/write" sha="e127c6f8114715d89b3516a6701b262f7e8f5420" uuid="bd73958e3830021807ee97a8cff4500a72a5710d" name="write_1" x="462" y="14">
+ <params/>
+ <attribs>
+ <combo attributeName="size" selection="8192 (170ms)"/>
+ </attribs>
+ </obj>
+ <obj type="disp/kscope 128 p" sha="c520d81a6e651e80c661abb57c5ee88a357b5727" uuid="664f9317a38a6910ae9bc020e00ca2dd2ee692fa" name="kscope_4" x="1064" y="28">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="disp/kscope 128 p" sha="c520d81a6e651e80c661abb57c5ee88a357b5727" uuid="664f9317a38a6910ae9bc020e00ca2dd2ee692fa" name="kscope_2" x="1204" y="28">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="rekado/write" sha="e127c6f8114715d89b3516a6701b262f7e8f5420" uuid="bd73958e3830021807ee97a8cff4500a72a5710d" name="write_2" x="462" y="70">
+ <params/>
+ <attribs>
+ <combo attributeName="size" selection="8192 (170ms)"/>
+ </attribs>
+ </obj>
+ <obj type="delay/read interp" sha="6fda3a4b04cc8fc49e63240c2fff115695ec7a7" uuid="e3d8b8823ab551c588659520bf6cc25c630466c7" name="read_1" x="616" y="70">
+ <params>
+ <frac32.u.map name="time" value="0.0"/>
+ </params>
+ <attribs>
+ <objref attributeName="delayname" obj="write_1"/>
+ </attribs>
+ </obj>
+ <obj type="./exp-xfade" uuid="a820c1629d2f2a44abda1770f95387742ce8a7cd" name="exp-xfade_1" x="784" y="70">
+ <params>
+ <frac32.u.map name="*c_1" value="8.5"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="mix/xfade" sha="46677d62cd61f18b6996ffad67cd94b74cd98f2d" uuid="375dc91d218e96cdc9cbc7e92adb48f705ef701a" name="xfade_1" x="980" y="84">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="audio/in stereo" sha="1acaaf87659f6c9d0833a6def4dbd5d0c3edca4d" uuid="99848ad6d90a8e615e83b2e619cfc806f28e7281" name="in_1" x="224" y="98">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/*c" sha="a73a2cafcf92eb4b6524655dcee98a569d5ddc28" uuid="7a66f52a9594e7e9eb31328ea725cb3641a80b55" name="*c1" x="350" y="98">
+ <params>
+ <frac32.u.map name="amp" value="63.5"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="delay/echo" sha="4113836be966bc4768d1fd2d80b50e4ebd192266" uuid="b7e4de60a644f6b30fdee9648ea62f446ecce38d" name="echo_1" x="476" y="154">
+ <params/>
+ <attribs>
+ <spinner attributeName="delaylength" value="2048"/>
+ </attribs>
+ </obj>
+ <obj type="delay/read interp" sha="6fda3a4b04cc8fc49e63240c2fff115695ec7a7" uuid="e3d8b8823ab551c588659520bf6cc25c630466c7" name="read_2" x="616" y="168">
+ <params>
+ <frac32.u.map name="time" value="0.0"/>
+ </params>
+ <attribs>
+ <objref attributeName="delayname" obj="write_2"/>
+ </attribs>
+ </obj>
+ <obj type="osc/phasor" sha="343e0dfbaa48c69032d959ee1e7398e45000e0bf" uuid="e5553f226015bf75f4fdc3faa39be1bee4f84044" name="phasor_1" x="98" y="224">
+ <params>
+ <frac32.s.map name="pitch" value="-17.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="conv/interp" sha="4b93f3e0f08b85924e07feabcdfe53fc11aa6a48" uuid="d68c1a8709d8b55e3de8715d727ec0a2d8569d9a" name="interp_1" x="504" y="224">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/dial p" sha="501c30e07dedf3d701e8d0b33c3c234908c3388e" uuid="cc5d2846c3d50e425f450c4b9851371b54f4d674" name="dry" x="840" y="224">
+ <params>
+ <frac32.u.map name="value" value="28.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="disp/kscope 128 p" sha="c520d81a6e651e80c661abb57c5ee88a357b5727" uuid="664f9317a38a6910ae9bc020e00ca2dd2ee692fa" name="kscope_3" x="1064" y="224">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="disp/kscope 128 p" sha="c520d81a6e651e80c661abb57c5ee88a357b5727" uuid="664f9317a38a6910ae9bc020e00ca2dd2ee692fa" name="kscope_1" x="1204" y="224">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="lfo/saw down" sha="2a84a3f10fa95e49f9b9cff209cbe7f6b5e1f9ea" uuid="d831d6b82b3d559c3ba7b1b487fb292d7998fd08" name="saw_2" x="364" y="238">
+ <params>
+ <frac32.s.map name="pitch" value="2.299999713897705">
+ <presets>
+ <preset index="1">
+ <f v="14.199999809265137"/>
+ </preset>
+ </presets>
+ </frac32.s.map>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="math/-c" sha="13ae165692448bd5e8159b2e283e45005ef14cdf" uuid="bc70bed87e5405985ade03f4806b9450609a9093" name="unipolar2bipolar_1" x="700" y="280">
+ <params>
+ <frac32.u.map name="c" value="32.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="math/&lt;c" sha="cfbcbe9eb204d0e8edc9d135f13c6fa284ba378d" uuid="852c84e7bd967ee4a44cc553fcf6e3fc9d8b92c4" name="==_1" x="770" y="280">
+ <params>
+ <frac32.u.map name="c" value="0.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="conv/to f" sha="1ecea09351d0a8a9d0b72cdd3e089984d17af31" uuid="bdd08445689602ce174689ccb6be085f627d9892" name="nointerp_1" x="546" y="294">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="gpio/out/led1" sha="52567d6da1edf8d777dd9c850ab30dc561d7909d" uuid="c6679540460d64e2e71760e61cb82fac227e2764" name="led1_1" x="854" y="308">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="lfo/square" sha="b4420b58ca2ae5ece53d53540bc91bc9ed7a4b83" uuid="de6909eb64db13af5b43f979a4c130024b3a4793" name="square_1" x="112" y="336">
+ <params>
+ <frac32.s.map name="pitch" value="14.699999809265137"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="./xfade-env" uuid="d6691ab2bc0f506cdc501dbf01b09f72b01921d4" name="xfade-env_1" x="238" y="336">
+ <params>
+ <frac32.u.map name="*c_1" value="12.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="lfo/sine" sha="a2851b3d62ed0faceefc98038d9571422f0ce260" uuid="75f7330c26a13953215dccc3b7b9008545c9daa9" name="sine_1" x="406" y="350">
+ <params>
+ <frac32.s.map name="pitch" value="-49.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="math/div 128" sha="10837fc0484a3378a48f166255273629682c9d" uuid="7e534ce0f62b1fddbad78a797d8c10c8d1a0b812" name="div_1" x="504" y="350">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/*c" sha="60143a29e35f452025e9edaa2dec6e660ecb9c6e" uuid="7d5ef61c3bcd571ee6bbd8437ef3612125dfb225" name="*c_1" x="588" y="350">
+ <params>
+ <frac32.u.map name="amp" value="0.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="stomps/chorus1" uuid="308d235b433d167a0251a5a7ae02cb683bb5f1a1" name="obj_1" x="826" y="378">
+ <params>
+ <bool32.tgl name="on" value="0"/>
+ <frac32.u.map name="depth" value="2.5"/>
+ <frac32.s.map name="speed" value="-26.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="audio/out stereo" sha="b933bb91801a126126313c11f773158b5ca2face" name="dac_1" x="966" y="378">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="disp/kscope 128 b" sha="8d4224a2649d7e1034724772735c137003a43ad7" uuid="e71f3dd9bc5b799ad703079e63fb929dd75def0" name="kscope_5" x="322" y="448">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="disp/scope 128 b" sha="a7ce66703f067983726298da17fabab409dca3dc" uuid="2b69f51a714fc276503ef10c349d6d253d1ae5e2" name="scope_3" x="476" y="448">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="disp/scope 128 b" sha="a7ce66703f067983726298da17fabab409dca3dc" uuid="2b69f51a714fc276503ef10c349d6d253d1ae5e2" name="scope_1" x="616" y="448">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="disp/scope 128 b" sha="a7ce66703f067983726298da17fabab409dca3dc" uuid="2b69f51a714fc276503ef10c349d6d253d1ae5e2" name="scope_2" x="1092" y="448">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/button" sha="3a0057991a9376823a6a654a8cf7201abdc31135" uuid="ef3d13774349df85aa9bfecf30dbc91ab8488b3f" name="button_1" x="966" y="546">
+ <params>
+ <bool32.mom name="b" value="0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <nets>
+ <net>
+ <source obj="dry" outlet="out"/>
+ <dest obj="xfade_1" inlet="c"/>
+ </net>
+ <net>
+ <source obj="interp_1" outlet="o"/>
+ <dest obj="echo_1" inlet="in"/>
+ <dest obj="read_1" inlet="time"/>
+ </net>
+ <net>
+ <source obj="echo_1" outlet="out"/>
+ <dest obj="read_2" inlet="time"/>
+ <dest obj="nointerp_1" inlet="i"/>
+ </net>
+ <net>
+ <source obj="*c1" outlet="out"/>
+ <dest obj="write_1" inlet="in"/>
+ <dest obj="xfade_1" inlet="i2"/>
+ <dest obj="write_2" inlet="in"/>
+ </net>
+ <net>
+ <source obj="xfade_1" outlet="o"/>
+ <dest obj="obj_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="sine_1" outlet="wave"/>
+ <dest obj="div_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="div_1" outlet="out"/>
+ <dest obj="*c_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="*c_1" outlet="out"/>
+ <dest obj="saw_2" inlet="pitch"/>
+ </net>
+ <net>
+ <source obj="obj_1" outlet="L"/>
+ <dest obj="dac_1" inlet="left"/>
+ </net>
+ <net>
+ <source obj="obj_1" outlet="R"/>
+ <dest obj="dac_1" inlet="right"/>
+ </net>
+ <net>
+ <source obj="exp-xfade_1" outlet="outlet_1"/>
+ <dest obj="scope_2" inlet="in"/>
+ <dest obj="xfade_1" inlet="i1"/>
+ </net>
+ <net>
+ <source obj="read_1" outlet="out"/>
+ <dest obj="exp-xfade_1" inlet="i1"/>
+ <dest obj="xfade_2" inlet="i1"/>
+ </net>
+ <net>
+ <source obj="read_2" outlet="out"/>
+ <dest obj="exp-xfade_1" inlet="i2"/>
+ <dest obj="xfade_2" inlet="i2"/>
+ </net>
+ <net>
+ <source obj="saw_2" outlet="wave"/>
+ <dest obj="interp_1" inlet="i"/>
+ <dest obj="kscope_4" inlet="in"/>
+ <dest obj="unipolar2bipolar_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="exp-xfade_1" outlet="env"/>
+ <dest obj="kscope_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="exp-xfade_1" outlet="env_"/>
+ <dest obj="kscope_2" inlet="in"/>
+ </net>
+ <net>
+ <source obj="exp-xfade_1" outlet="outlet_3"/>
+ <dest obj="scope_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="exp-xfade_1" outlet="outlet_2"/>
+ <dest obj="scope_3" inlet="in"/>
+ </net>
+ <net>
+ <source obj="button_1" outlet="o"/>
+ <dest obj="scope_2" inlet="hold"/>
+ <dest obj="scope_1" inlet="hold"/>
+ <dest obj="scope_3" inlet="hold"/>
+ <dest obj="kscope_4" inlet="hold"/>
+ <dest obj="kscope_3" inlet="hold"/>
+ <dest obj="kscope_1" inlet="hold"/>
+ <dest obj="kscope_2" inlet="hold"/>
+ <dest obj="kscope_5" inlet="hold"/>
+ </net>
+ <net>
+ <source obj="nointerp_1" outlet="o"/>
+ <dest obj="kscope_3" inlet="in"/>
+ </net>
+ <net>
+ <source obj="unipolar2bipolar_1" outlet="out"/>
+ <dest obj="==_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="==_1" outlet="out"/>
+ <dest obj="exp-xfade_1" inlet="trigger"/>
+ <dest obj="kscope_5" inlet="in"/>
+ <dest obj="led1_1" inlet="in"/>
+ <dest obj="xfade-env_1" inlet="trigger"/>
+ </net>
+ <net>
+ <source obj="in_1" outlet="left"/>
+ <dest obj="*c1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="xfade-env_1" outlet="env"/>
+ <dest obj="xfade_2" inlet="c"/>
+ </net>
+ </nets>
+ <settings>
+ <subpatchmode>no</subpatchmode>
+ </settings>
+ <notes><![CDATA[]]></notes>
+ <windowPos>
+ <x>0</x>
+ <y>31</y>
+ <width>1280</width>
+ <height>769</height>
+ </windowPos>
+</patch-1.0> \ No newline at end of file
diff --git a/patches/demo.axp b/patches/demo.axp
new file mode 100644
index 0000000..f72bc83
--- /dev/null
+++ b/patches/demo.axp
@@ -0,0 +1,179 @@
+<patch-1.0>
+ <obj type="audio/in stereo" sha="1acaaf87659f6c9d0833a6def4dbd5d0c3edca4d" uuid="99848ad6d90a8e615e83b2e619cfc806f28e7281" name="in_1" x="42" y="42">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="mix/mix 2 g" sha="921aefdda41b92a27cc93c53b5154554d0ce6d3b" uuid="221f038da51943034a75e442c90624fcebfe6112" name="mix_1" x="168" y="42">
+ <params>
+ <frac32.u.map name="gain1" value="64.0"/>
+ <frac32.u.map name="gain2" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="rekado/phaser_mono_float" sha="9b6473602cbbc82f9d985272762874064d7c13f1" uuid="d2dad834546ee8864e74efad2a1e9b1d7e26ace8" name="phaser_mono_float_1" x="280" y="42">
+ <params>
+ <frac32.u.map name="speed" value="13.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="mix/xfade" sha="46677d62cd61f18b6996ffad67cd94b74cd98f2d" uuid="375dc91d218e96cdc9cbc7e92adb48f705ef701a" name="xfade_1" x="434" y="42">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="filter/lp1" sha="290a234e2f83eb072198d0158bcd5da02a3606c3" uuid="1b1fd7085e44d2b7b80b59b8d68796b909c1b2cc" name="lp1_1" x="560" y="42">
+ <params>
+ <frac32.s.map name="freq" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="audio/out stereo" sha="b933bb91801a126126313c11f773158b5ca2face" name="dac_1" x="966" y="42">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="./octaver" uuid="76dff0f3b32b5acabb23e0c5fb43c64b458107be" name="octaver_1" x="672" y="56">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="mix/xfade" sha="46677d62cd61f18b6996ffad67cd94b74cd98f2d" uuid="375dc91d218e96cdc9cbc7e92adb48f705ef701a" name="xfade_3" x="784" y="56">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/dial p" sha="501c30e07dedf3d701e8d0b33c3c234908c3388e" uuid="cc5d2846c3d50e425f450c4b9851371b54f4d674" name="dry amount" x="434" y="126">
+ <params>
+ <frac32.u.map name="value" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/dial p" sha="501c30e07dedf3d701e8d0b33c3c234908c3388e" uuid="cc5d2846c3d50e425f450c4b9851371b54f4d674" name="dial_2" x="784" y="140">
+ <params>
+ <frac32.u.map name="value" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="audio/inconfig" sha="7eb314b69477fa9eb4ff1f78cc33085b109e9400" uuid="6f2f725102e40ae42955f5615c27eb211298a1d" name="inconfig_1" x="42" y="154">
+ <params/>
+ <attribs>
+ <combo attributeName="gain" selection="0dB"/>
+ <combo attributeName="boost" selection="0dB"/>
+ </attribs>
+ </obj>
+ <obj type="ctrl/toggle" sha="f5742cc9eee76fae90a4e570c34596dd327b6c28" uuid="42b8134fa729d54bfc8d62d6ef3fa99498c1de99" name="toggle_1" x="588" y="154">
+ <params>
+ <bool32.tgl name="b" value="1"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/i radio 4 v" sha="37aa6f17297981ccdf9a037eecf728e7c0ff0ae4" uuid="b610704137c90b0e43464440b84bfb4fb7d2bb30" name="i_1" x="574" y="224">
+ <params>
+ <int32.vradio name="value" value="3"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="filter/lp m" sha="c2224dc682842eae1af4496f3f94a6afc1525ee4" uuid="1aa1bc51da479ed92429af700591f9d7b9f45f22" name="lp_1" x="770" y="266">
+ <params>
+ <frac32.s.map name="pitch" value="30.0"/>
+ <frac32.u.map name="reso" value="0.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="stomps/delay" uuid="1cb9ef688a1fc2dca9d8c57c70ad14c60b4a8630" name="obj_1" x="882" y="266">
+ <params>
+ <bool32.tgl name="on" value="1"/>
+ <frac32.u.map name="fdbk" value="16.0"/>
+ <frac32.u.map name="time" value="10.5"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="mix/xfade" sha="46677d62cd61f18b6996ffad67cd94b74cd98f2d" uuid="375dc91d218e96cdc9cbc7e92adb48f705ef701a" name="xfade_2" x="980" y="266">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="audio/outconfig" sha="b005d810ffcd8fd1b07342bb194377d6d94e64e2" uuid="f4fa7e864a5446fc3e4527e5ef6732f283a9d43c" name="outconfig_1" x="56" y="336">
+ <params/>
+ <attribs>
+ <combo attributeName="headphones" selection="0dB"/>
+ </attribs>
+ </obj>
+ <obj type="ctrl/dial p" sha="501c30e07dedf3d701e8d0b33c3c234908c3388e" uuid="cc5d2846c3d50e425f450c4b9851371b54f4d674" name="dial_1" x="980" y="350">
+ <params>
+ <frac32.u.map name="value" value="22.5"/>
+ </params>
+ <attribs/>
+ </obj>
+ <nets>
+ <net>
+ <source obj="dry amount" outlet="out"/>
+ <dest obj="xfade_1" inlet="c"/>
+ </net>
+ <net>
+ <source obj="phaser_mono_float_1" outlet="out"/>
+ <dest obj="xfade_1" inlet="i1"/>
+ </net>
+ <net>
+ <source obj="mix_1" outlet="out"/>
+ <dest obj="phaser_mono_float_1" inlet="in"/>
+ <dest obj="xfade_1" inlet="i2"/>
+ </net>
+ <net>
+ <source obj="xfade_1" outlet="o"/>
+ <dest obj="lp1_1" inlet="in"/>
+ <dest obj="xfade_3" inlet="i2"/>
+ <dest obj="xfade_2" inlet="i2"/>
+ </net>
+ <net>
+ <source obj="obj_1" outlet="out"/>
+ <dest obj="xfade_2" inlet="i1"/>
+ </net>
+ <net>
+ <source obj="dial_1" outlet="out"/>
+ <dest obj="xfade_2" inlet="c"/>
+ </net>
+ <net>
+ <source obj="in_1" outlet="left"/>
+ <dest obj="mix_1" inlet="in1"/>
+ </net>
+ <net>
+ <source obj="in_1" outlet="right"/>
+ <dest obj="mix_1" inlet="in2"/>
+ </net>
+ <net>
+ <source obj="xfade_2" outlet="o"/>
+ <dest obj="dac_1" inlet="left"/>
+ <dest obj="dac_1" inlet="right"/>
+ </net>
+ <net>
+ <source obj="dial_2" outlet="out"/>
+ <dest obj="xfade_3" inlet="c"/>
+ </net>
+ <net>
+ <source obj="toggle_1" outlet="o"/>
+ <dest obj="octaver_1" inlet="up/down"/>
+ </net>
+ <net>
+ <source obj="i_1" outlet="out"/>
+ <dest obj="octaver_1" inlet="interval"/>
+ </net>
+ <net>
+ <source obj="octaver_1" outlet="audio out"/>
+ <dest obj="xfade_3" inlet="i1"/>
+ </net>
+ <net>
+ <source obj="lp_1" outlet="out"/>
+ <dest obj="obj_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="lp1_1" outlet="out"/>
+ <dest obj="octaver_1" inlet="audio in"/>
+ </net>
+ </nets>
+ <settings>
+ <subpatchmode>no</subpatchmode>
+ </settings>
+ <notes><![CDATA[]]></notes>
+ <windowPos>
+ <x>-6</x>
+ <y>31</y>
+ <width>1250</width>
+ <height>769</height>
+ </windowPos>
+</patch-1.0> \ No newline at end of file
diff --git a/patches/distortion-demo.axp b/patches/distortion-demo.axp
new file mode 100644
index 0000000..7237c7b
--- /dev/null
+++ b/patches/distortion-demo.axp
@@ -0,0 +1,36 @@
+<patch-1.0>
+ <obj type="audio/inconfig" sha="7eb314b69477fa9eb4ff1f78cc33085b109e9400" uuid="6f2f725102e40ae42955f5615c27eb211298a1d" name="inconfig_1" x="84" y="98">
+ <params/>
+ <attribs>
+ <combo attributeName="gain" selection="0dB"/>
+ <combo attributeName="boost" selection="20dB"/>
+ </attribs>
+ </obj>
+ <obj type="audio/in stereo" sha="1acaaf87659f6c9d0833a6def4dbd5d0c3edca4d" uuid="99848ad6d90a8e615e83b2e619cfc806f28e7281" name="in_1" x="70" y="168">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="stomps/delay" uuid="1cb9ef688a1fc2dca9d8c57c70ad14c60b4a8630" name="obj_1" x="252" y="182">
+ <params>
+ <bool32.tgl name="on" value="0"/>
+ <frac32.u.map name="fdbk" value="16.5"/>
+ <frac32.u.map name="time" value="13.5"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="audio/out stereo" sha="c27566f972d15f25252f61b5cff014a3edce9706" uuid="a1ca7a567f535acc21055669829101d3ee7f0189" name="out_1" x="420" y="182">
+ <params/>
+ <attribs/>
+ </obj>
+ <nets/>
+ <settings>
+ <subpatchmode>no</subpatchmode>
+ </settings>
+ <notes><![CDATA[]]></notes>
+ <windowPos>
+ <x>344</x>
+ <y>125</y>
+ <width>600</width>
+ <height>599</height>
+ </windowPos>
+</patch-1.0> \ No newline at end of file
diff --git a/patches/faust-phaser-demo.axp b/patches/faust-phaser-demo.axp
new file mode 100644
index 0000000..fa2a245
--- /dev/null
+++ b/patches/faust-phaser-demo.axp
@@ -0,0 +1,246 @@
+<patch-1.0>
+ <obj type="disp/scope 128 b trig" sha="1d8e04cf76c1be799824f4065917f788e705b029" uuid="11747dcd1dc9afe4919f537c861fb18b80b4e4e" name="scope_1" x="1050" y="0">
+ <params/>
+ <attribs/>
+ </obj>
+ <comment type="patch/comment" x="14" y="14" text="different primitive periodic wave oscillators"/>
+ <comment type="patch/comment" x="252" y="14" text="you can use the piano keyboard to play (windows menu-&gt;piano)"/>
+ <obj type="midi/in/keyb" sha="b8deb97637e54be31fcb62e849e4fa406e72256e" name="keyb1" x="14" y="56">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="osc/sine" sha="edec4a9d5f533ea748cd564ce8c69673dd78742f" name="osc_1" x="182" y="56">
+ <params>
+ <frac32.s.map name="pitch" value="-17.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <comment type="patch/comment" x="294" y="56" text="sine wave"/>
+ <obj type="audio/in stereo" sha="1acaaf87659f6c9d0833a6def4dbd5d0c3edca4d" uuid="99848ad6d90a8e615e83b2e619cfc806f28e7281" name="in_1" x="434" y="70">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="mix/mix 2 g" sha="921aefdda41b92a27cc93c53b5154554d0ce6d3b" uuid="221f038da51943034a75e442c90624fcebfe6112" name="mix_1" x="560" y="70">
+ <params>
+ <frac32.u.map name="gain1" value="64.0"/>
+ <frac32.u.map name="gain2" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="rekado/phaser_mono_float" sha="9b6473602cbbc82f9d985272762874064d7c13f1" uuid="d2dad834546ee8864e74efad2a1e9b1d7e26ace8" name="phaser_mono_float_1" x="700" y="70">
+ <params>
+ <frac32.u.map name="speed" value="8.5"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="osc/saw" sha="fe2c3c02396657dfbc225c73f9340ad0c4c3eea6" name="saw_1" x="182" y="182">
+ <params>
+ <frac32.s.map name="pitch" value="-18.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <comment type="patch/comment" x="294" y="182" text="sawtooth wave"/>
+ <obj type="audio/inconfig" sha="7eb314b69477fa9eb4ff1f78cc33085b109e9400" uuid="6f2f725102e40ae42955f5615c27eb211298a1d" name="inconfig_1" x="714" y="182">
+ <params/>
+ <attribs>
+ <combo attributeName="gain" selection="0dB"/>
+ <combo attributeName="boost" selection="20dB"/>
+ </attribs>
+ </obj>
+ <comment type="patch/comment" x="476" y="224" text="select the waveform here:"/>
+ <obj type="disp/scope 128 b trig" sha="91c015bbaaedb3ccbea0d5e0f78dbee6588e0a39" name="scope_128s1" x="1050" y="238">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/i radio 8 v" sha="a2ed8a60e7db97fda888b7f7c66aa23711070918" uuid="577436e6982cb8ac1f816144195641eeb6846f79" name="i_1" x="476" y="252">
+ <params>
+ <int32.vradio name="value" value="1"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="./murf" uuid="7b7972039a3a2e17d875e58e8a8678bf24aad50d" name="murf_1" x="686" y="252">
+ <params>
+ <frac32.u.map name="attack" value="42.5"/>
+ <frac32.u.map name="decay" value="0.0"/>
+ <frac32.u.map name="reso" value="16.0"/>
+ <frac32.u.map name="depth" value="0.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="filter/lp1" sha="290a234e2f83eb072198d0158bcd5da02a3606c3" uuid="1b1fd7085e44d2b7b80b59b8d68796b909c1b2cc" name="lp1_1" x="798" y="252">
+ <params>
+ <frac32.s.map name="freq" value="33.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="stomps/delay" uuid="1cb9ef688a1fc2dca9d8c57c70ad14c60b4a8630" name="obj_1" x="910" y="252">
+ <params>
+ <bool32.tgl name="on" value="1"/>
+ <frac32.u.map name="fdbk" value="16.5"/>
+ <frac32.u.map name="time" value="13.5"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="osc/tri" sha="e7066d3dcd0e52be1613be8b5ccc96acee0ed064" uuid="b7510b296fd8f1dad5e317c620b496e1a99c08d6" name="tri_1" x="182" y="280">
+ <params>
+ <frac32.s.map name="pitch" value="-20.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <comment type="patch/comment" x="294" y="280" text="triangle wave"/>
+ <comment type="patch/comment" x="560" y="294" text="0: sine"/>
+ <comment type="patch/comment" x="560" y="308" text="1:saw"/>
+ <comment type="patch/comment" x="560" y="322" text="2: triangle"/>
+ <comment type="patch/comment" x="560" y="336" text="3: square"/>
+ <comment type="patch/comment" x="560" y="350" text="4: assymetrical square"/>
+ <obj type="osc/square" sha="7cccf8a95bf312ecc084f11f532cf5fda00b8c58" name="square_1" x="182" y="378">
+ <params>
+ <frac32.s.map name="pitch" value="-9.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <comment type="patch/comment" x="294" y="378" text="square wave"/>
+ <obj type="mix/xfade" sha="46677d62cd61f18b6996ffad67cd94b74cd98f2d" uuid="375dc91d218e96cdc9cbc7e92adb48f705ef701a" name="xfade_1" x="784" y="448">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="mix/mix 2 g" sha="921aefdda41b92a27cc93c53b5154554d0ce6d3b" uuid="221f038da51943034a75e442c90624fcebfe6112" name="mix_2" x="952" y="448">
+ <params>
+ <frac32.u.map name="gain1" value="45.0"/>
+ <frac32.u.map name="gain2" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <comment type="patch/comment" x="56" y="462" text="duty/cycle"/>
+ <obj type="math/*c" sha="a73a2cafcf92eb4b6524655dcee98a569d5ddc28" uuid="7a66f52a9594e7e9eb31328ea725cb3641a80b55" name="*c1" x="644" y="462">
+ <params>
+ <frac32.u.map name="amp" value="35.5"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="audio/out stereo" sha="b933bb91801a126126313c11f773158b5ca2face" name="dac_1" x="1092" y="462">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/dial p" sha="1f21216639bb798a4ea7902940999a5bcfd0de90" name="c1" x="56" y="476">
+ <params>
+ <frac32.u.map name="value" value="20.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="osc/pwm" sha="d157b5424d365fe9d0dbb9b8c6cffd0e9a528afe" name="pwm_1" x="182" y="476">
+ <params>
+ <frac32.s.map name="pitch" value="0.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <comment type="patch/comment" x="294" y="476" text="assymetrical square wave"/>
+ <obj type="mux/mux 5" sha="d98b62571685c915a5cbd8ee2565e8e4593c09b7" uuid="3e76a5bfd7e6acc8ccb7f01014d3efe9f18e78d6" name="inmux41" x="490" y="476">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/dial p" sha="501c30e07dedf3d701e8d0b33c3c234908c3388e" uuid="cc5d2846c3d50e425f450c4b9851371b54f4d674" name="dial_1" x="826" y="546">
+ <params>
+ <frac32.u.map name="value" value="40.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/toggle" sha="a104f377191a424d537741cdfd7d5348bc16590c" name="cb11" x="574" y="588">
+ <params>
+ <bool32.tgl name="b" value="0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <nets>
+ <net>
+ <source obj="keyb1" outlet="note"/>
+ <dest obj="osc_1" inlet="pitch"/>
+ <dest obj="saw_1" inlet="pitch"/>
+ <dest obj="square_1" inlet="pitch"/>
+ <dest obj="pwm_1" inlet="pitch"/>
+ <dest obj="tri_1" inlet="pitch"/>
+ </net>
+ <net>
+ <source obj="c1" outlet="out"/>
+ <dest obj="pwm_1" inlet="pw"/>
+ </net>
+ <net>
+ <source obj="saw_1" outlet="wave"/>
+ <dest obj="inmux41" inlet="i1"/>
+ </net>
+ <net>
+ <source obj="square_1" outlet="wave"/>
+ <dest obj="inmux41" inlet="i3"/>
+ </net>
+ <net>
+ <source obj="pwm_1" outlet="wave"/>
+ <dest obj="inmux41" inlet="i4"/>
+ </net>
+ <net>
+ <source obj="cb11" outlet="o"/>
+ <dest obj="scope_128s1" inlet="hold"/>
+ </net>
+ <net>
+ <source obj="osc_1" outlet="wave"/>
+ <dest obj="inmux41" inlet="i0"/>
+ </net>
+ <net>
+ <source obj="i_1" outlet="out"/>
+ <dest obj="inmux41" inlet="s"/>
+ </net>
+ <net>
+ <source obj="tri_1" outlet="wave"/>
+ <dest obj="inmux41" inlet="i2"/>
+ </net>
+ <net>
+ <source obj="dial_1" outlet="out"/>
+ <dest obj="xfade_1" inlet="c"/>
+ </net>
+ <net>
+ <source obj="inmux41" outlet="o"/>
+ <dest obj="scope_128s1" inlet="in"/>
+ <dest obj="*c1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="in_1" outlet="left"/>
+ <dest obj="mix_1" inlet="in1"/>
+ </net>
+ <net>
+ <source obj="in_1" outlet="right"/>
+ <dest obj="mix_1" inlet="in2"/>
+ </net>
+ <net>
+ <source obj="mix_1" outlet="out"/>
+ <dest obj="phaser_mono_float_1" inlet="in"/>
+ <dest obj="xfade_1" inlet="i2"/>
+ <dest obj="murf_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="phaser_mono_float_1" outlet="out"/>
+ <dest obj="xfade_1" inlet="i1"/>
+ </net>
+ <net>
+ <source obj="xfade_1" outlet="o"/>
+ <dest obj="mix_2" inlet="in2"/>
+ </net>
+ <net>
+ <source obj="mix_2" outlet="out"/>
+ <dest obj="dac_1" inlet="left"/>
+ <dest obj="dac_1" inlet="right"/>
+ </net>
+ <net>
+ <source obj="obj_1" outlet="out"/>
+ <dest obj="mix_2" inlet="in1"/>
+ </net>
+ </nets>
+ <settings>
+ <subpatchmode>no</subpatchmode>
+ </settings>
+ <notes><![CDATA[]]></notes>
+ <windowPos>
+ <x>-3</x>
+ <y>31</y>
+ <width>1286</width>
+ <height>772</height>
+ </windowPos>
+</patch-1.0> \ No newline at end of file
diff --git a/patches/murf-demo.axp b/patches/murf-demo.axp
new file mode 100644
index 0000000..31375d6
--- /dev/null
+++ b/patches/murf-demo.axp
@@ -0,0 +1,461 @@
+<patch-1.0 appVersion="1.0.11">
+ <obj type="./pattern-editor" uuid="8982eaff736042dc39d2254b62620799d51c3eed" name="pattern-editor_1" x="154" y="56">
+ <params>
+ <int32 name="counter_1" value="32">
+ <presets>
+ <preset index="1">
+ <i i="16"/>
+ </preset>
+ <preset index="2">
+ <i i="32"/>
+ </preset>
+ </presets>
+ </int32>
+ <int32 name="counter_2" value="32">
+ <presets>
+ <preset index="1">
+ <i i="16"/>
+ </preset>
+ <preset index="2">
+ <i i="32"/>
+ </preset>
+ </presets>
+ </int32>
+ <int32 name="counter_3" value="32">
+ <presets>
+ <preset index="1">
+ <i i="16"/>
+ </preset>
+ <preset index="2">
+ <i i="32"/>
+ </preset>
+ </presets>
+ </int32>
+ <int32 name="counter_4" value="32">
+ <presets>
+ <preset index="1">
+ <i i="16"/>
+ </preset>
+ <preset index="2">
+ <i i="32"/>
+ </preset>
+ </presets>
+ </int32>
+ <int32 name="counter_5" value="32">
+ <presets>
+ <preset index="1">
+ <i i="16"/>
+ </preset>
+ <preset index="2">
+ <i i="32"/>
+ </preset>
+ </presets>
+ </int32>
+ <int32 name="counter_6" value="32">
+ <presets>
+ <preset index="1">
+ <i i="16"/>
+ </preset>
+ <preset index="2">
+ <i i="32"/>
+ </preset>
+ </presets>
+ </int32>
+ <int32 name="counter_7" value="32">
+ <presets>
+ <preset index="1">
+ <i i="16"/>
+ </preset>
+ <preset index="2">
+ <i i="32"/>
+ </preset>
+ </presets>
+ </int32>
+ <int32 name="counter_8" value="32">
+ <presets>
+ <preset index="1">
+ <i i="16"/>
+ </preset>
+ <preset index="2">
+ <i i="32"/>
+ </preset>
+ </presets>
+ </int32>
+ <bin32 name="sel_1" value="-2147352577">
+ <presets>
+ <preset index="1">
+ <i i="2"/>
+ </preset>
+ <preset index="2">
+ <i i="-2147352577"/>
+ </preset>
+ </presets>
+ </bin32>
+ <bin32 name="sel_2" value="-1073480065">
+ <presets>
+ <preset index="1">
+ <i i="514"/>
+ </preset>
+ <preset index="2">
+ <i i="-1073480065"/>
+ </preset>
+ </presets>
+ </bin32>
+ <bin32 name="sel_3" value="-536347585">
+ <presets>
+ <preset index="1">
+ <i i="8738"/>
+ </preset>
+ <preset index="2">
+ <i i="-536347585"/>
+ </preset>
+ </presets>
+ </bin32>
+ <bin32 name="sel_4" value="-267388897">
+ <presets>
+ <preset index="1">
+ <i i="43690"/>
+ </preset>
+ <preset index="2">
+ <i i="-267388897"/>
+ </preset>
+ </presets>
+ </bin32>
+ <bin32 name="sel_5" value="-132124657">
+ <presets>
+ <preset index="1">
+ <i i="21845"/>
+ </preset>
+ <preset index="2">
+ <i i="-132124657"/>
+ </preset>
+ </presets>
+ </bin32>
+ <bin32 name="sel_6" value="-62922745">
+ <presets>
+ <preset index="1">
+ <i i="4369"/>
+ </preset>
+ <preset index="2">
+ <i i="-62922745"/>
+ </preset>
+ </presets>
+ </bin32>
+ <bin32 name="sel_7" value="-25182205">
+ <presets>
+ <preset index="1">
+ <i i="257"/>
+ </preset>
+ <preset index="2">
+ <i i="-25182205"/>
+ </preset>
+ </presets>
+ </bin32>
+ <bin32 name="sel_8" value="-32767">
+ <presets>
+ <preset index="1">
+ <i i="1"/>
+ </preset>
+ <preset index="2">
+ <i i="-32767"/>
+ </preset>
+ </presets>
+ </bin32>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="lfo/sine" uuid="75f7330c26a13953215dccc3b7b9008545c9daa9" name="sine_2" x="616" y="56">
+ <params>
+ <frac32.s.map name="pitch" value="-41.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="disp/ibar 32" uuid="8ec034ef194146b746e2c4c1ec30350f4157d51a" name="ibar_1" x="1050" y="56">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="disp/ibar 32" uuid="8ec034ef194146b746e2c4c1ec30350f4157d51a" name="ibar_2" x="1050" y="112">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="lfo/sine" uuid="75f7330c26a13953215dccc3b7b9008545c9daa9" name="sine_1" x="28" y="126">
+ <params>
+ <frac32.s.map name="pitch" value="2.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="./murf" uuid="80e6127e3aded0bd6f7bf4dbc76d0734c9ea9b9a" name="murf_2" x="728" y="140">
+ <params>
+ <bool32.tgl name="animate" value="1"/>
+ <bool32.tgl name="bass/mid" value="0"/>
+ <frac32.u.map name="attack" value="44.5">
+ <presets/>
+ </frac32.u.map>
+ <frac32.u.map name="decay" value="1.5"/>
+ <frac32.u.map name="reso" value="37.0"/>
+ <frac32.u.map name="lfo depth" value="28.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="disp/ibar 32" uuid="8ec034ef194146b746e2c4c1ec30350f4157d51a" name="ibar_3" x="1050" y="168">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/button" uuid="ef3d13774349df85aa9bfecf30dbc91ab8488b3f" name="reset" x="70" y="224">
+ <params>
+ <bool32.mom name="b" value="0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="disp/ibar 32" uuid="8ec034ef194146b746e2c4c1ec30350f4157d51a" name="ibar_4" x="1050" y="224">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="audio/in stereo" uuid="99848ad6d90a8e615e83b2e619cfc806f28e7281" name="in_1" x="854" y="266">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="mix/mix 1" uuid="e8f482af5b1ec4a2e9cf8ac7ce09e7c0e43cea08" name="mix_1" x="952" y="266">
+ <params>
+ <frac32.u.map name="gain1" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="disp/ibar 32" uuid="8ec034ef194146b746e2c4c1ec30350f4157d51a" name="ibar_5" x="1050" y="280">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="disp/ibar 32" uuid="8ec034ef194146b746e2c4c1ec30350f4157d51a" name="ibar_6" x="1050" y="336">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="disp/ibar 32" uuid="8ec034ef194146b746e2c4c1ec30350f4157d51a" name="ibar_7" x="1050" y="392">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="mix/xfade" uuid="375dc91d218e96cdc9cbc7e92adb48f705ef701a" name="xfade_1" x="868" y="420">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="audio/out stereo" uuid="a1ca7a567f535acc21055669829101d3ee7f0189" name="out_1" x="938" y="420">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="disp/ibar 32" uuid="8ec034ef194146b746e2c4c1ec30350f4157d51a" name="ibar_8" x="1050" y="448">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="audio/inconfig" uuid="9a80ef3c19f2a8f81da3a3b7c1c44d18126b97d9" name="inconfig_1" x="910" y="574">
+ <params/>
+ <attribs>
+ <combo attributeName="gain" selection="27dB"/>
+ <combo attributeName="boost" selection="0dB"/>
+ <combo attributeName="mode" selection="Stereo"/>
+ </attribs>
+ </obj>
+ <obj type="ctrl/dial p" uuid="cc5d2846c3d50e425f450c4b9851371b54f4d674" name="vol1" x="126" y="602">
+ <params>
+ <frac32.u.map name="value" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/dial p" uuid="cc5d2846c3d50e425f450c4b9851371b54f4d674" name="vol2" x="182" y="602">
+ <params>
+ <frac32.u.map name="value" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/dial p" uuid="cc5d2846c3d50e425f450c4b9851371b54f4d674" name="vol3" x="238" y="602">
+ <params>
+ <frac32.u.map name="value" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/dial p" uuid="cc5d2846c3d50e425f450c4b9851371b54f4d674" name="vol4" x="294" y="602">
+ <params>
+ <frac32.u.map name="value" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/dial p" uuid="cc5d2846c3d50e425f450c4b9851371b54f4d674" name="vol5" x="350" y="602">
+ <params>
+ <frac32.u.map name="value" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/dial p" uuid="cc5d2846c3d50e425f450c4b9851371b54f4d674" name="vol6" x="406" y="602">
+ <params>
+ <frac32.u.map name="value" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/dial p" uuid="cc5d2846c3d50e425f450c4b9851371b54f4d674" name="vol7" x="462" y="602">
+ <params>
+ <frac32.u.map name="value" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/dial p" uuid="cc5d2846c3d50e425f450c4b9851371b54f4d674" name="vol8" x="518" y="602">
+ <params>
+ <frac32.u.map name="value" value="64.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/dial p" uuid="cc5d2846c3d50e425f450c4b9851371b54f4d674" name="blend" x="770" y="616">
+ <params>
+ <frac32.u.map name="value" value="25.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <nets>
+ <net>
+ <source obj="in_1" outlet="left"/>
+ <dest obj="mix_1" inlet="bus_in"/>
+ </net>
+ <net>
+ <source obj="in_1" outlet="right"/>
+ <dest obj="mix_1" inlet="in1"/>
+ </net>
+ <net>
+ <source obj="blend" outlet="out"/>
+ <dest obj="xfade_1" inlet="c"/>
+ </net>
+ <net>
+ <source obj="sine_2" outlet="wave"/>
+ <dest obj="murf_2" inlet="lfo"/>
+ </net>
+ <net>
+ <source obj="vol1" outlet="out"/>
+ <dest obj="murf_2" inlet="vol1"/>
+ </net>
+ <net>
+ <source obj="vol2" outlet="out"/>
+ <dest obj="murf_2" inlet="vol2"/>
+ </net>
+ <net>
+ <source obj="vol3" outlet="out"/>
+ <dest obj="murf_2" inlet="vol3"/>
+ </net>
+ <net>
+ <source obj="vol4" outlet="out"/>
+ <dest obj="murf_2" inlet="vol4"/>
+ </net>
+ <net>
+ <source obj="vol5" outlet="out"/>
+ <dest obj="murf_2" inlet="vol5"/>
+ </net>
+ <net>
+ <source obj="vol6" outlet="out"/>
+ <dest obj="murf_2" inlet="vol6"/>
+ </net>
+ <net>
+ <source obj="vol7" outlet="out"/>
+ <dest obj="murf_2" inlet="vol7"/>
+ </net>
+ <net>
+ <source obj="vol8" outlet="out"/>
+ <dest obj="murf_2" inlet="vol8"/>
+ </net>
+ <net>
+ <source obj="sine_1" outlet="wave"/>
+ <dest obj="pattern-editor_1" inlet="lfo"/>
+ </net>
+ <net>
+ <source obj="reset" outlet="o"/>
+ <dest obj="pattern-editor_1" inlet="reset"/>
+ </net>
+ <net>
+ <source obj="pattern-editor_1" outlet="outlet_1"/>
+ <dest obj="murf_2" inlet="bp1"/>
+ </net>
+ <net>
+ <source obj="pattern-editor_1" outlet="outlet_2"/>
+ <dest obj="murf_2" inlet="bp2"/>
+ </net>
+ <net>
+ <source obj="pattern-editor_1" outlet="outlet_3"/>
+ <dest obj="murf_2" inlet="bp3"/>
+ </net>
+ <net>
+ <source obj="pattern-editor_1" outlet="outlet_4"/>
+ <dest obj="murf_2" inlet="bp4"/>
+ </net>
+ <net>
+ <source obj="pattern-editor_1" outlet="outlet_5"/>
+ <dest obj="murf_2" inlet="bp5"/>
+ </net>
+ <net>
+ <source obj="pattern-editor_1" outlet="outlet_6"/>
+ <dest obj="murf_2" inlet="bp6"/>
+ </net>
+ <net>
+ <source obj="pattern-editor_1" outlet="outlet_7"/>
+ <dest obj="murf_2" inlet="bp7"/>
+ </net>
+ <net>
+ <source obj="pattern-editor_1" outlet="outlet_8"/>
+ <dest obj="murf_2" inlet="bp8"/>
+ </net>
+ <net>
+ <source obj="mix_1" outlet="out"/>
+ <dest obj="xfade_1" inlet="i2"/>
+ <dest obj="murf_2" inlet="in"/>
+ </net>
+ <net>
+ <source obj="xfade_1" outlet="o"/>
+ <dest obj="out_1" inlet="right"/>
+ <dest obj="out_1" inlet="left"/>
+ </net>
+ <net>
+ <source obj="murf_2" outlet="mono"/>
+ <dest obj="xfade_1" inlet="i1"/>
+ </net>
+ <net>
+ <source obj="pattern-editor_1" outlet="pos1"/>
+ <dest obj="ibar_1" inlet="in"/>
+ </net>
+ <net>
+ <source obj="pattern-editor_1" outlet="pos2"/>
+ <dest obj="ibar_2" inlet="in"/>
+ </net>
+ <net>
+ <source obj="pattern-editor_1" outlet="pos3"/>
+ <dest obj="ibar_3" inlet="in"/>
+ </net>
+ <net>
+ <source obj="pattern-editor_1" outlet="pos4"/>
+ <dest obj="ibar_4" inlet="in"/>
+ </net>
+ <net>
+ <source obj="pattern-editor_1" outlet="pos5"/>
+ <dest obj="ibar_5" inlet="in"/>
+ </net>
+ <net>
+ <source obj="pattern-editor_1" outlet="pos6"/>
+ <dest obj="ibar_6" inlet="in"/>
+ </net>
+ <net>
+ <source obj="pattern-editor_1" outlet="pos7"/>
+ <dest obj="ibar_7" inlet="in"/>
+ </net>
+ <net>
+ <source obj="pattern-editor_1" outlet="pos8"/>
+ <dest obj="ibar_8" inlet="in"/>
+ </net>
+ </nets>
+ <settings>
+ <subpatchmode>no</subpatchmode>
+ <MidiChannel>1</MidiChannel>
+ <NPresets>8</NPresets>
+ <NPresetEntries>32</NPresetEntries>
+ <NModulationSources>8</NModulationSources>
+ <NModulationTargetsPerSource>8</NModulationTargetsPerSource>
+ </settings>
+ <notes><![CDATA[]]></notes>
+ <windowPos>
+ <x>0</x>
+ <y>33</y>
+ <width>1280</width>
+ <height>767</height>
+ </windowPos>
+</patch-1.0> \ No newline at end of file
diff --git a/patches/stick-pedalboard.axp b/patches/stick-pedalboard.axp
new file mode 100644
index 0000000..eeb82c6
--- /dev/null
+++ b/patches/stick-pedalboard.axp
@@ -0,0 +1,101 @@
+<patch-1.0 appVersion="1.0.11">
+ <obj type="audio/inconfig" uuid="9a80ef3c19f2a8f81da3a3b7c1c44d18126b97d9" name="inconfig_1" x="28" y="28">
+ <params/>
+ <attribs>
+ <combo attributeName="gain" selection="30dB"/>
+ <combo attributeName="boost" selection="0dB"/>
+ <combo attributeName="mode" selection="Stereo"/>
+ </attribs>
+ </obj>
+ <obj type="audio/in left" uuid="d40e60b7641fe75af4d7c91b45bb038aacafc52e" name="bass" x="182" y="182">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="math/+" uuid="faedbea4612d9bd3644d6d3bf31946d848a70e19" name="+_1" x="742" y="196">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="audio/out right" uuid="e58a4cbbb087052c5480366e3f5d3a04aa319777" name="out_1" x="826" y="224">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="demux/demux 2" uuid="f48c5f63c31c60c077648e2a0886e592e4fa9434" name="demux_1" x="420" y="266">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="audio/in right" uuid="5f35c9f87b3f291a8120a10db71935bebd186469" name="melody" x="182" y="280">
+ <params/>
+ <attribs/>
+ </obj>
+ <obj type="sqrt-distortion" uuid="40cc95fc-e085-45b7-9ea5-c305bc2887b0" name="sqrt-distortion_1" x="532" y="308">
+ <params>
+ <frac32.u.map name="phase1" value="31.5"/>
+ <frac32.u.map name="phase2" value="18.0"/>
+ <frac32.u.map name="input gain" value="4.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="limiter" uuid="072c252c-bbe9-4d47-877e-3a7f9354f706" name="obj_1" x="658" y="336">
+ <params>
+ <frac32.u.map name="smooth2_1:risetime" value="32.5"/>
+ <frac32.u.map name="smooth2_1:falltime" value="42.0"/>
+ <frac32.u.map name="gain_2" value="26.0"/>
+ <frac32.u.map name="+c_2" value="0.0"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="ctrl/toggle" uuid="42b8134fa729d54bfc8d62d6ef3fa99498c1de99" name="distortion" x="350" y="392">
+ <params>
+ <bool32.tgl name="b" value="1"/>
+ </params>
+ <attribs/>
+ </obj>
+ <obj type="disp/chart p" uuid="58f42040a894006a5f73ed8cb8d0bd45481b28cd" name="chart_1" x="826" y="462">
+ <params/>
+ <attribs/>
+ </obj>
+ <nets>
+ <net>
+ <source obj="melody" outlet="wave"/>
+ <dest obj="demux_1" inlet="i"/>
+ </net>
+ <net>
+ <source obj="distortion" outlet="o"/>
+ <dest obj="demux_1" inlet="s"/>
+ </net>
+ <net>
+ <source obj="demux_1" outlet="o1"/>
+ <dest obj="sqrt-distortion_1" inlet="audio in"/>
+ </net>
+ <net>
+ <source obj="demux_1" outlet="o0"/>
+ <dest obj="+_1" inlet="in1"/>
+ </net>
+ <net>
+ <source obj="sqrt-distortion_1" outlet="audio out"/>
+ <dest obj="obj_1" inlet="audio in"/>
+ </net>
+ <net>
+ <source obj="+_1" outlet="out"/>
+ <dest obj="out_1" inlet="wave"/>
+ </net>
+ <net>
+ <source obj="obj_1" outlet="audio out"/>
+ <dest obj="+_1" inlet="in2"/>
+ </net>
+ <net>
+ <source obj="obj_1" outlet="gain"/>
+ <dest obj="chart_1" inlet="in"/>
+ </net>
+ </nets>
+ <settings>
+ <subpatchmode>no</subpatchmode>
+ </settings>
+ <notes><![CDATA[]]></notes>
+ <windowPos>
+ <x>0</x>
+ <y>33</y>
+ <width>1280</width>
+ <height>767</height>
+ </windowPos>
+</patch-1.0> \ No newline at end of file