diff --git a/CHANGELOG.txt b/CHANGELOG.txt
new file mode 100644
index 0000000..8b13ec8
--- /dev/null
+++ b/CHANGELOG.txt
@@ -0,0 +1,222 @@
+# CHANGELOG
+
+All notable changes to this project will be documented in this file.
+
+== 2025-0-05
+ * Bugfix
+ * Plaits drums - pitch parameter no effect
+ * IO-config - accent input was set eq trigger input
+== 2025-01-04
+ * Bugfix/Enhancements
+ * M-OSC/Waveforms:
+ - Transpose fix: -1 OCT
+ - Braids Renaissance Chords
+ - SEMI quantizer - global plaits chords
+ - Value paramter (chord offsets) #121
+ * M-OSC/Waveforms, M-OSC/Chords, SEQ/EuclidyArp
+ * Parameter texts, case insensitive chord-naming eg. m7->min7, M7 -> Maj7
+ * V_OCT Paramter (modulation visualition timer fix)
+ * Quantizer edge case optimization
+ * CV/V_OCT:
+ - shows internal value for debugging/quantizer monitoring
+== 2024-12-28
+ * Bugfix
+ * M-OSC/Waveforms: Braids Renaissance Chords - fixed root offset #117
+== 2024-12-23
+ * Bugifx
+ * Crash / parameter modulations wrap around #120
+== 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)
+ * Midi pitch was added before quantizer
+ * V_OCT parameter value was added before quantized
+ * All modulations exept RND and TM are now added after quantizer
+== 2024-12-16
+ * New paramters io-page
+ * Quantizer-Root
+ * Transpose-Finetune
+ * Bugfix/Enchancement
+ * tanspose offset was quantized
+== 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
+ * Enhancements:
+ * EnvFollower - mode Follower, Vactrol (based on MU Streams)
+== 2024-11-30
+ * Bugfix:
+ * Crash on patch saving/restoring (#97)
+ * Enhancements:
+ * M-OSC/Waveforms: Braids Renaissance Chords (#110)
+ * SEQ/TuringMachine - OutputModes: Note-3...Note-7 (#109)
+ * Internal signal routing: src: $1-$9 (#108)
+== 2024-11-07
+ * Bugfix:
+ * M-OSC/Waveforms - V_OCT modulation
+ * SEQ/EuclidArp - Screensaver circle offset
+ * Crash on patch saving/restoring (#97 ?!)
+ * New Engines:
+ * SEQ/TuringMachine
+== 2024-11-04
+ * Bugfix
+ * 808ish-BD Crash #103
+ * Enhancements:
+ * Crashreport fix (listing engine ids added)
+ * SEQ/EuclidArp
+ - fixed recalc pattern on slide > 1
+ - gate timing (using samples_per_step)
+ * New APIs
+ - clock::samples_per_step
+ - engine::setPatchStateEx
+ - engine::stepReset
+== 2024-11-02
+ * Enhancement:
+ * SEQ/EuclidArp
+ - fixed: note order (starting with root note)
+ - quantized output
+ - slide modes: OFF, ON, RND25, RND50, RND75
+ * Mod/TM
+ - reset #100
+ - shift_reg & seed - added to patch state
+ * GND/Scope
+ - x-scale added #73
+== 2024-10-29
+ * Enhancement:
+ * TR707 - dynamic level/pan params in io-page/mixer section #29
+ * Bugfix:
+ * setPixel missing (scope app not working)
+== 2024-10-28
+ * Enhancement:
+ * Mod/SEQ - 4-step sequencer modulation #91
+ * Multitrigs (TR707 etc) #29
+ * TR707 - midi mapping (GM Standard Drum Map) #29
+ * Mod/LFO - New paramter: Waveform #89
+ * CV/LFO - New paramter: Scale, Offset, Waveform #89
+ * IO-PAGE - Listing of modulation trig/cv inputs
+ * Bugfix:
+ * M-OSC/Waveforms - display correct waveform instead of "shape"
+ * out of memory handling / memory fragmentation - no new/delete usings in open303
+ * crash-reporting improvment
+ * Sporadic midi stops working while update with webflasher
+ * Modulation/LFO Shape ist not saved in the patch storage (is set to sine, after restore) #98
+ * New Engines:
+ * SEQ/EuclidRythm
+ * SEQ/EuclidArp
+ * DSM:
+ * One-Engine-Mode
+== 2025-07-02
+ * Bugfix: DSM0 "CRC32:0x63F R:1"
+== 2024-06-15
+ * Enhancement:
+ * T1 Clock - resets to begin after 200milis silence
+ * internal crc32 checks for debugging
+ * midi response optimization
+ * squares-and-circles api
+ * serial
+ * fs
+ * Bugfixes
+ * out of memory handling - prevent crashing
+== 2024-04-19
+ * Enhancement: Engine Load "Options" (Reset IO + Copy From) #74
+ * SD Format - preserves stored patches
+== 2024-04-14
+ * Enhancement: Patch storage (managment)
+ * Bugfix:
+ * tinyusb buffer/optimization
+== 2024-03-28
+ * Enhancement: Turing Machine Modulation
+ * Enhancement: FV1emu (cleanup + 16bit delay optimization)
+ * Bugfix: Crash on Midi-CC
+ * Refactoring MIDI-Settings / Clock-Settings
+ * Enhancement: Midi-Channel moved to IO-Settings
+ * ***New Analysis Engines: GND/Scope, GND/FFT
+ * OC_T41 Support
+== 2024-02-14
+ * Enhancement/Bugfix: No usb midi response while 5sec startup #66
+== 2024-02-12
+ * Enhancement/Bugfix: Unique midi device names (support multiple S&C devices for WebMidi #66)
+== 2024-02-07
+ * Enhancement/Bugfix: DXFM (custom syx handling)
+ * Enhancement: FV1emu / FX-Compiler (using 16bit delay buffer for less memory consumption)
+ * Enhancement: UI - one pixel left another up - bigger modulation popup
+== 2024-01-23
+ * Bugfix: Black screen ?!
+== 2024-01-20
+ * DevSync:
+ * Bugfix T4X: CV input > 6 V is received as negative voltage bug
+ * Bugfix: ClassicVAVCF -> param change Decay/Level
+ * Enhancement: Modualtion attenuverter resolution 1/2000
+ * Enhancement/Bugfix: Modulation ranges..
+ * Enhancement: NEw Modulation CV src aka "+" constant voltage
+ * Enhancement: Visualizing parameter modulations (moving knobs)
+ * Enhancement: squares-and-circles api
+ * Enhancement DSM: Support MID Button (ui navigaten - mid botton back function)
+== 2024-01-14
+ * DevSync: Fix DSM0 audio clipping
+== 2023-12-21
+ * DevSync: Fix DSM0 Callibration + Voltage engines
+== 2023-12-18
+ * DevSync: DSM0 ITCM usage + Bugfix DSM0 calibration
+ * Enhancements/BreakingChanges:
+ * Dynamic Loader (apps as header includes for now) - Noise, SAM, Faust engines ported
+== 2023-12-03 ==
+ * Bugfix: DxFM custom syx didnt work
+ * DevSync: DSM0 perf+wdt
+== 2023-11-19 ==
+ * Refactoring CV-Engines (based on modulations)
+ - CV-Output Scope-View
+ * New CV-Engines:
+ - EnvGen_AD
+ - EnvFollower
+ * Bugfix: CV-Engine (fine-tune after quantizer)
+ * Bugfix: #57
+ * Bugfix: plaits engines trigger_patched reset
+== 2023-11-04 ==
+ * Bugfix: CV/Voltage modulation
+== 2023-10-14 ==
+ * Bugfix: CV/LFO shape selection
+== 2023-10-07 ==
+ * Bugfix:
+ - crash in dac calibration
+== 2023-09-24 ==
+ * Enhancements:
+ - I/O-Page: UI enhancements
+ - Speech/SAM "random numbers"
+ - Speech/LPC "AuxMix" Parameter
+ * Bugfix:
+ - Speech/LPC word selection
+ - VOCT semitone = encoder step (skipped increments)
+== 2023-09-17 ==
+ * mi-libs sync/upgrade
+ * new Synth-Engine:
+ - ClassicVAVCF (Classic waveshapes with filter)
+ - DxFM_BNK1-3 (using the SixOpEngine default patches)
+ * Several engines, parameter naming, ranges and defaults optimizations ...
+ * Optimised behaviour on encoders increments
+ - Value change is 1/128 per step if the increments don't immediately follow each other
+ - Short-time display of the value (0-127)
+ * Bugfix:
+ - GND engine - crash on encoder rotation
+== 2023-09-03 ==
+ * Enhancements, new engines:
+ * Claps refactoring, drumsynth based on RC808 models
+ * DxFM enhancement, 2 voice stereo mode
+ * Waveforms, 2 voice stereo mode
+ * JU60_chorus, emulation of Juno60 chorus, based on VA BBD
+ * Noise engines: NES_noise, 808_squares
+ * Bugfixes
+ * #52 Modulations & quantizer
+ * #51 Engine loading - IO config is lost / restored to defaults
+== 2023-08-09 ==
+ * Audio routing refactoring
+ * Optimizations and bugfixes
\ No newline at end of file
diff --git a/README.md b/README.md
index ac92417..de9ceb5 100644
--- a/README.md
+++ b/README.md
@@ -5,226 +5,7 @@
**squares-and-circles** is an alternate firmware for the Eurorack module O_C, targeting Teensy 4.0.
-
- ChangeLog
-
-````
-== 2025-01-04
- * Bugfix/Enhancements
- * M-OSC/Waveforms:
- - Transpose fix: -1 OCT
- - Braids Renaissance Chords
- - SEMI quantizer - global plaits chords
- - Value paramter (chord offsets) #121
- * M-OSC/Waveforms, M-OSC/Chords, SEQ/EuclidyArp
- * Parameter texts, case insensitive chord-naming eg. m7->min7, M7 -> Maj7
- * V_OCT Paramter (modulation visualition timer fix)
- * Quantizer edge case optimization
- * CV/V_OCT:
- - shows internal value for debugging/quantizer monitoring
-== 2024-12-28
- * Bugfix
- * M-OSC/Waveforms: Braids Renaissance Chords - fixed root offset #117
-== 2024-12-23
- * Bugifx
- * Crash / parameter modulations wrap around #120
-== 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)
- * Midi pitch was added before quantizer
- * V_OCT parameter value was added before quantized
- * All modulations exept RND and TM are now added after quantizer
-== 2024-12-16
- * New paramters io-page
- * Quantizer-Root
- * Transpose-Finetune
- * Bugfix/Enchancement
- * tanspose offset was quantized
-== 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
- * Enhancements:
- * EnvFollower - mode Follower, Vactrol (based on MU Streams)
-== 2024-11-30
- * Bugfix:
- * Crash on patch saving/restoring (#97)
- * Enhancements:
- * M-OSC/Waveforms: Braids Renaissance Chords (#110)
- * SEQ/TuringMachine - OutputModes: Note-3...Note-7 (#109)
- * Internal signal routing: src: $1-$9 (#108)
-== 2024-11-07
- * Bugfix:
- * M-OSC/Waveforms - V_OCT modulation
- * SEQ/EuclidArp - Screensaver circle offset
- * Crash on patch saving/restoring (#97 ?!)
- * New Engines:
- * SEQ/TuringMachine
-== 2024-11-04
- * Bugfix
- * 808ish-BD Crash #103
- * Enhancements:
- * Crashreport fix (listing engine ids added)
- * SEQ/EuclidArp
- - fixed recalc pattern on slide > 1
- - gate timing (using samples_per_step)
- * New APIs
- - clock::samples_per_step
- - engine::setPatchStateEx
- - engine::stepReset
-== 2024-11-02
- * Enhancement:
- * SEQ/EuclidArp
- - fixed: note order (starting with root note)
- - quantized output
- - slide modes: OFF, ON, RND25, RND50, RND75
- * Mod/TM
- - reset #100
- - shift_reg & seed - added to patch state
- * GND/Scope
- - x-scale added #73
-== 2024-10-29
- * Enhancement:
- * TR707 - dynamic level/pan params in io-page/mixer section #29
- * Bugfix:
- * setPixel missing (scope app not working)
-== 2024-10-28
- * Enhancement:
- * Mod/SEQ - 4-step sequencer modulation #91
- * Multitrigs (TR707 etc) #29
- * TR707 - midi mapping (GM Standard Drum Map) #29
- * Mod/LFO - New paramter: Waveform #89
- * CV/LFO - New paramter: Scale, Offset, Waveform #89
- * IO-PAGE - Listing of modulation trig/cv inputs
- * Bugfix:
- * M-OSC/Waveforms - display correct waveform instead of "shape"
- * out of memory handling / memory fragmentation - no new/delete usings in open303
- * crash-reporting improvment
- * Sporadic midi stops working while update with webflasher
- * Modulation/LFO Shape ist not saved in the patch storage (is set to sine, after restore) #98
- * New Engines:
- * SEQ/EuclidRythm
- * SEQ/EuclidArp
- * DSM:
- * One-Engine-Mode
-== 2025-07-02
- * Bugfix: DSM0 "CRC32:0x63F R:1"
-== 2024-06-15
- * Enhancement:
- * T1 Clock - resets to begin after 200milis silence
- * internal crc32 checks for debugging
- * midi response optimization
- * squares-and-circles api
- * serial
- * fs
- * Bugfixes
- * out of memory handling - prevent crashing
-== 2024-04-19
- * Enhancement: Engine Load "Options" (Reset IO + Copy From) #74
- * SD Format - preserves stored patches
-== 2024-04-14
- * Enhancement: Patch storage (managment)
- * Bugfix:
- * tinyusb buffer/optimization
-== 2024-03-28
- * Enhancement: Turing Machine Modulation
- * Enhancement: FV1emu (cleanup + 16bit delay optimization)
- * Bugfix: Crash on Midi-CC
- * Refactoring MIDI-Settings / Clock-Settings
- * Enhancement: Midi-Channel moved to IO-Settings
- * ***New Analysis Engines: GND/Scope, GND/FFT
- * OC_T41 Support
-== 2024-02-14
- * Enhancement/Bugfix: No usb midi response while 5sec startup #66
-== 2024-02-12
- * Enhancement/Bugfix: Unique midi device names (support multiple S&C devices for WebMidi #66)
-== 2024-02-07
- * Enhancement/Bugfix: DXFM (custom syx handling)
- * Enhancement: FV1emu / FX-Compiler (using 16bit delay buffer for less memory consumption)
- * Enhancement: UI - one pixel left another up - bigger modulation popup
-== 2024-01-23
- * Bugfix: Black screen ?!
-== 2024-01-20
- * DevSync:
- * Bugfix T4X: CV input > 6 V is received as negative voltage bug
- * Bugfix: ClassicVAVCF -> param change Decay/Level
- * Enhancement: Modualtion attenuverter resolution 1/2000
- * Enhancement/Bugfix: Modulation ranges..
- * Enhancement: NEw Modulation CV src aka "+" constant voltage
- * Enhancement: Visualizing parameter modulations (moving knobs)
- * Enhancement: squares-and-circles api
- * Enhancement DSM: Support MID Button (ui navigaten - mid botton back function)
-== 2024-01-14
- * DevSync: Fix DSM0 audio clipping
-== 2023-12-21
- * DevSync: Fix DSM0 Callibration + Voltage engines
-== 2023-12-18
- * DevSync: DSM0 ITCM usage + Bugfix DSM0 calibration
- * Enhancements/BreakingChanges:
- * Dynamic Loader (apps as header includes for now) - Noise, SAM, Faust engines ported
-== 2023-12-03 ==
- * Bugfix: DxFM custom syx didnt work
- * DevSync: DSM0 perf+wdt
-== 2023-11-19 ==
- * Refactoring CV-Engines (based on modulations)
- - CV-Output Scope-View
- * New CV-Engines:
- - EnvGen_AD
- - EnvFollower
- * Bugfix: CV-Engine (fine-tune after quantizer)
- * Bugfix: #57
- * Bugfix: plaits engines trigger_patched reset
-== 2023-11-04 ==
- * Bugfix: CV/Voltage modulation
-== 2023-10-14 ==
- * Bugfix: CV/LFO shape selection
-== 2023-10-07 ==
- * Bugfix:
- - crash in dac calibration
-== 2023-09-24 ==
- * Enhancements:
- - I/O-Page: UI enhancements
- - Speech/SAM "random numbers"
- - Speech/LPC "AuxMix" Parameter
- * Bugfix:
- - Speech/LPC word selection
- - VOCT semitone = encoder step (skipped increments)
-== 2023-09-17 ==
- * mi-libs sync/upgrade
- * new Synth-Engine:
- - ClassicVAVCF (Classic waveshapes with filter)
- - DxFM_BNK1-3 (using the SixOpEngine default patches)
- * Several engines, parameter naming, ranges and defaults optimizations ...
- * Optimised behaviour on encoders increments
- - Value change is 1/128 per step if the increments don't immediately follow each other
- - Short-time display of the value (0-127)
- * Bugfix:
- - GND engine - crash on encoder rotation
-== 2023-09-03 ==
- * Enhancements, new engines:
- * Claps refactoring, drumsynth based on RC808 models
- * DxFM enhancement, 2 voice stereo mode
- * Waveforms, 2 voice stereo mode
- * JU60_chorus, emulation of Juno60 chorus, based on VA BBD
- * Noise engines: NES_noise, 808_squares
- * Bugfixes
- * #52 Modulations & quantizer
- * #51 Engine loading - IO config is lost / restored to defaults
-== 2023-08-09 ==
- * Audio routing refactoring
- * Optimizations and bugfixes
-````
-
+> CHANGELOG.txt
## ■ Demos
diff --git a/app/SYNTH/plaits.bin b/app/SYNTH/plaits.bin
index 2677267..161fae9 100644
Binary files a/app/SYNTH/plaits.bin and b/app/SYNTH/plaits.bin differ
diff --git a/app/SYNTH/plaits.cpp b/app/SYNTH/plaits.cpp
index c7c72a1..372cb84 100644
--- a/app/SYNTH/plaits.cpp
+++ b/app/SYNTH/plaits.cpp
@@ -55,6 +55,7 @@ float bufferOut[FRAME_BUFFER_SIZE];
float bufferAux[FRAME_BUFFER_SIZE];
float out_aux_mix = 0.5f;
float _pitch = 0;
+float _v_oct = 0;
float _base_pitch = DEFAULT_NOTE;
struct
@@ -168,7 +169,7 @@ void engine::setup()
case 0:
alloc_engine();
init_params(0.5f, 0.5f, 0.5f, {0.8f, 0.8f, false});
- engine::addParam(V_OCT, &_pitch);
+ engine::addParam(V_OCT, &_v_oct);
engine::addParam("Detune", &harmonics);
engine::addParam("Square", &timbre);
engine::addParam("CSAW", &morph);
@@ -181,7 +182,7 @@ void engine::setup()
case 1:
alloc_engine();
init_params(0.8f, 0.8f, 0.75f, {0.7f, 0.6f, false});
- engine::addParam(V_OCT, &_pitch);
+ engine::addParam(V_OCT, &_v_oct);
engine::addParam("Waveform", &harmonics);
engine::addParam("Fold", &timbre);
engine::addParam("Asym", &morph);
@@ -194,7 +195,7 @@ void engine::setup()
case 2:
alloc_engine();
init_params(0.8f, 0.8f, 0.75f, {0.6f, 0.6f, false});
- engine::addParam(V_OCT, &_pitch);
+ engine::addParam(V_OCT, &_v_oct);
engine::addParam("Ratio", &harmonics);
engine::addParam("Mod", &timbre);
engine::addParam("Feedb.", &morph);
@@ -207,7 +208,7 @@ void engine::setup()
case 3:
alloc_engine();
init_params(0.8f, 0.8f, 0.75f, {0.7f, 0.6f, false});
- engine::addParam(V_OCT, &_pitch);
+ engine::addParam(V_OCT, &_v_oct);
engine::addParam("Ratio", &harmonics);
engine::addParam("Frm/Fq.", &timbre);
engine::addParam("Width", &morph);
@@ -217,7 +218,7 @@ void engine::setup()
case 4:
alloc_engine();
init_params(0.8f, 0.8f, 0.75f, {0.8f, 0.8f, false});
- engine::addParam(V_OCT, &_pitch);
+ engine::addParam(V_OCT, &_v_oct);
engine::addParam("Bump", &harmonics);
engine::addParam("Peak", &timbre);
engine::addParam("Shape", &morph);
@@ -230,7 +231,7 @@ void engine::setup()
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(V_OCT, &_v_oct);
engine::addParam("Bank", &harmonics, 0.f, 0.5f);
engine::addParam("Row", &timbre);
engine::addParam("Column", &morph);
@@ -245,7 +246,7 @@ void engine::setup()
{
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);
+ engine::addParam(V_OCT, &_v_oct);
int32_t *pchord = (int32_t *)&static_cast(_plaitsEngine)->chords_.chord_index_quantizer_.quantized_value_;
*pchord = 8;
@@ -309,7 +310,7 @@ void engine::setup()
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(V_OCT, &_v_oct);
engine::addParam("Morph", &morph);
engine::addParam("Cutoff", &timbre);
engine::addParam("Harsh", &harmonics);
@@ -320,7 +321,7 @@ void engine::setup()
patch.decay = 0.5f;
engine::addParam("Decay", &patch.decay, 0.f, 0.99f);
break;
-#if 0 //TODO....
+#if 0 // TODO....
case 17:
alloc_engine(plaits::kMaxBlockSize * 4);
_plaitsEngine->post_processing_settings = {0.7f, 0.7f, false};
@@ -378,7 +379,7 @@ void engine::process()
modulations.level_patched = false;
modulations.level = 1.f;
- patch.note = _base_pitch + engine::cv() * 12;
+ patch.note = _base_pitch + (_pitch + engine::cv()) * 12;
float last_decay = patch.decay;
float last_morph = patch.morph;
diff --git a/platformio.ini b/platformio.ini
index b807861..6b71a42 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -9,5 +9,5 @@
[env:squares-and-circles]
apps_json = ./app/index.json
-squares_and_circles_loader = f77f830 ; minimum loader version
+squares_and_circles_loader = 1b0b8eb ; minimum loader version
platform = .pio/
\ No newline at end of file