Compare commits
2 Commits
8f4c7596c4
...
8cbbb9b3ec
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8cbbb9b3ec | ||
|
|
208d804f8f |
46
src/seq.rs
46
src/seq.rs
@@ -55,7 +55,8 @@ impl SynSeq {
|
||||
#[derive(PartialEq)]
|
||||
pub struct Seq {
|
||||
beats: Vec<(usize, tone::Tone)>,
|
||||
state: Option<tone::Tone>,
|
||||
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<tone::Tone>, 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<tone::Tone> {
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user