Communicating with the Play Electric
Auto-generated from param-defs.js — only verified, user-facing parameters are listed. For Play Acoustic, see the Play Acoustic reference.
Introduction
The TC Helicon Play Electric is a vocal and guitar effects processor that connects to a computer via USB. While it appears as a standard USB MIDI device, it does not respond to conventional MIDI messages like Control Change (CC) or Program Change (PC). Instead, all device control happens through SysEx (System Exclusive) messages — a part of the MIDI specification designed for manufacturer-specific communication.
Standard MIDI vs SysEx
Standard MIDI messages are short (1–3 bytes) and well-defined: Note On, Note Off, Control Change, Program Change. Most MIDI devices respond to these — for example, sending a Program Change to a guitar pedal typically switches presets. The Play Electric sends these messages (CC#28 for HIT, CC#32 + PC for preset changes, CC#102–107 for footswitches) but ignores them when received.
SysEx messages are variable-length, manufacturer-specific data packets that can carry anything — preset data, configuration, firmware updates. They start with F0 (SysEx start) and end with F7 (SysEx end), with all data bytes between limited to 7-bit values (0x00–0x7F). This means regular 8-bit data must be encoded into 7-bit format.
How the Play Electric Communicates
All messages to and from the device use the TC Helicon SysEx header:
F0 00 01 38 00 71 [command] [data...] F7
│ │ │ │
│ │ │ └─ Play Electric device ID (0x71)
│ │ └──── Device group (0x00)
│ └───────────── Manufacturer ID (TC Helicon = 00 01 38)
└──────────────── SysEx start
00 60 is the bootloader. Sending messages with this header will put the device in firmware update mode, requiring a power cycle to recover.What the Device Sends (outgoing standard MIDI)
- Program Change + Bank Select (CC#32) — when you switch presets on the device
- CC#28 — when HIT is toggled on or off
- CC#102–107 — when footswitches are pressed (requires Switch-3 or Switch-6 pedal configured to send MIDI)
What the Device Accepts (incoming SysEx only)
- Preset loading — the full preset (header + 4 data packets) must be transmitted. There is no "switch to preset N" command.
- Global settings — read and write the device's setup data (HIT state, guitar effects, pitch correction, looper input, etc.) via a read-modify-write cycle.
This is the same protocol that TC Helicon's VoiceSupport 2 application uses. Everything documented here was reverse-engineered by capturing and comparing data packets between VoiceSupport and the device.
Setup Parameter Map (Global Settings)
Global setup is stored in 7 packets of 112 bytes each (0x13 command). Each parameter has a logical index s<n> used by the editor; the underlying byte positions are handled by tch-format.js.
Read: BeginSync → RequestSetup (0x15 00) → receive 7 packets → EndSync
Write: BeginSync → RequestSetup → receive 7 packets → send 7 modified packets (30ms apart) → ACK → EndSync. Read and write must be in the same sync session.
Checksum: (sum of raw bytes 10–109) % 128, stored at raw byte 110.
| Index | Name | Group | Range / Options |
|---|---|---|---|
s5 | Out Level | Setup: Mixer | -36–0 dB (-36=Off) |
s6 | Headphone Level | Setup: Mixer | -61–0 dB (-61=Off) |
s8 | Guitar Level | Setup: Mixer | -31–24 dB (-31=Off) |
s9 | USB Level | Setup: Mixer | -36–0 dB (-36=Off) |
s10 | Delay/Reverb Level | Setup: Mixer | -36–0 dB (-36=Off) |
s11 | Harmony Level | Setup: Mixer | -36–0 dB (-36=Off) |
s16 | Output | Setup: Output | 0=Stereo, 1=Mono, 2=Dual Mono |
s26 | Pitch Correction | Setup: Vocal | 0–100 % |
s27 | Mic Type | Setup: Vocal | 0=Dynamic Mic, 1=Condenser Mic, 2=MP-75 Mic, 3=E835FX Mic, 4=MP-76 Mic, 5=USB |
s28 | RoomSense | Setup: Vocal | 0=Off, 1=Ambient, 2=Ambient/Auto, 3=Voice |
s29 | Aux Level | Setup: Mixer | -36–0 dB (-36=Off) |
s30 | RoomSense Level | Setup: Mixer | -36–0 dB (-36=Off) |
s41 | Tune Reference | Setup: Device | 830–930 Hz |
s42 | Guitar Input Level | Setup: Guitar | 0–24 dB |
s43 | Global Guitar FX | Setup: Guitar | 0 = Off, 1 = On |
s44 | Global Key | Setup: Device | 0 = Off, 1 = On |
s46 | Global Tempo | Setup: Device | 0 = Off, 1 = On |
s47 | Lead Delay | Setup: Vocal | 0=None, 1=Voice Sync, 2=Auto |
s48 | Lead Mute | Setup: Vocal | 0 = Off, 1 = On |
s50 | LCD Contrast | Setup: Device | 0–5 |
s51 | Up/Down Function | Setup: Device | 0=Looping, 1=Set Key |
s52 | Loop Feedback | Setup: Looper | 0–100 % |
s56 | Out Level | Setup: Output | 0=Mic, 1=Line |
s59 | Tone Style | Setup: Vocal | 0=Off, 1=Normal, 2=Less Bright, 3=Norm+Warmth, … (9 total) |
s60 | Aux In Type | Setup: Device | 0=Live, 1=Tracks, 2=Monitor |
s61 | Loop Input | Setup: Looper | 0=Guitar, 1=Lead, 2=Aux, 3=Lead+Guitar, … (7 total) |
s65 | Vocal Cancel | Setup: Vocal | 0 = Off, 1 = On |
s66 | Guitar Gate | Setup: Guitar | -81–0 dB (-81=Off) |
s70 | Speaker Sim | Setup: Guitar | 0 = Off, 1 = On |
s75 | Mic Boost | Setup: Device | 0=Off, 1=Low, 2=High |
s85 | RoomSense LoCut | Setup: Device | 0–112 Hz |
s91 | Footswitch | Setup: Controls | 0=Switch-3, 1=Switch-6 |
SysEx Commands
All messages use header: F0 00 01 38 00 71 [command] [data] F7
00 60 is the bootloader. Never send messages with this header.| Command | Direction | Args | Response | Purpose |
|---|---|---|---|---|
0x57 00 00 | Host → Device | — | — | Begin sync session |
0x57 00 01 | Host → Device | — | — | End sync session |
0x15 00 | Host → Device | — | 7× 0x13 | Request global setup |
0x45 | Host → Device | bank, preset# | 0x20 + 4× 0x21 | Request full preset |
0x46 | Host → Device | bank, preset# | 0x20 | Request preset header only |
0x47 | Host → Device | bank, preset# | 0x22 | Request preset metadata |
0x50 | Host → Device | bank, preset# | 0x34 | Delete preset slot |
0x13 | Host → Device | 104 bytes | 0x34 | Write setup packet (×7) |
0x20 | Host → Device | header data | — | Write preset header |
0x21 | Host → Device | chunk data | 0x34 | Write preset data (×4) |
0x7E | Both | varies | 0x7E | Identity / handshake |
0x34 | Device → Host | status | — | Acknowledgement |
Preset Parameter Map
Each preset consists of 4 data packets (0x21), each containing 25 parameters encoded as 4-byte 28-bit signed integers. Parameters are indexed 0–99 across the 4 packets.
Encoding: Each parameter uses 4 bytes in 7-bit MIDI format (28-bit signed). val = ((b0 & 0x7F) << 21) | ((b1 & 0x7F) << 14) | ((b2 & 0x7F) << 7) | (b3 & 0x7F). If val ≥ 0x08000000, subtract 0x10000000 for negative values.
Packet structure: F0 00 01 38 00 71 21 [chunk#] [100 bytes data] [checksum] F7 = 110 bytes total.
Header packet: F0 00 01 38 00 71 20 [bank] [num] 01 0x03 [16-byte name] [tags] [meta] 01 F7. Byte 10 (0x03) is the preset format version — must match the device's own value or the write is silently dropped.
Packet 0 (Params 0–24)
| Index | Name | Group | Firmware ID | Range / Options | Byte Offset |
|---|---|---|---|---|---|
| 0 | Style | Guitar FX: Amp | EXP_AMP_STYLE_GUITAR | 0=Clean Brit, 1=Cali Clean, 2=UK Clean, 3=Deep Clean, … (26 total) | 8 |
| 1 | Bass | Guitar FX: Amp | EXP_AMP_BASS_GUITAR | -9–9 dB | 12 |
| 2 | Mid | Guitar FX: Amp | EXP_AMP_MID_GUITAR | -9–9 dB | 16 |
| 3 | Mid Freq | Guitar FX: Amp | EXP_AMP_MID_FREQ_GUITAR | 0–255 | 20 |
| 4 | Treble | Guitar FX: Amp | EXP_AMP_TREBLE_GUITAR | -9–9 dB | 24 |
| 5 | Gate Threshold | Vocal FX: Transducer | EXP_TRANSDUCER_GATE_THRESHOLD | -50–0 dB | 28 |
| 6 | Style | Vocal FX: Harmony | EXP_HARMONY_STYLE | 0=High, 1=Higher, 2=Low, 3=Lower, … (28 total) | 32 |
| 7 | Key | Vocal FX: Harmony | EXP_HARMONY_KEY | 0=Auto, 1=C, 2=C#/Db, 3=D, … (13 total) | 36 |
| 8 | Scale | Vocal FX: Harmony | EXP_HARMONY_SCALE | 0=Major 1, 1=Major 2, 2=Major 3, 3=Minor 1, 4=Minor 2, 5=Minor 3 | 40 |
| 9 | Style | Vocal FX: Double | EXP_DOUBLE_STYLE | 0=1 Voice Tight, 1=1 Voice Loose, 2=2 Voices Tight, 3=2 Voices Loose, … (10 total) | 44 |
| 10 | Level | Vocal FX: Harmony | EXP_HARMONY_LEVEL | -36–0 dB (-36=Off) | 48 |
| 11 | Level | Vocal FX: Double | EXP_DOUBLE_LEVEL | -36–0 dB (-36=Off) | 52 |
| 12 | Level | Vocal FX: µMod | EXP_MICROMOD_LEVEL | -51–0 dB (-51=Off) | 56 |
| 13 | Level | Vocal FX: Delay | EXP_DELAY_LEVEL | -51–0 dB (-51=Off) | 60 |
| 14 | Level | Vocal FX: Reverb | EXP_REVERB_LEVEL | -51–0 dB (-51=Off) | 64 |
| 15 | Level | Guitar FX: Delay | EXP_DELAY_LEVEL_GUITAR | -51–0 dB (-51=Off) | 68 |
| 16 | Level | Guitar FX: Reverb | EXP_REVERB_LEVEL_GUITAR | -51–0 dB (-51=Off) | 72 |
| 22 | Style | Vocal FX: µMod | EXP_MICROMOD_STYLE | 0=Micromod Clone, 1=Micromod Wider, 2=Thicken, 3=Light Chorus, … (24 total) | 96 |
| 23 | Style | Guitar FX: µMod | EXP_MICROMOD_STYLE_GUITAR_PRESET | 0=Corona Chorus, 1=Corona Fast, 2=Corona Slow, 3=Vortex Flanger, … (17 total) | 100 |
| 24 | Speed | Vocal FX: µMod | EXP_MICROMOD_SPEED | 0–1000 Hz | 104 |
Packet 1 (Params 25–49)
| Index | Name | Group | Firmware ID | Range / Options | Byte Offset |
|---|---|---|---|---|---|
| 25 | Speed | Guitar FX: µMod | EXP_MICROMOD_SPEED_GUITAR | 0–1000 Hz | 8 |
| 26 | Style | Vocal FX: Delay | EXP_DELAY_STYLE | 0=Quarter, 1=Eighth, 2=Triplet, 3=Dotted 1/8th, … (18 total) | 12 |
| 27 | Style | Guitar FX: Delay | EXP_DELAY_STYLE_GUITAR_PRESET | 0=Flashback 2290, 1=Flashback Analog, 2=Flashback Tape, 3=Flashback Lofi, … (16 total) | 16 |
| 28 | Tempo | Vocal FX: Delay | EXP_DELAY_TEMPO | 40–300 BPM | 20 |
| 29 | Time L | Vocal FX: Delay | EXP_DELAY_DELAYTIME_L | 1–1500 ms | 24 |
| 30 | Time L | Guitar FX: Delay | EXP_DELAY_DELAYTIME_L_GUITAR | 0–1500 ms | 28 |
| 31 | Time R | Vocal FX: Delay | EXP_DELAY_DELAYTIME_R | 1–1500 ms | 32 |
| 32 | Time R | Guitar FX: Delay | EXP_DELAY_DELAYTIME_R_GUITAR | 0–1500 ms | 36 |
| 33 | Feedback | Vocal FX: Delay | EXP_DELAY_FEEDBACK | 0–100 % | 40 |
| 34 | Feedback | Guitar FX: Delay | EXP_DELAY_FEEDBACK_GUITAR | 0–100 % | 44 |
| 35 | Filter Style | Vocal FX: Delay | EXP_DELAY_FILTER_STYLE | 0=Digital, 1=Tape, 2=Analog, 3=Radio, … (13 total) | 48 |
| 36 | Filter Style | Guitar FX: Delay | EXP_DELAY_FILTER_STYLE_GUITAR | 0=Digital, 1=Tape, 2=Analog, 3=Radio, … (13 total) | 52 |
| 37 | Style | Vocal FX: Reverb | EXP_REVERB_STYLE | 0=Smooth Plate, 1=Reflection Plate, 2=Thin Plate, 3=Bright Plate, … (28 total) | 56 |
| 38 | Style | Guitar FX: Reverb | EXP_REVERB_STYLE_GUITAR_PRESET | 0=HoF - Hall, 1=HoF - Plate, 2=HoF - Room, 3=HoF - Church, … (36 total) | 60 |
| 39 | Decay | Vocal FX: Reverb | EXP_REVERB_DECAY | 91–290 s | 64 |
| 40 | Decay | Guitar FX: Reverb | EXP_REVERB_DECAY_GUITAR | 0–290 s | 68 |
| 41 | Style | Vocal FX: Transducer | EXP_TRANSDUCER_STYLE | 0=Megaphone, 1=Radio, 2=On The Phone, 3=Overdrive, … (8 total) | 72 |
| 42 | Control | Vocal FX: Transducer | EXP_BLOCK_TRANSDUCER | 0=Off, 1=On, 2=HIT | 76 |
| 43 | Drive | Vocal FX: Transducer | EXP_TRANSDUCER_DRIVE | 0–100 % | 80 |
| 44 | Gain | Vocal FX: Transducer | EXP_TRANSDUCER_GAIN | -20–10 dB | 84 |
| 45 | Filter | Vocal FX: Transducer | EXP_TRANSDUCER_FILTER | 0–100 | 88 |
| 46 | Style | Vocal FX: HardTune | EXP_HARDTUNE_STYLE | 0=Pop, 1=Country Gliss, 2=Robot, 3=Correct Natural, … (7 total) | 92 |
| 47 | Shift | Vocal FX: HardTune | EXP_HARDTUNE_SHIFT | -36–36 semi | 96 |
| 48 | Gender | Vocal FX: HardTune | EXP_HARDTUNE_GENDER | -50–50 | 100 |
| 49 | Mix | Guitar FX: µMod | EXP_MICROMOD_MIX_GUITAR | 0–100 | 104 |
Packet 2 (Params 50–74)
| Index | Name | Group | Firmware ID | Range / Options | Byte Offset |
|---|---|---|---|---|---|
| 50 | Control | Vocal FX: µMod | EXP_BLOCK_MICROMOD | 0=Off, 1=On, 2=HIT | 8 |
| 51 | Control | Vocal FX: Delay | EXP_BLOCK_DELAY | 0=Off, 1=On, 2=HIT | 12 |
| 52 | Control | Vocal FX: Reverb | EXP_BLOCK_REVERB | 0=Off, 1=On, 2=HIT | 16 |
| 53 | Control | Vocal FX: Harmony | EXP_BLOCK_HARMONY | 0=Off, 1=On, 2=HIT | 20 |
| 54 | Control | Vocal FX: Double | EXP_BLOCK_DOUBLE | 0=Off, 1=On, 2=HIT | 24 |
| 55 | Routing | Vocal FX: Transducer | EXP_TRANSDUCER_ROUTING | 0=Output, 1=FX | 28 |
| 56 | Control | Vocal FX: HardTune | EXP_BLOCK_HARDTUNE | 0=Off, 1=On, 2=HIT | 32 |
| 57 | Style | Guitar FX: Comp | EXP_COMP_STYLE_GUITAR | 0=Subtle Tube, 1=Subtle Sustain, 2=Sustain Attack, 3=Sustain Pop | 36 |
| 58 | Amount | Guitar FX: Comp | EXP_COMP_AMOUNT_GUITAR | 0–100 | 40 |
| 59 | Makeup | Guitar FX: Comp | EXP_COMP_MAKEUP_GUITAR | 0–24 dB | 44 |
| 60 | Drive | Guitar FX: Amp | EXP_AMP_DRIVE_GUITAR | -25–50 | 48 |
| 61 | Level | Guitar FX: Amp | EXP_AMP_LEVEL_GUITAR | -25–18 dB | 52 |
| 64 | Control | Guitar FX: Delay | EXP_BLOCK_DELAY_GUITAR | 0=Off, 1=On, 2=HIT | 64 |
| 65 | Control | Guitar FX: Reverb | EXP_BLOCK_REVERB_GUITAR | 0=Off, 1=On, 2=HIT | 68 |
| 66 | Control | Guitar FX: µMod | EXP_BLOCK_MICROMOD_GUITAR | 0=Off, 1=On, 2=HIT | 72 |
| 67 | Control | Guitar FX: Comp | EXP_BLOCK_COMP_GUITAR | 0=Off, 1=On, 2=HIT | 76 |
| 68 | Control | Guitar FX: Amp | EXP_BLOCK_AMP_GUITAR | 0=Off, 1=On, 2=HIT | 80 |
| 69 | Division | Guitar FX: Delay | — | 0–20 | 84 |
| 70 | Humanize | Vocal FX: Harmony | EXP_HARMONY_HUMANIZE | 0–100 | 88 |
| 71 | Portamento | Vocal FX: Harmony | EXP_HARMONY_PORTAMENTO | 0–200 | 92 |
Important Notes
- Header version byte — byte 10 of the
0x20preset header is0x03on Play Electric (vs0x0Con Play Acoustic). Sending the wrong value causes the device to silently drop the entire preset write — the user-facing error reads "PRESET REJECTED: VERSION". - 4 data packets per preset (not 5) — Play Electric responds to
0x45with 1×0x20header + 4×0x21data packets, where Play Acoustic returns 5. The same difference applies when writing presets back. Mis-counting here drops every other preset on receive and trips silent rejection on send. - No MIDI CC input — the device only sends MIDI, never receives it.
- No preset switch command — full preset data must be sent each time.
- Effect state on preset load — when a preset loads, it sets the effect block enables in the global setup. These can be overridden by writing to the setup after the preset loads.
- Preset addressing — Bank 0: presets 1–127 (slots 1–127). Bank 1: presets 0–127 (slots 128–255). Full preset = bank × 128 + in-bank number.
- Verified mappings only — this page only lists parameters where the byte-to-meaning mapping has been verified on the device. Unmapped or speculative bytes (still tracked internally for round-trip integrity) are intentionally omitted.