Audio: implement NOTE->PITCH + control pitch -- the AL_PITCH was never applied (task #50)

The whole pitch system existed but was discarded: NoteAudioHandler captured the
MIDI note, ExecuteModel computed relativePitch from the control-chain cents --
and NOTHING ever called alSourcef(AL_PITCH).  Every sample played at root.

Consequences fixed:
- The load-time 'chirping' ambience: an authored looped sequence (div=120
  tempo=160, note 51 events on bank1:83) plays a rhythmic tick pitched ~9
  semitones DOWN; at root it was a high click ('chirp').  Identified live via
  the new BT_AUDIO_DUMP playing-source tape + user ear-match at cadence.
- Engine now revs: EngineMotor pitch rides the throttle (measured 1.0 -> 1.12).
- All sequence-authored patterns (alarms/klaxons/ambience) regain their pitch.

Implementation: BTNotePitchFactor(note) = 2^((note-60)/12); applied at all 3
patch-source StartImplementations (fresh attach) and all 3 ExecuteModels
(combined with the control-chain relativePitch, clamped 0.5..2.0 as before).
Uses the existing AudioSource::GetCurrentNoteValue().

Also: [seqcfg] sequence-config dump, g_bufferNames + BT_AUDIO_DUMP live tape
(1/s: every playing AL source with sample name/gain/pitch/loop),
tools/soundboard.py updated mapping.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
arcattack
2026-07-16 08:20:42 -05:00
co-authored by Claude Opus 4.8
parent e017f257a5
commit 37d4554440
3 changed files with 74 additions and 0 deletions
+2
View File
@@ -21,6 +21,7 @@
ALuint *g_buffers;
int g_numBuffers;
const char *g_bufferNames[512]; // bufferInd -> sample file (diag: the live-playing dump)
int g_curAudioWatcherClass = 0;
//
@@ -671,6 +672,7 @@ void
//Feed the buffer with the real PCM sample data
alBufferData(g_buffers[bufferInd], format, data, size, wavRate);
if (bufferInd < 512) g_bufferNames[bufferInd] = info.file;
if (getenv("BT_AUDIO_LOG") && bufferInd < 3)
DEBUG_STREAM << "[audio] loaded buf" << bufferInd << " " << info.file
<< " ch=" << wavCh << " bits=" << wavBits << " rate=" << wavRate