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 functionally very similar for reading.
I was able to produce an address map of the TR-505 sample ROM by studying the service notes and pulling apart a 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 sounds are arranged in memory according to this table:
|Sample at address||Sample length||Starting address|
|Bass (interleaved with Low Conga)||4K (even bytes)||$8000|
|Low Conga (interleaved with Bass)||4K (odd bytes)||$8001|
|Snare (interleaved with High Conga)||4K (even bytes)||$A000|
|High Conga (interleaved with Snare)||4K (odd bytes)||$A001|
|Clap (interleaved with Low Cowbell)||4K (even bytes)||$C000|
|Low Cowbell (interleaved with Clap)||4K (odd bytes)||$C001|
|Rimshot (interleaved with High Cowbell)||4K (even bytes)||$E000|
|High Cowbell (interleaved with Rimshot)||4K (odd bytes)||$E001|
|Crash Cymbal (interleaved with itself)||32K||$10000|
|Ride Cymbal (interleaved with itself)||16K||$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.
I found a few ways to produce the interleaved data. One way is to make a stereo WAV file using an audio editor, putting the even bytes in the left channel and the odd bytes in the right channel. Saving this as a raw headerless file will produce the interleaved data. Alternatively, WinHex is able to interleave files using the unify tool - just use the 8-bit 'wordwise' option. WinHex is paid software, but the shareware demo is able to do this.
One 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 have been able to successfully replace all of the original TR-505 sounds, with the exception of the crash and ride cymbals. I have tried various ways of interleaving / encoding the data, but it would always come out sounding very artefacted and distorted. Instead, I substituted in the cymbal data from the TR-505; $10000 to $1BFFF in the original ROM.
As previously mentioned, the mask ROM in the TR-505 uses a non-standard pin configuration, meaning that you cannot simply drop an EEPROM in its place. In order to solve this problem, I designed an expansion board for the TR-505 that adapts various EEPROMs to the original mask ROM's pinout, while also breaking out additional address lines to support multiple sound banks on one chip.
The ROM expansion upgrade is available as a kit, including pre-assembled daughterboard, DIP socket and toggle switch. Visit my sales page for ordering info.
ROM Expansion board installed in the TR-505
(individual outputs mod also visible)
Back to index