Files
tinyusb/examples/device/midi2_device
Saulo Veríssimo 290470bda3 example: add MIDI 2.0 Device example (midi2_device)
Add Device example that plays Twinkle Twinkle Little Star using native
UMP format. Demonstrates all MIDI 2.0 Channel Voice message types:
16-bit velocity, 32-bit CC, 32-bit pitch bend, 32-bit channel/poly
pressure, per-note management, program change with bank select, and
JR timestamps.

USB descriptor exposes both Alt Setting 0 (MIDI 1.0) and Alt Setting 1
(UMP) per USB-MIDI 2.0 specification.

Tested on: Raspberry Pi Pico (RP2040), Linux (ALSA), Windows (MIDI
Services)
2026-05-12 11:07:44 -03:00
..

MIDI 2.0 Song Sender

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 Descriptor

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.

Hardware

  • Any RP2040 board with USB (e.g. Raspberry Pi Pico)
  • LED on GPIO 25: steady = playing, slow blink = waiting for host

Building

mkdir build && cd build
cmake -DBOARD=raspberry_pi_pico -DPICO_SDK_FETCH_FROM_GIT=on -G Ninja ..
cmake --build .

Flashing

Hold BOOTSEL, connect USB, drag midi2_device.uf2 to the RPI-RP2 drive.

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.