use bevy::prelude::*;
use midix::prelude::*;
mod channel;
pub use channel::*;
use super::MidiSong;
#[derive(Default, Clone, Debug)]
pub struct MidiSongBuilder {
accumulated_time: u64,
events: Vec<Timed<ChannelVoiceMessage>>,
}
impl MidiSongBuilder {
pub fn channel(&mut self, channel: Channel) -> ChannelBuilder<'_> {
ChannelBuilder {
builder: self,
channel,
}
}
pub fn add(&mut self, mut event: Timed<ChannelVoiceMessage>) -> &mut Self {
self.accumulated_time += event.timestamp;
event.timestamp = self.accumulated_time;
self.events.push(event);
self
}
pub fn add_many(
&mut self,
events: impl IntoIterator<Item = Timed<ChannelVoiceMessage>>,
) -> &mut Self {
self.events.extend(events.into_iter().map(|mut event| {
self.accumulated_time += event.timestamp;
event.timestamp = self.accumulated_time;
event
}));
self
}
pub fn build(self) -> MidiSong {
MidiSong::new(self.events)
}
}