For any developers who are interested, a description of the Pro 3's wavetable system exclusive format follows. I've got a ton of ideas for composing with generated wavetables, but I probably won't have my Pro 3 until later this month or next.
Thanks to composerjk for his help to verify this information on real hardware. That said, any mistakes here are mine alone.
Wavetable Message: 112,368 BytesHeader: 17 bytesF0 (start of sysex)
01 (Sequential)
31 (Pro 3)
6a 6c 01 6b
Wavetable Number:
nn (range of 20-3f, for wavetables 33-64)
Wavetable Name:
8 x {
nn (ASCII character, range of 01-7f, with 00 terminating the name)}
00 force end of wavetable name
Packed PCM Data: 98,304 bytes packed to 112,348 bytesReference Wave PCM:
16 x {
1024-word big-endian 16-bit signed PCM
512-word down-sampled PCM
2 x {256-word down-sampled PCM}
8 x {128-word down-sampled PCM}
}
This is 3072 words, or 6144 bytes, of PCM per reference wave x 16 waves = 98,304 bytes, which is then packed into 8-byte packets, yielding 112,348 bytes. There's a detailed discussion of data packing here (
https://forum.sequential.com/index.php/topic,43.msg106.html#msg106), and the Tenth Anniversary Edition of my C packing library is available here (
https://github.com/Chysn/sequential_packing).
Checksum: 2 bytesChecksum is a 16-bit unsigned integer initialized to 0. For each 2-byte word in the PCM data, convert it to a little-endian 16-bit unsigned integer and add it to
checksum. Then, unset bits 7 and 15 of
checksum (mask with 0xf7f7). Then append
checksum as a 2-byte little-endian value to the sysex message.
End of sysex: 1 byteF0