Currently working up a project that I’ve finally gained some momentum on. A year ago I set out to learn C, and my rationale for doing so was to write a program that could take all these computer tapes I have from the various computers I had in the late 80’s and decode their audio back into the digital program data, part of a documentarian urge I have. After slogging through with it early last year, I put it down to move along with my life when I hit a wall. That changed this week when I picked it back up and took a different attack angle on the problem.
Along with my computer tapes from the TI-99/4A and Timex-Sinclair 1000, I have audio captured from my Roland JX-3P synthesizer. Roland included tape backup functionality in this keyboard so musicians could save and restore the patch parameters to their tape decks, allowing permanent backup between projects. Since this synth was released shortly after the ratification of the then still-wet MIDI standard, Roland didn’t include any functionality to dump the patch data through the MIDI ports, which is a shame. There are some neat sounds on this unit that were created by the previous owner, and I’d like to know the settings; the only way to get at the real settings (using the front panel is rather imprecise) is to attempt to decode the tape dump audio. Hence this project.
So after the frustration I had on the TI decoder, I went ahead and took a stab at the JX-3P decoder. In doing so, I discovered a bug in my audio detection code that may’ve had some influence on my TI failure. With that windfall, I went on and learned how to write better code by breaking each functional chunk of code into separate source files (so the same generic functional blocks can be shared and reused by different programs), and continued on by learning how to use makefiles in order to automate the compilation and linking of the binaries. These are techniques real programmers use. Exciting stuff.
The project is now at a point where I’m detecting the audio and demodulating it into the binary 1s and 0s. My current step is determining the format of that binary data, like figuring out which set of digits define the value of which synthesizer control. I’m already seeing some patterns, and that’s a start. But to get the full picture, I have to step through each synth control in sequence: adjust one control, make a tape dump, adjust the next control, make a take dump, etc., all the way through all 32 controls. I can then examine each dump for differences from the others to figure out which bits in the stream belong with which control. A bit time-consuming, but it’s a decent way to spend an evening.
Maybe soon I can have a full bit map laid out so I can continue the coding. The end goal is to get a text file that spells out each patch and its control settings. Then I can move on back to the TI decoder with the knowledge I’ve gained from this.