MIDI 2.0 Song Sender

Example source: examples/device/midi2_device

USB MIDI 2.0 Device example that plays “Twinkle Twinkle Little Star” using native UMP (Universal MIDI Packet) format with full MIDI 2.0 expression.

MIDI 2.0 Features Demonstrated

  • 16-bit Velocity (vs 7-bit MIDI 1.0)

  • 32-bit Control Change values

  • 32-bit Pitch Bend (vs 14-bit MIDI 1.0)

  • 32-bit Channel Pressure (Aftertouch)

  • 32-bit Poly Pressure (Per-Note Aftertouch)

  • Per-Note Management (MIDI 2.0 exclusive)

  • Program Change with Bank Select

  • JR Timestamps

USB Descriptors

The device exposes both USB-MIDI 1.0 (Alt Setting 0) and USB-MIDI 2.0 (Alt Setting 1) as required by the USB-MIDI 2.0 specification. A MIDI 2.0 capable host (e.g. Windows MIDI Services) will select Alt Setting 1 for native UMP transport. Legacy hosts use Alt Setting 0 with automatic MIDI 1.0 fallback.

Interface

Class driver

0–1

MIDI 2.0 (audio control + MIDI streaming)

Configuration

Notable tusb_config.h settings:

#define CFG_TUD_MIDI2           1

Building

CMake:

mkdir build && cd build
cmake -DBOARD=raspberry_pi_pico ..
cmake --build .

Make:

make BOARD=raspberry_pi_pico all

Testing

Linux:

aseqdump -p "MIDI 2.0 Device"

Windows (MIDI 2.0 native):

midi endpoint list
midi endpoint monitor

Song Data

Twinkle Twinkle Little Star in C major, 120 BPM. Six phrases with dynamic shaping (pp to ff crescendo and back), pitch bend vibrato on sustained notes, and channel/poly pressure for expression. All values use genuine MIDI 2.0 resolution with no 7-bit equivalent.