# Alto sax model 04 — reed and keys

An isolated, unapproved instrument prototype continuing model 03's coupled reed-and-bore approach. The goal is the instrument first, not another Giant Steps arrangement. Existing recordings, source URLs, and earlier versions remain untouched. Numerical checks are not a claim of realistic sound.

## Implemented changes

- A fixed common bore mesh contains both register vents. Bore, chimney-pocket, reed, radiation, and key-aperture states persist across notes; key changes never reset them.
- Every tonehole has a permanent air-pocket compliance and a variable outlet aperture. Apertures move toward their requested positions with a 6 ms time constant. The changing acoustic load participates in the coupled solver, rather than only crossfading the output.
- The tongue applies a compliant closing force and contact damping directly to the reed. Tongue articulation does not reduce the resting mouthpiece gap or gate the rendered audio. Slow breath and embouchure adjustments remain separate controls.
- The microphone signal follows the derivative of actual external outlet flow. Closed-key pocket flow is not incorrectly counted as exterior radiation.
- The reed, mouthpiece air volume, and bore solve their pressure/flow coupling implicitly. Tone emerges from breath-driven feedback; there are no recorded samples, independent pitch oscillators, or audio pitch shifts.

The continuous key aperture uses an acoustic inertance/resistance approximation with a retained flux state and backward-Euler update. Other linear acoustic states use trapezoidal updates. The generic predecessor bore and reed parameters are reused; both register vents use a 0.65 mm radius. Neither the aperture law nor tongue spring/damper coefficients have been fitted to a measured instrument or player.

This follows the coupled physical-coordinate approach of the [Music III physical bass](../../../music3/spanish-theme-01/bass_model.py), not its string equations. Background acoustic principles: [UNSW saxophone acoustics](https://phys.unsw.edu.au/jw/saxacoustics.html) and [UNSW reed articulation measurements](https://phys.unsw.edu.au/jw/articulations.html). The implemented closing-contact law represents only one provisional articulation style.

## Listening probes

| File | Purpose |
| --- | --- |
| `steady-c4.mp3` | Standalone concert C4 onset, sustain, and release. |
| `gentle-tongue.mp3` | A sustained C4 followed by twelve repeated notes at eight per second, under continuous breath. |
| `connected-keys.mp3` | Slurred concert C4–D4–E4–D4–C4, without new tongue contact between notes. |
| `octave-switch.mp3` | Tongued C4–C5–C4, including register vent, breath, and slow embouchure changes. |
| `pressure-swell.mp3` | C4 with pressure rising from 4.8 to 5.6 kPa and coordinated slow embouchure adjustment. |
| `ab-old.mp3` | Sustain-level-matched copy of archived model 03's C4. |
| `ab-new.mp3` | Sustain-level-matched copy of the new standalone C4. |

Each player has a same-named 24-bit PCM WAV download. The five new probes share one playback gain, preserving their relative dynamics. There is no room effect, compressor, limiter, or final amplitude gate. The page uses native controls, `preload="none"`, no autoplay, and pauses other players when one starts.

The old A/B source is specifically [`../alto-sax-model-03/tone-c4.wav`](../alto-sax-model-03/tone-c4.wav), not a band recording. Both copies are scaled to identical unweighted sustain RMS over 0.8–2.5 seconds and then receive shared peak headroom adjustment. The archive remains unchanged. RMS matching is not perceptual loudness matching; MP3 encoding can slightly change levels.

## Rendering and checks

From this directory:

```sh
python3 render_tests.py
```

Dependencies: Python 3, NumPy, Numba, SciPy, SoundFile, and `ffmpeg`. Keep the neighboring [`../alto-sax-model-03/`](../alto-sax-model-03/) sources, geometry, and archived C4 WAV available. `horn.py` imports the earlier model's physical constants and acoustic helpers; this directory is not self-contained.

- [`report.json`](report.json) includes source hashes, event controls, unconstrained YIN pitch estimates, transient proxies, energy traces, and A/B matching gains.
- Checks cover zero-breath silence, positive real passive input impedance at all 28 supported fingerings over a 512-point 80–16,000 Hz grid, implicit coupling residuals, pitch and voiced fraction for these probes, eight-Hz tonguing, three swell windows, energy decay after breath stops, and unchanged archive hashes.
- Removing tongue force must still allow breath-driven C4 oscillation. No expected-frequency search window is used to force the pitch estimate onto the target note.
- [`diagnostics.json`](diagnostics.json), reproduced with `python3 diagnose.py`, analyzes the rejected earlier merge and archived model-03 references. It records unusually large key-change-correlated spikes; attribution to particular mechanisms is still an inference, not an isolated causal measurement. Its inputs also require the preserved `giant-alto-01` and study sources.
- [`horn.py`](horn.py) and [`render_tests.py`](render_tests.py) contain the new engine and reproducible renderer/checks.

## Limits

The geometry is designed, not measured from a real alto. The chromatic hole layout abstracts mechanical linkages; wall losses use a reference-frequency approximation and radiation a first-order load. Detailed bell directivity, external hole interaction, and the upstream vocal tract are absent. Register controls are prescribed, not a learned player.

Stored energy is diagnostic, not a full power-balance audit: prescribed key and tongue motion can do mechanical work that is not tracked separately. State retention does not by itself prove a physically passive moving-key model. Pitch checks cover only these probes, not the full range or a fast musical performance. This prototype needs listening judgment before any claim of improvement.
