From c277c815e9bfaeaa6f4400f4fc0cc0b2de0809d5 Mon Sep 17 00:00:00 2001 From: heck Date: Fri, 13 Sep 2024 22:45:38 +0200 Subject: [PATCH] move sequencer into own module --- src/main_perkons.cc | 88 +-------------------------------------------- src/sequencer.cc | 72 +++++++++++++++++++++++++++++++++++++ src/sequencer.hh | 35 ++++++++++++++++++ 3 files changed, 108 insertions(+), 87 deletions(-) create mode 100644 src/sequencer.cc create mode 100644 src/sequencer.hh diff --git a/src/main_perkons.cc b/src/main_perkons.cc index 5e5310a..97141b6 100644 --- a/src/main_perkons.cc +++ b/src/main_perkons.cc @@ -6,6 +6,7 @@ #include "track.hh" #include "utils.hh" #include "midiclock.hh" +#include "sequencer.hh" #include "instr_abstract.hh" #include "instr_kick.hh" #include "instr_noise.hh" @@ -15,7 +16,6 @@ namespace ld = daisy; namespace dsp = daisysp; - namespace Heck { // ============================================================================================= // INIT @@ -33,92 +33,6 @@ namespace Heck { Instrument::Grainlet instrument3{}; std::array tracks; - - struct Sequencer { - - Sequencer() - { - clear_sequence(); - } - - // its a MIDI CC step sequencer - constexpr static int MIDI_MAX = 127; - constexpr static int STEP_COUNT = 16; - constexpr static int TRACK_COUNT = 16; - - using Step = std::array; - using Track = std::array; - using Sequence = std::array; - - - void reset() - { - step_current = 0; - } - - void next_step() - { - step_current++; - if (step_current >= STEP_COUNT) { - step_current = 0; - } - } - - void clear_track(int track_nr) - { - for (int step = 0; step < STEP_COUNT; step++) { - for (int cc_nr = 0; cc_nr < MIDI_MAX; cc_nr++) { - sequence[track_nr][step][cc_nr] = -1; - } - } - } - - void clear_track_cc(int track_nr, int cc_nr) - { - for (int step = 0; step < STEP_COUNT; step++) { - sequence[track_nr][step][cc_nr] = -1; - } - } - - void clear_sequence() - { - for (int track = 0; track < TRACK_COUNT; track++) { - clear_track(track); - } - } - - void midi_in(ld::MidiEvent& msg) - { - if (recording) { - ld::ControlChangeEvent cc = msg.AsControlChange(); - sequence[cc.channel][step_current][cc.control_number] = cc.value; - } - } - - std::vector midi_out() - { - std::vector ret{}; - for (int track = 0; track < TRACK_COUNT; track++) { - for (int cc_nr = 0; cc_nr < MIDI_MAX; cc_nr++) { - int cc_val = sequence[track][step_current][cc_nr]; - if (cc_val != -1) { - ld::MidiEvent ev{}; - ev.channel = track; - ev.type = ld::ControlChange; - ev.data[0] = cc_nr; - ev.data[1] = cc_val; - ret.push_back(ev); - } - } - } - return ret; - } - - int step_current{ 0 }; - bool recording{ false }; - Sequence sequence{}; - }; - MidiClock clock{}; Sequencer sequencer{}; diff --git a/src/sequencer.cc b/src/sequencer.cc new file mode 100644 index 0000000..f614e05 --- /dev/null +++ b/src/sequencer.cc @@ -0,0 +1,72 @@ +#include "sequencer.hh" + +namespace Heck { + Sequencer::Sequencer() + { + clear_sequence(); + } + + void Sequencer::reset() + { + step_current = 0; + } + + void Sequencer::next_step() + { + step_current++; + if (step_current >= STEP_COUNT) { + step_current = 0; + } + } + + void Sequencer::clear_track(int track_nr) + { + for (int step = 0; step < STEP_COUNT; step++) { + for (int cc_nr = 0; cc_nr < MIDI_MAX; cc_nr++) { + sequence[track_nr][step][cc_nr] = -1; + } + } + } + + void Sequencer::clear_track_cc(int track_nr, int cc_nr) + { + for (int step = 0; step < STEP_COUNT; step++) { + sequence[track_nr][step][cc_nr] = -1; + } + } + + void Sequencer::clear_sequence() + { + for (int track = 0; track < TRACK_COUNT; track++) { + clear_track(track); + } + } + + void Sequencer::midi_in(ld::MidiEvent& msg) + { + if (recording) { + ld::ControlChangeEvent cc = msg.AsControlChange(); + sequence[cc.channel][step_current][cc.control_number] = cc.value; + } + } + + std::vector Sequencer::midi_out() + { + std::vector ret{}; + for (int track = 0; track < TRACK_COUNT; track++) { + for (int cc_nr = 0; cc_nr < MIDI_MAX; cc_nr++) { + int cc_val = sequence[track][step_current][cc_nr]; + if (cc_val != -1) { + ld::MidiEvent ev{}; + ev.channel = track; + ev.type = ld::ControlChange; + ev.data[0] = cc_nr; + ev.data[1] = cc_val; + ret.push_back(ev); + } + } + } + return ret; + } + +} // namespace Heck \ No newline at end of file diff --git a/src/sequencer.hh b/src/sequencer.hh new file mode 100644 index 0000000..28cff80 --- /dev/null +++ b/src/sequencer.hh @@ -0,0 +1,35 @@ +#ifndef HECK_PERKONS_SEQUENCER_HH +#define HECK_PERKONS_SEQUENCER_HH + +#include +#include "daisy_seed.h" + +namespace ld = daisy; + +namespace Heck { + struct Sequencer { + // its a MIDI CC step sequencer + constexpr static int MIDI_MAX = 127; + constexpr static int STEP_COUNT = 16; + constexpr static int TRACK_COUNT = 16; + + using Step = std::array; + using Track = std::array; + using Sequence = std::array; + + Sequencer(); + void reset(); + void next_step(); + void clear_track(int track_nr); + void clear_track_cc(int track_nr, int cc_nr); + void clear_sequence(); + void midi_in(ld::MidiEvent& msg); + std::vector midi_out(); + + int step_current{ 0 }; + bool recording{ false }; + Sequence sequence{}; + }; +} // namespace Heck + +#endif \ No newline at end of file