Copperline 0.17.0: Coppersynth, two sound boards, and CD32 discs that boot without a Kickstart
This is the audio release. Coppersynth puts a General MIDI sound module in the style of a Roland Sound Canvas on the other end of the Amiga's MIDI cable. Its MT-32 translation layer means a game that talks to an MT-32 plays with no ROMs and no configuration. Two Zorro II sound boards also arrive: a MacroSystem Toccata, the AD1848 card the stock AHI driver expects, and an MHI MPEG audio decoder board that lets AmigaAMP play MP3 on a plain 68000. Every audio source now flows through one mixer that can write each source to its own WAV, and each gets a row in the debugger's Audio tab.
Elsewhere, CD32 discs cold-boot on the bundled AROS ROM with no Kickstart, a publisher kit builds a launcher-free player for a single game, and most gamepads work out of the box and can drive the whole user interface. The About page is rebuilt, and RTG gains the Graffity boards. As always, compatibility fixes model the underlying Amiga subsystems rather than individual titles.
Coppersynth
The MT-32 arrived in 0.15.0 as a bit-exact emulation of the real
module, which is only useful if you own its ROMs. Coppersynth is
for everyone else: a sixteen-part General MIDI SoundFont
synthesizer with GS and NRPN handling, reverb and chorus. The
GeneralUser GS bank by S. Christian Collins is embedded in the
binary, with the complete GM sound set, the SFX bank and the drum
kits, so there are no files to find. You can load any
.sf2 in its place. Its audio is mixed beside Paula's
four channels, so a game's MIDI score and its Amiga sound effects
play together.
The part I did not expect is the front panel. Under the display
sits an SC-55mkII-style fascia with the backlit LCD, the sixteen
part meters and the real unit's button grammar: part and system
menus, variation banks, GS init, the demo sequences, and the
power-on button combinations that selected MT-32 mode on the
original. A right click latches a button down, which is how
multi-button gestures are made. The module keeps its settings
across power cycles, as the real unit's battery does. The MT-32
translation layer (auto, on or
off) converts a game's MT-32 instrument uploads and
drum map to General MIDI as it plays, and the LCD shows the
messages games send to the module.
Select it with [serial] midi_out = "coppersynth", with
--midi-out coppersynth, from the launcher's I/O Ports
tab or from the in-window MIDI Out menu. You can switch between it
and the bit-exact MT-32 without a restart. The synthesizer is its
own crate,
CopperlineHQ/Coppersynth,
so other projects can use it too. Contributed by Lee Hobson
(@hobbo91),
who built it from the first commit to the 0.14.0 pin this release
ships.
A Toccata and an MHI decoder board
[toccata] enabled = true fits a register-accurate
MacroSystem Toccata, with the AD1848 codec's indexed registers, the
board's own 1024-byte FIFO with its half-empty interrupt and
little-endian word quirk, all fourteen sample rates from 5512 to
48000 Hz, and 8- and 16-bit mono and stereo playback.
The stock open-source toccata.audio AHI driver runs
unmodified, so AHI-aware software gets 16-bit sound without a
Copperline-specific driver.
[mhi] enabled = true fits something that never existed
as hardware: a Copperline-native Zorro II board serving the Amiga
MHI API through a ported mhi_copperline.library. MHI
is the hardware-decode backend that players such as AmigaAMP use.
MP3 decodes at essentially zero guest CPU cost on a stock 68000,
with working volume, pan, bass, mid and treble. The bitstream is
consumed at the decoded audio's emulated-time rate, so warp and
replay stay deterministic. The board's register protocol is
published as a bus-agnostic contract that any emulator could
implement. Simon Dick
(@sidick)
contributed both boards, the audio mux beneath them and the
--audio-stems capture, which writes every source to
byte-identical WAVs: Paula, the drive noises, CD-DA, the MT-32,
Coppersynth, Toccata, MHI, and each Paula channel on its own.
On my side, the debugger's Audio tab grew a row for each source the machine has: CD-DA, the MIDI synth, Toccata with its latched rate and FIFO fill, and MHI with its transport state and parameter latches. Each row has an oscilloscope and a developer mute, so when a game's music sounds wrong you can see which box is making it.
CD32 discs boot on the AROS ROM
copperline --factory --model CD32 --insert-cd-after 0
game.cue now cold-boots a CD32 title with no Kickstart ROM.
On Copperline's side, Akiko's drive protocol was corrected against
both Kickstart's and AROS's cd.device: the order of
the TOC dump, command execution paced in emulated time rather than
inside the guest's write, masked interrupt-request reads, the
media-status byte, and DMA that reaches every RAM bank in the low
16 MiB instead of only chip RAM.
On the AROS side, Copperline contributed four upstream series this
fortnight: CD32 CD boot through CDVDFS, an appliance-quiet boot that
can never raise a requester on a pad-only machine, the
Kickstart-private lowlevel.library vectors that CD32
titles call blind, and an m68k low-memory series that frees well
over 1 MiB of chip RAM at boot. A CD32 with a disc in the drive had
164 KiB free before and has 1.48 MiB now. Pinball Fantasies and
Pinball Illusions cold-boot from CD to playable tables on a
chip-only CD32. The freed memory also helps a chip-hungry A1200
floppy title that used to run out of memory under the bundled
ROM.
A publisher kit
tools/publish --manifest game.toml builds a
dedicated, launcher-free player for one game. It is a small binary
that boots straight into the title, with the machine and RAM fixed
at build time, no status bar and no debugger. Its in-game menu
carries only what an end user changes: CRT shader and strength,
bezel, fullscreen, controller setup, and save states if the
publisher opts in. The distributable bundles the player, the game
as a sidecar file, the AROS ROM pair and the licence documents for
macOS, Linux and Windows. The game is never embedded in the binary,
so publishing a commercial title needs no licence exception. This
is the same mere-aggregation model that commercial ScummVM releases
use. Brazen Gameplay, whose
Urb-X Warriors
Kickstarter is live, have announced a Copperline-wrapped edition of
the game. That edition ships on this kit, and the CD32 work above
grew out of the same collaboration.
Gamepads out of the box, and full UI navigation
The bundled SDL_GameControllerDB now identifies most pads and gives them a fixed layout: d-pad and left stick for directions, the south face button for fire or CD32 red, east blue, west green, north yellow, Start for play/pause, the shoulders and triggers for reverse and forward, and Select or the guide button for the menu. Calibration remains the override for pads the database misses. An optional hold-to-quit hotkey quits after a 1.5-second hold, with an on-screen countdown.
A pad can now drive the whole interface. Every control the mouse
can reach in the launcher, the menu, the status bar and the overlay
panels is reachable with the arrow keys, Return and Esc, or with a
pad's d-pad, fire and second button, so every setting can be
changed from the couch. A new gamepad-mouse device on
port 1 is the same quadrature mouse the Amiga already sees, moved by
the gamepad as well as the host mouse, so mouse-driven software can
be played from a pad. Contributed by Lee Hobson.
A new About page, and a launcher sweep
The About panel is rebuilt with a sliding title, contributors and sponsors that appear one by one over a three-layer copper-and-silver wave, and a machine readout that identifies the fitted ROM by checksum, bundled AROS included. In the launcher, the I/O Ports tab splits into Serial Port, Parallel Port, Networking and Audio pages, on/off rows become steppers, the ROM tab shows the chosen Kickstart's name, version and revision, and submenus open on a hover dwell. Contributed by Lee Hobson.
Graffity RTG and a ZZ9000 crypto board
[rtg] card = "graffityz2" or "graffityz3"
fits Atéo Concepts' Graffity, which reuses the Picasso II+'s
CL-GD5428 core under its own manufacturer ID and window layout,
with 1 or 2 MiB of VRAM and the stock Graffity.card
Picasso96 driver. Contributed by Simon Dick.
[zz9k] enabled = true fits a bundled WASM plugin board
that is register-compatible with the MNT ZZ9000's SDK v2 service
platform and presents the ZZ9000's own identity. The unmodified
zz9000-sdk software (its transport library, the
zz9k-* tools and the accelerated AmiSSL build) gets
host-speed SHA-2, BLAKE2s, ChaCha20-Poly1305, AES-GCM, X25519 and
P-256 from an emulated 68k. The board is pure compute, so it is
deterministic, replay-safe and save-state-exact.
Hardware accuracy fixes
- Denise's horizontal display window is a flip-flop set and cleared by exact comparator matches: a DIWSTOP beyond the counter's wrap never matches, the window stays open across lines, and a DIWSTRT match on an already-open window is a no-op. Copperline now paints the playfield that a carried-open window reveals left of DIWSTRT, matching photographed A500 behaviour: the clipped left edge of the Grandslam logo in the Chambers of Shaolin intro.
- A standard PAL or NTSC frame is presented with the calibrated centring constant rather than a shift derived from the display window, so a late-opening window no longer drags the picture 89 pixels left (Volker Schwaberow).
- Akiko's TOC dump streams track entries before the session entries, commands execute about a millisecond after the guest's write, CDINTREQ reads return the masked request, a present disc reports media status $83, and CD DMA resolves through the whole 24-bit address space.
- The CD32 pad's 4021 shift register follows the Blue line only while loading, so holding Blue no longer makes a game read all seven buttons as pressed.
Desktop, tooling and platform
- Windows on ARM joins the CI matrix and the release assets, and the MHI decoder's move to the pure-Rust Symphonia removed the last C compile from the default build.
- macOS now uses one CoreMIDI client per process lifetime, fixing an intermittent failure that could block MIDI until relaunch (Lee Hobson).
- Gamepad calibration binds on press with hold-to-skip, so pads that report a control held at rest calibrate correctly (Lee Hobson).
- The HDD LED lights for the lide.device-compatible Zorro IDE board (Matt Harlum), and a WHDLoad library folder of unpacked games under letter shelves is walked into instead of listed as one entry per letter.
- A structural clean-up split the oversized window, config and floppy modules, with every golden render bit-identical before and after. The RTG texture path warns instead of panicking. A save-state round-trip test and a nightly 68000 cputest conformance run join CI.
Contributed this cycle
Copperline welcomes a new contributor this cycle: Matt Harlum
(@LIV2),
the author of the open-source lide.device whose board
arrived in 0.16.0. His first PR lit the HDD LED for it. Welcome
aboard.
Lee Hobson (@hobbo91) wrote the headline feature: Coppersynth, its front panel and its own crate. He then wrote the keyboard and controller navigation of the entire UI with the gamepad mouse, the new About page, the launcher sweep and the CoreMIDI fix. He also topped the commit count this cycle, 89 to my 77, which has not happened before.
Simon Dick (@sidick) contributed the other half of the audio work: the audio mux and stem capture, the Toccata board, and the MHI decoder board through four milestones. He also added the Graffity RTG boards. Volker Schwaberow (@vschwaberow) fixed the raster centring shift. Five people, 218 commits, seven days.
Compatibility notes
Save states from 0.16.0 do not load in 0.17.0. Three new boards, the Akiko fixes and the gamepad mouse all changed the serialized machine shape, so the state format version moves from 54 to 61. Re-create snapshots after upgrading.
Gamepads no longer need calibrating first. A saved calibration always wins over the database, so existing setups are untouched. However, a calibration made before 0.17.0 for a pad the database also knows may have a stick reversed. Copperline logs a one-time hint, and recalibrating once fixes it.
Nothing was removed or renamed in the
configuration. Everything new is additive. Coppersynth keeps its
battery-backed settings in coppersynth.nvram in the
NVRAM folder, and the MHI board's guest library is copied by hand
into LIBS:mhi/ on the Amiga side.
Get it
Builds for macOS, Linux and Windows, now including Windows on ARM, are on the release page, and the Homebrew tap is updated. Or skip the download entirely: copperline.dev/try is the same emulator.
Copperline also has a Patreon. Nothing there buys a feature or a place in the queue - monthly support goes towards development time, real hardware to measure the emulator against, and the code-signing subscriptions that would let the downloads open without a warning.
- Andrew Hutchings (LinuxJedi) · linuxjedi.co.uk