| Age | Commit message (Collapse) | Author |
|
Migrated all tracker-related tests to use AudioEngine instead of directly
calling synth_init() and tracker_init(), eliminating fragile initialization
order dependencies.
Tests Migrated:
- test_tracker.cc: Basic tracker functionality
- test_tracker_timing.cc: Timing verification with MockAudioBackend (7 tests)
- test_variable_tempo.cc: Variable tempo scaling (6 tests)
- test_wav_dump.cc: WAV dump backend verification
Migration Pattern:
- Added AudioEngine include to all test files
- Replaced synth_init() + tracker_init() with AudioEngine::init()
- Replaced tracker_update(time) with engine.update(time)
- Added engine.shutdown() at end of each test function
- Preserved audio_init()/audio_shutdown() where needed for backends
Results:
- All 20 tests pass (100% pass rate)
- Test suite time: 8.13s (slightly faster)
- No regressions in test behavior
- Cleaner API with single initialization entry point
Next Steps (Phase 3):
- Migrate main.cc and production code to use AudioEngine
- Add backwards compatibility shims during transition
handoff(Claude): Completed Task #56 Phase 2 - all tracker tests now use
AudioEngine. The initialization order fragility is eliminated in test code.
Ready for Phase 3 (production integration).
|
|
Root Cause:
Tests were failing because synth_init() clears all registered spectrograms,
but tests called tracker_init() before or between synth_init() calls,
causing spectrograms to be registered then immediately cleared.
Fixes:
1. tracker.cc:
- Force re-initialization on every tracker_init() call
- Clear cache and re-register all spectrograms to handle synth resets
- Free previously allocated memory to prevent leaks
- Ensures spectrograms remain registered regardless of init order
2. synth.cc:
- Fixed backend event hooks wrapped in wrong conditional
- Changed #if defined(DEBUG_LOG_SYNTH) -> #if !defined(STRIP_ALL)
- Moved backend includes and g_elapsed_time_sec outside debug guards
- Ensures test backends receive voice trigger events
3. CMakeLists.txt:
- Added missing generate_demo_assets dependency to test_tracker
- Ensures asset files are available before running tracker tests
4. test_tracker.cc:
- Fixed incorrect test expectations (5 voices, not 6, at beat 1.0)
- Updated comments to reflect event-based triggering behavior
5. test_tracker_timing.cc, test_variable_tempo.cc, test_wav_dump.cc:
- Fixed initialization order: synth_init() BEFORE tracker_init()
- For tests using audio_init(), moved tracker_init() AFTER it
- Ensures spectrograms are registered after synth is ready
Test Results:
All 19 tests now pass (100% success rate).
Known Limitation:
This is a temporary fix. The initialization order dependency is fragile and
should be replaced with a proper lifecycle management system (see TODO Task #56).
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Refactored tracker system to trigger individual events as separate voices
instead of compositing patterns into single spectrograms. This enables
notes within patterns to respect tempo scaling dynamically.
Key Changes:
- Added ActivePattern tracking with start_music_time and next_event_idx
- Individual events trigger when their beat time is reached
- Elapsed beats calculated dynamically: (music_time - start_time) / beat_duration
- Removed pattern compositing logic (paste_spectrogram)
- Each note now triggers as separate voice with volume/pan parameters
Behavior:
- Tempo scaling (via music_time) now affects note spacing within patterns
- At 2.0x tempo: patterns trigger 2x faster AND notes within play 2x faster
- At 0.5x tempo: patterns trigger 2x slower AND notes within play 2x slower
Testing:
- Updated test_tracker to verify event-based triggering at specific beat times
- All 17 tests pass (100%)
- WAV dump confirms tempo scaling works correctly:
* 0-10s: steady 1.00x tempo
* 10-15s: acceleration to 2.00x tempo
* 15-20s: reset to 1.00x tempo
* 20-25s: deceleration to 0.50x tempo
* 25s+: return to normal
Result: Music time advances at variable rates (61.24s in 60s physical time),
and notes within patterns correctly accelerate/decelerate with tempo changes.
handoff(Claude): Tempo scaling now affects notes within patterns
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
Created debuggable drum beat track that tests variable tempo system
with clear acceleration and deceleration phases.
Music Track Changes (assets/music.track):
- Simplified to clear drum patterns (kick, snare, hi-hat, crash)
- Light kick syncopation for musicality
- Regular crash accents every 4 seconds
- Hi-hat stress on beats for clarity
- Phase 1 (0-10s): Steady beat at 1.0x tempo
- Phase 2 (10-16s): Acceleration test (1.0x → 2.0x, then reset to 1.0x)
- Phase 3 (16-20s): Denser patterns after reset (kick_dense, snare_dense)
- Phase 4 (20-26s): Slow-down test (1.0x → 0.5x, then reset to 1.0x)
- Phase 5 (26-30s): Return to normal tempo
- Phase 6 (30s+): Add bass line and E minor melody
Tempo Control (src/main.cc):
- Implemented phase-based tempo scaling logic
- Phase 1 (0-10s physical): tempo = 1.0 (steady)
- Phase 2 (10-15s physical): tempo = 1.0 → 2.0 (acceleration)
- Phase 3 (15-20s physical): tempo = 1.0 (reset trick)
- Phase 4 (20-25s physical): tempo = 1.0 → 0.5 (deceleration)
- Phase 5 (25s+ physical): tempo = 1.0 (reset trick)
- Added debug output showing tempo changes (!STRIP_ALL)
Test Updates (src/tests/test_tracker.cc):
- Updated voice count assertions to match new track (3 → 4 voices)
- New track triggers 4 patterns at t=0: crash, kick, snare, hi-hat
Results:
✓ All 16 tests passing (100%)
✓ Clear, debuggable drum patterns
✓ Tests both acceleration and deceleration reset tricks
✓ Musical: E minor bass and melody after 30s
✓ Debug output shows tempo scaling in action
handoff(Claude): Tempo scaling demo track ready for testing
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
|
|
- Consolidated all WebGPU shims and platform-specific logic into src/platform.h.
- Refactored platform_init to return PlatformState by value and platform_poll to automatically refresh time and aspect_ratio.
- Removed STL dependencies (std::map, std::vector, std::string) from AssetManager and Procedural subsystems.
- Fixed Windows cross-compilation by adjusting include paths and linker flags in CMakeLists.txt and updating build_win.sh.
- Removed redundant direct inclusions of GLFW/glfw3.h and WebGPU headers across the project.
- Applied clang-format and updated documentation.
handoff(Gemini): Completed Task #20 and 20.1. Platform abstraction is now unified, and core paths are STL-free. Windows build is stable.
|
|
|
|
|