Copperline 0.17.0: Coppersynth, two sound boards, and CD32 discs that boot without a Kickstart
This one is the audio release. Coppersynth puts a General MIDI sound module on the other end of the Amiga's MIDI cable - a sixteen-part SoundFont synthesizer in the style of a Roland Sound Canvas, with an SC-55-style front panel under the display and an MT-32 translation layer in front of it, so a game that talks to an MT-32 plays with no ROMs and no configuration. Beside it, two Zorro II sound boards 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 the machine has now flows through one mixer that can write each of them to its own WAV, and the debugger's Audio tab grows a row per source.
Elsewhere: CD32 discs cold-boot on the bundled AROS ROM with no Kickstart at all, a publisher kit builds a launcher-free player for a single game, most gamepads work out of the box and can now drive the whole user interface, the About page had a makeover, and RTG gains the Graffity boards. As always it is a hardware-behaviour release: 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 wonderful if you own its ROMs and a dead end if
you do not. Coppersynth is the answer for everyone else: a
sixteen-part General MIDI synthesizer, with GS and NRPN handling,
reverb and chorus, and the GeneralUser GS bank by S. Christian
Collins embedded in the binary - the complete GM sound set, the SFX
bank and the drum kits, with no files to find. Load any
.sf2 in its place if you have a favourite. 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 real
thing. A right click latches a button down, which is how the
multi-button gestures are made, and the module remembers its
settings across power cycles like the real unit's battery does.
The MT-32 translation layer (auto, on or
off) turns a game's MT-32 instrument uploads and drum
map into 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, and 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: 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 with no Copperline-specific
driver anywhere.
[mhi] enabled = true fits something that never existed
as hardware: a Copperline-native Zorro II board serving the Amiga
MHI API - the hardware-decode backend players such as AmigaAMP use
- through a ported mhi_copperline.library. MP3
decodes at essentially zero guest CPU cost on a stock 68000, with
working volume, pan, bass, mid and treble, and 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. Both boards, the audio mux beneath them and the
--audio-stems capture that writes every source -
Paula, the drive noises, CD-DA, the MT-32, Coppersynth, Toccata,
MHI, and each Paula channel on its own - to byte-identical WAVs
were contributed by Simon Dick
(@sidick).
On my side of the same story, 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, MHI with its transport state and parameter latches - each with an oscilloscope and a developer mute. When a game's music sounds wrong you can now 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 in
sight. On Copperline's side that meant correcting Akiko's drive
protocol 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 MB instead of the chip-RAM slice. On AROS's side it
meant four upstream series Copperline contributed 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 a megabyte of
chip RAM at boot - a CD32 with a disc in the drive had 164 KiB free
before and has 1.48 MB now. Pinball Fantasies and Pinball Illusions
cold-boot from CD to playable tables on a chip-only CD32, and the
same headroom 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: a small binary that
boots straight into the title with the machine and RAM fixed at
build time, no status bar, no debugger, and an in-game menu
carrying 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 - the
same mere-aggregation model commercial ScummVM releases use. Brazen
Gameplay, whose
Urb-X Warriors
Kickstarter is live, have announced a Copperline-wrapped edition of
the game; this kit is what that ships on, and the CD32 work above
grew out of the same collaboration.
Gamepads, out of the box and in charge
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, Select or the guide button for the menu - with calibration kept as the override for the pads it misses. An optional hold-to-quit hotkey quits after a 1.5-second hold with an on-screen countdown.
And a pad can now drive everything. 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 a pad's
d-pad, fire and second button - a console-style path from the
couch through every setting. 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 plays from a pad. Contributed by Lee
Hobson.
An About page worth opening, and a launcher sweep
The About panel is rebuilt: a sliding title, contributors and sponsors arriving 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. Around it the launcher's I/O Ports tab splits into Serial Port, Parallel Port, Networking and Audio pages, on/off rows become steppers, the ROM tab names 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 MB of VRAM and the stock Graffity.card
Picasso96 driver. Contributed by Simon Dick.
[zz9k] enabled = true fits a bundled WASM plugin board
register-compatible with the MNT ZZ9000's SDK v2 service platform,
under the ZZ9000's own identity, so 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.
It 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 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.
- One CoreMIDI client per process lifetime on macOS, 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, who lit the HDD LED for it in his first PR.
Welcome aboard.
Lee Hobson (@hobbo91) wrote the headline feature - Coppersynth, its front panel and its own crate - and then 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 story - the audio mux and stem capture, the Toccata board, the MHI decoder board through four milestones - and 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 - but 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