Skip to content

MIDI Implementation

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 FieldValueNotes
idVendor (VID)0x303AEspressif Systems — dev use; production PID via Espressif allocation (Phase 3)
idProduct (PID)TBDUnique product identifier within the VID namespace
iManufacturer”Tonifex”
iProduct”Timbre”Appears in DAW MIDI preferences
bcdDeviceFirmware versionDate-based: YYMM encoding (e.g., 0x2601 for 2026-01)
bDeviceClass0x01Audio
bDeviceSubClass0x03MIDI Streaming

Default CC assignments. The modulation routing matrix in the ESP32 firmware allows any CC to be mapped to any parameter on any voice.

CCFunctionRangeNotes
1Modulation wheel — LFO depth0–127
7Channel volume0–127
10Pan position0–12764 = center
71Resonance / Q0–127SC block capacitor ratio
74Filter cutoff (standard) / Slide (MPE)0–127MPE: oscillation mode morph
91Reverb send0–127If external effects chain present
120All Sound Off0Immediate silence
123All Notes Off0Release 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.

ConfigurationManager ChannelMember ChannelsUse Case
Full lower zone12–16 (15 voices)Single controller, full MPE expression
Split — lower + upper1, 162–8, 9–15 (7+7)Two controllers or keyboard split
Lower zone — reduced12–5 (4 voices)Phase 2 prototype (4 voices)
Standard MIDI (no MPE)1–16 independentLegacy controllers, multi-timbral use

Zone configuration transmitted via RPN 6 on the manager channel at USB enumeration:

Lower Zone, 15 members:
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 TypeRangeSet By
Manager±2 semitonesRPN 0 = 2
Member±48 semitonesRPN 0 = 48
ByteValueDescription
1F0Start of Exclusive
27D (dev) or registered IDManufacturer ID — 0x7D through Phase 2; registered MMA ID from Phase 3
3DDDevice ID (007F, or 7F for broadcast)
4CCCommand byte
5–NdataCommand-specific payload (7-bit encoded)
N+1F7End of Exclusive
CommandByteDirectionPayloadDescription
Version Query01Host -> TimbrenoneRequest firmware version
Version Reply02Timbre -> HostASCII string (7-bit)Firmware version, date-based
Patch Dump Request10Host -> Timbrepatch number (1 byte)Request a stored patch
Patch Dump11Eitherpatch data (7-bit encoded)Complete patch state
Patch Load12Host -> Timbrepatch number + dataWrite a patch to storage
Parameter Get20Host -> Timbrevoice ID + param IDQuery a single parameter
Parameter Set21Host -> Timbrevoice ID + param ID + valueSet a single parameter
Parameter Reply22Timbre -> Hostvoice ID + param ID + valueResponse to Parameter Get
Voice Architecture Query30Host -> Timbrevoice IDQuery current topology
Voice Architecture Reply31Timbre -> Hosttopology descriptorSC block configuration map
Diagnostic Register Read40Host -> Timbrevoice ID + register addrRead a PSoC register (debug)
Diagnostic Register Reply41Timbre -> Hostregister addr + valueRegister contents
Diagnostic Register Write42Host -> Timbrevoice ID + register addr + valueWrite a PSoC register (debug)

Standard MMA-format chart. This is the definitive compatibility reference for Timbre.

FunctionTransmittedRecognizedRemarks
Basic Channel1–161–16Default: 1 (standard), 1+2–16 (MPE)
ModeMode 3 (Poly)Mode 3, Mode 4 (MPE)Mode 4 = MPE mono-per-channel
Note Number0–127Musically useful: 24–108 (~5 octaves)
VelocityNote On/OffMaps to VCA gain + optional filter offset
Aftertouch — KeyYesPer-note: filter, VCA, or osc mode (MPE)
Aftertouch — ChannelYesGlobal: configurable target
Pitch BendYesPer-channel in MPE; SC clock ratio offset
CC 1YesModulation wheel — LFO depth
CC 7YesChannel volume
CC 10YesPan position
CC 71YesResonance / Q
CC 74YesFilter cutoff (standard) / Slide (MPE)
CC 91YesReverb send (if external)
CC 120YesAll Sound Off
CC 123YesAll Notes Off
RPN 6 (MCM)YesYesMPE Configuration Message (via CC 101/100/6)
Program ChangeYesPatch selection from stored presets
System ExclusiveYesYesSee SysEx Commands above
System CommonNot used
System Real Time — ClockYesOptional: LFO sync to external clock
System Real Time — Start/StopYesOptional: sequencer transport
Active SensingYesIf received, monitors for timeout
Universal SysEx — Identity ReplyYesResponds to Identity Request (Phase 1+)
StageUSB PathDIN PathNotes
Transport≤1 ms~1 msUSB: host poll interval. DIN: 3 bytes x 320 us
ESP32 MIDI parse~50 us~50 usRunning buffer, status detection, channel routing
Voice allocation~10 us~10 usRound-robin or lowest-available lookup
I2C write~200 us~200 us8 bytes at 400 kHz Fast Mode to target voice chip
PSoC register apply<12 us<12 usRegister write propagates to analog block config
SC settling~100 us~100 usSwitched-capacitor filter reaches steady state
Total (single voice)~1.3 ms~1.4 msWell 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).

StrategyBehaviorUse Case
Round-robinCycles through voices sequentiallyEven wear, predictable behavior
Lowest-availableUses the lowest-numbered free voiceConsistent voice-to-position mapping
Voice stealingSteals the oldest or quietest voiceDense playing, sustain pedal
Zone assignmentPre-assigns voice ranges to keyboard zonesSplit/layer configurations