3 changed files with 63 additions and 44 deletions
@ -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<ld::MidiEvent> Sequencer::midi_out() |
|||
void Sequencer::midi_out(Sequencer::MidiOutCallback cb) |
|||
{ |
|||
std::vector<ld::MidiEvent> 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
|
|||
} // namespace Heck::OSP
|
Loading…
Reference in new issue