midi-toolkit-rs 0.3.1

A library for ultra high performance MIDI operations, designed for black MIDI. The library isn't perfect
Documentation
use crate::{
    events::{BatchTempo, MIDIEvent, MIDIEventEnum, SerializeEvent},
    io::MIDIWriteError,
    num::MIDINum,
};

use super::Delta;

#[derive(Debug, Clone)]
pub struct Track<T> {
    pub event: T,
    pub track: u32,
}

impl<T> Track<T> {
    pub fn new(event: T, track: u32) -> Self {
        Self { event, track }
    }

    pub fn inner_event(self) -> T {
        self.event
    }
}

impl<T> std::ops::Deref for Track<T> {
    type Target = T;

    fn deref(&self) -> &Self::Target {
        &self.event
    }
}

impl<T> std::ops::DerefMut for Track<T> {
    fn deref_mut(&mut self) -> &mut Self::Target {
        &mut self.event
    }
}

impl<T: SerializeEvent> SerializeEvent for Track<T> {
    fn serialize_event<W: std::io::Write>(&self, buf: &mut W) -> Result<usize, MIDIWriteError> {
        self.event.serialize_event(buf)
    }
}

impl<E: MIDIEvent> MIDIEvent for Track<E> {
    fn key(&self) -> Option<u8> {
        self.event.key()
    }

    fn key_mut(&mut self) -> Option<&mut u8> {
        self.event.key_mut()
    }

    fn channel(&self) -> Option<u8> {
        self.event.channel()
    }

    fn channel_mut(&mut self) -> Option<&mut u8> {
        self.event.channel_mut()
    }

    fn as_u32(&self) -> Option<u32> {
        self.event.as_u32()
    }
}

impl<E: MIDIEventEnum> MIDIEventEnum for Track<E> {
    fn as_event(&self) -> &crate::events::Event {
        self.event.as_event()
    }

    fn as_event_mut(&mut self) -> &mut crate::events::Event {
        self.event.as_event_mut()
    }
}

impl<E: BatchTempo> BatchTempo for Track<E> {
    fn inner_tempo(&self) -> Option<u32> {
        self.event.inner_tempo()
    }

    fn without_tempo(self) -> Option<Self> {
        let track = self.track;
        self.event
            .without_tempo()
            .map(|event| Self::new(event, track))
    }
}

pub fn into_track_events<D: MIDINum, E, Err>(
    iter: impl Iterator<Item = Result<Delta<D, E>, Err>>,
    track: u32,
) -> impl Iterator<Item = Result<Delta<D, Track<E>>, Err>> {
    iter.map(move |e| e.map(|e| Delta::new(e.delta, Track::new(e.event, track))))
}