Drive sounds re-synthesized from measurements of real Amiga mechanisms#258
Merged
Conversation
The seek and read noises never sounded like an Amiga; the synthesis targets are now taken from spectral analysis of freely licensed recordings of real drive mechanisms (A600 Chinon FZ-354, A500 internal; no sample data is included, everything stays synthesized): - A head step is a clack, not a tick: low carriage thump, dominant 1.0-1.2 kHz carriage ring (70% of a real click's energy sits in the 1-2 kHz octave), a weak higher partial carrying the 15-25 ms tail, and a 1 ms contact tick. Isolated steps (the empty-drive poll, the track advance while loading) land with 2 rebound-clatter transients ~5/~10 ms behind the impact, the cluster every real recording shows. - Fast seeks duck the thump and skip the rebounds (the carriage never settles), so the overlapped rings form the measured step-rate comb peaking at the carriage resonance. - The spin bed is cyclic, not washy: the hum is a harmonic stack on ~145 Hz (2nd and 4th partials strongest, as measured) and the rumble is a noise pattern looped exactly once per platter revolution, since real spin recordings autocorrelate at the 200 ms revolution lag. - Reading adds no noise of its own; on listening review the loading sound is the step rhythm over the motor, so the read-gated hiss is gone along with its bus plumbing. Regression tests pin the click's spectral center, the rebound clatter, seek-mode suppression, the revolution-locked spin texture, and that the motor bed stays dark. DriveSounds' serialized shape changed, so STATE_VERSION moves to 38.
Contributor
There was a problem hiding this comment.
Pull request overview
Reworks Copperline’s synthesized floppy drive audio to better match measured characteristics of real Amiga mechanisms, while staying fully deterministic and sample-free. This includes reshaping step/seek sounds, making the motor bed revolution-locked, and removing the read/DMA hiss layer and its plumbing.
Changes:
- Replaced the step “tick” model with a multi-component “clack” (thump/body/ring/tick) including scheduled rebound transients, and seek-mode suppression behavior.
- Rebuilt motor synthesis as a measured harmonic stack plus revolution-locked rumble texture (with cascaded lowpass filtering).
- Removed read/DMA hiss (API + bus feed) and bumped savestate format version; updated user docs/config comments accordingly.
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| src/savestate.rs | Bumps STATE_VERSION to reflect DriveSounds state/layout changes. |
| src/drive_sounds.rs | Implements the new measured clack/seek and revolution-locked motor synthesis; removes read hiss and adds regression tests. |
| src/config.rs | Updates AudioConfig docs to match the new drive-sound behavior (no read hiss). |
| src/bus.rs | Removes DMA/read feed plumbing for drive sounds and simplifies feed_drive_sounds(). |
| docs/guide/configuration.md | Updates configuration guide text to describe the new synthesis model and removal of read noise. |
| copperline.example.toml | Updates example config comments to match the new drive-sound behavior. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
… Goertzel The elapsed-samples counter behind the isolated-clack/seek-buzz classification now advances even while drive sounds are disabled or muted (Paula mixes every host sample either way), so the first step after re-enabling classifies against real elapsed time instead of a counter frozen at the pre-disable value. Regression test covers the toggle. Also scopes the Goertzel test helper's s0 into the loop, which --all-targets clippy rejected as a never-read assignment.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The spin noise was already liked; the seek and read noises were not. Rather than copying what other emulators do (sampled sound packs), the synthesis targets were measured from freely licensed recordings of real Amiga drive mechanisms - an A600 Chinon FZ-354 (freesound 628247, CC0, plus 259292 and 39699) and an A500 loading recording - and the voices were rebuilt around the measured numbers. No sample data ships; everything remains cheap deterministic synthesis.
What changed
set_read_active, the DMA-state feed). On listening review, loading is the step rhythm over the spinning motor, exactly like the reference recordings.Levels were tuned over three rounds of expert listening feedback (headless
--audio-wavA/B renders of a KS1.3 + WB1.3 boot).Verification
DriveSoundsis serialized inside Paula, soSTATE_VERSIONmoves 37 -> 38.