midi-io 0.1.1

Stream and send strictly-typed MIDI messages
Documentation
use crate::midi::channel::Channel;
use crate::midi::data_byte::DataByte;
use crate::midi::pitch_bend::PitchBend;
use crate::midi::song_position::SongPosition;

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum MidiMessage {
    NoteOn {
        channel: Channel,
        key: DataByte,
        velocity: DataByte,
    },
    NoteOff {
        channel: Channel,
        key: DataByte,
        velocity: DataByte,
    },
    ControlChange {
        channel: Channel,
        controller: DataByte,
        value: DataByte,
    },
    ProgramChange {
        channel: Channel,
        program: DataByte,
    },
    PitchBend {
        channel: Channel,
        value: PitchBend,
    },
    PolyKeyPressure {
        channel: Channel,
        key: DataByte,
        pressure: DataByte,
    },
    ChannelPressure {
        channel: Channel,
        pressure: DataByte,
    },
    MtcQuarterFrame(DataByte),
    SongPositionPointer(SongPosition),
    SongSelect(DataByte),
    TuneRequest,
    TimingClock,
    Start,
    Continue,
    Stop,
    ActiveSensing,
    Reset,
}

impl std::fmt::Display for MidiMessage {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            MidiMessage::NoteOn {
                channel,
                key,
                velocity,
            } => write!(f, "NoteOn ch={} key={} vel={}", channel, key, velocity),
            MidiMessage::NoteOff {
                channel,
                key,
                velocity,
            } => write!(f, "NoteOff ch={} key={} vel={}", channel, key, velocity),
            MidiMessage::ControlChange {
                channel,
                controller,
                value,
            } => write!(f, "CC ch={} ctrl={} val={}", channel, controller, value),
            MidiMessage::ProgramChange { channel, program } => {
                write!(f, "PC ch={} prog={}", channel, program)
            }
            MidiMessage::PitchBend { channel, value } => {
                write!(f, "PitchBend ch={} val={}", channel, value)
            }
            MidiMessage::PolyKeyPressure {
                channel,
                key,
                pressure,
            } => write!(
                f,
                "PolyKeyPressure ch={} key={} pres={}",
                channel, key, pressure
            ),
            MidiMessage::ChannelPressure { channel, pressure } => {
                write!(f, "ChannelPressure ch={} pres={}", channel, pressure)
            }
            MidiMessage::MtcQuarterFrame(data) => {
                write!(f, "MtcQuarterFrame {:#04x}", data.get())
            }
            MidiMessage::SongPositionPointer(pos) => write!(f, "SongPosition {}", pos),
            MidiMessage::SongSelect(song) => write!(f, "SongSelect {}", song),
            MidiMessage::TuneRequest => write!(f, "TuneRequest"),
            MidiMessage::TimingClock => write!(f, "TimingClock"),
            MidiMessage::Start => write!(f, "Start"),
            MidiMessage::Continue => write!(f, "Continue"),
            MidiMessage::Stop => write!(f, "Stop"),
            MidiMessage::ActiveSensing => write!(f, "ActiveSensing"),
            MidiMessage::Reset => write!(f, "Reset"),
        }
    }
}