From 666cb86c0baf90c57a0c8307e4971a850ea40d5c Mon Sep 17 00:00:00 2001 From: heck Date: Sat, 14 Sep 2024 16:57:34 +0200 Subject: [PATCH 1/5] feature: hold clear and wiggle pot clears automation for only that pot --- src/globals.hh | 5 +++ src/main_perkons.cc | 104 ++++++++++++++++++++++++-------------------- 2 files changed, 63 insertions(+), 46 deletions(-) diff --git a/src/globals.hh b/src/globals.hh index a77e91c..2a3e65b 100644 --- a/src/globals.hh +++ b/src/globals.hh @@ -41,6 +41,11 @@ namespace Heck { } } // namespace Constants + namespace State { + bool record_mode{false}; + bool clear_mode{false}; + } + // Types using u8 = uint8_t; using u16 = uint16_t; diff --git a/src/main_perkons.cc b/src/main_perkons.cc index 8fbc5ed..d52781b 100644 --- a/src/main_perkons.cc +++ b/src/main_perkons.cc @@ -150,7 +150,7 @@ namespace Heck { } } - void tracks_midi_in(ld::MidiEvent msg) + void midi_in_from_uart_polling(ld::MidiEvent msg) { switch (msg.type) { case ld::MidiMessageType::NoteOn: { @@ -159,44 +159,49 @@ namespace Heck { } } break; case ld::MidiMessageType::ControlChange: { - sequencer.midi_in(msg); - ld::ControlChangeEvent cc = msg.AsControlChange(); - float val_normalized = cc.value / 127.; - switch (cc.control_number) { - // Pots - case Constants::MIDI_Mapping::TRACK_PITCH: - tracks[cc.channel].instrument->ctl(0, val_normalized); - break; - case Constants::MIDI_Mapping::TRACK_DECAY: - tracks[cc.channel].decay(val_normalized); - break; - case Constants::MIDI_Mapping::TRACK_PARAM1: - tracks[cc.channel].instrument->ctl(2, val_normalized); - break; - case Constants::MIDI_Mapping::TRACK_PARAM2: - tracks[cc.channel].instrument->ctl(3, val_normalized); - break; - case Constants::MIDI_Mapping::TRACK_FILTER: - tracks[cc.channel].filter(val_normalized); - break; - case Constants::MIDI_Mapping::TRACK_DRIVE: - tracks[cc.channel].drive(val_normalized); - break; - case Constants::MIDI_Mapping::TRACK_VOLUME: - tracks[cc.channel].volume(val_normalized); - break; - // Switches - case Constants::MIDI_Mapping::TRACK_MODE1: - tracks[cc.channel].instrument->switch_mode1(int(val_normalized * 2.)); - break; - case Constants::MIDI_Mapping::TRACK_MODE2: - tracks[cc.channel].instrument->switch_mode2(int(val_normalized * 2.)); - break; - case Constants::MIDI_Mapping::TRACK_FILTERMODE: - tracks[cc.channel].filtermode(val_normalized); - break; - default: - break; + if (State::clear_mode) { + ld::ControlChangeEvent cc = msg.AsControlChange(); + sequencer.clear_track_cc(cc.channel, cc.control_number); + } else { + sequencer.midi_in(msg); + ld::ControlChangeEvent cc = msg.AsControlChange(); + float val_normalized = cc.value / 127.; + switch (cc.control_number) { + // Pots + case Constants::MIDI_Mapping::TRACK_PITCH: + tracks[cc.channel].instrument->ctl(0, val_normalized); + break; + case Constants::MIDI_Mapping::TRACK_DECAY: + tracks[cc.channel].decay(val_normalized); + break; + case Constants::MIDI_Mapping::TRACK_PARAM1: + tracks[cc.channel].instrument->ctl(2, val_normalized); + break; + case Constants::MIDI_Mapping::TRACK_PARAM2: + tracks[cc.channel].instrument->ctl(3, val_normalized); + break; + case Constants::MIDI_Mapping::TRACK_FILTER: + tracks[cc.channel].filter(val_normalized); + break; + case Constants::MIDI_Mapping::TRACK_DRIVE: + tracks[cc.channel].drive(val_normalized); + break; + case Constants::MIDI_Mapping::TRACK_VOLUME: + tracks[cc.channel].volume(val_normalized); + break; + // Switches + case Constants::MIDI_Mapping::TRACK_MODE1: + tracks[cc.channel].instrument->switch_mode1(int(val_normalized * 2.)); + break; + case Constants::MIDI_Mapping::TRACK_MODE2: + tracks[cc.channel].instrument->switch_mode2(int(val_normalized * 2.)); + break; + case Constants::MIDI_Mapping::TRACK_FILTERMODE: + tracks[cc.channel].filtermode(val_normalized); + break; + default: + break; + } } } break; default: { @@ -205,20 +210,20 @@ namespace Heck { } } - void midi_async_handler() + void midi_in_from_uart_interrupt() { while (midi.HasEvents()) { ld::MidiEvent msg = midi.PopEvent(); event_log.PushBack(msg); - tracks_midi_in(msg); + midi_in_from_uart_polling(msg); } } - void sequencer_midi_handler() + void midi_in_from_sequencer() { std::vector queue = sequencer.midi_out(); for (ld::MidiEvent msg : queue) { - tracks_midi_in(msg); + midi_in_from_uart_polling(msg); } } @@ -276,8 +281,8 @@ namespace Heck { sequencer.next_step(); } - sequencer_midi_handler(); - midi_async_handler(); + midi_in_from_sequencer(); + midi_in_from_uart_interrupt(); // REC but_rec.Debounce(); @@ -286,8 +291,10 @@ namespace Heck { but_record_current = but_record_new; if (but_record_current) { hw.PrintLine("BUTTON RECORD ON"); + State::record_mode = true; } else { hw.PrintLine("BUTTON RECORD OFF"); + State::record_mode = false; } sequencer.recording = but_record_current; } @@ -299,12 +306,17 @@ namespace Heck { but_clear_current = but_clear_new; if (but_clear_current) { hw.PrintLine("BUTTON CLEAR ON"); + State::clear_mode = true; } else { hw.PrintLine("BUTTON CLEAR OFF"); - sequencer.clear_sequence(); + State::clear_mode = false; } } + if (State::record_mode && State::clear_mode) { + sequencer.clear_sequence(); + } + if (systick_now - midi_log_systick_last > 5) { midi_log_systick_last = systick_now; if (!event_log.IsEmpty()) { From c3b525370209529c5e6a5257374222378cd5b5ef Mon Sep 17 00:00:00 2001 From: heck Date: Mon, 16 Sep 2024 15:11:50 +0200 Subject: [PATCH 2/5] track - sound tuning --- src/track.hh | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/track.hh b/src/track.hh index 720001d..2479743 100644 --- a/src/track.hh +++ b/src/track.hh @@ -3,7 +3,8 @@ #include "daisysp.h" #include "instr_abstract.hh" - +#include "utils.hh" +#include "globals.hh" namespace dsp = daisysp; namespace Heck { @@ -20,7 +21,7 @@ namespace Heck { decay_.SetTime(dsp::ADENV_SEG_DECAY, 0.1); decay_.SetMax(1); decay_.SetMin(0); - decay_.SetCurve(-18); + decay_.SetCurve(-50); // Vol ctl_volume_ = 0.; @@ -28,11 +29,12 @@ namespace Heck { // Filter ladder_.Init(Constants::SAMPLERATE); ladder_.SetFilterMode(daisysp::LadderFilter::FilterMode::LP24); - ladder_.SetRes(0.7); + ladder_.SetRes(0.4); ladder_.SetInputDrive(1.3); // Drive od_.Init(); + od_.SetDrive(0.425); } float nextsample() @@ -54,7 +56,7 @@ namespace Heck { void decay(float val) { - decay_.SetTime(dsp::ADENV_SEG_DECAY, 0.01 + val * 8.); + decay_.SetTime(dsp::ADENV_SEG_DECAY, 0.01 + val * 12.); } void volume(float vol) @@ -70,7 +72,7 @@ namespace Heck { void drive(float amt) { - od_.SetDrive(0.35 + amt * 0.15); + od_.SetDrive(scalen_min_max(amt, 0.35, 0.5)); } // range: 0-1 @@ -80,14 +82,17 @@ namespace Heck { // MID if (ctl_filtermode_ < 0.33) { + hw.PrintLine("Track: Filter BP"); ladder_.SetFilterMode(daisysp::LadderFilter::FilterMode::BP24); } // HIGH if (ctl_filtermode_ >= 0.33 && ctl_filtermode_ < 0.66) { + hw.PrintLine("Track: Filter HP"); ladder_.SetFilterMode(daisysp::LadderFilter::FilterMode::HP24); } // LOW if (ctl_filtermode_ >= 0.66) { + hw.PrintLine("Track: Filter LP"); ladder_.SetFilterMode(daisysp::LadderFilter::FilterMode::LP24); } } From 38eb31c0c3dfeadd464f8c4d011148b1a9fac9a6 Mon Sep 17 00:00:00 2001 From: heck Date: Mon, 16 Sep 2024 15:14:13 +0200 Subject: [PATCH 3/5] move global state into main_perkons.cc for now. --- src/globals.hh | 5 ----- src/main_perkons.cc | 5 +++++ 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/globals.hh b/src/globals.hh index 2a3e65b..a77e91c 100644 --- a/src/globals.hh +++ b/src/globals.hh @@ -41,11 +41,6 @@ namespace Heck { } } // namespace Constants - namespace State { - bool record_mode{false}; - bool clear_mode{false}; - } - // Types using u8 = uint8_t; using u16 = uint16_t; diff --git a/src/main_perkons.cc b/src/main_perkons.cc index d52781b..34c0c9b 100644 --- a/src/main_perkons.cc +++ b/src/main_perkons.cc @@ -19,6 +19,11 @@ namespace ld = daisy; namespace dsp = daisysp; namespace Heck { + namespace State { + bool record_mode{ false }; + bool clear_mode{ false }; + } // namespace State + // ============================================================================================= // INIT // ============================================================================================= From 9fe71abf059bc8bd467626496963df747f9511df Mon Sep 17 00:00:00 2001 From: heck Date: Mon, 16 Sep 2024 15:15:03 +0200 Subject: [PATCH 4/5] instr_zosc.cc - sound tuning --- src/instr_zosc.cc | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/instr_zosc.cc b/src/instr_zosc.cc index 4704195..d1a0850 100644 --- a/src/instr_zosc.cc +++ b/src/instr_zosc.cc @@ -13,14 +13,12 @@ namespace Heck { void ZOsc::init() { zosc.Init(samplerate); - zosc.SetFreq(80.f); - zosc.SetShape(1.f); + zosc.SetFreq(40.f); + zosc.SetShape(1.); + zosc.SetFormantFreq(200); } - void ZOsc::trigger() - { - - } + void ZOsc::trigger() {} void ZOsc::ctl(unsigned int ctl_nr, float val) { @@ -29,13 +27,13 @@ namespace Heck { zosc.SetFreq(scalen_min_max(val, 40, 180)); } break; case 1: { -// zosc.SetDecay(scalen_min_max(val,0,1)); + // zosc.SetDecay(scalen_min_max(val,0,1)); } break; case 2: { - zosc.SetFormantFreq(scalen_min_max(val,200,800)); + zosc.SetFormantFreq(scalen_min_max(val, 200, 800)); } break; case 3: { - zosc.SetShape(scalen_min_max(val,0,1)); + zosc.SetShape(1. - scalen_min_max(val, 0, 1)); } break; } } @@ -43,7 +41,7 @@ namespace Heck { void ZOsc::switch_mode1(unsigned int pos) { mode1 = pos; - zosc.SetMode(((float)pos)/3.); + zosc.SetMode(((float)pos) / 3.); hw.PrintLine(""); } From a6f6c0c231778e891ffb3603cbaa41739a622c0c Mon Sep 17 00:00:00 2001 From: heck Date: Mon, 16 Sep 2024 15:17:58 +0200 Subject: [PATCH 5/5] UI: Clear + Record -> clears whole sequence Clear + pot wiggle -> clear that pot automation only Hold Record: Record motion sequencing --- src/main_perkons.cc | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main_perkons.cc b/src/main_perkons.cc index 34c0c9b..cbcc69f 100644 --- a/src/main_perkons.cc +++ b/src/main_perkons.cc @@ -164,12 +164,13 @@ namespace Heck { } } break; case ld::MidiMessageType::ControlChange: { + ld::ControlChangeEvent cc = msg.AsControlChange(); if (State::clear_mode) { ld::ControlChangeEvent cc = msg.AsControlChange(); + hw.PrintLine("Clear: ch: %i, cc: %i",cc.channel,cc.control_number); sequencer.clear_track_cc(cc.channel, cc.control_number); } else { sequencer.midi_in(msg); - ld::ControlChangeEvent cc = msg.AsControlChange(); float val_normalized = cc.value / 127.; switch (cc.control_number) { // Pots @@ -293,10 +294,16 @@ namespace Heck { but_rec.Debounce(); but_record_new = but_rec.Pressed(); if (but_record_current != but_record_new) { + // State changed but_record_current = but_record_new; if (but_record_current) { - hw.PrintLine("BUTTON RECORD ON"); - State::record_mode = true; + if (State::clear_mode) { + hw.PrintLine("CLEAR SEQUENCE"); + sequencer.clear_sequence(); + } else { + hw.PrintLine("BUTTON RECORD ON"); + State::record_mode = true; + } } else { hw.PrintLine("BUTTON RECORD OFF"); State::record_mode = false; @@ -308,6 +315,7 @@ namespace Heck { but_clear.Debounce(); but_clear_new = but_clear.Pressed(); if (but_clear_current != but_clear_new) { + // State changed but_clear_current = but_clear_new; if (but_clear_current) { hw.PrintLine("BUTTON CLEAR ON"); @@ -318,9 +326,6 @@ namespace Heck { } } - if (State::record_mode && State::clear_mode) { - sequencer.clear_sequence(); - } if (systick_now - midi_log_systick_last > 5) { midi_log_systick_last = systick_now;