can play the same note repeatedly

This commit is contained in:
Bel LaPointe
2026-03-11 17:29:08 -06:00
parent 208d804f8f
commit 8cbbb9b3ec

View File

@@ -55,7 +55,8 @@ impl SynSeq {
#[derive(PartialEq)] #[derive(PartialEq)]
pub struct Seq { pub struct Seq {
beats: Vec<(usize, tone::Tone)>, beats: Vec<(usize, tone::Tone)>,
state: Option<tone::Tone>, had_more: bool,
eof: bool,
} }
fn new() -> Seq { fn new() -> Seq {
@@ -66,7 +67,8 @@ impl Seq {
fn new() -> Seq { fn new() -> Seq {
Seq { Seq {
beats: vec![], beats: vec![],
state: None, had_more: false,
eof: false,
} }
} }
@@ -79,12 +81,22 @@ impl Seq {
} }
fn pop(&mut self) -> (Option<tone::Tone>, bool) { fn pop(&mut self) -> (Option<tone::Tone>, bool) {
let state_before = self.state.clone(); let mut changed = !self.had_more && self.beats.len() > 0;
let tone_after = self._pop(); self.had_more = match self.beats.len() {
if state_before != tone_after { 0 => false,
self.state = tone_after.clone(); _ => 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<tone::Tone> { fn _pop(&mut self) -> Option<tone::Tone> {
@@ -130,20 +142,22 @@ mod test {
fn test_seq() { fn test_seq() {
let mut seq = new(); let mut seq = new();
seq.append("c"); seq.append("c c");
seq.append("4d"); seq.append("4d");
seq.append("2-"); seq.append("2-");
seq.append("g 2e"); seq.append("g 2e");
assert_eq!(seq.beats.len(), 5); assert_eq!(seq.beats.len(), 6);
assert_eq!(seq.len(), 10); assert_eq!(seq.len(), 11);
assert_eq!(seq.beats[0], (1 as usize, tone::new("c"))); 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[1], (1 as usize, tone::new("c")));
assert_eq!(seq.beats[2], (2 as usize, tone::new("!"))); assert_eq!(seq.beats[2], (4 as usize, tone::new("d")));
assert_eq!(seq.beats[3], (1 as usize, tone::new("g"))); assert_eq!(seq.beats[3], (2 as usize, tone::new("!")));
assert_eq!(seq.beats[4], (2 as usize, tone::new("e"))); 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("c")), true));
assert_eq!(seq.pop(), (Some(tone::new("d")), true)); assert_eq!(seq.pop(), (Some(tone::new("d")), true));
for _ in 1..4 { 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("g")), true));
assert_eq!(seq.pop(), (Some(tone::new("e")), true)); assert_eq!(seq.pop(), (Some(tone::new("e")), true));
assert_eq!(seq.pop(), (Some(tone::new("e")), false)); assert_eq!(seq.pop(), (Some(tone::new("e")), false));
assert_eq!(seq.pop(), (None, true)); assert_eq!(seq.pop(), (None, true), "shouldve newly had no more");
assert_eq!(seq.pop(), (None, false)); assert_eq!(seq.pop(), (None, false), "shouldve still had no more");
} }
} }