Skip to main content

midi_io/midi/
message.rs

1use crate::midi::channel::Channel;
2use crate::midi::data_byte::DataByte;
3use crate::midi::pitch_bend::PitchBend;
4use crate::midi::song_position::SongPosition;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7pub enum MidiMessage {
8    NoteOn {
9        channel: Channel,
10        key: DataByte,
11        velocity: DataByte,
12    },
13    NoteOff {
14        channel: Channel,
15        key: DataByte,
16        velocity: DataByte,
17    },
18    ControlChange {
19        channel: Channel,
20        controller: DataByte,
21        value: DataByte,
22    },
23    ProgramChange {
24        channel: Channel,
25        program: DataByte,
26    },
27    PitchBend {
28        channel: Channel,
29        value: PitchBend,
30    },
31    PolyKeyPressure {
32        channel: Channel,
33        key: DataByte,
34        pressure: DataByte,
35    },
36    ChannelPressure {
37        channel: Channel,
38        pressure: DataByte,
39    },
40    MtcQuarterFrame(DataByte),
41    SongPositionPointer(SongPosition),
42    SongSelect(DataByte),
43    TuneRequest,
44    TimingClock,
45    Start,
46    Continue,
47    Stop,
48    ActiveSensing,
49    Reset,
50}
51
52impl std::fmt::Display for MidiMessage {
53    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
54        match self {
55            MidiMessage::NoteOn {
56                channel,
57                key,
58                velocity,
59            } => write!(f, "NoteOn ch={} key={} vel={}", channel, key, velocity),
60            MidiMessage::NoteOff {
61                channel,
62                key,
63                velocity,
64            } => write!(f, "NoteOff ch={} key={} vel={}", channel, key, velocity),
65            MidiMessage::ControlChange {
66                channel,
67                controller,
68                value,
69            } => write!(f, "CC ch={} ctrl={} val={}", channel, controller, value),
70            MidiMessage::ProgramChange { channel, program } => {
71                write!(f, "PC ch={} prog={}", channel, program)
72            }
73            MidiMessage::PitchBend { channel, value } => {
74                write!(f, "PitchBend ch={} val={}", channel, value)
75            }
76            MidiMessage::PolyKeyPressure {
77                channel,
78                key,
79                pressure,
80            } => write!(
81                f,
82                "PolyKeyPressure ch={} key={} pres={}",
83                channel, key, pressure
84            ),
85            MidiMessage::ChannelPressure { channel, pressure } => {
86                write!(f, "ChannelPressure ch={} pres={}", channel, pressure)
87            }
88            MidiMessage::MtcQuarterFrame(data) => {
89                write!(f, "MtcQuarterFrame {:#04x}", data.get())
90            }
91            MidiMessage::SongPositionPointer(pos) => write!(f, "SongPosition {}", pos),
92            MidiMessage::SongSelect(song) => write!(f, "SongSelect {}", song),
93            MidiMessage::TuneRequest => write!(f, "TuneRequest"),
94            MidiMessage::TimingClock => write!(f, "TimingClock"),
95            MidiMessage::Start => write!(f, "Start"),
96            MidiMessage::Continue => write!(f, "Continue"),
97            MidiMessage::Stop => write!(f, "Stop"),
98            MidiMessage::ActiveSensing => write!(f, "ActiveSensing"),
99            MidiMessage::Reset => write!(f, "Reset"),
100        }
101    }
102}