diff --git a/README.md b/README.md index 77c815c..7c9febe 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ fn midi_to_bytes(message: wmidi::MidiMessage<'_>) -> Vec { ### Unreleased * Use `error` from `core`. +* Added `MidiMessage::set_channel()` method. ### 4.0.0 diff --git a/src/midi_message.rs b/src/midi_message.rs index 3c2e7c1..5200ccd 100644 --- a/src/midi_message.rs +++ b/src/midi_message.rs @@ -339,6 +339,20 @@ impl<'a> MidiMessage<'a> { } } + /// Set the channel of the MIDI message, if applicable for the message type. + pub fn set_channel(&mut self, channel: Channel) { + match self { + MidiMessage::NoteOff(c, ..) => *c = channel, + MidiMessage::NoteOn(c, ..) => *c = channel, + MidiMessage::PolyphonicKeyPressure(c, ..) => *c = channel, + MidiMessage::ControlChange(c, ..) => *c = channel, + MidiMessage::ProgramChange(c, ..) => *c = channel, + MidiMessage::ChannelPressure(c, ..) => *c = channel, + MidiMessage::PitchBendChange(c, ..) => *c = channel, + _ => {} + } + } + #[inline(always)] fn new_sysex(bytes: &'a [u8]) -> Result { debug_assert!(bytes[0] == 0xF0); @@ -698,4 +712,15 @@ mod test { ); assert_eq!(MidiMessage::Start.channel(), None); } + + #[test] + fn set_channel() { + let mut msg = MidiMessage::ControlChange( + Channel::Ch8, + ControlFunction::DAMPER_PEDAL, + U7::try_from(55).unwrap(), + ); + msg.set_channel(Channel::Ch9); + assert_eq!(msg.channel(), Some(Channel::Ch9)); + } }