summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--CMakeLists.txt92
-rw-r--r--PROJECT_CONTEXT.md21
-rw-r--r--TODO.md25
-rw-r--r--src/audio/audio.cc6
5 files changed, 77 insertions, 69 deletions
diff --git a/.gitignore b/.gitignore
index 32f1095..90ae97e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -22,7 +22,7 @@ src/generated/test_assets.h
src/generated/test_assets_data.cc
src/generated/
-assets/wav/
+assets/originals/
build_native/
build_win/
third_party/windows/
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 16f6451..e7de30d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,7 +4,7 @@ project(demo64k LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
-#-- - Configuration Options -- -
+#-- - Configuration Options -- -
option(DEMO_SIZE_OPT "Enable size optimization flags" OFF)
option(DEMO_STRIP_ALL "Strip all unnecessary code for final build" OFF)
option(DEMO_BUILD_TESTS "Build tests" OFF)
@@ -23,7 +23,7 @@ if (DEMO_STRIP_ALL)
set(DEMO_SIZE_OPT ON)
endif()
-#-- - Platform Detection and Core Setup -- -
+#-- - Platform Detection and Core Setup -- -
if(APPLE)
add_definitions(-DGLFW_EXPOSE_NATIVE_COCOA)
elseif(WIN32)
@@ -36,7 +36,7 @@ elseif(UNIX)
endif()
endif()
-#-- - Dependencies & Includes -- -
+#-- - Dependencies & Includes -- -
set(CORE_INCLUDES src third_party)
if (DEMO_CROSS_COMPILE_WIN32)
@@ -68,7 +68,7 @@ elseif (NOT DEMO_CROSS_COMPILE_WIN32)
list(APPEND DEMO_LIBS pthread m dl)
endif()
-#-- - Source Groups -- -
+#-- - Source Groups -- -
set(AUDIO_SOURCES src/audio/audio.cc src/audio/gen.cc src/audio/fdct.cc src/audio/idct.cc src/audio/window.cc src/audio/synth.cc src/audio/tracker.cc)
set(PROCEDURAL_SOURCES src/procedural/generator.cc)
set(GPU_SOURCES
@@ -88,17 +88,34 @@ set(GPU_SOURCES
src/gpu/effects/hybrid_3d_effect.cc
src/gpu/effects/shader_composer.cc
src/gpu/texture_manager.cc
+)
+set(3D_SOURCES
src/3d/renderer.cc
src/3d/visual_debug.cc
)
set(PLATFORM_SOURCES src/platform.cc third_party/glfw3webgpu/glfw3webgpu.c)
+set(UTIL_SOURCES src/util/asset_manager.cc)
+
+#-- - Subsystem Libraries -- -
+add_library(util STATIC ${UTIL_SOURCES})
+add_library(procedural STATIC ${PROCEDURAL_SOURCES})
+add_library(audio STATIC ${AUDIO_SOURCES})
+add_library(3d STATIC ${3D_SOURCES})
+add_library(gpu STATIC ${GPU_SOURCES})
+
+target_include_directories(util PUBLIC ${CORE_INCLUDES})
+target_include_directories(procedural PUBLIC ${CORE_INCLUDES})
+target_include_directories(audio PUBLIC ${CORE_INCLUDES})
+target_include_directories(3d PUBLIC ${CORE_INCLUDES})
+target_include_directories(gpu PUBLIC ${CORE_INCLUDES})
-#-- - Tools Setup -- -
+#-- - Tools Setup -- -
if (DEFINED ASSET_PACKER_PATH)
set(ASSET_PACKER_CMD ${ASSET_PACKER_PATH})
set(ASSET_PACKER_DEPENDS ${ASSET_PACKER_PATH})
else()
- add_executable(asset_packer tools/asset_packer.cc ${PROCEDURAL_SOURCES})
+ add_executable(asset_packer tools/asset_packer.cc)
+ target_link_libraries(asset_packer PRIVATE procedural)
set(ASSET_PACKER_CMD $<TARGET_FILE:asset_packer>)
set(ASSET_PACKER_DEPENDS asset_packer)
endif()
@@ -135,7 +152,7 @@ else()
set(TRACKER_COMPILER_FINAL_DEPENDS ${TRACKER_COMPILER_DEPENDS})
endif()
-#-- - Code Generation Helpers -- -
+#-- - Code Generation Helpers -- -
function(pack_assets NAME INPUT_TXT HEADER_VAR DATA_CC_VAR TARGET_NAME)
set(OUT_H ${CMAKE_CURRENT_SOURCE_DIR}/src/generated/${NAME}.h)
set(OUT_CC ${CMAKE_CURRENT_SOURCE_DIR}/src/generated/${NAME}_data.cc)
@@ -167,7 +184,7 @@ function(pack_test_assets NAME INPUT_TXT HEADER_VAR DATA_CC_VAR TARGET_NAME)
add_custom_target(${TARGET_NAME} DEPENDS ${OUT_H} ${OUT_CC})
endfunction()
-#-- - Generation Targets -- -
+#-- - Generation Targets -- -
set(DEMO_SEQ_PATH ${CMAKE_CURRENT_SOURCE_DIR}/assets/demo.seq)
set(GENERATED_TIMELINE_CC ${CMAKE_CURRENT_SOURCE_DIR}/src/generated/timeline.cc)
add_custom_command(
@@ -176,7 +193,7 @@ add_custom_command(
COMMAND ${SEQ_COMPILER_CMD} ${DEMO_SEQ_PATH} ${GENERATED_TIMELINE_CC}
DEPENDS ${SEQ_COMPILER_DEPENDS} ${DEMO_SEQ_PATH}
src/gpu/demo_effects.h
- COMMENT \"Compiling demo sequence...\"
+ COMMENT "Compiling demo sequence..."
)
add_custom_target(generate_timeline ALL DEPENDS ${GENERATED_TIMELINE_CC})
@@ -194,12 +211,10 @@ add_custom_target(generate_tracker_music ALL DEPENDS ${GENERATED_MUSIC_DATA_CC})
pack_assets(assets ${CMAKE_CURRENT_SOURCE_DIR}/assets/final/demo_assets.txt GEN_DEMO_H GEN_DEMO_CC generate_demo_assets)
pack_test_assets(test_assets ${CMAKE_CURRENT_SOURCE_DIR}/assets/final/test_assets_list.txt GEN_TEST_H GEN_TEST_CC generate_test_assets)
-set(UTIL_SOURCES src/util/asset_manager.cc)
-
-#-- - Main Demo -- -
-add_executable(demo64k src/main.cc ${PLATFORM_SOURCES} ${GPU_SOURCES} ${AUDIO_SOURCES} ${PROCEDURAL_SOURCES} ${UTIL_SOURCES} ${GEN_DEMO_CC} ${GENERATED_TIMELINE_CC} ${GENERATED_MUSIC_DATA_CC})
+#-- - Main Demo -- -
+add_executable(demo64k src/main.cc ${PLATFORM_SOURCES} ${GEN_DEMO_CC} ${GENERATED_TIMELINE_CC} ${GENERATED_MUSIC_DATA_CC})
add_dependencies(demo64k generate_demo_assets generate_timeline generate_tracker_music)
-target_link_libraries(demo64k PRIVATE ${DEMO_LIBS})
+target_link_libraries(demo64k PRIVATE gpu 3d audio procedural util ${DEMO_LIBS})
#Size optimizations
if (DEMO_SIZE_OPT)
@@ -209,75 +224,80 @@ if (DEMO_SIZE_OPT)
elseif (APPLE)
target_compile_options(demo64k PRIVATE -Os)
target_link_options(demo64k PRIVATE -Wl,-dead_strip)
- else()
+ else ()
target_compile_options(demo64k PRIVATE -Os -ffunction-sections -fdata-sections)
target_link_options(demo64k PRIVATE -Wl,--gc-sections -s)
endif()
endif()
-#-- - Tests -- -
+#-- - Tests -- -
enable_testing()
if(DEMO_BUILD_TESTS)
- add_executable(test_window src/tests/test_window.cc src/audio/window.cc)
+ add_executable(test_window src/tests/test_window.cc)
+ target_link_libraries(test_window PRIVATE audio)
add_test(NAME HammingWindowTest COMMAND test_window)
add_executable(test_maths src/tests/test_maths.cc)
add_test(NAME MathUtilsTest COMMAND test_maths)
- add_executable(test_synth src/tests/test_synth.cc src/audio/synth.cc src/audio/idct.cc src/audio/window.cc)
+ add_executable(test_synth src/tests/test_synth.cc)
+ target_link_libraries(test_synth PRIVATE audio)
add_test(NAME SynthEngineTest COMMAND test_synth)
- add_executable(test_tracker src/tests/test_tracker.cc ${AUDIO_SOURCES} ${UTIL_SOURCES} ${GEN_DEMO_CC} ${GENERATED_MUSIC_DATA_CC} ${PROCEDURAL_SOURCES})
- target_link_libraries(test_tracker PRIVATE ${DEMO_LIBS})
+ add_executable(test_tracker src/tests/test_tracker.cc ${GEN_DEMO_CC} ${GENERATED_MUSIC_DATA_CC})
+ target_link_libraries(test_tracker PRIVATE audio util procedural ${DEMO_LIBS})
add_dependencies(test_tracker generate_tracker_music)
add_test(NAME TrackerSystemTest COMMAND test_tracker)
- add_executable(test_spectool src/tests/test_spectool.cc ${AUDIO_SOURCES} ${PLATFORM_SOURCES} ${UTIL_SOURCES} ${GEN_DEMO_CC} ${GENERATED_MUSIC_DATA_CC} ${PROCEDURAL_SOURCES})
+ add_executable(test_spectool src/tests/test_spectool.cc ${PLATFORM_SOURCES} ${GEN_DEMO_CC} ${GENERATED_MUSIC_DATA_CC})
target_compile_definitions(test_spectool PRIVATE DEMO_BUILD_TOOLS)
- target_link_libraries(test_spectool PRIVATE ${DEMO_LIBS})
+ target_link_libraries(test_spectool PRIVATE audio util procedural ${DEMO_LIBS})
add_dependencies(test_spectool generate_tracker_music generate_demo_assets)
- add_executable(test_assets src/tests/test_assets.cc ${UTIL_SOURCES} ${PROCEDURAL_SOURCES} ${GEN_TEST_CC})
+ add_executable(test_assets src/tests/test_assets.cc ${GEN_TEST_CC})
+ target_link_libraries(test_assets PRIVATE util procedural)
target_include_directories(test_assets PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/src/generated_test)
target_compile_definitions(test_assets PRIVATE USE_TEST_ASSETS)
add_dependencies(test_assets generate_test_assets)
set_source_files_properties(src/tests/test_assets.cc PROPERTIES COMPILE_DEFINITIONS "USE_TEST_ASSETS")
add_test(NAME AssetManagerTest COMMAND test_assets)
- add_executable(test_sequence src/tests/test_sequence.cc ${GPU_SOURCES} ${UTIL_SOURCES} ${GEN_DEMO_CC} ${PROCEDURAL_SOURCES} ${GENERATED_TIMELINE_CC} ${PLATFORM_SOURCES})
- target_link_libraries(test_sequence PRIVATE ${DEMO_LIBS})
+ add_executable(test_sequence src/tests/test_sequence.cc ${GEN_DEMO_CC} ${GENERATED_TIMELINE_CC} ${PLATFORM_SOURCES})
+ target_link_libraries(test_sequence PRIVATE gpu 3d util procedural ${DEMO_LIBS})
add_dependencies(test_sequence generate_timeline generate_demo_assets)
add_test(NAME SequenceSystemTest COMMAND test_sequence)
- add_executable(test_procedural src/tests/test_procedural.cc ${PROCEDURAL_SOURCES})
+ add_executable(test_procedural src/tests/test_procedural.cc)
+ target_link_libraries(test_procedural PRIVATE procedural)
add_test(NAME ProceduralGenTest COMMAND test_procedural)
add_executable(test_3d src/tests/test_3d.cc)
add_test(NAME ThreeDSystemTest COMMAND test_3d)
- add_executable(test_shader_composer src/tests/test_shader_composer.cc src/gpu/effects/shader_composer.cc)
+ add_executable(test_shader_composer src/tests/test_shader_composer.cc)
+ target_link_libraries(test_shader_composer PRIVATE gpu)
add_test(NAME ShaderComposerTest COMMAND test_shader_composer)
- add_executable(test_texture_manager src/tests/test_texture_manager.cc ${GPU_SOURCES} ${PLATFORM_SOURCES} ${PROCEDURAL_SOURCES} ${AUDIO_SOURCES} ${GENERATED_TIMELINE_CC} ${UTIL_SOURCES} ${GEN_DEMO_CC} ${GENERATED_MUSIC_DATA_CC})
- target_link_libraries(test_texture_manager PRIVATE ${DEMO_LIBS})
+ add_executable(test_texture_manager src/tests/test_texture_manager.cc ${PLATFORM_SOURCES} ${GENERATED_TIMELINE_CC} ${GEN_DEMO_CC} ${GENERATED_MUSIC_DATA_CC})
+ target_link_libraries(test_texture_manager PRIVATE gpu 3d audio procedural util ${DEMO_LIBS})
add_dependencies(test_texture_manager generate_timeline generate_demo_assets generate_tracker_music)
- add_executable(test_3d_render src/tests/test_3d_render.cc src/3d/renderer.cc ${GPU_SOURCES} ${PLATFORM_SOURCES} ${PROCEDURAL_SOURCES} ${AUDIO_SOURCES} ${GENERATED_TIMELINE_CC} ${UTIL_SOURCES} ${GEN_DEMO_CC} ${GENERATED_MUSIC_DATA_CC})
- target_link_libraries(test_3d_render PRIVATE ${DEMO_LIBS})
+ add_executable(test_3d_render src/tests/test_3d_render.cc ${PLATFORM_SOURCES} ${GENERATED_TIMELINE_CC} ${GEN_DEMO_CC} ${GENERATED_MUSIC_DATA_CC})
+ target_link_libraries(test_3d_render PRIVATE gpu 3d audio procedural util ${DEMO_LIBS})
add_dependencies(test_3d_render generate_timeline generate_demo_assets generate_tracker_music)
endif()
-#-- - Extra Tools -- -
+#-- - Extra Tools -- -
if(DEMO_BUILD_TOOLS OR DEMO_BUILD_TESTS)
- add_executable(spectool tools/spectool.cc ${PLATFORM_SOURCES} ${AUDIO_SOURCES} ${UTIL_SOURCES} ${GEN_DEMO_CC} ${GENERATED_MUSIC_DATA_CC} ${PROCEDURAL_SOURCES})
+ add_executable(spectool tools/spectool.cc ${PLATFORM_SOURCES} ${GEN_DEMO_CC} ${GENERATED_MUSIC_DATA_CC})
target_compile_definitions(spectool PRIVATE DEMO_BUILD_TOOLS)
- target_link_libraries(spectool PRIVATE ${DEMO_LIBS})
+ target_link_libraries(spectool PRIVATE audio util procedural ${DEMO_LIBS})
add_dependencies(spectool generate_tracker_music generate_demo_assets)
add_executable(specview tools/specview.cc)
endif()
-#-- - Global Target Configuration -- -
+#-- - Global Target Configuration -- -
add_custom_target(final
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/gen_assets.sh
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/scripts/crunch_demo.sh
@@ -288,4 +308,4 @@ add_custom_target(final
add_custom_target(pack_source
COMMAND tar -czf demo_all.tgz --exclude=.git --exclude=build* --exclude=.gemini* --exclude=*.tgz --exclude=*.zip --exclude=.DS_Store .
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
-) \ No newline at end of file
+)
diff --git a/PROJECT_CONTEXT.md b/PROJECT_CONTEXT.md
index 2f1333b..27b7ed9 100644
--- a/PROJECT_CONTEXT.md
+++ b/PROJECT_CONTEXT.md
@@ -28,36 +28,35 @@ Style:
## Project Roadmap
### Next Up
-- ** Task #?: Build system
- - [ ] collect the sub-system code under (static and dynamic) libraries
- - [ ] consolidate CMakeList.txt content to use more macro for declaration, to avoid long repetitives lines and clauses
+- **Task #25: Build System Consolidation**:
+ - [ ] Create static/dynamic libraries for subsystems (audio, gpu, 3d, util) to improve modularity.
+ - [ ] Refactor `CMakeLists.txt` using macros to reduce boilerplate and repetitive clauses.
+ - [ ] Consolidate host-tool build logic (asset_packer, etc.) into a unified helper.
- **Task #20: Code & Platform Hygiene**
- [ ] Gather all cross-compile and platform-specific conditional code into `platform.h`.
- [ ] Refactor `platform_init()` and `platform_poll()` for cleaner abstraction.
- [ ] Consolidate WebGPU header inclusions.
- - [ ] Remove `std::map`/`std::vector` from hot paths.
+ - [ ] Remove `std::map`/`std::vector` from hot paths to prepare for CRT replacement.
- **Task #18: 3D System Enhancements**
- [ ] **Blender Exporter**: Create script to export scenes to internal binary format.
- [ ] **Asset Pipeline**: Update `asset_packer` and runtime loader for 3D scenes.
-- **Task #21: Shader Optimization**
- - [ ] Use macros or code generation to factorize common WGSL code (normals, bump, lighting).
- - [ ] Implement Tri-planar mapping for better procedural textures.
-
### Future Goals
- **Task #5: Implement Spectrogram Editor**
- [ ] Develop a web-based tool (`tools/editor`) for creating and editing `.spec` files visually.
-- **Task #18: 3D System Enhancements**
- - [ ] **Blender Exporter**: Convert Blender scenes to internal asset format.
- - [ ] **GPU BVH & Shadows**: Optimize scene queries with a GPU-based BVH.
+- **Task #21: Shader Optimization**
+ - [ ] Use macros or code generation to factorize common WGSL code (normals, bump, lighting).
+ - [ ] Implement Tri-planar mapping for better procedural textures.
+- **Task #18-B: GPU BVH & Shadows**: Optimize scene queries with a GPU-based BVH.
- **Phase 2: Advanced Size Optimization**
- [ ] Replace GLFW with minimal native Windows API.
- [ ] Quantize spectrograms to logarithmic frequency and uint16_t.
- [ ] CRT replacement investigation.
### Recently Completed
+- **Asset System Robustness**: Resolved "static initialization order fiasco" by wrapping the asset table in a "Construct On First Use" getter (`GetAssetRecordTable()`), ensuring assets are available during dynamic global initialization (e.g., shader strings).
- **Shader Asset Integration (Task #24)**: Extracted all hardcoded WGSL strings into `.wgsl` assets, registered them in `demo_assets.txt`, and updated `Renderer3D`, `VisualDebug`, and `Effects` to use `GetAsset` and `ShaderComposer`.
- **WebGPU Stabilization**: Resolved `WGPUSurface` creation failures on macOS by adding platform-specific `GLFW_EXPOSE_NATIVE_COCOA` definitions and fixed validation errors in the render pass configuration.
- **Final Build Stripping (Task #8)**: Implemented the `STRIP_ALL` macro to remove non-essential code (CLI parsing, debug labels, iostream) and refined size optimization flags (`-dead_strip`) for macOS.
diff --git a/TODO.md b/TODO.md
index 5ecd4bf..10e9394 100644
--- a/TODO.md
+++ b/TODO.md
@@ -2,37 +2,32 @@
This file tracks prioritized tasks with detailed attack plans.
-## Priority 1: Platform & Code Hygiene (Task #20)
+## Priority 1: Build System Consolidation (Task #25)
+**Goal:** Modularize the project and simplify CMake maintenance.
+- [ ] **Attack Plan - Subsystem Libraries:** Group source files into static libraries (`audio`, `gpu`, `3d`, `util`) to reduce link line complexity.
+- [ ] **Attack Plan - CMake Macros:** Implement `add_demo_library` and `add_demo_executable` macros to handle platform-specific definitions and warnings uniformly.
+- [ ] **Attack Plan - Host Tool Helpers:** Consolidate code generation targets into a single CMake helper.
+
+## Priority 2: Platform & Code Hygiene (Task #20)
**Goal:** Clean up the codebase for easier cross-platform maintenance and CRT replacement.
- [ ] **Attack Plan - Header Consolidation:** Move all `#ifdef` logic for WebGPU headers and platform-specific shims into `src/platform.h`.
- [ ] **Attack Plan - Refactor platform_init:** Change `void platform_init(PlatformState* state, ...)` to `PlatformState platform_init(...)`.
- [ ] **Attack Plan - Unified Poll:** Incorporate `platform_get_time()` and `platform_get_aspect_ratio()` updates into `platform_poll()`.
- [ ] **Attack Plan - Standard Container Removal:** Replace `std::map`, `std::string`, and `std::vector` in performance-critical or size-sensitive paths with simpler C-style alternatives.
-## Priority 2: 3D System Enhancements (Task #18)
+## Priority 3: 3D System Enhancements (Task #18)
**Goal:** Establish a pipeline for importing complex 3D scenes to replace hardcoded geometry.
- [ ] **Attack Plan - Blender Exporter:** Create a Python script (`tools/blender_export.py`) to export meshes/cameras/lights to a binary asset format.
- [ ] **Attack Plan - Asset Ingestion:** Update `asset_packer` to handle the new 3D binary format.
- [ ] **Attack Plan - Runtime Loader:** Implement a minimal C++ parser to load the scene data into the ECS/Renderer.
-## Priority 3: Shader Optimization (Task #21)
-**Goal:** Improve GPU performance and reduce shader source bloat.
-- [ ] **Attack Plan - Normal Factorization:** Create a standard WGSL helper for normal calculation to avoid duplicate code in every effect.
-- [ ] **Attack Plan - Tri-planar Mapping:** Implement bi/tri-planar mapping for procedural textures to improve visual quality on complex SDFs.
-
## Future Goals
+- [ ] **Task #21: Shader Optimization**: Normal factorization and Tri-planar mapping.
- [ ] **Task #5: Spectrogram Editor**: Web-based visual tool for extreme audio compression.
-- [ ] **Task #18-B: GPU BVH**: Optimize scene queries with a GPU-based BVH for the new 3D system.
- [ ] **Task #22: Windows Native Platform**: Replace GLFW with direct Win32 API calls for the final 64k push.
- [ ] **Task #23: Shader Performance Analysis**: Analyze shader performance using Xcode Metal debugger on macOS.
-## Phase 2: Advanced Size Optimization
-- [ ] **Task #22**: Windows Native Platform (Win32 API)
-
## Recently Completed
+- [x] **Asset System Robustness**: Fixed static initialization order issues by wrapping the asset table in a singleton-style getter (`GetAssetRecordTable()`).
- [x] **Shader Asset Integration (Task #24)**: Extracted hardcoded shaders to `.wgsl` assets, updated `asset_packer` for string safety, and refactored C++ code to use `GetAsset`.
- [x] **WebGPU Stability & macOS Fixes**: Resolved surface creation failures by adding `GLFW_EXPOSE_NATIVE_COCOA` and fixed validation errors in surface configuration and render pass attachments.
-- [x] **Final Build Stripping (Task #8)**: Implemented `STRIP_ALL` macro to remove CLI parsing and debug info. Optimized macOS linker flags (`-dead_strip`).
-- [x] **Tracker Asset Sample Integration**: Modified `assets/music.track` for `SAMPLE ASSET_NAME` syntax, updated `tools/tracker_compiler.cc` for parsing and code generation, and finalized `src/audio/tracker.cc` for unified asset sample pasting.
-- [x] **Minimal Audio Tracker**: Implemented a pattern and score-based audio tracker system. Details in `doc/TRACKER.md`.
-- [x] **WGSL Library (Task 21.1)**: Implemented ShaderComposer for modular WGSL snippet management.
diff --git a/src/audio/audio.cc b/src/audio/audio.cc
index ad324c0..d08a2fa 100644
--- a/src/audio/audio.cc
+++ b/src/audio/audio.cc
@@ -5,12 +5,6 @@
#include "audio.h"
#include "util/asset_manager.h"
-#if !defined(DEMO_BUILD_TOOLS)
-#define MA_NO_FLAC
-#define MA_NO_ENCODING
-#define MA_NO_MP3
-#define MA_NO_WAV
-#endif /* !defined(DEMO_BUILD_TOOLS) */
#define MINIAUDIO_IMPLEMENTATION
#include "miniaudio.h"
#include "synth.h"