Do you plan on implementing control over the 2 op fm voices in your editor? If so, I got this from the guy who built the Patchbase editor. Hopefully it can be of some help.

" On Page 116 in that PDF youâ€™ll see the descriptions of the different bytes in a TG33 patch dump. If you look under Element B (the first FM element of a patch), the â€śCONNECTâ€ť bits are the algorithm select (shown in Patch Base as FM or Mix). All of those different labeled areas represent the different FM parameters. Below Iâ€™m pasting some (lightly edited for intelligibilty) code from the Patch Base editor that should give a better idea of what those different bytes are. The part on the left with â€ś[[â€ť is basically the name of the parameter, and then the byte number, the bits within that byte, and ranges are given.

Hopefully you can make sense of the pseudo-code below, but Iâ€™m happy to answer any questions on it. Iâ€™m not interested in hoarding any of this undocumented stuff; it just takes time to make it publicly presentable so itâ€™s hard for me to get around to it

[[.detune]] = (byte: 0x5c, bits: 0â€¦3, maxVal: 15)

[[.scale]] = (byte: 0x5c, bits: 4â€¦5, maxVal: 3)

[[.algo]] = (byte: 0x48, bit: 4, options: [â€śFMâ€ť,â€śMixâ€ť])

[[.wave, .type]] = (byte: 0x5a, bits: 4â€¦6, options: opWaveOptions)

[[.ratio]] = (byte: 0x5a, bits: 0â€¦3, maxVal: 15)

[[.fixed]] = (byte: 0x59, bit: 0)

[[.amp, .mod]] = (byte: 0x45, bit: 5)

[[.pitch, .mod]] = (byte: 0x46, bit: 6)

[[.mod, .detune]] = (byte: 0x4c, bits: 0â€¦3, maxVal: 15)

[[.mod, .scale]] = (byte: 0x4c, bits: 4â€¦5, maxVal: 3)

[[.mod, .wave, .type]] = (byte: 0x4a, bits: 4â€¦6, options: opWaveOptions)

[[.mod, .ratio]] = (byte: 0x4a, bits: 0â€¦3, maxVal: 15)

[[.mod, .fixed]] = (byte: 0x49, bit: 0)

[[.mod, .amp, .mod]] = (byte: 0x45, bit: 4)

[[.mod, .pitch, .mod]] = (byte: 0x46, bit: 5)

[[.mod, .env, .level, .scale]] = (byte: 0x4e, bits: 4â€¦6, options: levelScalingOptions)

[[.mod, .env, .rate, .scale]] = (byte: 0x4e, bits: 0â€¦3, maxVal: 7, displayOffset: 1)

[[.mod, .env, .delay]] = (byte: 0x4f, maxVal: 1)

[[.mod, .env, .attack, .rate]] = (byte: 0x50, bits: 0â€¦5, options: options99for63)

[[.mod, .env, .decay, .i(0), .rate]] = (byte: 0x52, bits: 0â€¦5, options: options99for63)

[[.mod, .env, .decay, .i(1), .rate]] = (byte: 0x53, bits: 0â€¦5, options: options99for63)

[[.mod, .env, .release, .rate]] = (byte: 0x54, bits: 0â€¦5, options: options99for63)

[[.mod, .env, .innit, .level]] = (byte: 0x55, options: inverseOptions99)

[[.mod, .env, .attack, .level]] = (byte: 0x56, options: inverseOptions99)

[[.mod, .env, .decay, .i(0), .level]] = (byte: 0x57, options: inverseOptions99)

[[.mod, .env, .decay, .i(1), .level]] = (byte: 0x58, options: inverseOptions99)"

TG33 manual edit.pdf (310.4 KB)