Timbre’s MIDI implementation reference. For the MIDI protocol itself, see MIDI Protocol. For design rationale, see MIDI & MPE and On the Wire.
View as printable spec sheet →
MMA-standard MIDI Implementation Chart — designed for print or side-by-side comparison.
| Descriptor Field | Value | Notes |
|---|
| idVendor (VID) | 0x303A | Espressif Systems — dev use; production PID via Espressif allocation (Phase 3) |
| idProduct (PID) | TBD | Unique product identifier within the VID namespace |
| iManufacturer | ”Tonifex” | |
| iProduct | ”Timbre” | Appears in DAW MIDI preferences |
| bcdDevice | Firmware version | Date-based: YYMM encoding (e.g., 0x2601 for 2026-01) |
| bDeviceClass | 0x01 | Audio |
| bDeviceSubClass | 0x03 | MIDI Streaming |
Default CC assignments. The modulation routing matrix in the ESP32 firmware allows any CC to be mapped to any parameter on any voice.
| CC | Function | Range | Notes |
|---|
| 1 | Modulation wheel — LFO depth | 0–127 | |
| 7 | Channel volume | 0–127 | |
| 10 | Pan position | 0–127 | 64 = center |
| 71 | Resonance / Q | 0–127 | SC block capacitor ratio |
| 74 | Filter cutoff (standard) / Slide (MPE) | 0–127 | MPE: oscillation mode morph |
| 91 | Reverb send | 0–127 | If external effects chain present |
| 120 | All Sound Off | 0 | Immediate silence |
| 123 | All Notes Off | 0 | Release all held notes |
Lower Zone on channel 1 with 15 member channels (channels 2–16). Full per-note expression mapped to Timbre’s one-chip-per-voice architecture.
| Configuration | Manager Channel | Member Channels | Use Case |
|---|
| Full lower zone | 1 | 2–16 (15 voices) | Single controller, full MPE expression |
| Split — lower + upper | 1, 16 | 2–8, 9–15 (7+7) | Two controllers or keyboard split |
| Lower zone — reduced | 1 | 2–5 (4 voices) | Phase 2 prototype (4 voices) |
| Standard MIDI (no MPE) | — | 1–16 independent | Legacy controllers, multi-timbral use |
Zone configuration transmitted via RPN 6 on the manager channel at USB enumeration:
B0 65 00 CC#101 = 0 (RPN MSB) on channel 1
B0 64 06 CC#100 = 6 (RPN LSB) on channel 1
B0 06 0F CC#6 = 15 (Data Entry) on channel 1
| Channel Type | Range | Set By |
|---|
| Manager | ±2 semitones | RPN 0 = 2 |
| Member | ±48 semitones | RPN 0 = 48 |
| Byte | Value | Description |
|---|
| 1 | F0 | Start of Exclusive |
| 2 | 7D (dev) or registered ID | Manufacturer ID — 0x7D through Phase 2; registered MMA ID from Phase 3 |
| 3 | DD | Device ID (00–7F, or 7F for broadcast) |
| 4 | CC | Command byte |
| 5–N | data | Command-specific payload (7-bit encoded) |
| N+1 | F7 | End of Exclusive |
| Command | Byte | Direction | Payload | Description |
|---|
| Version Query | 01 | Host -> Timbre | none | Request firmware version |
| Version Reply | 02 | Timbre -> Host | ASCII string (7-bit) | Firmware version, date-based |
| Patch Dump Request | 10 | Host -> Timbre | patch number (1 byte) | Request a stored patch |
| Patch Dump | 11 | Either | patch data (7-bit encoded) | Complete patch state |
| Patch Load | 12 | Host -> Timbre | patch number + data | Write a patch to storage |
| Parameter Get | 20 | Host -> Timbre | voice ID + param ID | Query a single parameter |
| Parameter Set | 21 | Host -> Timbre | voice ID + param ID + value | Set a single parameter |
| Parameter Reply | 22 | Timbre -> Host | voice ID + param ID + value | Response to Parameter Get |
| Voice Architecture Query | 30 | Host -> Timbre | voice ID | Query current topology |
| Voice Architecture Reply | 31 | Timbre -> Host | topology descriptor | SC block configuration map |
| Diagnostic Register Read | 40 | Host -> Timbre | voice ID + register addr | Read a PSoC register (debug) |
| Diagnostic Register Reply | 41 | Timbre -> Host | register addr + value | Register contents |
| Diagnostic Register Write | 42 | Host -> Timbre | voice ID + register addr + value | Write a PSoC register (debug) |
Standard MMA-format chart. This is the definitive compatibility reference for Timbre.
| Function | Transmitted | Recognized | Remarks |
|---|
| Basic Channel | 1–16 | 1–16 | Default: 1 (standard), 1+2–16 (MPE) |
| Mode | Mode 3 (Poly) | Mode 3, Mode 4 (MPE) | Mode 4 = MPE mono-per-channel |
| Note Number | — | 0–127 | Musically useful: 24–108 (~5 octaves) |
| Velocity | — | Note On/Off | Maps to VCA gain + optional filter offset |
| Aftertouch — Key | — | Yes | Per-note: filter, VCA, or osc mode (MPE) |
| Aftertouch — Channel | — | Yes | Global: configurable target |
| Pitch Bend | — | Yes | Per-channel in MPE; SC clock ratio offset |
| CC 1 | — | Yes | Modulation wheel — LFO depth |
| CC 7 | — | Yes | Channel volume |
| CC 10 | — | Yes | Pan position |
| CC 71 | — | Yes | Resonance / Q |
| CC 74 | — | Yes | Filter cutoff (standard) / Slide (MPE) |
| CC 91 | — | Yes | Reverb send (if external) |
| CC 120 | — | Yes | All Sound Off |
| CC 123 | — | Yes | All Notes Off |
| RPN 6 (MCM) | Yes | Yes | MPE Configuration Message (via CC 101/100/6) |
| Program Change | — | Yes | Patch selection from stored presets |
| System Exclusive | Yes | Yes | See SysEx Commands above |
| System Common | — | — | Not used |
| System Real Time — Clock | — | Yes | Optional: LFO sync to external clock |
| System Real Time — Start/Stop | — | Yes | Optional: sequencer transport |
| Active Sensing | — | Yes | If received, monitors for timeout |
| Universal SysEx — Identity Reply | Yes | — | Responds to Identity Request (Phase 1+) |
| Stage | USB Path | DIN Path | Notes |
|---|
| Transport | ≤1 ms | ~1 ms | USB: host poll interval. DIN: 3 bytes x 320 us |
| ESP32 MIDI parse | ~50 us | ~50 us | Running buffer, status detection, channel routing |
| Voice allocation | ~10 us | ~10 us | Round-robin or lowest-available lookup |
| I2C write | ~200 us | ~200 us | 8 bytes at 400 kHz Fast Mode to target voice chip |
| PSoC register apply | <12 us | <12 us | Register write propagates to analog block config |
| SC settling | ~100 us | ~100 us | Switched-capacitor filter reaches steady state |
| Total (single voice) | ~1.3 ms | ~1.4 ms | Well under 3 ms perceptibility threshold |
Each additional voice in a polyphonic chord adds ~200 us (sequential I2C). A six-note chord totals ~2.2 ms (USB) or ~2.3 ms (DIN).
| Strategy | Behavior | Use Case |
|---|
| Round-robin | Cycles through voices sequentially | Even wear, predictable behavior |
| Lowest-available | Uses the lowest-numbered free voice | Consistent voice-to-position mapping |
| Voice stealing | Steals the oldest or quietest voice | Dense playing, sustain pedal |
| Zone assignment | Pre-assigns voice ranges to keyboard zones | Split/layer configurations |