ACIDCAT . FILE FORMAT REFERENCE

PDX Anatomy

Sharp X68000MXDRV . MSM6258V
rev 2026.09
magic none
endian big
container own
played by an .MDX

A .PDX is the ADPCM sample bank a Sharp X68000 tune plays its percussion and voice hits from. An .MDX score carries no samples at all: it names a bank, and every hit lives in that separate file. The format is a pointer table and nothing else -- no magic, no version, no count, no names -- so like MDX, identifying one is arithmetic.

the row number is the sample number

Every other part of the format follows from this. A slot is eight bytes at a fixed row, and the row index is the sample's identity: MML says a number and that is the row it reads. A bank whose only sample sits at row 33 carries ninety-five empty rows in front of it, and those rows are not waste to be tidied away -- removing one renumbers everything after it and silently retunes every tune that plays the bank.

a bank table, its first four rows

Big-endian offset and length, eight bytes per row, ninety-six rows. An unused row is eight zero bytes. Sample data begins immediately after the last row.

▸the slot table768 bytes per bank . big-endian

Ninety-six rows of eight bytes is one bank, 768 bytes. Offsets are absolute file positions, not relative to anything -- the one place this format is simpler than the MDX that references it.

rowoffset u32 BE, length u32 BE
one bank96 × 8 = 768 bytes
unused roweight zero bytes
length is in BYTESnot in audio samples; see below

Nothing in the file states how many banks there are. A bank holding more than ninety-six samples simply repeats the table, and the sample data starts after the last one, so the count is recovered the same way MDX recovers its channel count:

table sizethe smallest offset in the table
bankstable size / 768
the constraintthe first sample must begin exactly where the table ends

An offset that is not a whole number of banks past zero describes no table at all, which is what makes the arithmetic an identification rather than a guess.

▸two rows, one samplealiasing

Rows may hold the same offset and the same length. That is a bank mapping one hit to several numbers so a part can play it without changing sample, and it is the normal case rather than a defect.

What does not happen is a row pointing part-way into another row's sample. Sharing is whole or not at all; a bank aliases, it does not slice. Anything reading a bank has to count distinct regions, not filled rows, or a shared hit is claimed twice and the file measures larger than it is.

▸the samplesMSM6258V ADPCM

The sample data is OKI MSM6258V ADPCM, which is the chip the X68000 has. Four bits per sample, one nibble per step, so a row's length in bytes is twice the number of audio samples it addresses.

codingOKI ADPCM, 4 bits per sample
audio sampleslength × 2
sample ratenot in the file; the player sets it
channelsnot in the file; mono in practice
nibble orderlow nibble of each byte first
step table49 entries, 16 to 1552; 12-bit output
step deltastep/8 + step/4·b0 + step/2·b1 + step·b2, each term truncated
default rate15.6 kHz (the chip at 8 MHz / 512); 3.9, 5.2, 7.8, 10.4 also selectable

The delta is the datasheet's, not a shortcut. Some decoders compute the delta as ((2·d + 1) · step) >> 3, which is the same thing up to rounding. The predictor integrates, so the rounding is not the same thing: an X68000 encoder modelled the chip, and only the per-term form brings a recorded hit back to silence at its end. The other drifts by hundreds of units per sample.

There is no rate, no loop point, no root key and no name. A bank is an addressable pile of nibbles, and everything about how a sample is meant to sound lives in the MDX that plays it.

▸one row, in full8 bytes

A filled row. Both values are unsigned and big-endian, and the offset is measured from the start of the file.

▸identification, without a signatureno magic

There is no magic number and no header before the table, so the table's own shape is the only claim the file makes about itself. Recognising one means reading ninety-six rows, discarding the empty ones, checking every remaining row lands inside the file, and checking the smallest offset is a whole number of banks.

Banks were also distributed packed with the X68000 compressors of the day, and unlike a packed MDX nothing survives: a PDX is all table, so a compressed one has no readable text to fall back on. The compressor stamps its name a few bytes in -- LZX, ZOO, LHA or LZS -- which names what was done to the file but proves nothing about what is underneath it.

▸byte orderbig-endian

Both words in every row are big-endian, following the 68000 the machine is built around. The sample data itself is nibbles and has no byte order to get wrong.