#include "sequencer.hh" namespace Heck::OSP { constexpr i8 EMPTY = -1; Sequencer::Sequencer() {} void Sequencer::init() { step_current_ = 0; recording_ = false; clear_sequence(); } void Sequencer::reset() { 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; } } void Sequencer::clear_track(i8 track_nr) { 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(i8 track_nr, i8 cc_nr) { for (i8 step = 0; step < STEP_COUNT; step++) { sequence_[track_nr][step][cc_nr] = EMPTY; } } void Sequencer::clear_sequence() { for (i8 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; } } void Sequencer::midi_out(Sequencer::MidiOutCallback cb) { 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; } } } // namespace Heck::OSP