From 8cbbb9b3ecc938da38391525ba24d932c48c6b07 Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Wed, 11 Mar 2026 17:29:08 -0600 Subject: [PATCH] can play the same note repeatedly --- src/seq.rs | 46 ++++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/src/seq.rs b/src/seq.rs index 7b09272..dcfbd0a 100644 --- a/src/seq.rs +++ b/src/seq.rs @@ -55,7 +55,8 @@ impl SynSeq { #[derive(PartialEq)] pub struct Seq { beats: Vec<(usize, tone::Tone)>, - state: Option, + had_more: bool, + eof: bool, } fn new() -> Seq { @@ -66,7 +67,8 @@ impl Seq { fn new() -> Seq { Seq { beats: vec![], - state: None, + had_more: false, + eof: false, } } @@ -79,12 +81,22 @@ impl Seq { } fn pop(&mut self) -> (Option, bool) { - let state_before = self.state.clone(); - let tone_after = self._pop(); - if state_before != tone_after { - self.state = tone_after.clone(); + let mut changed = !self.had_more && self.beats.len() > 0; + self.had_more = match self.beats.len() { + 0 => false, + _ => self.beats[0].0 > 1, + }; + let eof_before = self.eof; + self.eof = self.beats.len() == 0; + if !eof_before && self.eof { + changed = true; } - (tone_after, self.state != state_before) + let tone = self._pop(); + eprintln!( + " popped ({:?}, {}): had_more={}, beats={:?} eof={} from {}", + tone, changed, self.had_more, self.beats, self.eof, eof_before, + ); + (tone, changed) } fn _pop(&mut self) -> Option { @@ -130,20 +142,22 @@ mod test { fn test_seq() { let mut seq = new(); - seq.append("c"); + seq.append("c c"); seq.append("4d"); seq.append("2-"); seq.append("g 2e"); - assert_eq!(seq.beats.len(), 5); - assert_eq!(seq.len(), 10); + assert_eq!(seq.beats.len(), 6); + assert_eq!(seq.len(), 11); assert_eq!(seq.beats[0], (1 as usize, tone::new("c"))); - assert_eq!(seq.beats[1], (4 as usize, tone::new("d"))); - assert_eq!(seq.beats[2], (2 as usize, tone::new("!"))); - assert_eq!(seq.beats[3], (1 as usize, tone::new("g"))); - assert_eq!(seq.beats[4], (2 as usize, tone::new("e"))); + assert_eq!(seq.beats[1], (1 as usize, tone::new("c"))); + assert_eq!(seq.beats[2], (4 as usize, tone::new("d"))); + assert_eq!(seq.beats[3], (2 as usize, tone::new("!"))); + assert_eq!(seq.beats[4], (1 as usize, tone::new("g"))); + assert_eq!(seq.beats[5], (2 as usize, tone::new("e"))); + assert_eq!(seq.pop(), (Some(tone::new("c")), true)); assert_eq!(seq.pop(), (Some(tone::new("c")), true)); assert_eq!(seq.pop(), (Some(tone::new("d")), true)); for _ in 1..4 { @@ -154,7 +168,7 @@ mod test { assert_eq!(seq.pop(), (Some(tone::new("g")), true)); assert_eq!(seq.pop(), (Some(tone::new("e")), true)); assert_eq!(seq.pop(), (Some(tone::new("e")), false)); - assert_eq!(seq.pop(), (None, true)); - assert_eq!(seq.pop(), (None, false)); + assert_eq!(seq.pop(), (None, true), "shouldve newly had no more"); + assert_eq!(seq.pop(), (None, false), "shouldve still had no more"); } }