midia 0.1.1

A simple wrapper for writing the midi file easier.
Documentation
use crate::{util::number2vlv, IntoMidiData, MidiData};

#[derive(Clone, Copy, Debug)]
pub enum MidiEvent {
    NoteOn { note: u8, velocity: u8 },
    NoteOff { note: u8, velocity: u8 },
    NoteAfterTouch { note: u8, amount: u8 },
    ProgramChange { code: u8 },
}

impl MidiEvent {
    pub fn size(&self) -> u16 {
        match self {
            Self::NoteOn { .. } => 3,
            Self::NoteOff { .. } => 3,
            Self::NoteAfterTouch { .. } => 3,
            Self::ProgramChange { .. } => 2,
        }
    }

    pub fn kind(&self) -> u8 {
        match self {
            Self::NoteOn { .. } => 0x90,
            Self::NoteOff { .. } => 0x80,
            Self::NoteAfterTouch { .. } => 0xA0,
            Self::ProgramChange { .. } => 0xc0,
        }
    }

    pub fn into_bytes(self) -> Vec<u8> {
        match self {
            Self::NoteOn { note, velocity } => vec![self.kind(), note, velocity],
            Self::NoteOff { note, velocity } => vec![self.kind(), note, velocity],
            Self::NoteAfterTouch { note, amount } => vec![self.kind(), note, amount],
            Self::ProgramChange { code } => vec![self.kind(), code],
        }
    }
}

#[derive(Clone, Copy, Debug)]
pub struct MidiEventDelta {
    delta_time: u16,
    event: MidiEvent,
}

impl MidiEventDelta {
    pub fn new(delta_time: u16, event: MidiEvent) -> Self {
        Self { delta_time, event }
    }

    pub fn size(&self) -> u16 {
        self.event.size() + number2vlv(self.delta_time).len() as u16
    }
}

impl IntoMidiData for MidiEventDelta {
    fn into_midi_data(self) -> crate::MidiData {
        let mut data = MidiData::new();
        data.push_bytes(number2vlv(self.delta_time));
        data.push_bytes(self.event.into_bytes());
        data
    }
}