From 6e922fe2235fc2952f3e91635a8f5a526caddf64 Mon Sep 17 00:00:00 2001 From: eh2k Date: Sun, 8 Dec 2024 10:31:21 +0100 Subject: [PATCH] devsync 5e1e08e --- README.md | 5 + app/CV/EnvFollower.bin | Bin 0 -> 10680 bytes app/CV/EnvFollower.cpp | 134 +++ app/CV/EnvGen.bin | Bin 0 -> 6092 bytes app/CV/EnvGen.cpp | 139 +++ app/CV/EnvGen_ADSR.bin | Bin 5988 -> 5888 bytes app/CV/LFO.bin | Bin 0 -> 13264 bytes app/CV/LFO.cpp | 125 +++ app/CV/V_OCT.bin | Bin 0 -> 1860 bytes app/CV/V_OCT.cpp | 88 ++ app/DRUMS/808ish-BD.bin | Bin 4680 -> 4416 bytes app/DRUMS/808ish-BD.cpp | 9 +- app/DRUMS/808ish-HiHat.bin | Bin 6980 -> 6048 bytes app/DRUMS/808ish-HiHat.cpp | 15 +- app/DRUMS/808ish-SD.bin | Bin 4664 -> 4872 bytes app/DRUMS/808ish-SD.cpp | 13 +- app/DRUMS/Djembe.bin | Bin 6476 -> 4844 bytes app/DRUMS/FM-Drum.bin | Bin 10664 -> 8448 bytes app/DRUMS/FM-Drum.cpp | 9 +- app/DRUMS/TR707.bin | Bin 3480 -> 3672 bytes app/DRUMS/TR909-HiHat.bin | Bin 1780 -> 1916 bytes app/DRUMS/TR909-Ride.bin | Bin 1792 -> 1928 bytes app/FX/Delay.bin | Bin 3056 -> 3228 bytes app/FX/Gated-Reverb.bin | Bin 5536 -> 5628 bytes app/FX/JU60_chorus.bin | Bin 8100 -> 5992 bytes app/FX/Rev-Dattorro.bin | Bin 3928 -> 3372 bytes app/FX/Reverb-HP-LP.bin | Bin 5104 -> 5192 bytes app/FX/Reverb.bin | Bin 2596 -> 2664 bytes app/FX/ReverbSC.bin | Bin 3052 -> 3192 bytes app/GND/FFT.bin | Bin 12520 -> 7804 bytes app/GND/Scope.bin | Bin 3328 -> 2920 bytes app/M-OSC/Waveforms.bin | Bin 111532 -> 110324 bytes app/MIDI/Clock.bin | Bin 2052 -> 2504 bytes app/MIDI/Monitor.bin | Bin 2240 -> 2260 bytes app/MIDI/VAx6.bin | Bin 17324 -> 11824 bytes app/NOISE/808_squares.bin | Bin 2112 -> 2156 bytes app/NOISE/NES.bin | Bin 2068 -> 2148 bytes app/NOISE/WhitePink.bin | Bin 1892 -> 1912 bytes app/SEQ/EuclidArp.bin | Bin 10820 -> 10968 bytes app/SEQ/EuclidArp.cpp | 12 +- app/SEQ/EuclidRythm.bin | Bin 3776 -> 4808 bytes app/SEQ/TuringMachine.bin | Bin 3920 -> 4648 bytes app/SPEECH/LPC.bin | Bin 21284 -> 21096 bytes app/SPEECH/SAM.bin | Bin 27644 -> 28264 bytes app/SYNTH/DxFM.bin | Bin 47388 -> 48084 bytes app/SYNTH/DxFM.cpp | 13 +- app/SYNTH/Open303.bin | Bin 34964 -> 18480 bytes app/SYNTH/Resonator.bin | Bin 57716 -> 44136 bytes app/SYNTH/plaits.bin | Bin 0 -> 118800 bytes app/SYNTH/plaits.cpp | 488 +++++++++++ app/build.sh | 25 +- app/dump.py | 14 +- app/index.json | 10 +- app/squares-and-circles-api.h | 4 + app/upload.py | 72 +- doc/cv_ef.png | Bin 0 -> 1209 bytes doc/engines.png | Bin 15830 -> 17010 bytes doc/seq_tm.png | Bin 0 -> 3201 bytes lib/drumsynth/drumsynth.cpp | 2 + lib/drumsynth/drumsynth.h | 2 + lib/misc/noise.hxx | 1 + lib/plaits/resources.cc | 8 +- lib/streams/audio_cv_meter.h | 95 ++ lib/streams/compressor.cc | 158 ++++ lib/streams/compressor.h | 133 +++ lib/streams/envelope.cc | 128 +++ lib/streams/envelope.h | 246 ++++++ lib/streams/filter_controller.h | 84 ++ lib/streams/follower.cc | 137 +++ lib/streams/follower.h | 131 +++ lib/streams/gain.h | 56 ++ lib/streams/lorenz_generator.cc | 82 ++ lib/streams/lorenz_generator.h | 80 ++ lib/streams/meta_parameters.h | 66 ++ lib/streams/resources.cc | 1435 +++++++++++++++++++++++++++++++ lib/streams/resources.h | 105 +++ lib/streams/svf.cc | 65 ++ lib/streams/svf.h | 76 ++ lib/streams/vactrol.cc | 186 ++++ lib/streams/vactrol.h | 139 +++ lib/udynlink | 2 +- platformio.ini | 4 +- 82 files changed, 4508 insertions(+), 88 deletions(-) create mode 100644 app/CV/EnvFollower.bin create mode 100644 app/CV/EnvFollower.cpp create mode 100644 app/CV/EnvGen.bin create mode 100644 app/CV/EnvGen.cpp create mode 100644 app/CV/LFO.bin create mode 100644 app/CV/LFO.cpp create mode 100644 app/CV/V_OCT.bin create mode 100644 app/CV/V_OCT.cpp create mode 100644 app/SYNTH/plaits.bin create mode 100644 app/SYNTH/plaits.cpp create mode 100644 doc/cv_ef.png create mode 100644 doc/seq_tm.png create mode 100644 lib/streams/audio_cv_meter.h create mode 100644 lib/streams/compressor.cc create mode 100644 lib/streams/compressor.h create mode 100644 lib/streams/envelope.cc create mode 100644 lib/streams/envelope.h create mode 100644 lib/streams/filter_controller.h create mode 100644 lib/streams/follower.cc create mode 100644 lib/streams/follower.h create mode 100644 lib/streams/gain.h create mode 100644 lib/streams/lorenz_generator.cc create mode 100644 lib/streams/lorenz_generator.h create mode 100644 lib/streams/meta_parameters.h create mode 100644 lib/streams/resources.cc create mode 100644 lib/streams/resources.h create mode 100644 lib/streams/svf.cc create mode 100644 lib/streams/svf.h create mode 100644 lib/streams/vactrol.cc create mode 100644 lib/streams/vactrol.h diff --git a/README.md b/README.md index eb8d4d4..6d54c22 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,11 @@ ChangeLog ```` +== 2024-12-07 + * Bugfix: + * EnvFollower - IO-page AUX input + * Enhancements: + * EnvFollower - mode Follower, Vactrol (based on MU Streams) == 2024-11-30 * Bugfix: * Crash on patch saving/restoring (#97) diff --git a/app/CV/EnvFollower.bin b/app/CV/EnvFollower.bin new file mode 100644 index 0000000000000000000000000000000000000000..433a49486f6ffa8b694c7ae8a4d6e1afb7a3dead GIT binary patch literal 10680 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� z5OAlIfc=XJ*i}rx#R39;U@*>z0X-fBj2T0~x)B6$ z9SK-%N5F7P0y@nIxMD)UQGL9I76EtF2q2XR7|$YL2mT)DDF8Nh1B~bZc-soFs~Mo^ zEkG=8TSq(tNO=sf;yysl9o$2|iTjGz0M1;(|IKRwj#XoP&RKv@Cjqt{1Bf|{?Ht5- zf&CcUwFhG-c4Ev{CB{T;!E&2$KeQa{{)X{h>i|Mm16*7Q;J6&%z!Cr_+}ymp0Na>{ zb>`yrBmffJK=sPUcrM&r?aTsroPjY)80>T*1)w$w;3n>YzD~eZO&sp!#{vXJ;~r@w zz@>29@d^W&F$-|6!#J(!02xyOUQ7lE4#9fC0RBM$4>15B)*s;eM1Tzw09#M`Hm_jRDw<8@)?M0Tj64KCd&t?2-82!U&An z8jja<0-*8Fg_T1wCe9JyoCClU+$dHI!T%tT@q+=f2LbG~!*pAWAw&EyC~Ubkz%46` z9YaDb0rn0A_%;CJ6_9NfSYHS*1vzGpenAS%&<6s{M^5#}*bJl`1I*Ns1^w{v3=@ES zL~e|G)QG|eK#FjYQbUY?L-rV83aUFr! zA`M#DPlz@0P!q3-I3Z1ZERXmh6mnVvARVzonlNy#5(!64k>_dvza!y@5NT2c*pFl& zE(nQSR{>augd=vyS7jV8$a*9e8IJIfCrTI#hs;Gn5L<*m9`OLGkP;*U8HMN~ZCrpG z$Zli-5{0-U0tAqk92|?tHe?^zSkx6Zu~v`3tfD literal 0 HcmV?d00001 diff --git a/app/CV/EnvFollower.cpp b/app/CV/EnvFollower.cpp new file mode 100644 index 0000000..bd2081e --- /dev/null +++ b/app/CV/EnvFollower.cpp @@ -0,0 +1,134 @@ +// Copyright (C)2021 - E.Heidt +// +// Author: E.Heidt (eh2k@gmx.de) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// + +#include "../squares-and-circles-api.h" +#include +#include "../../lib/streams/follower.h" +#include "../../lib/streams/vactrol.h" +#include "../../lib/streams/audio_cv_meter.h" + +streams::Follower _follower; +streams::Vactrol _vactrol; +streams::AudioCvMeter _meter; + +int32_t attack_ = 0; +int32_t decay_ = 0; +int32_t mode_ = 0; + +namespace gfx +{ + uint8_t i = 0; + int8_t scope[128] = {}; + void drawScope(int x0, int y) + { + for (int x = x0; x < 127; x++) + { + if (x % 3 == 0) + gfx::setPixel(x, y); + gfx::drawLine(x, y - scope[(i + x) % 128], x + 1, y - scope[(1 + i + x) % 128]); + } + } + + void push_scope(int8_t y) + { + scope[i++ % 128] = y; + if (i > 128) + i = 0; + } +} + +const char *mode_names[] = { + "Follower", + "Vactrol", + ""}; + +void engine::setup() +{ + engine::addParam("Attack", &attack_, 0, UINT16_MAX); + engine::addParam("MODE", &mode_, 0, 1, mode_names); + engine::addParam("Decay", &decay_, 0, INT16_MAX); + decay_ = INT16_MAX / 2; + engine::setMode(ENGINE_MODE_COMPACT | ENGINE_MODE_CV_OUT); + + _meter.Init(); + _follower.Init(); + _vactrol.Init(); +} + +void engine::process() +{ + auto inputL = engine::inputBuffer<0>(); + auto outputL = engine::outputBuffer_i16<0>(); + + uint16_t gain; + uint16_t freq; + + int32_t paramters[3] = {}; + int32_t globals[3] = {}; + globals[0] = attack_; + globals[2] = decay_; + paramters[1] = 0; + + if (mode_ == 0) + { + _follower.Configure(false, paramters, globals); + for (int i = 0; i < FRAME_BUFFER_SIZE; i++) + { + _follower.Process(0, inputL[i] * INT16_MAX, &gain, &freq); + outputL[i] = gain >> 2; //_follower.process(inputL[i]) * 10.f; + } + } + else + { + _vactrol.Configure(false, paramters, globals); + for (int i = 0; i < FRAME_BUFFER_SIZE; i++) + { + _vactrol.Process(0, inputL[i] * INT16_MAX, &gain, &freq); + outputL[i] = gain >> 2; //_follower.process(inputL[i]) * 10.f; + } + } + + _meter.Process(inputL[0] * INT16_MAX); + + if ((engine::t() % 50) == 0) + { + int8_t v = outputL[0] >> 9; + CONSTRAIN(v, 0, 14); + gfx::push_scope(v); + } +} + +void engine::draw() +{ + gfx::drawScope(64, 58); + gfx::drawRect(64, 44, 64, 15); + gfx::drawRect(0, 44, 63, 15); + gfx::fillRect(2, 46, (_meter.peak() >> 8), 11); +} + +#include "../../lib/streams/svf.cc" +#include "../../lib/streams/follower.cc" +#include "../../lib/streams/vactrol.cc" +#include "../../lib/streams/resources.cc" \ No newline at end of file diff --git a/app/CV/EnvGen.bin b/app/CV/EnvGen.bin new file mode 100644 index 0000000000000000000000000000000000000000..a240f7d8dff6b23d66176069a74e669c5f736d14 GIT binary patch literal 6092 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 127) + i = 0; + } +} _scope; + +void engine::setup() +{ + _processor.Init(); + + engine::addParam("Attack", &_attack, 0, UINT16_MAX); + engine::addParam("Decay", &_decay, 0, UINT16_MAX); + + if (!strcmp(engine::name(), "CV/EnvGen_ADSR")) + { + engine::addParam("Sustain", &_sustain, 0, UINT16_MAX); + engine::addParam("Release", &_release, 0, UINT16_MAX); + } + else + { + // AD - Mode + _sustain = -1; + _release = -1; + } + engine::setMode(ENGINE_MODE_COMPACT | ENGINE_MODE_CV_OUT); +} + +void engine::process() +{ + peaks::GateFlags flags[FRAME_BUFFER_SIZE]; + + uint16_t params[4]; + params[0] = _attack; + params[1] = _decay; + if (_sustain >= 0) + { + params[2] = _sustain; + params[3] = _release; + _processor.Configure(params, peaks::CONTROL_MODE_FULL); + } + else + { + // AD - Mode + _processor.Configure(params, peaks::CONTROL_MODE_HALF); + } + + if (engine::trig()) + { + flags[0] = peaks::GATE_FLAG_RISING; + std::fill(&flags[1], &flags[FRAME_BUFFER_SIZE], peaks::GATE_FLAG_HIGH); + } + else if (engine::gate()) + { + std::fill(&flags[0], &flags[FRAME_BUFFER_SIZE], peaks::GATE_FLAG_HIGH); + } + else + { + flags[0] = flags[0] == peaks::GATE_FLAG_HIGH ? peaks::GATE_FLAG_FALLING : peaks::GATE_FLAG_LOW; + std::fill(&flags[1], &flags[FRAME_BUFFER_SIZE], peaks::GATE_FLAG_LOW); + } + + int16_t *buffer = engine::outputBuffer_i16<0>(); + _processor.Process(flags, buffer, FRAME_BUFFER_SIZE); + + static int y = 0; + if ((engine::t() % 50) == 0) + { + _scope.push(y); + y = 0; + } + else + y = std::max(y, buffer[0] / (INT16_MAX / 16)); + + for (int i = 0; i < FRAME_BUFFER_SIZE; i++) + buffer[i] /= 2; +} + +void engine::draw() +{ + _scope.draw(56); +} \ No newline at end of file diff --git a/app/CV/EnvGen_ADSR.bin b/app/CV/EnvGen_ADSR.bin index c818c196b23a1249da7b0471f6c221c96c953b44..abea342eb2bfdf3087c0eadaa55e1b111a45ab16 100644 GIT binary patch delta 2206 zcmZvd4NOy47>3Wix0MbGv>;l_Un#HwB5TDTwz%zDpch+}qLPR*EdsG*9ipIFvc)nS z8CyievV|=B%QPEqQ_;d=7751eC+e11or^Iu(?|lymXzVPTUp}XuUynDyUEk{ocG-C z-t&Fu+|$v*wnBYX>6*2RnT2f>82d-hn4w3X;ZrllqCpgh0Z#xehzGGi2jT$kk9Y}+ zm#BF2q2wh2@)iK{76S4NfV^Zto)M6j0^s>rs$!-oW;&F-3_zXG zw4<@9p}4lb-c`H1_T@5{v(Dx9dR-f=+x$29SN%H$vvzK9TVv4@{~=-H{KXT@#t;4~ z>vTbx9pcZj(B82BRM}p2 z;iU2+S+A>>aVA8&)tYQGwMJ2$s~W3I>lFTE>q?&_1IWX#G;^0^y%tW6LlFK*?GZ%$*qOp!YeZAY*(QZTXYRyO>ywX(D zp&5BphMQxWf#LB`7aO4uf;K&U2r6f_ELe=5L{CY`EhM^|B{o9)v3N)m8A7xkQwE71KnE4Ccm_|iM4$BI{eu7W>D-we zr@Pq*oin;YVNJEH5|7$nlvPf*RO~+$b40xoBclJ?c`JO>vJ7Q7GVmUrQ4;BE_Yd?* zX^wPqu)_H2vRQAntah306@NWw>6Z+S3>|kBjGWZ;?4GcDGr`s5e9~z zAGe4GiK1&0f8JbPJPtpv(f`0SR`ttRw zH#j#qutmjcnL}#42`|;DJ=q?OC&9zAlI;!C@m&3Myzusbdpcv)_UVk0A18RLSt7dg4Z zh;rvU^CHm{D|m|BpQNj%3OV1BF#m!ud9`JWuE&k z?CUXu!-&`NE^>1{$SG@)`^Ffb$(iGjh)#z%(}!bhB(J9XeC3&RHOK4PXiaDxXbosx zXuVzoZQzYm{B(i?;1K8qec*lYv42mr6n7M@e()t2V1C;|b09l0O651}69QKKG#5yX URjCYgs?v#i4}YN#aPrUbFHeR9EdT%j delta 2269 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 literal 0 HcmV?d00001 diff --git a/app/CV/LFO.cpp b/app/CV/LFO.cpp new file mode 100644 index 0000000..705898f --- /dev/null +++ b/app/CV/LFO.cpp @@ -0,0 +1,125 @@ +// Copyright (C)2021 - E.Heidt +// +// Author: E.Heidt (eh2k@gmx.de) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// + +// build_flags: -fno-inline -mfloat-abi=hard -mfpu=fpv5-d16 + +#include "../squares-and-circles-api.h" +#include "lib/peaks/modulations/lfo.h" + +#include "lib/peaks/modulations/lfo.cc" +#include "lib/peaks/resources.cc" +#include "lib/stmlib/utils/random.cc" + +peaks::Lfo _processor; + +int32_t shape = peaks::LFO_SHAPE_SINE; +int32_t rate = -INT16_MIN; +int32_t waveform = -INT16_MIN; +float scale = 0.5f; +float offset = 0; + +const char *shape_names[] = {"SIN", "TRI", "SQR", "STEPS", "NOISE"}; + +struct +{ + int8_t scope[128] = {}; + int i = 0; + + void draw(int x0, int y) + { + for (int x = x0; x < 127; x++) + { + if (x % 3 == 0) + gfx::setPixel(x, y); + gfx::drawLine(x, y - scope[(i + x) % 128], x + 1, y - scope[(1 + i + x) % 128]); + } + } + + void push(int y) + { + scope[i++ % 128] = y; + if (i > 127) + i = 0; + } +} _scope; + +void engine::setup() +{ + _processor.Init(); + _processor.set_level(UINT16_MAX); + _processor.set_rate(rate); + _processor.set_parameter((waveform - 32768)); + _processor.set_reset_phase(-INT16_MIN - 32768); + + engine::addParam("Freq.", &rate, 0, UINT16_MAX); + engine::addParam("Shape", &shape, 0, peaks::LFO_SHAPE_LAST - 1, shape_names); + engine::addParam("Scale", &scale, -0.5f, 0.5f); + engine::addParam("Wavefrm", &waveform, 0, UINT16_MAX); + engine::addParam("Offset", &offset, -1, 1); + + engine::setMode(ENGINE_MODE_COMPACT | ENGINE_MODE_CV_OUT); +} + +void engine::process() +{ + peaks::GateFlags flags[FRAME_BUFFER_SIZE]; + + _processor.set_shape((peaks::LfoShape)shape); + _processor.set_rate(rate); + _processor.set_parameter((waveform - 32768)); + + if (engine::trig()) + { + flags[0] = peaks::GATE_FLAG_RISING; + std::fill(&flags[1], &flags[FRAME_BUFFER_SIZE], peaks::GATE_FLAG_HIGH); + } + else if (engine::gate()) + { + std::fill(&flags[0], &flags[FRAME_BUFFER_SIZE], peaks::GATE_FLAG_HIGH); + } + else + { + flags[0] = flags[0] == peaks::GATE_FLAG_HIGH ? peaks::GATE_FLAG_FALLING : peaks::GATE_FLAG_LOW; + std::fill(&flags[1], &flags[FRAME_BUFFER_SIZE], peaks::GATE_FLAG_LOW); + } + + int16_t *buffer = engine::outputBuffer_i16<0>(); + _processor.Process(flags, buffer, FRAME_BUFFER_SIZE); + + for (int i = 0; i < FRAME_BUFFER_SIZE; i++) + { + buffer[i] >>= 1; + buffer[i] *= scale; + buffer[i] += (offset * PITCH_PER_OCTAVE * 5); + } + + if ((engine::t() % 50) == 0) + _scope.push(buffer[0] >> 10); +} + +void engine::draw() +{ + _scope.draw(64, 51); +} \ No newline at end of file diff --git a/app/CV/V_OCT.bin b/app/CV/V_OCT.bin new file mode 100644 index 0000000000000000000000000000000000000000..0246cf18d8ed8d0fae85d6d430259106c39e0627 GIT binary patch literal 1860 zcmaKsUrbwd6vuzJrNBBFg~Iq#{#@w%*Nv^>;#eWGq1bLMNL^_oX36a>Exk2exoZo< zzCaciF>w*a2OcytF;T)^7=rFWf^H9cGn>4axI~kgz_QVlpsr+U{GM{V8HxPTPrkq3 zIj85G-|ybv^>%gl)U$eKRWZg2azFMlrZkEGnTvrM>;VX2T2Kh~0*ZMGkgo)gZ=XUb zRHsl5EdzQ$^Gao21FZnHip>Ds59&Y_;6OFd0E(qvD3)qdEY+r1s$CDLW&@yFjev6V zfO0kg%GnGkrx6?=IA(^h7LK_uK`l_q)eEKi0q8ks80v)%L61XeytgfEVq2|u=%6t2 zXSls$)?XF-^tQqJKv_>J0Us$!=Sze3iDCT>al;(bk^NmoFDp8y=nXEnMfSa-KPkGV z=tD*SRJ2I79luvmgQ7-74=Z|1QJe3G??|t$j|oB~7D)fKq!%5iBNJ_MwA>6JxL{mV!<7@L{f|=Vcik-FGD^iUz3T! zpj(WKXNAERTc0cJN!JR~Qu92jBeQnbqTB?we&XgDbkCxxgGdEq6QCFFP{ zmKcuFLDy+8QUauo^_DbQk9?t*f_g1l ze;a2UWzMq4o=@8UoU#ZDRD*A2RwnPz)GM$%b6>k2FW049;r9y z?UMI95>an?}>Kg?4dm5fT3{%nDj%Zzd3rh&en~Ok43w z`{)~Wr@K5|s?3;5jjliQi9Wae#zw2U)BfE?D>vu3wlP+^@78s@=8<;u%MI_#+6}Jw z?vEudw;g%RtxeO8JF8`LOKX{n*qi0b?Ch)+y}Lmlcpc>Ta|UxikQa4M9X)e;#_kcr zSGvMm?0`30(9Rv5c6{EsbzAGy?&_D9g2*F*DCGk_fj)YS+3Ch(c%q^6q`lrg%hQKj K2Yr~2gMR?UYVCgj literal 0 HcmV?d00001 diff --git a/app/CV/V_OCT.cpp b/app/CV/V_OCT.cpp new file mode 100644 index 0000000..e8fffa6 --- /dev/null +++ b/app/CV/V_OCT.cpp @@ -0,0 +1,88 @@ +// Copyright (C)2021 - E.Heidt +// +// Author: E.Heidt (eh2k@gmx.de) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// + +// ENGINE_NAME: CV/V/OCT + +#include "../squares-and-circles-api.h" +#include + +#define ONE_POLE(out, in, coefficient) out += (coefficient) * ((in) - out); + +float note = 0; +int32_t tune = 128; +int32_t cv0 = 0; +int16_t cv_ = 0; +float glide = 0; + +namespace gfx +{ + uint8_t i = 0; + int8_t scope[128] = {}; + void drawScope(int x0, int y) + { + for (int x = x0; x < 127; x++) + { + if (x % 3 == 0) + gfx::setPixel(x, y); + gfx::drawLine(x, y - scope[(i + x) % 128], x + 1, y - scope[(1 + i + x) % 128]); + } + } + + void push_scope(int8_t y) + { + scope[i++ % 128] = y; + if (i > 128) + i = 0; + } +} + +void engine::setup() +{ + engine::addParam(V_OCT, ¬e); + engine::addParam("Fine", &tune, 0, 254); + engine::addParam("Slew", &glide, 0, 0.5f); + engine::setMode(ENGINE_MODE_COMPACT | ENGINE_MODE_CV_OUT); +} + +void engine::process() +{ + cv0 = engine::qz_process(PITCH_PER_OCTAVE * 2 + engine::cv_i32(), 0, nullptr) // note is added internal + + (((int)tune - 128) << 2); + + ONE_POLE(cv_, cv0, powf(1 - glide, 10)); + + std::fill_n(engine::outputBuffer_i16<0>(), FRAME_BUFFER_SIZE, cv_); + + if ((engine::t() % 50) == 0) + gfx::push_scope((float)cv_ / PITCH_PER_OCTAVE * 4); +} + +void engine::draw() +{ + char tmp[64]; + sprintf(tmp, "OUT:%.2fV", ((float)cv_ / PITCH_PER_OCTAVE)); + gfx::drawString(4 + 64, 32, tmp, 0); + gfx::drawScope(0, 50); +} diff --git a/app/DRUMS/808ish-BD.bin b/app/DRUMS/808ish-BD.bin index ea5b9d5f21f9a0668df26cdb3fee2ea270d19887..9423a4e76be40eeec140f003a6b79dc768adc3fe 100644 GIT binary patch delta 2414 zcmZvddrVVT9LLXn6iazsq+*4lmjVvPaOEizvvn1ErA6sBNqjBP0Ip;}D!9dDkCri) zMkQgnENN0%)cFTXG%2qIGniGL?EC5wgi9yHUJ!;rX+$Q8cGr<0>fjZfFh}s zG*ATRM$#!832_tnAsG}cD6)x?35sl{=s=Mzlq^sro1zCrawuCtk!=(a6v?F+$mf5j zy7R$83Mkt_kryb1phywrMNp)e@)9UgLfHX|yi75IBBhivP^3JLn^Zstsiaha!f}wD z01s3HD&Q3W&tw;XXHo;~1|Bl8`N=Xv?8m`oSYpR5$OOgnD*|l-Ed|9nu;Dgh)4~zN z8XgQZ(`_69xD(FRQ*&hQw_0XtB6m%!;+ZJ zQvHeQynKp1Qhj)TrK{cXZf~{O(c4?w^Ilg)eRs!+y7x)*;r&(Z-S2dCw^uvb+U$-V zM^~NQ)@twU?6kjC+AROV9+uzaw&t$~n>)&}^hn79F|!l*6+xI)$RK--M9wPmj9SN& z$k2M{+$#0F8pTdBiA+U<^W+m4F3K+Myt{f*Z9AlJ#vEtUXhN)~cmD33Smi~BSM-iZ zVo!AtHysa%i^a2@+^9}+NhE})%Tk}t>5_1hp11Kc5VtW(LRhcD1lMp#;Z2t;Z!5g5 zrC!3jPV)HrX@wOS!}NlxoOSiLxFnB2OiW&%hjY0k^(1eTp7tHb7u{|2N$Ma8i7EE8W)o>IHMTsTl=94zL_H+0^;mFTIVA^FS~uQc6Hp861&ot9 z)*MJ=2~Mcr*B|gn*;YMz1n}UuYUq%nvKuUof35Y7NSW5n|Hg*ay&2Yw|M8|-h3C9D z-k`CJNL;`OyF%o8^)|N?UZE3kA(Q;c6W`7(a0mLG=8g|W$5uSecS4PS81#)1Px8eT zax6K@E!_(7;YYkG+*;7z!A1Gy3*m>QswlV2h98y{He57Y?$tUBmeX0PDEld&8zUt3(wIjf4|vCgx$za!I1-Xz zwf(V2j;-50X20i#m>x zt6&p3BQICRl$9%D%E?e8ocf8d%WL5mwMqP9p{C*i)`-flf~rwpRjqjH4x(LahhN_B zlO~j-M&T;AqHgt%>Bd;U&n*>MIKS?Rpz%p0Tp+Y}=XIO1xhRRK!VfBO4a4U4Vh#R&PN7F2v`3h ztQ?yM*z_s;19$-fzyvS_Tmzws%gunKaQ`nA+sVEq8h06!9W`$ogKkjk^;$;mt` Ktik{4^ZWw@AUps7 delta 2630 zcmYjR3s6&68b0@t5CVblk`TbWcqAYYf*_BGF~oa?phoKp(L#h}z^YAgcSomo6DxMG zmQi~hhh1d0P+fJaYedkp%BGGwb=J<-?zYoy-G|faB29HkDJGOPcmETv-90nk`Tp~r z$35SF{^SGg?JV~?Tm6bGl!eMkgwDhvWJCzL0Jw<(G$0Bf0!RQ@iw0m#3cy+n0Bf-T ztjPdagX1Dvyr9ViEddy7i3n{&SWE(7F?mizDS|dn&{Bc1rT}0q4S+Qz0Bh+0tYrYO zmI=Vxd;r!|fXt(hRc-=;EC85A*#HWV1HcP&0eGPvpavKKd4RP6ak_vP&#~K5D+tj7Hwe6Cjw7pahqHnkc88lf($8HE zLW@(_rx93$-vji1Vf_~2_Wo+gC*k#j5)SSheZU_Ez=YUC>EjcLx-R)@3GxudD0#Dsnvw3V2+qqK^v z7roQ&{lPP7iFUE&BNBT}4fm z$cO8(U?Q|k#q~s`r7P`pz%0e{4yKn)wIdD0E;aK$o5Ed>GPoTKAKb>Pp)cn7;Dtz} zhv+hobS-UTk3t9VYvOuT18^A{N7C*4y>JS`>(lDe;9{f$k5QJEF)*v1^1IM6KDdWZ zt}|r9974ym5tR?V%**RU0SWP=nhT5hU@IR}hqpbKMS)m?4>s_W*9eB-n}}0OlHCOp zlPkKs=xvn0$WDoKY9-cRYI}5-Dzy=E*lZT4!raBW;00n6#jZg{AuX{y|o8VAD zK_MF-JZ18lBSZod<1wG3L%__WNgz@Cyp?!Md*ncqL> zEuV|J^%-_$j<_lcTOihkua1-6v2V#k*dKNWrXtR;OZiAq9eyOzf{R7dUSNOIJ1~uw z5=UTc#0k%{4|Ef~c+|`4?V5wn;~e|I!G@5EG7`PLY*yr*d)eJrwL2vsKSsjxUJ{l)AgjNc3ayg#=d|Z$33vD?! zCQ)(2v9_#s7;Oi*06zs3Odu;c{7=~NNeCSwukpc?&$vliLG!_L&jV#xPzre*RPe!L z{MaM(I&4>yk^7~$E81P`ZV>)|y!Xd3o<%+nw?mw+r*`W`y)&e-QK|3|I?A=w<6;Tj zJ`d#ro+Sd&ar>I_YVITPTZEizh{|{4zW~=Ty}R}5-3e;#{&s6e%f+E-Ptz^m;52HZ z{r{ppIr9?4v(%Kx-;%w*gMx=2@INRP%~H4kOu6-gR@;|0rYM4->_HtEeoLsNT`m-AJBSQs4ig1`eDe{Yf?b zLpP^BOcMKR#I5AzkXU=GnTFZRA=;XlPQn`6pJY2Zgmko%a-AN(G>ulB@!_A?e&J(7 z&y`NAb7Xw(httJ9mcEa8N+9%r_KY7^l z&elE7ZOuEH_Psc`<>Sqw&C42lHr;D5HXPdM-{9CVx;}S(@4DD^U2FLlUVGu$8qXT> znx56EtKW4P9UrV(z3Rcr-7Di(o?218;;;3)>f`Ir+wFFL-J!aIy1TWzY8AC(%UhO9 zmtSNzu@rlb*}#y@dH1qS%c7PI+qT-|Heb!lHL9AAtsbk%`e5ntrL{}{W4T~yv7}n= zEb%NUUE;4EsNPU5tG>DT)y1a8-`FV~pXCiwryD>W{`=hL` zEOXYB?zcLpPNDmgw#%)p)c#v@O4Fc`X|Ah(rq-+Psd`k^s>%5S^Hy III&FoUtGK>n*aa+ diff --git a/app/DRUMS/808ish-BD.cpp b/app/DRUMS/808ish-BD.cpp index 65ef64d..00f8ff6 100644 --- a/app/DRUMS/808ish-BD.cpp +++ b/app/DRUMS/808ish-BD.cpp @@ -26,9 +26,7 @@ // build_flags: -fno-inline -mfloat-abi=hard -mfpu=fpv5-d16 #include "../squares-and-circles-api.h" -#include "peaks/drums/bass_drum.h" -#include "peaks/drums/bass_drum.cc" -#include "resources/peaks_lut_svf.hpp" +#include "lib/peaks/drums/bass_drum.h" peaks::BassDrum _processor; @@ -72,4 +70,7 @@ void engine::process() } _processor.Process(flags, engine::outputBuffer_i16<0>(), FRAME_BUFFER_SIZE); -} \ No newline at end of file +} + +#include "lib/peaks/drums/bass_drum.cc" +#include "lib/peaks/resources.cc" diff --git a/app/DRUMS/808ish-HiHat.bin b/app/DRUMS/808ish-HiHat.bin index 7f0039f9331358fa3a55e89bd740698b5a62369d..cbfcc01c44ed67ec0adee5009b29063114ce8ac8 100644 GIT binary patch delta 3634 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 diff --git a/app/DRUMS/808ish-HiHat.cpp b/app/DRUMS/808ish-HiHat.cpp index 5875b1a..fbcd0bb 100644 --- a/app/DRUMS/808ish-HiHat.cpp +++ b/app/DRUMS/808ish-HiHat.cpp @@ -23,13 +23,12 @@ // See http://creativecommons.org/licenses/MIT/ for more information. // +// build_flags: -fno-inline -mfloat-abi=hard -mfpu=fpv5-d16 -ffast-math + #include "../squares-and-circles-api.h" #define private public -#include "peaks/drums/high_hat.h" -#include "peaks/drums/high_hat.cc" -#include "resources/peaks_lut_svf.hpp" -#include "braids/envelope.h" -#include "resources/braids_lut_env.hpp" +#include "lib/peaks/drums/high_hat.h" +#include "lib/braids/envelope.h" peaks::HighHat _oh; peaks::HighHat _ch; @@ -96,4 +95,8 @@ void engine::process() for (size_t i = 0; i < FRAME_BUFFER_SIZE; i++) engine::outputBuffer<0>()[i] += (float)buffer[i] / INT16_MAX * oh_ad; -} \ No newline at end of file +} + +#include "lib/peaks/drums/high_hat.cc" +#include "lib/peaks/resources.cc" +#include "lib/braids/resources.cc" \ No newline at end of file diff --git a/app/DRUMS/808ish-SD.bin b/app/DRUMS/808ish-SD.bin index 383bf61ac64328a557b305198c6973b8247fc1aa..d8fd96ab01cfb6656727d87cf410c11a715e5ba7 100644 GIT binary patch literal 4872 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 delta 3287 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, FRAME_BUFFER_SIZE); -} \ No newline at end of file +} + +#include "lib/peaks/drums/snare_drum.cc" +#include "lib/stmlib/utils/random.cc" +#include "lib/peaks/resources.cc" diff --git a/app/DRUMS/Djembe.bin b/app/DRUMS/Djembe.bin index df3e3c53d84b5608d28fe5cf81fb1c9178e9ca85..fce4de5fb336505e6c7784f46ce2037a73f95581 100644 GIT binary patch delta 1195 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 VCI5^h`n{H9v|0EIc#$d?{vY4eGLHZN delta 4164 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 diff --git a/app/DRUMS/FM-Drum.cpp b/app/DRUMS/FM-Drum.cpp index b1a2288..93a640c 100644 --- a/app/DRUMS/FM-Drum.cpp +++ b/app/DRUMS/FM-Drum.cpp @@ -24,11 +24,10 @@ // #include "../squares-and-circles-api.h" -#include "peaks/drums/fm_drum.h" -#include "peaks/drums/fm_drum.cc" -#include "resources/peaks_lut_osc.hpp" -#include "resources/peaks_lut_env.hpp" -#include "stmlib/utils/random.cc" +#include "lib/peaks/drums/fm_drum.h" +#include "lib/peaks/drums/fm_drum.cc" +#include "lib/peaks/resources.cc" +#include "lib/stmlib/utils/random.cc" static peaks::FmDrum _processor; diff --git a/app/DRUMS/TR707.bin b/app/DRUMS/TR707.bin index e493825bf394842d6b06cbdba3a693b62dbef3aa..e3878fd4a384c337abc3d64a44abff954c5180f2 100644 GIT binary patch literal 3672 zcmaKve{56N6~~W%5F9%cFQ#1@hvCE-xCDwJ3_`P|CP{5-6JqjX3hI#U#!jA@lX$k% zW)YfP#I!8!CN@(kjVlp#h^1&1j+)SHBBGNjZIwDH+4zHLomjU&NLgc<2{f}w)4u2V z+K$KIDIb6Dx#zrd?z`{4cVBwjk9HiQLo}fxTGbHYk4^(VHUcH!J~b!@8-Ny+0Uh9& z3cxX&0Q;T*?Ar|3rw8o&5@25?V4nf7Zwp}GlYo6s0rq_vu&)ZR?`gokYQR1tU|$X3 zzOADD717=X<+cfMyH-#K-44uP52y!w!B@dPz`jPX1MCMD@HOxZH~@BngP;L4fn7iW zb^}Z!JqviQI5&^k3V5ts!vwenkAZ9O7`O(Hfot#>xCYne8eE%eaP32YYd;6Lb~E7G zUk6eC3 z6^;aosXT#U|3iJzm@g7T??YkhI`T33nlupgL;^lP`J-V^)Hf6k1w5lou?9*Gi9Pq#eOTodVs2jz3~lZ)r`b81!2 z-^%LsD_J_Hyha&kc4?K)U^$r{_H{kRckD5~%!5bgy!Wq1`>y^w?`vAnxK3nM)~!O_(NT9i~Xr5OQ&dV9~vGLp;uvm++xoffTY-`*lF>X5*=4O4=5!auy6*K=o zn;Z9#?@BITOG&T2z?j%S^FTo=|1TB@z}igPFzztg!hpM@^0=|q<8t{q%Kzul#g6w={LT%q9eOgtL~ zuR67~n&GXp@I90NF5!L81bF|p0N#&z@8vz6_if&rZJ-?-0Y?GvjXj_bd<%GiA4nhs z!XO65z-bT%{A`^C{Cw?R)4cvFKLxgnDYK+KkB@=OVm#)$wKg=(5HAWhYo^kMCkqgg7SHs4XIn!VmSO_FLY_9@54!+lx66~6v{TDh%~!0O z{{C&czVOG7o8uI3`rRi-TN)c1`Lj)4OB2vHz&UUpOaWdSye_=pZ7>5af?4njkOKPo z&3rHPI_agkP0lCK&aLB0>10;zI-aegDo43X%j@07zAd#E?FuvdGF}RR+j6WZ;kbhVdkt;4$V@zv)JC~eE)%x z@*cJG&g~B|cOQY@f=|FQ2ruZJoLPxCjLQ9r@v6RTnd*D9>So3MDaWPO2P;~q_Obr( z(hcOf2|fjX0rXyIV@V^1R>$*BSx=qJAdrbDu-ec`rlh$N1`R;=F#J F|1U%V)?@$x literal 3480 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 diff --git a/app/DRUMS/TR909-Ride.bin b/app/DRUMS/TR909-Ride.bin index 2f6c03f6350e485d26f0e36bf2dd19532790f11b..4074f2b1747dd8d41a783e918b270f3f4263c65f 100644 GIT binary patch literal 1928 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 Az5oCK literal 3056 zcmbtWeNa@_6~Axy?Xo-(9xDnW=&Hc#jv6$iDyF&;+_k$9H>r-1e!#}vWqBj8T^60Z z=~SY|pqb1FOdHf16h#?3&8!w$ZNoGTmLxNssVPa*l*|zOArifJ*r~)d#Ie7-Jcu5l99&PXah^2EchK zfDFt8%s?tI3rGVp04|#iqyuvRt|I_khkN2WdVuQ~0ItJ*WCGkr7QlVX1-OrFfcuyS za347Ux19^j2W}Hm2tw{5m0AQU3B+>`fiD2P2D%FL8SqzwJ^{J`bS_T_PZO|7Ao5$F z4?bJ9&G$9x(`ZnmAA2nM*pnQ4>bC3jef3C zQ8#JFtWn2vkCpm&d0!xvl{IxWkxFkkoY>UX_-ZQsyZv>M%AmK-x62=fM&rXQU)Z~c zgu?YZ{S6JI!5?W15g)f!S?jNbekkn!%4ns(&i6H5L&O`7{Eu%*XQ$i z!`|A;n#WgtwFzJYw}=Avo)6WMQ2m|&mfl8RO+AvU+*KI}g&t&tHAa17B-9v5$RXBt zTu2&1;hMTg0Ciu}YjW?1>kD&(+b$RrtDN9Jn|tnx7H_kqx!Y+8uj%9c;qSaYA^%=b ze<8~ma+2S3zTBfP+YuM-XBi|#5Xe`SP(UY3);pJTl?x77s?_NDHZqGX}I6>EULfkEvcUGnh(o54_QcBghkxPQpb{9`{I+% zx$X{{A;AvGa=%LTd}TMpN`*U&NGF{c?h}(dVu)?lc=9xl>lk8X!eWOZ+IM5jp2hRn z!*AZ?o#gk9-z}a8ze79+3y=pC_AW?dHZPbH+#mhqLXJDP9KL0;h_sq=cf<{zrp3ad zZf6oZ;u@xAWsdt2t5%^=IKW<31xr8GsrqPPU#cq|c65YGI%u*)VxB~tVqv>8IpJZ; zSlzQ0$FVA|jrf|@Jq7n<2{08K-}Bf)y`kxt_C?9E?N@8vwVPqt!=u^}CsjNqUb(0i z*LEe~j!(vAKgiChA5x+oKxA5Vod(R_3<#>qykC@Xb&4naBUxtv49$7PU!&Et5>L~9H2(fB+z8(3YFk51$3sW zi-!6(x=ML9Jd@RULYnN5M_7{E?tGHxX6M!Dtm+vVrYqoUMMV{}svUH>WM$_ncr;xs zAL}M5#EcaKEMM)1rgb`+yrB-7hjSLCiY4LP0%UovqKlnXt;lu{GpYm3stnUv(oyeyD>M)&+bF-z_U{``AGqN>LYu`W(43Hb7mq(_0^==6vYH9Fd=lb7PC);_i zQX_v~`_cBb8;8=qW3M;wFW$E8!}Z@izjwngTYpjfa9@`}pZ9k8=veu3D!y_sdjHOh z`9B-)Tp~Cyt#|D%(nuhq!E0?e?Kvuh%QypU?6}Q>-3f?cn zC&To#at^tpJIYztewwDho<-NH8^81|Id~fH?awPXXP6#$nS;m6GlL!Qs1_vX4<>8>ISUgVdl5 zQsdz^YElPjlG;X-U4wK+_8?8QwNdF<8=ZN0h|Vg$#+E9bY)K*`D|(G=irerO1=vAk zn4^XRogiVnT{IF+W|` zA+Ef{-ceS^(?9K+NcqtrNt{UklddBrCZ;4Y`LosW9QoAER3Q!>?6bQjbbmM`>0*Kj zdW(!VOLUJjhjKA4XLe1P-fqQdbF=a0W)p0xm*TSZS)PwVVqz*8UsuL0h)lL6r0k08 zOLkp3gZDHgwl`%CJ7Rkir_2`{*-q7n9b&dMu+zoni+gaJan=@x{!Z3ZT+L3RcJH9q zCCYWyrScA)WnGGHeBH*qE63PQWrXD`h>jrNebuZJHRx3CVGi7bg+!EQ_{$dllO|Z> z^W{u!Jpel=k&Ad#=s0ytP`5<2;n<0*OklXkez>9EV=q437IyT+nuxAA7Cza&{RIpEg5coJHK<7OwY7bar-mf zyl(sqs$`q8IW-RuJm$f}_uLL{DZuagW+2onyJQ{%x9HhD@7J>ND#_ax7uN|z?as3$ zci)#>(j(=ezB1VH0Q}$VIbiuHDbe)|$7T8bI60zw^Zp&Jmi-9X z`Fr1NGw=R4%MMPljuHRam L@3Yi4U`hT905%^s diff --git a/app/FX/Gated-Reverb.bin b/app/FX/Gated-Reverb.bin index b1acd91e557340ac546ead9a56331d24d1cbac92..8953a687b3d7e1cc3c320ead495a1f3dec602163 100644 GIT binary patch delta 1292 zcmY+DZD?Cn7{||j>5JJMsm)BZFNkRj9y)Dad#l;nJgGrZ$#bvdX zaTz3Rbd=UY$7O!7$l?bT{1n-QeXxp%@l(Je_-%+V=K{T#l(l$uV*NkKDQpLR{Gapu z&wb9zJ*Uw7Z*P1oJTe+!0k$D97HVa+mKD%JYXl-_0upEj4d5w2o(GV(1CX~9koPno zZx`5ceRNOGhk$DD1{6QbV?U2+I*Mfw095EX;04cv7SINs0quZlb%0K=fptTeEU?H$ zXbY6QE-2L<6j&}YhTsh(2BFl>^BtzR(!`H7Ws!HzaDSYu!8K7=#aBNuCBQYvwHvAl zwe_>Jf>sYM^28OcHv|@>c?w*=;Ch?uk6eG{de52>ZlyBG%=^h{7EdH1@u_$wHgWI( zi^bwIiOCDG$@gMYv59Q<@x*zaxG*!FotchN7dG$FXsn>G!j6fze{;RwRhKP^->~Z8 zEz8&)kXiM$?chi~5UR{2Yo}1{{CnjAyMoVyx8}sIUH-O|^i@F1YV13@4Arm4^{6W; zXRSZIy8mhsakfW2xsg90Z(hsZ(d5niVZ}Pp63$iL94ooXfV{p>D!Ji-e!b*|PLSXou zTSEp$8NuPQEqD%69O*SWXi=;~U#yQ)3fjAE`dtj5^e0FTss+veL}maP-xHZ0b+0NF zR~}TA0RD1*3)`*TS-P)uzv&LsJq?0=pxe6cYt0=+)K{sF_SxdX{PBh1sLR;=iJxs| zMqR;+<*~VuRhy-wuB4@~uFFi`K<%c}StnKX3gs@z56Jkw=l9Kgm>$1>qt+vK; zjkA07yQoi-H>?{X{z}@ycHA}Log3KR2hLCCIp;I;zSCs>f!gH#1Meg5eR*u#y$|>I z)#l>Lnz(?&rbl^bYwPvev3B#LRiJd_VQ?Ib&{J-=KJ{rYM-ZI`XTUfJ_rJ{|Q%M@h Qw7%1mnIv-Y3_Sq$KSriuIsgCw delta 1172 zcmZ9LU1$?o6vxkew5hR5Y7-No*r-ugYNcuswFRS=8Qp2IB0{SyNuaIiU^VNuBBPKX zT0aBosJL6iKCFoP60wM&)xI=k!NAJC^kK_ZSj2!cG}My8kH-H^$7S)tZ~o_F?woth zO+MEQ*0k(zYHq2dN*d>gJ})AwBBB@v2dfl_z+u~EwmlEZY$ss$eA_O+8mW%E;IQo# zfCu;{37`^`05@P8JfIvb1`B`}ECfEV1iT`ugV5hZt#9y=EHnw7h5ih!;HY&Jx&(S3 z$`%eEFB+SRPYTZUG3T%+>xL~>m@RggYK~m2>y5VVw)KFmJskOwrW3ZFwe^~95LWe_LvDp6u z$Lzq-zTQ}0Z-}`_+a7zH=y98{YT=fHQQ?tKj>+_r9o01?G`Cw~@OSAaOH{%#yDUy= zw}d*M%v!I_PHk^vey~lyQK5KGr(h@6NP9jcHi$F*u@PCENo;D=^A$~TE4V(L-ML@P z1%$NKw7y13TXlQWRwHQLi*2!$;m+_HNz7fQQ_G)+N92HV$EbE9<4;@7%l1s2+Sd>{ z8F?1To8(-oj2QyUQI(Q0IA_uz<^>(Oa&A!eDHDjX>}|vyITvDa_jf@zg0AmkK5m7? zr-t86ZTHC>B?`qE;K8n!E%uvYSIm0%g8=veU=A&{27l?Ca{fn@O`O9_c!K5XSNd6` zZai*?>Mf&0n-?87N;Qh&1^=HG4K9towkS1jmBl>KJI3*gDYHwRGG#So9?~wRUYP%? zvjD0MN$rv|7Zx(vQZ-|_QyD9e_)AI}yqYltHED>NV)ZH0;&9 z=9R6&v_4rWuI2`&?I5Smg}p*U7e63OdxcLOLQxw!MSZ?|fLo{EbBDZ+yA#=xCle@z zv8yF0f6EZGk9xJoyOUWca^R*x>Tz>Sd${9}c~^UDI<&W_^5(TOHT<5xglQ%*qWVH% z8-!>rV1LMZuvx$0kpqpef}jcP0<~G%!4Lgoxm*~{75;f4|MZJK$@|1Ye&n0+>YH(9 VmZi!I`Rj$@cXS%t{raS*>MO%9U%UVS diff --git a/app/FX/JU60_chorus.bin b/app/FX/JU60_chorus.bin index 8871caacbbd5e02b2d0a22630be0faefead5b754..c08ce8cfe50642122a1fd5d9426bb28dd43958c9 100644 GIT binary patch delta 2031 zcmY+Fe@s(X6vyxDD+*HJbtqO5DO8<508157H1mnjhkfAc0-G}~rGu6q;YX(qm6((m zbh_b!Ubodilth=1#TYs?%Q6W|#O%i(hGqQW{#bNz2@tKTSr)s@&3#XMo$e-|_dWNV z`_8%Vy!+ZqTW5+&>ME*hidZSDml=CvW^4;%tV+TKV-6s5E6alKd7Enbypo+zSDmnmFS_deGp;C;L zVx$x!-5|77XqnK>2@R^$)b*eQT$U2~zLJ>x9n8Ol(guEpO3)~@4jO}Qf?}wr63TjL z0mhMpsyRXnsKL*Nx?arbg)tUP^p8y12!?u-8Vb!xtWcH24eBDi(SK05M8t=vkr>oL z47HLPkFgSD8kl=Iy#V;n;RU>6V9G{JUK833rFw^h!qI17R?OKaLeC5RROshI$AwM` z{YB_+LjM+OkQ4b*gr*D46lxK=Ax9WCp{s>Dgq8_ag<_9tvBF()UFM#h8_UZpJk>27 zzLJJEpLbtn7r!qT@(c3LV$ZuR9$%NQ;{a>-weR=Er6F*bc^ezu-hJM7kAI!x`J`o? zgMVP$x~;9V$l5z79)$so*AaUgvTB?Of35A)3F(L z6c1=Ulhi-@z&vG$ziHl|v}_SsbRJ~=&6sS@ZkEFqEugV+6aQ|`xzX?EpOJ#|5vH@C zTr=xt7nU(I78{fc5z{=n>FCJghiqO*Gr7|Av>k{rc&#R^krZ|Yw#xEl+mL1$QO1xa z{>@vV%K)7z`bz0*qmQL>*swqFykxO>#+>`3B$IfotzhQFFF7Kw_?=zVm4VkXb zWU%xf z|5l_1{+--rdLz&N@srJTnCSqkzzQk=ZLSJbk9xB*r3G%7wO}{c3+h4R=*flSh6T+q z+rW#V0Do)o<2481Jp_(`Cr_USd!W659(ZB%k1;m%^=z{3i$^`4T0WYwNpkW?MvfHV zsY2td*?%m{RCj;IcT;B6~=inw1>9+&p=)z9_8d#qi2@YfeZ@*H_fD z{Cux9?irhj)>t%F^!wz4>3gkr-?oJf!a8M_ekWEHraO$z<0Je^c0q7kcZEI?d9^$3krC%0RY7pX?YynY15>dcHWBNw z8wTz*Ndxjn7n>~MGEvTmXfL9@c4jkjw(|AK^%QXrYsOI0z(nkXorQ-rIb;bJi8~5) zH$8-MTQeZuZ>Ric*+ejQ)-J)(heR^Bg!5l05JG`ayuj|!CI3r5_+R=gu|CVSoqFlE zI?J42<_&9f-R`ubD`q|3J#39;R_B}%^zl?;lUJrI$r!Z%G>wk2en8*JSr7tr2nN9r z=mW{uj4o<;{M$g&lgHRN9jQw^#jK?d!@3Mcz*WY}m+s@Wxz*g5>*iON?%K?Hwn~U> g!SA&Ss(?H3+a3RJ?1jA-&>H%$oPvEB6f2DV3pA(5mjD0& delta 3888 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 delta 1640 zcmb_bTWB0r82;z7xlA|h#ME>XW0_!V3s%^)g3(5^sbMC`L|oTsU0ZQBZMJJn$hP$Y zi?VAX2!c@A3O-mOn1|R4Y=}!ij7e#!;N?LH+6QGH1nom+SVQ9urnr9p?xgslPagQ@ z`{$hh@||=3bD{P6&h*oLLyre2K&nU-@)HG#Xs9IMOH>2Y0kuHAXDgn)15po^jFR&pcl8_?pLGd;Gn}zj%DpV=?>SU7evHu1uX`}fi9pE!P!ldr|;Xl#6Z@+iemj*imA=)|efm$M6EPc|d% zOCL^1^8q7i&=T)N{Ztx?x^ie%f8Lc%%iu;3%&02`0|p;OUA|z~rvODUgU)ezT;3wd~FXX?>$pTw58Z^-E!KZFS@umx7YjWL0q&iiyJw|Ju%3V3Zdn|z~3`SG4^jbA_aSqH#RYcIf0>Vbtl1I~=si}xb)YTLkr2*AUHB%%(|pgAkiY_o z=g0H_8u7v{87V_>=mYwJA)q^Z(Qh<_VGRS%0!OmHi%oL5)b?jKBn4n}Y#NcWH}h)6 Z@Rv(x%8NH>3PD;{ZrD>d92uw_@!wv+;hz8i diff --git a/app/FX/Reverb-HP-LP.bin b/app/FX/Reverb-HP-LP.bin index d25e2c183ff7e91a783f0976433dcd5425b035d1..618243cc82403dacb96499e363ab5336366d8a11 100644 GIT binary patch delta 1322 zcmY+De`p(J7{{NxOMe)v&AMq?yLQoau0gw|TM=i6J7>6Ty_9Bl)n*oR)g;Tp>SArj z41)wm$7l@{4)%v-v}5QW{xLFiFu^J+ME?m`_V*BBj0Jijbrw%2tKTPm3)>4HzR!K% z=bra{pL?&e``6CQus=A^LM=oxQDO^KM@o`NLR1SBPzM~K9e=mVjj2%QmnSt1Xwb5-ayp*Mv7B=nZhJ3{|7r=@S> zOM@eS0Yq8JmipJRLdtVPql_Po*9;P6^}m)MRREGQy9T7Ehc_ zT_rjsfAhQTaxL35Cx1tkw;!6>t<4Uqytf$~-wZtKJk=moUbmO-(Wf|u=j%l|-r#Oc zDA$_!N0P59cvd-Hv^8f>?^8yrO}@$y*XU4 z)gH%chf=WpJ>7c2_8l$Q2SDg3Ui0lTVun{c_kv^fGum$44D9ajL}}Smu!GNI-nC1A zv46p8cm7=_=Z_XSd8xt5xuHG-S%#;-Xi3g}9EV;q+IUmcrsp>D)WtxiRlkh{wlBln zuPp}Lk2yVXwms%}wVj%hU%FROn*$PM*ZEuW)#uyEH=J**2Xuf=@G{`5+6!I<2Y?E? zN|k}Gj3v*`9G>kD+e9-*ezPbYwj~#KOBaL77A3>BL!E;=tzQ_xCOtb7VY?=D%cjNi zx;NoY;FDz+tg|!uay(fn2a?~H?<60Bi}{=-CySPX3W~2Sah6Z+E8@NOM813?jl6XI zs-X<|v|`EeWwBH{{j-*{q;%a{ws((~)jroAtVn5;O1sN*uPOK4%7Ylq-xnU4n{HoR zny=1A<*N3@6f?JFUg|czO_7$`=^grQ)aS)(Rt*^+DQV(3wz<&c9^&ZV73ugT9P~{2 zm-JVMPL#h$-!0dr?_!-lmh1CNEAlKl&HrWZ`uf3YPr0AmS3lr>9|l1X0v_|9ra;Fr ZL?d7n7{K5C4!spS6PtJ+*+>h5{{iVkR`vh@ delta 1224 zcmZ9KVQ3p=7{{Nx_tJE++FP5MROU=IV;fs%JBOexn9Xn}yN;#G*gBC*Mw6w->SAsC z;WkJZ(#d9Fa!!Ut)`4Rm{E}gjiL3TgreMIKV!sq8%+WyaNa#uqi^l(3Zz6l)$Nzbs z|Gm%iz7O}^_Ug9$;duYSAO&ejAnMylh=_86K-f|f@BzO^GnBKzBLL+*=FtL`!Q%j> z=n2pUT0uMD9$(xO0lYjh1l*JWZ_b-;0=(FhfENn^UMviFu@3MQ_?f61LidOgov2!a zmeHk2pu`Pm2h@jrC$!>q=RNpZKZyP@{?h+1ei6R-1^D9Uwh1KjgT0;(czWE^ae*SR z>9nVlo?4#HczWH_o1T8(>;=DCzX)ITq=tqPsnOJkKK#NS`froLW+XlGZhDM#JvBZw zd`cgFTR*91ayjd&7<~HF_*iayOdmx8A9y=%^Ba9}l4V+6dNa#zgw>o%-}2YVv#fv6 zm13VMZ@H3|RQXEZCAWK^D1S$xpSdBsU^khR#RrieU7FdFz2j1G!EMfM%3iT2&KI4G zQFTvS8w@8FDVZ%vN@W*jiecUh$HG^=~@FdNblQTY)>o*0nb+S$f;Fu-jT| z(^LLyixuCOi)e+h8$PtZY%}xEW#QN*n~VwPwt2$2X5M%F<{zlcJ+wXcvFClh|Dk&y z?(cU3#kpni0_Hn~q3vxnULnbPXJfl{w>=(>Ar%L&fqu|cq5b0QZ>}t3Ko`YZjrz^M wESZI+Mt%Na@WXn*8ujEzwz=j>MloLa(PM(xb;wGJ%rdAB;t0bN~PV diff --git a/app/FX/Reverb.bin b/app/FX/Reverb.bin index 597bbb517c12788965a79521aca849300f0e2c70..16151357d1f6bebd7d36acdc9e8100743eec6d84 100644 GIT binary patch delta 1335 zcmZXSe`s4(6vxkdNz*j#+SjexWUZQ6vtO<(BtutOn`cRrCa-0Ybzle5q}^tCSnOsy zH3|tfe@M6K+zWIK&ekzDDJYdy|FXJ2f(lNgn14r50l zfMfL^L|W3@U~C0VfbB<2`%%-zzQlGFXa>BA6Epx9;D)w?M$iJdRx5Z6tPy#k=r5w! zDQJsCF^)T-x$e^vrDI27_z~!UX5mIyxG;+|L)0OW!ka?W3?B)?jj-^kAZpf(Z@Q$O zGku;2M9slhQHSdem|B+tn}N5?z zo*4c(F*o9g&Wgt!T&ay~D(8j7o_fDbj=As?QMWdjMwk;WV`($o8g1Q3{%_P7b^R~e z7P2fXt$0-@n!o$tL11Zh_j|E0q&lbm_8X+I}xC6<5hu z6!p*Lgd>_0wNpjW0IeJ=3B@rhlOb;D(!kbW`Vx4YV9 zy(nx`XOR6yd2%Z9dt2P8N%;bflf`jvugcXt&$tgyNH>gSdrKpa?*5u|>?1+?neun3 j3&ub87As%9;j9TNeK2BR0KCXSyQ7ug2~L_ZQ3L-1yg_Y2 delta 1285 zcmYL|VN6q36vxkdudT18;Dh4U3e}=Wrjw*lletA{*U|S%3z3EJff~~mkaf-2ItNS} zlaf*Q0k_5NH36%vCIem27#8uH#4l!>1`}PHv3*zyGj5RVzQCg4eb~~S+g5gy-}|3) z?tS;2bI*ON)zj5&-L35%CNRM-3_xrfz(D|LAH@d_9il-nT(J3)tw*J{0ikvowZA-3 zlh}?%6(S(GA5wS&B(;mu4W$bL~B<#x*UTP&NLLMEk(_dsNPD zmgrI1Z#Vgx&}Us31G|4YG&V

pPA;12@!7N;AECe0#lD!pGLncEP@x(C^_r;l6N# zudjDk+ivgfj(z@>-n!nWeYXA#u^M_3D%(l7viUzJi~%jzesNO)!xhQupDIRRzqJ^# zY(=yiJX4JA*oskKyJ2MZirn17s@-Ll{>h$uCdKoBD|3zMqi4Qk7r3GY856Z7&1iInIrOuwmNY`{6bt_xhd5-r(+9vOt)In z7cI^Yj~bj07Z;Bfj|~pvAM6JB(G9MzJoLoqji&$4Ap|E2BTKaD6wzZEn%NZL(^;a! zj~cKHP5Pqp?d*iokp5WV#?L5YSeAA+N%ZL?OL*C&dy~0*t6O)TWp2nT{P0`ro~lPZ zyL@-K=ZUT|(dqbAXBC~#Ub~qknrN2r<0H7kX=QA@?T>Flzpb$qaEVFZ!}5|?UdVx$ zAvz&X>1!${2*m&XiwS&9AUdM_5TBIq>ucmyeQW&@%-DsrB3`6%4czQ}P8Ed5DqLXi x?Rx1Ew&w$l^PrZI&v{- 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 NKV)sOddIcb{y&)ml2HHv diff --git a/app/GND/Scope.bin b/app/GND/Scope.bin index e93f5835f6e2ca65c120211c3098c65097ceb088..76e1ba3d82e21140ce29b328d53dec5642eca7b1 100644 GIT binary patch literal 2920 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 diff --git a/app/M-OSC/Waveforms.bin b/app/M-OSC/Waveforms.bin index f4d5fc4949f27380e1d738558fd37831dd7a639d..e520ae231264439d2cdcc87872c16dca3755f070 100644 GIT binary patch delta 25273 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 DJ=tuh delta 26347 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 diff --git a/app/MIDI/Clock.bin b/app/MIDI/Clock.bin index 6029d3f5176a01528324ca57126a1a193e85efa4..6aa3b6209d32bb213bcd59834cb9b13f9e06afb2 100644 GIT binary patch literal 2504 zcmb_dUuaWT96tBnv}zmmYSd=7o!7KFHLa$dxUTAUO*Pjh)@IIvbwU!8=nbanHA!6u z8(N*v2L(|X5rj=9qZ>-_dNbQ6BemAF`=#)L|z?bj) z{kgw$&hOlN(zA0N|w?)SE3dZcL3;{e3fSb(+Bwztx0jdC`vTA^GtiU2*A+VTh znd>EB(n|r-Hm;X(y&Oz>1wgunYgz~C*8tKhxvu594otcpApJVmtGHIcq*nu^9b7kX z-3TVV1|Yqb>o>Sw2PVB9AiaTWkf|%dPJnvT1W<390qV_0fO@kDpx(Fu>P-tkF$|Sr z#1tcL#m{BIOl6-7%zqyC4KVHR4w%m4XYg_GU2qThKKN}ghI)tdYD$DX#QA)g%{@?n z_KKkn(ZPbR@Vp;*p6P{O!2v%&{jPGJxev-;M+c8VJ*PqY$536|ub3uN)v~RAUAE00 zQQmPrZwNe3Wd2X+#e%<{&qMDQ4LWlSwVCJNWgr30a4GV~FQzE~s{h@OZh(g8h`h{U5w zI0v40MUtTpnUU-dM^h=5ilzq)7C5+fOEhsbmWZ~6A`yQm8S2~R_l5oOc-;SfO91f} zS2%tw5JuUfQ5{u{Wb~h@1JOj}1z##1N~Ym`A?+E*Y)*M@6zw-s&ny{|D)bMeje&F^ z9*DJU!CGhSWZ9lwa3J<(D}rI(n8QXNdffawbBklYlw^6b#4d;vtoU0g`;eVRNO>{# z$17sHr(gcuXRnAkp1l0I6>~9*ueT(*R_Zprqo_)@prNrGy(2^Jru?-6v)-5zt@8N9 zlx1=EqeGUZwVCA}die3Gy{vG~+EKC;!n0 z79}*S43B6^vMoz@IDLzf8L!o)n=}K<(LEt@pItXJWzHsx<>)>t$ICX|wepy>r?+HL zuVbA-g=Czs6mY=9-5Rff<FQFDVgkh-56+Sz%Yjc6dkJ?fGWPkgN43FLVBs>;9|g zXNs`3I{2;G2N83x^(~wdMVimPI-@n3Gi9_;la;dfF^A$4E>cwZhT_s_FvoB8vx zIAiM&oY}n1yM*R8kQ3al)2u&Eb{C(v+I;QiF09^KyxXGu0h@RrIqpALb++(c8vCan z4gwzo)Vosv_3cw&7&r%904@U=fO=bgkNEjeb^nRl@8rrnYwRgmwhEgw+E?!B$trIZ zt>~q3BYPFKz5uQRBY^7mcU7&4Fx4=QC&=#XGX~vb&EQ!C%Cz$u{%6HqNcw SLHl`%L4VhN{Kp;ug23O!)K~!k literal 2052 zcmb`HYfM{p7{=dofdO{xI5t+fxN?kC0|Bf9Ss({wgIvH~9$@btz@7=Pw;r&U57^rP z*i!&|_X74d0`>|3dz%1zn*n=;fW0k%FJ2FpNB02<6ag%iiUHS@0In$oTysC*nyr9q zEP!*^UmxdKImcQCH3?J)p)CTr%FwtHI*f@PgT4iAhGxM(2)&8;2=qEH1eYiMOV&4e zLCY?lpD#=LH*+3*yUmCjGHQJ(Q)lfm^l?L53_T8Y3#523K4R$WhQ4FyMIkfIn4w=A z`kkRa8TzZCw+zh^Gj;0?ZE4!y^iX4GcUuR!-N8^W>h^}i-WL#b1${xc|D-<@bqBm5 zU#C9|vuCB{3wxg@E!^Gak3=ZqkM?L7rG@=>TDkop-zqN>^@gKxR}EWcERFGpo(+cl zXxgnsmMww2KA+1Q_IA00yXx-*?Fig%?%mxJ)q0}tPIqwUBfKgj4ll)R#;#9jU3j*f zM^aK&zk3iTSNh(d-+h#*{qUc3^R$G9gIs+Gw_sa^sS{A|=+Gx5;s-^t{d1XO8vv zDdU=Y%2x9q{r|7-6nk%qV%GpwNs}7`G`ml@HI?35l{|TA0nY-Q-{CZj=A=)cG;nx0 zJAGFY_<3MtLAH1YECZjamT<#3Kc4&zkka|10cqH*axeCk5vln|O16GvSH?W>_*<~j zTb4i1Aw%ndQmm`Q3dh#<}aaNUP>ar>XRK2g8 z94}X(3Y~bINzjvT>+;a}v}T?Ajo)kj-dF(dwG!|P$)%j(?78o6KA z$W`li?|Ej8+-tXUV*0d;1LlCH9>U@>F-H`8W<`ALc8u}8n(A2|qr!)n>w2LA&~bf_ x1OE|B1FOx|lJ|g*teW;*2zhH$m)6r6@x$wiaNOG7j?eH?NV|=34Tjbm#=jr%JrMu^ diff --git a/app/MIDI/Monitor.bin b/app/MIDI/Monitor.bin index 058073b07ef0f7b710115c33d4d1e69b498634fd..1191b7e6e9d81358e5920560835a159d093981f1 100644 GIT binary patch literal 2260 zcmaJ?T})F~96$F1ETuxJB89@d<-@FzNwhep7v)Otr<(B5g<_}v2Lc#bzlyr6m!RYixquvBK{Xt)_(|^$)igyOQ zAzz;#D=z#$L)es4uz|&2(*vqs#ba6 zkJLnl7rZGUHR=?i_0xEy@VIbl-W1@*jn1%>r16gECk$?V6DSBpZc_czD`Ml#MNw2N zXf6*FxP(A~+a@Q8(AA+Z`VNH^v|w>0&wW~4>|T?>Agx#f|GhJ9Ep+C`JX9JGjnIOWu=Fq-2csj3uFduoL*)UM=e|D0v+dSspE zh-ecuE1YH&GKUKPo~?E7!j5WpHJJjYz~wibVZLN$x!d5Y$$4YgXK7Bp;aXpmJYD{p z!_}icDsNXit#VaCU#tM*^^Y<{Sj(2F*$Q=UJhGrU`yRJ4l>c;v(Q21-*kXk_T++Py zfgt8ds5#|4qIQdG*R14f&N`N7wPVvu@^zBl`Q`HQbG^O20_%Ov>GoSbXU&o3 z*Zn8SVTE6aI-2HI&1Vw#?EHMisiN04Onurc-c3BPH_U%}itM$$7*@7C>2{2yABz0E zMckIrb&$4{$)|$UQ_a%w5^3wA`Rvuz+*guy% z@~W;;T?eV;6rB*B#>inc0zL^(Z_51*Q5Y}Ap0%sqPw zI(-0di`WejuXs&-o)}hg7rNvj{;FM<<|^6BhyxUDoOH*?9Jm7O9aeG{zH;#Ee%mA5 zg@~g({mgh7tkTGji>QNrj3m}nQg&7yAw*6mQueHx5NUg41P@2*Bc+jBiyoQLdBp`_ z0z3uG0?*O-7%&IEMB}5>zrRS*_+N|PpH=t3n8dq<-=1?5d5GXyEpVX_B zra;*sXU&^?xx~sl3fa7T*X_a6gK&OpN1U4JJlBT3#r1uL1*L3;cfDS01+9~S(||L8 zEkW0DY(j_{7uP;1Jx7 y4zL?M$4<6+j*_YxpCAY|by(ZeH_&tbfKao~x3>oUa4_Bz03VY*J$q_=)cz0He0GWe literal 2240 zcmaKte@qi+7{}kcD|nOxDuR|@^9pp4`eS5bLeynY=$*7+>#s%PTq(5JW&%xH9J5Pc zx-E^vMT0Y#K(aVvoWTqoY;Li^Z6?nBbv63~G?^x5tI{mFCN5rMHugN_05cQb&(u9OE2-!gh83Ayt03bwIl`K$13uLS0f^t9}kOSxdjI9JP zmJeWT6@ak<0As5GjI9AMrUwdvA^>v~fH`O@ont^TrvZwAOrQk79!ml2sSLngUIDO| zwE*tP0|tPjNHqv4qKJcngS`rR8aCVp+6%f9^bgQIpm#tIfL;N`f$s%IT^YWR7Y5eD zfoH(Mr=MiL5ZK!R7e#cqzE{;xRUJ_kQgvDLb?VAgP2qvD9=w3BsrhYxQ1!N|zp462 z)mc^lR`p+1GwJ#DoT@ENjZLq$^mO||Jptl$`oM6y0s+_i;B@)iKBwo1r#s~Iy1Lzm zJvgKH{~>q4^&asDdOAG8APIUxy?&VG4|tZga(cSmFU5i(S0Dt@m!`cCSeUa=lepY& zhb!Rfa{4yEzT|X*9P=e_g&3QTczGdk%^RscSZQfC6N!*MsXf~8YZ1T;AO7rMZZX< zFs_?mnp+i3-38&GqOrA!cweaWJiUm2AG(P=TTT;HAh|YDdGiTfuPLWP;PctG0)ID;8H5&LkEN?yn}Fg2IN4>zP@4e8#<5R*KUU5_?jZ?nqq$+XHkqmYD@KjlWsa>E>UcKEu$LgSJ?~j;lg)^I zRafpP@s@axJ!kS~*8G@g&vzR$p672~*EH~)aok_?bK(o8RiSjaKki(R?w5=jY?G;B z9@Z~riXoGcEYOaN>xEyFly=n?COMRCmw8s3$e;@q>dnHYx%Iq|CERThbu zI;Encl-y56%tXF3K$!}q)8~10zC(OfBRYJzhnDCDNY>I6oo3`8^ z6f6(#UL8`{o1EOwwOQIF%9Ov@NuNZUvKRa4lNggmx_6Y8`{`5WJ_)OLG?Mb;${F4t zoik)Nf<^q%BDLn&)CB?OT!~}tThlj^b9wqHmvAd~-W-8kz!HHzFM~ZMoPg(`;1ceI zN5V{k%5ArBQ%pHs-X`~FT(Eqmunt-p)l*wH1o6CoS~SuKcpoX;!`;`0;Q7>2I(1in z46Ne{ck}!Bpui+JS{Jw%9){ZUdqvE2dKDksAC8zA)!uzg4<4@81&e}b<932af?S7N^1cD$c<3VjMm#q0?XXOJ$hAje;?Mw~5?O^o>;Sd<^fJ ze^O`F!CV^ersGJ-x4KM;RPIwW+o+mh@uE2u(^|F5=Kaw|*dPA~Gy@J`;}c@0Cmtv| zT}&aT=o@p-Zu}E{OpZZ{e>rz+nVhstZg!d6@5|&qnOo?Eoy3zf)g|8IKE{+a{opYz zug;^hvaRR(_V>X%sU8;DXqI)!USa(vMU#b$#yT6{3y0bdybZJgZs09@Q-g)KSz5tv vuINa0m?pEHo*}ch#zTX$>@Pd!Yj*g8+w`%_fB*ut~ diff --git a/app/MIDI/VAx6.bin b/app/MIDI/VAx6.bin index 32ab387a6030659aa3a524323accaec4e543395c..361ca028bf2d56ed45ddb01ecee39e53de677936 100644 GIT binary patch delta 6463 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 literal 17324 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 Kn7c9;2>%bH(N|>v diff --git a/app/NOISE/808_squares.bin b/app/NOISE/808_squares.bin index f644671971908342b20103a1941165fb420d44f9..c332bf43223e4af47f473e4f357d9e1a70ab714a 100644 GIT binary patch literal 2156 zcmbtWZA@EL7=HUf%kE&i)9KjOB@LS(eu8XSadT8)6mQvVbR^Q4lx7sll|feu#2e!n zxVaxDTO=_H#y}#%oJQFPek4N@`7vW489|NzYIG4zI43NU*zL#S^Oj4-#)2l^!MQbiN(j!;&w^NsI+TGz(?o;P{?zm@+-yQddExo=qYP*o*i}`4rdn7ix z-`_7v6lkcPs&fBvVNs3?tCCpj126h0C0#5+k%sT-Ou$S%VMgPTgHc9cZvN<~9pGHQ=+s!#_ zjHcwQF@g#<$^qr9?>urJ(6Qn^=kFGzu+Ol@H5fwf@2B%lioRgK=+l#_cfLjbhW$nz zHOel|Gp+kByg$(DWFE55Gm_#AD)AAjauO9HB_9!u@&vq{sDy$_WMizNI(F=4btlD% z;D%^zDl6cWXSVR^zLaFVE%Sr9mE)51$zO09ycLTvBdpqj{9Wsi!}<-W-dd1X_0HQ4 zgU8>EcVK2In1Js~sDCGREkg{=f7mr6Y>2f(BSQnPFUVQ#{_$4C+wO_)LA(R;PQ+)L z@z>LP^8Sa$=VhfaFMZ2SVS|d}E|t1#Ghz)i6lkpdPa1Y;thq~LA2hNMpADULsKa%A zc^&R|jtppI-KF7z#(HR|(Ae-VwVZ(G@=9_~L}Z@cUDhCn)3tS8`*qF|q=I7$PklZw zBZioDrF$FiO79g`qZbkLvcdRCI*lJN-i>!MIA<~5D*J1id!z?Gp0Q8PKlbeX?mn(E zd4URmzY~1F`Ofow=X=gQ!F|9z5*t-Db*Z-l9b3Op9oJ|_P0GHSBpGL5nf)DL5PC{bfZ0_oz{8eQB>c5fh(tkbypyUinm{Xr97^6T&2 zbIj0s(9uQh$U7@uBcnlaPDg)7XM9uGE0}1dB@D1<=@L%8#uvMbw zyc0zEy{ z6NvQcaL~hndn(>QSK9-&o`^pjf%O5mWrii6rRB)q*4FF~`wx0M%6Hxy1TpY>5A@-u zyEmfuM!cQgpiX*se~>CCGTp5yYgtjK<$^8!Rv7wqc>K2P^bb3S&$*o8%1Kc#ab~RP z`PW0%3k5FSMN`7Aj9Z&pQ*!NS;~Od2?Q@B3j3&0%4H+YELxmp7*Uq# ziL-1^l;vtsmS^a$>iCxxGfjKzXRdr(Kl6p9p}hRZdT}oGiCTAz?Q&psrCKfDUF|;1 ztd7G>b`1MkQDKyttrW8DV7&rlWd#ETsx7= zW}!wgRt)bZcyEWzY1*EItr@nf$TGU9yc<7va4!cKnoXE2*Ka}FvjWN`wou71^aD9esPk6*kl6_qD z$-xn1mq3;=c3e#YQAQ3sKe|aoeZ$Ep;akze)7l5T)KlCjFZjsEx1u&5dP+Ee&-)sGMY=(IMVX6-!XaGj~U zJ?BsztIq3_;)Apcs03aBp8cKbEaSn-+pTrcuB9+G&xvmwfj-_dDmE zb9(Q)y;Unp%kpRn4RS=cMQ^070rUGb%rU5K>KEQHM2UzX`fW@kT8NeMPJ&0mNm3zUz zgJ*(O996P>h2X8=`QR$B9{ehpJ>De!^P5vs!+F*K9%qsa7gFb zhtKEOj>#6c(`|FLxtjd821k?AwDx0gx z`IOe;cli8Jp9)J8#$(27lEdk&bod-wZ0?s{#JkO{es8Pa=CRd#iM6rDRp+OAx5pzI z3+|Coa`L92QVj{TUouE>ix3{6cKmM5)4nwm_{t~n?Vi9l|MCCVTQxTBD;dbJRtr-7 z%!aCdUbJR3+zy?5EYmnbnoy5f<0}cX{bYMC75(Z4X@9=iYo@bo-}M7(i`qJ)tXhz$ zkcW2m(H!ci7UY#Wld`bKJk>G{ZzX-yk<@Z6c~58@;#5|}YP_#eS|{6CKeE-+?WC)* zciE+V`Y@g4GC10HX2)`NX4siy=Zc*jc1AS79AG~1Jh0$iysX?(!D?ub>s;;|WtKex zr)PawE$<5y+ygN0&8RVu*I>2`3X)rFemJ_k@rNkY3<@$j99>!?#O~He<4T_9T^F+T zuGq1fjAE@xmaxlDn{wiuwGWJU#5mSwA14|Q}G!c0v z#s~Hwvi-}S?{hVu7;g_$La$=;@vB- zi(|(ENA7chkBtw9zDCSW#DquUdnxhPYpeQakL`|E#JS8f!ylo-UgL?O?}wKNQ|W^f zr%)wp=;Fhmx?*%=X8UNCgqvp>ZC{o-s*v0rX4=JvhO7s}?}kE4FVCH9#PW&j%GOc? zus+zK&bFjRf zd{1OC)FN$CtrcUd`R>TeP{(`ND5?c~XGEWt*CDFcA0;u9*l@|%OO-UgHx_=G;^GguwKdw}6rF3W^(@u)z3M+HfDwV=>v=n9Y}L(hT5 zul6jfn-44jG=O(NWl^yc%c@njslQP1muOCvAY05W>NFoUJ|4=nWKQV!h7HKG0$2r< z0y5m(Dr7g1or2U&-_f7+Cie$7CK03$6nB)&pF^|I!+L6?4jQEUw2AwPJ1^;zZc==e gV<^S_GHXoon$C$cDjsiKT?bLKfAyF23@m))c^nh literal 2068 zcmaJ?4NOy46h5!7eeD40Q<$qi(-s65GH0{-m+7=2+RhdPbr^wYTWKpL2ydl8Y|JDi zZb)!5i$-FIV&>E(W`KdkI6B?p%(55*o6R(8bkPYi+q4?z(`>r$KFee?<0jwv?)}br z=bm?e-YZ#NP$<$wI?fS!GyoA*1FUHQHJ}6FqL%;xNCB8HHHkDZ!-OQ#!3_E&L@?50 z79tfe3E+VYfaT5vSnihrmU}Yr8t@8W0L~JbL3Dwr_%aH*0``OB;6gCZQE?co10Mp5 z;2mJrJkRJKyFA$|Nb-B&$sCC;a9)xvVD{YVP+mgI9$@`MrnPh}o z9-xj@MJv~?n7eAlT5>x5HU6N}9SFF$Vz9;U@jJZ@-kPAZ(p}@J_68u<|5x$^+>Im! zYAd{TbyVjK)=P+z0^aAToZcGG3tC;!9SA~wA#98=8Z$a4xjmj@cfh^H>3{3Z=K~)G zPG@a>P^u3)tDQcHSWRoZ6+!a(tE-g`UUpHR&QU7!=2t6AdIY66z4B&D?<2L*-C}Gx zW-|sBh1vRHNr+ec<&}Jo!6w=0G}FaizMxcATMk<{$ZChn#?A((#2IYtd`W!yC5PIWaZgdWDIN_8V6>h5bjLP_dSkakiJ17f5zHqzJ`q_M6GCl>tor)b zyIk29`8Nm8Bj2e6>A8X9awh3}j-!sN(J56O(W#-1sG%wz^M!uFQx~IDwIFshboee8 z`aJ*s;CaNfAtpQ=-$jY1Z@=3!^KomuD9)vPJ9G%ScjfmD4h)%FKRt00*;5BE+;5sz zG_ob)U4y|bm|ou6|i=Cie9%?PkHmHO)J>Dg>| za!hlx9L7$Y#CFzF(Rx|?#>I-({n`bv<=UmNGqhINYr-nnc3~ZCsjv}ts^EjYqN#yB zplN{Jp!opSprOP^O~|CC#3$hW;C0oo9&0lYN$-( zvvN&EidwEc6LE}D*C^@??a7FBj9Q|o*M#nf1?qa^XbzUQT{sq53^mvEOf6SpONGwJ ze5j)}Y*f^#LVLtKCa+sjuV{8h^2VqhMLnQtiR6q?H!JD}O;cnh)T)2gV9;!Tu(fLn z^wBD|DAAYI+aJ8&l>vRU4oT7XL-%)07?ZtD(aWK`yRRXpWlBE7)!o$=Im+?j4rEz?>#_?r7`Tv|p#_@gl^!an~LIXR= zE`x)z$aJE)$9>O@vAM&_CyeU;VLb^6qelOI2YNdI{dpl_N&gbPh1NZ=mOr@E*|K;V z_fA(7*QMA-blQ)hpObZ+jm_uqjZy9=UVI6_{;6twokZL$3%RI?I_XDxLfg1MxyLG* zzo)&WXa01Wf%x^*Kzpd4?$Rdi5_eYB&2Q3vmu@M*Kc^Z$r($owU+W=DVXeoT?++q1 HvH#WIs7{QF diff --git a/app/NOISE/WhitePink.bin b/app/NOISE/WhitePink.bin index 32bad21b959830ee9730301ba55054e6306fa775..ba8ecf2e6c40d717cf7e393655265c756d6d8ab1 100644 GIT binary patch delta 934 zcmYL|Pe>GT6vyBEpIz5=rZhLw*tSB$jKw4iq@6-p+|67B4;~^{tZXQ-f}(}kMMxq# zL_Y*?NryUWpclz3s#6I?N=GY#+QTmE!5X^M_t{7fK78N%z4v=><~P6j7WTsVfv!`% zHr3L!L}Y1zh}r?04rE{e1(-ku0l>K+;9M2pTnO-5wNDtz)cA03#s(Ni+lcannY0~n z(^|mI>Hs&}0Z_!|a1ATh)Po3kO%#XF3Q^_?^b52R`V-0n0up5gpf>avl#TbZ@q_Su zr^2uF-yF}6x0ZPjTLY+<$l?cU@%03h8}<9~If7+cj=2_MUkM7IQsM6_)Sv{gsrEAM^ww#eoCq$Ld z@5LW9j^K%=8#F~02Wb{=e{X+S6 z?oCM%w%V^dG|yJfV3+4H==-*@(&V|iD+nG;94d%RRb z*CZm3MieHZy#SjIsDJ}Niktw)ssN6;Z0)wS2h6$}VC@AkmbL&gU;qkG1Mn;#QD(ik z77iET0$DC%t^@mlt-#}rd(kXW?*eYL03HP|ffL{o_zCzI_$HW*AB2rB^1ty+HZH4B zoQ!6OT4{s#fVpwM?e|C&giC!kpRsww=B&*qiLQz((sS>*_BKim4)!KTlEbIZiilh% zR^+zK$sy%wz&vl#YaVAzE8Pi8jXvl)WvTIglm84Up0Jc~z~uWHGrqVl2A_P0%EsM7 zwTrW3Q{^JLCd}%XH|{-(3?(edKqlyk(=Bk6LefrW>pfGRGUn{FFwcJgKRh@9)B|jM zXiNTQ&tmL79}+}+Z_Us`EN3~h%Y}C-#J;>emdh*RnUZw<=zmedjy^Oe#dh_$q=^ga zK}i>rYNzH%MN4nQRc)K-(+sg&Gc+e6kL*ajR3%2WPRS)+Y7xmTerp|)N3`pW!&)k` z=AO(I^z?w^a&bHzS=%*vr{GA19G8lX@FMV>sjvEmmw;E5y07mmHlpt$`dsM&y`wmu zy8by=aHm7-`XRI@{puT07JIB@g8ZZ~zbNTuLjzP3z$@o9x8&)tJiTlg#z%{8$g`F5 z;vX?D2h>XW)23M36zX429jcUXSLVLc7}|r*83%8TXa|)%%6wjFRpY@BB4K}c!gS7| V#{QVHktY7QG|}Y3HfI0C1U|wGU=6M1z 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 rP6EyW&I3$a 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 diff --git a/app/SEQ/EuclidArp.cpp b/app/SEQ/EuclidArp.cpp index 77ffba2..53a8776 100644 --- a/app/SEQ/EuclidArp.cpp +++ b/app/SEQ/EuclidArp.cpp @@ -25,20 +25,20 @@ // #include "../squares-and-circles-api.h" -#include "../lib/misc/euclidean.h" +#include "lib/misc/euclidean.h" #include "patterns_303.h" #include #include -#include "../lib/plaits/dsp/engine2/arpeggiator.h" +#include "lib/plaits/dsp/engine2/arpeggiator.h" #define private public #define SemitonesToRatioFast -#include "../lib/plaits/dsp/chords/chord_bank.cc" -#include "stmlib/utils/random.cc" +#include "lib/plaits/dsp/chords/chord_bank.cc" +#include "lib/stmlib/utils/random.cc" -#include "../lib/stmlib/utils/dsp.h" -#include "../DRUMS/resources/peaks_lut_env.hpp" +#include "lib/stmlib/utils/dsp.h" +#include "lib/peaks/resources.cc" // This app is copiled with soft-fpu - for running on teensy3.2 & teensy 4.x diff --git a/app/SEQ/EuclidRythm.bin b/app/SEQ/EuclidRythm.bin index a7e418d24c0939a28b4ea34929f78d96d50eeb93..f81438b2a518ff3c873af4a9cd859c96c0438905 100644 GIT binary patch literal 4808 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 GivI)Q%oB0| literal 3776 zcmaJ^4R8}>8vefBZ4=wrrhha-E1RTvZP6jMh*fk5X}VjQmR2lt;CYkAHgwl3H70@6 zJ8!Nn{`4FjD`hYcxGCZt1vyOvMVzA(PPrL8hnvQ^b3BhKqj%GmcuvzIU5PdKzR4n- zp6<+(=X-y?_j}*(Z#Nt5jZJ1!My41-Hf0e~PY78_2?3F40U3ZB0GR+V6Ad66kOR;G zasf92^Z?Z50Z^9@KwSX0Oo20V6GSob2S5StTF(OwG4n`-2%WEKLTKkasUsg0AP$t zz)HY!z^#A|N-RLcPf5!G7`PX>2zWQ}mypn5U>W4sfSZ6%06zu%7H}0XKJ{s`-hl~U zd#rbaT|Xxt z?<4JQpO5(3y>556&$S(VeQy6Y5A^VO-Pgi8-Q6AE(fRx?uOGDEal1~T`aE#Q7LQNv z_JOy%yHoCVL-*dp;?u^X_<3uR#?kosX(fov9bki9+512b66w?a<6m;TtDo;57I|;Y7#z{m zy}+jI|CHGggNX4^uRqSFDtkrHpK1dg*7j{3-fuOdnGR0CInoM6LO`q(sK5(jQ#ICC zC-Hu}ZF;8ZS=-a0;YgOC69xn_NKMpyZkjV^2nS+X4K)!XH~g}oyKqwAew(pxsgRt1 zDS0wZbM+H+g-NIqHcp(Z8;)t%&p*ro+iy~~Lg5hf{ro(;`xc>9sE?kTrrVoms4gS0 zU(ttfjz1ClN621cW@0&-D~7BqYPDZRY684C7+c|P;MfjlO+0V}6y!MBd3i==&$QTqaCw+s7`8h+F z8DwA7>`c!8DQTT;x<6neb0a-F9b^Tp&`{gNi>a071~oyLBP|tC#^we==A z=3m8UVx~g6ccQq^-kV@~Hu&clUsP&eqR=&Dxg(kpJZ5Vh_c>S-?vulYAwxjitLQ9{ z@vJ71UwzCr7VS!9HmL9xviwB!VMkjD_*yf}iv_u4NTjQnAZGa5`Mt`GmenJ!>%6Tq z`+L-AaZMtxTC<1lefL4;?&W`6Q%UCfdVbtM1Dh4bs)tyMjaBX-Z;i&{u^GJ}&IaEpJ`gkI-DGF0GJ|v_Yhg_R@sMq;u;xz`<{aNYEUj-If9UB3js6Y#r(2jD${@8@y=zMt`90N>9wqooa{5SOvS zm@QmfPs@cuGc_gWI~KTj;WyGx7m9H779;E?y_tZ$b-`GAwY`2Jry&=kw1AH_Bd(>q zz^A;{F7W0Ih{Frm=k5i(Z7TmwBA8nZ0N?$Xn-!pp)}+R`(@`N;O2hKAwzH9nHjH>s z8cf75pM`sgCKgrq+77lcQC=Fb)s9PYx6~<5xz0?pom?C$yyeU^F&}n4sqk&d`P~cc z^23rWbMX$6oPS}#gz;g`EysAZRVfc7X6IlQS+l*|H>i}sj@_jUTdXFg`i$}l|0J}3 z20nAMY$BiV_5r0M)#8iDr#){XVr0rddOXga3{ez_ym_a?v2Aa7Qvo|e&?UM0l$D#N_Nw?pBry#O|3 z8B5N0B^Nn}iSERC!AzHr(ACYCW;S4^bf?}y|B$Y+QZN{k^BD`fAV2iK<`)7#&DHu- zUbA0e?5nvoLS8MY+-`C_6G}%bUT1(FRF4vKl!22L5II+*`j^PA#LQPrb-UepWye>i!&ySMkR!m`Ca2xb z*as7r=D9?1^?PBkDzs{s?Va$;F;4S-Bty|&0JL2RKWEDprp_~Xi}iLu9-dKsgC1s* z!F}DbeaQ)Z<~S+asBo+4%7FNL+n3R-hO8g7d&VS)(}l4Be!y+h#Ks)|SkddF3K?Kd zCFkEyj7^a~F!A5Dee?r119zc@9w-qoVsXm}0=El19K*U_X V4!1HfZ)i^OGRy59DC2*G{{qr!zB>Q_ diff --git a/app/SEQ/TuringMachine.bin b/app/SEQ/TuringMachine.bin index b47aec746932441c7cc87e3bc1c9b7dd26afd0b5..864cf9238d5c8dd1f7c21f1166c4f6c43a4be548 100644 GIT binary patch literal 4648 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 diff --git a/app/SPEECH/LPC.bin b/app/SPEECH/LPC.bin index 47420e62fb5aa8a90c4ab0679b37948653fad474..c3f8ba5455fcdd9ff1abc7a8fcb652ba2aa8acc6 100644 GIT binary patch delta 4690 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 diff --git a/app/SPEECH/SAM.bin b/app/SPEECH/SAM.bin index c70e83381f4cffe6b23c5747d617ca0c39d329fb..b9835fba408b2979e749c56fa6768b99ff7a3052 100644 GIT binary patch delta 17835 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 MpehJPqbt|^4?I)IR{#J2 delta 17255 zcmbt+3w#tsws&>UGnqgp4`GrFVKNgT$pGdB1j02TG#yCL1dIp<1>_;VBjB!AceiH} zbXh?!nTZ+_#R%xd6+#%~UR-1eh_1T2I}x~xJeKH%1PQP+kdTG|^ZifHr~aL>YAKA!Cn6g_tgEujC-cABKD+;u}PB|JD<$hN-tCXw0LqL9f;ob zq4zL^;UOA?&;S|?iU37|D9s3>v?vgzMT3mh&by=`c!>iI1;v9*pac-5nL(5`3`A*( zAW9n!qBIML(vm=wW(8S5HV~yjcO~u4P}+!4+DL?ymcp3CC@~d8iD|(^W)G!}3Z;!k zNNHn0l$H*nv-}ln_89d@5)>hr+|5(3=!YpAm|$4aJ*7@w1^YClr1Z z%0CzkCAQKMWUwF<&IpB@Lt#az!m3bwcPNYvrC$#*Hd&eSw=5Js84A~iLT@OHAnU~6 z3?-BRM<}5tRN#ClZV4fh6ADX1VMQo>9$_6IL-)ZV({5eA9SBJu7 zp$h9L4*9G$l+l3j-+5-FuGkX_TSDOvp|Fc*7E~ciRKh`_Fg_F}g~HTOm>vqphr&sr za7rkQFABYsgu(|x;lnET#jvu7pD%xG<&yc2Jhyb|lI8B>;SWB!aPi{Oh07N{HUF`! zOx71!ipYwU%b#5GG<#~vQ%^nfvn3R+ShA8;EPw3jl}lO0b1PS{rxrf>Jhu{M=RY}rX$5nqMxVFe8m zW%%Xn(ic=yM_1LBg{v*Aw-j2I=j^4jG&EI8{_$n19VX(ikJ61F zsbq|5v4mdej~rg zd?=o`r+lYR8F7-Oe7&ztEb(!J$M^uDU=#0?)d>Zls)DO6i9S^%(p7`K=S<(vi(2`h zxn`>V>uO9W=Kugux|NFw-iF(RKOB_u@4TqGxRhPS3( zIni4nmYRS+KB#d8wThRYL%EqK#WI{ZbDRDB;V8S6emO~Q$ zM*rx$r;G%bzAl@iN_@-^NL|(Rl5E=Xl=pRcSSIgAdM4+dCzb<|fc`=8m^h^MW@?0Y zTG3pYx6GOs?c;dPHMa$L8Ca@*UxUbHpZ282S;cB_45Uu>rU@?DVvP}`18hRqDc&S;_^;!i~syOJs$#Ze(g37hKP}8Na;Nnzu z=>ok^dv-P6lkjej)BAb#Y0ph-Y8*Hvkx;&l_ytmlqZMj1)!r5~Nt(RJ&mws*SN{^) zq;A@K*7xdC^A*pHF>xn`6l?vQp;z$d5bTVb(9j||!6vm6y0pStK2xel6(x1o zw2Ioo8rj(ViN8LQ`KleoRK?LKekkhwvQF>c9B%M)nhTyq=+(_!;x8;#W>dG8+S9yI zGItl3RWtRdr@Q6YLuqN9UQfZL7K5KR%)hp#N8MrI)E$FW)!+>);0F7-!Sk=Zc9Y~B zA#Bu8N3ue%9q$VP+iU1E&O-eUu?A*KOClk$-UOK&&Sj;gl8_iV+_-S+_fc9>2qby$OA*ZOaBYL>$T-v zhib6#DwoUbm{;<&CpXA%O^%Sc;(*=XV%)nyo)LEtjUR*X8@)b{xaA!GYnd z3wUxxLx+kti%@nUmv!93#$53R#uzZxvXmMLI_AIRc;BC_;_UgCE;zWlC(Oq^8uua7 zjl10Pj0~+?;_J&%)RLuhC!A2#E-%*kxp1hFu6O?d=DI(wR0wm`7OLyR>b{Fpb%Zm0 zeQluuX3F6`tWIA)L8vX9FX-xj4IW&b2BA4aOR>x}fvi^n}j+K#@wS$9&fCOEU@kE^bbo*5!pTEriX9^D2U-#cAs%2;M?nJzqCp(EC+- zh)5!FnmRnKoNfNK)w0HIz~uIgtao4_174|f$#zZs8rd}2uw#vEek5EOKR`_-i1V*i z$?feyETnj_0CEP4LuR&zN<*3DEO$EX2rO;qj7pgL46&) z2NnDxPLBcWEexyI)y<oRXV!(5Vf_ zJ{0v1Hfgxf+>2Q_@^BKJKv&LAUh?mO#zu`**PVz zo`ccA=E|DVcwsKgPEL2pn=M-k>rju`XL|$o|Ms4e=cK$MTe4B3G-$Y|w55mZWK&Xj z2hU-p$hg3^|5O7F0<$R!Yji&)LK&R4Jz1R+6{01%czuJY=)330VIJ`s0SEALb^_8+ET20Rwt2hg*dJu`RX!Bc+G(4|3My1~8-6Kv- z9qyfwI?S6W4ryPSI9o9I16e`bOc_&C2|ebkt(=gW?@Mx$%A>3=%aS>XfW8+{aLSzC z-%klqsY3PDQX@q+gy1wKmV{WDpu*5I@1Su4s@fy|TU%_X8}ofRPMw?CQrcZ|0xU|h#6C8U z^Qk!np45B2r2j;x(FW+Dy-qbr42}!avt$Q*#Mj!$UQ9uDXvJ7(nVIbRw1=7i!>v-e z23c;5a$@0%Co8x^>A%m;A$;>5hpzixv^tT=Z2t{mNVpR(wo z|7qUJ>-26T0fQ8~^f+&fMqe%;dZMHF$zJnwe1`dda-0RuX%M){a84~D-1K-)#ryrj za2vH2j&26Cy(C+fQx_o2ntA3pt^Mo>Ju7w>LK?cce+3KWzK2Glz=4 zMiCxUY_R2~3{vbq!3am)oU}(Aeddov2X8HrM3XO-`b05JbEu2*I(IehFFM=4zi9V> z@+h}Te`asd&QO{(5a45NG(k=Rkk1ny*)$eDb5M&$V3A$ZLr!;G+xDW(0~q!SH@E#3 zsVeq1JqL8!by7;<^sT}vrjJwSnK$HN5}d5O&dJ+?3&mU7ysq3n(I=D&d3_a5oN+56 zR?!n6LNUzj=4cWS@HmMb7BEY804vJt4uzwI@_3&G_F%R$`S#K7}=KOVrvxELN!|_C(vxbTT(`PsqJ`=rq-9y2*@t~n8c=810JA}H2n;9U-h;` z@sZO{Dat(*QZ9`wK}U%7t2p`$&3!-HQzk^@5@!r>DT7!Grl0SIe7?v}jwhB@*+W?Z7}qx>5^&-hOw{D7515jWEVa;>Zw5P@wzVo@}Mf zNuf5AEv(o>JWAT{QgY&NQ8e!sMFZVm?HQ3@6n(3xnWWIsAF@uc=*jF`S%dn7E*HiM=6m{2YFA{G0R&LxC59Mr%qd6yFH+ehe9o1bv zvLf-gXO4M}5YcLsxzWldQpbGnI^MimTEXsWzVw#EAU>Gb;$ilSEqyYuF<$tDSKXyw zzEf1W&XLPvvHB!#s1}_bJ^lzb#^Lj?y>d<65w3&Kci&V*&J<_k0EEh}l2ejPwakCn zvB@9Jb7^r$`H*@e1VEHT+y7F_Z0(>UhXEFiuz-r>TNbDq-19HHU~8NrcRt26X5np2e}+Gzf?@)K#xPq=J~+bI$%gipZ! zW()TD=lM0X*PDz*ASL^Cxg=w*Hs7yzk~&n1Nzh5}ByBC3$Mp5_w3(+?p~b303bWbb zU)oVLBck|e~J-O`tVBT-E>LbAx&(d`q`N0GsvG7Rv z0yE!H%72S)!|+c%j#aC59B2ehAQGAQ?!q8E%y&=KDf#Ph$QY0|rK(0YMV*p&k6Qo- zSkv>2K+p7C!5*irIbER*J1(lL8?1=a-KAL@rn9h-k8zBDA%drw)0zJ=i4# zbI??Giqk@N!~1w%K_gAd>tx%5tT9D`?^I?Jz<;?XISXKbYn! z2OlQ!j~Al7 zNj%ra$V12snqj}mUFqdP-JP zdPOh3yL&q+Rtnm%S05cupuzOiEH$t5K;tR-u;PLAi{28Ch(o z@2NKxJ71^tJvCt=nh@JBNRe~YNhpzwIiW^KLBl)Lw~cEqoGsEcV`-C>$@_2gZ1DDh z|A|vcapa5rX&&d|mLSE;Gjllu+KXVBhd0yumN=d?i%1Zru4ip)*{ddlMtIO+Z z+;#|aE`RAw5VR=AIjZ zh7=ku_Ma^5E~GMCF14;#xvs4xKVf@*E10V0{*Qx`xb7}|ScHF)@zLq2O6>{7nE(5= zeZ)Kd7N!q+v;RR)rU|2|^lc`Uf$Jg-#pkys-@-Sq^O>z7bCsag?M?8Z(U%NoTl|snV3*YRLYD$-G2l`UvnLxRiM=%`ue*Tw2rxp zh7FO7yB;R}EUv4mSTIwwS@OFDIB5`?FEu#I8BWTsCyAAE8otKV7HEzp#7FqKh~u95 z*VbMyXU9EepCi(|k4_#-&dpF)6`b~{4kg5M*~dMnJ(OQ^P8gi56_gUS1$2%}Jm_4P zc)WJATtcD50Zi_VpkiyU|1Y8j-!JmP$GGAdU($E74(sSLG;BG$;lXn|=`AH9hpf&+t+Yvo#NG?ywo>2!~;q@vscqGS(LE@oVr6 z5WKnb?KF+uw}<4Zq>zvjUuoviWysD@yG%l95^n=zBQb{f?EgFFDcSfoV?9njGvSmS z1Bct3`3l5ZvT3R!Oek%f{ke9j2Jlh>2mf!pU8@{<+k~0-xaI8ZgfMbWs{kYKR@KKn zUs8;cvFIFvvtHG~+u{IcbswBs{evt9lNsSjt;=rd#jwP;Aal-R)I2EVGzklm)Hq^B z6Q#a3?j!)i`vELf0K})UgmCNxYYTsO3xL!{YDr4=i#w@x2iki@QTLf1EAhog7=;pF zLx#%MfTo%DtE(Z-(u-)XG^w}0ZYS=Kq5k6Q0bMLk8pFAaFFo-=vx?>2yq7?H0pA@6 zC*YS0lqz}=4Px0l3DGAoQ^>$yYdR%=k;9T+mG6>_L0iwUYh83Q_zAY$O*v$KV3$B} z6PQ73SEZ}m<(6l=V?hyo%!9n{zTPrPrPV__-wV564t^=S;st^O!u2%Zb*m`&w0AN1=!`zG24VH zOgf)>SZkIz$GoOM-J#Na?)f)d56CVHjPCT(iTwHY#MIPV*(OVAV4HQ+V>3-9u86C| zv*5~2Y&CuBaUez2x(?C;DP1Us%K__&HS20w(mq(RerAmk8{6smU+w(cfc~Qzc|xvs z13F_dvvNr|AHhh$v;?AFH$^euZ=6x0ON_;F@Lcnko~5Q*^Bbu1hMe;R@;Rjjbtau> zW$H!dTkf)8UsGjR+P7%4Lj1KC`;_wW$mF9}=h^RK^Qm2X-3y_2(5Ygk9RkA%9lPt{Av=FMTgzB3oh*}6ZtOz)L_{7%-S50Ff5fiAziiA{> zps{_^9?F4{BS#|PDU_wQHTPzX@2fPDa#XgRy*cChaz;=NZ+pKtXKY{2os`4b*0(=m zf`Lw4V8V2ZLyPQiOzzoShDzWj9`}3+^r(hJ@S-hAjkxf@e07c*EDSZW{oo@49kn=o zP6rLXEjij0cIoa)e&Z}0Ch~%@@Fd1Et)<_9wt?OT4FkOw2m}+)%M={jZ&&)T+`9$m&m*_jU^*dZddCy!cLPl-Kf_1YO&z7GvTK!> z%5d-xlX?|GIPSbEj`*s-O zxLi^hirOU{qmvP@Teh*yC|Yn9(v%yI>D-v{t%q|x@v-_+)=bcp!D5Vr`xUrj5xJpY zBhIPfE3UNAiAZ*?`bu^LC zEbVUZApcz~(EVADvQ*abSv-b_CHs(vbJHxB*Li81sy^X)ots)3T!6;o8U*ttIK%3> z+!(A3VQw{)7>m?=Uj(+amTXP!4>+*QzC$nU_h_oswRj%_8mSjJQ7hFNg)cn^JnCw# zYgfBw1MKv9(3fPdzm3!RB01MpAx-@bUme}UUHUPO`635bUlroDwGqC^2y+jYlxDKw zvyPCO*uzJ$)ZP1rXH1Xcc}E61PW!5yZY(*cOT+sepz(S)>(T#q9MARWm#TX7)~_y0 zI@{-$b#}Y(A-+8e6YH-EzvJJD>4~^Jw8xNj068BDrXKcNq<^e`ClP7P4iQ=9QI0HA z54ZGHIV1h6%YV zE^NN6v*@mKZvdg+R* z!i~cQWK7VyO2*qYQ`eT@5#|M>(=*fI4X82$}3+QX!>Q6l@>?x zQ!UAMFL!5@I7EzZ#U}9*&T@z|nA;XC&67AjvOo^7uY)g2Lh0N=E8XpPL=d$uA!&^={Oz$OuE zDi-LT)WhItDFPPPh<^&*A~Eh7MxYw2Wz+ZAzjXZGpBOpnyT*_w6HcDYL44{y@QGiF z42MH;%(KQ+MvlipN{JDF@Lch(623Cgz8A~UK~*bi;EQZ0${zP@kf!1`72nn3RM?vj z;Kmdjk3%8hv>U=)7p) zf2cVd$#j3ng)6#1IXaGbEAr3g#>mg#r1a0TkUoRb)7@w3h*}tHT(?aY$dL`DWRHzT z$_z@Whe$rK@9Uue1bjHcfFBhEXk_l6?E;}ZQ6U3+6BkEN0Iw9Pxofz%DJ|TP<^}(%W4)oR6x@{AaMiY{GoiqDV$pUVzF|98z z-2Lpt1kT`ob>fmC%6ViuvuNp_Ky(${Vtms`b`Q=qNeA2Fg%(dB?W=wJ(OpG)YWl9* zq`iNev^Q^)wz@4`q>e9XixY|CizpLFYw^e@DMs9vx3PUR{WXC;q9d-|Aes~DFK3rU znYzDwzV`V*_s#3d{E| zR`$Miy7TauX5}3AFGL3B`2x6uz%jFTlWC?hnU~r- zzoY3{zXS7dk`*^*=@QcQ?&E<#_mLjXLQ3Fz=}cTU1;;O1j^N{{vI9#x-*@jheV1|y zZ(&q7^HW{PIjJ;a#SycQi!3=eQ&n-D4ucTD4yo#T{^dGH$+>wdBl5{?p^&=d zT&dMO!82)qK#GV@&i6$SJ*JPYY^5^nsRIJ;cmpqrPeh zidicXE?n}T+t-R*@*mrojTGut<>U5}a}QH&CKQtnctXorc(DPOiB;)bPO~T8L}Sz? zpZ^-;^dK%(S{}h#y4a4d*L2Xo%}QBWX?T`H;ytADVJ)#G%kp1cu#hs3Lx%PpUuMC~fKb8b|~ z#FnLss~=S6;+(I4X`dZ>3%o5;?JzR8iMJ)pAovP+oR>fK~Qgl zDay%5ZiA^rwhz1ihoA;a{PUpRim6t?^awDOI_1U%AyhB4l(hpLsSlnx*qjk)`>xE` ze!6WSaLADt8}f1cEpPi@Zj+fG#=fm^Mo4+|$Sp z=nUrj8=I0MbxKW*v7|?z8dFp9IwQ7I_H<;w+o-uEH>3&#UTbvSMwOSL{{3WR=wMv+ z)x`-c_2h9&O1amTveY{!BeP*j^Us_p&w(W>|-B)J@A}|+s zr>RN%q$|JN{My?&QeO1V0ARmyh-3rX zTKWLHKUL~nzfC=W@eJ6DdHZX(QFI0rjoj|MP0ngGj^DoWOt^ScYP%hnS_RA_w*fO; z0rSp*Oe4r-k2m(3Y|*yEZR&dbbks$A$gnzYeM_0z9dX8nIdPa4of19m$mk-Dez;+o zoGZ;zE(x!~rSgVJQ_k@=>lv%~5f0`in|V>0{}hWwf1y);gGuN8wt?0%7os;b8qY8b z?BF1nKZ12)Vesc9^s5+BAs)Yxq17X-zTV2AoY@**5iEf^5>=wbg=3arVpv_h?LMqg zNYCU#X;_Vw6N7^Y(|0|txS)sS^MkZ0RrsOM`;MhWk0On?z=_3&KUMlW7v?|izA*cR zLl+)+y!#@1;pZ3s@WRrIFF*e1#g|`jUzqd4^^5HDI(E&FcX$x^uWVcz26FZQL; ziAws>eVkS8H?rEoJC&bV2D+24Srmu+diSoLoR23fjy=O~A!QpmtJk{^-ncGx=iods z=rT|IUtH!9L6^DDW6r&Hz5B82KlPa7|5uOso@+O|3vd2sJ9*1e&|Utjh3*mt-Q|nz z!EepAg^@*-JuLH6d`sV`x}%5=zW}nap<@akQw(I5P^&dv%?oOAspb42O$W0Cx}WNy z_wjJKr74dtUAmOI?h6oYaOhX1UxU0L@~{rm50sDMc7=)8z$>uP+K z>NXTwk!A{|HHFd=ixZ3JnoByEG^yMgw1~bkZV}5z&c+XGdGz+tLN!i@!jpNCU$3f9 zLGRPNmm;Rf>WVCBU8JVV@mw2S>BMzTv_olWD?%eh@OK(?78C(G5AuNs1wx~u zVAryuWz-5I6tNhV#V$)&MxNa79gB--ufkhM!Ea?*Rlbb*Be?bW>hSN5`Do3Y7m!nW z>cRs%KPa?wGY-gd%sANZqZdcMaPY!V(2y4@_C^$26x*aTtp(T`nhFEmf4*@ydgo>V z#82wPLk3Zg(4QKV%-kcUi^?Rgu0l7~+TIzmlcA48(_JMob{iW`EW|!zp@k58=e@g5uDd9El_a67TFFlsv zHqKVN&9gHMthMd@<*Q5^forHWPn5bF%1Yg(Wiw+qp6696wOXUqhZzP%QUl%oCsw$g z9OPd7q|<$JX~6x9=@$3p$Kt_C=N|NU@y=1pnz^06+2s&B!{!IvT_yuz4Yr} auU`F|SJtdqyLK(O%z50r^R4M0Y5otuWxY}W diff --git a/app/SYNTH/DxFM.bin b/app/SYNTH/DxFM.bin index 084fd1564b470d9060b4f872df4c0dade8d0870a..86da76fb9aeb0477f1314395d7c36405a1913b18 100644 GIT binary patch delta 22070 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 delta 13018 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 diff --git a/app/SYNTH/DxFM.cpp b/app/SYNTH/DxFM.cpp index 7241b41..66b8a4e 100644 --- a/app/SYNTH/DxFM.cpp +++ b/app/SYNTH/DxFM.cpp @@ -17,9 +17,6 @@ // ENGINE_NAME:SYNTH/DxFM;SYNTH/DxFM_BNK1-3 -#undef FLASHMEM -#define FLASHMEM - #include "../squares-and-circles-api.h" #include "stmlib/utils/ring_buffer.h" #include "misc/dspinst.h" @@ -39,6 +36,7 @@ #include #include +#include "plaits/resources.h" struct dxfm { @@ -195,11 +193,11 @@ void engine::setup() if (!strcmp(engine::name(), "SYNTH/DxFM_BNK1-3")) { - if (fm_patches_table[nprogs / 32] = machine::fs_read("DXFMSYXA")) + if (fm_patches_table[nprogs / 32] = plaits::fm_patches_table[0]) nprogs += 32; - if (fm_patches_table[nprogs / 32] = machine::fs_read("DXFMSYXB")) + if (fm_patches_table[nprogs / 32] = plaits::fm_patches_table[1]) nprogs += 32; - if (fm_patches_table[nprogs / 32] = machine::fs_read("DXFMSYXC")) + if (fm_patches_table[nprogs / 32] = plaits::fm_patches_table[2]) nprogs += 32; } else @@ -396,4 +394,5 @@ void engine::draw() #include "msfa/patch.cc" #include "msfa/porta.cc" #include "msfa/env.cc" -#include "msfa/exp2.cc" \ No newline at end of file +#include "msfa/exp2.cc" +#include "plaits/resources.cc" \ No newline at end of file diff --git a/app/SYNTH/Open303.bin b/app/SYNTH/Open303.bin index 715d38308f3546098eb8a721a7f12d79ade0eae6..177437f5f3bbbc837cbf7b453003baa6d1c37eff 100644 GIT binary patch delta 7845 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 literal 34964 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 br)mkONl8hbb_71=#6KA?0@r|BfD8Cv^V2Ws delta 20893 zcmb`v30M?Y)<0a;)eYFRh><8FB8wv8G6=Y&HQFLH+L&lGi|H}3k<}W<;1-!mW(pLS zpynmE<7nduMqENn2BVo6-xyJG2_Xq4W|DCUBr2#_cN(y@jER1~Qw_!}@Atgl_y70v zoW6CpQ}>>GwtMdFzVfy1#!=z1r;?{U7Re3a`~;3m{)FSIx^diCE6?#9$N2zI%=vbJ zAJQ%zU_?sb-vK71rq`Z*M(%}&FhDS%AD}lN91sGC0Q3RSClsIq^abbv)W-mzKJ?;n z0KJg)!vNIh zcL3@W2cSN~0n~@uXYyJxx0vUqz54{m6(UVXx)Es#(l?N9enRHBy?FRD3g~0ezP)6n zY}H(jdk^)NKWi11FQ4+Jr@ieh5zl%%xVwAPnOF|`5H;!J=*Z`Gq zbHmazGpD65O#kETxe4*y{Y*A8c`q!@b|(2ukZ0Q;AF*)m{G3I@6R2a`*JZ+Rv+pxWn5+yYM`>udneAZy-7F+t=4rCdedDfdC=xSyhPpeXg)K zI5jVoJFJ!O7p6R`>Ma%4=Tv=~BQ*%^c&%M+qwBEx{8)U7y+WqONHwvZ)p;Yg&OxJt3CxRz^k{OUypWSP6uStP&4j1)APR~ib zCeO%nW_^*>BYQ@+Gy97iXU?~daK}TFdrXQ*ccecwd3*X)xAfFh_si3=92e8K&xy*6 znv;+;W+R}QixjM!r#$_b;wv3f!yAvO{j1N;am@)zSd(<)v@vaB zx+SVXO|0%Rc{vT`c?@MnwW@EdR=MgU4qf_k2WWJMUQ91r`l0vbGzc0%y~4+qDOpm9 zVi5Dv%9Ko7y`nQWC>c+Mlqngpw-{$z%)XPNnXfoh(XYv2yQCl42|J~uucY->LM2cxF|8VFSdBHTR@cT6 z0}|PGt$%ZDz+(HDKSw+~;z|A0(XXstJ@$#EPmddV)%{q5@}e`f$I$S3t}Z~v`i|Y`^UZzZUUhNUp)z|1? ztBkd*-1v3sG-vOiM;{h$`ssw5CIRF$2fGfiOVSq#=gbIt2Dtt^Xt-~EVFcTDFxc51 zG(h*CMrY{5aa~EO!U1F@`tN)0;g|G%h|wnI`|rJbE9NjwDh^CHS1bdF&gR}}df{e& z!I>BmZFsT1K}mDY4oTyuIo}LP;RicgLxxAu+IMGxAs9%MFM>=n&{Cvtzs^fb zS-G?&i8&|s88e`~d0=^?#Tc_`0=Rq}jf2MEez&XjiG0J>?t2S!-$xE+>pB^ z_Y1Hran{7%K_mLj*)r#t8eF|xF&K&UW0DOUb)LFKhpxCSI?tAc_ijCQ@S%JzwyfU4 z%Ebnym(H2l1G`IaO4{`^Yo)A{

ph#} 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 ZEGzG&)rM^IwlZ%Ea|Ts}J7X*}{~w)I31R>M diff --git a/app/SYNTH/plaits.bin b/app/SYNTH/plaits.bin new file mode 100644 index 0000000000000000000000000000000000000000..f89fd3f6ad28d505a80dcc9fde932c6f47ae7aa1 GIT binary patch literal 118800 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 out, output=1 -> aux, output=3 -> stereo +} _mode = {}; + +uint8_t *_buffer = nullptr; +plaits::Engine *_plaitsEngine = nullptr; + +constexpr int WAVETABLE_ENGINE = 5; +constexpr int CHORD_ENGINE = 6; +constexpr int CLASSIC_VAVCF_ENGINE = 16; + +void engine_free() +{ + free(_plaitsEngine); + free(_buffer); +} + +template +void alloc_engine(size_t mem = 48) +{ + _plaitsEngine = new (malloc(sizeof(T))) T(); + _buffer = (uint8_t *)malloc(mem * sizeof(float)); + + stmlib::BufferAllocator allocator; + allocator.Init(_buffer, mem * sizeof(float)); + _plaitsEngine->Init(&allocator); +} + +float harmonics, timbre, morph; + +bool is_drum() +{ + return _mode.engine == 13 || _mode.engine == 14 || _mode.engine == 15; +} + +void init_params(float hh, float tt, float mm, const plaits::PostProcessingSettings &settings) +{ + patch.harmonics = harmonics = hh; + patch.timbre = timbre = tt; + patch.morph = morph = mm; + if (_plaitsEngine) + _plaitsEngine->post_processing_settings = settings; +} + +void engine::setup() +{ + const char *name = engine::name(); + + while (*name++ != '/') + ; + + if (!strcmp(name, "Virt.Analog")) + _mode = {0, 0}; + else if (!strcmp(name, "Waveshaping")) + _mode = {1, 0}; + else if (!strcmp(name, "2-OP-FM")) + _mode = {2, 0}; + else if (!strcmp(name, "Formant/PD")) + _mode = {3, 2}; + else if (!strcmp(name, "Harmonic")) + _mode = {4, 2}; + else if (!strcmp(name, "Wavetable")) + _mode = {5, 2}; + else if (!strcmp(name, "Chord")) + _mode = {6, 0}; + else if (!strcmp(name, "Analog BD")) + _mode = {13, 0}; + else if (!strcmp(name, "Analog SD")) + _mode = {14, 0}; + else if (!strcmp(name, "Analog HH2")) + _mode = {15, 1}; + else if (!strcmp(name, "Analog HH")) + _mode = {15, 0}; + else if (!strcmp(name, "909ish-BD")) + _mode = {13, 1}; + else if (!strcmp(name, "909ish-SD")) + _mode = {14, 1}; + else if (!strcmp(name, "ClassicVAVCF")) + _mode = {16, 2}; + else + _mode = {0, 0}; + + voice.Init(); + patch.engine = 0; + memset(&patch, 0, sizeof(patch)); + patch.note = DEFAULT_NOTE + _pitch * 12.f; + + modulations.timbre_patched = true; + patch.timbre_modulation_amount = 0; + + modulations.frequency_patched = true; + patch.frequency_modulation_amount = 0; + + modulations.morph_patched = true; + patch.morph_modulation_amount = 0; + + memset(&modulations, 0, sizeof(modulations)); + + patch.lpg_colour = 0.5; + patch.decay = 0.5; + modulations.trigger_patched = true; // trigger; + // modulations.level_patched = true; + // modulations.level = 1; + + switch (_mode.engine) + { + case 0: + alloc_engine(); + init_params(0.5f, 0.5f, 0.5f, {0.8f, 0.8f, false}); + engine::addParam(V_OCT, &_pitch); + engine::addParam("Detune", &harmonics); + engine::addParam("Square", &timbre); + engine::addParam("CSAW", &morph); + engine::addParam("Decay", &patch.decay); + if (_mode.output == 2) + engine::addParam("AuxMix", &out_aux_mix, out_aux_mix); + else + engine::addParam("Color", &patch.lpg_colour); + break; + case 1: + alloc_engine(); + init_params(0.8f, 0.8f, 0.75f, {0.7f, 0.6f, false}); + engine::addParam(V_OCT, &_pitch); + engine::addParam("Waveform", &harmonics); + engine::addParam("Fold", &timbre); + engine::addParam("Asym", &morph); + engine::addParam("Decay", &patch.decay); + if (_mode.output == 2) + engine::addParam("AuxMix", &out_aux_mix, out_aux_mix); + else + engine::addParam("Color", &patch.lpg_colour); + break; + case 2: + alloc_engine(); + init_params(0.8f, 0.8f, 0.75f, {0.6f, 0.6f, false}); + engine::addParam(V_OCT, &_pitch); + engine::addParam("Ratio", &harmonics); + engine::addParam("Mod", &timbre); + engine::addParam("Feedb.", &morph); + engine::addParam("Decay", &patch.decay); + if (_mode.output == 2) + engine::addParam("AuxMix", &out_aux_mix, out_aux_mix); + else + engine::addParam("Color", &patch.lpg_colour); + break; + case 3: + alloc_engine(); + init_params(0.8f, 0.8f, 0.75f, {0.7f, 0.6f, false}); + engine::addParam(V_OCT, &_pitch); + engine::addParam("Ratio", &harmonics); + engine::addParam("Frm/Fq.", &timbre); + engine::addParam("Width", &morph); + engine::addParam("Decay", &patch.decay); + engine::addParam("PD-Mix", &out_aux_mix, out_aux_mix); + break; + case 4: + alloc_engine(); + init_params(0.8f, 0.8f, 0.75f, {0.8f, 0.8f, false}); + engine::addParam(V_OCT, &_pitch); + engine::addParam("Bump", &harmonics); + engine::addParam("Peak", &timbre); + engine::addParam("Shape", &morph); + engine::addParam("Decay", &patch.decay); + if (_mode.output == 2) + engine::addParam("AuxMix", &out_aux_mix, out_aux_mix); + else + engine::addParam("Color", &patch.lpg_colour); + break; + case WAVETABLE_ENGINE: + alloc_engine(64 * sizeof(const int16_t *)); + init_params(0.f, 0.8f, 0.75f, {0.6f, 0.6f, false}); + engine::addParam(V_OCT, &_pitch); + engine::addParam("Bank", &harmonics, 0.f, 0.5f); + engine::addParam("Row", &timbre); + engine::addParam("Column", &morph); + engine::addParam("Decay", &patch.decay); + if (_mode.output == 2) + engine::addParam("AuxMix", &out_aux_mix, out_aux_mix); + else + engine::addParam("Color", &patch.lpg_colour); + _plaitsEngine->LoadUserData(nullptr); + break; + case CHORD_ENGINE: + { + alloc_engine(plaits::kChordNumChords * plaits::kChordNumNotes + plaits::kChordNumChords + plaits::kChordNumNotes); + init_params(0.5f, 0.5f, 0.5f, {0.8f, 0.8f, false}); + engine::addParam(V_OCT, &_pitch); + + int32_t *pchord = (int32_t *)&static_cast(_plaitsEngine)->chords_.chord_index_quantizer_.quantized_value_; + *pchord = 8; + engine::addParam("Chord", pchord, 0, + static_cast(_plaitsEngine)->chords_.chord_index_quantizer_.num_steps() - 1, + (const char **)plaits::chord_names); + + engine::addParam("Inv.", &timbre); + engine::addParam("Shape", &morph); + engine::addParam("Decay", &patch.decay); + if (_mode.output == 2) + engine::addParam("AuxMix", &out_aux_mix, out_aux_mix); + else + engine::addParam("Color", &patch.lpg_colour); + } + break; + // case 15: // speech_engine_ + // alloc_engine(false, 0.8f, 0.8f); + // break; + // case 8: // swarm_engine_ + // alloc_engine(false, -3.0f, 1.0f); + // break; + // case 9: // noise_engine_ + // alloc_engine(false, -1.0f, -1.0f); + // break; + // case 10: // particle_engine_ + // alloc_engine(false, -2.0f, 1.0f); + // break; + // case 11: // string_engine_ + // alloc_engine(true, -1.0f, 0.8f); + // break; + // case 12: // modal_engine_ + // alloc_engine(true, -0.5f, 0.8f); + // break; + case 13: + _base_pitch += -24.f; + alloc_engine(); + init_params(0.8f, 0.5f, 0.5f, {0.8f, 0.8f, true}); + engine::addParam("Pitch", &_pitch, -1.f, 1.f); + engine::addParam(_mode.output == 0 ? "Drive" : "Punch", &harmonics); + engine::addParam("Tone", &timbre); + engine::addParam("Decay", &morph); + break; + case 14: + alloc_engine(); + init_params(0.5f, 0.5f, 0.5f, {0.8f, 0.8f, true}); + engine::addParam("Pitch", &_pitch, -1.f, 1.f); + engine::addParam("Snappy", &harmonics); + engine::addParam("Tone", &timbre); + engine::addParam("Decay", &morph); + break; + case 15: + alloc_engine(); + init_params(0.5f, 0.9f, 0.6f, {0.8f, 0.8f, true}); + engine::addParam("Pitch", &_pitch, -1.f, 1.f); + engine::addParam("Noise", &harmonics); + engine::addParam("Tone", &timbre); + engine::addParam("Decay", &morph); + break; + // engines 2 + case CLASSIC_VAVCF_ENGINE: + alloc_engine(); + init_params(0.5f, 0.5f, 0.5f, {1.f, 1.f, false}); + engine::addParam(V_OCT, &_pitch); + engine::addParam("Morph", &morph); + engine::addParam("Cutoff", &timbre); + engine::addParam("Harsh", &harmonics); + out_aux_mix = 0; + modulations.timbre_patched = false; + patch.timbre_modulation_amount = 0; + engine::addParam("EnvMod", &patch.timbre_modulation_amount, -1.f, 1.f); + patch.decay = 0.5f; + engine::addParam("Decay", &patch.decay, 0.f, 0.99f); + break; +#if 0 //TODO.... + case 17: + alloc_engine(plaits::kMaxBlockSize * 4); + _plaitsEngine->post_processing_settings = {0.7f, 0.7f, false}; + break; + case 18: + case 19: + case 20: + alloc_engine( + plaits::kMaxBlockSize * 4 + plaits::kMaxBlockSize * plaits::kNumSixOpVoices + sizeof(plaits::fm::Patch) * 96 / sizeof(float)); + init_params("", 0.0f, "Mod", 0.5f, "Env", 0.5f, {1.f, 1.f, false}); + param[1].init_presets("Preset", &static_cast(_plaitsEngine)->patch_index, 0, 0, 95); + param[1].print_value = [&](char *name) + { + auto i = static_cast(_plaitsEngine)->patch_index; + sprintf(name, ">%.10s", static_cast(_plaitsEngine)->patches_[i].name); + }; + _plaitsEngine->LoadUserData(plaits::fm_patches_table[0]); + modulations.morph_patched = false; + param[5].init("EnvMod", &patch.morph_modulation_amount, 0.0f, -1.f, 1.f); + + modulations.timbre_patched = false; + param[4].init("ModMod", &patch.timbre_modulation_amount, 0.0f, -1.f, 1.f); + break; + case 21: + alloc_engine(plaits::kMaxBlockSize * 4); + _plaitsEngine->post_processing_settings = {0.7f, 0.7f, false}; + patch.engine = (engine - 16); + break; + case 22: + alloc_engine(16 + 3 * (1024 + 265)); + _plaitsEngine->post_processing_settings = {0.8f, 0.8f, false}; + patch.engine = (engine - 16); + break; + case 23: + alloc_engine(plaits::kChordNumChords * plaits::kChordNumNotes + plaits::kChordNumChords + plaits::kChordNumNotes); + _plaitsEngine->post_processing_settings = {0.5f, 0.5f, false}; + patch.engine = (engine - 16); + break; +#endif + } + + if (_mode.engine >= 16) + patch.engine = (_mode.engine - 16); + + _plaitsEngine->Reset(); +} + +void engine::process() +{ + float a = bufferOut[0] / 256.f; + ONE_POLE(patch.harmonics, harmonics + a, 0.1f); + ONE_POLE(patch.timbre, timbre + a, 0.1f); + ONE_POLE(patch.morph, morph + a, 0.1f); + + modulations.level_patched = false; + modulations.level = 1.f; + + patch.note = _base_pitch + engine::cv() * 12; + + float last_decay = patch.decay; + float last_morph = patch.morph; + // if (!frame.trigger && frame.gate) + // { + // if (is_drum()) + // patch.morph = 1; + // else + // patch.decay = 1; + + // modulations.level = 1.f; + // // modulations.level_patched = true; + // } + modulations.engine = patch.engine; + modulations.trigger = engine::trig() ? 1 : 0; + + if (!is_drum()) + modulations.trigger_patched = patch.decay < 1.f; + + if (!__io->tr) + { + modulations.trigger_patched = false; + modulations.level_patched = true; + modulations.level = patch.decay; + patch.decay = 0.001f; + } + else + { + modulations.trigger_patched = true; + } + + modulations.note = 0; + voice.Render(_plaitsEngine, patch, modulations, bufferOut, bufferAux, FRAME_BUFFER_SIZE); + + patch.decay = last_decay; + patch.morph = last_morph; + + switch (_mode.output) + { + case 0: + std::copy_n(bufferOut, FRAME_BUFFER_SIZE, engine::outputBuffer<0>()); + std::copy_n(bufferOut, FRAME_BUFFER_SIZE, engine::outputBuffer<1>()); + break; + case 1: + std::copy_n(bufferAux, FRAME_BUFFER_SIZE, engine::outputBuffer<0>()); + std::copy_n(bufferAux, FRAME_BUFFER_SIZE, engine::outputBuffer<1>()); + break; + case 2: + for (int i = 0; i < FRAME_BUFFER_SIZE; i++) + bufferOut[i] = stmlib::Crossfade(bufferOut[i], bufferAux[i], out_aux_mix); + std::copy_n(bufferOut, FRAME_BUFFER_SIZE, engine::outputBuffer<0>()); + std::copy_n(bufferOut, FRAME_BUFFER_SIZE, engine::outputBuffer<1>()); + break; + case 3: + std::copy_n(bufferOut, FRAME_BUFFER_SIZE, engine::outputBuffer<0>()); + std::copy_n(bufferAux, FRAME_BUFFER_SIZE, engine::outputBuffer<1>()); + break; + } +} + +void engine::draw() +{ + engine::setParamName(&patch.decay, __io->tr ? "Decay" : "Level"); +} + +#include "stmlib/utils/random.cc" +#include "lib/stmlib/dsp/units.cc" + +//${SCRIPT_PATH}/main.cc $(find lib/plaits/ -type f -name "*.cc") + +#include "lib/plaits/resources.cc" +// lib/plaits/dsp/speech/sam_speech_synth.cc +// lib/plaits/dsp/speech/lpc_speech_synth_controller.cc +// lib/plaits/dsp/speech/lpc_speech_synth_words.cc +// lib/plaits/dsp/speech/lpc_speech_synth_phonemes.cc +// lib/plaits/dsp/speech/naive_speech_synth.cc +// lib/plaits/dsp/speech/lpc_speech_synth.cc +#include "lib/plaits/dsp/engine/string_engine.cc" +#include "lib/plaits/dsp/engine/swarm_engine.cc" +#include "lib/plaits/dsp/engine/chord_engine.cc" +#include "lib/plaits/dsp/engine/waveshaping_engine.cc" +#include "lib/plaits/dsp/engine/modal_engine.cc" +#include "lib/plaits/dsp/engine/fm_engine.cc" +#include "lib/plaits/dsp/engine/snare_drum_engine.cc" +// #include "lib/plaits/dsp/engine/speech_engine.cc" +#include "lib/plaits/dsp/engine/grain_engine.cc" +#include "lib/plaits/dsp/engine/virtual_analog_engine.cc" +#include "lib/plaits/dsp/engine/wavetable_engine.cc" +#include "lib/plaits/dsp/engine/additive_engine.cc" +#include "lib/plaits/dsp/engine/noise_engine.cc" +#include "lib/plaits/dsp/engine/hi_hat_engine.cc" +#include "lib/plaits/dsp/engine/particle_engine.cc" +#include "lib/plaits/dsp/engine/bass_drum_engine.cc" +// lib/plaits/dsp/engine2/chiptune_engine.cc +// lib/plaits/dsp/engine2/six_op_engine.cc +// lib/plaits/dsp/engine2/wave_terrain_engine.cc +// lib/plaits/dsp/engine2/string_machine_engine.cc +// lib/plaits/dsp/engine2/phase_distortion_engine.cc +#include "lib/plaits/dsp/engine2/virtual_analog_vcf_engine.cc" +#include "lib/plaits/dsp/chords/chord_bank.cc" +#include "lib/plaits/dsp/physical_modelling/string_voice.cc" +#include "lib/plaits/dsp/physical_modelling/string.cc" +#include "lib/plaits/dsp/physical_modelling/modal_voice.cc" +#include "lib/plaits/dsp/physical_modelling/resonator.cc" +#include "lib/plaits/dsp/fm/algorithms.cc" +#include "lib/plaits/dsp/fm/dx_units.cc" +#include "lib/plaits/dsp/voice.cc" diff --git a/app/build.sh b/app/build.sh index 130c6e7..3aba5a4 100755 --- a/app/build.sh +++ b/app/build.sh @@ -13,6 +13,7 @@ pip install jinja2 pyelftools elf_size_analyze --upgrade pip if [[ "$1" == "--rebuild" ]]; then find "${SCRIPT_PATH}/" -type f -name "*.bin" -print0 -exec touch {} + + rm -f ${SCRIPT_PATH}/apps.txt fi for f in $(find "${SCRIPT_PATH}" -mindepth 2 -maxdepth 2 -type f -name '*.cpp'); do @@ -23,27 +24,29 @@ if [ -f $oo ] && [ "$(date -R -r $X.bin)" = "$(date -R -r $f)" ]; then fi #-fno-rtti -NAME=$(grep "ENGINE_NAME:" $f | cut -d':' -f2) +NAME="$(grep "ENGINE_NAME:" $f | cut -d':' -f2 | sed 's/^ *//g')" +NAME=${NAME//$'\n'/';'} #replace \n with '' NAME=${NAME:-"$(realpath --relative-to=${SCRIPT_PATH} $X)"} echo ----- "$NAME" ----- mkmodule=$(ls lib/udynlink/scripts/mkmodule | head -n1) -BUILD_FLAGS=$(grep "build_flags:" $X.cpp | cut -d':' -f2-) +BUILD_FLAGS=$(grep "build_flags:" $X.cpp | cut -d':' -f2- | xargs) BUILD_FLAGS=${BUILD_FLAGS:-"-mfloat-abi=hard -mfpu=fpv5-d16 -ffast-math"} -echo "BUILD_FLAGS:$BUILD_FLAGS" -CPP_FILES=$(grep "cpp_files:" $X.cpp | cut -d':' -f2-) +echo "BUILD_FLAGS:$BUILD_FLAGS" +SRC_FILES=$(grep "src_files" $X.cpp | cut -d':' -f2 | xargs) +find "$(dirname $X.cpp)" -type f -name '*.o' -delete #--no-opt \ #-felide-constructors -fno-rtti -std=gnu++14 -Wno-error=narrowing -fno-threadsafe-statics -$mkmodule $(realpath $X.cpp --relative-base=.) $CPP_FILES \ +$mkmodule $(realpath $X.cpp --relative-base=.) \ --no-opt \ - --build_flags="-fsingle-precision-constant -DFLASHMEM='__attribute__((section(\".text.flashmem\")))' -DNDEBUG -pedantic -fno-exceptions $BUILD_FLAGS -I. -I./lib/ " \ + --build_flags="-fsingle-precision-constant -DNDEBUG -pedantic -fno-exceptions $BUILD_FLAGS -I. -I./lib/ " \ --public-symbols="setup,process,draw,screensaver,__ui_event_handler,__midi_event_handler" \ - --name="$NAME" > $X.log + --name="$NAME" $SRC_FILES> $X.log sed -i "s|$(realpath .)|.|" $X.log touch -d "$(date -R -r $X.cpp)" $X.bin @@ -52,13 +55,15 @@ touch -d "$(date -R -r $X.cpp)" $X.bin arm-none-eabi-objdump -Dztr --source $X.elf | arm-none-eabi-c++filt -t > $X.elf.txt #arm-none-eabi-nm -l -t d -S -C --size-sort --synthetic --special-syms --with-symbol-versions --reverse-sort ./$X.elf > $X.log which elf-size-analyze >/dev/null && elf-size-analyze -t arm-none-eabi- $(realpath $X.elf --relative-base=.) -F -R --no-color >> $X.log -md5sum $(realpath $X.bin --relative-base=.) | tee -a $X.log -echo "BIN_SIZE $(stat -c %s -- $X.bin)" | tee -a $X.log +${SCRIPT_PATH}/dump.py "$(realpath $X.bin --relative-base=.)" | tee -a $X.log #rm $X.elf +if [[ "$1" == "--rebuild" ]]; then + ${SCRIPT_PATH}/dump.py "$(realpath $X.bin --relative-base=.)" >> ${SCRIPT_PATH}/apps.txt +fi + grep "__aeabi_" $X.log && exit 1 -${SCRIPT_PATH}/dump.py "$X.bin" #xxd -i $X.bin > ./$X.bin.h #sed -i "s/unsigned char/const uint8_t/g" ./$X.bin.h diff --git a/app/dump.py b/app/dump.py index bbe3659..731cab8 100755 --- a/app/dump.py +++ b/app/dump.py @@ -1,11 +1,16 @@ -#!/bin/python3 -u +#!/usr/bin/env python3 -import sys, zlib +import sys, zlib, hashlib + +def md5sum(data): + h = hashlib.md5() + h.update(data) + return h.hexdigest() f = open(sys.argv[1], "rb") data = f.read() f.close() -print(data[0:4]) # sign +#print(data[0:4]) # sign l = int.from_bytes(data[4:6], byteorder='little')#num_lot r = int.from_bytes(data[6:8], byteorder='little'); #num_rels a = int.from_bytes(data[8:12], byteorder='little'); #symt_size @@ -14,11 +19,12 @@ d = int.from_bytes(data[20:24], byteorder='little'); #bss_size h = 24 + (r * 8) + a +print("---------------------------------------------") print("FILE_NAME", f.name) print("RAM_SIZE", (l * 4) + c + d) print("BIN_SIZE", h + b + c) print("FILE_LEN", len(data)) - crc32sum = zlib.crc32(data[0:-1]) print("CRC32 %x" % crc32sum) +print("MD5 %s" % md5sum(data)) diff --git a/app/index.json b/app/index.json index 61a86fc..b72dea7 100644 --- a/app/index.json +++ b/app/index.json @@ -1,6 +1,9 @@ { "apps": [ - "CV/EnvGen_ADSR.bin", + "CV/V_OCT.bin", + "CV/EnvGen.bin", + "CV/LFO.bin", + "CV/EnvFollower.bin", "NOISE/WhitePink.bin", "NOISE/NES.bin", "NOISE/808_squares.bin", @@ -14,6 +17,7 @@ "DRUMS/TR909-HiHat.bin", "DRUMS/TR909-Ride.bin", "DRUMS/TR707.bin", + "DRUMS/Claps.bin", "M-OSC/Waveforms.bin", @@ -42,6 +46,8 @@ "FX/JU60_chorus.bin", "GND/Scope.bin", - "GND/FFT.bin" + "GND/FFT.bin", + + "SYNTH/plaits.bin" ] } \ No newline at end of file diff --git a/app/squares-and-circles-api.h b/app/squares-and-circles-api.h index 1d6a30b..de5dc07 100644 --- a/app/squares-and-circles-api.h +++ b/app/squares-and-circles-api.h @@ -51,6 +51,10 @@ constexpr uint32_t ENGINE_MODE_STEREOLIZED = 1 << 9; #define EXTERN_C extern "C" #endif +#ifndef FLASHMEM +#define FLASHMEM +#endif + #ifndef M_PI_2 #define M_PI_2 1.57079632679489661923 #endif diff --git a/app/upload.py b/app/upload.py index a5b58d4..0f996b8 100755 --- a/app/upload.py +++ b/app/upload.py @@ -49,7 +49,7 @@ def sendFLASHDATA(name, data0): flush(midiin) data = bytes(name, "utf-8")[:8] + data0 crc32 = zlib.crc32(data) - print(" Flashing", name, crc32) + print(" Flashing", name, crc32, end="") midiout.send_message( [0xF3, 0x7E] ) # midi_out.send(mido.Message('song_select', song=0x7e)) @@ -64,10 +64,10 @@ def sendFLASHDATA(name, data0): msg = midiin.get_message() if msg: ack, t = msg - print(" ACK:", ack) + print(" ACK:", ack, end="") break - print(" sending blob...", len(data)) + print(" sending blob...", len(data), end="") i = 0 time.sleep(1 / 10000) while i < len(data) - 1: @@ -115,24 +115,30 @@ def sendFLASHDATA(name, data0): print(json.dumps(engines, indent=4)) # exit(0) +# del engines[len(engines)-1:] +midiout.send_message([0xF3, ord("U")]) # reset + def get_appid(binfile): with open(binfile, "rb") as f: data = f.read() - l = int.from_bytes(data[4:6], byteorder="little") # num_lot - r = int.from_bytes(data[6:8], byteorder="little") # num_rels + l = int.from_bytes(data[4:6], byteorder="little") # num_lot + r = int.from_bytes(data[6:8], byteorder="little") # num_rels a = int.from_bytes(data[8:12], byteorder="little") # symt_size - b = int.from_bytes(data[12:16], byteorder="little") # code_size - c = int.from_bytes(data[16:20], byteorder="little") # data_size - d = int.from_bytes(data[20:24], byteorder="little") # bss_size + b = int.from_bytes(data[12:16], byteorder="little") # code_size + c = int.from_bytes(data[16:20], byteorder="little") # data_size + d = int.from_bytes(data[20:24], byteorder="little") # bss_size sym_off = int(int(24) + (r * 2 * 4)) name_off = ( int.from_bytes(data[sym_off + 4 : sym_off + 8], "little", signed=False) & 0x0FFFFFFF ) + sym_off - name = data[name_off : name_off + 24].decode("utf-8").split("\0")[0] + name = ( + data[name_off : data.index(0, name_off)].decode("utf-8").split("\0")[0] + ) return name + apps_json = os.path.dirname(__file__) + "/index.json" with open(apps_json) as f: @@ -143,41 +149,45 @@ def get_appid(binfile): if not os.path.exists(bin_file): continue app_id = get_appid(bin_file) # os.path.splitext(file)[0] - print("name:", app_id) bin_size = os.path.getsize(bin_file) with open(bin_file, "rb") as f: crc32sum = zlib.crc32(f.read()) - engine = next( - (e for e in engines if e["id"] == app_id), - None, - ) - - if engine != None and engine["crc32"] == "%x" % crc32sum: - print( - engine["addr"], - os.path.splitext(file)[0], - "%x" % crc32sum, - "OK!", - bin_size - int(engine["size"]), - ) - continue - print("->", file, engine) + engine = next( + (e for e in engines if e["id"] == app_id), + None, + ) if engine == None: offset = int(1024 * 1024 / 2) - if len(engines) > 0: - offset = max((int(e["addr"], 16) + int(e["size"])) for e in engines) - offset += 4096 - (offset % 4096) + for e in engines: + offset = int(e["addr"], 16) + int(e["size"]) + offset += 4096 - (offset % 4096) + print("OFFSET %x" % offset) engine = {} engine["id"] = app_id engine["addr"] = "%x" % offset engine["size"] = "%s" % bin_size - print("TODO - add new engine...", "0x%x" % offset, bin_file) + engine["crc32"] = "%x" % crc32sum engines.append(engine) - # continue - # exit(0) + print("NEW ->", file, engine) + continue + #exit(0) + elif engine["crc32"] == "%x" % crc32sum: + onext = int(engine["addr"], 16) + int(engine["size"]) + onext += 4096 - (onext % 4096) + print( + engine["addr"], engine["size"], + os.path.splitext(file)[0], + "%x" % crc32sum, + "OK!", + bin_size - int(engine["size"]), + "MEM-KB: %d" % ((onext - int(1024 * 1024 / 2)) / 1024) + ) + continue + + print("->", file, engine) print( os.path.splitext(file)[0], "%x" % crc32sum, bin_size - int(engine["size"]) diff --git a/doc/cv_ef.png b/doc/cv_ef.png new file mode 100644 index 0000000000000000000000000000000000000000..37a9323af520c47bb6b5dbc041aee39cf836c37b GIT binary patch literal 1209 zcmY*ZeKea_9KPbC(PGA_q4UwzA>}BW!zR3_($ICjMv&CUXx9p+j*lq~@0=Y)J2h3S zOp~42R$b!b9E+GV#OV%as5G-9A|!3C;wy_qosW+_xbi zj%0n<`7i*$IyNRM2>=uL2~fNReE-Ge84G45k+I2m_*}_t*i{&zc zqj^H8j|Q7y`dp@XIe%$|Tiu{blEqp4XZYj8q?0ex&z%%0`*)ZBuGrmDO3F3iiXD9* zRhbyln>bBm>6iZ0NrsT!WtP+nOlbp$NWIc|jE2mwXs@Y80*f~mnZHu(b?LHLV7tK{ z7?mQ}gPn)SG1lD*-N4h!PRLkEDfYSBO|cj9^=(z_A}WO^Bksu! z%*9TT>&JOWW-l*Du$M7C9KPxS@UtDDiB>43R-yf8S7)v><^~E>ep_LpcT6JsXt*xH zgDh1$Z+Yfjt7_%2p(iNoaVW@Ukn(mNo@Hp5+LiNzot77qYlF8Pa=9w1rlb&SnWaEj z-F<+D+5xj28olPo!VNPpddnojAJPh}Inp=JpbLv(QD*QJPRf}EwU0pP5(8`tw7$Zw z;Jp^WIfFy9!|j9|A`redqU9oJ3Yl#_b_cl6<*{-4S-#DvSVd~5yOK22ue>MnzXtAU zT;e8yl)A)aXo8#MSt+f((GcYuC(|q4@tg7&ydGM}P~CI6idT(sehVPxJ^cPr5!N~O zo)Nzom$v2fh^t&POv$P^IXZe6KTJr|CaEdW=@8_Gy^!OY#}zM#l>vNZ5pr9q44zD3 z6F!7?Y%{x=wS0YEL_vLF%#n?E_7RL!LgCN!D>aabH+>n?O7YVrEh&XP;etB?-R z^T%T@c{QUD^KXG$*wk1Lo)cw-uoBCxo5&~H9Mc-$>Svg*kaG=i6|#Ae_wS8XMwbQN zeOq9AGv$O2bm`ti#Qxd5O-~!+aKQcl1O0Uva%anu0R6k7@WHk7S)-Er)>jJ5)Dk_# z6e(NB8`8&Bg|lV5Y4)2o?`z{LgXTP8ysUxQ3@{EE8Fc@vy6;{{$0hso-JEi}4{kz@ z4)zI5JyeJF^D19uG|6OA$#G*e(c4pN#UwX9hgngcV*{e-h_wp0Cj_tGL(N| z+yPRK1y*Hx*V13a2YsFzM4XP~YnJ3MiA}D0W9VRXQ&@Kg>)6w8FZ}#NDR;fX3tp%3 zfKR0M)d|O%lRQAZj_~6O&b<|)4~LpYo`Se^k?H0hD{9p;4I(%L{7)umwjvj-iXxkh aE@8O)^oR;sCc)JBXNrxEi|UEYuKgG7I3_j# literal 0 HcmV?d00001 diff --git a/doc/engines.png b/doc/engines.png index 574f1c980e18d5b6568df6de580295b01186f9c7..dd5e0c498f43f76d4beb413b961e86e8e5d91367 100644 GIT binary patch literal 17010 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 diff --git a/doc/seq_tm.png b/doc/seq_tm.png new file mode 100644 index 0000000000000000000000000000000000000000..48f732f2ff77a3b1743703150f4e4724248364f4 GIT binary patch literal 3201 zcmaJ^eLT}^|G)ONov_4oNHHTv$z$E5vSA*wPEJzCQ_90RDI%eqaeHXojlwX zBS$AD!))_24@-)QjXT5~Sq(XC9@=dUW51pI_y6yo>-BlP-q&@#uJ`NxeqW#K%Juaj zXld@z1ORA#f5P)D05DYv$m-vy#%U(|Zvb}VEWsT#@QnTfU_17EPdC5hP)W#8$@v4@ zAFe4W70$8u#&7Q?+=Fei733^lITY^gWpMq5bZup2Wp(8QqZI{#cE+!G>HW@uo$5J!J#Zg zGuRF_-zb~EHDKJqMgd|Zff$_{gRyxU^+(>KXK?0l`R>W|7Eu!^a_6>}d5f7Tq5{j3 zGijzDf}HWVCQ%E~;^wsSh!4jIHrQRDe?K_WOQXfRo7KZu`A?{z4*REVvdp-kWEV)( z=-c-VP2PdjJ+Mz#lZlqd=aZv8=Pwr$2{<$;a)V24_}f2Ta^`-uvxp z;6&sEn{ePhxsNJ_yfj?u%58>5a1jZfYgx;LOtpj*KcG)Ggra)=G(3==vD8@pKHJpq znn3$auFt?9b5T22SdTzU;bVKcW>FhnCq4={jhUy$60o~Cc>m`#7S+Z?oz!DDVZ8G4 zL(@R>#!cPEI;aug%nEc5Mzg`6#;2C_)U#bV+`E&_(6Zd1$T_C6C-3C_xi66pFmZCd zt2lYi`gVLqjbM{waP{#eE3m3g7LRD2)@z?%L2YrEBvBMN82CIkW&4z}o27;9gDKAp)n1v7) zCdw8{{5}2oFKow#i2CHP(Bil#gh^Eb=rkl;u(dJD)3a?eBh10xKPI1no5yd-n z%Kxg%ec+6FOIXSbkltSPo>6|>mJ)a=8~cW;zMt4Wo<{1O>eMTA1I3 zlC)|D^5RNdzYCArdfGzaEzji-1dyYR8xx);ZBy_1KwRr}vjJUQ1+3CLNvnk1JjH{_ zDTr(^7ZVl=*1K=SWpl*{TL==!+ z?4(H#JGmga@1=3yK*z^QxTj>kCIV}`afR!D%k3q*bSboR zc&mD|Ly)Wwd|~aW8T~%3NxeC~~sYOwo89)urf3CBr5@54wiwas#u6!tuHiMs z0gzXJIT9ANe0JxLS*all^Q|Lm*5JnVUMRlT|5V?x#P+!1dHMKS5jvWLd7RpR71jt8 z$177zo1~`L;m+QFq)|&J>F^&z0yR8j9Z6tF9{c*AtEbiK7V$dNSQpdO;fC4IS7iF+ zjT>O@8CRct$lD{NvCo)ESy^wZPVCZubn8i}#j5TJCWTnh+eO_A7?v5)TjTAxNgkvV z!L20#B=_7sA@v(n5S)*PH*QAcQ5?^~n?Gf4|GEMzocK zh@}1x_^A+Bi`2|0W#Y`Ib{hKS$a;-{mSk&fcXg|B4I{Cj(h$u@FmsxCb3Y~lUit4( z^9QSxQw~f|&)i{e@!XbmsP&F|k~O`)d>(Ut?Kt731 ztBAy({Ki+;u{2k!{^-#BH`+ZE1TamEi`0mac%kxn%BBKEq=~Pv$|G_UAwz>F zV*s2z_tS01qB<=uq|51A(FB#Is8=JYhQc= zWiar5Ze`Ys#G9KWfRdomLTB&eHQ^;~tm*TT`d6=tUmoj5f8>_D>A2ZMuyoLlj!fwM zwHzVj{f;n6y37V*8^jfuZ?PYf#Qk->idbARB&wCN6Bxz3D41b^2N5?+j}4SC6c=i! zh{~UI&3*M&<}(8%XN;;7`U-Q_&jFp^=o6P<_-xO21M^3mU_q|q_E%b}tIM4^mFJXa z1o?Y%o=tnrXniqcnq6oZy#_lG0Q5oZfrwod0`2i?qD|fAGxnM-9?o3P#+)R7Ag(&1 z2mW|67A;y`|4l*ZNni}kU z8S^m$n7asunssV>j>{xIxP^tbYNGLI7!!K)rO{Gp;p&@eXUzG^2H#l$V(*)Ml?dVO zgWYs?`d7rC3tiTrV`tqa>Uor@i(q03fsb5dVK{1!-~3FhafnGPW)I1RLNuLzj*v#S zC~1X}uvYsQ`wZHK8KD3BUrMN|-ts7F!7C&b%vUb|;3dStt-6kEhK%1~kddY8fkr=cdi)K4CjURMD;zk_3y`}v#Ka}s84_Q)zR*6ad_VPi zcS#{_MkQv|C{kFD7;F%~lWQZufnv*CF}pd4L*vt5^$N^F1D{h12+WJ3z}`!e@wK~X z?9>a}Pa}|yAMl6Qx2csIceQbYQnO>2;JoU|b6VYRzpxJKvyB?zsRA3~Zd&Ol9Pha- zxy+{*@&#rW(8@hYCU^Fi#9?5I>W#Srf`Yx_Bj`p;SYSceOevGl8t|D)0WOeSeOVi# zrD>A0GxdxDK?A6`jxY~c-7&2x+?^4v2!XXi@d%-&kOZ&Ovk<@reGb>bgMYbs*k#oC zW1FV(Dy|M~*yUs!!{<@NV{2*fWfYe{Ch6djZ<9b6o8qS9Tm5a+2wFb5LX$VkENlb8 zmcby@NCwTwU?u~^^Q)e=Hp^%qm%Q;|(7NtmDY+BwS!!P2O(0&qk}lZo-~`D&p;sf5 zgh_mg!f#Vrn$gG6B32cu=pcNH$+TDWFK<EX5ep}4onT&s`KlyvRvK$}H>TAQ zXO;gVb?F^#RrB4M$4r8P$)PhRe?iP)zWFJzL6Xl!sQhuE$S)@X9;C98^;woZw9AtV z#k-wF-$R9?#=kJr*?zxK8RpVDw{mg+a!3)uNfARClw+9jfN= zOKanPuSz2r5`S#EVo<$4i;M_I+lq5h76dNjyW@ZMJ3tF2%b3il=;y6N3!nb}VSInw L$FspbJoA46mV**~ literal 0 HcmV?d00001 diff --git a/lib/drumsynth/drumsynth.cpp b/lib/drumsynth/drumsynth.cpp index 4272f0a..b45654a 100644 --- a/lib/drumsynth/drumsynth.cpp +++ b/lib/drumsynth/drumsynth.cpp @@ -33,7 +33,9 @@ #include "misc/Biquad.h" #include "drumsynth.h" +#ifndef SAMPLE_RATE constexpr float SAMPLE_RATE = 48000.f; +#endif inline float dB2amp(float dB) { diff --git a/lib/drumsynth/drumsynth.h b/lib/drumsynth/drumsynth.h index 80c0a19..7708079 100644 --- a/lib/drumsynth/drumsynth.h +++ b/lib/drumsynth/drumsynth.h @@ -23,6 +23,8 @@ // See http://creativecommons.org/licenses/MIT/ for more information. // +#pragma once + #include #include #include diff --git a/lib/misc/noise.hxx b/lib/misc/noise.hxx index 072ed25..140c22b 100644 --- a/lib/misc/noise.hxx +++ b/lib/misc/noise.hxx @@ -24,6 +24,7 @@ // See http://creativecommons.org/licenses/MIT/ for more information. // +#pragma once #include // 31-bit Park-Miller-Carta Pseudo-Random Number Generator diff --git a/lib/plaits/resources.cc b/lib/plaits/resources.cc index a7a4c51..9566efa 100644 --- a/lib/plaits/resources.cc +++ b/lib/plaits/resources.cc @@ -33,7 +33,7 @@ #include "plaits/resources.h" #ifndef FLASHMEM -#include "pgmspace.h" +#define FLASHMEM #endif namespace plaits { @@ -4031,10 +4031,8 @@ const int16_t* const lookup_table_i16_table[] FLASHMEM = { lut_ws_double_bump, }; - - -const int32_t* const lookup_table_i32_table[] FLASHMEM = { -}; +// const int32_t* const lookup_table_i32_table[] FLASHMEM = { +// }; const int8_t lut_lpc_excitation_pulse[] FLASHMEM = { 0, 0, 0, 0, diff --git a/lib/streams/audio_cv_meter.h b/lib/streams/audio_cv_meter.h new file mode 100644 index 0000000..e4486bc --- /dev/null +++ b/lib/streams/audio_cv_meter.h @@ -0,0 +1,95 @@ +// Copyright 2014 Emilie Gillet. +// +// Author: Emilie Gillet (emilie.o.gillet@gmail.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// +// ----------------------------------------------------------------------------- +// +// Discriminate an ADC signal into audio or CV ; and provide RMS stats. + +#ifndef STREAMS_AUDIO_CV_METER_H_ +#define STREAMS_AUDIO_CV_METER_H_ + +#include "stmlib/stmlib.h" + +namespace streams { + +class AudioCvMeter { + public: + AudioCvMeter() { } + ~AudioCvMeter() { } + + void Init() { + peak_ = 0; + + zero_crossing_interval_ = 0; + average_zero_crossing_interval_ = 0; + + previous_sample_ = 0; + cv_ = false; + } + + void Process(int32_t sample) { + if ((sample >> 1) * previous_sample_ < 0 || + zero_crossing_interval_ >= 4096) { + int32_t error = zero_crossing_interval_ - average_zero_crossing_interval_; + average_zero_crossing_interval_ += error >> 3; + zero_crossing_interval_ = 0; + } else { + ++zero_crossing_interval_; + } + + if (cv_ && average_zero_crossing_interval_ < 200) { + cv_ = false; + } else if (!cv_ && average_zero_crossing_interval_ > 400) { + cv_ = true; + } + + previous_sample_ = sample; + + if (sample < 0) { + sample = -sample; + } + int32_t error = sample - peak_; + int32_t coefficient = 33; // 250ms at 1kHz + if (error > 0) { + coefficient = 809; // 10ms at 1kHz + } + peak_ += error * coefficient >> 15; + } + + inline bool cv() const { return cv_; } + inline int32_t peak() const { return peak_; } + + private: + bool cv_; + int32_t peak_; + int32_t zero_crossing_interval_; + int32_t average_zero_crossing_interval_; + int32_t previous_sample_; + + DISALLOW_COPY_AND_ASSIGN(AudioCvMeter); +}; + +} // namespace streams + +#endif // STREAMS_AUDIO_CV_METER_H_ diff --git a/lib/streams/compressor.cc b/lib/streams/compressor.cc new file mode 100644 index 0000000..0e3fc17 --- /dev/null +++ b/lib/streams/compressor.cc @@ -0,0 +1,158 @@ +// Copyright 2014 Emilie Gillet. +// +// Author: Emilie Gillet (emilie.o.gillet@gmail.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// +// ----------------------------------------------------------------------------- +// +// Compressor. + +#include "streams/compressor.h" + +// #include + +#include "stmlib/utils/dsp.h" + +namespace streams { + +using namespace stmlib; + +// 256 LSB <=> 1.55dB +const int32_t kGainConstant = 1 / (1.55 / 6.0 * 65536.0 / 256.0) * 65536; + +void Compressor::Init() { + detector_ = 0; +} + +/* static */ +int32_t Compressor::Log2(int32_t value) { + if (value <= 0) { + value = 1; + } + int32_t log_value = 0; + while (value >= 512) { + value >>= 1; + log_value += 65536; + } + while (value < 256) { + value <<= 1; + log_value -= 65536; + } + // Value is between 256 and 512, we can use the LUT. + return log_value + lut_log2[value - 256]; +} + +/* static */ +int32_t Compressor::Exp2(int32_t value) { + int32_t num_shifts = 0; + while (value >= 65536) { + ++num_shifts; + value -= 65536; + } + while (value < 0) { + --num_shifts; + value += 65536; + } + + // Value is between 0 and 65535, we can use the LUT. + int32_t a = lut_exp2[value >> 8]; + int32_t b = lut_exp2[(value >> 8) + 1]; + int32_t mantissa = a + ((b - a) * (value & 0xff) >> 8); + return num_shifts >= 0 ? mantissa << num_shifts : mantissa >> -num_shifts; +} + +/* static */ +int32_t Compressor::Compress( + int32_t squared_level, + int32_t threshold, + int32_t ratio, + bool soft_knee) { + int32_t level = (Log2(squared_level) >> 1) - 15 * 65536; // 15-bit peak + int32_t position = level - threshold; + + if (position < 0) { + return 0; + } + + int32_t attenuation = position - (position * ratio >> 8); + if (attenuation < 65535 && soft_knee) { + int32_t a = lut_soft_knee[attenuation >> 8]; + int32_t b = lut_soft_knee[(attenuation >> 8) + 1]; + int32_t soft_knee = a + ((b - a) * (attenuation & 0xff) >> 8); + attenuation += \ + (soft_knee - attenuation) * ((65535 - attenuation) >> 1) >> 15; + } + return -attenuation; +} + +void Compressor::Process( + int16_t audio, + int16_t excite, + uint16_t* gain, + uint16_t* frequency) { + int32_t energy; + int64_t error; + + // Detect the RMS level on the EXCITE input. + energy = excite; + energy *= energy; + error = energy - sidechain_signal_detector_; + if (error > 0) { + sidechain_signal_detector_ += error; + } else { + // Decay time: 5s. + sidechain_signal_detector_ += error * 14174 >> 31; + } + + // If there is no signal on the "excite" input, disable sidechain and + // compress by metering input. + if (sidechain_signal_detector_ < (1024 * 1024)) { + energy = audio; + energy *= energy; + } + + // Detect the RMS level on the EXCITE or AUDIO input - whichever active. + error = energy - detector_; + if (error > 0) { + if (attack_coefficient_ == -1) { + detector_ += error; + } else { + detector_ += error * attack_coefficient_ >> 31; + } + } else { + detector_ += error * decay_coefficient_ >> 31; + } + + int32_t g = Compress(detector_, threshold_, ratio_, soft_knee_); + gain_reduction_ = g >> 3; + g = kUnityGain + ((g + makeup_gain_) * kGainConstant >> 16); + if (g > 65535) { + g = 65535; + } + + *gain = g; + // float ogain = powf(10.0f, 1.55f / 20.0f * (g - kUnityGain) / 256.0f); + // printf("%f %f\n", gain_reduction_ / 32768.0 * 24, 20 * logf(ogain) / logf(10.0f)); + *frequency = 65535; +} + +} // namespace streams diff --git a/lib/streams/compressor.h b/lib/streams/compressor.h new file mode 100644 index 0000000..5fd1702 --- /dev/null +++ b/lib/streams/compressor.h @@ -0,0 +1,133 @@ +// Copyright 2014 Emilie Gillet. +// +// Author: Emilie Gillet (emilie.o.gillet@gmail.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// +// ----------------------------------------------------------------------------- +// +// Compressor. + +#ifndef STREAMS_COMPRESSOR_H_ +#define STREAMS_COMPRESSOR_H_ + +#include "stmlib/stmlib.h" + +#include + +#include "streams/gain.h" +#include "streams/resources.h" + +namespace streams { + +class Compressor { + public: + Compressor() { } + ~Compressor() { } + + void Init(); + + void Process( + int16_t audio, + int16_t excite, + uint16_t* gain, + uint16_t* frequency); + + void Configure(bool alternate, int32_t* parameters, int32_t* globals) { + uint16_t attack_time; + uint16_t decay_time; + uint16_t amount; + uint16_t threshold; + + if (globals) { + attack_time = globals[0] * (128 + 128 + 99) >> 16; // 1ms to 500ms + decay_time = 128 + 99 + (globals[2] >> 8); // 50ms to 5000ms + threshold = globals[1]; + amount = globals[3]; + } else { + attack_time = !alternate ? 1 : 40; // 0.2ms or 2ms; + decay_time = !alternate ? 279 : 236; // 150ms or 70ms; + threshold = parameters[0]; + amount = parameters[1]; + } + + attack_coefficient_ = lut_lp_coefficients[attack_time]; + decay_coefficient_ = lut_lp_coefficients[decay_time]; + soft_knee_ = alternate; + threshold_ = (-1280 + 5 * (threshold >> 8)) << 8; + + if (amount < 32768) { + // Compression with no makeup gain. + ratio_ = lut_compressor_ratio[(32767 - amount) >> 7]; + makeup_gain_ = 0; + } else { + // Adaptive compression with makeup gain. + amount -= 32768; + + int32_t max_gain, knee_gain; + max_gain = kMaxExponentialGain; + makeup_gain_ = amount * (max_gain >> 8) >> 7; + knee_gain = threshold_+ makeup_gain_; + if (knee_gain >= 0) { + makeup_gain_ = -threshold_; + knee_gain = 0; + } + + if (knee_gain > -4096) { + // So intense! Brickwall limiter mode. In this case, we use an + // instant attack to tame transients as soon as they appear. + ratio_ = 0; + attack_coefficient_ = -1; + } else { + ratio_ = knee_gain / (threshold_ >> 8); + } + } + } + + inline int32_t gain_reduction() const { return gain_reduction_; } + + private: + static int32_t Log2(int32_t value); + static int32_t Exp2(int32_t value); + static int32_t Compress( + int32_t squared_level, + int32_t threshold, + int32_t ratio, + bool soft_knee); + + int32_t ratio_; // Reciprocal of the ratio, 8:8 + int32_t threshold_; + int32_t makeup_gain_; + + bool soft_knee_; + + int64_t attack_coefficient_; + int64_t decay_coefficient_; + int64_t detector_; + int64_t sidechain_signal_detector_; + int32_t gain_reduction_; + + DISALLOW_COPY_AND_ASSIGN(Compressor); +}; + +} // namespace streams + +#endif // STREAMS_COMPRESSOR_H_ diff --git a/lib/streams/envelope.cc b/lib/streams/envelope.cc new file mode 100644 index 0000000..0572cca --- /dev/null +++ b/lib/streams/envelope.cc @@ -0,0 +1,128 @@ +// Copyright 2014 Emilie Gillet. +// +// Author: Emilie Gillet (emilie.o.gillet@gmail.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// +// ----------------------------------------------------------------------------- +// +// Simple AD envelope - adapted from Peaks' multistage envelope. + +#include "streams/envelope.h" + +#include "stmlib/utils/dsp.h" + +#include "streams/resources.h" + +#include "streams/gain.h" + +#include + +namespace streams { + +using namespace std; +using namespace stmlib; + +void Envelope::Init() { + fill(&shape_[0], &shape_[kMaxNumSegments], ENV_SHAPE_LINEAR); + set_ad(0, 8192); + segment_ = num_segments_; + phase_ = 0; + phase_increment_ = 0; + start_value_ = 0; + value_ = 0; + rate_modulation_ = 0; + gate_level_ = 0; + gate_ = false; + hard_reset_ = false; + attack_ = 0; + decay_ = 0; +} + +void Envelope::Process( + int16_t audio, + int16_t excite, + uint16_t* gain, + uint16_t* frequency) { + // Smooth frequency amount parameters. + frequency_amount_ += (target_frequency_amount_ - frequency_amount_) >> 8; + frequency_offset_ += (target_frequency_offset_ - frequency_offset_) >> 8; + + bool trigger = false; + bool release = false; + if (gate_ == false) { + if (excite > kSchmittTriggerThreshold) { + trigger = true; + gate_ = true; + set_hard_reset(false); + } + } else { + if (excite < (kSchmittTriggerThreshold >> 1)) { + gate_ = false; + release = false; + } else { + // Track the level of the signal while the GATE is held. + gate_level_ += (excite - gate_level_) >> 8; + } + } + if (trigger) { + start_value_ = (segment_ == num_segments_ || hard_reset_) + ? level_[0] + : value_; + segment_ = 0; + phase_ = 0; + } else if (release && sustain_point_) { + start_value_ = value_; + segment_ = sustain_point_; + phase_ = 0; + } else if (phase_ < phase_increment_) { + start_value_ = level_[segment_ + 1]; + ++segment_; + phase_ = 0; + } + + bool done = segment_ == num_segments_; + bool sustained = sustain_point_ && segment_ == sustain_point_ && gate_; + uint32_t increment = sustained || done ? 0 : lut_env_increments[time_[segment_] >> 8]; + + // Modulates the envelope rate by the actual excitation pulse. + rate_modulation_ += (static_cast(excite > kSchmittTriggerThreshold ? excite : 0) - rate_modulation_) >> 12; + increment += static_cast(increment >> 7) * (rate_modulation_ >> 7); + + phase_increment_ = increment; + + int32_t a = start_value_; + int32_t b = level_[segment_ + 1]; + uint16_t t = Interpolate824( + lookup_table_table[LUT_ENV_LINEAR + shape_[segment_]], phase_); + value_ = a + ((b - a) * (t >> 1) >> 15); + phase_ += phase_increment_; + + // Applies a variable amount of distortion, depending on the level. + int32_t compressed = 32767 - ((32767 - value_) * (32767 - value_) >> 15); + compressed = 32767 - ((32767 - compressed) * (32767 - compressed) >> 15); + int32_t scaled = value_ + ((compressed - value_) * gate_level_ >> 15); + scaled = scaled * (28672 + (gate_level_ >> 3)) >> 15; + *gain = scaled * kAboveUnityGain >> 15; + *frequency = frequency_offset_ + (scaled * frequency_amount_ >> 15); +} + +} // namespace streams diff --git a/lib/streams/envelope.h b/lib/streams/envelope.h new file mode 100644 index 0000000..5794dd3 --- /dev/null +++ b/lib/streams/envelope.h @@ -0,0 +1,246 @@ +// Copyright 2014 Emilie Gillet. +// +// Author: Emilie Gillet (emilie.o.gillet@gmail.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// +// ----------------------------------------------------------------------------- +// +// Simple AD envelope - adapted from Peaks' multistage envelope. + +#ifndef STREAMS_ENVELOPE_H_ +#define STREAMS_ENVELOPE_H_ + +#include "stmlib/stmlib.h" + +#include "streams/meta_parameters.h" + +namespace streams { + +enum EnvelopeShape { + ENV_SHAPE_LINEAR, + ENV_SHAPE_EXPONENTIAL, + ENV_SHAPE_QUARTIC +}; + +const uint16_t kMaxNumSegments = 8; + +class Envelope { + public: + Envelope() { } + ~Envelope() { } + + void Init(); + void Process( + int16_t audio, + int16_t excite, + uint16_t* gain, + uint16_t* frequency); + + void Configure(bool alternate, int32_t* parameters, int32_t* globals) { + uint16_t a, d; + if (globals) { + a = globals[0]; + d = globals[2]; + ComputeAmountOffset( + parameters[1], + &target_frequency_amount_, + &target_frequency_offset_); + } else { + ComputeAttackDecay(parameters[0], &a, &d); + ComputeAmountOffset( + parameters[1], + &target_frequency_amount_, + &target_frequency_offset_); + } + + if (a != attack_ || d != decay_ || alternate != alternate_) { + attack_ = a; + decay_ = d; + alternate_ = alternate; + if (alternate_) { + set_ar(a, d); + } else { + set_ad(a, d); + } + set_hard_reset(true); + } + } + + inline void set_time(uint16_t segment, uint16_t time) { + time_[segment] = time; + } + + inline void set_level(uint16_t segment, int16_t level) { + level_[segment] = level; + } + + inline void set_num_segments(uint16_t num_segments) { + num_segments_ = num_segments; + } + + inline void set_sustain_point(uint16_t sustain_point) { + sustain_point_ = sustain_point; + } + + inline void set_ad(uint16_t attack, uint16_t decay) { + num_segments_ = 2; + sustain_point_ = 0; + + level_[0] = 0; + level_[1] = 32767; + level_[2] = 0; + + time_[0] = attack; + time_[1] = decay; + + shape_[0] = ENV_SHAPE_LINEAR; + shape_[1] = ENV_SHAPE_EXPONENTIAL; + } + + inline void set_adr( + uint16_t attack, + uint16_t decay, + uint16_t sustain, + uint16_t release) { + num_segments_ = 3; + sustain_point_ = 0; + + level_[0] = 0; + level_[1] = 32767; + level_[2] = sustain; + level_[3] = 0; + + time_[0] = attack; + time_[1] = decay; + time_[2] = release; + + shape_[0] = ENV_SHAPE_LINEAR; + shape_[1] = ENV_SHAPE_LINEAR; + shape_[2] = ENV_SHAPE_LINEAR; + } + + inline void set_ar(uint16_t attack, uint16_t decay) { + num_segments_ = 2; + sustain_point_ = 1; + + level_[0] = 0; + level_[1] = 32767; + level_[2] = 0; + + time_[0] = attack; + time_[1] = decay; + + shape_[0] = ENV_SHAPE_LINEAR; + shape_[1] = ENV_SHAPE_LINEAR; + } + + inline void set_adsar( + uint16_t attack, + uint16_t decay, + uint16_t sustain, + uint16_t release) { + num_segments_ = 4; + sustain_point_ = 2; + + level_[0] = 0; + level_[1] = 32767; + level_[2] = sustain; + level_[3] = 32767; + level_[4] = 0; + + time_[0] = attack; + time_[1] = decay; + time_[2] = attack; + time_[3] = release; + + shape_[0] = ENV_SHAPE_LINEAR; + shape_[1] = ENV_SHAPE_LINEAR; + shape_[2] = ENV_SHAPE_LINEAR; + shape_[3] = ENV_SHAPE_LINEAR; + } + + inline void set_adar( + uint16_t attack, + uint16_t decay, + uint16_t sustain, + uint16_t release) { + num_segments_ = 4; + sustain_point_ = 0; + + level_[0] = 0; + level_[1] = 32767; + level_[2] = sustain; + level_[3] = 32767; + level_[4] = 0; + + time_[0] = attack; + time_[1] = decay; + time_[2] = attack; + time_[3] = release; + + shape_[0] = ENV_SHAPE_LINEAR; + shape_[1] = ENV_SHAPE_LINEAR; + shape_[2] = ENV_SHAPE_LINEAR; + shape_[3] = ENV_SHAPE_LINEAR; + } + + inline void set_hard_reset(bool hard_reset) { + hard_reset_ = hard_reset; + } + + private: + bool gate_; + + int16_t level_[kMaxNumSegments]; + uint16_t time_[kMaxNumSegments]; + EnvelopeShape shape_[kMaxNumSegments]; + + int16_t segment_; + int16_t start_value_; + int16_t value_; + + uint32_t phase_; + uint32_t phase_increment_; + + uint16_t num_segments_; + uint16_t sustain_point_; + + int32_t target_frequency_amount_; + int32_t target_frequency_offset_; + int32_t frequency_amount_; + int32_t frequency_offset_; + + uint16_t attack_; + uint16_t decay_; + + bool alternate_; + bool hard_reset_; + + int32_t rate_modulation_; + int32_t gate_level_; + + DISALLOW_COPY_AND_ASSIGN(Envelope); +}; + +} // namespace streams + +#endif // STREAMS_ENVELOPE_H_ diff --git a/lib/streams/filter_controller.h b/lib/streams/filter_controller.h new file mode 100644 index 0000000..1267033 --- /dev/null +++ b/lib/streams/filter_controller.h @@ -0,0 +1,84 @@ +// Copyright 2014 Emilie Gillet. +// +// Author: Emilie Gillet (emilie.o.gillet@gmail.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// +// ----------------------------------------------------------------------------- +// +// Plain filter. + +#ifndef STREAMS_FILTER_CONTROLLER_H_ +#define STREAMS_FILTER_CONTROLLER_H_ + +#include "stmlib/stmlib.h" + +namespace streams { + +class FilterController { + public: + FilterController() { } + ~FilterController() { } + + void Init() { + frequency_offset_ = 0; + frequency_amount_ = 0; + } + void Process( + int16_t audio, + int16_t excite, + uint16_t* gain, + uint16_t* frequency) { + // Smooth frequency amount parameters. + frequency_amount_ += (target_frequency_amount_ - frequency_amount_) >> 8; + frequency_offset_ += (target_frequency_offset_ - frequency_offset_) >> 8; + + int32_t f; + f = frequency_offset_ + (excite * frequency_amount_ >> 14); + if (f < 0) { + f = 0; + } else if (f > 65535) { + f = 65535; + } + *gain = 0; + *frequency = f; + } + + void Configure(bool alternate, int32_t* parameters, int32_t* globals) { + int32_t amount = parameters[1]; + amount -= 32768; + amount = amount * amount >> 15; + target_frequency_amount_ = parameters[1] < 32768 ? -amount : amount; + target_frequency_offset_ = parameters[0]; + } + + private: + int32_t target_frequency_amount_; + int32_t target_frequency_offset_; + int32_t frequency_amount_; + int32_t frequency_offset_; + + DISALLOW_COPY_AND_ASSIGN(FilterController); +}; + +} // namespace streams + +#endif // STREAMS_ENVELOPE_H_ diff --git a/lib/streams/follower.cc b/lib/streams/follower.cc new file mode 100644 index 0000000..98d2863 --- /dev/null +++ b/lib/streams/follower.cc @@ -0,0 +1,137 @@ +// Copyright 2014 Emilie Gillet. +// +// Author: Emilie Gillet (emilie.o.gillet@gmail.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// +// ----------------------------------------------------------------------------- +// +// Follower. + +#include "streams/follower.h" + +#include "stmlib/utils/dsp.h" + +#include "streams/gain.h" +#include "streams/resources.h" + +namespace streams { + +using namespace stmlib; + +void Follower::Init() { + analysis_low_.Init(); + analysis_low_.set_frequency(45 << 7); + analysis_low_.set_resonance(0); + analysis_medium_.Init(); + analysis_medium_.set_frequency(86 << 7); + analysis_medium_.set_resonance(0); + + for (uint8_t i = 0; i < 3; ++i) { + energy_[i][0] = energy_[i][1] = 0; + follower_[i] = 0; + follower_lp_[i] = 0; + spectrum_[i] = 0; + } + centroid_ = 0; +} + +void Follower::Process( + int16_t audio, + int16_t excite, + uint16_t* gain, + uint16_t* frequency) { + // Smooth frequency amount parameters. + frequency_amount_ += (target_frequency_amount_ - frequency_amount_) >> 8; + frequency_offset_ += (target_frequency_offset_ - frequency_offset_) >> 8; + + analysis_low_.Process(excite); + analysis_medium_.Process(analysis_low_.hp()); + + int32_t channel[3]; + channel[0] = analysis_low_.lp(); + channel[1] = analysis_medium_.lp(); + channel[2] = analysis_medium_.hp(); + + int32_t envelope = 0; + int32_t centroid_numerator = 0; + int32_t centroid_denominator = 0; + for (int32_t i = 0; i < 3; ++i) { + int32_t energy = channel[i]; + energy *= energy; + + // Ride an ascending peak. + if (energy_[i][0] < energy_[i][1] && energy_[i][1] < energy && + energy > follower_[i]) { + follower_[i] = energy; + } + // Otherwise, hold and snap on local maxima. + if (energy_[i][0] <= energy_[i][1] && energy_[i][1] >= energy) { + follower_[i] = energy_[i][1]; + } + energy_[i][0] = energy_[i][1]; + energy_[i][1] = energy; + + // Then let a low-pass filter smooth things out. + int64_t error = follower_[i] - follower_lp_[i]; + if (error > 0) { + follower_lp_[i] += error * attack_coefficient_[i] >> 31; + } else { + follower_lp_[i] += error * decay_coefficient_[i] >> 31; + } + envelope += follower_lp_[i] >> 13; + + // Integrate more slowly for spectrum estimation. + if (only_filter_) { + error = follower_lp_[i] - spectrum_[i]; + spectrum_[i] += error >> 6; + } else { + error = follower_[i] - spectrum_[i]; + spectrum_[i] += error >> 10; + } + centroid_numerator += i * (spectrum_[i] >> 1) >> 16; + centroid_denominator += spectrum_[i] >> 16; + } + + if (envelope > 65535) { + envelope = 65535; + } else if (envelope < 0) { + envelope = 0; + } + + uint16_t gain_mod = Interpolate824(lut_square_root, envelope << 16) >> 1; + int32_t centroid = (centroid_numerator << 15) / (centroid_denominator + 1); + if (gain_mod > 4096) { + centroid_ = centroid; + } else if (gain_mod > 2048) { + centroid_ += (centroid - centroid_) >> 8; + } + + *gain = gain_mod * kUnityGain >> 15; + *frequency = frequency_offset_ + (centroid_ * frequency_amount_ >> 15); + + if (only_filter_) { + *gain = *frequency; + *frequency = 65535; + } +} + +} // namespace streams diff --git a/lib/streams/follower.h b/lib/streams/follower.h new file mode 100644 index 0000000..a6af6f8 --- /dev/null +++ b/lib/streams/follower.h @@ -0,0 +1,131 @@ +// Copyright 2014 Emilie Gillet. +// +// Author: Emilie Gillet (emilie.o.gillet@gmail.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// +// ----------------------------------------------------------------------------- +// +// Follower. + +#ifndef STREAMS_FOLLOWER_H_ +#define STREAMS_FOLLOWER_H_ + +#include "stmlib/stmlib.h" + +#include "streams/meta_parameters.h" +#include "streams/resources.h" +#include "streams/svf.h" + +namespace streams { + +const uint16_t kNumBands = 3; + +class Follower { + public: + Follower() { } + ~Follower() { } + + void Init(); + void Process( + int16_t audio, + int16_t excite, + uint16_t* gain, + uint16_t* frequency); + + void Configure(bool alternate, int32_t* parameters, int32_t* globals) { + uint16_t attack_time; + uint16_t decay_time; + + if (globals) { + // Attack: 1ms to 100ms + attack_time = globals[0] >> 8; + + // Decay: 10ms to 1000ms + decay_time = 128 + (globals[2] >> 8); + + ComputeAmountOffset( + parameters[1], + &target_frequency_amount_, + &target_frequency_offset_); + } else { + uint16_t shape = parameters[0]; + if (shape < 32768) { + // attack: 1ms to 2ms. + attack_time = (shape * 39 >> 15); + // decay: 10ms to 100ms. + decay_time = 128 + (shape * 128 >> 15); + } else { + shape -= 32768; + // attack: 2ms to 20ms. + attack_time = 39 + (shape * 128 >> 15); + // decay: 100ms to 200ms. + decay_time = 128 + 128 + (shape * 39 >> 15); + } + + ComputeAmountOffset( + parameters[1], + &target_frequency_amount_, + &target_frequency_offset_); + } + + // Slow down the attack detection on low frequencies. + attack_coefficient_[0] = lut_lp_coefficients[attack_time + 39]; + attack_coefficient_[1] = lut_lp_coefficients[attack_time + 19]; + attack_coefficient_[2] = lut_lp_coefficients[attack_time + 0]; + + // Slow down the decay detection on high frequencies as there is more noise. + decay_coefficient_[0] = lut_lp_coefficients[decay_time + 39]; + decay_coefficient_[1] = lut_lp_coefficients[decay_time + 19]; + decay_coefficient_[2] = lut_lp_coefficients[decay_time + 99]; + + only_filter_ = alternate; + } + + private: + Svf analysis_low_; + Svf analysis_medium_; + int32_t energy_[kNumBands][2]; + int64_t follower_[kNumBands]; + + int64_t attack_coefficient_[kNumBands]; + int64_t decay_coefficient_[kNumBands]; + int64_t follower_lp_[kNumBands]; + + int32_t spectrum_[kNumBands]; + + int32_t centroid_; + + int32_t frequency_offset_; + int32_t frequency_amount_; + int32_t target_frequency_offset_; + int32_t target_frequency_amount_; + + int32_t naive_; + + bool only_filter_; + + DISALLOW_COPY_AND_ASSIGN(Follower); +}; + +} // namespace streams + +#endif // STREAMS_FOLLOWER_H_ diff --git a/lib/streams/gain.h b/lib/streams/gain.h new file mode 100644 index 0000000..a5ac597 --- /dev/null +++ b/lib/streams/gain.h @@ -0,0 +1,56 @@ +// Copyright 2013 Emilie Gillet. +// +// Author: Emilie Gillet (emilie.o.gillet@gmail.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// +// ----------------------------------------------------------------------------- +// +// Value to output on the DAC to get unitary gain. + +#ifndef STREAMS_GAIN_H_ +#define STREAMS_GAIN_H_ + +namespace streams { + +// The DAC sends up to 2.5V through 25k = 0.1mA over the range of the DAC. +// The offness compensation resistor sends -10V through 10M = 0.001mA. +// Assuming the op-amp offset is negligible, the two balance for a DAC code of +// 65536 / 100.0 + +const int32_t kDefaultOffset = 655; + +// DAC code giving a unitary gain. +const int32_t kUnityGain = 32767; + +// Slightly above unitary gain. +const int32_t kAboveUnityGain = 32896; + +// Maximum gain in dB in lin mode with a DAC code of 65535 (6 dB). +const int32_t kMaxLinearGain = 65536; +// Maximum gain in dB in lin mode with a DAC code of 65535 (18 dB). +const int32_t kMaxExponentialGain = 218453; + +const uint16_t kSchmittTriggerThreshold = 32768 * 5 * 2 / 3 / 8; + +} // namespace streams + +#endif // STREAMS_GAIN_H_ \ No newline at end of file diff --git a/lib/streams/lorenz_generator.cc b/lib/streams/lorenz_generator.cc new file mode 100644 index 0000000..7076acb --- /dev/null +++ b/lib/streams/lorenz_generator.cc @@ -0,0 +1,82 @@ +// Copyright 2014 Emilie Gillet. +// +// Author: Emilie Gillet (emilie.o.gillet@gmail.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// +// ----------------------------------------------------------------------------- +// +// Lorenz system. + +#include "streams/lorenz_generator.h" + +#include "streams/resources.h" + +namespace streams { + +using namespace stmlib; + +const int64_t sigma = 10.0 * (1 << 24); +const int64_t rho = 28.0 * (1 << 24); +const int64_t beta = 8.0 / 3.0 * (1 << 24); + +void LorenzGenerator::Init() { + x_ = 0.1 * (1 << 24); + y_ = 0; + z_ = 0; + vcf_amount_ = 0; + vca_amount_ = 0; +} + +void LorenzGenerator::Process( + int16_t audio, + int16_t excite, + uint16_t* gain, + uint16_t* frequency) { + vcf_amount_ += (target_vcf_amount_ - vcf_amount_) >> 8; + vca_amount_ += (target_vca_amount_ - vca_amount_) >> 8; + int32_t rate = rate_ + (excite >> 8); + CONSTRAIN(rate, 0, 256); + int64_t dt = static_cast(lut_lorenz_rate[rate]); + + int32_t x = x_ + (dt * ((sigma * (y_ - x_)) >> 24) >> 24); + int32_t y = y_ + (dt * ((x_ * (rho - z_) >> 24) - y_) >> 24); + int32_t z = z_ + (dt * ((x_ * int64_t(y_) >> 24) - (beta * z_ >> 24)) >> 24); + + x_ = x; + y_ = y; + z_ = z; + + int32_t z_scaled = z >> 14; + int32_t x_scaled = (x >> 14) + 32768; + + if (index_) { + // On channel 2, z and y are inverted to get more variety! + z = z_scaled; + z_scaled = x_scaled; + x_scaled = z; + } + + *gain = z_scaled * vca_amount_ >> 15; + *frequency = 65535 + ((x_scaled - 65535) * vcf_amount_ >> 15); +} + +} // namespace streams diff --git a/lib/streams/lorenz_generator.h b/lib/streams/lorenz_generator.h new file mode 100644 index 0000000..c3331da --- /dev/null +++ b/lib/streams/lorenz_generator.h @@ -0,0 +1,80 @@ +// Copyright 2014 Emilie Gillet. +// +// Author: Emilie Gillet (emilie.o.gillet@gmail.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// +// ----------------------------------------------------------------------------- +// +// Lorenz system. + +#ifndef STREAMS_LORENZ_GENERATOR_H_ +#define STREAMS_LORENZ_GENERATOR_H_ + +#include "stmlib/stmlib.h" + +#include "streams/meta_parameters.h" + +namespace streams { + +class LorenzGenerator { + public: + LorenzGenerator() { } + ~LorenzGenerator() { } + + void Init(); + void Process( + int16_t audio, + int16_t excite, + uint16_t* gain, + uint16_t* frequency); + + void set_index(uint8_t index) { + index_ = index; + } + + void Configure(bool alternate, int32_t* parameters, int32_t* globals) { + rate_ = parameters[0] >> 8; + int32_t vcf_amount = 65535 - parameters[1]; + int32_t vca_amount = parameters[1]; + if (vcf_amount >= 32767) vcf_amount = 32767; + if (vca_amount >= 32767) vca_amount = 32767; + target_vcf_amount_ = vcf_amount; + target_vca_amount_ = vca_amount; + } + + + private: + int32_t x_, y_, z_; + int32_t rate_; + int32_t vcf_amount_; + int32_t vca_amount_; + int32_t target_vcf_amount_; + int32_t target_vca_amount_; + + uint8_t index_; + + DISALLOW_COPY_AND_ASSIGN(LorenzGenerator); +}; + +} // namespace streams + +#endif // STREAMS_LORENZ_GENERATOR_H_ diff --git a/lib/streams/meta_parameters.h b/lib/streams/meta_parameters.h new file mode 100644 index 0000000..1c1e793 --- /dev/null +++ b/lib/streams/meta_parameters.h @@ -0,0 +1,66 @@ +// Copyright 2014 Emilie Gillet. +// +// Author: Emilie Gillet (emilie.o.gillet@gmail.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// +// ----------------------------------------------------------------------------- +// +// Control of several parameters from one single knob. + +#ifndef STREAMS_META_PARAMETERS_H_ +#define STREAMS_META_PARAMETERS_H_ + +#include "stmlib/stmlib.h" + +namespace streams { + +inline void ComputeAmountOffset( + int32_t value, + int32_t* amount, + int32_t* offset) { + if (value < 32768) { + value = 32767 - value; + value = value * value >> 15; + *amount = (32767 - value) << 1; + *offset = 0; + } else { + *amount = 65535 - ((value - 32768) << 1); + *offset = (value - 32768) << 1; + } +} + +inline void ComputeAttackDecay(int32_t shape, uint16_t* a, uint16_t* d) { + if (shape < 32768) { + *a = 0; + *d = 13 * (shape >> 3) + 12288; + } else if (shape < 49152) { + *a = (shape - 32768) << 1; + *d = 65535 - ((shape - 32768) >> 1) * 3; + } else { + *a = 32768 - ((shape - 49152) >> 2) * 5; + *d = 65535 - ((shape - 32768) >> 1) * 3; + } +} + +} // namespace streams + +#endif // STREAMS_META_PARAMETERS_H_ diff --git a/lib/streams/resources.cc b/lib/streams/resources.cc new file mode 100644 index 0000000..14c458e --- /dev/null +++ b/lib/streams/resources.cc @@ -0,0 +1,1435 @@ +// Copyright 2014 Emilie Gillet. +// +// Author: Emilie Gillet (emilie.o.gillet@gmail.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// +// ----------------------------------------------------------------------------- +// +// Resources definitions. +// +// Automatically generated with: +// make resources + + +#include "streams/resources.h" + +namespace streams { + +static const char str_dummy[] = "dummy"; + + +const char* string_table[] = { + str_dummy, +}; + +const int16_t wav_gompertz[] = { + 0, 12, 24, 36, + 48, 60, 72, 84, + 96, 108, 120, 132, + 144, 156, 168, 179, + 191, 203, 215, 227, + 238, 250, 262, 274, + 286, 298, 310, 323, + 335, 348, 360, 373, + 386, 399, 412, 426, + 439, 453, 467, 481, + 496, 511, 526, 542, + 558, 574, 591, 608, + 625, 643, 662, 681, + 700, 720, 741, 762, + 784, 807, 830, 854, + 878, 903, 930, 956, + 984, 1013, 1042, 1072, + 1104, 1136, 1169, 1203, + 1238, 1275, 1312, 1350, + 1390, 1430, 1472, 1515, + 1559, 1605, 1651, 1699, + 1749, 1799, 1851, 1904, + 1959, 2015, 2072, 2131, + 2191, 2252, 2315, 2380, + 2446, 2513, 2582, 2652, + 2724, 2798, 2873, 2949, + 3027, 3106, 3187, 3270, + 3354, 3439, 3526, 3615, + 3705, 3796, 3889, 3984, + 4080, 4177, 4276, 4377, + 4479, 4582, 4686, 4793, + 4900, 5009, 5119, 5231, + 5344, 5458, 5574, 5690, + 5808, 5928, 6048, 6170, + 6293, 6417, 6542, 6668, + 6796, 6924, 7053, 7184, + 7315, 7448, 7581, 7715, + 7850, 7986, 8123, 8261, + 8399, 8538, 8678, 8819, + 8960, 9102, 9244, 9387, + 9531, 9675, 9820, 9965, + 10110, 10256, 10403, 10550, + 10697, 10844, 10992, 11140, + 11288, 11436, 11585, 11734, + 11882, 12031, 12181, 12330, + 12479, 12628, 12777, 12926, + 13075, 13224, 13373, 13522, + 13670, 13819, 13967, 14115, + 14263, 14410, 14558, 14705, + 14851, 14997, 15143, 15289, + 15434, 15579, 15723, 15867, + 16011, 16154, 16296, 16438, + 16580, 16721, 16861, 17001, + 17141, 17280, 17418, 17555, + 17692, 17829, 17964, 18099, + 18234, 18367, 18500, 18633, + 18764, 18895, 19026, 19155, + 19284, 19412, 19539, 19666, + 19792, 19917, 20041, 20165, + 20287, 20409, 20530, 20651, + 20770, 20889, 21007, 21124, + 21241, 21356, 21471, 21585, + 21698, 21810, 21922, 22032, + 22142, 22251, 22359, 22466, + 22573, 22679, 22783, 22887, + 22991, 23093, 23195, 23295, + 23395, 23494, 23592, 23690, + 23786, 23882, 23977, 24071, + 24165, 24257, 24349, 24440, + 24530, 24619, 24708, 24795, + 24882, 24969, 25054, 25139, + 25222, 25305, 25388, 25469, + 25550, 25630, 25709, 25788, + 25865, 25942, 26019, 26094, + 26169, 26243, 26316, 26389, + 26461, 26532, 26603, 26672, + 26741, 26810, 26878, 26945, + 27011, 27077, 27142, 27206, + 27270, 27333, 27395, 27457, + 27518, 27579, 27639, 27698, + 27756, 27814, 27872, 27929, + 27985, 28041, 28096, 28150, + 28204, 28257, 28310, 28362, + 28414, 28465, 28515, 28565, + 28614, 28663, 28712, 28759, + 28807, 28853, 28900, 28945, + 28991, 29035, 29080, 29123, + 29167, 29209, 29252, 29294, + 29335, 29376, 29416, 29456, + 29496, 29535, 29574, 29612, + 29650, 29687, 29724, 29760, + 29796, 29832, 29867, 29902, + 29937, 29971, 30005, 30038, + 30071, 30103, 30136, 30167, + 30199, 30230, 30261, 30291, + 30321, 30351, 30380, 30409, + 30438, 30466, 30494, 30521, + 30549, 30576, 30602, 30629, + 30655, 30681, 30706, 30731, + 30756, 30781, 30805, 30829, + 30853, 30876, 30899, 30922, + 30945, 30967, 30989, 31011, + 31032, 31054, 31075, 31096, + 31116, 31136, 31156, 31176, + 31196, 31215, 31234, 31253, + 31272, 31290, 31308, 31326, + 31344, 31362, 31379, 31396, + 31413, 31430, 31446, 31463, + 31479, 31495, 31510, 31526, + 31541, 31556, 31571, 31586, + 31601, 31615, 31630, 31644, + 31658, 31671, 31685, 31698, + 31712, 31725, 31738, 31750, + 31763, 31775, 31788, 31800, + 31812, 31824, 31836, 31847, + 31859, 31870, 31881, 31892, + 31903, 31914, 31924, 31935, + 31945, 31955, 31966, 31976, + 31985, 31995, 32005, 32014, + 32024, 32033, 32042, 32051, + 32060, 32069, 32078, 32086, + 32095, 32103, 32111, 32120, + 32128, 32136, 32144, 32151, + 32159, 32167, 32174, 32182, + 32189, 32196, 32203, 32210, + 32217, 32224, 32231, 32238, + 32244, 32251, 32257, 32264, + 32270, 32276, 32282, 32288, + 32294, 32300, 32306, 32312, + 32318, 32323, 32329, 32334, + 32340, 32345, 32350, 32356, + 32361, 32366, 32371, 32376, + 32381, 32386, 32390, 32395, + 32400, 32404, 32409, 32413, + 32418, 32422, 32427, 32431, + 32435, 32439, 32443, 32447, + 32451, 32455, 32459, 32463, + 32467, 32471, 32475, 32478, + 32482, 32485, 32489, 32492, + 32496, 32499, 32503, 32506, + 32509, 32513, 32516, 32519, + 32522, 32525, 32528, 32531, + 32534, 32537, 32540, 32543, + 32546, 32548, 32551, 32554, + 32557, 32559, 32562, 32564, + 32567, 32569, 32572, 32574, + 32577, 32579, 32582, 32584, + 32586, 32588, 32591, 32593, + 32595, 32597, 32599, 32602, + 32604, 32606, 32608, 32610, + 32612, 32614, 32616, 32618, + 32619, 32621, 32623, 32625, + 32627, 32628, 32630, 32632, + 32634, 32635, 32637, 32639, + 32640, 32642, 32643, 32645, + 32647, 32648, 32650, 32651, + 32652, 32654, 32655, 32657, + 32658, 32660, 32661, 32662, + 32664, 32665, 32666, 32667, + 32669, 32670, 32671, 32672, + 32674, 32675, 32676, 32677, + 32678, 32679, 32680, 32682, + 32683, 32684, 32685, 32686, + 32687, 32688, 32689, 32690, + 32691, 32692, 32693, 32694, + 32695, 32695, 32696, 32697, + 32698, 32699, 32700, 32701, + 32702, 32702, 32703, 32704, + 32705, 32706, 32706, 32707, + 32708, 32709, 32709, 32710, + 32711, 32712, 32712, 32713, + 32714, 32714, 32715, 32716, + 32716, 32717, 32718, 32718, + 32719, 32719, 32720, 32721, + 32721, 32722, 32722, 32723, + 32723, 32724, 32725, 32725, + 32726, 32726, 32727, 32727, + 32728, 32728, 32729, 32729, + 32730, 32730, 32731, 32731, + 32731, 32732, 32732, 32733, + 32733, 32734, 32734, 32735, + 32735, 32735, 32736, 32736, + 32737, 32737, 32737, 32738, + 32738, 32738, 32739, 32739, + 32739, 32740, 32740, 32741, + 32741, 32741, 32742, 32742, + 32742, 32742, 32743, 32743, + 32743, 32744, 32744, 32744, + 32745, 32745, 32745, 32745, + 32746, 32746, 32746, 32747, + 32747, 32747, 32747, 32748, + 32748, 32748, 32748, 32749, + 32749, 32749, 32749, 32749, + 32750, 32750, 32750, 32750, + 32751, 32751, 32751, 32751, + 32751, 32752, 32752, 32752, + 32752, 32752, 32753, 32753, + 32753, 32753, 32753, 32753, + 32754, 32754, 32754, 32754, + 32754, 32754, 32755, 32755, + 32755, 32755, 32755, 32755, + 32756, 32756, 32756, 32756, + 32756, 32756, 32756, 32757, + 32757, 32757, 32757, 32757, + 32757, 32757, 32757, 32758, + 32758, 32758, 32758, 32758, + 32758, 32758, 32758, 32758, + 32759, 32759, 32759, 32759, + 32759, 32759, 32759, 32759, + 32759, 32760, 32760, 32760, + 32760, 32760, 32760, 32760, + 32760, 32760, 32760, 32760, + 32761, 32761, 32761, 32761, + 32761, 32761, 32761, 32761, + 32761, 32761, 32761, 32761, + 32761, 32762, 32762, 32762, + 32762, 32762, 32762, 32762, + 32762, 32762, 32762, 32762, + 32762, 32762, 32762, 32762, + 32763, 32763, 32763, 32763, + 32763, 32763, 32763, 32763, + 32763, 32763, 32763, 32763, + 32763, 32763, 32763, 32763, + 32763, 32763, 32763, 32764, + 32764, 32764, 32764, 32764, + 32764, 32764, 32764, 32764, + 32764, 32764, 32764, 32764, + 32764, 32764, 32764, 32764, + 32764, 32764, 32764, 32764, + 32764, 32764, 32764, 32765, + 32765, 32765, 32765, 32765, + 32765, 32765, 32765, 32765, + 32765, 32765, 32765, 32765, + 32765, 32765, 32765, 32765, + 32765, 32765, 32765, 32765, + 32765, 32765, 32765, 32765, + 32765, 32765, 32765, 32765, + 32765, 32765, 32765, 32765, + 32765, 32765, 32765, 32765, + 32766, 32766, 32766, 32766, + 32766, 32766, 32766, 32766, + 32766, 32766, 32766, 32766, + 32766, 32766, 32766, 32766, + 32766, 32766, 32766, 32766, + 32766, 32766, 32766, 32766, + 32766, 32766, 32766, 32766, + 32766, 32766, 32766, 32766, + 32766, 32766, 32766, 32766, + 32766, 32766, 32766, 32766, + 32766, 32766, 32766, 32766, + 32766, 32766, 32766, 32766, + 32766, 32766, 32766, 32766, + 32766, 32766, 32766, 32766, + 32766, 32766, 32766, 32766, + 32766, 32766, 32766, 32766, + 32766, 32766, 32766, 32766, + 32767, +}; +const int16_t wav_db[] = { + -32768, -32768, -24576, -19783, + -16384, -13746, -11591, -9770, + -8192, -6799, -5554, -4428, + -3399, -2453, -1578, -762, + 0, 716, 1392, 2031, + 2637, 3213, 3763, 4289, + 4792, 5274, 5738, 6184, + 6613, 7028, 7429, 7816, + 8192, 8555, 8908, 9251, + 9584, 9907, 10223, 10530, + 10829, 11121, 11405, 11683, + 11955, 12221, 12481, 12735, + 12984, 13227, 13466, 13700, + 13930, 14155, 14376, 14592, + 14805, 15015, 15220, 15422, + 15621, 15816, 16008, 16197, + 16384, 16567, 16747, 16925, + 17100, 17273, 17443, 17610, + 17776, 17939, 18099, 18258, + 18415, 18569, 18722, 18872, + 19021, 19168, 19313, 19456, + 19597, 19737, 19875, 20012, + 20147, 20281, 20413, 20543, + 20673, 20800, 20927, 21052, + 21176, 21298, 21419, 21539, + 21658, 21776, 21892, 22007, + 22122, 22235, 22347, 22458, + 22568, 22676, 22784, 22891, + 22997, 23102, 23207, 23310, + 23412, 23514, 23614, 23714, + 23813, 23911, 24008, 24105, + 24200, 24295, 24389, 24483, + 24576, 24667, 24759, 24849, + 24939, 25028, 25117, 25205, + 25292, 25379, 25465, 25550, + 25635, 25719, 25802, 25885, + 25968, 26049, 26131, 26211, + 26291, 26371, 26450, 26529, + 26607, 26684, 26761, 26838, + 26914, 26989, 27064, 27139, + 27213, 27286, 27360, 27432, + 27505, 27576, 27648, 27719, + 27789, 27860, 27929, 27999, + 28067, 28136, 28204, 28272, + 28339, 28406, 28473, 28539, + 28605, 28670, 28735, 28800, + 28865, 28929, 28992, 29056, + 29119, 29181, 29244, 29306, + 29368, 29429, 29490, 29551, + 29611, 29671, 29731, 29791, + 29850, 29909, 29968, 30026, + 30084, 30142, 30199, 30257, + 30314, 30370, 30427, 30483, + 30539, 30594, 30650, 30705, + 30760, 30814, 30868, 30923, + 30976, 31030, 31083, 31136, + 31189, 31242, 31294, 31347, + 31399, 31450, 31502, 31553, + 31604, 31655, 31706, 31756, + 31806, 31856, 31906, 31955, + 32005, 32054, 32103, 32152, + 32200, 32248, 32297, 32345, + 32392, 32440, 32487, 32534, + 32581, 32628, 32675, 32721, + 32721, +}; + + +const int16_t* waveforms_table[] = { + wav_gompertz, + wav_db, +}; + +const uint16_t lut_env_linear[] = { + 0, 257, 514, 771, + 1028, 1285, 1542, 1799, + 2056, 2313, 2570, 2827, + 3084, 3341, 3598, 3855, + 4112, 4369, 4626, 4883, + 5140, 5397, 5654, 5911, + 6168, 6425, 6682, 6939, + 7196, 7453, 7710, 7967, + 8224, 8481, 8738, 8995, + 9252, 9509, 9766, 10023, + 10280, 10537, 10794, 11051, + 11308, 11565, 11822, 12079, + 12336, 12593, 12850, 13107, + 13364, 13621, 13878, 14135, + 14392, 14649, 14906, 15163, + 15420, 15677, 15934, 16191, + 16448, 16705, 16962, 17219, + 17476, 17733, 17990, 18247, + 18504, 18761, 19018, 19275, + 19532, 19789, 20046, 20303, + 20560, 20817, 21074, 21331, + 21588, 21845, 22102, 22359, + 22616, 22873, 23130, 23387, + 23644, 23901, 24158, 24415, + 24672, 24929, 25186, 25443, + 25700, 25957, 26214, 26471, + 26728, 26985, 27242, 27499, + 27756, 28013, 28270, 28527, + 28784, 29041, 29298, 29555, + 29812, 30069, 30326, 30583, + 30840, 31097, 31354, 31611, + 31868, 32125, 32382, 32639, + 32896, 33153, 33410, 33667, + 33924, 34181, 34438, 34695, + 34952, 35209, 35466, 35723, + 35980, 36237, 36494, 36751, + 37008, 37265, 37522, 37779, + 38036, 38293, 38550, 38807, + 39064, 39321, 39578, 39835, + 40092, 40349, 40606, 40863, + 41120, 41377, 41634, 41891, + 42148, 42405, 42662, 42919, + 43176, 43433, 43690, 43947, + 44204, 44461, 44718, 44975, + 45232, 45489, 45746, 46003, + 46260, 46517, 46774, 47031, + 47288, 47545, 47802, 48059, + 48316, 48573, 48830, 49087, + 49344, 49601, 49858, 50115, + 50372, 50629, 50886, 51143, + 51400, 51657, 51914, 52171, + 52428, 52685, 52942, 53199, + 53456, 53713, 53970, 54227, + 54484, 54741, 54998, 55255, + 55512, 55769, 56026, 56283, + 56540, 56797, 57054, 57311, + 57568, 57825, 58082, 58339, + 58596, 58853, 59110, 59367, + 59624, 59881, 60138, 60395, + 60652, 60909, 61166, 61423, + 61680, 61937, 62194, 62451, + 62708, 62965, 63222, 63479, + 63736, 63993, 64250, 64507, + 64764, 65021, 65278, 65535, + 65535, +}; +const uint16_t lut_env_expo[] = { + 0, 1035, 2054, 3057, + 4045, 5018, 5975, 6918, + 7846, 8760, 9659, 10545, + 11416, 12275, 13120, 13952, + 14771, 15577, 16371, 17152, + 17921, 18679, 19425, 20159, + 20881, 21593, 22294, 22983, + 23662, 24331, 24989, 25637, + 26274, 26902, 27520, 28129, + 28728, 29318, 29899, 30471, + 31034, 31588, 32133, 32670, + 33199, 33720, 34232, 34737, + 35233, 35722, 36204, 36678, + 37145, 37604, 38056, 38502, + 38940, 39371, 39796, 40215, + 40626, 41032, 41431, 41824, + 42211, 42592, 42967, 43336, + 43699, 44057, 44409, 44756, + 45097, 45434, 45764, 46090, + 46411, 46727, 47037, 47344, + 47645, 47941, 48233, 48521, + 48804, 49083, 49357, 49627, + 49893, 50155, 50412, 50666, + 50916, 51162, 51404, 51642, + 51877, 52108, 52335, 52559, + 52780, 52997, 53210, 53421, + 53628, 53831, 54032, 54230, + 54424, 54616, 54804, 54990, + 55173, 55353, 55530, 55704, + 55876, 56045, 56211, 56375, + 56536, 56695, 56851, 57005, + 57157, 57306, 57453, 57597, + 57740, 57880, 58018, 58153, + 58287, 58419, 58548, 58676, + 58801, 58925, 59047, 59167, + 59285, 59401, 59515, 59628, + 59739, 59848, 59955, 60061, + 60165, 60267, 60368, 60468, + 60566, 60662, 60757, 60850, + 60942, 61032, 61121, 61209, + 61295, 61380, 61464, 61546, + 61628, 61707, 61786, 61863, + 61939, 62014, 62088, 62161, + 62233, 62303, 62372, 62441, + 62508, 62574, 62639, 62703, + 62767, 62829, 62890, 62950, + 63010, 63068, 63125, 63182, + 63238, 63293, 63347, 63400, + 63452, 63504, 63554, 63604, + 63654, 63702, 63750, 63797, + 63843, 63888, 63933, 63977, + 64021, 64063, 64105, 64147, + 64188, 64228, 64267, 64306, + 64344, 64382, 64419, 64456, + 64492, 64527, 64562, 64596, + 64630, 64664, 64696, 64729, + 64760, 64792, 64822, 64853, + 64883, 64912, 64941, 64969, + 64997, 65025, 65052, 65079, + 65105, 65131, 65157, 65182, + 65206, 65231, 65255, 65278, + 65302, 65324, 65347, 65369, + 65391, 65412, 65434, 65454, + 65475, 65495, 65515, 65535, + 65535, +}; +const uint16_t lut_env_quartic[] = { + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 1, 1, + 2, 3, 4, 5, + 6, 8, 9, 11, + 14, 16, 19, 22, + 25, 29, 33, 37, + 42, 48, 53, 59, + 66, 73, 81, 89, + 98, 107, 117, 128, + 139, 151, 164, 177, + 191, 206, 222, 238, + 256, 274, 293, 313, + 334, 355, 378, 402, + 427, 453, 480, 508, + 537, 567, 599, 631, + 665, 700, 737, 775, + 814, 854, 896, 939, + 984, 1030, 1077, 1127, + 1177, 1230, 1283, 1339, + 1396, 1455, 1515, 1577, + 1641, 1707, 1775, 1844, + 1916, 1989, 2064, 2141, + 2220, 2302, 2385, 2470, + 2557, 2647, 2739, 2833, + 2929, 3027, 3128, 3231, + 3336, 3444, 3554, 3667, + 3782, 3899, 4019, 4142, + 4267, 4395, 4525, 4658, + 4794, 4933, 5074, 5218, + 5365, 5515, 5668, 5824, + 5983, 6144, 6309, 6477, + 6648, 6822, 6999, 7179, + 7363, 7550, 7740, 7933, + 8130, 8330, 8534, 8741, + 8951, 9165, 9383, 9604, + 9829, 10057, 10289, 10525, + 10765, 11008, 11255, 11507, + 11761, 12020, 12283, 12550, + 12821, 13096, 13375, 13658, + 13945, 14237, 14532, 14832, + 15137, 15445, 15758, 16076, + 16397, 16724, 17054, 17390, + 17730, 18074, 18423, 18777, + 19136, 19499, 19868, 20241, + 20618, 21001, 21389, 21781, + 22179, 22582, 22990, 23403, + 23821, 24244, 24672, 25106, + 25545, 25990, 26440, 26895, + 27355, 27821, 28293, 28770, + 29253, 29742, 30236, 30735, + 31241, 31752, 32270, 32793, + 33321, 33856, 34397, 34944, + 35497, 36056, 36621, 37192, + 37769, 38353, 38943, 39539, + 40142, 40751, 41366, 41988, + 42617, 43251, 43893, 44541, + 45196, 45857, 46526, 47201, + 47882, 48571, 49267, 49969, + 50678, 51395, 52118, 52849, + 53587, 54332, 55084, 55843, + 56610, 57384, 58165, 58954, + 59750, 60553, 61364, 62183, + 63010, 63843, 64685, 65535, + 65535, +}; +const uint16_t lut_square_root[] = { + 0, 4095, 5792, 7094, + 8191, 9158, 10032, 10836, + 11585, 12287, 12952, 13584, + 14188, 14768, 15325, 15863, + 16383, 16887, 17377, 17853, + 18317, 18769, 19211, 19643, + 20065, 20479, 20885, 21283, + 21673, 22057, 22434, 22805, + 23170, 23529, 23883, 24231, + 24575, 24914, 25249, 25579, + 25904, 26226, 26544, 26858, + 27169, 27476, 27779, 28080, + 28377, 28671, 28962, 29250, + 29536, 29818, 30098, 30376, + 30651, 30923, 31193, 31461, + 31726, 31990, 32251, 32510, + 32767, 33022, 33275, 33526, + 33775, 34023, 34269, 34512, + 34755, 34995, 35234, 35471, + 35707, 35941, 36174, 36405, + 36635, 36863, 37090, 37315, + 37539, 37762, 37984, 38204, + 38423, 38640, 38857, 39072, + 39286, 39499, 39711, 39922, + 40131, 40340, 40547, 40754, + 40959, 41163, 41366, 41569, + 41770, 41970, 42170, 42368, + 42566, 42762, 42958, 43153, + 43347, 43540, 43732, 43924, + 44114, 44304, 44493, 44681, + 44868, 45055, 45241, 45426, + 45610, 45793, 45976, 46158, + 46340, 46520, 46700, 46880, + 47058, 47236, 47413, 47590, + 47766, 47941, 48116, 48290, + 48463, 48636, 48808, 48980, + 49151, 49321, 49491, 49660, + 49829, 49997, 50164, 50331, + 50498, 50663, 50829, 50994, + 51158, 51321, 51485, 51647, + 51809, 51971, 52132, 52293, + 52453, 52613, 52772, 52931, + 53089, 53247, 53404, 53561, + 53717, 53873, 54029, 54184, + 54338, 54492, 54646, 54799, + 54952, 55105, 55257, 55408, + 55559, 55710, 55861, 56011, + 56160, 56309, 56458, 56606, + 56754, 56902, 57049, 57196, + 57343, 57489, 57634, 57780, + 57925, 58069, 58214, 58358, + 58501, 58644, 58787, 58930, + 59072, 59214, 59355, 59496, + 59637, 59778, 59918, 60058, + 60197, 60336, 60475, 60614, + 60752, 60890, 61028, 61165, + 61302, 61439, 61575, 61711, + 61847, 61982, 62117, 62252, + 62387, 62521, 62655, 62789, + 62922, 63056, 63189, 63321, + 63453, 63586, 63717, 63849, + 63980, 64111, 64242, 64372, + 64502, 64632, 64762, 64891, + 65020, 65149, 65278, 65406, + 65406, +}; +const uint16_t lut_svf_cutoff[] = { + 54, 57, 60, 64, + 68, 72, 76, 81, + 85, 91, 96, 102, + 108, 114, 121, 128, + 136, 144, 153, 162, + 171, 182, 192, 204, + 216, 229, 243, 257, + 272, 289, 306, 324, + 343, 364, 385, 408, + 433, 458, 486, 515, + 545, 578, 612, 648, + 687, 728, 771, 817, + 866, 917, 972, 1030, + 1091, 1156, 1225, 1297, + 1375, 1456, 1543, 1635, + 1732, 1835, 1944, 2060, + 2182, 2312, 2449, 2595, + 2749, 2912, 3085, 3269, + 3463, 3669, 3887, 4118, + 4362, 4621, 4895, 5186, + 5494, 5819, 6165, 6530, + 6917, 7327, 7760, 8219, + 8705, 9220, 9764, 10340, + 10949, 11593, 12275, 12995, + 13757, 14562, 15412, 16309, + 17257, 18256, 19310, 20421, + 21591, 22822, 24116, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, 25078, 25078, 25078, + 25078, +}; +const uint16_t lut_svf_damp[] = { + 65534, 49166, 46069, 43993, + 42386, 41058, 39917, 38910, + 38007, 37184, 36427, 35726, + 35070, 34454, 33873, 33322, + 32798, 32299, 31820, 31361, + 30920, 30496, 30086, 29690, + 29306, 28935, 28574, 28224, + 27883, 27551, 27228, 26912, + 26605, 26304, 26010, 25723, + 25441, 25166, 24896, 24631, + 24371, 24116, 23866, 23620, + 23379, 23141, 22908, 22678, + 22452, 22229, 22010, 21794, + 21581, 21371, 21164, 20960, + 20759, 20560, 20365, 20171, + 19980, 19791, 19605, 19421, + 19239, 19059, 18882, 18706, + 18532, 18360, 18190, 18022, + 17856, 17691, 17528, 17367, + 17207, 17049, 16892, 16737, + 16583, 16431, 16280, 16131, + 15982, 15836, 15690, 15546, + 15403, 15261, 15120, 14981, + 14843, 14705, 14569, 14434, + 14300, 14167, 14036, 13905, + 13775, 13646, 13518, 13391, + 13265, 13140, 13015, 12892, + 12769, 12648, 12527, 12407, + 12287, 12169, 12051, 11934, + 11818, 11703, 11588, 11474, + 11361, 11249, 11137, 11026, + 10915, 10805, 10696, 10588, + 10480, 10373, 10266, 10160, + 10055, 9950, 9846, 9742, + 9639, 9537, 9435, 9333, + 9233, 9132, 9033, 8933, + 8835, 8737, 8639, 8542, + 8445, 8349, 8253, 8158, + 8063, 7969, 7875, 7782, + 7689, 7596, 7504, 7413, + 7321, 7231, 7140, 7050, + 6961, 6872, 6783, 6695, + 6607, 6519, 6432, 6346, + 6259, 6173, 6088, 6003, + 5918, 5833, 5749, 5665, + 5582, 5499, 5416, 5334, + 5251, 5170, 5088, 5007, + 4926, 4846, 4766, 4686, + 4607, 4527, 4449, 4370, + 4292, 4214, 4136, 4059, + 3982, 3905, 3828, 3752, + 3676, 3601, 3525, 3450, + 3375, 3301, 3226, 3152, + 3078, 3005, 2932, 2859, + 2786, 2713, 2641, 2569, + 2497, 2426, 2355, 2284, + 2213, 2142, 2072, 2002, + 1932, 1862, 1793, 1724, + 1655, 1586, 1518, 1449, + 1381, 1313, 1246, 1178, + 1111, 1044, 977, 911, + 844, 778, 712, 647, + 581, 516, 450, 385, + 321, 256, 192, 127, + 63, +}; +const uint16_t lut_2164_gain[] = { + 32767, 31340, 29975, 28670, + 27421, 26227, 25085, 23993, + 22948, 21948, 20993, 20078, + 19204, 18368, 17568, 16803, + 16071, 15371, 14702, 14062, + 13449, 12864, 12303, 11768, + 11255, 10765, 10296, 9848, + 9419, 9009, 8617, 8241, + 7882, 7539, 7211, 6897, + 6596, 6309, 6034, 5772, + 5520, 5280, 5050, 4830, + 4620, 4418, 4226, 4042, + 3866, 3698, 3537, 3383, + 3235, 3094, 2960, 2831, + 2707, 2589, 2477, 2369, + 2266, 2167, 2073, 1982, + 1896, 1813, 1734, 1659, + 1587, 1517, 1451, 1388, + 1328, 1270, 1215, 1162, + 1111, 1063, 1016, 972, + 930, 889, 850, 813, + 778, 744, 712, 681, + 651, 623, 595, 569, + 545, 521, 498, 477, + 456, 436, 417, 399, + 381, 365, 349, 334, + 319, 305, 292, 279, + 267, 255, 244, 233, + 223, 214, 204, 195, + 187, 179, 171, 163, + 156, 149, 143, 137, + 131, 125, 119, 114, + 109, 104, 100, 96, + 91, 87, 84, 80, + 76, 73, 70, 67, + 64, 61, 58, 56, + 53, 51, 49, 47, + 45, 43, 41, 39, + 37, 36, 34, 32, + 31, 30, 28, 27, + 26, 25, 24, 23, + 22, 21, 20, 19, + 18, 17, 16, 16, + 15, 14, 14, 13, + 12, 12, 11, 11, + 10, 10, 9, 9, + 9, 8, 8, 7, + 7, 7, 6, 6, + 6, 6, 5, 5, + 5, 5, 4, 4, + 4, 4, 4, 3, + 3, 3, 3, 3, + 3, 2, 2, 2, + 2, 2, 2, 2, + 2, 2, 1, 1, + 1, 1, 1, 1, + 1, 1, 1, 1, + 1, 1, 1, 1, + 1, 1, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, +}; +const uint16_t lut_compressor_ratio[] = { + 256, 255, 255, 255, + 254, 253, 252, 251, + 250, 248, 246, 245, + 243, 241, 238, 236, + 234, 231, 228, 226, + 223, 220, 217, 214, + 211, 208, 205, 202, + 198, 195, 192, 189, + 186, 183, 179, 176, + 173, 170, 167, 164, + 161, 158, 155, 152, + 149, 146, 144, 141, + 138, 136, 133, 131, + 128, 126, 123, 121, + 119, 116, 114, 112, + 110, 108, 106, 104, + 102, 100, 98, 96, + 95, 93, 91, 89, + 88, 86, 85, 83, + 82, 80, 79, 77, + 76, 75, 73, 72, + 71, 70, 69, 67, + 66, 65, 64, 63, + 62, 61, 60, 59, + 58, 57, 56, 55, + 54, 54, 53, 52, + 51, 50, 50, 49, + 48, 47, 47, 46, + 45, 45, 44, 43, + 43, 42, 41, 41, + 40, 40, 39, 39, + 38, 38, 37, 37, + 36, 36, 35, 35, + 34, 34, 33, 33, + 32, 32, 32, 31, + 31, 30, 30, 30, + 29, 29, 29, 28, + 28, 28, 27, 27, + 27, 26, 26, 26, + 25, 25, 25, 24, + 24, 24, 24, 23, + 23, 23, 23, 22, + 22, 22, 22, 21, + 21, 21, 21, 20, + 20, 20, 20, 20, + 19, 19, 19, 19, + 19, 18, 18, 18, + 18, 18, 18, 17, + 17, 17, 17, 17, + 16, 16, 16, 16, + 16, 16, 16, 15, + 15, 15, 15, 15, + 15, 15, 14, 14, + 14, 14, 14, 14, + 14, 14, 13, 13, + 13, 13, 13, 13, + 13, 13, 12, 12, + 12, 12, 12, 12, + 12, 12, 12, 12, + 11, 11, 11, 11, + 11, 11, 11, 11, + 11, 11, 11, 10, + 10, 10, 10, 10, + 10, 10, 10, 10, + 10, +}; +const uint16_t lut_soft_knee[] = { + 0, 0, 0, 0, + 0, 0, 0, 1, + 1, 2, 3, 5, + 6, 8, 10, 13, + 15, 19, 22, 26, + 31, 36, 41, 47, + 53, 61, 68, 76, + 85, 95, 105, 116, + 127, 140, 153, 167, + 182, 197, 214, 231, + 249, 269, 289, 310, + 332, 355, 380, 405, + 431, 459, 488, 518, + 549, 581, 615, 649, + 685, 723, 762, 802, + 843, 886, 930, 976, + 1023, 1072, 1123, 1174, + 1228, 1283, 1339, 1398, + 1457, 1519, 1582, 1647, + 1714, 1783, 1853, 1925, + 1999, 2075, 2153, 2233, + 2315, 2398, 2484, 2572, + 2661, 2753, 2847, 2943, + 3041, 3141, 3244, 3349, + 3455, 3565, 3676, 3790, + 3906, 4024, 4145, 4268, + 4393, 4521, 4652, 4785, + 4920, 5058, 5199, 5342, + 5487, 5636, 5787, 5940, + 6097, 6256, 6417, 6582, + 6749, 6920, 7093, 7268, + 7447, 7629, 7813, 8001, + 8191, 8385, 8581, 8781, + 8984, 9189, 9398, 9610, + 9825, 10044, 10265, 10490, + 10718, 10949, 11184, 11422, + 11663, 11908, 12156, 12408, + 12663, 12921, 13183, 13448, + 13717, 13990, 14266, 14546, + 14829, 15116, 15407, 15701, + 15999, 16301, 16607, 16916, + 17229, 17547, 17868, 18192, + 18521, 18854, 19191, 19531, + 19876, 20225, 20577, 20934, + 21295, 21660, 22029, 22403, + 22780, 23162, 23548, 23939, + 24333, 24732, 25135, 25543, + 25955, 26371, 26792, 27217, + 27647, 28081, 28520, 28963, + 29411, 29864, 30321, 30783, + 31249, 31720, 32196, 32676, + 33162, 33652, 34147, 34646, + 35151, 35660, 36175, 36694, + 37218, 37747, 38282, 38821, + 39365, 39914, 40469, 41028, + 41593, 42162, 42737, 43317, + 43903, 44493, 45089, 45691, + 46297, 46909, 47526, 48149, + 48777, 49410, 50049, 50694, + 51343, 51999, 52660, 53326, + 53999, 54676, 55360, 56049, + 56744, 57444, 58151, 58863, + 59581, 60304, 61034, 61769, + 62510, 63257, 64010, 64770, + 65535, +}; + + +const uint16_t* lookup_table_table[] = { + lut_env_linear, + lut_env_expo, + lut_env_quartic, + lut_square_root, + lut_svf_cutoff, + lut_svf_damp, + lut_2164_gain, + lut_compressor_ratio, + lut_soft_knee, +}; + +const uint32_t lut_env_increments[] = { + 276301411, 231949934, 196150997, 166999666, + 143068141, 123273939, 106787653, 92967541, + 81312526, 71428035, 63000899, 55780710, + 49565850, 44192924, 39528695, 35463892, + 31908401, 28787528, 26039050, 23610894, + 21459288, 19547282, 17843559, 16321476, + 14958281, 13734481, 12633316, 11640330, + 10743016, 9930523, 9193410, 8523437, + 7913397, 7356972, 6848604, 6383397, + 5957029, 5565672, 5205932, 4874792, + 4569569, 4287864, 4027536, 3786669, + 3563542, 3356609, 3164482, 2985906, + 2819752, 2664995, 2520711, 2386061, + 2260283, 2142684, 2032635, 1929561, + 1832939, 1742290, 1657176, 1577196, + 1501984, 1431202, 1364541, 1301717, + 1242466, 1186549, 1133742, 1083841, + 1036655, 992009, 949741, 909701, + 871748, 835755, 801600, 769172, + 738367, 709089, 681248, 654760, + 629547, 605536, 582659, 560852, + 540056, 520215, 501277, 483193, + 465917, 449406, 433620, 418521, + 404074, 390245, 377002, 364316, + 352160, 340506, 329331, 318610, + 308322, 298445, 288962, 279851, + 271097, 262683, 254593, 246811, + 239325, 232121, 225185, 218507, + 212074, 205876, 199903, 194146, + 188594, 183239, 178072, 173087, + 168275, 163628, 159142, 154807, + 150620, 146573, 142661, 138879, + 135221, 131683, 128260, 124947, + 121741, 118636, 115630, 112719, + 109899, 107166, 104518, 101951, + 99463, 97050, 94709, 92439, + 90236, 88099, 86025, 84011, + 82056, 80157, 78313, 76521, + 74781, 73090, 71446, 69848, + 68295, 66785, 65316, 63887, + 62497, 61145, 59829, 58549, + 57302, 56089, 54907, 53756, + 52636, 51544, 50480, 49444, + 48434, 47450, 46491, 45556, + 44644, 43755, 42888, 42043, + 41218, 40413, 39628, 38862, + 38114, 37384, 36671, 35976, + 35296, 34633, 33985, 33353, + 32735, 32131, 31541, 30965, + 30401, 29851, 29313, 28786, + 28272, 27769, 27277, 26796, + 26326, 25866, 25416, 24975, + 24545, 24123, 23710, 23307, + 22911, 22524, 22146, 21775, + 21412, 21056, 20708, 20367, + 20033, 19705, 19385, 19071, + 18763, 18461, 18166, 17876, + 17592, 17314, 17041, 16774, + 16512, 16254, 16002, 15755, + 15513, 15275, 15041, 14812, + 14588, 14368, 14151, 13939, + 13731, 13527, 13326, 13130, + 12936, 12747, 12561, 12378, + 12198, 12022, 11849, 11679, + 11512, +}; +const uint32_t lut_lp_coefficients[] = { + 590672516, 319034455, 133800766, 67976239, + 63327094, 62214607, 61121376, 60047077, + 58991393, 57954009, 56934619, 55932918, + 54948609, 53981397, 53030993, 52097114, + 51179478, 50277811, 49391841, 48521302, + 47665932, 46825472, 45999668, 45188271, + 44391035, 43607717, 42838081, 42081892, + 41338919, 40608937, 39891723, 39187058, + 38494727, 37814517, 37146221, 36489633, + 35844551, 35210779, 34588120, 33976383, + 33375380, 32784926, 32204838, 31634936, + 31075046, 30524993, 29984607, 29453721, + 28932170, 28419793, 27916429, 27421923, + 26936121, 26458872, 25990026, 25529439, + 25076965, 24632464, 24195797, 23766828, + 23345422, 22931447, 22524774, 22125276, + 21732827, 21347304, 20968586, 20596554, + 20231092, 19872084, 19519417, 19172981, + 18832666, 18498365, 18169974, 17847387, + 17530504, 17219225, 16913451, 16613085, + 16318033, 16028202, 15743500, 15463836, + 15189122, 14919272, 14654199, 14393820, + 14138052, 13886814, 13640026, 13397610, + 13159489, 12925588, 12695832, 12470147, + 12248464, 12030709, 11816816, 11606715, + 11400339, 11197623, 10998503, 10802914, + 10610795, 10422085, 10236722, 10054649, + 9875806, 9700137, 9527587, 9358098, + 9191619, 9028094, 8867473, 8709704, + 8554736, 8402520, 8253007, 8106150, + 7961901, 7820214, 7681044, 7544346, + 7410077, 7278193, 7148653, 7021415, + 6896437, 6773681, 6653106, 6534675, + 6418348, 6304089, 6191861, 6081629, + 5973356, 5867008, 5762550, 5659950, + 5559175, 5460191, 5362968, 5267474, + 5173678, 5081550, 4991061, 4902182, + 4814883, 4729137, 4644917, 4562195, + 4480945, 4401140, 4322755, 4245764, + 4170144, 4095869, 4022916, 3951261, + 3880881, 3811754, 3743857, 3677168, + 3611666, 3547330, 3484139, 3422073, + 3361112, 3301236, 3242425, 3184662, + 3127927, 3072202, 3017468, 2963710, + 2910908, 2859047, 2808109, 2758078, + 2708937, 2660672, 2613266, 2566704, + 2520972, 2476054, 2431935, 2388602, + 2346041, 2304238, 2263180, 2222853, + 2183243, 2144340, 2106129, 2068599, + 2031737, 1995532, 1959971, 1925044, + 1890740, 1857046, 1823952, 1791448, + 1759523, 1728167, 1697369, 1667120, + 1637410, 1608229, 1579568, 1551417, + 1523768, 1496612, 1469939, 1443741, + 1418011, 1392739, 1367917, 1343537, + 1319591, 1296073, 1272973, 1250285, + 1228001, 1206114, 1184617, 1163504, + 1142766, 1122398, 1102393, 1082744, + 1063446, 1044491, 1025874, 1007589, + 989630, 971991, 954666, 937650, + 920937, 904521, 888399, 872564, + 857011, 841735, 826731, 811995, + 797521, 783305, 769343, 755630, + 742160, 728931, 715938, 703176, + 690642, 678331, 666240, 654364, + 642699, 631243, 619991, 608939, + 598084, 587423, 576952, 566667, + 556566, 546644, 536900, 527329, + 517929, 508696, 499628, 490722, + 481974, 473383, 464944, 456656, + 448515, 440520, 432667, 424954, + 417379, 409938, 402631, 395453, + 388404, 381480, 374679, 368000, + 361440, 354997, 348668, 342453, + 336348, 330352, 324463, 318678, + 312997, 307418, 301937, 296555, + 291268, 286076, 280976, 275967, + 271047, 266215, 261469, 256808, + 252230, 247733, 243317, 238979, + 234719, 230535, 226425, 222388, + 218424, 214530, 210705, 206949, + 203260, 199636, 196077, 192582, + 189148, 185776, 182465, 179212, + 176017, 172879, 169797, 166770, + 163797, 160877, 158009, 155192, + 152425, 149708, 147039, 144417, + 141843, 139314, 136830, 134391, + 131995, 129642, 127331, 125061, + 122831, 120641, 118491, 116378, + 114304, 112266, 110264, 108299, + 106368, 104472, 102609, 100780, + 98983, 97218, 95485, 93783, + 92111, 90469, 88856, 87272, + 85716, 84188, 82687, 81213, + 79765, 78343, 76946, 75574, + 74227, 72904, 71604, 70328, + 69074, 67842, 66633, 65445, + 64278, 63132, 62007, 60901, + 59815, 58749, 57702, 56673, + 55663, 54670, 53696, 52738, + 51798, 50875, 49968, 49077, + 48202, 47343, 46498, 45669, + 44855, 44056, 43270, 42499, + 41741, 40997, 40266, 39548, + 38843, 38151, 37470, 36802, + 36146, 35502, 34869, 34247, + 33637, 33037, 32448, 31870, + 31301, 30743, 30195, 29657, + 29128, 28609, 28099, 27598, + 27106, 26623, 26148, 25682, + 25224, 24774, 24332, 23899, + 23473, 23054, 22643, 22239, + 21843, 21454, 21071, 20695, + 20326, 19964, 19608, 19258, + 18915, 18578, 18247, 17921, + 17602, 17288, 16980, 16677, + 16380, 16088, 15801, 15519, + 15243, 14971, 14704, 14442, + 14184, 13931, 13683, 13439, + 13199, 12964, 12733, 12506, + 12283, 12064, 11849, 11638, + 11430, 11226, 11026, 10830, + 10637, 10447, 10261, 10078, + 9898, 9722, 9548, 9378, + 9211, 9047, 8885, 8727, + 8571, 8418, 8268, 8121, + 7976, 7834, 7694, 7557, + 7422, 7290, 7160, 7032, + 6907, 6784, 6663, 6544, + 6427, 6313, 6200, 6090, + 5981, 5875, 5770, 5667, + 5566, 5467, 5369, 5273, + 5179, 5087, 4996, 4907, + 4820, 4734, 4649, 4567, + 4485, 4405, 4327, 4249, + 4174, 4099, 4026, 3954, + 3884, 3815, 3747, 3680, + 3614, 3550, 3486, 3424, + 3363, 3303, 3244, 3187, + 3130, 3074, 3019, 2965, + 2912, 2860, 2809, 2759, + 2710, 2662, 2614, 2568, + 2522, 2477, 2433, 2389, + 2347, 2305, 2264, 2224, + 2184, 2145, 2107, 2069, + 2032, 1996, 1960, 1925, + 1891, 1857, 1824, 1792, + 1760, 1728, 1698, 1667, + 1638, 1608, 1580, 1551, + 1524, 1497, 1470, 1444, + 1418, 1393, 1368, 1343, + 1319, 1296, 1273, 1250, + 1228, 1206, 1184, 1163, + 1143, 1122, 1102, 1083, + 1063, 1044, 1026, 1007, + 989, 972, 954, 937, + 921, 904, 888, 872, + 857, 841, 826, 812, + 797, 783, 769, 755, + 742, 729, 716, 703, +}; +const uint32_t lut_exp2[] = { + 65536, 65713, 65891, 66070, + 66249, 66429, 66609, 66789, + 66971, 67152, 67334, 67517, + 67700, 67883, 68067, 68252, + 68437, 68623, 68809, 68995, + 69182, 69370, 69558, 69747, + 69936, 70125, 70315, 70506, + 70697, 70889, 71081, 71274, + 71467, 71661, 71855, 72050, + 72245, 72441, 72638, 72834, + 73032, 73230, 73429, 73628, + 73827, 74027, 74228, 74429, + 74631, 74833, 75036, 75240, + 75444, 75648, 75853, 76059, + 76265, 76472, 76679, 76887, + 77096, 77305, 77514, 77725, + 77935, 78147, 78359, 78571, + 78784, 78998, 79212, 79427, + 79642, 79858, 80074, 80292, + 80509, 80727, 80946, 81166, + 81386, 81607, 81828, 82050, + 82272, 82495, 82719, 82943, + 83168, 83394, 83620, 83846, + 84074, 84302, 84530, 84759, + 84989, 85220, 85451, 85682, + 85915, 86148, 86381, 86615, + 86850, 87086, 87322, 87559, + 87796, 88034, 88273, 88512, + 88752, 88993, 89234, 89476, + 89718, 89962, 90206, 90450, + 90695, 90941, 91188, 91435, + 91683, 91932, 92181, 92431, + 92681, 92933, 93185, 93437, + 93691, 93945, 94199, 94455, + 94711, 94968, 95225, 95483, + 95742, 96002, 96262, 96523, + 96785, 97047, 97310, 97574, + 97839, 98104, 98370, 98637, + 98904, 99172, 99441, 99711, + 99981, 100252, 100524, 100797, + 101070, 101344, 101619, 101894, + 102170, 102447, 102725, 103004, + 103283, 103563, 103844, 104125, + 104408, 104691, 104975, 105259, + 105545, 105831, 106118, 106405, + 106694, 106983, 107273, 107564, + 107856, 108148, 108441, 108735, + 109030, 109326, 109622, 109919, + 110217, 110516, 110816, 111116, + 111418, 111720, 112023, 112326, + 112631, 112936, 113243, 113550, + 113857, 114166, 114476, 114786, + 115097, 115409, 115722, 116036, + 116351, 116666, 116982, 117300, + 117618, 117936, 118256, 118577, + 118898, 119221, 119544, 119868, + 120193, 120519, 120846, 121173, + 121502, 121831, 122162, 122493, + 122825, 123158, 123492, 123827, + 124162, 124499, 124837, 125175, + 125514, 125855, 126196, 126538, + 126881, 127225, 127570, 127916, + 128263, 128611, 128959, 129309, + 129660, 130011, 130364, 130717, + 131072, +}; +const uint32_t lut_log2[] = { + 524288, 524656, 525023, 525389, + 525753, 526116, 526478, 526838, + 527197, 527554, 527910, 528265, + 528619, 528971, 529322, 529671, + 530019, 530366, 530712, 531057, + 531400, 531742, 532082, 532422, + 532760, 533097, 533433, 533768, + 534101, 534434, 534765, 535095, + 535424, 535751, 536078, 536403, + 536728, 537051, 537373, 537694, + 538014, 538333, 538651, 538968, + 539283, 539598, 539912, 540224, + 540536, 540846, 541156, 541464, + 541772, 542078, 542384, 542688, + 542992, 543294, 543596, 543896, + 544196, 544495, 544793, 545089, + 545385, 545680, 545974, 546268, + 546560, 546851, 547142, 547431, + 547720, 548008, 548295, 548581, + 548866, 549150, 549434, 549717, + 549998, 550279, 550560, 550839, + 551117, 551395, 551672, 551948, + 552223, 552498, 552771, 553044, + 553316, 553588, 553858, 554128, + 554397, 554665, 554932, 555199, + 555465, 555730, 555995, 556259, + 556522, 556784, 557045, 557306, + 557566, 557826, 558084, 558342, + 558600, 558856, 559112, 559367, + 559622, 559876, 560129, 560381, + 560633, 560884, 561135, 561384, + 561634, 561882, 562130, 562377, + 562624, 562870, 563115, 563359, + 563603, 563847, 564089, 564332, + 564573, 564814, 565054, 565294, + 565533, 565771, 566009, 566247, + 566483, 566719, 566955, 567190, + 567424, 567658, 567891, 568124, + 568356, 568587, 568818, 569048, + 569278, 569507, 569736, 569964, + 570192, 570419, 570645, 570871, + 571096, 571321, 571545, 571769, + 571992, 572215, 572437, 572659, + 572880, 573101, 573321, 573541, + 573760, 573978, 574197, 574414, + 574631, 574848, 575064, 575280, + 575495, 575709, 575923, 576137, + 576350, 576563, 576775, 576987, + 577198, 577409, 577619, 577829, + 578039, 578248, 578456, 578664, + 578872, 579079, 579286, 579492, + 579698, 579903, 580108, 580312, + 580516, 580720, 580923, 581125, + 581328, 581530, 581731, 581932, + 582132, 582332, 582532, 582731, + 582930, 583129, 583327, 583524, + 583721, 583918, 584115, 584311, + 584506, 584701, 584896, 585090, + 585284, 585478, 585671, 585864, + 586056, 586248, 586440, 586631, + 586822, 587012, 587202, 587392, + 587581, 587770, 587959, 588147, + 588335, 588522, 588709, 588896, + 589082, 589268, 589453, 589639, + 589824, +}; +const uint32_t lut_lorenz_rate[] = { + 3, 3, 3, 4, + 4, 4, 4, 4, + 5, 5, 5, 5, + 6, 6, 6, 7, + 7, 7, 8, 8, + 8, 9, 9, 10, + 10, 11, 11, 12, + 12, 13, 13, 14, + 15, 15, 16, 17, + 18, 18, 19, 20, + 21, 22, 23, 24, + 25, 27, 28, 29, + 30, 32, 33, 35, + 36, 38, 40, 42, + 44, 46, 48, 50, + 52, 55, 57, 60, + 63, 66, 69, 72, + 75, 78, 82, 86, + 90, 94, 98, 103, + 107, 112, 118, 123, + 129, 135, 141, 147, + 154, 161, 168, 176, + 184, 193, 201, 211, + 220, 230, 241, 252, + 263, 275, 288, 301, + 315, 329, 344, 360, + 377, 394, 412, 431, + 451, 471, 493, 515, + 539, 563, 589, 616, + 644, 674, 705, 737, + 770, 806, 843, 881, + 921, 963, 1007, 1054, + 1102, 1152, 1205, 1260, + 1317, 1378, 1441, 1506, + 1575, 1647, 1722, 1801, + 1883, 1970, 2060, 2154, + 2252, 2355, 2463, 2575, + 2693, 2816, 2945, 3079, + 3220, 3367, 3521, 3682, + 3850, 4026, 4210, 4402, + 4603, 4814, 5034, 5264, + 5504, 5756, 6019, 6294, + 6581, 6882, 7196, 7525, + 7869, 8229, 8605, 8998, + 9409, 9839, 10288, 10758, + 11250, 11764, 12302, 12864, + 13451, 14066, 14709, 15381, + 16083, 16818, 17587, 18390, + 19230, 20109, 21028, 21989, + 22993, 24044, 25142, 26291, + 27492, 28748, 30062, 31435, + 32872, 34374, 35944, 37586, + 39304, 41099, 42977, 44941, + 46994, 49141, 51386, 53734, + 56189, 58756, 61441, 64248, + 67184, 70253, 73463, 76819, + 80329, 83999, 87837, 91850, + 96047, 100435, 105024, 109822, + 114840, 120087, 125573, 131310, + 137310, 143583, 150144, 157003, + 164177, 171678, 179521, 187723, + 196300, 205269, 214647, 224454, + 234709, 245433, 256646, 268372, + 280634, 293455, 306863, 320883, + 335544, +}; + + +const uint32_t* lookup_table_32_table[] = { + lut_env_increments, + lut_lp_coefficients, + lut_exp2, + lut_log2, + lut_lorenz_rate, +}; + + +} // namespace streams diff --git a/lib/streams/resources.h b/lib/streams/resources.h new file mode 100644 index 0000000..1f464f7 --- /dev/null +++ b/lib/streams/resources.h @@ -0,0 +1,105 @@ +// Copyright 2014 Emilie Gillet. +// +// Author: Emilie Gillet (emilie.o.gillet@gmail.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// +// ----------------------------------------------------------------------------- +// +// Resources definitions. +// +// Automatically generated with: +// make resources + + +#ifndef STREAMS_RESOURCES_H_ +#define STREAMS_RESOURCES_H_ + + +#include "stmlib/stmlib.h" + + + +namespace streams { + +typedef uint8_t ResourceId; + +extern const char* string_table[]; + +extern const int16_t* waveforms_table[]; + +extern const uint16_t* lookup_table_table[]; + +extern const uint32_t* lookup_table_32_table[]; + +extern const int16_t wav_gompertz[]; +extern const int16_t wav_db[]; +extern const uint16_t lut_env_linear[]; +extern const uint16_t lut_env_expo[]; +extern const uint16_t lut_env_quartic[]; +extern const uint16_t lut_square_root[]; +extern const uint16_t lut_svf_cutoff[]; +extern const uint16_t lut_svf_damp[]; +extern const uint16_t lut_2164_gain[]; +extern const uint16_t lut_compressor_ratio[]; +extern const uint16_t lut_soft_knee[]; +extern const uint32_t lut_env_increments[]; +extern const uint32_t lut_lp_coefficients[]; +extern const uint32_t lut_exp2[]; +extern const uint32_t lut_log2[]; +extern const uint32_t lut_lorenz_rate[]; +#define STR_DUMMY 0 // dummy +#define WAV_GOMPERTZ 0 +#define WAV_GOMPERTZ_SIZE 1025 +#define WAV_DB 1 +#define WAV_DB_SIZE 257 +#define LUT_ENV_LINEAR 0 +#define LUT_ENV_LINEAR_SIZE 257 +#define LUT_ENV_EXPO 1 +#define LUT_ENV_EXPO_SIZE 257 +#define LUT_ENV_QUARTIC 2 +#define LUT_ENV_QUARTIC_SIZE 257 +#define LUT_SQUARE_ROOT 3 +#define LUT_SQUARE_ROOT_SIZE 257 +#define LUT_SVF_CUTOFF 4 +#define LUT_SVF_CUTOFF_SIZE 257 +#define LUT_SVF_DAMP 5 +#define LUT_SVF_DAMP_SIZE 257 +#define LUT_2164_GAIN 6 +#define LUT_2164_GAIN_SIZE 257 +#define LUT_COMPRESSOR_RATIO 7 +#define LUT_COMPRESSOR_RATIO_SIZE 257 +#define LUT_SOFT_KNEE 8 +#define LUT_SOFT_KNEE_SIZE 257 +#define LUT_ENV_INCREMENTS 0 +#define LUT_ENV_INCREMENTS_SIZE 257 +#define LUT_LP_COEFFICIENTS 1 +#define LUT_LP_COEFFICIENTS_SIZE 640 +#define LUT_EXP2 2 +#define LUT_EXP2_SIZE 257 +#define LUT_LOG2 3 +#define LUT_LOG2_SIZE 257 +#define LUT_LORENZ_RATE 4 +#define LUT_LORENZ_RATE_SIZE 257 + +} // namespace streams + +#endif // STREAMS_RESOURCES_H_ diff --git a/lib/streams/svf.cc b/lib/streams/svf.cc new file mode 100644 index 0000000..3206e6c --- /dev/null +++ b/lib/streams/svf.cc @@ -0,0 +1,65 @@ +// Copyright 2013 Emilie Gillet. +// +// Author: Emilie Gillet (emilie.o.gillet@gmail.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// +// ----------------------------------------------------------------------------- +// +// SVF used for modeling the bridged T-networks. + +#include "streams/svf.h" + +#include "stmlib/utils/dsp.h" + +#include "streams/resources.h" + +namespace streams { + +using namespace stmlib; + +void Svf::Init() { + lp_ = 0; + bp_ = 0; + frequency_ = 33 << 7; + resonance_ = 16384; + dirty_ = true; +} + +void Svf::Process(int32_t in) { + if (dirty_) { + f_ = Interpolate824(lut_svf_cutoff, frequency_ << 17); + damp_ = Interpolate824(lut_svf_damp, resonance_ << 17); + dirty_ = false; + } + int32_t f = f_; + int32_t damp = damp_; + int32_t notch = in - (bp_ * damp >> 15); + lp_ += f * bp_ >> 15; + CLIP(lp_) + hp_ = notch - lp_; + bp_ += f * hp_ >> 15; + CLIP(bp_) + CLIP(hp_) +} + + +} // namespace streams diff --git a/lib/streams/svf.h b/lib/streams/svf.h new file mode 100644 index 0000000..9806803 --- /dev/null +++ b/lib/streams/svf.h @@ -0,0 +1,76 @@ +// Copyright 2013 Emilie Gillet. +// +// Author: Emilie Gillet (emilie.o.gillet@gmail.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// +// ----------------------------------------------------------------------------- +// +// SVF used for the envelope follower filter bank. + +#ifndef STREAMS_SVF_H_ +#define STREAMS_SVF_H_ + +#include "stmlib/stmlib.h" + +namespace streams { + +class Svf { + public: + Svf() { } + ~Svf() { } + + void Init(); + + void set_frequency(int16_t frequency) { + dirty_ = dirty_ || (frequency_ != frequency); + frequency_ = frequency; + } + + void set_resonance(int16_t resonance) { + resonance_ = resonance; + dirty_ = true; + } + + void Process(int32_t sample); + inline int32_t lp() const { return lp_; } + inline int32_t bp() const { return bp_; } + inline int32_t hp() const { return hp_; } + + private: + bool dirty_; + + int16_t frequency_; + int16_t resonance_; + + int32_t f_; + int32_t damp_; + + int32_t lp_; + int32_t bp_; + int32_t hp_; + + DISALLOW_COPY_AND_ASSIGN(Svf); +}; + +} // namespace streams + +#endif // STREAMS_SVF_H_ diff --git a/lib/streams/vactrol.cc b/lib/streams/vactrol.cc new file mode 100644 index 0000000..21ddce7 --- /dev/null +++ b/lib/streams/vactrol.cc @@ -0,0 +1,186 @@ +// Copyright 2014 Emilie Gillet. +// +// Author: Emilie Gillet (emilie.o.gillet@gmail.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// +// ----------------------------------------------------------------------------- +// +// Vactrol. + +#include "streams/vactrol.h" + +#include "stmlib/utils/dsp.h" + +#include "streams/gain.h" +#include "streams/resources.h" + +namespace streams { + +using namespace stmlib; + +void Vactrol::Init() { + state_[0] = 0; + state_[1] = 0; + state_[2] = 0; + state_[3] = 0; + + excite_ = 0; +} + +void Vactrol::Process( + int16_t audio, + int16_t excite, + uint16_t* gain, + uint16_t* frequency) { + // Smooth frequency amount parameters. + frequency_amount_ += (target_frequency_amount_ - frequency_amount_) >> 8; + frequency_offset_ += (target_frequency_offset_ - frequency_offset_) >> 8; + + int32_t input; + int32_t error; + int64_t coefficient = 0; + + if (excite < 0) { + excite = 0; + } + + // Simple plucked mode. + if (plucked_) { + if (gate_ == false) { + if (excite > kSchmittTriggerThreshold) { + gate_ = true; + state_[0] = 32767 << 16; + state_[1] = 32767 << 16; + } + } else { + if (excite < (kSchmittTriggerThreshold >> 1)) { + gate_ = false; + } + } + + // Filter the excitation pulses. + state_[0] -= static_cast( + state_[0]) * fast_decay_coefficient_ >> 31; + state_[1] -= static_cast( + state_[1]) * decay_coefficient_ >> 31; + + // VCF envelope. + error = state_[0] - state_[2]; + coefficient = error > 0 + ? fast_attack_coefficient_ : fast_decay_coefficient_; + state_[2] += static_cast(error) * coefficient >> 31; + + // VCA envelope. + error = state_[1] - state_[3]; + coefficient = error > 0 ? fast_attack_coefficient_ : decay_coefficient_; + // Increase the duration of the tail + int64_t strength = error > 0 ? error : -error; + coefficient = (coefficient >> 1) + (coefficient * strength >> 31); + state_[3] += static_cast(error) * coefficient >> 31; + + uint16_t vcf_amount = state_[2] >> 16; + uint16_t vca_mount = Interpolate1022(wav_gompertz, (state_[3] >> 2) * 3); + + *gain = kAboveUnityGain * vca_mount >> 15; + *frequency = frequency_offset_ + \ + (frequency_amount_ * vcf_amount >> 15); + + return; + } + + // Low-pass filter the negative edges to prevent fast pulse to immediately + // decay before the vactrol has started reacting. This allows the EXCITE + // input to be used for both controlling the vactrol or just plucking it + // from a trigger. + error = excite - excite_; + coefficient = error > 0 ? (1 << 30) : (decay_coefficient_ << 1); + excite_ += static_cast(error) * coefficient >> 31; + excite = excite_; + + input = frequency_offset_; + input += frequency_amount_ >> 1; + input = (65535 + input) >> 1; + input *= excite; + + state_[3] += static_cast(input - state_[3]) * 67976239 >> 31; + + error = input - state_[0]; + coefficient = 0; + if (error > 0) { + if (state_[1] > 0) { + coefficient = attack_coefficient_; + // Increase attack time when the photocell has been desensitized. + coefficient += coefficient * (255 - (state_[2] >> 23)) >> 6; + } else { + coefficient = fast_attack_coefficient_; + } + } else { + if (state_[1] < 0) { + coefficient = decay_coefficient_; + } else { + coefficient = fast_decay_coefficient_; + } + } + // First order. + state_[0] += static_cast(error) * coefficient >> 31; + + // Second order. + state_[1] += static_cast(error - state_[1]) * coefficient >> 31; + + // Memory effect. + int32_t sensitivity = state_[0]; + if (sensitivity > (1 << 28)) { + sensitivity = 1 << 31; + } else { + sensitivity <<= 3; + } + error = sensitivity - state_[2]; + if (error > 0) { + // Get into the "sensitized" state in 1s. + state_[2] += static_cast(error) * 138132 >> 31; + } else { + // Get out of the "sensitized" state in 60s. + state_[2] += static_cast(error) * 1151 >> 31; + } + + // Apply non-linearity. + int32_t index = state_[0] >> 1; + + // A little hack to add overshoot... + index += (state_[3] >> 15) * (state_[1] >> 15) >> 1; + if (index < 0) { + index = 0; + } else if (index >= (1 << 30)) { + index = (1 << 30) - 1; + } + uint16_t amplitude = index < 536870912 + ? Interpolate1022(wav_gompertz, static_cast(index) << 3) + : 32767; + uint16_t cutoff = index >> 14; + if (cutoff >= 32767) cutoff = 32767; + cutoff = cutoff * cutoff >> 15; + *gain = kAboveUnityGain * amplitude >> 15; + *frequency = frequency_offset_ + \ + (frequency_amount_ * cutoff >> 15); +} + +} // namespace streams diff --git a/lib/streams/vactrol.h b/lib/streams/vactrol.h new file mode 100644 index 0000000..81d9457 --- /dev/null +++ b/lib/streams/vactrol.h @@ -0,0 +1,139 @@ +// Copyright 2014 Emilie Gillet. +// +// Author: Emilie Gillet (emilie.o.gillet@gmail.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. +// +// See http://creativecommons.org/licenses/MIT/ for more information. +// +// ----------------------------------------------------------------------------- +// +// Vactrol. + +#ifndef STREAMS_VACTROL_H_ +#define STREAMS_VACTROL_H_ + +#include "stmlib/stmlib.h" + +#include "streams/meta_parameters.h" +#include "streams/resources.h" + +namespace streams { + +class Vactrol { + public: + Vactrol() { } + ~Vactrol() { } + + void Init(); + void Process( + int16_t audio, + int16_t excite, + uint16_t* gain, + uint16_t* frequency); + + void Configure(bool alternate, int32_t* parameters, int32_t* globals) { + uint16_t attack_time; + uint16_t decay_time; + + if (globals) { + // Attack: 10ms to 1000ms + attack_time = 128 + (globals[0] >> 8); + // Decay: 10ms to 5000ms + decay_time = 128 + (globals[2] * 355 >> 16); + ComputeAmountOffset( + parameters[1], + &target_frequency_amount_, + &target_frequency_offset_); + } else { + uint16_t shape = parameters[0]; + ComputeAmountOffset( + parameters[1], + &target_frequency_amount_, + &target_frequency_offset_); + + if (shape < 32768) { + // attack: 10ms + attack_time = 128; + // decay: 50ms to 2000ms + decay_time = 227 + (shape * 196 >> 15); + } else if (shape < 49512) { + shape -= 32768; + // attack: 10ms to 500ms. + attack_time = 128 + (shape * 227 >> 15); + // decay: 2000ms to 1000ms. + decay_time = 423 - (89 * shape >> 15); + } else { + shape -= 49512; + // attack: 500ms to 50ms. + attack_time = 355 - (shape >> 7); + // decay: 1000ms to 100ms. + decay_time = 384 - (128 * shape >> 15); + } + } + + attack_coefficient_ = lut_lp_coefficients[attack_time]; + fast_attack_coefficient_ = lut_lp_coefficients[attack_time - 128]; + decay_coefficient_ = lut_lp_coefficients[decay_time]; + fast_decay_coefficient_ = lut_lp_coefficients[decay_time - 128]; + + plucked_ = alternate; + if (alternate) { + fast_attack_coefficient_ <<= 4; + } else { + decay_coefficient_ >>= 1; + } + + int32_t ringing_tail = 8192; + int32_t headroom = 65535 - target_frequency_offset_; + if (ringing_tail > headroom) { + ringing_tail = headroom; + } + if (ringing_tail > target_frequency_amount_) { + ringing_tail = target_frequency_amount_; + } + + target_frequency_offset_ += ringing_tail; + target_frequency_amount_ -= ringing_tail; + } + + + private: + int32_t target_frequency_amount_; + int32_t target_frequency_offset_; + int32_t frequency_amount_; + int32_t frequency_offset_; + + int32_t attack_coefficient_; + int32_t decay_coefficient_; + int32_t fast_attack_coefficient_; + int32_t fast_decay_coefficient_; + + int32_t state_[4]; + int32_t excite_; + + bool gate_; + bool plucked_; + + DISALLOW_COPY_AND_ASSIGN(Vactrol); +}; + +} // namespace streams + +#endif // STREAMS_VACTROL_H_ diff --git a/lib/udynlink b/lib/udynlink index 7337f22..c8773d2 160000 --- a/lib/udynlink +++ b/lib/udynlink @@ -1 +1 @@ -Subproject commit 7337f22fd7995540b102cbe44fe6b4ffccd58200 +Subproject commit c8773d288f73285bd6eef0a72ecebc9716ad0f3d diff --git a/platformio.ini b/platformio.ini index c8cf4f9..03f42d8 100644 --- a/platformio.ini +++ b/platformio.ini @@ -9,5 +9,5 @@ [env:squares-and-circles] apps_json = ./app/index.json -squares_and_circles_loader = 6e9bfa8 ; minimum loader version -platform = ./.pio/ +squares_and_circles_loader = 5e1e08e ; minimum loader version +platform = .pio/ \ No newline at end of file