Like most drum machines from the mid-1980s, the Roland TR-505 generates its percussion sounds by replaying pre-recorded digitised samples of real drums. These sounds are stored as pulse-code modulation data in ROM. Whereas older machines such as the LinnDrum, Oberheim DMX, etc. typically stored each sound on its own ROM chip, with dedicated digital-to-analogue converter and associated circuitry; the TR-505 uses a much more economical design, storing all the sounds on a single memory chip and making use of a complicated time division multiplexing system to achieve limited polyphony.
I first set about reverse-engineering the TR-505 in July 2015, in order to produce my own sample ROM. The first thing to do was to get a dump of the contents of the TR-505's original sample ROM<. This is not quite as simple as popping the chip into an EEPROM programmer, as the Toshiba mask ROM which Roland used doesn't have a standard pinout. Fortunately, the pinout is described in the TR-505 service notes, so it was straightforward to build a wiring adapter on a breadboard. When dumping the ROM I mapped it to the pin configuration of a 29C010 EEPROM, which is electrically (if not physically) similar enough for reading.
Sample ROM address map / encoding
I was able to produce an address map of the TR-505 sample ROM by studying the service notes and pulling apart the dump of the ROM using a hex editor and CoolEdit 2000 (an excellent audio editor for this sort of work, as it fully supports 8-bit formats and is sample-accurate, unlike Audacity).
All of the samples in the TR-505 are stored as 8-bit unsigned PCM data, with a 25.00 kHz sampling rate. Although some of the samples are stored one after the other, most of the drum sounds are interleaved in pairs (i.e. one sound occupies the even numbered bytes in a given address range, and another sound occupies the odd numbered bytes). The exception is the crash and ride cymbals, which are stored in several 8K blocks (4 and 2 respectively), with a byte being read from each block in turn. The only other hurdle is that the cymbal data has address line 0 inverted - for more information, have a look at Zack Nelson's excellent technical write-up.
The sounds are arranged in memory according to this table:
|Sample at address||Sample length||Starting address|
|Bass||4K (even bytes)||$8000|
|Low Conga||4K (odd bytes)||$8001|
|Snare||4K (even bytes)||$A000|
|High Conga||4K (odd bytes)||$A001|
|Clap||4K (even bytes)||$C000|
|Low Cowbell||4K (odd bytes)||$C001|
|Rimshot||4K (even bytes)||$E000|
|High Cowbell||4K (odd bytes)||$E001|
|Crash Cymbal||32K (4x 8K blocks)||$10000|
|Ride Cymbal||16K (2x 8K blocks)||$18000|
As the TR-505 is not particularly generous with sample time (memory was expensive in 1986, after all), I decided to re-use samples from some classic drum machines which had very similar sample lengths / rates. I produced kits based on the Linn LM-1, LinnDrum and Oberheim DMX. The sample data from these machines is compressed (they used non-linear DAC circuitry to simulate 12-bit resolution) and had to be decompressed before using it in the TR-505. This was done with a program called DMXWAV. The subsequent 16-bit wav files were then resampled back down to 8-bit resolution. Some samples had to be padded out with silence ($80) to fill their allocated memory space in the ROM.
The easiest way of doing the interleaved samples is with an audio editor. Since stereo audio files are just two mono audio files interleaved, you can put the even-numbered bytes in the left channel and the odd-numbered bytes in the right. Saving this as a raw / headerless file will produce the required interleaved data.
A problem I ran into was that a couple of sounds had a ringing sound present in the background, even when they weren't being played (especially the hi-hats). I found that ensuring that the first and last few bytes of that sample were set as $80 solved the problem.
I used a 512K flash ROM for my upgrade, which contains 4x banks - LinnDrum, LM-1, Oberheim DMX and the original TR-505 sounds. As the TR-505 can only address 128K at a time, toggling the two highest address lines of the ROM switches banks.