Copperline can put an MT-32 on the other end of the Amiga’s MIDI cable. The
sound module is emulated in-process by
mt32-rs, Copperline’s own port
of Munt’s mt32emu, held bit-identical to
it by differential tests in that repository.
Audio is mixed in beside the Amiga’s own four channels, so a game that plays MT-32 music and Amiga sound effects gets both.
Enabling the front panel option gives you a fully featured, meticulously detailed virtual MT-32 synthesiser.
What you need¶
Two ROM images: a control ROM and a PCM ROM. Copperline does not ship them and never will -- they are the manufacturer’s copyright, and sourcing or supplying your own from a unit you own is your affair. The engine supports the whole module family: both MT-32 generations, the CM-32L/LAPC-I, and the CM-32LN.
Examples:
| Name | Version | SHA-1 |
|---|---|---|
| mt32_ctrl_2_07.rom | v2.07 | 47b52adefedaec475c925e54340e37673c11707c |
| MT32_CONTROL.ROM | v1.07 | b083518fffb7f66b03c23b7eb4f868e62dc5a987 |
| MT32_PCM.ROM | all | f6b1eebc4b2d200ec6d3d21d51325d5b48c60252 |
The engine identifies a ROM by its size and SHA-1 rather than its filename, so a mislabelled or truncated file is refused at load rather than producing a synth that sounds subtly wrong.
Turning it on¶
The serial port has to be in MIDI mode with the MT-32 as its output. In the
launcher, that is the I/O Ports tab, Serial section: set Device / Mode
to MIDI, then MIDI output to MT-32. Choosing it reveals the rest
of the rows:
| Row | What it does |
|---|---|
| MIDI input | Host source, or MT-32 -- see Patch editors |
| Control ROM | Browse to the control ROM image |
| PCM ROM | Browse to the PCM ROM image |
| Front panel | Show the module’s front panel under the display |
| Display | Which LCD the panel wears |
The same thing in a config file:
[serial]
mode = "midi"
midi_out = "mt32"
mt32_control_rom = "~/Amiga/MT32_CONTROL.ROM"
mt32_pcm_rom = "~/Amiga/MT32_PCM.ROM"
mt32_panel = true # show the front panel
mt32_lcd = "mt32" # mt32 (default), superjv, sseries, or oledmidi_out = "mt32" is the one value that does not name a host endpoint. Both
ROM paths must be set: with only one, there is nothing to fit, and Copperline
says so on the on-screen display rather than playing silence.
On the command line:
./target/release/copperline --model A1200 KICK31.ROM \
--midi-out mt32 \
--mt32-control-rom MT32_CONTROL.ROM --mt32-pcm-rom MT32_PCM.ROM \
--mt32-panel--midi-out mt32 implies mode = "midi".
[serial] keys¶
| Key | Values | Meaning |
|---|---|---|
midi_out | "mt32" | Play to the built-in module instead of a host endpoint |
midi_in | "mt32" | Wire the module’s own MIDI OUT back to the machine |
mt32_control_rom | path | The control ROM image |
mt32_pcm_rom | path | The PCM ROM image |
mt32_panel | true/false | Show the front panel (default false) |
mt32_lcd | "mt32", "superjv", "sseries", "oled" | Which LCD the panel wears (default "mt32") |
mt32_lcd also takes 1 to 4 for the four styles in that order, and
spells the first two with a hyphen if you prefer (mt-32, super-jv).
Using it¶
Anything on the Amiga that drives MIDI out of the serial port drives the module. That covers rather more than the handful of games with MT-32 support:
Games. ~15 games support the MT-32 -- pick the MT-32 in the game’s own setup program, the same as you would on hardware.
Sequencers. OctaMED, Bars and Pipes, Music-X and friends see a synthesiser on the MIDI port and treat it as one. With the front panel up you can set a part’s timbre and level while the sequence plays.
Editors and librarians. See below -- these need the return path.
Patch editors¶
Editor and librarian software (Caged Artist’s MT-32 editor, for example)
reads and writes the module’s memory, so it needs MIDI input as well as
output. Set midi_in = "mt32" to wire the module’s MIDI OUT back to the
machine. The module appears in the input list only while it is also the
selected output.
The front panel¶
mt32_panel = true adds the module’s front panel in a strip under the
display. The window grows to make room and shrinks when the panel is
hidden.
Left click presses a button.
Right click holds a button down, which is how the two- and three-button functions are reached. Up to three can be held.
Pressing the button of the part already shown returns to the main screen.
Single buttons¶
| Button | The dial then edits |
|---|---|
| PART 1-5, PART R | Which part the three buttons below act on |
| SOUND GROUP | The part’s timbre bank (0-3: the two internal groups, memory, rhythm) |
| SOUND | The part’s timbre within that bank (0-63) |
| VOLUME | The part’s level (0-100) |
| MASTER VOLUME | The module’s volume (0-100) |
Button combinations¶
Every two-button function is MASTER VOLUME plus one other: right-click MASTER VOLUME, then click the second button.
| Held with | Reaches |
|---|---|
| GROUP | Master tune, 427.5 to 452.6 Hz |
| VOLUME | Reverb mode (0-3) |
| SOUND | Unit number |
| PART 1, 2, 3 | Parts 6, 7 and 8, which have no buttons of their own |
| PART 4 | Overflow assign (confirm with PART 1) |
| PART 5 | MIDI channels: move parts 1-8 onto channels 1-8 (confirm with PART 1) |
| PART R | All Reset (confirm with PART 1) |
The last three wait for a confirming press, following the manual’s three-button procedures. All Reset also accepts PART 2-5 for the partial reset that keeps patch memory.
Unit number and Overflow assign behave as on hardware but have no effect here: there is a single module, and nothing is connected to its MIDI OUT.
Bonus button combinations¶
First power off the unit using the power button.
| Combination | Reaches |
|---|---|
| MASTER + Power | Chain Play / Demo - Requires v2.x ROM |
| 1 + 3 + MASTER + POWER | ROM debug / version info |
The dial¶
Drag the Select/Volume dial to turn it, or click it to step by one. The turn is measured from where you took hold, so the dial does not jump to the pointer. Holding a button repeats, from four steps a second up to twenty after two seconds.
Values set from the panel are written into the same patch and system memory that SysEx reaches, so the engine responds to the panel exactly as it does to the guest.
Power¶
The power switch is Copperline’s addition; the real unit has its switch at the back. Switching off shuts down the synthesiser and releases the ROMs. Switching on again is a cold start, as on hardware.
Save states preserve the Amiga-side machine state, not the built-in module’s private synthesiser state. Loading a state or rewinding while the module is powered therefore power-cycles the MT-32 and clears replies queued on the abandoned timeline. Active notes, patches, display/demo state, reverb and resampler state restart from power-on defaults. The machine resumes at the saved colour clock, but audio is not exact across an MT-32 timeline jump.
Display styles¶
mt32_lcd | Looks like |
|---|---|
mt32 (default) | Dark green backlight, lighter green characters |
superjv | Deep blue, pale green characters; the blue remains when off |
sseries | Sky blue, near-black characters; paler when off |
oled | Black glass, green characters; nothing shown when off |
All styles except the OLED show the unlit dot matrix behind the characters, as the real glass does. A part with a note sounding shows a filled cell in place of its number, as on the unit.
In the window¶
With the serial port in MIDI mode, the menu’s Serial Port category carries MIDI In and MIDI Out, and, once the module is selected, a MT-32 submenu with the front panel toggle and the display styles. Changes take effect immediately.
Building without it¶
The mt32 Cargo feature, on by default, compiles the engine in. To build
without it:
cargo build --release --no-default-features \
--features "midi,frontend,wasm-boards,control,ctl-bin,net-nat,net-bridge,fluxbridge,cpu-jit,profile-stats"This is the normal desktop feature set with only mt32 omitted. The launcher
rows and MIDI device entries disappear, and mt32_* config keys are read and
ignored with a warning.
With the feature compiled in, the engine is only instantiated while the MT-32 is the selected output, and holds about 2 MiB while running: the two ROM images, the sample tables decoded from them, and the reverb and resampler buffers. Benchmark results are the same with and without the feature.
Troubleshooting¶
Errors appear on the on-screen display:
| Message | Meaning |
|---|---|
MT-32: missing ROM(s) | One or both ROM paths are unset |
MT-32: invalid ROM(s) | A file is not a ROM the engine recognises |
COPPERLINE_MT32_DEBUG=1 logs the engine’s activity: what it is sent, what
it reads and writes, and what it makes of MIDI it cannot parse. Warnings
about unparseable bytes are normal on a serial line carrying whatever the
guest sends. COPPERLINE_MIDI_DEBUG=1 (or =2 for whole messages) logs
byte flow at the serial bridge.
Licensing¶
mt32-rs is LGPL-2.1-or-later as a derivative of Munt’s mt32emu,
compatible with Copperline’s GPL-3.0-or-later, which is why it can be
linked in directly. It contains no ROM data; the emulation runs on the
images you supply. Its provenance and fidelity story live in its own
repository, https://