diff options
| author | skal <pascal.massimino@gmail.com> | 2026-02-03 07:39:54 +0100 |
|---|---|---|
| committer | skal <pascal.massimino@gmail.com> | 2026-02-03 07:39:54 +0100 |
| commit | 5fc0517ffed67411ce5ca529742a2142acc2b5dc (patch) | |
| tree | 262c18c8f66be6878ef431b9c3ecab29ee522824 /src/audio | |
| parent | 4174f84f6b505d57dcf37847f0338724568d49f1 (diff) | |
feat: Finalize tracker asset-sample integration with unified pasting strategy
Diffstat (limited to 'src/audio')
| -rw-r--r-- | src/audio/audio.cc | 18 | ||||
| -rw-r--r-- | src/audio/audio.h | 11 | ||||
| -rw-r--r-- | src/audio/tracker.cc | 75 | ||||
| -rw-r--r-- | src/audio/tracker.h | 2 |
4 files changed, 73 insertions, 33 deletions
diff --git a/src/audio/audio.cc b/src/audio/audio.cc index e4abbf8..ad324c0 100644 --- a/src/audio/audio.cc +++ b/src/audio/audio.cc @@ -3,6 +3,7 @@ // Implementation uses miniaudio for cross-platform support. #include "audio.h" +#include "util/asset_manager.h" #if !defined(DEMO_BUILD_TOOLS) #define MA_NO_FLAC @@ -16,6 +17,23 @@ #include <stdio.h> +int register_spec_asset(AssetId id) { + size_t size; + const uint8_t* data = GetAsset(id, &size); + if (!data || size < sizeof(SpecHeader)) + return -1; + + const SpecHeader* header = (const SpecHeader*)data; + const float* spectral_data = (const float*)(data + sizeof(SpecHeader)); + + Spectrogram spec; + spec.spectral_data_a = spectral_data; + spec.spectral_data_b = spectral_data; // No double-buffer for static assets + spec.num_frames = header->num_frames; + + return synth_register_spectrogram(&spec); +} + static ma_device g_device; void audio_data_callback(ma_device* pDevice, void* pOutput, const void* pInput, diff --git a/src/audio/audio.h b/src/audio/audio.h index 24db18f..a1ddb44 100644 --- a/src/audio/audio.h +++ b/src/audio/audio.h @@ -3,6 +3,15 @@ // Includes initialization, shutdown, and frame updates. #pragma once +#include "generated/assets.h" +#include <cstdint> + +struct SpecHeader { + char magic[4]; + int32_t version; + int32_t dct_size; + int32_t num_frames; +}; void audio_init(); void audio_start(); // Starts the audio device callback @@ -11,3 +20,5 @@ void audio_render_silent(float duration_sec); // Fast-forwards audio state #endif /* !defined(STRIP_ALL) */ void audio_update(); void audio_shutdown(); + +int register_spec_asset(AssetId id); diff --git a/src/audio/tracker.cc b/src/audio/tracker.cc index 9f9263d..5d99a45 100644 --- a/src/audio/tracker.cc +++ b/src/audio/tracker.cc @@ -1,8 +1,7 @@ -// This file is part of the 64k demo project. -// It implements the tracker runtime logic. - #include "tracker.h" +#include "audio.h" #include "audio/synth.h" +#include "util/asset_manager.h" #include <cstring> #include <vector> @@ -31,9 +30,6 @@ static int get_free_pool_slot() { if (!g_spec_pool[i].active) return i; } - // If no free slot, find one where the synth voice is inactive - // (In a real implementation, we'd check if any voice is still using this) - // For now, just wrap around or return -1 return -1; } @@ -45,10 +41,8 @@ void tracker_update(float time_sec) { if (trigger.time_sec > time_sec) break; - // Trigger pattern! const TrackerPattern& pattern = g_tracker_patterns[trigger.pattern_id]; - // Generate spectrogram for the pattern int dest_num_frames = 0; std::vector<float> pattern_data; @@ -56,39 +50,54 @@ void tracker_update(float time_sec) { for (uint32_t i = 0; i < pattern.num_events; ++i) { const TrackerEvent& event = pattern.events[i]; - const NoteParams& params = g_tracker_samples[event.sample_id]; - + + std::vector<float> note_data; int note_frames = 0; - std::vector<float> note_data = - generate_note_spectrogram(params, ¬e_frames); - int frame_offset = (int)(event.beat * beat_to_sec * 32000.0f / DCT_SIZE); - paste_spectrogram(pattern_data, &dest_num_frames, note_data, note_frames, - frame_offset); - } + AssetId aid = g_tracker_sample_assets[event.sample_id]; + if (aid != AssetId::ASSET_LAST_ID) { + size_t size; + const uint8_t* data = GetAsset(aid, &size); + if (data && size >= sizeof(SpecHeader)) { + const SpecHeader* header = (const SpecHeader*)data; + note_frames = header->num_frames; + const float* src_spectral_data = (const float*)(data + sizeof(SpecHeader)); + note_data.assign(src_spectral_data, src_spectral_data + (size_t)note_frames * DCT_SIZE); + } + } else { + const NoteParams& params = g_tracker_samples[event.sample_id]; + note_data = generate_note_spectrogram(params, ¬e_frames); + } - // Register with synth - int slot = get_free_pool_slot(); - if (slot != -1) { - // Clean up old if needed - if (g_spec_pool[slot].synth_id != -1) { - synth_unregister_spectrogram(g_spec_pool[slot].synth_id); - delete[] g_spec_pool[slot].data; + if (note_frames > 0) { + int frame_offset = (int)(event.beat * beat_to_sec * 32000.0f / DCT_SIZE); + paste_spectrogram(pattern_data, &dest_num_frames, note_data, note_frames, + frame_offset); } + } + + if (dest_num_frames > 0) { + int slot = get_free_pool_slot(); + if (slot != -1) { + if (g_spec_pool[slot].synth_id != -1) { + synth_unregister_spectrogram(g_spec_pool[slot].synth_id); + delete[] g_spec_pool[slot].data; + } - g_spec_pool[slot].data = new float[pattern_data.size()]; - memcpy(g_spec_pool[slot].data, pattern_data.data(), - pattern_data.size() * sizeof(float)); + g_spec_pool[slot].data = new float[pattern_data.size()]; + memcpy(g_spec_pool[slot].data, pattern_data.data(), + pattern_data.size() * sizeof(float)); - Spectrogram spec; - spec.spectral_data_a = g_spec_pool[slot].data; - spec.spectral_data_b = g_spec_pool[slot].data; - spec.num_frames = dest_num_frames; + Spectrogram spec; + spec.spectral_data_a = g_spec_pool[slot].data; + spec.spectral_data_b = g_spec_pool[slot].data; + spec.num_frames = dest_num_frames; - g_spec_pool[slot].synth_id = synth_register_spectrogram(&spec); - g_spec_pool[slot].active = true; + g_spec_pool[slot].synth_id = synth_register_spectrogram(&spec); + g_spec_pool[slot].active = true; - synth_trigger_voice(g_spec_pool[slot].synth_id, 1.0f, 0.0f); + synth_trigger_voice(g_spec_pool[slot].synth_id, 1.0f, 0.0f); + } } g_last_trigger_idx++; diff --git a/src/audio/tracker.h b/src/audio/tracker.h index d97b483..49fcd3c 100644 --- a/src/audio/tracker.h +++ b/src/audio/tracker.h @@ -4,6 +4,7 @@ #pragma once #include "audio/gen.h" +#include "generated/assets.h" #include <cstdint> struct TrackerEvent { @@ -34,6 +35,7 @@ struct TrackerScore { // Global music data generated by tracker_compiler extern const NoteParams g_tracker_samples[]; extern const uint32_t g_tracker_samples_count; +extern const AssetId g_tracker_sample_assets[]; extern const TrackerPattern g_tracker_patterns[]; extern const uint32_t g_tracker_patterns_count; extern const TrackerScore g_tracker_score; |
