OPL3-driven polyphonic synthesizer for the Tandy/Memorex Video Information System (VIS) — a 1992 multimedia console running Modular Windows 3.1 on an Intel 80286 @ 12 MHz, with a Yamaha YMF262 (OPL3) and a 16-bit R-2R stereo DAC.
Three working modes, all running natively as Win16 NE applications on Modular Windows VIS via direct OPL3 port I/O at 0x388/0x389:
| Version | Mode | Input | Real-VIS portable? |
|---|---|---|---|
v0 |
Hand-controller polyphonic instrument | VIS hand controller (8 buttons → C major scale, octave/patch cycle) | ✅ |
v2 |
SMF MIDI file player | .MID file from CD-ROM (format-0, single track, voice round-robin) |
✅ |
v3 |
LIVE MIDI from host hardware keyboard | Custom MAME vis_midi_uart ISA card → host MIDI bridge |
❌ (emulator-only) |
Per-session granular log: see VIS_sessions_synth.md.
| Milestone | What it proves | Verdict |
|---|---|---|
v0 (S19) |
OPL3 8-voice polyphony + DispDib direct A000 framebuffer + custom VGA palette | "Funziona tutto, tutti e gli 8 tasti" |
v2 (S19) |
SMF format-0 parser + voice allocator + PIT-µs scheduler | "Da musicista, confermo I-IV-V-I corretta" |
v3 (S19) |
Custom MAME ISA bridge (ROM-free, MPU-401-UART-compatible) + VIS-side MIDI driver | "Mi stavo divertendo a suonare" (138-sec engaged-play session) |
All three milestones built single-iteration zero-fix at the design level (recon-first methodology, see VIS_sessions_synth.md).
src/— Watcom 16-bit C sources for the three versions, plus build batches, linker scripts, and ISO mkerssynth_v0.c/synth_v2.c/synth_v3.c— main sources (~480 / ~520 / ~360 LOC)build_synth_v*.bat— Open Watcom V2 compile + linklink_synth_v*.lnk— NE EXE link scripts (Win16 IMPORTs)mkiso_synth_v*.py— pycdlib ISO 9660 L1 builders
tools/— utility Python scriptsmake_test_mid.py— 8-second I-IV-V-I C major test SMF generator (used byv2)
mame-patch/—vis.cpppatch + build instructions for the custom MAME-VIS bridge needed byv3VIS_sessions_synth.md— granular session log (English)
- Open Watcom V2 (16-bit C compiler for Win16 NE targets):
tools/OW/in the parent VIS pipeline - Python 3 with
pycdlibfor ISO building:pip install pycdlib - MAME 0.287 for emulator testing: stock binary works for
v0andv2;v3needs the custom build (seemame-patch/) - For
v3only: msys2 mingw64 + GCC ≥ 13 to build the patched MAME from source
A clone of CONTROL.TAT from a retail VIS disc is required to assemble each version's cd_root_v*/ directory (Tandy/Memorex IP, not redistributable here — sourced from the parent VIS pipeline).
cd src
build_synth_v0.bat :: or v2, or v3
python mkiso_synth_v0.pyOutput: build/SYNTHV0.EXE (Win16 NE), build/synth_v0.iso (VIS-bootable CD).
mame -rompath <vis_bios_dir> vis -cdrom build\synth_v0.iso -window -nomax -skip_gameinfocustom-mame.exe -rompath <vis_bios_dir> vis -cdrom build\synth_v3.iso -window -nomax -skip_gameinfo -midiin "<host MIDI device name>"Host MIDI device name as listed by mame -listmidi under "MIDI input ports".
MIT for all VIS-side code, build scripts, Python utilities, and documentation in this repo (see LICENSE).
The MAME patch under mame-patch/ is BSD-3-Clause (inherited from the upstream vis.cpp file's individual-file license, copyright-holders: Carl). The MAME project as a whole is GPLv2; do NOT redistribute the built mame.exe binary without GPL-compliant source-bundle obligations. See mame-patch/README.md for full details.
- MAME team and "Carl" for the upstream
src/mame/trs/vis.cppdriver that we patched and built upon. Without that prior reverse-engineering of the VIS hardware in MAME, none of this synth project would have been feasible. - id Software / Apogee — patterns reused from this project's sibling W3D port (which itself draws on the open-sourced Wolf3D codebase) include the OPL3 init sequence and AdLib instrument register layout.