Firmware

oplbox

Loud94/100

OPLBOX: custom firmware turning the M-VAVE FM-1 into an AdLib — OPL2 emulation, SoundFX Macs Opera player and .CMF tracker/editor

oplbox is custom firmware for the M-VAVE FM-1, by @LXXero. Open source under GPL-3.0, latest release v0.4.2 (October 2026), 1 star on GitHub.

forM-VAVE FM-1·by@LXXero

Unclaimed. Is this yours? Sign in with GitHub as @LXXero to claim it.

Downloads
0
Star
1
Forks
0
Commits
202
Last commit
Download v0.4.2

oplbox-0.4.2.fwsc· 596 KB· +1 file

GPL-3.0· LXXero/oplbox·downloads come from the creator’s GitHub releases

134
Commits
9
Releases
134 commits and 9 releases in the last year
Activity · last 12 months
9 releases
  1. v0.4.2OPLBOX 0.4.2Latest2 files
    • USB: a SysEx from the computer (the installer's identity query, fm1_install.py --info, the first stage of an install) dropped the FM-1 off USB: a burst of babble, a disconnect, a re-enumeration a second later; plain MIDI did not. The app was built at -O2 with the platform inside it, and the USB stack babbles at -O2 (Dinghy keeps -Os for that reason, its tools/build.py). Now the app and the platform build at -Os like Dinghy and the OPL core (dbopl2.c) is its own object at -O2, with its own header; the scope taps moved with it. Installs over a running OPLBOX no longer need the USB rescue.
    • tests/run_host.sh compiles the core separately too.

    Install over USB (FM-1 on, running any Felucca-family firmware, including 0.4.1 if the handshake lands; otherwise hold OCT− at power-on for the USB rescue, or use the boot-ROM route described in issue #1):

    pip3 install mido python-rtmidi
    python3 fm1_install.py oplbox-0.4.2.fwsc
    
    Show all 2 files
  2. v0.4.1OPLBOX 0.4.12 files
    • USB rescue: the screen's pins are set up before the OCT- check at power-on. On some boards no key reads as pressed until that happens, so holding OCT- never opened the rescue (dinghy PR #4, sgarrettnelson). One line in fm1_cstart(); nothing else changed.

    Install over USB (FM-1 on, running any Felucca-family firmware):

    pip3 install mido python-rtmidi
    python3 fm1_install.py oplbox-0.4.1.fwsc
    
    Show all 2 files
  3. v0.4OPLBOX 0.42 files
    • EDIT: the tracker screen becomes an editor. K1/K2 cursor, SELECT order position, keys enter notes (and audition them when paused), K3 transpose, K4 instrument, ALGO volume, PRESETS step, FX key-off, SCL clear, GLO end-of-pattern, OCT-/+ keyboard octave, PLAY from the cursor, HOME to row 0. Edits are live.
    • Song screen (SEQ while editing): the order list; K1 pattern at a position, GLO insert, SCL delete, ARP new pattern, K2 speed, K3 rhythm mode.
    • Instrument screen (SEQ again): every parameter of an instrument on a list, K1 changes it (channels playing it update at once), name editing, ARP copies an instrument, keys audition on channel 1.
    • SAVE: nine 32 KiB flash slots (0x98000-0xE0000). Slots show in the jukebox after the 18 built-in songs; an empty slot opens as a new blank song. Slots hold plain .CMF files.
    • The song model: patterns as cells in RAM (190 KB of the pool), a lossless .CMF reader/writer: all 18 originals round-trip byte for byte; the register stream from the cell model equals the old player's on every song.
    • Proof against the real thing: a song edited and saved here, played by Stone Age's FXDRIVER in DOSBox, gives the FM-1's register stream exactly (host/proof/: the .CMF and the DOSBox capture; host/rowcmp3.py).
    • Register writes from the main loop (auditions, instrument edits) go through a queue the audio interrupt drains between blocks, so editing never races the chip.
    • Not yet: pulling/pushing .CMF files over USB (0.5), live recording while playing, undo.

    Audio path unchanged from 0.3.4 (dbopl core, mutes, scope).

    Install over USB (FM-1 on, running any Felucca-family firmware):

    pip3 install mido python-rtmidi
    python3 fm1_install.py oplbox-0.4.fwsc
    
    Show all 2 files
  4. v0.3.4OPLBOX 0.3.42 files
    • Fix: mutes survived on screen but not in the chip after a restart (song end in LOOP SONG, HOME). Now kept.

    Install over USB (FM-1 on, running any Felucca-family firmware):

    pip3 install mido python-rtmidi
    python3 fm1_install.py oplbox-0.3.4.fwsc
    
    Show all 2 files
  5. v0.3.3OPLBOX 0.3.32 files
    • Scope screen: the first nine white keys (F3-G4) mute / unmute channels 1-9. Red label, dim trace, key LED lit while muted; the channel keeps running so unmuting is seamless. Cleared on song change. (Mute is a mask in the mix, bit-exact with DOSBox when nothing is muted.)

    Install over USB (FM-1 on, running any Felucca-family firmware):

    pip3 install mido python-rtmidi
    python3 fm1_install.py oplbox-0.3.3.fwsc
    
    Show all 2 files
  6. v0.3.2OPLBOX 0.3.22 files
    • Scope labels: instrument number first ("06 produc"), -- for the driver's default patch.

    Install over USB (FM-1 on, running any Felucca-family firmware):

    pip3 install mido python-rtmidi
    python3 fm1_install.py oplbox-0.3.2.fwsc
    
    Show all 2 files
  7. v0.3.1OPLBOX 0.3.12 files
    • Scope screen on FX: nine oscilloscopes, one per channel, labelled with the channel's instrument; rhythm songs tap bass drum / hi-hat + snare / tom + cymbal into boxes 7-9. Auto-ranged, zero-crossing triggered, 20 frames a second; the audio interrupt pays about 5 % more for the taps while it is up.

    Install over USB (FM-1 on, running any Felucca-family firmware):

    pip3 install mido python-rtmidi
    python3 fm1_install.py oplbox-0.3.1.fwsc
    
    Show all 2 files
  8. v0.2OPLBOX 0.22 files

    0.1 on hardware: the audio interrupt ran over its budget every time (100 %+), half-speed stutter, and the main loop — buttons, screen, USB, the updater — starved with it.

    • OPL core: DOSBox dbopl (one OPL2, integers only, tables precomputed for 49716 Hz), sample loop and wave tables in RAM. Emulator: 9–13 % of the core (0.1: 62 % emulated, over 100 % real). Verified sample for sample against the unmodified DOSBox code over all 18 songs.
    • Overload guard: a quarter second over budget → playback pauses itself, screen says AUDIO OVERLOAD - PAUSED, the device stays reachable over USB. PLAY resumes.
    • MIDI input is drained: 0.1 never read the ring, so ~40 incoming notes / clocks made the USB endpoint NAK and locked SysEx (the installer handshake) out until a power-cycle. Found by Smalley.
    • CPU readout: three digits (0.1 showed 103 % as "03%"), amber past 85 %, red over budget.
    • Unity gain (0.1 was 1.5x and clipped the loud LINEL songs), clipping at the DAC instead of wrapping.
    • Nuked-OPL3 kept as the cycle-exact build option (-DOPL_CORE=OPL_NUKED), for the second core later.

    Install: python3 fm1_install.py oplbox-0.2.fwsc (needs pip3 install mido python-rtmidi), or the FM-1 Firmware Hub with the local file. From a 0.1 that does not answer: README, "If it will not start".

    Install over USB (FM-1 on, running any Felucca-family firmware):

    pip3 install mido python-rtmidi
    python3 fm1_install.py oplbox-0.2.fwsc
    
    Show all 2 files
  9. v0.1OPLBOX 0.12 files

    Initial release: Macs Opera player with Nuked-OPL3 on the M-VAVE FM-1.

    Install over USB (FM-1 on, running any Felucca-family firmware):

    pip3 install mido python-rtmidi
    python3 fm1_install.py oplbox-0.1.fwsc
    
    Show all 2 files