diff options
Diffstat (limited to 'src/audio')
| -rw-r--r-- | src/audio/wav_dump_backend.cc | 79 |
1 files changed, 37 insertions, 42 deletions
diff --git a/src/audio/wav_dump_backend.cc b/src/audio/wav_dump_backend.cc index f558c39..f5ea9d7 100644 --- a/src/audio/wav_dump_backend.cc +++ b/src/audio/wav_dump_backend.cc @@ -44,54 +44,50 @@ void WavDumpBackend::start() { is_active_ = true; printf("WAV dump started, rendering audio...\n"); - // Render audio in chunks until we reach desired duration - // For debugging, render 60 seconds max + // Render audio in small chunks with tracker updates + // This matches the seek logic in main.cc const int max_duration_sec = 60; - const size_t total_samples = kSampleRate * max_duration_sec; - const size_t total_frames = total_samples / kBufferSize; + const float update_dt = 1.0f / 60.0f; // 60Hz update rate (matches main loop) + const int samples_per_update = (int)(kSampleRate * update_dt); // ~533 samples + const int total_updates = (int)(max_duration_sec / update_dt); - // Music time tracking (matches main.cc logic) + // Music time tracking float music_time = 0.0f; float tempo_scale = 1.0f; float physical_time = 0.0f; - const float buffer_dt = (float)kBufferSize / kSampleRate; // Time per buffer - const float update_dt = 1.0f / 60.0f; // Update rate: 60Hz (matches main loop) - for (size_t frame = 0; frame < total_frames; ++frame) { - // Call tracker_update() multiple times per audio buffer - // This matches the main loop update frequency (~60 Hz) - const int num_updates = (int)(buffer_dt / update_dt) + 1; - for (int update = 0; update < num_updates; ++update) { - // Update tempo scaling (matches main.cc phases) - if (physical_time < 10.0f) { - tempo_scale = 1.0f; - } else if (physical_time < 15.0f) { - const float progress = (physical_time - 10.0f) / 5.0f; - tempo_scale = 1.0f + progress * 1.0f; // 1.0 → 2.0 - } else if (physical_time < 20.0f) { - tempo_scale = 1.0f; - } else if (physical_time < 25.0f) { - const float progress = (physical_time - 20.0f) / 5.0f; - tempo_scale = 1.0f - progress * 0.5f; // 1.0 → 0.5 - } else { - tempo_scale = 1.0f; - } + // Temporary buffer for each update chunk + std::vector<float> chunk_buffer(samples_per_update); - // Advance music time at smaller time steps - music_time += update_dt * tempo_scale; - physical_time += update_dt; - - // Update tracker to trigger patterns (high frequency) - tracker_update(music_time); + for (int update_count = 0; update_count < total_updates; ++update_count) { + // Update tempo scaling (matches main.cc phases) + if (physical_time < 10.0f) { + tempo_scale = 1.0f; + } else if (physical_time < 15.0f) { + const float progress = (physical_time - 10.0f) / 5.0f; + tempo_scale = 1.0f + progress * 1.0f; // 1.0 → 2.0 + } else if (physical_time < 20.0f) { + tempo_scale = 1.0f; + } else if (physical_time < 25.0f) { + const float progress = (physical_time - 20.0f) / 5.0f; + tempo_scale = 1.0f - progress * 0.5f; // 1.0 → 0.5 + } else { + tempo_scale = 1.0f; } - // Render audio from synth (accumulated triggers from updates above) - synth_render(sample_buffer_.data(), kBufferSize); + // Advance music time + music_time += update_dt * tempo_scale; + physical_time += update_dt; + + // Update tracker (triggers patterns) + tracker_update(music_time); + + // Render audio immediately after tracker update (keeps synth time in sync) + synth_render(chunk_buffer.data(), samples_per_update); // Convert float to int16 and write to WAV - for (int i = 0; i < kBufferSize; ++i) { - // Clamp to [-1, 1] and convert to 16-bit signed - float sample = sample_buffer_[i]; + for (int i = 0; i < samples_per_update; ++i) { + float sample = chunk_buffer[i]; if (sample > 1.0f) sample = 1.0f; if (sample < -1.0f) sample = -1.0f; @@ -99,18 +95,17 @@ void WavDumpBackend::start() { fwrite(&sample_i16, sizeof(int16_t), 1, wav_file_); } - samples_written_ += kBufferSize; + samples_written_ += samples_per_update; // Progress indicator - if (frame % 100 == 0) { - const float progress_sec = (float)samples_written_ / kSampleRate; + if (update_count % 60 == 0) { printf(" Rendering: %.1fs / %ds (music: %.1fs, tempo: %.2fx)\r", - progress_sec, max_duration_sec, music_time, tempo_scale); + physical_time, max_duration_sec, music_time, tempo_scale); fflush(stdout); } // Call frame rendering hook - on_frames_rendered(kBufferSize); + on_frames_rendered(samples_per_update); } printf("\nWAV dump complete: %zu samples (%.2f seconds, %.2f music time)\n", |
