Pushover Music Format
| Format type | Music |
|---|---|
| Notation type | Custom event streams in executable driver |
| Instruments | OPL (AdLib variant) |
| Max channel count | Unknown |
| Max track count | 13 pointer slots; slot 0 invalid |
| Max pattern count | Unknown |
| Max order count | Unknown |
| Tags? | Embedded driver credit |
| Games |
MUSIC/OVER_AD.BIN, OVER_PC.BIN and OVER_RLD.BIN are Pushover resident sound drivers containing code, instruments and event streams. They are RNC-compressed. The detailed offsets below apply to the examined AdLib binary, not automatically to other drivers.
File format
| Offset | Description |
|---|---|
| 0x00 | Real-mode entry stub: CALL rel16; RETF |
| 0x04 | Second entry stub; PC-speaker variant has a bare RETF |
| 0x08 | Music-command mailbox; cleared by driver to acknowledge |
| 0x0A | Sound-effect mailbox |
| 0x08–0x18 | Control/scratch region; not all bytes have established meanings |
| 0x19 | NUL-terminated embedded music credit |
| later | Driver code and tables, addressed by embedded offsets |
AdLib tables
| Offset | Description |
|---|---|
| 0x4D2 | Nine 20-byte runtime voice records |
| 0x60A | F-number data, indexed with 32-byte stride |
| 0x78A | Note octave/block lookup |
| 0x7EA | Note frequency-index lookup |
| 0x83A | 32 instrument slots, 16 bytes per slot |
| 0xA3A | Tempo divider reload |
| 0xA3B | 13 little-endian track-descriptor pointers; slot zero is invalid/overlaps runtime storage |
| 0x4B53 | Sound-effect pointer table |
A track descriptor begins with a tempo byte and a voice-count byte, followed by that many UINT16LE pointers to voice-info blocks. The first word of a voice-info block points to its event stream; subsequent words supply the loop/jump cursor. These are offsets within the decompressed blob.
Event stream
| Opcode | Meaning |
|---|---|
| 0x00–0x7F | Note-on |
| 0x80–0x87 | Loop/control commands; see the driver implementation for exact state changes |
| 0x88–0xAF | No established valid handler |
| 0xB0–0xBF | Carrier-volume/expression operation with one following byte |
| 0xC0–0xDF | Select instrument: opcode & 0x1F |
| 0xE0–0xFF | Set pending delay to opcode − 0xDF; continue reading |
Music service runs at approximately 50.16 Hz (PIT divisor 23788). Music voices use a tempo divider; effect voices are processed every service tick. Note lengths also depend on per-voice countdown state and instrument auto-release. A byte-stream dump alone is insufficient for faithful playback; audioSim.js implements these state transitions and emits OPL2 register writes.
Control opcodes
| Opcode | Operands | Effect |
|---|---|---|
| 0x80 | None in the event stream | Follow the separate loop/jump cursor associated with this voice |
| 0x81 | None | Key off this voice, keep it active, reload its delay and return |
| 0x82 | None | Reload delay and return without a note change |
| 0x83 | None | Stop the active voices |
| 0x84 | UINT8 | Set transpose and continue reading |
| 0x85 | None | Key off and deactivate this voice |
| 0x86 | None | Set pitch-slide step to +1 |
| 0x87 | None | Set pitch-slide step to −1 |
A note-on also reloads the pending delay and returns from command processing. Instrument, volume, transpose and duration operations continue reading until a command yields. The invalid 0x88–0xAF range is not safe padding: the original dispatch can enter unrelated code.
Other drivers
The PC-speaker and Roland variants share the resident-driver architecture, but their hardware paths and internal offsets are not interchangeable with the AdLib layout. MUSIC/CDEMO_AD.BIX, CDEMO_PC.BIX and CDEMO_RL.BIX are front-end drivers; see Pushover Intro Music Format for their research status.
Notes
The documented AdLib slot-zero pointer leads into entry code, so it must not be played as a valid song. The existence of 13 pointer slots does not mean 13 usable tracks. Preserve embedded code/table relationships when editing; this is not a standalone MIDI or tracker module.
Source code
From pushover, the open-source browser port and its reverse-engineering notes:
- docs/formats/audio.md – reverse-engineering documentation
- engine/src/core/audioSim.js – driver and event-stream implementation
- engine/viewer/music.js – track inspection
Credits
This file format was reverse engineered by VorticonCmdr. If you find this information helpful in a project you're working on, please give credit where credit is due. (A link back to this wiki would be nice too!)