Pushover Music Format

From ModdingWiki
Jump to navigation Jump to search
Pushover Music Format
Format typeMusic
Notation typeCustom event streams in executable driver
InstrumentsOPL (AdLib variant)
Max channel countUnknown
Max track count13 pointer slots; slot 0 invalid
Max pattern countUnknown
Max order countUnknown
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:

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!)