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)