midnote/
bar.rs

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		// check if we have a tempo event
16		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}