From 8c3e8a988b3cd4df76a7072984425f7081935c1b Mon Sep 17 00:00:00 2001 From: eh2k Date: Sun, 22 Dec 2024 21:17:05 +0100 Subject: [PATCH] dev sync fb79585 --- README.md | 6 + app/CV/EnvGen_ADSR.cpp | 2 +- app/DRUMS/Claps.bin | Bin 30668 -> 32312 bytes app/DRUMS/DrumSynth.bin | Bin 0 -> 15304 bytes app/DRUMS/DrumSynth.cpp | 196 +++++++++ app/DRUMS/resources/braids_lut_env.hpp | 105 ----- app/DRUMS/resources/peaks_lut_env.hpp | 271 ------------ app/DRUMS/resources/peaks_lut_osc.hpp | 548 ------------------------- app/DRUMS/resources/peaks_lut_svf.hpp | 203 --------- app/M-OSC/Waveforms.bin | Bin 110316 -> 110816 bytes app/M-OSC/Waveforms.cpp | 45 +- app/index.json | 3 +- app/squares-and-circles-api.h | 3 +- app/upload.py | 18 +- lib/braids/chords_stack.cc | 5 +- lib/drumsynth/drumsynth.cpp | 199 +++++++-- lib/drumsynth/drumsynth.h | 21 + platformio.ini | 2 +- 18 files changed, 460 insertions(+), 1167 deletions(-) create mode 100644 app/DRUMS/DrumSynth.bin create mode 100644 app/DRUMS/DrumSynth.cpp delete mode 100644 app/DRUMS/resources/braids_lut_env.hpp delete mode 100644 app/DRUMS/resources/peaks_lut_env.hpp delete mode 100644 app/DRUMS/resources/peaks_lut_osc.hpp delete mode 100644 app/DRUMS/resources/peaks_lut_svf.hpp diff --git a/README.md b/README.md index 8eefe9c..d6f1846 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,12 @@ ChangeLog ```` +== 2024-12-22 + * Bugfix + * SEQ/TuringMachine crash #119 + * M-OSC/Waveforms: Braids Renaissance Chords - fixed note offsets #117 + * Enhancements + * DrumSynth ... == 2024-12-17 * Bugfix/Enchancement #117 * Parameter value was not visualized when modulations set (Bug since 2024-12-16) diff --git a/app/CV/EnvGen_ADSR.cpp b/app/CV/EnvGen_ADSR.cpp index f5c8d32..95b486c 100644 --- a/app/CV/EnvGen_ADSR.cpp +++ b/app/CV/EnvGen_ADSR.cpp @@ -28,7 +28,7 @@ #include "../squares-and-circles-api.h" #include "peaks/modulations/multistage_envelope.h" #include "peaks/modulations/multistage_envelope.cc" -#include "../DRUMS/resources/peaks_lut_env.hpp" +#include "peaks/resources.cc" peaks::MultistageEnvelope _processor; diff --git a/app/DRUMS/Claps.bin b/app/DRUMS/Claps.bin index 57604aad4c5aea1cdf79cd7d1735080bfbaae7dc..4a2b7921382bf0e5e4482363c9b3d34a698c06f8 100644 GIT binary patch literal 32312 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 diff --git a/app/DRUMS/DrumSynth.bin b/app/DRUMS/DrumSynth.bin new file mode 100644 index 0000000000000000000000000000000000000000..1932c27c87532f67788a2448e153e361df08a5b1 GIT binary patch literal 15304 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 0) + { + for (int i = 0; i < inst_count; i++) + { + inst_names[i] = _instModel[i].name; + _t[i] = UINT32_MAX; + _inst[i] = drum_synth_init(&_instModel[i], ::malloc); + } + + engine::addParam("Pitch", &pitch, 0.5f, 1.5f); + engine::addParam(MULTI_TRIGS, &inst_selection, 0, inst_count - 1, inst_names); + engine::addParam("Decay", &stretch, 0.1f, 2.0f); + engine::addParam("Stereo", &stereo); + } + + engine::setMode(ENGINE_MODE_MIDI_IN); +} + +void engine::release() +{ + for (int i = 0; i < inst_count; i++) + { + ::free(_inst[i]); + } +} + +void engine::process() +{ + auto buffer = engine::outputBuffer<0>(); + auto bufferAux = engine::outputBuffer<1>(); + memset(buffer, 0, sizeof(float) * FRAME_BUFFER_SIZE); + memset(bufferAux, 0, sizeof(float) * FRAME_BUFFER_SIZE); + float tmpL[FRAME_BUFFER_SIZE]; + float tmpR[FRAME_BUFFER_SIZE]; + + for (int i = 0; i < inst_count; i++) + { + if (!(*__multi_trigs_mask & (1 << i))) + continue; + + if (engine::trig() & (1 << i) || _midi_trigs & (1 << i)) + { + _t[i] = 0; + drum_synth_reset(_inst[i]); + } + + if (_t[i] < UINT16_MAX) + { + DrumParams params = {_t[i], 0, stretch, stereo}; + + float f = pitch; // powf(2.f, engine::cv()); + float a = stereo; + float b = 1.f - a; + + params.levelL = engine::mixLevelL(i); + params.levelR = engine::mixLevelR(i); + + drum_synth_process_frame(_inst[i], -1, f, ¶ms, buffer, bufferAux, FRAME_BUFFER_SIZE); + + _t[i] += FRAME_BUFFER_SIZE; + } + } +} + +void engine::draw() +{ +} + +void engine::onMidiNote(uint8_t key, uint8_t velocity) // NoteOff: velocity == 0 +{ + if (velocity > 0) + { + switch (key) + { + case 35: // BD0 + _midi_trigs |= (1 << 0); + break; + case 36: // BD1 + _midi_trigs |= (1 << 1); + break; + case 38: // SD0 + _midi_trigs |= (1 << 2); + break; + case 40: // SD1 + _midi_trigs |= (1 << 3); + break; + case 39: // CP + _midi_trigs |= (1 << 4); + break; + case 54: // TMB + _midi_trigs |= (1 << 5); + break; + case 37: // RM + _midi_trigs |= (1 << 6); + break; + case 56: // CB + _midi_trigs |= (1 << 7); + break; + case 41: // LT + case 43: // LT + _midi_trigs |= (1 << 8); + break; + case 45: // MT + case 47: // MT + _midi_trigs |= (1 << 9); + break; + case 48: // HT + case 50: // HT + _midi_trigs |= (1 << 10); + break; + case 42: // CH + case 44: // CH + case 46: // OH + _midi_trigs |= (1 << 11); + break; + } + + *__multi_trigs_mask |= _midi_trigs; + } + else + { + } +} + +void engine::onMidiPitchbend(int16_t pitch) +{ +} + +void engine::onMidiCC(uint8_t ccc, uint8_t value) +{ + // nothing implemented.. +} + +void engine::onMidiSysex(uint8_t byte) +{ +} + +#include "../../lib/drumsynth/drumsynth.cpp" +#include "../../lib/plaits/resources.cc" +#include "../../lib/misc/Biquad.cpp" diff --git a/app/DRUMS/resources/braids_lut_env.hpp b/app/DRUMS/resources/braids_lut_env.hpp deleted file mode 100644 index 83a20bf..0000000 --- a/app/DRUMS/resources/braids_lut_env.hpp +++ /dev/null @@ -1,105 +0,0 @@ -namespace braids { - const uint16_t lut_env_expo[] FLASHMEM = { - 0, 1034, 2053, 3057, - 4044, 5016, 5974, 6916, - 7844, 8757, 9656, 10542, - 11413, 12271, 13116, 13948, - 14766, 15572, 16366, 17147, - 17916, 18673, 19419, 20153, - 20875, 21587, 22287, 22976, - 23655, 24323, 24981, 25629, - 26267, 26894, 27512, 28121, - 28720, 29310, 29890, 30462, - 31024, 31578, 32124, 32661, - 33189, 33710, 34222, 34727, - 35223, 35712, 36193, 36667, - 37134, 37593, 38045, 38490, - 38928, 39360, 39785, 40203, - 40615, 41020, 41419, 41812, - 42198, 42579, 42954, 43323, - 43686, 44044, 44396, 44743, - 45084, 45420, 45751, 46077, - 46397, 46713, 47024, 47330, - 47631, 47927, 48219, 48507, - 48790, 49068, 49342, 49612, - 49878, 50140, 50398, 50651, - 50901, 51147, 51389, 51627, - 51862, 52092, 52320, 52544, - 52764, 52981, 53195, 53405, - 53612, 53816, 54016, 54214, - 54408, 54600, 54788, 54974, - 55156, 55336, 55513, 55688, - 55859, 56028, 56195, 56358, - 56520, 56678, 56835, 56988, - 57140, 57289, 57436, 57580, - 57723, 57863, 58001, 58136, - 58270, 58402, 58531, 58659, - 58784, 58908, 59029, 59149, - 59267, 59383, 59498, 59610, - 59721, 59830, 59937, 60043, - 60147, 60250, 60351, 60450, - 60548, 60644, 60739, 60832, - 60924, 61014, 61103, 61191, - 61277, 61362, 61446, 61528, - 61609, 61689, 61768, 61845, - 61921, 61996, 62070, 62143, - 62214, 62285, 62354, 62422, - 62490, 62556, 62621, 62685, - 62748, 62810, 62871, 62932, - 62991, 63049, 63107, 63163, - 63219, 63274, 63328, 63381, - 63434, 63485, 63536, 63586, - 63635, 63683, 63731, 63778, - 63824, 63870, 63914, 63958, - 64002, 64045, 64087, 64128, - 64169, 64209, 64248, 64287, - 64326, 64363, 64400, 64437, - 64473, 64508, 64543, 64577, - 64611, 64645, 64677, 64710, - 64741, 64773, 64803, 64834, - 64863, 64893, 64922, 64950, - 64978, 65006, 65033, 65060, - 65086, 65112, 65137, 65162, - 65187, 65212, 65236, 65259, - 65282, 65305, 65328, 65350, - 65372, 65393, 65414, 65435, - 65456, 65476, 65496, 65515, - 65535, -}; - -const uint32_t lut_env_portamento_increments[] FLASHMEM = { - 1431655765, 1208633567, 1025339217, 873854034, - 747996982, 642910145, 554750639, 480459775, - 417588783, 364166300, 318596895, 279582889, - 246063710, 217168604, 192179528, 170501890, - 151641346, 135185326, 120788231, 108159539, - 97054201, 87264844, 78615425, 70956050, - 64158714, 58113796, 52727166, 47917783, - 43615697, 39760385, 36299356, 33186980, - 30383504, 27854220, 25568762, 23500507, - 21626072, 19924877, 18378778, 16971748, - 15689604, 14519780, 13451115, 12473688, - 11578663, 10758156, 10005128, 9313280, - 8676970, 8091136, 7551232, 7053169, - 6593263, 6168194, 5774964, 5410864, - 5073442, 4760475, 4469950, 4200037, - 3949073, 3715547, 3498079, 3295415, - 3106409, 2930012, 2765269, 2611303, - 2467313, 2332562, 2206377, 2088136, - 1977272, 1873260, 1775618, 1683902, - 1597702, 1516641, 1440370, 1368566, - 1300932, 1237191, 1177088, 1120388, - 1066869, 1016330, 968580, 923445, - 880761, 840376, 802150, 765951, - 731657, 699152, 668331, 639094, - 611349, 585008, 559991, 536221, - 513628, 492146, 471711, 452267, - 433757, 416131, 399341, 383341, - 368089, 353545, 339672, 326434, - 313798, 301733, 290209, 279199, - 268677, 258617, 248997, 239795, - 230990, 222562, 214494, 206767, - 199365, 192272, 185474, 178956, -}; - -} \ No newline at end of file diff --git a/app/DRUMS/resources/peaks_lut_env.hpp b/app/DRUMS/resources/peaks_lut_env.hpp deleted file mode 100644 index 4825475..0000000 --- a/app/DRUMS/resources/peaks_lut_env.hpp +++ /dev/null @@ -1,271 +0,0 @@ -namespace peaks { -const uint16_t lut_env_linear[] FLASHMEM = { - 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[] FLASHMEM = { - 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[] FLASHMEM = { - 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 uint32_t lut_env_increments[] FLASHMEM = { - 178956970, 162203921, 147263779, 133914742, - 121965179, 111249129, 101622525, 92960022, - 85152324, 78103929, 71731214, 65960813, - 60728233, 55976673, 51656020, 47721976, - 44135321, 40861270, 37868923, 35130786, - 32622357, 30321772, 28209484, 26268003, - 24481648, 22836346, 21319451, 19919582, - 18626484, 17430905, 16324491, 15299685, - 14349647, 13468178, 12649652, 11888959, - 11181454, 10522909, 9909470, 9337624, - 8804164, 8306157, 7840925, 7406012, - 6999170, 6618338, 6261623, 5927288, - 5613733, 5319488, 5043200, 4783621, - 4539601, 4310076, 4094068, 3890668, - 3699040, 3518407, 3348049, 3187303, - 3035548, 2892213, 2756766, 2628711, - 2507588, 2392971, 2284460, 2181685, - 2084301, 1991984, 1904435, 1821372, - 1742534, 1667676, 1596567, 1528995, - 1464759, 1403670, 1345553, 1290243, - 1237585, 1187435, 1139655, 1094119, - 1050706, 1009303, 969803, 932108, - 896122, 861758, 828932, 797565, - 767584, 738918, 711503, 685274, - 660174, 636148, 613143, 591109, - 569999, 549770, 530379, 511787, - 493956, 476850, 460436, 444683, - 429558, 415035, 401085, 387683, - 374804, 362424, 350523, 339078, - 328069, 317479, 307287, 297478, - 288035, 278942, 270184, 261748, - 253620, 245786, 238236, 230956, - 223936, 217166, 210635, 204334, - 198253, 192383, 186717, 181245, - 175961, 170858, 165927, 161162, - 156558, 152107, 147805, 143644, - 139621, 135729, 131964, 128321, - 124796, 121384, 118081, 114883, - 111787, 108788, 105883, 103069, - 100343, 97700, 95139, 92657, - 90250, 87917, 85654, 83459, - 81330, 79265, 77261, 75316, - 73428, 71596, 69817, 68090, - 66413, 64784, 63202, 61666, - 60173, 58722, 57312, 55942, - 54610, 53315, 52056, 50832, - 49641, 48484, 47357, 46262, - 45196, 44159, 43149, 42167, - 41211, 40280, 39374, 38492, - 37632, 36796, 35981, 35187, - 34414, 33660, 32926, 32211, - 31513, 30834, 30172, 29526, - 28896, 28282, 27684, 27100, - 26531, 25975, 25434, 24905, - 24390, 23886, 23395, 22916, - 22449, 21992, 21546, 21111, - 20687, 20272, 19867, 19471, - 19085, 18708, 18339, 17979, - 17627, 17283, 16947, 16619, - 16298, 15985, 15678, 15378, - 15085, 14799, 14519, 14245, - 13977, 13716, 13459, 13209, - 12964, 12724, 12490, 12260, - 12036, 11816, 11601, 11390, - 11184, -}; -} \ No newline at end of file diff --git a/app/DRUMS/resources/peaks_lut_osc.hpp b/app/DRUMS/resources/peaks_lut_osc.hpp deleted file mode 100644 index 90c2822..0000000 --- a/app/DRUMS/resources/peaks_lut_osc.hpp +++ /dev/null @@ -1,548 +0,0 @@ -namespace peaks { -const int16_t wav_sine[] FLASHMEM = { - 0, 201, 402, 603, - 804, 1005, 1206, 1406, - 1607, 1808, 2009, 2209, - 2410, 2610, 2811, 3011, - 3211, 3411, 3611, 3811, - 4011, 4210, 4409, 4608, - 4807, 5006, 5205, 5403, - 5601, 5799, 5997, 6195, - 6392, 6589, 6786, 6982, - 7179, 7375, 7571, 7766, - 7961, 8156, 8351, 8545, - 8739, 8932, 9126, 9319, - 9511, 9703, 9895, 10087, - 10278, 10469, 10659, 10849, - 11038, 11227, 11416, 11604, - 11792, 11980, 12166, 12353, - 12539, 12724, 12909, 13094, - 13278, 13462, 13645, 13827, - 14009, 14191, 14372, 14552, - 14732, 14911, 15090, 15268, - 15446, 15623, 15799, 15975, - 16150, 16325, 16499, 16672, - 16845, 17017, 17189, 17360, - 17530, 17699, 17868, 18036, - 18204, 18371, 18537, 18702, - 18867, 19031, 19194, 19357, - 19519, 19680, 19840, 20000, - 20159, 20317, 20474, 20631, - 20787, 20942, 21096, 21249, - 21402, 21554, 21705, 21855, - 22004, 22153, 22301, 22448, - 22594, 22739, 22883, 23027, - 23169, 23311, 23452, 23592, - 23731, 23869, 24006, 24143, - 24278, 24413, 24546, 24679, - 24811, 24942, 25072, 25201, - 25329, 25456, 25582, 25707, - 25831, 25954, 26077, 26198, - 26318, 26437, 26556, 26673, - 26789, 26905, 27019, 27132, - 27244, 27355, 27466, 27575, - 27683, 27790, 27896, 28001, - 28105, 28208, 28309, 28410, - 28510, 28608, 28706, 28802, - 28897, 28992, 29085, 29177, - 29268, 29358, 29446, 29534, - 29621, 29706, 29790, 29873, - 29955, 30036, 30116, 30195, - 30272, 30349, 30424, 30498, - 30571, 30643, 30713, 30783, - 30851, 30918, 30984, 31049, - 31113, 31175, 31236, 31297, - 31356, 31413, 31470, 31525, - 31580, 31633, 31684, 31735, - 31785, 31833, 31880, 31926, - 31970, 32014, 32056, 32097, - 32137, 32176, 32213, 32249, - 32284, 32318, 32350, 32382, - 32412, 32441, 32468, 32495, - 32520, 32544, 32567, 32588, - 32609, 32628, 32646, 32662, - 32678, 32692, 32705, 32717, - 32727, 32736, 32744, 32751, - 32757, 32761, 32764, 32766, - 32767, 32766, 32764, 32761, - 32757, 32751, 32744, 32736, - 32727, 32717, 32705, 32692, - 32678, 32662, 32646, 32628, - 32609, 32588, 32567, 32544, - 32520, 32495, 32468, 32441, - 32412, 32382, 32350, 32318, - 32284, 32249, 32213, 32176, - 32137, 32097, 32056, 32014, - 31970, 31926, 31880, 31833, - 31785, 31735, 31684, 31633, - 31580, 31525, 31470, 31413, - 31356, 31297, 31236, 31175, - 31113, 31049, 30984, 30918, - 30851, 30783, 30713, 30643, - 30571, 30498, 30424, 30349, - 30272, 30195, 30116, 30036, - 29955, 29873, 29790, 29706, - 29621, 29534, 29446, 29358, - 29268, 29177, 29085, 28992, - 28897, 28802, 28706, 28608, - 28510, 28410, 28309, 28208, - 28105, 28001, 27896, 27790, - 27683, 27575, 27466, 27355, - 27244, 27132, 27019, 26905, - 26789, 26673, 26556, 26437, - 26318, 26198, 26077, 25954, - 25831, 25707, 25582, 25456, - 25329, 25201, 25072, 24942, - 24811, 24679, 24546, 24413, - 24278, 24143, 24006, 23869, - 23731, 23592, 23452, 23311, - 23169, 23027, 22883, 22739, - 22594, 22448, 22301, 22153, - 22004, 21855, 21705, 21554, - 21402, 21249, 21096, 20942, - 20787, 20631, 20474, 20317, - 20159, 20000, 19840, 19680, - 19519, 19357, 19194, 19031, - 18867, 18702, 18537, 18371, - 18204, 18036, 17868, 17699, - 17530, 17360, 17189, 17017, - 16845, 16672, 16499, 16325, - 16150, 15975, 15799, 15623, - 15446, 15268, 15090, 14911, - 14732, 14552, 14372, 14191, - 14009, 13827, 13645, 13462, - 13278, 13094, 12909, 12724, - 12539, 12353, 12166, 11980, - 11792, 11604, 11416, 11227, - 11038, 10849, 10659, 10469, - 10278, 10087, 9895, 9703, - 9511, 9319, 9126, 8932, - 8739, 8545, 8351, 8156, - 7961, 7766, 7571, 7375, - 7179, 6982, 6786, 6589, - 6392, 6195, 5997, 5799, - 5601, 5403, 5205, 5006, - 4807, 4608, 4409, 4210, - 4011, 3811, 3611, 3411, - 3211, 3011, 2811, 2610, - 2410, 2209, 2009, 1808, - 1607, 1406, 1206, 1005, - 804, 603, 402, 201, - 0, -201, -402, -603, - -804, -1005, -1206, -1406, - -1607, -1808, -2009, -2209, - -2410, -2610, -2811, -3011, - -3211, -3411, -3611, -3811, - -4011, -4210, -4409, -4608, - -4807, -5006, -5205, -5403, - -5601, -5799, -5997, -6195, - -6392, -6589, -6786, -6982, - -7179, -7375, -7571, -7766, - -7961, -8156, -8351, -8545, - -8739, -8932, -9126, -9319, - -9511, -9703, -9895, -10087, - -10278, -10469, -10659, -10849, - -11038, -11227, -11416, -11604, - -11792, -11980, -12166, -12353, - -12539, -12724, -12909, -13094, - -13278, -13462, -13645, -13827, - -14009, -14191, -14372, -14552, - -14732, -14911, -15090, -15268, - -15446, -15623, -15799, -15975, - -16150, -16325, -16499, -16672, - -16845, -17017, -17189, -17360, - -17530, -17699, -17868, -18036, - -18204, -18371, -18537, -18702, - -18867, -19031, -19194, -19357, - -19519, -19680, -19840, -20000, - -20159, -20317, -20474, -20631, - -20787, -20942, -21096, -21249, - -21402, -21554, -21705, -21855, - -22004, -22153, -22301, -22448, - -22594, -22739, -22883, -23027, - -23169, -23311, -23452, -23592, - -23731, -23869, -24006, -24143, - -24278, -24413, -24546, -24679, - -24811, -24942, -25072, -25201, - -25329, -25456, -25582, -25707, - -25831, -25954, -26077, -26198, - -26318, -26437, -26556, -26673, - -26789, -26905, -27019, -27132, - -27244, -27355, -27466, -27575, - -27683, -27790, -27896, -28001, - -28105, -28208, -28309, -28410, - -28510, -28608, -28706, -28802, - -28897, -28992, -29085, -29177, - -29268, -29358, -29446, -29534, - -29621, -29706, -29790, -29873, - -29955, -30036, -30116, -30195, - -30272, -30349, -30424, -30498, - -30571, -30643, -30713, -30783, - -30851, -30918, -30984, -31049, - -31113, -31175, -31236, -31297, - -31356, -31413, -31470, -31525, - -31580, -31633, -31684, -31735, - -31785, -31833, -31880, -31926, - -31970, -32014, -32056, -32097, - -32137, -32176, -32213, -32249, - -32284, -32318, -32350, -32382, - -32412, -32441, -32468, -32495, - -32520, -32544, -32567, -32588, - -32609, -32628, -32646, -32662, - -32678, -32692, -32705, -32717, - -32727, -32736, -32744, -32751, - -32757, -32761, -32764, -32766, - -32767, -32766, -32764, -32761, - -32757, -32751, -32744, -32736, - -32727, -32717, -32705, -32692, - -32678, -32662, -32646, -32628, - -32609, -32588, -32567, -32544, - -32520, -32495, -32468, -32441, - -32412, -32382, -32350, -32318, - -32284, -32249, -32213, -32176, - -32137, -32097, -32056, -32014, - -31970, -31926, -31880, -31833, - -31785, -31735, -31684, -31633, - -31580, -31525, -31470, -31413, - -31356, -31297, -31236, -31175, - -31113, -31049, -30984, -30918, - -30851, -30783, -30713, -30643, - -30571, -30498, -30424, -30349, - -30272, -30195, -30116, -30036, - -29955, -29873, -29790, -29706, - -29621, -29534, -29446, -29358, - -29268, -29177, -29085, -28992, - -28897, -28802, -28706, -28608, - -28510, -28410, -28309, -28208, - -28105, -28001, -27896, -27790, - -27683, -27575, -27466, -27355, - -27244, -27132, -27019, -26905, - -26789, -26673, -26556, -26437, - -26318, -26198, -26077, -25954, - -25831, -25707, -25582, -25456, - -25329, -25201, -25072, -24942, - -24811, -24679, -24546, -24413, - -24278, -24143, -24006, -23869, - -23731, -23592, -23452, -23311, - -23169, -23027, -22883, -22739, - -22594, -22448, -22301, -22153, - -22004, -21855, -21705, -21554, - -21402, -21249, -21096, -20942, - -20787, -20631, -20474, -20317, - -20159, -20000, -19840, -19680, - -19519, -19357, -19194, -19031, - -18867, -18702, -18537, -18371, - -18204, -18036, -17868, -17699, - -17530, -17360, -17189, -17017, - -16845, -16672, -16499, -16325, - -16150, -15975, -15799, -15623, - -15446, -15268, -15090, -14911, - -14732, -14552, -14372, -14191, - -14009, -13827, -13645, -13462, - -13278, -13094, -12909, -12724, - -12539, -12353, -12166, -11980, - -11792, -11604, -11416, -11227, - -11038, -10849, -10659, -10469, - -10278, -10087, -9895, -9703, - -9511, -9319, -9126, -8932, - -8739, -8545, -8351, -8156, - -7961, -7766, -7571, -7375, - -7179, -6982, -6786, -6589, - -6392, -6195, -5997, -5799, - -5601, -5403, -5205, -5006, - -4807, -4608, -4409, -4210, - -4011, -3811, -3611, -3411, - -3211, -3011, -2811, -2610, - -2410, -2209, -2009, -1808, - -1607, -1406, -1206, -1005, - -804, -603, -402, -201, - 0, -}; - -const uint32_t lut_oscillator_increments[] FLASHMEM = { - 594570139, 598878640, 603218361, 607589530, - 611992374, 616427123, 620894008, 625393262, - 629925120, 634489817, 639087591, 643718683, - 648383334, 653081787, 657814287, 662581081, - 667382416, 672218544, 677089717, 681996188, - 686938214, 691916051, 696929960, 701980202, - 707067040, 712190739, 717351567, 722549792, - 727785686, 733059521, 738371572, 743722117, - 749111434, 754539804, 760007511, 765514839, - 771062075, 776649508, 782277431, 787946136, - 793655918, 799407076, 805199909, 811034720, - 816911812, 822831491, 828794068, 834799851, - 840849155, 846942294, 853079587, 859261354, - 865487916, 871759598, 878076727, 884439633, - 890848647, 897304104, 903806339, 910355693, - 916952505, 923597121, 930289887, 937031151, - 943821265, 950660583, 957549461, 964488259, - 971477339, 978517064, 985607802, 992749922, - 999943798, 1007189803, 1014488315, 1021839716, - 1029244387, 1036702717, 1044215092, 1051781905, - 1059403550, 1067080425, 1074812930, 1082601467, - 1090446444, 1098348268, 1106307352, 1114324111, - 1122398963, 1130532329, 1138724632, 1146976300, - 1155287763, 1163659455, 1172091811, 1180585271, - 1189140279, -}; -const int16_t wav_overdrive[] FLASHMEM = { - -32767, -32767, -32767, -32767, - -32767, -32767, -32767, -32767, - -32766, -32766, -32766, -32766, - -32766, -32766, -32766, -32766, - -32766, -32766, -32766, -32766, - -32766, -32765, -32765, -32765, - -32765, -32765, -32765, -32765, - -32765, -32765, -32765, -32765, - -32764, -32764, -32764, -32764, - -32764, -32764, -32764, -32764, - -32763, -32763, -32763, -32763, - -32763, -32763, -32763, -32763, - -32762, -32762, -32762, -32762, - -32762, -32762, -32761, -32761, - -32761, -32761, -32761, -32761, - -32760, -32760, -32760, -32760, - -32760, -32759, -32759, -32759, - -32759, -32759, -32758, -32758, - -32758, -32758, -32757, -32757, - -32757, -32757, -32756, -32756, - -32756, -32756, -32755, -32755, - -32755, -32754, -32754, -32754, - -32753, -32753, -32753, -32752, - -32752, -32752, -32751, -32751, - -32751, -32750, -32750, -32749, - -32749, -32749, -32748, -32748, - -32747, -32747, -32746, -32746, - -32745, -32745, -32744, -32744, - -32743, -32743, -32742, -32742, - -32741, -32741, -32740, -32740, - -32739, -32738, -32738, -32737, - -32736, -32736, -32735, -32734, - -32734, -32733, -32732, -32732, - -32731, -32730, -32729, -32728, - -32728, -32727, -32726, -32725, - -32724, -32723, -32722, -32721, - -32720, -32719, -32718, -32717, - -32716, -32715, -32714, -32713, - -32712, -32711, -32710, -32709, - -32707, -32706, -32705, -32704, - -32702, -32701, -32700, -32698, - -32697, -32695, -32694, -32692, - -32691, -32689, -32688, -32686, - -32684, -32683, -32681, -32679, - -32678, -32676, -32674, -32672, - -32670, -32668, -32666, -32664, - -32662, -32660, -32658, -32655, - -32653, -32651, -32649, -32646, - -32644, -32641, -32639, -32636, - -32633, -32631, -32628, -32625, - -32622, -32619, -32617, -32614, - -32610, -32607, -32604, -32601, - -32597, -32594, -32591, -32587, - -32584, -32580, -32576, -32572, - -32568, -32564, -32560, -32556, - -32552, -32548, -32543, -32539, - -32534, -32530, -32525, -32520, - -32515, -32510, -32505, -32500, - -32495, -32489, -32484, -32478, - -32473, -32467, -32461, -32455, - -32448, -32442, -32436, -32429, - -32422, -32416, -32409, -32402, - -32394, -32387, -32380, -32372, - -32364, -32356, -32348, -32340, - -32331, -32323, -32314, -32305, - -32296, -32287, -32277, -32268, - -32258, -32248, -32237, -32227, - -32216, -32206, -32195, -32183, - -32172, -32160, -32148, -32136, - -32124, -32111, -32098, -32085, - -32072, -32058, -32044, -32030, - -32016, -32001, -31986, -31971, - -31955, -31939, -31923, -31907, - -31890, -31873, -31855, -31838, - -31819, -31801, -31782, -31763, - -31743, -31723, -31703, -31682, - -31661, -31640, -31618, -31596, - -31573, -31550, -31526, -31502, - -31478, -31453, -31427, -31401, - -31375, -31348, -31320, -31293, - -31264, -31235, -31205, -31175, - -31145, -31113, -31082, -31049, - -31016, -30983, -30948, -30913, - -30878, -30842, -30805, -30767, - -30729, -30690, -30650, -30610, - -30569, -30527, -30484, -30440, - -30396, -30351, -30305, -30258, - -30211, -30162, -30113, -30063, - -30012, -29959, -29906, -29853, - -29798, -29742, -29685, -29627, - -29568, -29508, -29447, -29385, - -29321, -29257, -29191, -29125, - -29057, -28988, -28918, -28846, - -28774, -28700, -28625, -28548, - -28470, -28391, -28311, -28229, - -28146, -28061, -27975, -27887, - -27798, -27708, -27616, -27522, - -27427, -27331, -27232, -27132, - -27031, -26928, -26823, -26717, - -26609, -26499, -26387, -26274, - -26158, -26041, -25923, -25802, - -25679, -25555, -25428, -25300, - -25170, -25038, -24904, -24767, - -24629, -24489, -24346, -24202, - -24056, -23907, -23756, -23603, - -23448, -23291, -23131, -22970, - -22806, -22640, -22471, -22301, - -22128, -21952, -21775, -21595, - -21413, -21228, -21041, -20852, - -20660, -20466, -20270, -20071, - -19870, -19666, -19460, -19252, - -19041, -18828, -18613, -18395, - -18174, -17951, -17726, -17499, - -17269, -17036, -16802, -16565, - -16325, -16083, -15839, -15593, - -15344, -15093, -14840, -14584, - -14327, -14067, -13805, -13540, - -13274, -13005, -12735, -12462, - -12187, -11910, -11632, -11351, - -11068, -10784, -10498, -10210, - -9920, -9628, -9335, -9040, - -8744, -8446, -8146, -7845, - -7543, -7239, -6934, -6628, - -6320, -6012, -5702, -5391, - -5079, -4766, -4453, -4138, - -3823, -3507, -3190, -2873, - -2555, -2237, -1918, -1599, - -1279, -960, -640, -320, - 0, 320, 640, 960, - 1279, 1599, 1918, 2237, - 2555, 2873, 3190, 3507, - 3823, 4138, 4453, 4766, - 5079, 5391, 5702, 6012, - 6320, 6628, 6934, 7239, - 7543, 7845, 8146, 8446, - 8744, 9040, 9335, 9628, - 9920, 10210, 10498, 10784, - 11068, 11351, 11632, 11910, - 12187, 12462, 12735, 13005, - 13274, 13540, 13805, 14067, - 14327, 14584, 14840, 15093, - 15344, 15593, 15839, 16083, - 16325, 16565, 16802, 17036, - 17269, 17499, 17726, 17951, - 18174, 18395, 18613, 18828, - 19041, 19252, 19460, 19666, - 19870, 20071, 20270, 20466, - 20660, 20852, 21041, 21228, - 21413, 21595, 21775, 21952, - 22128, 22301, 22471, 22640, - 22806, 22970, 23131, 23291, - 23448, 23603, 23756, 23907, - 24056, 24202, 24346, 24489, - 24629, 24767, 24904, 25038, - 25170, 25300, 25428, 25555, - 25679, 25802, 25923, 26041, - 26158, 26274, 26387, 26499, - 26609, 26717, 26823, 26928, - 27031, 27132, 27232, 27331, - 27427, 27522, 27616, 27708, - 27798, 27887, 27975, 28061, - 28146, 28229, 28311, 28391, - 28470, 28548, 28625, 28700, - 28774, 28846, 28918, 28988, - 29057, 29125, 29191, 29257, - 29321, 29385, 29447, 29508, - 29568, 29627, 29685, 29742, - 29798, 29853, 29906, 29959, - 30012, 30063, 30113, 30162, - 30211, 30258, 30305, 30351, - 30396, 30440, 30484, 30527, - 30569, 30610, 30650, 30690, - 30729, 30767, 30805, 30842, - 30878, 30913, 30948, 30983, - 31016, 31049, 31082, 31113, - 31145, 31175, 31205, 31235, - 31264, 31293, 31320, 31348, - 31375, 31401, 31427, 31453, - 31478, 31502, 31526, 31550, - 31573, 31596, 31618, 31640, - 31661, 31682, 31703, 31723, - 31743, 31763, 31782, 31801, - 31819, 31838, 31855, 31873, - 31890, 31907, 31923, 31939, - 31955, 31971, 31986, 32001, - 32016, 32030, 32044, 32058, - 32072, 32085, 32098, 32111, - 32124, 32136, 32148, 32160, - 32172, 32183, 32195, 32206, - 32216, 32227, 32237, 32248, - 32258, 32268, 32277, 32287, - 32296, 32305, 32314, 32323, - 32331, 32340, 32348, 32356, - 32364, 32372, 32380, 32387, - 32394, 32402, 32409, 32416, - 32422, 32429, 32436, 32442, - 32448, 32455, 32461, 32467, - 32473, 32478, 32484, 32489, - 32495, 32500, 32505, 32510, - 32515, 32520, 32525, 32530, - 32534, 32539, 32543, 32548, - 32552, 32556, 32560, 32564, - 32568, 32572, 32576, 32580, - 32584, 32587, 32591, 32594, - 32597, 32601, 32604, 32607, - 32610, 32614, 32617, 32619, - 32622, 32625, 32628, 32631, - 32633, 32636, 32639, 32641, - 32644, 32646, 32649, 32651, - 32653, 32655, 32658, 32660, - 32662, 32664, 32666, 32668, - 32670, 32672, 32674, 32676, - 32678, 32679, 32681, 32683, - 32684, 32686, 32688, 32689, - 32691, 32692, 32694, 32695, - 32697, 32698, 32700, 32701, - 32702, 32704, 32705, 32706, - 32707, 32709, 32710, 32711, - 32712, 32713, 32714, 32715, - 32716, 32717, 32718, 32719, - 32720, 32721, 32722, 32723, - 32724, 32725, 32726, 32727, - 32728, 32728, 32729, 32730, - 32731, 32732, 32732, 32733, - 32734, 32734, 32735, 32736, - 32736, 32737, 32738, 32738, - 32739, 32740, 32740, 32741, - 32741, 32742, 32742, 32743, - 32743, 32744, 32744, 32745, - 32745, 32746, 32746, 32747, - 32747, 32748, 32748, 32749, - 32749, 32749, 32750, 32750, - 32751, 32751, 32751, 32752, - 32752, 32752, 32753, 32753, - 32753, 32754, 32754, 32754, - 32755, 32755, 32755, 32756, - 32756, 32756, 32756, 32757, - 32757, 32757, 32757, 32758, - 32758, 32758, 32758, 32759, - 32759, 32759, 32759, 32759, - 32760, 32760, 32760, 32760, - 32760, 32761, 32761, 32761, - 32761, 32761, 32761, 32762, - 32762, 32762, 32762, 32762, - 32762, 32763, 32763, 32763, - 32763, 32763, 32763, 32763, - 32763, 32764, 32764, 32764, - 32764, 32764, 32764, 32764, - 32764, 32765, 32765, 32765, - 32765, 32765, 32765, 32765, - 32765, 32765, 32765, 32765, - 32766, 32766, 32766, 32766, - 32766, 32766, 32766, 32766, - 32766, 32766, 32766, 32766, - 32766, 32767, 32767, 32767, - 32767, 32767, 32767, 32767, - 32767, -}; -} \ No newline at end of file diff --git a/app/DRUMS/resources/peaks_lut_svf.hpp b/app/DRUMS/resources/peaks_lut_svf.hpp deleted file mode 100644 index d652143..0000000 --- a/app/DRUMS/resources/peaks_lut_svf.hpp +++ /dev/null @@ -1,203 +0,0 @@ -namespace peaks { - const uint16_t lut_svf_cutoff[] FLASHMEM = { - 35, 37, 39, 41, - 44, 46, 49, 52, - 55, 58, 62, 66, - 70, 74, 78, 83, - 88, 93, 99, 105, - 111, 117, 124, 132, - 140, 148, 157, 166, - 176, 187, 198, 210, - 222, 235, 249, 264, - 280, 297, 314, 333, - 353, 374, 396, 420, - 445, 471, 499, 529, - 561, 594, 629, 667, - 706, 748, 793, 840, - 890, 943, 999, 1059, - 1122, 1188, 1259, 1334, - 1413, 1497, 1586, 1681, - 1781, 1886, 1999, 2117, - 2243, 2377, 2518, 2668, - 2826, 2994, 3172, 3361, - 3560, 3772, 3996, 4233, - 4485, 4751, 5033, 5332, - 5648, 5983, 6337, 6713, - 7111, 7532, 7978, 8449, - 8949, 9477, 10037, 10628, - 11254, 11916, 12616, 13356, - 14138, 14964, 15837, 16758, - 17730, 18756, 19837, 20975, - 22174, 23435, 24761, 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[] FLASHMEM = { - 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_svf_scale[] FLASHMEM = { - 32767, 28381, 27473, 26846, - 26352, 25936, 25573, 25248, - 24953, 24682, 24429, 24193, - 23970, 23759, 23557, 23365, - 23181, 23003, 22832, 22667, - 22507, 22352, 22201, 22055, - 21912, 21772, 21636, 21503, - 21373, 21245, 21120, 20998, - 20877, 20759, 20643, 20528, - 20416, 20305, 20196, 20088, - 19982, 19877, 19774, 19672, - 19571, 19471, 19373, 19275, - 19179, 19083, 18989, 18896, - 18803, 18712, 18621, 18531, - 18442, 18353, 18266, 18179, - 18092, 18007, 17922, 17837, - 17754, 17671, 17588, 17506, - 17424, 17343, 17263, 17183, - 17103, 17024, 16946, 16868, - 16790, 16713, 16636, 16559, - 16483, 16407, 16331, 16256, - 16181, 16107, 16033, 15959, - 15885, 15812, 15739, 15666, - 15594, 15522, 15450, 15378, - 15306, 15235, 15164, 15093, - 15022, 14952, 14882, 14812, - 14742, 14672, 14602, 14533, - 14464, 14395, 14326, 14257, - 14188, 14120, 14051, 13983, - 13915, 13847, 13779, 13711, - 13643, 13575, 13508, 13440, - 13372, 13305, 13238, 13170, - 13103, 13036, 12969, 12902, - 12835, 12768, 12701, 12634, - 12567, 12500, 12433, 12366, - 12299, 12232, 12165, 12098, - 12031, 11964, 11897, 11830, - 11762, 11695, 11628, 11561, - 11493, 11426, 11359, 11291, - 11223, 11156, 11088, 11020, - 10952, 10884, 10816, 10747, - 10679, 10610, 10542, 10473, - 10404, 10335, 10266, 10196, - 10127, 10057, 9987, 9917, - 9846, 9776, 9705, 9634, - 9563, 9491, 9420, 9348, - 9276, 9203, 9130, 9057, - 8984, 8910, 8836, 8762, - 8687, 8613, 8537, 8461, - 8385, 8309, 8232, 8155, - 8077, 7998, 7920, 7841, - 7761, 7680, 7600, 7518, - 7436, 7354, 7270, 7187, - 7102, 7017, 6931, 6844, - 6756, 6668, 6578, 6488, - 6397, 6305, 6211, 6117, - 6021, 5925, 5827, 5727, - 5626, 5524, 5420, 5315, - 5207, 5098, 4987, 4873, - 4758, 4639, 4518, 4394, - 4267, 4137, 4002, 3864, - 3720, 3571, 3417, 3255, - 3086, 2907, 2717, 2514, - 2293, 2049, 1774, 1447, - 1022, -}; -} \ No newline at end of file diff --git a/app/M-OSC/Waveforms.bin b/app/M-OSC/Waveforms.bin index ba4bafaa48cd0e14acd72c3d178deb05c4c8872e..f4f6e0084dc3b57eb6e2d934283e493474990376 100644 GIT binary patch delta 6747 zcmcJUeOOahp2yEk0t5^al$Y=h0s;b>R;Gg0AwWoYCxs|rZKYeLMvEOvX=}Gm6O>x5 z?_Mp4rA0*rs|*tAst*;~x?9_^GdM$CY_-yPte`Nvq<|Bw9ryc7j(yslo&RR<^L+9- z_uP9t@HgjD3FHGEC;)m;2(o|yWP`^*4k!ZD zrWoV_BcQfR0JU8TsBHCs3fqPXcOO4yf@{fExb`C<9Le z>f~2|I(Y_ACo2KZT(H#lu(jlAM*cpG?!yP5kScMJCs z?pE$&+{d}wxjVQ!xw~MxxKn)pw8OaVv%I34`y6*K_eb34x&MRv0{3U!7rB4W-N*e$ z?tbpe+yi79_AhzGRqn632f6>ueS`ZZ_b~Tu?osal;vVDvj(dXp4!i@{ftjAuU9bz> z1N6N921LLF#^||8;JvU6rswAh*TZs{o}&l64_3hRIH$w=VI@qDbq2Q&w;#7kz_e?^ z34y4f=N=5d3x~qZa5#Jbo(0o9h=LEnvtgPKvG8Gd4oveR0X_=Pg=v1M;WqeTnC3|m z{2u%WO!FmK!1$j)VIeAL;w*xH3;z=YEpAoVx->ptY>zUd_FRyNde-?w7b<;ajg?q%GMbJIK5@50n{@(mYe zpcmf;hrq6`j$vZ~Fa_dJI0c>!Q{2L)k^SIw1wDQ2SJ6|YAf|Nq#}7@v1=oiY>gXwv z>FL07dP`vyKW^C|umpU8{Jyh(VAAP+8XugumSzQ9L$d|0q-h14K6Luxf0NBj({FQD zSSUQ;gaLZn;5vHBa7B;PmQS3n{D|+34_t6_y29B)vyNUQY>UKNuQ0O@J#u`ViQZRO-t4rDJBr(fJD6MH zG>gSd%EbfQw~5iFS@-Wwm-886;18~E%u&y(aQ<4H-?r1SZ`RZ}$AJw<5le7Dph$;~ z5}F-m$^5dD_`Y4{sMjoV?rXH%55_wjbT=~#r|z=d zoHlZ=;9kXD!~H6^g}aV>Gxt93HtsI&ZthRH`?#-}d12Iz8R*^cki&R4=D_rFrNW9n zWG1i@E7%*bPd}n3th&tDAK+lDVB>K3myG$lGeZ;>ut(uoEMP0(gh8Ydu=>x4%5V}E zu#0dq7BI67g+;@R`FSvd1}oU3uof#=IsD3IEKu+@xCh>cL}DBc*p3UFhDU|fs|_*+**XSj{tlv^nLfJqVJ$qY^INCM#y z4$2x)G91+v>(XWWq9*^OdfA$NPGlq6Fj*9 zIURha43iaZdWx~HVD|#7x-&2$ui%lvo<+#*;7kP4R`_HnV^?9{2*$i;;zFLo8U=4& z9D|`l;TLg?eF*QZL>d6EiN`AG!wkQgi{uf$QjL`oKKu}4-@+m9G8X1*ePrfW!iD%Dx%Mx#~bV=8ByHa_{&UQ+=3%r(V0M{Z$_|KMG$)$( z<)W-^(6d<0SW>M=W3fpk?#=bvf?AE=v4A%J6B&2zSIw{skGhV0JTs_sLwakERCj37 zlEGqTPWC?SW)s}*_7~oc3|82L=|+1(uhBktP&(!%Z68rgmwrEeTrmk=u59u3uEM2oL@ z_P|of>{{!LgXw~V^@zqp;bs=OGiRH@xM1Tu)nxKsVJg zsWCL@i*!v>C29$7K)Soyq}pAVgBDdAa>4^)&Fh_>w$f>ywhFm_dw?#;E=*HtdplX& z6McqUB#zQ$l%$SQ|7;Xxj^ZCta&eUUESk>K`gm1PCq}GV#5m0q|8T}P z+h~ta8tvhX#zYgyzL$;*Baz+_cO~ChGqdcn_|%CV?R1HaQ%rek$fN1~DTU!L%yX}M z6H7Et^tX53bdH4)V-X}T)};joRGk_U7qzH`6md;UjGH>Yp{G@sDDH2G2#d}y&fL@! zt!ve_Yh9Y+wX^aKndh{#?XuB^o_1Y`_*F|uO2kd+{?~>)Y!d0K_>@Z5;!`Gl5uYy7 z>LJ!MeEa_WzAx_I??6nYyo_?MI?yd_{Iwnq#NqSPHuhO%g3#d!HHI_e| zdkZ6saf%2i-)9-ZSrUeQrPL%h-N^Y?JajlQ;LGgg26Y(SOOdS*V_NYloWa| zi?Rx?f4?Fkz~OurLjj)Vy3#mplQ31`HYkAz7(b34U-*gGoz?nt!T zJ9IV8?}&dr66RJ<_aPMYw5?bs-_#=WMcIC=~+ z&5K{(G56YnT#sn_W)}5po!=ncAAMi4u0h{BVyW&OSut?mQB~G_cXHoa+g(TMm z7n`e#vd?cyh-Y)|^u=b!=CXvrOR?0mGCDU|M}0KtuMI`zmYGouG6k;iuWMns;WX$PbgpdHhvu>fIv%N$bbK&8mZs7N=J=z9gf2+atXJjuI`&3~l(~M? zj(I&eYG~C@ck~^hi~q4T>tVRz4*D}hI12Q`fqpE|4+Q#^gO$zkX8?v&yun_2DSpaNxCt*LAtq}R?jn@ zLfDep7{rL8+Bx`q-Vw&0bA&Orp2FAB4Y*yJasPW-9;x?P>rX;)zaNexl^-woAkOGEwJ5mVMF#aFu{;_`x* zAfha>M`Za4>kv_{UOI5oy3OJez0TN2u;YeA4*?h&Z-)cM;5FGql#!^Wa( z-=Yv}#yAC|=!~%;C^=(nAWF^<>yMH%#QM}~I$QOTKMk?YrDzr{MG~7Jx!bSuW;Q`l zihx^cPf*ej9T;H>>Gz6pHWH}}N7!AFnS()+_0cW8HRZv=yN0gW<(Avuii01_o%Lox z+IK4Bdzr~Svvpm%jRm5kblN8KQZ$wfT(>Je64mGCM!%H51qY%LW+hE=+UorMe6Lj} zZJLE}8?QBJ*N7X=l>|M0^R&&yOVuNLxS~(iG|zFqw8@~2*FGjro{RWJ*3Wv<@}4Mw zJI}hQ)#Pu;Jf)>x)9nMUvA8IMu?tl1YSiYH;m>DO z7Vj*IZxq0Pia@UkvH{Ks-eVID6FJCu92aKQj~*Ao>yNh!8uR%>SZY8&xC(B7Q7{4S0U6$C1@HmEAPOXa zB(Ml*K^`!I<)8vof*P<6)Pb#F4|p52fa9PGbhltQ&ZBS<^c}=H2?oJ17z1{259BrD zk8;2WO2Kka4k~~NRDvo{1J;5Dv}p#dpaYx+z2E}4h~s^r9}F~?cz-iD6E`UBT00zM@7z1`de^iwNB~XEI5DU~G8E8NjFo04}4onB}?~y7L n)&dLI1a^Xc+~rU2cmn(PfDCu806riXM1cg51Qr1;$OHca&Rtg} delta 6183 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 MKld$*t>dbH110OXXaE2J diff --git a/app/M-OSC/Waveforms.cpp b/app/M-OSC/Waveforms.cpp index d9b4bf8..1a052f0 100644 --- a/app/M-OSC/Waveforms.cpp +++ b/app/M-OSC/Waveforms.cpp @@ -47,26 +47,46 @@ Envelope envelope; VcoJitterSource jitter_source; braids::Quantizer quantizer; +static int8_t notes[6] = {}; + +#ifndef MACHINE_INTERNAL + void Quantizer::Init() -{} +{ +} -bool Quantizer::enabled() { +bool Quantizer::enabled() +{ return engine::qz_enabled(); } int32_t Quantizer::Process(int32_t pitch, int32_t root, int8_t *note) { + memset(notes, 0, sizeof(notes)); + if (note == nullptr) + note = ¬es[0]; + pitch -= root + (PITCH_PER_OCTAVE * 8); auto ret = engine::qz_process(pitch, note); ret += root + (PITCH_PER_OCTAVE * 8); + notes[0] = *note; return ret; } int16_t Quantizer::Lookup(uint8_t index) { + for (auto ¬e : notes) + { + if (note == 0) + { + note = index - notes[0]; + break; + } + } + return engine::qz_lookup(index) + (PITCH_PER_OCTAVE * 8); } - +#endif uint8_t sync_samples[FRAME_BUFFER_SIZE] = {}; int32_t _pitch = 0; @@ -102,6 +122,7 @@ void engine::setup() void engine::process() { + memset(notes, 0, sizeof(notes)); envelope.Update(_attack / 512, _decay / 512); if (engine::trig()) @@ -184,6 +205,24 @@ void engine::process() void engine::draw() { + if (_shape >= 48) + { + char tmp[8]; + for (int i = 0; i < LEN_OF(notes); i++) + { + if (notes[i] != 0) + { + int slen = 0; + if (i == 0) + slen = sprintf(tmp, "%d", notes[i]); + else + slen = sprintf(tmp, "%+d", notes[i]); + + gfx::drawString(128 - slen * 5, 10 + 6 * i, tmp, 0); + } + } + } + if (!__io->tr) { setParamName(&_decay, "Level"); diff --git a/app/index.json b/app/index.json index b72dea7..4f1efc8 100644 --- a/app/index.json +++ b/app/index.json @@ -48,6 +48,7 @@ "GND/Scope.bin", "GND/FFT.bin", - "SYNTH/plaits.bin" + "SYNTH/plaits.bin", + "DRUMS/DrumSynth.bin" ] } \ No newline at end of file diff --git a/app/squares-and-circles-api.h b/app/squares-and-circles-api.h index 4ae8c67..6c4deba 100644 --- a/app/squares-and-circles-api.h +++ b/app/squares-and-circles-api.h @@ -110,6 +110,7 @@ EXTERN_C uint32_t crc32(uint32_t crc, const void *buf, size_t size); EXTERN_C { extern const char *__name; + extern const uint8_t *__data; extern uint32_t *__t; extern uint8_t *__clock; extern uint8_t *__step; @@ -241,7 +242,7 @@ namespace engine EXTERN_C void process(); EXTERN_C void draw(); EXTERN_C void screensaver(); - + EXTERN_C void release(); ///// typedef bool (*uiHandler)(uint16_t type, uint16_t control, int16_t value, uint16_t mask); diff --git a/app/upload.py b/app/upload.py index 4cdb779..736ac59 100755 --- a/app/upload.py +++ b/app/upload.py @@ -144,9 +144,11 @@ def get_appid(binfile): apps = json.load(f) j = 0 + enginesNew = [] for file in apps["apps"]: bin_file = os.path.dirname(apps_json) + "/" + str(file) if not os.path.exists(bin_file): + print(bin_file, "not found") continue app_id = get_appid(bin_file) # os.path.splitext(file)[0] bin_size = os.path.getsize(bin_file) @@ -170,24 +172,24 @@ def get_appid(binfile): engine["addr"] = "%x" % offset engine["size"] = "%s" % bin_size engine["crc32"] = "%x" % crc32sum - engines.append(engine) - print("NEW ->", file, engine) + enginesNew.append(engine) + print("NEW ->", app_id, 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"], + app_id, 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) + "NEXT: %x" % (onext) ) + enginesNew.append(engine) continue - print("->", file, engine) + print("->", app_id, file, engine) print( os.path.splitext(file)[0], "%x" % crc32sum, bin_size - int(engine["size"]) @@ -211,8 +213,8 @@ def get_appid(binfile): offset += 4 - (offset % 4) - if len(engines) > 0: - offset = max((int(e["addr"], 16) + int(e["size"])) for e in engines) + if len(enginesNew) > 0: + offset = max((int(e["addr"], 16) + int(e["size"])) for e in enginesNew) offset += 4096 - (offset % 4096) print("END 0x%x" % offset) for chunk in chunk_bytes(bytearray(b"\xff") * 4096, 4096): diff --git a/lib/braids/chords_stack.cc b/lib/braids/chords_stack.cc index 37ee90f..9cf86ed 100644 --- a/lib/braids/chords_stack.cc +++ b/lib/braids/chords_stack.cc @@ -496,11 +496,12 @@ void DigitalOscillator::renderChord( } else { if (quantizer.enabled()) { int8_t index = 0; - fm = pitch_ - quantizer.Process(pitch_, 0, &index); + int8_t root = 0; + fm = pitch_ - quantizer.Process(pitch_, 0, &root); phase_increment[0] = phase_increment_; for (size_t i = 1; i < noteCount; i++) { - index = (index + noteOffset[i-1]); + index = (root + noteOffset[i-1]); if (index >= 128) { noteCount = i; break; diff --git a/lib/drumsynth/drumsynth.cpp b/lib/drumsynth/drumsynth.cpp index ef3f98b..32c4ee1 100644 --- a/lib/drumsynth/drumsynth.cpp +++ b/lib/drumsynth/drumsynth.cpp @@ -33,8 +33,8 @@ #include "misc/Biquad.h" #include "drumsynth.h" -#ifndef SAMPLE_RATE -constexpr float SAMPLE_RATE = 48000.f; +#ifndef __SAMPLE_RATE +constexpr float __SAMPLE_RATE = 48000.f; #endif inline float dB2amp(float dB) @@ -47,15 +47,15 @@ class Envelope const EnvArgs *args_; public: - void init(const EnvArgs &args) + void init(const EnvArgs *args) { - args_ = &args; + args_ = args; value_ = 0.f; e_ = 0.0001f; c_ = 1.0f; segment_ = 0; - if (args.n == 0) + if (args_->n == 0) { value_ = 1.f; pos_ = 0; @@ -132,7 +132,7 @@ class Oscillator void Init(float freq) { pw_ = 0.5f; - phase_inc_ = freq / SAMPLE_RATE; + phase_inc_ = freq / __SAMPLE_RATE; f_ = freq; osc.Init(); } @@ -144,7 +144,7 @@ class Oscillator inline void pitch(float pitch) { - phase_inc_ = f_ * pitch / SAMPLE_RATE; + phase_inc_ = f_ * pitch / __SAMPLE_RATE; } inline void duty(float duty) @@ -215,8 +215,8 @@ struct drum_synth_Part Biquad biquad1 = {}; Biquad biquad2 = {}; - std::pair biquad1b; - std::pair biquad2b; + std::pair biquadA[2] = {}; + std::pair biquadB[2] = {}; const PartArgs *part; @@ -226,18 +226,18 @@ struct drum_synth_Part { this->part = part; - _amp.init(part->osc_amp); - _pitch.init(part->osc_pitch); - _vca.init(part->vca); + _amp.init(&part->osc_amp); + _pitch.init(&part->osc_pitch); + _vca.init(&part->vca); _dc_blocker.Init(0.99f); const auto &a = part->bq1; if (a.mode) - biquad1.setBiquad(a.mode - 1, a.f / SAMPLE_RATE, a.q, a.g); + biquad1.setBiquad(a.mode - 1, a.f / __SAMPLE_RATE, a.q, a.g); const auto &b = part->bq2; if (b.mode) - biquad2.setBiquad(b.mode - 1, b.f / SAMPLE_RATE, b.q, b.g); + biquad2.setBiquad(b.mode - 1, b.f / __SAMPLE_RATE, b.q, b.g); if (part->osc.type == OSC_METALLIC) { @@ -291,6 +291,9 @@ struct drum_synth_Part { for (size_t j = 0; j < this->part->osc.n; j++) this->_osc[j].reset(); + + memset(&this->biquadA, 0, sizeof(this->biquadA)); + memset(&this->biquadB, 0, sizeof(this->biquadB)); } uint32_t last_f = 0; @@ -300,7 +303,7 @@ struct drum_synth_Part uint32_t t = params->t; float osc = 0; float osc2 = 0; - uint32_t ff = f * SAMPLE_RATE; + uint32_t ff = f * __SAMPLE_RATE; // if (t > 0 && this->_amp.finished() && this->_vca.finished()) // { @@ -365,6 +368,8 @@ struct drum_synth_Part this->_osc[0].pitch(this->_pitch.value() * f); this->_osc[0].Tri(osc); break; + default: + return; } if (part->flags & BIQUAD_SERIAL) @@ -376,10 +381,10 @@ struct drum_synth_Part { if (last_f != ff) { - this->biquad1.setFc(part->bq1.f / SAMPLE_RATE * f); + this->biquad1.setFc(part->bq1.f / __SAMPLE_RATE * f); } - osc = this->biquad1.process(osc); + osc = this->biquad1.process(osc, this->biquadA[0].first, this->biquadA[0].second); if (part->bq1.mode < BIQUAD_NOTCH) osc *= part->bq1.g; } @@ -391,10 +396,10 @@ struct drum_synth_Part { if (last_f != ff) { - this->biquad2.setFc(part->bq2.f / SAMPLE_RATE * f); + this->biquad2.setFc(part->bq2.f / __SAMPLE_RATE * f); } - osc = this->biquad2.process(osc); + osc = this->biquad2.process(osc, this->biquadA[1].first, this->biquadA[1].second); if (part->bq2.mode < BIQUAD_NOTCH) osc *= part->bq2.g; } @@ -406,17 +411,17 @@ struct drum_synth_Part if (part->bq1.mode) { - osc2 = this->biquad1.process(osc2, this->biquad1b.first, this->biquad1b.second); + osc2 = this->biquad1.process(osc2, this->biquadB[0].first, this->biquadB[0].second); if (part->bq1.mode < BIQUAD_NOTCH) osc2 *= part->bq1.g; } if (part->ws.n) - osc = waveshaper_transform(osc); + osc2 = waveshaper_transform(osc2); if (part->bq2.mode) { - osc2 = this->biquad2.process(osc2, this->biquad2b.first, this->biquad2b.second); + osc2 = this->biquad2.process(osc2, this->biquadB[1].first, this->biquadB[1].second); if (part->bq2.mode < BIQUAD_NOTCH) osc2 *= part->bq2.g; } @@ -480,6 +485,154 @@ extern "C" void drum_synth_process_frame(DrumSynth inst, int part, float freq, c if (inst) { auto _part = (drum_synth_Part *)&inst[1]; - _part[part].process_frame(freq, params, outL, outR, size); + if (part >= 0) + { + _part[part].process_frame(freq, params, outL, outR, size); + } + else + { + float tmpL[size]; + float tmpR[size]; + size_t skip = -1; + + for (size_t part = 0; part < inst[0]; part++) + { + if (skip == part) + continue; + + _part[part].process_frame(freq, params, tmpL, tmpR, size); + + if (part == 0 && _part[part].part->amp_mod.dest != 0) + { + skip = _part[part].part->amp_mod.dest; + float modL[size]; + float modR[size]; + _part[_part[part].part->amp_mod.dest].process_frame(freq, params, modL, modR, size); + + for (int j = 0; j < size; j++) + { + outL[j] += tmpL[j] * modL[j] * params->levelL; + outR[j] += tmpR[j] * modR[j] * params->levelR; + } + } + else + { + for (int j = 0; j < size; j++) + { + outL[j] += tmpL[j] * params->levelL; + outR[j] += tmpR[j] * params->levelR; + } + } + } + } } +} + +extern "C" int drum_synth_load_models(const uint8_t *drumkit, DrumModel _instModel[16], void *(*malloc)(size_t size)) +{ + if (drumkit == nullptr) + return 0; + + if (drumkit[0] == '!' && drumkit[1] == 'R' && drumkit[2] == 'C' && drumkit[3] == '8') + drumkit += 4; + else + return 0; + + int inst_count = 0; + const uint8_t *p = drumkit; + p += 4; + for (size_t i = 0; i < drumkit[0]; i++) + { + _instModel[i].name = reinterpret_cast(p); + p += 12; + + _instModel[i].n = *reinterpret_cast(p); + p += sizeof(_instModel[i].n); + + PartArgs *part = new (malloc(sizeof(PartArgs) * _instModel[i].n)) PartArgs[_instModel[i].n]{}; + _instModel[i].part = part; + + for (int j = 0; j < _instModel[i].n; j++) + { + part->flags = *reinterpret_cast(p); + p += sizeof(part->flags); + + part->osc = *reinterpret_cast(p); + p += sizeof(part->osc); + + part->osc_pitch.n = *reinterpret_cast(p); + p += sizeof(part->osc_pitch.n); + part->osc_pitch.xy = reinterpret_cast(p); + if (part->osc_pitch.xy[part->osc_pitch.n - 1].t > 0) + { + // OK + } + int k = part->osc_pitch.n; + p += sizeof(EnvXY) * k; + + part->osc_amp.n = *reinterpret_cast(p); + p += sizeof(part->osc_amp.n); + part->osc_amp.xy = reinterpret_cast(p); + if (part->osc_amp.xy[part->osc_amp.n - 1].t > 0) + { + // OK + } + k = part->osc_amp.n; + p += sizeof(EnvXY) * k; + + part->vca.n = *reinterpret_cast(p); + p += sizeof(part->vca.n); + part->vca.xy = reinterpret_cast(p); + if (part->vca.xy[part->vca.n - 1].t > 0) + { + // OK + } + k = part->vca.n; + p += sizeof(EnvXY) * k; + + part->bq1 = *reinterpret_cast(p); + p += sizeof(BiquadArgs); + + part->bq2 = *reinterpret_cast(p); + p += sizeof(BiquadArgs); + + part->ws.n = *reinterpret_cast(p); + p += sizeof(part->ws.n); + part->ws.xy = reinterpret_cast(p); + if (part->ws.xy[part->ws.n - 1].x > 0) + { + // OK + } + k = part->ws.n; + p += sizeof(WS_XY) * k; + + if (part->flags & VCF) + { + part->vcf = reinterpret_cast(p); + p += sizeof(*part->vcf); + + part->vcf_env.n = *reinterpret_cast(p); + p += sizeof(part->vcf_env.n); + part->vcf_env.xy = reinterpret_cast(p); + if (part->vcf_env.xy[part->vcf_env.n - 1].t > 0) + { + // OK + } + k = part->vcf_env.n; + p += sizeof(EnvXY) * k; + } + + part->amp_mod.dest = *reinterpret_cast(p); + p += sizeof(part->amp_mod.dest); + part->amp_mod.offset = *reinterpret_cast(p); + p += sizeof(part->amp_mod.offset); + + part->level = *reinterpret_cast(p); + p += sizeof(part->level); + part++; + } + inst_count++; + } + + return inst_count; } \ No newline at end of file diff --git a/lib/drumsynth/drumsynth.h b/lib/drumsynth/drumsynth.h index da35c7b..c253d60 100644 --- a/lib/drumsynth/drumsynth.h +++ b/lib/drumsynth/drumsynth.h @@ -97,10 +97,25 @@ struct OscArgs uint32_t n; }; +struct AmpMod +{ + uint32_t dest; + float offset; +}; + +struct VCFArgs +{ + float cutoff; + float res; + float envDepth; + float velDepth; +}; + enum PartFlags : uint32_t { BIQUAD_SERIAL = 1 << 1, BIQUAD_PARALLEL = 1 << 2, + VCF = 1 << 3, }; struct PartArgs @@ -113,6 +128,9 @@ struct PartArgs BiquadArgs bq1; BiquadArgs bq2; WSArgs ws; + const VCFArgs *vcf; + EnvArgs vcf_env; + AmpMod amp_mod; float level; }; @@ -129,6 +147,8 @@ struct DrumParams float attack; float decay; float stereo; + float levelL; + float levelR; }; struct DrumKit @@ -144,4 +164,5 @@ extern "C" DrumSynth drum_synth_init(const DrumModel *inst, void *(*malloc)(size_t size)); void drum_synth_process_frame(DrumSynth inst, int part, float freq, const DrumParams *params, float *outL, float *outR, size_t size); void drum_synth_reset(DrumSynth inst); + int drum_synth_load_models(const uint8_t *drumkit, DrumModel _instModel[16], void *(*malloc)(size_t size)); } \ No newline at end of file diff --git a/platformio.ini b/platformio.ini index 7167a2e..0580f34 100644 --- a/platformio.ini +++ b/platformio.ini @@ -9,5 +9,5 @@ [env:squares-and-circles] apps_json = ./app/index.json -squares_and_circles_loader = 78883e6 ; minimum loader version +squares_and_circles_loader = fb79585 ; minimum loader version platform = .pio/ \ No newline at end of file