midi2 0.11.1

Ergonomic, versatile, strong types wrapping MIDI 2.0 message data.
Documentation
MIDI 1.0 Channel Voice Messages

## Basic Usage

```rust
use midi2::{
    prelude::*,
    channel_voice1::ControlChange,
};

let mut message = ControlChange::<[u32; 4]>::new();
message.set_channel(u4::new(0xA));
message.set_group(u4::new(0xC));
message.set_control(u7::new(0x36));
message.set_control_data(u7::new(0x37));

assert_eq!(message.data(), &[0x2CBA_3637]);
assert_eq!(message.channel(), u4::new(0xA));
assert_eq!(message.group(), u4::new(0xC));
assert_eq!(message.control(), u7::new(0x36));
assert_eq!(message.control_data(), u7::new(0x37));
```

## Channeled

`channel_voice1` messages are [Channeled](crate::Channeled).

## Grouped

`channel_voice1` messages are [Grouped](crate::Grouped) 
when backed with [Ump](crate::buffer::Ump) buffers.

## Aggregate Message

There is a single aggregate [ChannelVoice1] enum type which
can represent an arbitrary `channel_voice1` message.

```rust
use midi2::{
    prelude::*,
    channel_voice1::ChannelVoice1,
};

let mut message = ChannelVoice1::try_from(&[0x2CBA_3637_u32][..]).expect("Valid data");

match message {
    ChannelVoice1::ChannelPressure(m) => println!("channel_pressure {:?}", m.data()),
    ChannelVoice1::ControlChange(m) => println!("control_change {:?}", m.data()),
    ChannelVoice1::KeyPressure(m) => println!("key_pressure {:?}", m.data()),
    ChannelVoice1::NoteOff(m) => println!("note_off {:?}", m.data()),
    ChannelVoice1::NoteOn(m) => println!("note_on {:?}", m.data()),
    ChannelVoice1::PitchBend(m) => println!("pitch_bend {:?}", m.data()),
    ChannelVoice1::ProgramChange(m) => println!("program_change {:?}", m.data()),
}
```

## Generic Over [Unit]crate::buffer::Unit

`channel_voice1` messages can also be represented with [Bytes](crate::buffer::Bytes) buffers
 as well as [Ump](crate::buffer::Ump) buffers.

```rust
use midi2::{
    prelude::*,
    channel_voice1::ControlChange,
};

let mut message = ControlChange::<[u8; 3]>::new();
message.set_channel(u4::new(0xA));
message.set_control(u7::new(0x36));
message.set_control_data(u7::new(0x37));

assert_eq!(message.data(), &[0xBA, 0x36, 0x37]);
```

## Fixed Size

All `channel_voice1` messages are Fixed size.

```rust
use midi2::channel_voice1::KeyPressure;


// All channel_voice1 bytes-backed messages fit into a `[u8; 3]`
let _ = KeyPressure::<[u8; 3]>::new();

// All channel_voice1 ump-backed messages fit into a `[u32; 1]`
let _ = KeyPressure::<[u32; 1]>::new();
```