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}