summaryrefslogtreecommitdiff
path: root/src/audio
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio')
-rw-r--r--src/audio/audio.cc18
-rw-r--r--src/audio/audio.h11
-rw-r--r--src/audio/tracker.cc75
-rw-r--r--src/audio/tracker.h2
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, &note_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, &note_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;