diff --git a/src/main.rs b/src/main.rs index aed8fb7..231ce7c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,8 +13,9 @@ fn main() { flags.sound_font, flags.sample_rate, )); + syn_seq.append(1, "3c1"); if let Some(play) = flags.play { - syn_seq.append(play); + syn_seq.append(0, play); } play(syn_seq, flags.sample_rate, flags.bpm); diff --git a/src/seq.rs b/src/seq.rs index 451c4cb..3910bad 100644 --- a/src/seq.rs +++ b/src/seq.rs @@ -2,37 +2,55 @@ use crate::tone; use crate::syn; pub struct SynSeq { - seq: Seq, + seqs: std::collections::HashMap, syn: syn::Syn, } pub fn new_syn(syn: syn::Syn) -> SynSeq { SynSeq{ - seq: new(), + seqs: std::collections::HashMap::new(), syn: syn, } } impl SynSeq { - pub fn append(&mut self, s: S) { - self.seq.append(s); + pub fn append(&mut self, ch: i32, s: S) { + match self.seqs.get_mut(&ch) { + Some(seq) => seq.append(s), + None => { + let mut seq = new(); + seq.append(s); + self.seqs.insert(ch, seq); + }, + }; } pub fn render(&mut self, left: &mut [f32], right: &mut [f32]) { - match self.seq.pop() { - (Some(tone), changed) if changed => { - self.syn.set(0, Some(tone.clone())); - }, - (None, changed) if changed => { - self.syn.set(0, None); - }, - _ => {}, - }; + for (ch, seq) in self.seqs.iter_mut() { + let ch = ch.clone(); + match seq.pop() { + (Some(tone), changed) if changed => { + self.syn.set(ch, Some(tone.clone())) + }, + (None, changed) if changed => { + self.syn.set(ch, None); + }, + _ => {}, + }; + } self.syn.render(left, right); } pub fn beats(&self) -> usize { - self.seq.beats.len() + let mut longest = 0 as usize; + for (_, seq) in self.seqs.iter() { + longest = if seq.beats.len() > longest { + seq.beats.len() + } else { + longest + }; + } + longest } }