midi2 0.11.1

Ergonomic, versatile, strong types wrapping MIDI 2.0 message data.
Documentation
MIDI System Common and System Real Time messages.

## Abstract over [Buffer]crate::buffer::Buffer

System Common and System Real Time messages can be represented
with classical MIDI byte arrays or with the MIDI 2.0 Universal 
Message Packet formats.

As such, types in this module are abstract over [Buffer](crate::buffer::Buffer).

When backed by a buffer with `Unit = u8` the underlying data is in the
byte stream format, and is backwards compatible with classical MIDI
standards.

```rust
use midi2::prelude::*;

let mut message = system_common::SongSelect::<[u8; 3]>::new();
message.set_song(u7::new(0x42));
assert_eq!(message.data(), &[0xF3, 0x42]);
```

And when backed by a buffer with `Unit = u32` the underlying data is 
encoded into Universal Message Packets.

```rust
use midi2::prelude::*;

let mut message = system_common::SongSelect::<[u32; 4]>::new();
message.set_song(u7::new(0x42));
message.set_group(u4::new(0x3));
assert_eq!(message.data(), &[0x13F3_4200]);
```

## Fixed Size

`system_common` messages always fit within an 
array of 'u32' size 1 or greater, when represented 
with a [Ump](crate::buffer::Ump) buffer.

```rust
use midi2::system_common::SongSelect;

let _ = SongSelect::<[u32; 1]>::new();
let _ = SongSelect::<[u32; 4]>::new();
```

`system_common` messages always fit within an 
array of 'u8' size 3 or greater, when represented 
with a [Bytes](crate::buffer::Bytes) buffer.

```rust
use midi2::system_common::SongSelect;

let _ = SongSelect::<[u8; 3]>::new();
```