From 0e83607c9d448ea0b97eec43bc6d5a47a54fd9a5 Mon Sep 17 00:00:00 2001 From: eh2k Date: Sat, 14 Dec 2024 17:34:06 +0100 Subject: [PATCH] devsync 18c0102 --- README.md | 5 +++ app/DRUMS/Claps.bin | Bin 31160 -> 30668 bytes app/DRUMS/Claps.cpp | 77 ++++++++++++++++++++++++++-------- app/squares-and-circles-api.h | 1 + app/upload.py | 2 +- lib/braids/quantizer.cc | 7 ++++ lib/braids/quantizer.h | 5 +++ lib/drumsynth/drumsynth.cpp | 72 ++++++++++++++++++++++++++----- lib/drumsynth/drumsynth.h | 39 +++++++++-------- lib/misc/Biquad.h | 20 ++++++++- platformio.ini | 2 +- 11 files changed, 182 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 6d54c22..6a072b2 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,11 @@ ChangeLog ```` +== 2024-12-14 + * Bugfix/Enchancement + * SEQ triggered & trig-input triggered engines were not in sync + * V_OCT/Scale parameter, semitones from active quantizer (#117) + * Claps less RAM usage == 2024-12-07 * Bugfix: * EnvFollower - IO-page AUX input diff --git a/app/DRUMS/Claps.bin b/app/DRUMS/Claps.bin index 60d8492f4165623ef58b99c90063ef0bb33d5ac7..57604aad4c5aea1cdf79cd7d1735080bfbaae7dc 100644 GIT binary patch literal 30668 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 literal 31160 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 j4{*Z9lB|B(G3Rs^p< diff --git a/app/DRUMS/Claps.cpp b/app/DRUMS/Claps.cpp index 9921c47..28d81ef 100644 --- a/app/DRUMS/Claps.cpp +++ b/app/DRUMS/Claps.cpp @@ -28,8 +28,6 @@ #include "lib/drumsynth/drumsynth_claps.h" #include "lib/misc/noise.hxx" -float tmp[FRAME_BUFFER_SIZE]; -float tmp2[FRAME_BUFFER_SIZE]; static constexpr size_t n = 8; DrumSynth _instA = nullptr; @@ -80,25 +78,66 @@ void engine::setup() // unpack const uint8_t *p = packed_drumKit; p += 4; - for (size_t i = 0; i < inst_count; i++) + for (size_t i = 0; i < packed_drumKit[0]; i++) { inst[i].name = reinterpret_cast(p); p += 12; - inst[i].n = p[0]; - p += 4; - inst[i].part = reinterpret_cast(p); - p += inst[i].n * sizeof(PartArgs); + + inst[i].n = *reinterpret_cast(p); + p += sizeof(inst[i].n); + + PartArgs *part = new PartArgs[inst[i].n]{}; + inst[i].part = part; + + for (int j = 0; j < inst[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); + p += sizeof(EnvXY) * 16; + + part->osc_amp.n = *reinterpret_cast(p); + p += sizeof(part->osc_amp.n); + part->osc_amp.xy = reinterpret_cast(p); + p += sizeof(EnvXY) * 16; + + part->vca.n = *reinterpret_cast(p); + p += sizeof(part->vca.n); + part->vca.xy = reinterpret_cast(p); + p += sizeof(EnvXY) * 16; + + 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); + p += sizeof(WS_XY) * 8; + + part->level = *reinterpret_cast(p); + p += sizeof(part->level); + part++; + } } engine::addParam("Color", &pitch, 0.5f, 1.5f); char *tmp = inst_name_buff; - for (int i = 0; i < LEN_OF(inst_names); i++) + for (int i = 0; i < (inst_count + LEN_OF(seeds)); i++) { inst_names[i] = tmp; tmp += sprint_inst_name(tmp, i) + 1; } - engine::addParam("Clap", &inst_selection, 0, LEN_OF(inst_names) - 1, inst_names); + engine::addParam("Clap", &inst_selection, 0, (inst_count + LEN_OF(seeds)) - 1, inst_names); engine::addParam("Decay", &stretch, 0.1f, 2.0f); engine::addParam("Stereo", &stereo); // param[0].init("Crispy", &crispy, crispy, -1.1f, 1.1f); @@ -191,6 +230,8 @@ void engine::process() 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]; if (engine::trig()) { @@ -218,30 +259,30 @@ void engine::process() { if (stereo > 0.01f && _cur_inst.part[k].osc.type >= OSC_METALLIC) { - drum_synth_process_frame(_instA, k, (f - (f * 0.01f * stereo)), ¶ms, tmp, FRAME_BUFFER_SIZE); - drum_synth_process_frame(_instB, k, (f + (f * 0.01f * stereo)), ¶ms, tmp2, FRAME_BUFFER_SIZE); + drum_synth_process_frame(_instA, k, (f - (f * 0.01f * stereo)), ¶ms, tmpL, tmpL, FRAME_BUFFER_SIZE); + drum_synth_process_frame(_instB, k, (f + (f * 0.01f * stereo)), ¶ms, tmpR, tmpR, FRAME_BUFFER_SIZE); if (_cur_inst.part[k].osc.type == OSC_METALLIC) { for (int i = 0; i < FRAME_BUFFER_SIZE; i++) { - buffer[i] += tmp[i]; - bufferAux[i] += tmp2[i]; + buffer[i] += tmpL[i]; + bufferAux[i] += tmpR[i]; } } else for (int i = 0; i < FRAME_BUFFER_SIZE; i++) { - buffer[i] += tmp[i]; - bufferAux[i] += tmp[i] * b + tmp2[i] * a; + buffer[i] += tmpL[i]; + bufferAux[i] += tmpL[i] * b + tmpR[i] * a; } } else { - drum_synth_process_frame(_instA, k, f, ¶ms, tmp, FRAME_BUFFER_SIZE); + drum_synth_process_frame(_instA, k, f, ¶ms, tmpL, tmpR, FRAME_BUFFER_SIZE); for (int i = 0; i < FRAME_BUFFER_SIZE; i++) { - buffer[i] += tmp[i]; - bufferAux[i] += tmp[i]; + buffer[i] += tmpL[i]; + bufferAux[i] += tmpR[i]; } } // bufferAux[i] += p._vca.value() * p._amp.value() * 0.99f; diff --git a/app/squares-and-circles-api.h b/app/squares-and-circles-api.h index de5dc07..671ee16 100644 --- a/app/squares-and-circles-api.h +++ b/app/squares-and-circles-api.h @@ -127,6 +127,7 @@ EXTERN_C extern uint8_t *__mixer_level; extern uint8_t *__mixer_pan; + extern uint32_t *__multi_trigs_mask; extern float **__audio_in_l_fpp; extern float **__audio_in_r_fpp; diff --git a/app/upload.py b/app/upload.py index 0f996b8..4cdb779 100755 --- a/app/upload.py +++ b/app/upload.py @@ -172,7 +172,7 @@ def get_appid(binfile): engine["crc32"] = "%x" % crc32sum engines.append(engine) print("NEW ->", file, engine) - continue + #continue #exit(0) elif engine["crc32"] == "%x" % crc32sum: onext = int(engine["addr"], 16) + int(engine["size"]) diff --git a/lib/braids/quantizer.cc b/lib/braids/quantizer.cc index 84083a9..7477132 100644 --- a/lib/braids/quantizer.cc +++ b/lib/braids/quantizer.cc @@ -38,6 +38,8 @@ void Quantizer::Init() { codeword_ = 0; previous_boundary_ = 0; next_boundary_ = 0; + last_note = 64; + num_notes_ = 12; for (int16_t i = 0; i < 128; ++i) { codebook_[i] = (i - 64) << 7; } @@ -56,7 +58,12 @@ void Quantizer::Configure( int16_t span, size_t num_notes) { enabled_ = notes != NULL && num_notes != 0 && span != 0; + num_notes_ = num_notes; if (enabled_) { + codeword_ = 0; + previous_boundary_ = 0; + next_boundary_ = 0; + last_note = 64; int32_t octave = 0; size_t note = 0; int16_t root = 0; diff --git a/lib/braids/quantizer.h b/lib/braids/quantizer.h index bb78720..3367ed1 100644 --- a/lib/braids/quantizer.h +++ b/lib/braids/quantizer.h @@ -62,6 +62,10 @@ class Quantizer { bool enabled(); + size_t NumNotes() { + return num_notes_; + } + private: int8_t last_note; bool enabled_; @@ -69,6 +73,7 @@ class Quantizer { int32_t codeword_; int32_t previous_boundary_; int32_t next_boundary_; + size_t num_notes_; DISALLOW_COPY_AND_ASSIGN(Quantizer); }; diff --git a/lib/drumsynth/drumsynth.cpp b/lib/drumsynth/drumsynth.cpp index b45654a..ef3f98b 100644 --- a/lib/drumsynth/drumsynth.cpp +++ b/lib/drumsynth/drumsynth.cpp @@ -106,6 +106,11 @@ class Envelope } } + inline bool finished() + { + return pos_ != 0 && pos_ == len_; + } + inline float value() { return value_; @@ -183,7 +188,10 @@ class Oscillator inline void Sine(float &out) { - out = stmlib::Interpolate(plaits::lut_sine + 256, osc.phase_, 1024.0f); + // #define PI_F 3.1415927410125732421875f + // out = sinf((0.25f + osc.phase_) * PI_F * 2.f); + + out = stmlib::Interpolate(plaits::lut_sine + 128, osc.phase_, 512.0f); osc.phase_ += phase_inc_; if (osc.phase_ > 1.0f) @@ -207,6 +215,9 @@ struct drum_synth_Part Biquad biquad1 = {}; Biquad biquad2 = {}; + std::pair biquad1b; + std::pair biquad2b; + const PartArgs *part; float amp = 0.4380016479995117f; @@ -284,16 +295,23 @@ struct drum_synth_Part uint32_t last_f = 0; - inline void process_frame(float f, uint32_t t, float stretch, float *out, size_t size) + inline void process_frame(float f, const DrumParams *params, float *outL, float *outR, size_t size) { + uint32_t t = params->t; float osc = 0; + float osc2 = 0; uint32_t ff = f * SAMPLE_RATE; + // if (t > 0 && this->_amp.finished() && this->_vca.finished()) + // { + // return; + // } + while (size--) { - this->_amp.process(t, stretch); - this->_vca.process(t, stretch); - this->_pitch.process(t, stretch); + this->_amp.process(t, params->decay); + this->_vca.process(t, params->decay); + this->_pitch.process(t, params->decay); ++t; @@ -307,8 +325,14 @@ struct drum_synth_Part { case OSC_NOISE1: case OSC_NOISE2: - osc = this->noise.nextf(-1, 1); - break; + { + float a = this->noise.nextf(-1, 1); + float b = this->noise.nextf(-1, 1); + float st = 0.5f - (params->stereo / 2); + osc = (a * (1 - st) + b * st); + osc2 = (b * (1 - st) + a * st); + } + break; case OSC_METALLIC: osc = 0; @@ -374,6 +398,33 @@ struct drum_synth_Part if (part->bq2.mode < BIQUAD_NOTCH) osc *= part->bq2.g; } + + if (params->stereo > 0 && (part->osc.type == OSC_NOISE1 || part->osc.type == OSC_NOISE2)) + { + osc2 *= amp; + osc2 *= this->_amp.value(); + + if (part->bq1.mode) + { + osc2 = this->biquad1.process(osc2, this->biquad1b.first, this->biquad1b.second); + if (part->bq1.mode < BIQUAD_NOTCH) + osc2 *= part->bq1.g; + } + + if (part->ws.n) + osc = waveshaper_transform(osc); + + if (part->bq2.mode) + { + osc2 = this->biquad2.process(osc2, this->biquad2b.first, this->biquad2b.second); + if (part->bq2.mode < BIQUAD_NOTCH) + osc2 *= part->bq2.g; + } + } + else + { + osc2 = osc; + } } else if (part->flags & BIQUAD_PARALLEL) { @@ -383,7 +434,8 @@ struct drum_synth_Part osc = this->biquad2.process(osc) * part->bq2.g; } - *out++ = osc * this->_vca.value() * part->level; + *outL++ = osc * this->_vca.value() * part->level; + *outR++ = osc2 * this->_vca.value() * part->level; } last_f = ff; @@ -423,11 +475,11 @@ extern "C" void drum_synth_reset(DrumSynth inst) } } } -extern "C" void drum_synth_process_frame(DrumSynth inst, int part, float freq, const DrumParams *params, float *out, size_t size) +extern "C" void drum_synth_process_frame(DrumSynth inst, int part, float freq, const DrumParams *params, float *outL, float *outR, size_t size) { if (inst) { auto _part = (drum_synth_Part *)&inst[1]; - _part[part].process_frame(freq, params->t, params->decay, out, size); + _part[part].process_frame(freq, params, outL, outR, size); } } \ No newline at end of file diff --git a/lib/drumsynth/drumsynth.h b/lib/drumsynth/drumsynth.h index 7708079..da35c7b 100644 --- a/lib/drumsynth/drumsynth.h +++ b/lib/drumsynth/drumsynth.h @@ -38,10 +38,22 @@ struct EnvXY struct EnvArgs { int32_t n; - EnvXY xy[16]; + const EnvXY *xy; //[16]; }; -enum BiquadMode +struct WS_XY +{ + float x; + float y; +}; + +struct WSArgs +{ + uint32_t n; + const WS_XY *xy; //[8]; +}; + +enum BiquadMode : uint32_t { BIQUAD_THRU = 0, BIQUAD_LP, @@ -61,7 +73,7 @@ struct BiquadArgs float g; }; -enum OscType +enum OscType : uint32_t { OSC_NONE = 0, OSC_SINE = 1, @@ -85,7 +97,7 @@ struct OscArgs uint32_t n; }; -enum PartFlags +enum PartFlags : uint32_t { BIQUAD_SERIAL = 1 << 1, BIQUAD_PARALLEL = 1 << 2, @@ -93,30 +105,22 @@ enum PartFlags struct PartArgs { - uint32_t flags; + PartFlags flags; OscArgs osc; EnvArgs osc_pitch; EnvArgs osc_amp; EnvArgs vca; BiquadArgs bq1; BiquadArgs bq2; - struct - { - uint32_t n; - struct _ - { - float x; - float y; - } xy[8]; - } ws; + WSArgs ws; float level; }; struct DrumModel { - const char* name; + const char *name; size_t n; - const PartArgs* part; + const PartArgs *part; }; struct DrumParams @@ -124,6 +128,7 @@ struct DrumParams uint32_t t; float attack; float decay; + float stereo; }; struct DrumKit @@ -137,6 +142,6 @@ typedef uint32_t *DrumSynth; 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 *out, 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); } \ No newline at end of file diff --git a/lib/misc/Biquad.h b/lib/misc/Biquad.h index 7e12ed2..765910a 100644 --- a/lib/misc/Biquad.h +++ b/lib/misc/Biquad.h @@ -42,7 +42,7 @@ class Biquad void setPeakGain(float peakGainDB); void setBiquad(int type, float Fc, float Q, float peakGainDB); float process(float in); - + float process(float in, float& z1, float& z2); protected: void calcBiquad(void); @@ -74,4 +74,22 @@ inline float Biquad::process(float in) // return y; } +inline float Biquad::process(float in, float& _z1, float& _z2) +{ + float out = in * a0 + _z1; + _z1 = in * a1 + _z2 - b1 * out; + _z2 = in * a2 - b2 * out; + return out; + + // float x = in; + // float y = a0 * x + a1 * x1 + a2 * x2 - b1 * y1 - b2 * y2; + + // x2 = x1; + // x1 = x; + // y2 = y1; + // y1 = y; + + // return y; +} + #endif // Biquad_h diff --git a/platformio.ini b/platformio.ini index 03f42d8..8adc2e0 100644 --- a/platformio.ini +++ b/platformio.ini @@ -9,5 +9,5 @@ [env:squares-and-circles] apps_json = ./app/index.json -squares_and_circles_loader = 5e1e08e ; minimum loader version +squares_and_circles_loader = 18c0102 ; minimum loader version platform = .pio/ \ No newline at end of file