summaryrefslogtreecommitdiff
path: root/assets
diff options
context:
space:
mode:
Diffstat (limited to 'assets')
-rw-r--r--assets/demo.seq215
-rw-r--r--assets/final/BASS_SYNTH_1.specbin32784 -> 32784 bytes
-rw-r--r--assets/final/shaders/gaussian_blur.wgsl7
-rw-r--r--assets/final/shaders/solarize.wgsl40
-rw-r--r--assets/music.track321
5 files changed, 442 insertions, 141 deletions
diff --git a/assets/demo.seq b/assets/demo.seq
index 2c54dfb..fced9d6 100644
--- a/assets/demo.seq
+++ b/assets/demo.seq
@@ -1,10 +1,207 @@
-SEQUENCE 0.0 0
- EFFECT HeptagonEffect 0.0 60.0 0
- EFFECT ParticlesEffect 0.0 60.0 1
- EFFECT Hybrid3DEffect 0.0 60.0 2
+# ============================================================================
+# DEMO SEQUENCE DEFINITION
+# ============================================================================
+# This file defines the timeline and layering of visual effects.
+# Compiled by seq_compiler into src/generated/timeline.cc at build time.
+#
+# BPM 120
+#
+#
+# SYNTAX:
+#
+# END_DEMO <time>
+# Specifies when the demo should automatically exit (optional)
+# If not specified, demo runs indefinitely until user closes window
+#
+# SEQUENCE <global_start> <priority> [optional_end]
+# EFFECT <EffectClassName> <local_start> <local_end> <priority> [constructor_args...]
+#
+# Optional sequence end time:
+# - Syntax: [time] (must be wrapped in brackets)
+# - If specified, all effects in the sequence will be forcefully ended at this time
+# - If not specified, effects run until their individual end times
+# - Example: SEQUENCE 0 0 [30.0] ends the entire sequence at 30 seconds
+#
+# TIME NOTATION:
+# - Beat numbers: "0", "64", "128" (no decimal point = beats)
+# - Beat numbers with 'b': "0b", "64b", "128b" (explicit beat notation)
+# - Seconds: "0.0", "32.0", "64.0" (decimal point = seconds)
+# - Seconds with 's': "32.0s", "64.0s" (explicit seconds notation)
+# Examples at 120 BPM:
+# - Beat 0 = 0.0 seconds
+# - Beat 64 = 32.0 seconds
+# - Beat 120 = 60.0 seconds
+#
+# SEQUENCE:
+# - global_start: When this sequence starts (beats or seconds)
+# - priority: Render order between sequences (higher = rendered later/on top)
+# Use 0-9 for scene effects, 10+ for post-processing
+# - [optional_end]: Optional end time in brackets [time]. If specified, all effects
+# in the sequence will be forcefully ended at this time (relative
+# to the sequence start). If omitted, effects run until their
+# individual end times.
+#
+# EFFECT:
+# - EffectClassName: C++ class name (must be declared in demo_effects.h)
+# - local_start: Start time relative to sequence start (beats or seconds)
+# - local_end: End time relative to sequence start (beats or seconds)
+# - priority: Render order within sequence (lower = drawn first/background)
+# Negative priorities draw behind everything
+# - constructor_args: Optional additional constructor parameters (rarely used)
+#
+# Effect Constructor Parameters:
+# ALL effects automatically receive these standard parameters:
+# - WGPUDevice device: WebGPU device handle
+# - WGPUQueue queue: Command queue for GPU operations
+# - WGPUTextureFormat format: Surface texture format
+#
+# Most effects only use these standard parameters and don't require additional args.
+# If an effect needs custom initialization parameters, they are specified after
+# the priority field. Example (hypothetical):
+# EFFECT CustomEffect 0 10 0 1.5 "param"
+# This would translate to:
+# std::make_shared<CustomEffect>(device, queue, format, 1.5, "param")
+#
+# Runtime Parameters (passed to render() method):
+# All effects receive these dynamic parameters every frame:
+# - time: Global time in seconds (from demo start)
+# - beat: Current beat fraction (0.0 to 1.0 within each beat)
+# - intensity: Audio peak intensity (0.0 to 1.0, for beat detection)
+# - aspect_ratio: Screen width/height ratio
+#
+# Currently available effects (all use standard constructor only):
+#
+# Scene Effects (render 3D geometry):
+# - HeptagonEffect: Animated geometric heptagon shape
+# Uses: time (animation), beat (rotation), aspect_ratio (projection)
+# - ParticlesEffect: GPU-simulated particle system
+# Uses: time (physics), intensity (emission rate)
+# - Hybrid3DEffect: 3D objects with camera movement
+# Uses: time (camera paths), beat (object animation), aspect_ratio
+# - FlashCubeEffect: Large background cube with Perlin noise texture
+# Uses: time (rotation), intensity (flash trigger on beat hits)
+#
+# Post-Process Effects (full-screen shaders, applied in priority order):
+# - GaussianBlurEffect: Gaussian blur with beat pulsation
+# Uses: intensity (blur size pulsates 0.5x-2.5x based on audio peak)
+# - SolarizeEffect: Color inversion with alternating red/blue tints
+# Uses: time (alternates every 2 seconds between color schemes)
+# - ChromaAberrationEffect: RGB channel separation
+# Uses: time (animation), intensity (separation amount)
+# - ThemeModulationEffect: Brightness cycling (bright/dark alternation)
+# Uses: time (cycles every 8 seconds: 1.0 bright to 0.35 dark)
+# - FadeEffect: Fade to/from black
+# Uses: time (fades in first 2s, fades out after 36s - hardcoded)
+# - FlashEffect: White flash on strong beat hits
+# Uses: intensity (triggers flash when > 0.7, exponential decay)
+#
+# TIPS:
+# - Scene effects render to framebuffer with depth testing
+# - Post-processing effects are full-screen shaders applied in order
+# - Use negative priority for background elements (skybox, far objects)
+# - Higher sequence priority = later in post-process chain
+#
+# EXAMPLES:
+# # Basic sequence starting at beat 0 with priority 0
+# SEQUENCE 0 0
+# EFFECT FlashEffect 0.0 0.5 1 # Starts immediately, runs 0.5s, priority 1
+# EFFECT HeptagonEffect 0.2 10 0 # Starts at 0.2s, runs until 10s, priority 0
+#
+# # Sequence with explicit end time - all effects terminated at 5 seconds
+# SEQUENCE 8b 0 [5.0]
+# EFFECT ParticlesEffect 0 120 1 # Would run 120s, but sequence ends at 5s
+#
+# # Post-processing chain (high priority renders last/on top)
+# SEQUENCE 0 10
+# EFFECT GaussianBlurEffect 0 60 1 # Applied first
+# EFFECT ChromaAberrationEffect 0 60 2 # Applied second
+# EFFECT SolarizeEffect 0 60 3 # Applied last
+#
+# # Background element with negative priority (renders behind everything)
+# SEQUENCE 0 0
+# EFFECT FlashCubeEffect 0 10 -1 # priority -1 = background layer
+# ============================================================================
-# Post-processing chain
-SEQUENCE 0.0 10
- EFFECT GaussianBlurEffect 0.0 60.0 0
- EFFECT ChromaAberrationEffect 0.0 60.0 1
- EFFECT SolarizeEffect 0.0 60.0 2
+SEQUENCE 0b 0
+ EFFECT FlashEffect 0.0 1. 0
+ EFFECT FadeEffect 0.1 1. 1 # Add fade
+ EFFECT FlashCubeEffect .2 3 -1 # Background cube (priority -1 = behind everything)
+ EFFECT SolarizeEffect 0 4b 3 # Color inversion (last)
+
+SEQUENCE 4b 0
+ EFFECT FlashEffect 0.0 0.2 4 # Add flash after solarize
+ EFFECT FlashCubeEffect 0.1 3. -1
+
+SEQUENCE 6b 1
+ EFFECT ParticlesEffect 0 4 1 # Particles layer
+ EFFECT GaussianBlurEffect 0 8 1 # Blur
+
+SEQUENCE 7b 0
+ EFFECT FadeEffect 0.1 1.0 5 # Add fade
+ EFFECT HeptagonEffect 0.0 .2 0 # Main geometric effect
+
+# Post-processing chain (priority 10 = applied after scene rendering)
+# Effects are applied in priority order: lower numbers first
+SEQUENCE 8b 3
+ EFFECT ThemeModulationEffect 0 4 0 # Brightness modulation (first)
+ EFFECT HeptagonEffect 0.0 4.0 0 # Main geometric effect
+ EFFECT GaussianBlurEffect 0 8 1 # Blur
+ EFFECT ChromaAberrationEffect 0 6 2 # Color separation
+ EFFECT SolarizeEffect 0 10 3 # Color inversion (last)
+
+SEQUENCE 12b 2
+ EFFECT FlashCubeEffect .2 3 -1 # Background cube (priority -1 = behind everything)
+ EFFECT HeptagonEffect 0 4 0
+ EFFECT ParticlesEffect 0 4 1 # Particles layer
+
+SEQUENCE 15b 2
+ EFFECT FlashCubeEffect .2 3 -1 # Background cube (priority -1 = behind everything)
+ EFFECT FlashEffect 0.0 1 0
+
+SEQUENCE 16b 10
+ EFFECT FlashCubeEffect .2 3 -1 # Background cube (priority -1 = behind everything)
+ EFFECT GaussianBlurEffect 0 8 1 # Blur
+ EFFECT FlashEffect 0.0 0.2 4 # Add flash after solarize
+ EFFECT FlashEffect 1b 0.2 4 # Add flash after solarize
+
+SEQUENCE 17b 2
+ EFFECT ThemeModulationEffect 0 4 0 # Brightness modulation (first)
+ EFFECT HeptagonEffect 0.2 2.0 1 # Main geometric effect
+ EFFECT ParticlesEffect 0 4 1 # Particles layer
+ EFFECT GaussianBlurEffect 0 8 3 # Blur
+ EFFECT Hybrid3DEffect 0 4 2 # 3D objects (priority 2 = foreground)
+ EFFECT ChromaAberrationEffect 0 6 4 # Color separation
+
+SEQUENCE 24b 1
+ EFFECT ThemeModulationEffect 0 8 0 # Brightness modulation (first)
+ EFFECT HeptagonEffect 0.2 2.0 1 # Main geometric effect
+ EFFECT Hybrid3DEffect 0 20 2 # 3D objects (priority 2 = foreground)
+ EFFECT GaussianBlurEffect 0 8 3 # Blur
+ EFFECT ChromaAberrationEffect 0 10 4 # Color separation
+ EFFECT SolarizeEffect 0 10 5 # Color inversion (last)
+
+SEQUENCE 32b 0
+ EFFECT ThemeModulationEffect 0 4 0 # Brightness modulation (first)
+ EFFECT HeptagonEffect 0 16 1 # Main geometric effect
+ EFFECT ChromaAberrationEffect 0 16 3 # Color separation
+ EFFECT GaussianBlurEffect 0 8 4 # Blur
+
+SEQUENCE 48b 0
+ EFFECT ThemeModulationEffect 0 4 0 # Brightness modulation (first)
+ EFFECT HeptagonEffect 0.2 2.0 1 # Main geometric effect
+ EFFECT GaussianBlurEffect 0 8 3 # Blur
+ EFFECT SolarizeEffect 0 2 5 # Color inversion (last)
+
+SEQUENCE 56b 0
+ EFFECT ThemeModulationEffect 0 8 0 # Brightness modulation (first)
+ EFFECT HeptagonEffect 0.2 2.0 0 # Main geometric effect
+ EFFECT Hybrid3DEffect 0 4 1 # 3D objects (priority 2 = foreground)
+ EFFECT HeptagonEffect 0 16 2 # Main geometric effect
+ EFFECT ChromaAberrationEffect 0 16 3 # Color separation
+ EFFECT GaussianBlurEffect 0 8 4 # Blur
+
+SEQUENCE 62b 0
+ EFFECT ThemeModulationEffect 0 3 0 # Brightness modulation (first)
+ EFFECT SolarizeEffect 0 3 5 # Color inversion (last)
+# Demo automatically exits at this time (supports beat notation)
+END_DEMO 65b
diff --git a/assets/final/BASS_SYNTH_1.spec b/assets/final/BASS_SYNTH_1.spec
index 1fd7ad0..b0e9eb9 100644
--- a/assets/final/BASS_SYNTH_1.spec
+++ b/assets/final/BASS_SYNTH_1.spec
Binary files differ
diff --git a/assets/final/shaders/gaussian_blur.wgsl b/assets/final/shaders/gaussian_blur.wgsl
index fd083ff..7d39ac4 100644
--- a/assets/final/shaders/gaussian_blur.wgsl
+++ b/assets/final/shaders/gaussian_blur.wgsl
@@ -23,7 +23,12 @@ struct Uniforms {
@fragment fn fs_main(@builtin(position) p: vec4<f32>) -> @location(0) vec4<f32> {
let uv = p.xy / uniforms.resolution;
var res = vec4<f32>(0.0);
- let size = 5.0 * uniforms.intensity;
+
+ // Reduced base size + dramatic beat pulsation
+ let base_size = 2.0;
+ let pulse = 0.5 + uniforms.intensity * 2.0; // Pulsate between 0.5x and 2.5x with beat
+ let size = base_size * pulse;
+
for (var x: f32 = -2.0; x <= 2.0; x += 1.0) {
for (var y: f32 = -2.0; y <= 2.0; y += 1.0) {
res += textureSample(txt, smplr, uv + vec2<f32>(x, y) * size / uniforms.resolution.x);
diff --git a/assets/final/shaders/solarize.wgsl b/assets/final/shaders/solarize.wgsl
index 9bd0212..fcb9d80 100644
--- a/assets/final/shaders/solarize.wgsl
+++ b/assets/final/shaders/solarize.wgsl
@@ -23,15 +23,37 @@ struct Uniforms {
@fragment fn fs_main(@builtin(position) p: vec4<f32>) -> @location(0) vec4<f32> {
let uv = p.xy / uniforms.resolution;
var col = textureSample(txt, smplr, uv);
- let thr = 0.5 + 0.3 * sin(uniforms.time);
- if (col.r < thr) {
- col.r = 1.0 - col.r;
- }
- if (col.g < thr) {
- col.g = 1.0 - col.g;
- }
- if (col.b < thr) {
- col.b = 1.0 - col.b;
+
+ // Patterns are 2 seconds long (120 BPM, 4 beats)
+ let pattern_num = u32(uniforms.time / 2.0);
+ let is_even_pattern = (pattern_num % 2u) == 0u;
+
+ // Reduced threshold range for subtler effect
+ let thr = 0.4 + 0.15 * sin(uniforms.time);
+ let solarize_strength = 0.4; // Reduced from 1.0 for less saturation
+
+ if (is_even_pattern) {
+ // Even patterns: Subtle red-orange tint
+ if (col.r < thr) {
+ col.r = mix(col.r, 1.0 - col.r, solarize_strength);
+ }
+ if (col.g < thr) {
+ col.g = mix(col.g, 1.0 - col.g * 0.7, solarize_strength * 0.7);
+ }
+ if (col.b < thr) {
+ col.b = mix(col.b, col.b * 0.5, solarize_strength);
+ }
+ } else {
+ // Odd patterns: Subtle blue-cyan tint
+ if (col.r < thr) {
+ col.r = mix(col.r, col.r * 0.6, solarize_strength);
+ }
+ if (col.g < thr) {
+ col.g = mix(col.g, 1.0 - col.g * 0.8, solarize_strength * 0.8);
+ }
+ if (col.b < thr) {
+ col.b = mix(col.b, 1.0 - col.b, solarize_strength);
+ }
}
return col;
}
diff --git a/assets/music.track b/assets/music.track
index 5f9dc4a..95297ce 100644
--- a/assets/music.track
+++ b/assets/music.track
@@ -1,206 +1,283 @@
-# Tempo Test Track - Drum beat with acceleration/deceleration tests
-# Tests variable tempo system with clear, debuggable patterns
+# Enhanced Demo Track - Progressive buildup with varied percussion
+# Features acceleration/deceleration with diverse samples and melodic progression
-# Import drum samples
+# Import expanded drum kit
SAMPLE ASSET_KICK_1
SAMPLE ASSET_KICK_2
+SAMPLE ASSET_KICK_3
SAMPLE ASSET_SNARE_1
+SAMPLE ASSET_SNARE_2
SAMPLE ASSET_SNARE_3
+SAMPLE ASSET_SNARE_4
SAMPLE ASSET_HIHAT_1
SAMPLE ASSET_HIHAT_2
+SAMPLE ASSET_HIHAT_3
+SAMPLE ASSET_HIHAT_4
SAMPLE ASSET_CRASH_1
+SAMPLE ASSET_RIDE_1
+SAMPLE ASSET_SPLASH_1
SAMPLE ASSET_BASS_1
-# Simple kick pattern with light syncopation
-# Pattern duration: 4 beats (2 seconds at 120 BPM)
+# === KICK PATTERNS ===
+# Varied kicks for different sections
PATTERN kick_basic
0.0, ASSET_KICK_1, 1.0, 0.0
2.0, ASSET_KICK_1, 1.0, 0.0
2.5, ASSET_KICK_2, 0.7, -0.2
-# Snare on beats 2 and 4
-PATTERN snare_basic
- 1.0, ASSET_SNARE_1, 0.9, 0.1
- 3.0, ASSET_SNARE_1, 0.9, 0.1
-
-# Hi-hat 8th notes with stress on beats
-PATTERN hihat_stressed
- 0.0, ASSET_HIHAT_2, 0.8, -0.3
- 0.5, ASSET_HIHAT_1, 0.4, 0.3
- 1.0, ASSET_HIHAT_2, 0.8, -0.3
- 1.5, ASSET_HIHAT_1, 0.4, 0.3
- 2.0, ASSET_HIHAT_2, 0.8, -0.3
- 2.5, ASSET_HIHAT_1, 0.4, 0.3
- 3.0, ASSET_HIHAT_2, 0.8, -0.3
- 3.5, ASSET_HIHAT_1, 0.4, 0.3
+PATTERN kick_varied
+ 0.0, ASSET_KICK_2, 1.0, 0.0
+ 2.0, ASSET_KICK_3, 0.95, 0.0
+ 2.5, ASSET_KICK_1, 0.7, 0.2
-# Denser kick pattern for reset trick (2x faster)
PATTERN kick_dense
0.0, ASSET_KICK_1, 1.0, 0.0
0.5, ASSET_KICK_2, 0.6, -0.2
- 1.0, ASSET_KICK_1, 1.0, 0.0
+ 1.0, ASSET_KICK_3, 0.95, 0.0
1.5, ASSET_KICK_2, 0.6, 0.2
2.0, ASSET_KICK_1, 1.0, 0.0
2.5, ASSET_KICK_2, 0.6, -0.2
- 3.0, ASSET_KICK_1, 1.0, 0.0
+ 3.0, ASSET_KICK_3, 0.95, 0.0
3.5, ASSET_KICK_2, 0.6, 0.2
-# Denser snare pattern
+# === SNARE PATTERNS ===
+# Louder snare for more punch
+PATTERN snare_basic
+ 1.0, ASSET_SNARE_1, 1.1, 0.1
+ 3.0, ASSET_SNARE_1, 1.1, 0.1
+
+PATTERN snare_varied
+ 1.0, ASSET_SNARE_2, 1.05, -0.1
+ 3.0, ASSET_SNARE_4, 1.1, 0.1
+
PATTERN snare_dense
- 0.5, ASSET_SNARE_3, 0.7, 0.0
- 1.0, ASSET_SNARE_1, 0.9, 0.1
- 1.5, ASSET_SNARE_3, 0.7, 0.0
- 2.5, ASSET_SNARE_3, 0.7, 0.0
- 3.0, ASSET_SNARE_1, 0.9, 0.1
- 3.5, ASSET_SNARE_3, 0.7, 0.0
+ 0.5, ASSET_SNARE_3, 0.9, 0.0
+ 1.0, ASSET_SNARE_1, 1.1, 0.1
+ 1.5, ASSET_SNARE_4, 0.85, 0.0
+ 2.5, ASSET_SNARE_3, 0.9, 0.0
+ 3.0, ASSET_SNARE_2, 1.05, 0.1
+ 3.5, ASSET_SNARE_4, 0.85, 0.0
-# Crash accent
+# === HIHAT PATTERNS ===
+PATTERN hihat_basic
+ 0.0, ASSET_HIHAT_2, 0.7, -0.3
+ 0.5, ASSET_HIHAT_1, 0.35, 0.3
+ 1.0, ASSET_HIHAT_2, 0.7, -0.3
+ 1.5, ASSET_HIHAT_1, 0.35, 0.3
+ 2.0, ASSET_HIHAT_2, 0.7, -0.3
+ 2.5, ASSET_HIHAT_1, 0.35, 0.3
+ 3.0, ASSET_HIHAT_2, 0.7, -0.3
+ 3.5, ASSET_HIHAT_1, 0.35, 0.3
+
+PATTERN hihat_varied
+ 0.0, ASSET_HIHAT_3, 0.7, -0.3
+ 0.5, ASSET_HIHAT_1, 0.35, 0.3
+ 1.0, ASSET_HIHAT_4, 0.65, -0.2
+ 1.5, ASSET_HIHAT_1, 0.35, 0.3
+ 2.0, ASSET_HIHAT_3, 0.7, -0.3
+ 2.5, ASSET_HIHAT_1, 0.35, 0.3
+ 3.0, ASSET_HIHAT_4, 0.65, -0.2
+ 3.5, ASSET_HIHAT_1, 0.35, 0.3
+
+# === CYMBAL PATTERNS ===
+# Crash for major transitions only
PATTERN crash
0.0, ASSET_CRASH_1, 0.85, 0.0
-# Bass line in E
+# Ride for driving the beat (replaces most crashes)
+PATTERN ride
+ 0.0, ASSET_RIDE_1, 0.75, 0.2
+
+# Faster ride beat for intensity
+PATTERN ride_fast
+ 0.0, ASSET_RIDE_1, 0.75, 0.2
+ 0.5, ASSET_RIDE_1, 0.6, 0.2
+ 1.0, ASSET_RIDE_1, 0.75, 0.2
+ 1.5, ASSET_RIDE_1, 0.6, 0.2
+ 2.0, ASSET_RIDE_1, 0.75, 0.2
+ 2.5, ASSET_RIDE_1, 0.6, 0.2
+ 3.0, ASSET_RIDE_1, 0.75, 0.2
+ 3.5, ASSET_RIDE_1, 0.6, 0.2
+
+# Splash for accent/variation
+PATTERN splash
+ 0.0, ASSET_SPLASH_1, 0.7, -0.2
+
+# === BASS PATTERNS ===
+# Progressive bass introduction with reduced volumes
+PATTERN bass_e_soft
+ 0.0, NOTE_E2, 0.4, 0.0
+ 2.0, NOTE_E2, 0.35, 0.0
+
PATTERN bass_e
- 0.0, NOTE_E2, 0.9, 0.0
- 1.0, NOTE_E2, 0.7, 0.0
- 2.0, NOTE_E2, 0.9, 0.0
- 2.5, NOTE_E2, 0.6, 0.0
- 3.0, NOTE_E2, 0.7, 0.0
+ 0.0, NOTE_E2, 0.5, 0.0
+ 1.0, NOTE_E2, 0.4, 0.0
+ 2.0, NOTE_E2, 0.5, 0.0
+ 2.5, NOTE_E2, 0.35, 0.0
+ 3.0, NOTE_E2, 0.4, 0.0
-# Bass line with variation (E-G progression)
PATTERN bass_eg
- 0.0, NOTE_E2, 0.9, 0.0
- 1.0, NOTE_E2, 0.7, 0.0
- 2.0, NOTE_G2, 0.9, 0.0
- 3.0, NOTE_G2, 0.7, 0.0
+ 0.0, NOTE_E2, 0.5, 0.0
+ 1.0, NOTE_E2, 0.4, 0.0
+ 2.0, NOTE_G2, 0.5, 0.0
+ 3.0, NOTE_G2, 0.4, 0.0
+
+PATTERN bass_progression
+ 0.0, NOTE_E2, 0.5, 0.0
+ 1.0, NOTE_D2, 0.45, 0.0
+ 2.0, NOTE_C2, 0.5, 0.0
+ 3.0, NOTE_G2, 0.4, 0.0
+
+# === SYNCOPATED BASS PATTERNS ===
+# Punchy, syncopated bass with short notes for final section
+PATTERN bass_synco_1
+ 0.0, NOTE_E2, 0.6, 0.0
+ 0.25, NOTE_E2, 0.5, 0.1
+ 0.75, NOTE_E2, 0.55, -0.1
+ 1.5, NOTE_E2, 0.5, 0.0
+ 2.0, NOTE_E2, 0.6, 0.0
+ 2.75, NOTE_G2, 0.55, 0.1
+ 3.25, NOTE_E2, 0.5, 0.0
-# Simple melody in E minor
-PATTERN melody_em
- 0.0, NOTE_E4, 0.7, 0.0
- 0.5, NOTE_G4, 0.6, 0.1
- 1.0, NOTE_B4, 0.7, -0.1
- 2.0, NOTE_A4, 0.6, 0.0
- 2.5, NOTE_G4, 0.6, 0.1
- 3.0, NOTE_E4, 0.7, 0.0
+PATTERN bass_synco_2
+ 0.0, NOTE_E2, 0.6, 0.0
+ 0.5, NOTE_D2, 0.55, -0.1
+ 1.25, NOTE_E2, 0.5, 0.1
+ 1.75, NOTE_D2, 0.5, 0.0
+ 2.0, NOTE_C2, 0.6, 0.0
+ 2.5, NOTE_E2, 0.5, 0.1
+ 3.0, NOTE_G2, 0.6, 0.0
+ 3.5, NOTE_E2, 0.5, -0.1
-# Score: time_sec, pattern_name
-# NOTE: Timing in MUSIC TIME (not physical time)
-# Physical time will vary based on tempo_scale in main.cc
+PATTERN bass_synco_3
+ 0.0, NOTE_E2, 0.65, 0.0
+ 0.25, NOTE_E2, 0.5, 0.0
+ 0.5, NOTE_E2, 0.55, 0.1
+ 1.0, NOTE_G2, 0.6, 0.0
+ 1.5, NOTE_E2, 0.5, -0.1
+ 2.25, NOTE_D2, 0.55, 0.0
+ 2.75, NOTE_E2, 0.5, 0.1
+ 3.5, NOTE_E2, 0.55, 0.0
+
+# === SCORE ===
SCORE
-# Phase 1: Steady beat (0-10s music time)
-# tempo_scale = 1.0 throughout
+# Phase 1: Intro - Minimal setup (0-4s)
0.0, crash
0.0, kick_basic
- 0.0, snare_basic
- 0.0, hihat_stressed
+ 0.0, hihat_basic
2.0, kick_basic
2.0, snare_basic
- 2.0, hihat_stressed
+ 2.0, hihat_basic
- 4.0, crash
- 4.0, kick_basic
+# Phase 2: Build - Add variety (4-8s)
+ 4.0, ride
+ 4.0, kick_varied
4.0, snare_basic
- 4.0, hihat_stressed
+ 4.0, hihat_varied
- 6.0, kick_basic
- 6.0, snare_basic
- 6.0, hihat_stressed
+ 6.0, kick_varied
+ 6.0, snare_varied
+ 6.0, hihat_varied
- 8.0, crash
+# Phase 3: Introduce bass softly (8-12s)
+ 8.0, splash
8.0, kick_basic
8.0, snare_basic
- 8.0, hihat_stressed
+ 8.0, hihat_basic
+ 8.0, bass_e_soft
-# Phase 2: Acceleration section (10-15s music time)
-# tempo_scale accelerates from 1.0 to 2.0
-# Then resets to 1.0 with denser patterns
- 10.0, crash
- 10.0, kick_basic
- 10.0, snare_basic
- 10.0, hihat_stressed
- 10.0, bass_e
+ 10.0, kick_varied
+ 10.0, snare_varied
+ 10.0, hihat_varied
+ 10.0, bass_e_soft
+# Phase 4: Acceleration section (12-16s music time)
+# tempo_scale accelerates from 1.0 to 2.0
+ 12.0, ride
12.0, kick_basic
12.0, snare_basic
- 12.0, hihat_stressed
+ 12.0, hihat_basic
12.0, bass_e
- 14.0, kick_basic
- 14.0, snare_basic
- 14.0, hihat_stressed
- 14.0, bass_e
+ 14.0, kick_varied
+ 14.0, snare_varied
+ 14.0, hihat_varied
+ 14.0, bass_eg
-# Phase 3: After reset - denser patterns (16-20s music time)
+# Phase 5: After acceleration reset - denser patterns (16-20s)
# tempo_scale = 1.0 with 2x denser patterns
16.0, crash
16.0, kick_dense
16.0, snare_dense
- 16.0, hihat_stressed
+ 16.0, hihat_varied
16.0, bass_e
18.0, kick_dense
18.0, snare_dense
- 18.0, hihat_stressed
- 18.0, bass_eg
+ 18.0, hihat_basic
+ 18.0, bass_progression
-# Phase 4: Slow-down section (20-25s music time)
-# tempo_scale decelerates from 1.0 to 0.5
-# Then resets to 1.0
- 20.0, crash
+# Phase 6: Continue buildup (20-24s)
+ 20.0, ride
20.0, kick_dense
20.0, snare_dense
- 20.0, hihat_stressed
+ 20.0, hihat_varied
20.0, bass_e
22.0, kick_dense
22.0, snare_dense
- 22.0, hihat_stressed
- 22.0, bass_e
+ 22.0, hihat_basic
+ 22.0, bass_eg
+# Phase 7: Slow-down section (24-28s music time)
+# tempo_scale decelerates from 1.0 to 0.5
+ 24.0, splash
24.0, kick_dense
24.0, snare_dense
- 24.0, hihat_stressed
- 24.0, bass_eg
+ 24.0, hihat_varied
+ 24.0, bass_progression
-# Phase 5: After slow-down reset (26-30s music time)
-# Back to normal tempo with bass
- 26.0, crash
- 26.0, kick_basic
- 26.0, snare_basic
- 26.0, hihat_stressed
+ 26.0, kick_dense
+ 26.0, snare_dense
+ 26.0, hihat_basic
26.0, bass_e
+# Phase 8: Build to break (28-31s)
+ 28.0, ride_fast
28.0, kick_basic
- 28.0, snare_basic
- 28.0, hihat_stressed
+ 28.0, snare_varied
+ 28.0, hihat_varied
28.0, bass_eg
-# Phase 6: Add melody (30s+ music time)
- 30.0, crash
- 30.0, kick_basic
+ 30.0, kick_varied
30.0, snare_basic
- 30.0, hihat_stressed
- 30.0, bass_e
- 30.0, melody_em
+ 30.0, hihat_basic
+ 30.0, bass_progression
+
+# DRAMATIC BREAK: 1 beat of silence before climax (31-32s)
+ 31.0, hihat_basic
- 32.0, kick_basic
- 32.0, snare_basic
- 32.0, hihat_stressed
- 32.0, bass_eg
- 32.0, melody_em
+# Phase 9: CLIMAX - Punchy syncopated bass with fast ride (32-36s)
+ 32.0, crash
+ 32.0, ride_fast
+ 32.0, kick_dense
+ 32.0, snare_dense
+ 32.0, hihat_varied
+ 32.0, bass_synco_1
- 34.0, kick_basic
- 34.0, snare_basic
- 34.0, hihat_stressed
- 34.0, bass_e
- 34.0, melody_em
+ 34.0, ride_fast
+ 34.0, kick_dense
+ 34.0, snare_dense
+ 34.0, hihat_basic
+ 34.0, bass_synco_2
- 36.0, crash
- 36.0, kick_basic
- 36.0, snare_basic
- 36.0, hihat_stressed
- 36.0, bass_eg
- 36.0, melody_em
+# Phase 10: Final push with syncopation (36-38s)
+ 36.0, ride_fast
+ 36.0, kick_dense
+ 36.0, snare_dense
+ 36.0, hihat_varied
+ 36.0, bass_synco_3
# Ending
38.0, crash