Note: This is now figured out to the point of usefulness.
That's really only proof of concept. I only discovered it after disassembling the firmware; same thing with the self-test Easter egg.
Honestly, I was hoping someone would chime in and say, "oh, yeah, this is the way I've always done it. Doesn't everyone know? I mean, it's printed right in the back of manual xyz
**..." Because even though apparently it's some long lost secret that disappeared from this planet about three decades ago,
someone out there has to have the exact specs from Casio. I know someone has it in their desk drawer or on a 720K floppy somewhere, yet those who remember aren't passing on the knowledge, so...
** incidentally, if anyone has an authentic RZ-1 user manual (not this print a 4MB PDF and bind it nonsense!) then I'd be interested in borrowing it.
Anyway, it's not definitive or official but here are the reverse-engineered specs:
Casio RZ-1 System Exclusive (SysEx) MIDI Implementation
Note: All values are in hex -- for example $F0 or F0h, depending on the notation preferred.
======================================
SEQUENCER MUST INITIATE COMMUNICATION!
======================================
F0 44 01 00 7n zz 00
where n is MIDI channel (0 = channel 1, 1 = ch2, .. E = ch15, F = ch16)
where zz is for RZ-1 to do the following:
10 = MIDI SEND, sample RAM (from RZ-1 to sequencer)
14 = MIDI SEND, rhythm RAM (from RZ-1 to sequencer)
20 = MIDI RECEIVE, sample data (from sequencer to RZ-1)
24 = MIDI RECEIVE, rhythm data (from sequencer to RZ-1)
RZ-1 responds F0 44 01 00 70 30 to any of those four requests -- which is one major mistake by Casio, IMHO.
================================================================
MIDI SEND HANDSHAKING (RZ-1 to sequencer, commands 10 and 14)
================================================================
- Sequencer sends handshake to RZ-1 of intended download: 7n 31 (7n is handshake channel check, 31 is handshake request-to-send command)
- RZ-1 sends reply of nibblized data: h1 l1, h2 l2, .. ..
- If RZ-1 has more data to send then it sends a handshake of: 7n 32 (7n is handshake channel check, 32 is handshake more-to-send reply)
- As needed, sequencer sends another handshake: 7n 31 (7n is handshake channel check, 31 is handshake request-to-send command)
- RZ-1 again sends nibblized data: h1 l1, h2 l2, .. .. for length of RAM dump (or has more data which requires more handshaking)
- Handshakes must proceed until Tx/Rx is done -- only 256 bytes can be sent at a time (not counting SysEx codes or handshaking bytes), but those are nibbles which really only amounts to 128 proper bytes of data! Manually handshaking by sending one 70 31 reply per second seems to work well, but is quite tedious -- an automated script which only replies when the RZ-1 sends its 70 32 handshake would be far superior. The CZ-style trick of flooding the RZ-1 MIDI buffer with handshake acknowledgements tends to stop the RZ-1 prematurely.
- RZ-1 terminates transmission with F7. Sequencer can send either another handshake or F7 to bring RZ-1 out of MIDI SEND mode.
It's recommended to immediately edit the received header accordingly before saving it for later use, so that dumps can easily and properly be played when it comes time to reload them (see section below).
================================================================
MIDI RECEIVE HANDSHAKING (sequencer to RZ-1, commands 20 and 24)
================================================================
- Sequencer SysEx to be sent to the RZ-1
must have the automatically generated header of F0 44 01 00 70 30 removed and replaced with the proper receive request -- either sample or rhythm. Generally F0 44 01 00 70 20 00 for samples and F0 44 01 00 70 24 00 for rhythm, but please reference the formatting guide at the beginning of this document.
Note: The resulting size of a properly edited SysEx sample dump is 33,030 bytes, 15,486 bytes for rhythm.
- Sequencer sends data but the return handshakes have been encoded by the RZ-1 previously during the transmission to the sequencer, so none need to be added as they are automatically played back at the proper points.
- Sequencer and RZ-1 both terminate transmission with F7
Conclusion
It's a really stupid implementation and it makes me want to kick a baby in the face. It's probably going to require something specially coded to make it fully useful, really, because all the SysEx and handshakes need to be stripped and then it has to be un-nibbled
** if you're trying to manipulated the sample data. The MT jack encoder/decoder method is still better for loading custom samples, but the SysEx method is much quicker and easier for loading something already backed up -- about 30 seconds. Another benefit of SysEx is it can be initiated from the computer, unlike MT loading which requires manually entering the special MT menu.
** Yes, I know that's the only way you can send such data over MIDI. It's the handshaking and headers that are ridiculous.