The OSP is a hackable, open source drum machine that accidentally got very, very close to the erica perkons hd-01, which is real beauty of instrument design that i truly love, except for its unhackable closed source nature. So, we new need gnu one.
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

#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