summaryrefslogtreecommitdiff
path: root/src/audio
diff options
context:
space:
mode:
authorskal <pascal.massimino@gmail.com>2026-02-15 12:38:48 +0100
committerskal <pascal.massimino@gmail.com>2026-02-15 12:38:48 +0100
commit8cababb75f17c420518cc5e84b66f48a1a1b82d3 (patch)
treef9deda74a1e76fb114f7bda4e1eb664e78ae1f2d /src/audio
parent5709bf56225894016281fbc6646bae0942468299 (diff)
investigating audio-drive bug
Diffstat (limited to 'src/audio')
-rw-r--r--src/audio/audio.cc5
-rw-r--r--src/audio/tracker.cc10
2 files changed, 15 insertions, 0 deletions
diff --git a/src/audio/audio.cc b/src/audio/audio.cc
index aaadd5a..ba76a28 100644
--- a/src/audio/audio.cc
+++ b/src/audio/audio.cc
@@ -97,6 +97,11 @@ void audio_render_ahead(float music_time, float dt, float target_fill) {
// Render in small chunks to keep synth time synchronized with tracker
// Chunk size: one frame's worth of audio (~16.6ms @ 60fps)
+ // TODO(timing): CRITICAL BUG - Truncation here may cause 180ms drift over 63 beats
+ // (int) cast loses fractional samples: 0.333 samples/frame * 2560 frames = 853 samples = 27ms
+ // But observed drift is 180ms, so this is not the only source (27ms < 180ms)
+ // NOTE: This is NOT a float vs double precision issue - floats handle <500s times fine
+ // See also: tracker.cc BPM timing calculation
const int chunk_frames = (int)(dt * RING_BUFFER_SAMPLE_RATE);
const int chunk_samples = chunk_frames * RING_BUFFER_CHANNELS;
diff --git a/src/audio/tracker.cc b/src/audio/tracker.cc
index 1c0a9b2..37f0683 100644
--- a/src/audio/tracker.cc
+++ b/src/audio/tracker.cc
@@ -234,6 +234,16 @@ static void trigger_note_event(const TrackerEvent& event,
}
void tracker_update(float music_time_sec, float dt_music_sec) {
+ // TODO(timing): CRITICAL BUG - Events trigger ~180ms early over 63 beats @ BPM=90
+ // Observed: Beat 63 snare at 41.82s in WAV, should be at 42.00s (180ms drift)
+ // NOTE: This is NOT a float vs double precision issue - floats handle <500s times fine
+ // Root cause unknown - suspects:
+ // 1. Systematic bias in time calculation (not random accumulation)
+ // 2. Truncation in audio.cc:103 chunk_frames = (int)(dt * sample_rate)
+ // 3. BPM calculation precision below (unit_duration_sec)
+ // 4. Mismatch between tracker time and actual sample rendering
+ // See also: audio.cc sample rendering truncation
+
// Unit-less timing: 1 unit = 4 beats (by convention)
const float BEATS_PER_UNIT = 4.0f;
const float unit_duration_sec =