diff --git a/src/main_osp.cc b/src/main_osp.cc index e310585..274f04a 100644 --- a/src/main_osp.cc +++ b/src/main_osp.cc @@ -54,6 +54,7 @@ namespace Heck::OSP { void init_tracks() { + sequencer.init(); tracks[0].init(instrument0); tracks[1].init(instrument1); tracks[2].init(instrument2); @@ -242,10 +243,7 @@ namespace Heck::OSP { void midi_from_sequencer() { - std::vector queue = sequencer.midi_out(); - for (ld::MidiEvent msg : queue) { - midi_dispatch(msg, true); - } + sequencer.midi_out([](ld::MidiEvent msg) { midi_dispatch(msg, true); }); } //------------------------------------------------- diff --git a/src/sequencer.cc b/src/sequencer.cc index df988e6..6018699 100644 --- a/src/sequencer.cc +++ b/src/sequencer.cc @@ -1,72 +1,88 @@ #include "sequencer.hh" namespace Heck::OSP { - Sequencer::Sequencer() + constexpr i8 EMPTY = -1; + + Sequencer::Sequencer() {} + + void Sequencer::init() { + step_current_ = 0; + recording_ = false; clear_sequence(); } void Sequencer::reset() { - step_current = 0; + step_current_ = 0; + } + + bool Sequencer::recording(bool set_rec) + { + recording_ = set_rec; + return recording_; } void Sequencer::next_step() { - step_current++; - if (step_current >= STEP_COUNT) { - step_current = 0; + step_current_++; + if (step_current_ >= STEP_COUNT) { + step_current_ = 0; } } - void Sequencer::clear_track(int track_nr) + void Sequencer::clear_track(i8 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; + for (i8 step = 0; step < STEP_COUNT; step++) { + for (i8 cc_nr = 0; cc_nr < MIDI_MAX; cc_nr++) { + sequence_[track_nr][step][cc_nr] = EMPTY; } } } - void Sequencer::clear_track_cc(int track_nr, int cc_nr) + void Sequencer::clear_track_cc(i8 track_nr, i8 cc_nr) { - for (int step = 0; step < STEP_COUNT; step++) { - sequence[track_nr][step][cc_nr] = -1; + for (i8 step = 0; step < STEP_COUNT; step++) { + sequence_[track_nr][step][cc_nr] = EMPTY; } } void Sequencer::clear_sequence() { - for (int track = 0; track < TRACK_COUNT; track++) { + for (i8 track = 0; track < TRACK_COUNT; track++) { clear_track(track); } } void Sequencer::midi_in(ld::MidiEvent& msg) { - if (recording) { + if (recording_) { ld::ControlChangeEvent cc = msg.AsControlChange(); - sequence[cc.channel][step_current][cc.control_number] = cc.value; + sequence_[cc.channel][step_current_][cc.control_number] = cc.value; } } - std::vector Sequencer::midi_out() + void Sequencer::midi_out(Sequencer::MidiOutCallback cb) { - 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); + if (!cb) { + ld::DaisySeed::PrintLine("Sequencer: Error - no midi out callback registered"); + return; + } else { + for (i8 track = 0; track < TRACK_COUNT; track++) { + for (i8 cc_nr = 0; cc_nr < MIDI_MAX; cc_nr++) { + i8 cc_val = sequence_[track][step_current_][cc_nr]; + if (cc_val != EMPTY) { + ld::MidiEvent ev{}; + ev.channel = track; + ev.type = ld::ControlChange; + ev.data[0] = cc_nr; + ev.data[1] = cc_val; + cb(ev); + } } } + return; } - return ret; } -} // namespace Heck \ No newline at end of file +} // namespace Heck::OSP \ No newline at end of file diff --git a/src/sequencer.hh b/src/sequencer.hh index ea911b2..38e4a88 100644 --- a/src/sequencer.hh +++ b/src/sequencer.hh @@ -3,32 +3,37 @@ #include #include "daisy_seed.h" +#include "dizzy_types.hh" namespace ld = daisy; namespace Heck::OSP { 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; + constexpr static i8 MIDI_MAX = 127; + constexpr static i8 STEP_COUNT = 16; + constexpr static i8 TRACK_COUNT = 4; - using Step = std::array; + using MidiOutCallback = std::function; + + using Step = std::array; using Track = std::array; using Sequence = std::array; Sequencer(); + void init(); void reset(); void next_step(); - void clear_track(int track_nr); - void clear_track_cc(int track_nr, int cc_nr); + bool recording(bool set_rec); + void clear_track(i8 track_nr); + void clear_track_cc(i8 track_nr, i8 cc_nr); void clear_sequence(); void midi_in(ld::MidiEvent& msg); - std::vector midi_out(); - - int step_current{ 0 }; - bool recording{ false }; - Sequence sequence{}; + void midi_out(Sequencer::MidiOutCallback cb); + private: + i8 step_current_; + bool recording_; + Sequence sequence_; }; } // namespace Heck