Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

The MT-32

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:

NameVersionSHA-1
mt32_ctrl_2_07.romv2.0747b52adefedaec475c925e54340e37673c11707c
MT32_CONTROL.ROMv1.07b083518fffb7f66b03c23b7eb4f868e62dc5a987
MT32_PCM.ROMallf6b1eebc4b2d200ec6d3d21d51325d5b48c60252

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:

RowWhat it does
MIDI inputHost source, or MT-32 -- see Patch editors
Control ROMBrowse to the control ROM image
PCM ROMBrowse to the PCM ROM image
Front panelShow the module’s front panel under the display
DisplayWhich 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 oled

midi_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

KeyValuesMeaning
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_rompathThe control ROM image
mt32_pcm_rompathThe PCM ROM image
mt32_paneltrue/falseShow 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:

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.

Pressing the button of the part already shown returns to the main screen.

Single buttons

ButtonThe dial then edits
PART 1-5, PART RWhich part the three buttons below act on
SOUND GROUPThe part’s timbre bank (0-3: the two internal groups, memory, rhythm)
SOUNDThe part’s timbre within that bank (0-63)
VOLUMEThe part’s level (0-100)
MASTER VOLUMEThe 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 withReaches
GROUPMaster tune, 427.5 to 452.6 Hz
VOLUMEReverb mode (0-3)
SOUNDUnit number
PART 1, 2, 3Parts 6, 7 and 8, which have no buttons of their own
PART 4Overflow assign (confirm with PART 1)
PART 5MIDI channels: move parts 1-8 onto channels 1-8 (confirm with PART 1)
PART RAll 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.

CombinationReaches
MASTER + PowerChain Play / Demo - Requires v2.x ROM
1 + 3 + MASTER + POWERROM 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_lcdLooks like
mt32 (default)Dark green backlight, lighter green characters
superjvDeep blue, pale green characters; the blue remains when off
sseriesSky blue, near-black characters; paler when off
oledBlack 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:

MessageMeaning
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://github.com/CopperlineHQ/mt32-rs.