
3 changed files with 108 additions and 87 deletions
@ -0,0 +1,72 @@ |
|||||
|
#include "sequencer.hh" |
||||
|
|
||||
|
namespace Heck { |
||||
|
Sequencer::Sequencer() |
||||
|
{ |
||||
|
clear_sequence(); |
||||
|
} |
||||
|
|
||||
|
void Sequencer::reset() |
||||
|
{ |
||||
|
step_current = 0; |
||||
|
} |
||||
|
|
||||
|
void Sequencer::next_step() |
||||
|
{ |
||||
|
step_current++; |
||||
|
if (step_current >= STEP_COUNT) { |
||||
|
step_current = 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Sequencer::clear_track(int 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; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Sequencer::clear_track_cc(int track_nr, int cc_nr) |
||||
|
{ |
||||
|
for (int step = 0; step < STEP_COUNT; step++) { |
||||
|
sequence[track_nr][step][cc_nr] = -1; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
void Sequencer::clear_sequence() |
||||
|
{ |
||||
|
for (int 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; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
std::vector<ld::MidiEvent> Sequencer::midi_out() |
||||
|
{ |
||||
|
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); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
return ret; |
||||
|
} |
||||
|
|
||||
|
} // namespace Heck
|
@ -0,0 +1,35 @@ |
|||||
|
#ifndef HECK_PERKONS_SEQUENCER_HH |
||||
|
#define HECK_PERKONS_SEQUENCER_HH |
||||
|
|
||||
|
#include <vector> |
||||
|
#include "daisy_seed.h" |
||||
|
|
||||
|
namespace ld = daisy; |
||||
|
|
||||
|
namespace Heck { |
||||
|
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; |
||||
|
|
||||
|
using Step = std::array<int, MIDI_MAX>; |
||||
|
using Track = std::array<Step, STEP_COUNT>; |
||||
|
using Sequence = std::array<Track, TRACK_COUNT>; |
||||
|
|
||||
|
Sequencer(); |
||||
|
void reset(); |
||||
|
void next_step(); |
||||
|
void clear_track(int track_nr); |
||||
|
void clear_track_cc(int track_nr, int cc_nr); |
||||
|
void clear_sequence(); |
||||
|
void midi_in(ld::MidiEvent& msg); |
||||
|
std::vector<ld::MidiEvent> midi_out(); |
||||
|
|
||||
|
int step_current{ 0 }; |
||||
|
bool recording{ false }; |
||||
|
Sequence sequence{}; |
||||
|
}; |
||||
|
} // namespace Heck
|
||||
|
|
||||
|
#endif |
Loading…
Reference in new issue