1use std::borrow::Cow;
2
3use nodi::{timers::Ticker, Event, Moment, Sheet, Timer};
4
5pub struct Bar {
6 pub timer: Ticker,
7 pub moments: Vec<Moment>,
8}
9
10pub fn bars(sheet: Sheet, tpb: u16) -> Vec<Bar> {
11 let mut timer = Ticker::new(tpb);
12 let mut buf = Vec::new();
13 for bar in sheet.into_bars(tpb) {
14 let t = timer;
15 for m in &bar {
17 match &m {
18 Moment::Empty => (),
19 Moment::Events(events) => {
20 for e in events {
21 if let Event::Tempo(n) = e {
22 timer.change_tempo(*n);
23 }
24 }
25 }
26 }
27 }
28 buf.push(Bar {
29 timer: t,
30 moments: bar,
31 });
32 }
33 buf
34}
35
36impl<'a> Bar {
37 pub fn trim_moments(&self) -> &[Moment] {
38 let start = self.moments.iter().take_while(|m| m.is_empty()).count();
39 let slice = &self.moments[start..];
40 let end = slice.iter().rev().take_while(|m| m.is_empty()).count();
41 &slice[..(slice.len() - end)]
42 }
43
44 pub fn transposed_moments(&'a self, n: i8) -> Cow<'a, [Moment]> {
45 if n == 0 {
46 self.trim_moments().into()
47 } else {
48 let mut moments = self.trim_moments().to_vec();
49 for m in &mut moments {
50 m.transpose(n, false);
51 }
52 moments.into()
53 }
54 }
55}