diff --git a/sequencer/combine_seq.h b/sequencer/combine_seq.h new file mode 100644 index 0000000..339ec81 --- /dev/null +++ b/sequencer/combine_seq.h @@ -0,0 +1,41 @@ +#pragma once + +#include "simple_seq.h" + +namespace trnr { + +struct combine_note { + int probability; + int pitch; + int octave; + int velocity; +}; + +struct combine_seq { + simple_seq probability_seq; + simple_seq pitch_seq; + simple_seq octave_seq; + simple_seq velocity_seq; + combine_note current_note; +}; + +inline void combine_seq_init(combine_seq& c, size_t max_len) +{ + simple_seq_init(c.probability_seq, max_len); + simple_seq_init(c.pitch_seq, max_len); + simple_seq_init(c.octave_seq, max_len); + simple_seq_init(c.velocity_seq, max_len); +} + +inline combine_note& combine_seq_process_step(combine_seq& c) +{ + c.current_note.probability = simple_seq_process_step(c.probability_seq); + c.current_note.pitch = simple_seq_process_step(c.pitch_seq); + c.current_note.octave = simple_seq_process_step(c.octave_seq); + c.current_note.velocity = simple_seq_process_step(c.velocity_seq); + + return c.current_note; +} + +struct timing_info {}; +} // namespace trnr diff --git a/sequencer/simple_seq.h b/sequencer/simple_seq.h new file mode 100644 index 0000000..2b51a01 --- /dev/null +++ b/sequencer/simple_seq.h @@ -0,0 +1,66 @@ +#pragma once + +#include +#include +#include + +using namespace std; + +namespace trnr { + +enum playback_dir { + PB_FORWARD, + PB_BACKWARD, + PB_PENDULUM, + PB_RANDOM +}; + +struct simple_seq { + size_t current_pos; + size_t length; + playback_dir playback_dir; + vector data; + bool pendulum_forward; +}; + +inline void simple_seq_init(simple_seq& s, size_t length) +{ + s.current_pos = 0; + s.length = length; + s.playback_dir = PB_FORWARD; + s.data.resize(s.length); + s.data.assign(s.length, 0); + s.pendulum_forward = true; +} + +inline int simple_seq_process_step(simple_seq& s) +{ + // play head advancement + if (s.playback_dir == PB_FORWARD || + s.playback_dir == PB_PENDULUM && s.pendulum_forward) + s.current_pos++; + else if (s.playback_dir == PB_BACKWARD || + s.playback_dir == PB_PENDULUM && !s.pendulum_forward) + s.current_pos--; + else if (s.playback_dir == PB_RANDOM) s.current_pos = rand() % s.length; + + // play head reset + switch (s.playback_dir) { + case PB_FORWARD: + if (s.current_pos > s.length - 1) s.current_pos = 0; + break; + case PB_BACKWARD: + if (s.current_pos < 0) s.current_pos = s.length - 1; + break; + case PB_PENDULUM: + if (s.pendulum_forward && s.current_pos >= s.length - 1) + s.pendulum_forward = false; + else if (!s.pendulum_forward && s.current_pos <= 0) s.pendulum_forward = true; + break; + case PB_RANDOM: + break; + } + + return s.data[s.current_pos]; +} +} // namespace trnr