blob: 77b1878c7aea57b4def3a6c7ee262d8fe82675b8 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
// This file is part of the 64k demo project.
// It defines the public interface and data structures for the synth.
// Supports spectrogram registration, voice triggering, and real-time rendering.
#pragma once
#include "dct.h"
#include <cstdint>
// Based on tracker score analysis (see generated/music_data.cc)
// Max simultaneous patterns: 5, recommended: 10 each
//
// CACHING IMPLEMENTATION (COMPLETED):
// - All asset samples are registered ONCE in tracker_init()
// - All generated notes are cached by parameters (freq, duration, etc.)
// - Current track: 14 unique samples (8 assets + 6 generated notes)
// - With caching: MAX_SPECTROGRAMS = 32 provides 2.3x headroom
//
// Memory cost: 32 slots × 48 bytes = 1.5KB (down from 12KB with 256 slots)
#define MAX_VOICES 48 // Per tracker_compiler: required=24, recommended=48
#define MAX_SPECTROGRAMS 32 // Current track: 14 unique, 32 provides comfortable headroom
struct Spectrogram {
const float* spectral_data_a; // Front buffer
const float* spectral_data_b; // Back buffer (for double-buffering)
int num_frames;
};
void synth_init();
void synth_shutdown();
// Register a spectrogram for playback. Returns an ID or -1.
int synth_register_spectrogram(const Spectrogram* spec);
void synth_unregister_spectrogram(int spectrogram_id);
// Double-buffering API for thread-safe updates
float* synth_begin_update(int spectrogram_id);
void synth_commit_update(int spectrogram_id);
void synth_trigger_voice(int spectrogram_id, float volume, float pan);
void synth_render(float* output_buffer, int num_frames);
void synth_set_tempo_scale(float tempo_scale); // Set playback speed (1.0 = normal)
int synth_get_active_voice_count();
float synth_get_output_peak();
|