audio: replace K-S piano with Salamander Grand Piano sample bank master
Drops the Karplus-Strong banded waveguide (which the user reported sounded bad even when functioning) for a real recorded piano. Source: Salamander Grand Piano V3 by Alexander Holm (CC0), via the sfzinstruments fork on GitHub. archive.org's tar.bz2 mirror of the 44.1khz/16-bit set is what scripts/prep-piano-samples.sh fetches. Decimation: 26 anchor pitches × 1 velocity (v8 mezzo) × 3 s decay, mono float32 at 48 kHz. Anchors match Salamander's own density (every 3 semitones — C, D#, F#, A across A0..C7). Total ~14 MB shipped in the initramfs at /samples/piano/<midi>.raw. audio.h Replaces all the ks_* fields on ACVoice with five sample-bank fields: piano_sample_data (borrowed pointer), piano_sample_len, piano_sample_pos (fractional read), piano_sample_step (pitch ratio), piano_sample_amp. ACVoice shrinks by ~96 KB per voice (no more KS_MAX_DELAY = 8192-float ring buffers per string × 3 strings). audio.c - PianoSample struct + static piano_bank[64] + load_piano_bank(). - Loader scans /samples/piano/ (with /mnt/samples/piano/ fallback for OTA-2-style large-bank-on-USB layouts), parses "<midi>.raw" filenames, mallocs + reads each into the bank. - generate_piano_sample(): linear-interp fractional read at piano_sample_pos, advance by piano_sample_step. Returns 0 once pos hits len (sample exhausted = note natural decay finished). - WAVE_PIANO voice init: target_midi from log2(f/440), pick nearest anchor, step = 2^((target − anchor)/12). Logs the picked anchor + step + len so post-flash log pulls confirm playback math is right. - Both audio_init paths in ac-native.c call into the same loader via a static guard so the bank only loads once. - K-S scaffold removed (the WAVE_PIANO else-if is now ~30 lines vs the previous ~100). Note: ks_num_strings field also removed; if something downstream was depending on it, it'd be a compile error here — none seen. scripts/build-and-flash.sh Bundles fedac/native/samples/piano/*.raw into the initramfs at /samples/piano/. Logs sample count + total size at flash time. scripts/prep-piano-samples.sh Reproducible build: curl Salamander tar.bz2 → tar -xj selected anchor WAVs → ffmpeg to raw f32 mono 48kHz, 3s truncation. Idempotent. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>