summaryrefslogtreecommitdiff
path: root/src/audio/wav_dump_backend.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio/wav_dump_backend.cc')
-rw-r--r--src/audio/wav_dump_backend.cc79
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",