You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.2 KiB
88 lines
2.2 KiB
#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
|