use mseq::{Conductor, Instruction, MidiNote, Track};
use rand::prelude::*;
struct MyTrack {
channel_id: u8,
}
impl Track for MyTrack {
fn play_step(&mut self, step: u32) -> Vec<Instruction> {
if step.is_multiple_of(8) {
let mut rng = rand::rng();
let note = MidiNote {
note: rng.random_range(0u8..11u8).into(),
octave: 4,
vel: 127,
};
let note_length = 3;
vec![Instruction::PlayNote {
midi_note: note,
len: note_length,
channel_id: self.channel_id,
}]
} else {
vec![]
}
}
}
struct MyConductor {
track: MyTrack,
}
impl Conductor for MyConductor {
fn init(&mut self, context: &mut mseq::Context) -> Vec<Instruction> {
context.start();
vec![]
}
fn update(&mut self, context: &mut mseq::Context) -> Vec<Instruction> {
let step = context.get_step();
if step == 959 {
context.quit();
return vec![];
}
self.track.play_step(step)
}
}
fn main() {
env_logger::init();
if let Err(e) = mseq::run(
MyConductor {
track: MyTrack { channel_id: 0 },
},
None,
None,
) {
println!("An error occured: {:?}", e);
}
}