From 96cd070bc642e576d67242f7216d0a34379eb2b8 Mon Sep 17 00:00:00 2001 From: chriskiefer Date: Mon, 3 Nov 2025 17:36:26 +0000 Subject: [PATCH] voice updates --- ...aut-PAF-CARL.ino => MEMLNaut-PAF-NISPS.ino | 11 +- PAFSynthAudioApp.hpp | 106 +++++++++++++++--- src/memllib | 2 +- src/memlp | 2 +- 4 files changed, 97 insertions(+), 24 deletions(-) rename MEMLNaut-PAF-CARL.ino => MEMLNaut-PAF-NISPS.ino (97%) diff --git a/MEMLNaut-PAF-CARL.ino b/MEMLNaut-PAF-NISPS.ino similarity index 97% rename from MEMLNaut-PAF-CARL.ino rename to MEMLNaut-PAF-NISPS.ino index e44dfed..49ded7e 100644 --- a/MEMLNaut-PAF-CARL.ino +++ b/MEMLNaut-PAF-NISPS.ino @@ -163,14 +163,15 @@ void setup() { MEMLNaut::Instance()->disp->AddView(noteTrigView); std::shared_ptr helpView = std::make_shared("Help"); - helpView->post("PAF synth CARL"); + helpView->post("PAF synth NISPS"); helpView->post("TA: Down: Forget replay memory"); - helpView->post("MA: Up: Randomise actor"); - helpView->post("MA: Down: Randomise critic"); + helpView->post("MA: Up: Randomise "); + helpView->post("MA: Down: Jolt"); helpView->post("MB: Up: Positive reward"); helpView->post("MB: Down: Negative reward"); - helpView->post("Y: Optimisation rate"); - helpView->post("Z: OU noise"); + helpView->post("X: Learning rate"); + helpView->post("Y: Reward Scale"); + helpView->post("Z: Exploration noise"); helpView->post("Joystick: Explore"); MEMLNaut::Instance()->disp->AddView(helpView); diff --git a/PAFSynthAudioApp.hpp b/PAFSynthAudioApp.hpp index fed745e..6ff8c64 100644 --- a/PAFSynthAudioApp.hpp +++ b/PAFSynthAudioApp.hpp @@ -34,12 +34,12 @@ public: VoiceSpaceFn mappingFunction = nullptr; }; - std::array voiceSpaces; + std::array voiceSpaces; VoiceSpaceFn currentVoiceSpace; PAFSynthAudioApp() : AudioAppBase() { -#if 0 +#if 1 auto voiceSpace1 = [this](const std::array& params) { p0Gain=1.f; p1Gain=1.f; @@ -200,11 +200,6 @@ public: fbSmoothAlpha=0.5f; }; - voiceSpaces[0] = {"default", voiceSpace1}; - voiceSpaces[1] = {"bright", voiceSpace2}; - voiceSpaces[2] = {"perc", voiceSpacePerc}; - - currentVoiceSpace = voiceSpaces[2].mappingFunction; #endif auto voiceSpaceSingle1 = [this](const std::array& params) { p0Gain=1.f; @@ -212,12 +207,12 @@ public: p2Gain=0.f; p3Gain=0.f; - detune1 = 1.0f; - detune2 = 1.1f; - detune3 = 1.2f; + // detune1 = 1.0f; + // detune2 = 1.1f; + // detune3 = 1.2f; - paf0_cf = (params[0] * 2.f); - paf0_bw = 10.f + (params[0] * 400.f); + paf0_cf = (params[0] * 2.0f); + paf0_bw = 10.f + (params[0] * 500.f); // paf1_bw = 10.f + (params[6] * 50.f); // paf2_bw = 10.f + (params[7] * 50.f); // paf3_bw = 10.f + (params[22] * 100.f); @@ -232,7 +227,7 @@ public: // paf2_vfr = (params[13] * params[13] * 15.f); // paf3_vfr = (params[24] * params[24] * 15.f); - paf0_shift = -500.f + (params[0] * 500.f); + paf0_shift = -20.f + (params[0] * 40.f); // paf1_shift = -300.f + (params[15] * 300.f); // paf2_shift = -300.f + (params[16] * 300.f); // paf3_shift = -300.f + (params[25] * 300.f); @@ -242,7 +237,7 @@ public: // euclidN = static_cast(2 + (params[19] * 5)); dlfb = 0.f; - env.setup(params[1] * 20.f , params[2] * 200.f, params[3] * 0.4f, params[4] * 300.f, sampleRatef ); + env.setup(1.f+(params[1] * 20.f) , 1.f + (params[2] * 200.f), params[3] * 0.4f, 10.f + (params[4] * 300.f), sampleRatef ); sineShapeGain = params[5] * params[5] * 0.2f; sineShapeASym = 0.f; @@ -255,9 +250,82 @@ public: fbSmoothAlpha=0.f; }; - voiceSpaces[0] = {"test", voiceSpaceSingle1}; + auto voiceSpaceQuadDetune = [this](const std::array& params) { + p0Gain=1.f; + p1Gain=1.f; + p2Gain=1.f; + p3Gain=0.8f; - currentVoiceSpace = voiceSpaces[0].mappingFunction; + + const float factor = 1.f + (params[17] * 0.2f); + detune1 = 1.f * factor; + detune2 = detune1 * factor; + detune3 = detune2 * factor; + + paf0_cf = (params[0] * 1.0f); + paf1_cf = (params[0] * 2.0f); + paf2_cf = (params[1] * 3.0f); + paf3_cf = (params[1] * 5.0f); + + paf0_bw = 10.f + (params[2] * 500.f); + paf1_bw = 10.f + (params[3] * 500.f); + paf2_bw = 10.f + (params[4] * 500.f); + paf3_bw = 10.f + (params[5] * 2000.f); + + paf0_vib = (params[18] * params[18] * 0.05f); + paf1_vib = paf0_vib; + paf2_vib = 0.f; + paf3_vib = 0.f; + // paf1_vib = (params[9] * params[9] * 0.01f); + // paf2_vib = (params[10] * params[10] * 0.01); + // paf3_vib = (params[23] * params[23] * 0.01f); + + paf0_vfr = (params[19] * params[19] * 15.f); + paf1_vfr = paf0_vfr; + paf2_vfr = 0.f; + paf3_vfr = 0.f; + // paf1_vfr = (params[12] * params[12] * 15.f); + // paf2_vfr = (params[13] * params[13] * 15.f); + // paf3_vfr = (params[24] * params[24] * 15.f); + + paf0_shift=0.f; + paf1_shift=0.f; + paf2_shift=0.f; + // paf3_shift=0.f; + + // paf0_shift = -20.f + (params[6] * 40.f); + // paf1_shift = -20.f + (params[7] * 40.f); + // paf2_shift = -20.f + (params[8] * 40.f); + paf3_shift = -40.f + (params[9] * 80.f); + // paf1_shift = -300.f + (params[15] * 300.f); + // paf2_shift = -300.f + (params[16] * 300.f); + // paf3_shift = -300.f + (params[25] * 300.f); + + dl1mix = 0.f; + + // euclidN = static_cast(2 + (params[19] * 5)); + dlfb = 0.f; + + env.setup(1.f+(params[10] * 20.f) , 1.f + (params[11] * 200.f), params[12] * 0.4f, 10.f + (params[13] * 300.f), sampleRatef ); + + sineShapeGain = params[14] * params[14] * 0.2f; + sineShapeASym = params[15] * 0.05f; + sineShapeMix = params[16] * 0.3f; + + rmGain = 0.f; + feedbackGain = 0.0f; + + delayMax=1000; + fbSmoothAlpha=0.f; + }; + + voiceSpaces[0] = {"default", voiceSpace1}; + voiceSpaces[1] = {"bright", voiceSpace2}; + voiceSpaces[2] = {"perc", voiceSpacePerc}; + voiceSpaces[3] = {"Single", voiceSpaceSingle1}; + voiceSpaces[4] = {"Quad", voiceSpaceQuadDetune}; + + currentVoiceSpace = voiceSpaces[4].mappingFunction; }; @@ -393,6 +461,7 @@ public: return 440.0f * exp2f((note - 69) / 12.0f); } + size_t currNote=0; void loop() override { uint8_t midimsg[2]; if (firstParamsReceived && queue_try_remove(&qMIDINoteOn, &midimsg)) { @@ -403,10 +472,13 @@ public: noteVel = noteVel * noteVel; // Square the velocity for more pronounced effect newNote = true; env.trigger(noteVel); + currNote = midimsg[0]; } if (firstParamsReceived && queue_try_remove(&qMIDINoteOff, &midimsg)) { // Serial.printf("PAFSynthAudioApp::ProcessParams - Received MIDI Note On: %d, Velocity: %d\n", midimsg[0], midimsg[1]); - env.release(); + if (currNote == midimsg[0]) { + env.release(); + } } AudioAppBase::loop(); } diff --git a/src/memllib b/src/memllib index 9d36f7c..fdce0a0 160000 --- a/src/memllib +++ b/src/memllib @@ -1 +1 @@ -Subproject commit 9d36f7ce8f6b4704c7be3ba7e7abc1e397587b0f +Subproject commit fdce0a0335a2d29dd3089784450d44318a9ed989 diff --git a/src/memlp b/src/memlp index c4a4384..dad7485 160000 --- a/src/memlp +++ b/src/memlp @@ -1 +1 @@ -Subproject commit c4a43845eac20d4c031c8d92060fdff1b8afa060 +Subproject commit dad7485a1c1b690e806ec917f7c75061baa4ad2b