Behringer TD-3 MIDI Implementation
Unofficial Documentation

Preface

This is a collection of notes from looking at the TD-3 synthesizer's external MIDI communication. It is not any sort of official documentation, and may be lacking information or outright incorrect. Use at your own risk, and subject to the terms and conditions of this site.

Documented by Brad Isbell, AudioPump, Inc.. Originally tested in February 2020 with a TD-3 v1.2.4, and updated through June 2021 with v1.3.7. Please e-mail me with any corrections or questions. If you find these notes useful in your project, please link back to this site!

Many thanks to Jurgen from Eindhoven for notes on polychaining, test modes, and others.

Ports

The TD-3 features a class-compliant USB MIDI interface, as well as MIDI DIN In and Out/Thru ports.

Both USB MIDI and MIDI DIN interfaces can be used to trigger notes and synchronization. However, most SysEx messages can only be sent over the USB MIDI interface. That is, if you want to change a pattern, you must use USB.

MIDI Thru Behavior

Messages to the MIDI DIN Input on the TD-3 will be copied to the MIDI DIN Output and MIDI USB Output.

Messages to the MIDI USB Input on the TD-3 will be copied to the MIDI DIN Output only.

MIDI Clock Synchronization

Standard MIDI System Real-Time messages are used to synchronize over MIDI. These are short single-byte messages.

Start

Begins the sequence playback.

FB

Stop

Ends the sequence playback.

FC

Clock

Indicates the timing pulse for tempo synchronization. Normally, there are 24 pulses per quarter note. However, this can be changed on the TD-3 by pressing the 'Back' and 'Write/Next' buttons simultaneously, and then pressing buttons 5 through 8 as appropriate.

F8

The TD-3 will only respond to start/stop messages from the source it is synchronizing to. That is, if you want to control start/stop from the USB MIDI interface, the USB MIDI interface must be sync master, and must also emit clock pulses.

Note On/Off

These messages are standard MIDI.

To turn on a note:

90 30 4F

To turn off that note:

80 30 00

You can find more about these basic MIDI messages on MIDI.org.

Slides

Slides are triggered over MIDI by holding one note and starting the next note before letting go of the first. Firmware v1.2.6 is required for proper-sounding slides. Earlier firmware versions have broken slide implementations.

Patterns, Configuration, etc.

All of the additional features of the TD-3 are done via SysEx messages.

MIDI SysEx messages always start with 0xF0 and end with 0xF7.

All SysEx messages to and from the TD-3 begin with a consistent identifying sequence for bytes 0x01 through 0x06:

00 20 32 00 01 0A

No messages have checksums.

8-bit values spread over two bytes are very common. It is suspected that this is how Behringer avoids having to deal with 7-bit values. (The most significant bit can't normally be used in MIDI messages, as it indicates a System Realtime message.) Rather than limiting to 7 bits, it seems that 8-bit values are just split into their upper 4 bits in the first byte, and lower 4 bits in the next byte. For example, consider this sequence:

0x01 0x0F

This should be considered as the value 0x1F.

(Also note that this is big-endian. There are a couple exceptions to endianness later in the document.)

Model and Firmware

Get Model Code

F0 00 20 32 00 01 0A 04 F7

Get Model Gode Response

F0 00 20 32 00 01 0A 05 50 30 44 54 44 00 F7
0x07 - NULL BYTE: ASCII string identifying the model code (i.e. P0DTD)

Get Product Name

F0 00 20 32 00 01 0A 06 F7

Get Product Name Response

F0 00 20 32 00 01 0A 07 54 44 2D 33 00 F7
0x07 - NULL BYTE: ASCII string identifying the product name (i.e. TD-3)

Get Firmware Version Request

F0 00 20 32 00 01 0A 08 00 F7

Get Firmware Version Response

F0 00 20 32 00 01 0A 09 00 01 02 04 F7
0x09: Major Version
0x0A: Minor Version
0x0B: Revision

In this example, the firmware version is 1.2.4.

Patterns

Request Pattern

F0 00 20 32 00 01 0A 77 00 00 F7
0x07: Request Pattern Command (always 0x77 for this request)
0x08: Pattern Group (0-3)
0x09: Pattern Section/Pattern (A=1-8, B=9-16)

Response

F0 00 20 32 00 01 0A 78 00 01 00 00 02 04 02 03
02 04 02 03 02 04 02 03 02 04 02 03 02 04 02 03
02 04 02 03 02 04 02 03 02 04 02 03 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 01
00 01 00 01 00 01 00 01 00 01 00 01 00 01 00 01
00 01 00 01 00 01 00 01 00 01 00 01 00 00 01 00
00 00 0F 0F 0F 0F 00 00 00 00 F7
0x07: Pattern Command (always 0x78 for this response)
0x08: Pattern Group (0-3)
0x09: Pattern Section/Pattern (A=1-8, B=9-16)
0x0A - 0x0B: ???
  Always observed as 0x0000
0x0C - 0x2B: Pitches
  2 bytes each, 16 steps total
  MSB = 0x00 through 0x02
  LSB = 0x00 through 0x0F
  Pitch is one octave lower than MIDI standard.
  Pitches entered with the high 'C' on the TD-3 keyboard have their top bit set
  high.  Therefore, you'll want to bitwise AND the value against 0x7F to get
  a proper pitch value.  There is no need to re-create this behavior.  Setting
  pitch values without it appears to work just fine on the TD-3.
  Null/inactive pitches are canonically set to 'C2' (MIDI 'C1' value of 0x18).
  (It may not be required to set them to 0x18.)
0x2C - 0x4B: Accent
  2 bytes each, 16 steps total
  MSB = 0x00 (always)
  LSB = 0x00 or 0x01 (boolean)
0x4C - 0x6B: Slide
  2 bytes each, 16 steps total
  MSB = 0x00 (always)
  LSB = 0x00 or 0x01 (boolean)
0x6C - 0x6D: Triplet Mode
  MSB = 0x00 (always)
  LSB = 0x00 or 0x01 (boolean)
0x6E - 0x6F: Step Count
  MSB = 0x00 through 0x01
  LSB = 0x01 through 0x0F
0x70 - 0x71: ???
  Always observed as 0x0000
0x72 - 0x75: Tie
  See Rest for format.
0x76 - 0x79: Rest
  Bitmask, with only least significant nibble used.  Layout is like this:
    xxxx7654 xxxx3210 xxxxFEDC xxxxBA98
  For example, to set a rest for each step:
    00001111 00001111 00001111 00001111 (0x0F0F0F0F)
  To turn on/un-rest only the first step:
    00001111 00001110 00001111 00001111 (0x0F0E0F0F)
  To turn on/un-rest the last four steps, in addition to the first:
    00001111 00001110 00000000 00001111 (0x0F0E000F)

Put Pattern

The exact same SysEx message that comes back in the response to fetching a pattern can be used to set that pattern as well. There is nothing special. Simply re-play the pattern back to the synthesizer and it will save it.

Configuration

Get Configuration Request

F0 00 20 32 00 01 0A 75 F7

Get Configuration Response

F0 00 20 32 00 01 0A 76 00 08 0C 02 02 00 01 02 03 46 F7
0x08: MIDI Out Channel [0x00-0x0F]
0x09: MIDI In Channel [0x00-0x0F]
0x0A: MIDI Transpose [-12 <0x00> to 0 <0x0C> to +12 <0x18>]
0x0B: Pitch Bend Semitones (0-12)
0x0C: Key Priority <enum>
  0x00 - Low
  0x01 - High
  0x02 - Last
0x0D: Multi-Trigger Mode <bool>
0x0E: Clock Trigger Polarity <enum>
  0x00 - Fall
  0x01 - Rise
0x0F: Clock Trigger Rate <enum>
  0x00 - 1 PPS
  0x01 - 2 PPQ
  0x02 - 24 PPQ
  0x08 - 48 PPQ
0x10: Clock Source <enum>
  0x00 - Internal
  0x01 - MIDI DIN
  0x02 - MIDI USB
  0x03 - Trigger
0x11: Accent Velocity Threshold (0 to 127)

Set MIDI In/Out Channel

F0 00 20 32 00 01 0A 0E 01 00 03 F7
0x08: MIDI Out Channel [0x00-0x0F]
0x0A: MIDI In Channel [0x00-0x0F]

Set Key Priority

F0 00 20 32 00 01 0A 12 02 F7
0x08: Key Priority <enum>
  0x00 - Low
  0x01 - High
  0x02 - Last

Set Pitch Bend Semitones

F0 00 20 32 00 01 0A 11 03 00 F7
0x08: Pitch Bend Semitones (0-12)
0x09: ??? (always 0x00)

Set Multi-Trigger

F0 00 20 32 00 01 0A 14 01 00 F7
0x08: Multi-Trigger Mode <bool>

Set Accent Velocity Threshold

MIDI notes with velocity above this value will be treated as an accent.

F0 00 20 32 00 01 0A 1C 66 F7
0x08: Accent Velocity Threshold (0-127)

Set MIDI Input Transpose

F0 00 20 32 00 01 0A 0F 11 F7
0x08: MIDI Input Transpose (semitones)
-12 (0x00) to +12 (0x18)

Set Sequencer Clock Source

F0 00 20 32 00 01 0A 1B 03 F7
0x08: Clock Source <enum>
  0x00 - Internal
  0x01 - MIDI DIN
  0x02 - MIDI USB
  0x03 - Trigger

Set Sequencer Clock Trigger Rate

This setting is only valid when the clock source is set to 'Trigger' (0x03).

F0 00 20 32 00 01 0A 1A 02 F7
0x08: Clock Source Trigger Rate <enum>
  0x00 - 1 PPS
  0x01 - 2 PPQ
  0x02 - 24 PPQ
  0x03 - 48 PPQ

Set Sequencer Clock Trigger Polarity

This setting is only valid when the clock source is set to 'Trigger' (0x03).

F0 00 20 32 00 01 0A 19 01 F7
0x08: Clock Source Trigger Polarity <enum>
  0x00 - Fall
  0x01 - Rise

Configuration Set Response

After any of the above configuration set statements, the TD-3 will respond the same messsage:

F0 00 20 32 00 01 0A 01 00 00 F7

Reset Configuration Request

Resets all the configuration of the TD-3 to factory defaults. (Leaves patterns intact.)

F0 00 20 32 00 01 0A 7D F7

There is no response for this message.

Modes

Test Mode Request

Sets the TD-3 into a panel test mode where all buttons and the tempo, track, and mode knobs send MIDI data to verify their operation.

F0 00 20 32 00 01 0A 50 01 F7

Test Mode Response

A0 00 00-A0 7F 1F   Tempo Knob
                    Last two bytes are little-endian, 7-bits per byte.

A1 00 00-A1 7F 1F   Track/Pattern Group Knob
                    Last two bytes are little-endian, 7-bits per byte.
                    NOTE: This knob is ANALOG.  Each click is an approximation.
                    You will see values in-between clicks.  Also note that this
                    knob is backwards, so as you turn to the right, values will
                    go down.

A2 ?? ??-A2 ?? ??   Mode Knob
                    See notes for previous knobs.  Full range of this knob is
                    known, as it is physically limited from turning further.
                    You can probably get the full range, but it may vary from
                    unit to unit.

A4 01 01   Start/Stop On
A4 01 00   Start/Stop Off

A4 00 01   Clear On (main LED turns green, synth sounds)
A4 00 00   Clear Off

A4 03 01   Bar On
A4 03 00   Bar Off

A4 02 01   Pitch Mode On
A4 02 00   Pitch Mode Off

A4 04 01   C0 On
A4 04 00   C0 Off

A4 05 01   C♯ On
A4 05 00   C♯ Off

A4 06 01   D On
A4 06 00   D Off

A4 07 01   D♯ On
A4 07 00   D♯ Off

A4 08 01   E On
A4 08 00   E Off

A4 09 01   F On
A4 09 00   F Off

A4 0A 01   F♯ On
A4 0A 00   F♯ Off

A4 0B 01   G On
A4 0B 00   G Off

A4 0C 01   G♯ On
A4 0C 00   G♯ Off

A4 0D 01   A On
A4 0D 00   A Off

A4 0E 01   A♯ On
A4 0E 00   A♯ Off

A4 0F 01   B On
A4 0F 00   B Off

A4 10 01   C1 On
A4 10 00   C1 Off

A4 11 01   Step On
A4 11 00   Step Off

A4 12 01   Triplet On
A4 12 00   Triplet Off

A4 13 01   Pattern A On
A4 13 00   Pattern A Off

A4 15 01   Pattern B On
A4 15 00   Pattern B Off

A4 14 01   Slide On
A4 14 00   Slide Off

A4 17 01   Write/Next On (main LED turns yellow, synth sounds)
A4 17 00   Write/Next Off

A4 16 01   Back On (main LED turns red, synth sounds)
A4 16 00   Back Off

Test Mode Exit

F0 00 20 32 00 01 0A 50 00 F7

USB MIDI Loopback Request

Enables echoing back MIDI messages from input to output.

F0 00 20 32 00 01 0A 7E F7

USB MIDI Loopback Response

F0 00 20 32 00 01 0A 7E 00 00 01 00 02 F7

Firmware Update / DFU Mode

Danger: Don't brick your synthesizer! Don't do this unless you're prepared to brick your synthesizer! The proper way to do a firmware update is with the official SYNTHTRIBE software. Proceed at your own risk!

To enter DFU mode:

F0 00 20 32 00 01 0A 03 30 F7

The synth will reboot and switch from its normal PnP IDs (VID 1397/PID 1226) to VID 1397/PID 1227. All LEDs will be lit.

Proceed with sending your firmware SysEx file, message by message. The TD-3 will ACK each message with this response:

F0 00 20 32 00 01 0A 01 00 00 F7

Do not send the SysEx too fast. Ideally, wait for each ACK before proceeding with the next SysEx message.

When the firmware file has been fully sent, the TD-3 will reboot.

Updated: June 28, 2021