From d2bf696637376de549f1daeba9812e97c1a181fb Mon Sep 17 00:00:00 2001 From: Oleksiy H Date: Fri, 24 Oct 2025 18:16:15 +0300 Subject: [PATCH] FLMNG: moved settings into config.h, improved MIDI performance (there's still room for improvement) --- FLMNG/FLMNG.ino | 50 ++++++++++++++++++++----------------------------- FLMNG/config.h | 24 ++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 30 deletions(-) create mode 100644 FLMNG/config.h diff --git a/FLMNG/FLMNG.ino b/FLMNG/FLMNG.ino index c3d5760..54cf6bd 100644 --- a/FLMNG/FLMNG.ino +++ b/FLMNG/FLMNG.ino @@ -4,14 +4,16 @@ // Code is partly based on Knob_LightLevel_x2_FMSynth example from Mozzi Library // // Although the code designed to work on Sitka Instruments WS-1.0 synth, it should -// be pretty easy to adapt to run on other arduino/mozzi-based setups +// be pretty easy to adapt to run on other arduino/mozzi-based setups. +// Edit config.h to match your setup. // // This code is licenced under GPL v3 or later //ToDo: -//test how accurate and fast oversampling is -//smooth harmonics knob? -//rework LFO/Intensity so when LFO rate is 0, intensidy doesn't depend on its phase +//optimize MIDI input (maybe neohwserial and this parser might help https://github.com/eclab/grains/tree/main/midi) +//add ramp LFO +//add uneven rations (like 3:2, 3:5) +//rework LFO/Intensity so when LFO rate is 0, intensity doesn't depend on its phase #include #include @@ -25,31 +27,7 @@ #include #include #include - -//Settings -const int pitchSubSteps = 16; //set how many steps are there between semitones. set to 1 to quantize to semitones -const int driveAmount = 350; -const bool oversamplingEnabled = false; //makes V/OCT tracking more precise, but adds a little portamento -#define MIDI_CHANNEL 1 //MIDI_CHANNEL_OMNI -#define MOZZI_CONTROL_RATE 1024 - -//Hardware Definitions -#define Knob1 A6 //Intensity -#define Knob2 A4 //Modulator frequency ratio/Harmonics -#define Knob3 A2 //LFO Frequency -#define Knob4 A0 //LFO Shape -#define KnobA A5 //Attack -#define KnobDR A3 //Decay and Release -#define KnobS A1 //Sustain -#define CVIn A7 //CV input and Pitch knob -#define GateIn 10 -#define EnvSwitch 11 -#define DroneSwitch 12 -#define LED 5 - -#define MOZZI_ANALOG_READ_RESOLUTION 10 - -MIDI_CREATE_DEFAULT_INSTANCE(); +#include "config.h" IntMap kMapCarrierNote( 0, 4095, 24 * pitchSubSteps, 84 * pitchSubSteps ); IntMap kMapIntensity( 0, 1023, 10, 350 ); @@ -107,7 +85,15 @@ void setup(){ MIDI.setHandleNoteOn(MIDINoteOn); MIDI.setHandleNoteOff(MIDINoteOff); + + MIDI.setHandleClock(nullptr); + MIDI.setHandleStart(nullptr); + MIDI.setHandleStop(nullptr); + MIDI.setHandleContinue(nullptr); + MIDI.setHandleControlChange(nullptr); + MIDI.begin(MIDI_CHANNEL); + MIDI.turnThruOff(); startMozzi(); @@ -117,6 +103,11 @@ void setup(){ } void updateControl(){ + + for(int i=0; i<10; i++) { // Hacky way to drain the buffer faster + MIDI.read(); + } + //Get Control Values int CVInVal = mozziAnalogRead(CVIn); int knob1Val = mozziAnalogRead(Knob1); @@ -223,7 +214,6 @@ void updateControl(){ gain = 255; } - MIDI.read(); } AudioOutput updateAudio(){ diff --git a/FLMNG/config.h b/FLMNG/config.h new file mode 100644 index 0000000..68c2f9c --- /dev/null +++ b/FLMNG/config.h @@ -0,0 +1,24 @@ +//Settings +const int pitchSubSteps = 16; //set how many steps are there between semitones. set to 1 to quantize to semitones +const int driveAmount = 350; +const bool oversamplingEnabled = false; //makes V/OCT tracking more precise, but adds a little portamento +#define MIDI_CHANNEL 2 //MIDI_CHANNEL_OMNI +#define MOZZI_CONTROL_RATE 1024 + +//Hardware Definitions +#define Knob1 A6 //Intensity +#define Knob2 A4 //Modulator frequency ratio/Harmonics +#define Knob3 A2 //LFO Frequency +#define Knob4 A0 //LFO Shape +#define KnobA A5 //Attack +#define KnobDR A3 //Decay and Release +#define KnobS A1 //Sustain +#define CVIn A7 //CV input and Pitch knob +#define GateIn 10 +#define EnvSwitch 11 +#define DroneSwitch 12 +#define LED 5 + +#define MOZZI_ANALOG_READ_RESOLUTION 10 + +MIDI_CREATE_DEFAULT_INSTANCE(); \ No newline at end of file