diff options
Diffstat (limited to 'src/audio/tracker.cc')
| -rw-r--r-- | src/audio/tracker.cc | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/src/audio/tracker.cc b/src/audio/tracker.cc index 651c4d2..95b8022 100644 --- a/src/audio/tracker.cc +++ b/src/audio/tracker.cc @@ -20,7 +20,7 @@ static uint32_t g_last_trigger_idx = 0; // Active pattern instance tracking struct ActivePattern { uint16_t pattern_id; - float start_music_time; // When this pattern was triggered (music time) + double start_music_time; // When this pattern was triggered (music time) uint32_t next_event_idx; // Next event to trigger within this pattern bool active; }; @@ -315,21 +315,21 @@ static void trigger_note_event(const TrackerEvent& event, start_offset_samples); } -void tracker_update(float music_time_sec, float dt_music_sec) { +void tracker_update(double music_time_sec, double dt_music_sec) { // Unit-less timing: 1 unit = 4 beats (by convention) - const float BEATS_PER_UNIT = 4.0f; - const float unit_duration_sec = - (BEATS_PER_UNIT / g_tracker_score.bpm) * 60.0f; + const double BEATS_PER_UNIT = 4.0; + const double unit_duration_sec = + (BEATS_PER_UNIT / (double)g_tracker_score.bpm) * 60.0; - const float end_music_time = music_time_sec + dt_music_sec; - const float tempo_scale = synth_get_tempo_scale(); + const double end_music_time = music_time_sec + dt_music_sec; + const double tempo_scale = (double)synth_get_tempo_scale(); // Step 1: Process new pattern triggers while (g_last_trigger_idx < g_tracker_score.num_triggers) { const TrackerPatternTrigger& trigger = g_tracker_score.triggers[g_last_trigger_idx]; - const float trigger_time_sec = trigger.unit_time * unit_duration_sec; + const double trigger_time_sec = (double)trigger.unit_time * unit_duration_sec; if (trigger_time_sec > end_music_time) break; @@ -357,8 +357,8 @@ void tracker_update(float music_time_sec, float dt_music_sec) { // Trigger all events that have passed their unit time while (active.next_event_idx < pattern.num_events) { const TrackerEvent& event = pattern.events[active.next_event_idx]; - const float event_music_time = - active.start_music_time + event.unit_time * unit_duration_sec; + const double event_music_time = + active.start_music_time + (double)event.unit_time * unit_duration_sec; if (event_music_time > end_music_time) break; // This event hasn't reached its time yet @@ -368,7 +368,7 @@ void tracker_update(float music_time_sec, float dt_music_sec) { int sample_offset = 0; if (event_music_time > music_time_sec) { sample_offset = (int)((event_music_time - music_time_sec) / tempo_scale * - RING_BUFFER_SAMPLE_RATE); + (double)RING_BUFFER_SAMPLE_RATE); } // Apply humanization if enabled @@ -378,22 +378,22 @@ void tracker_update(float music_time_sec, float dt_music_sec) { uint32_t event_hash = g_tracker_score.humanize_seed ^ (active.pattern_id << 16) ^ active.next_event_idx; std::minstd_rand rng(event_hash); - std::uniform_real_distribution<float> dist(-1.0f, 1.0f); + std::uniform_real_distribution<double> dist(-1.0, 1.0); // Timing variation: jitter by % of beat duration if (g_tracker_score.timing_variation_pct > 0.0f) { - float beat_sec = 60.0f / g_tracker_score.bpm; - float jitter = dist(rng) * - (g_tracker_score.timing_variation_pct / 100.0f) * + double beat_sec = 60.0 / (double)g_tracker_score.bpm; + double jitter = dist(rng) * + (double)(g_tracker_score.timing_variation_pct / 100.0f) * beat_sec; sample_offset += - (int)(jitter / tempo_scale * RING_BUFFER_SAMPLE_RATE); + (int)(jitter / tempo_scale * (double)RING_BUFFER_SAMPLE_RATE); } // Volume variation: vary by % if (g_tracker_score.volume_variation_pct > 0.0f) { volume_mult += - dist(rng) * (g_tracker_score.volume_variation_pct / 100.0f); + (float)(dist(rng) * (double)(g_tracker_score.volume_variation_pct / 100.0f)); } } @@ -402,8 +402,8 @@ void tracker_update(float music_time_sec, float dt_music_sec) { } // Pattern remains active until full duration elapses - const float pattern_end_time = - active.start_music_time + pattern.unit_length * unit_duration_sec; + const double pattern_end_time = + active.start_music_time + (double)pattern.unit_length * unit_duration_sec; if (pattern_end_time <= end_music_time) { active.active = false; } |
