summaryrefslogtreecommitdiff
path: root/assets/demo.seq
blob: 0d73374468a32732cd154f2412878a1d533e21d8 (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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# ============================================================================
# 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.
#
# DEBUGGING & VALIDATION:
#   Validate without generating code:
#     ./build/seq_compiler assets/demo.seq
#
#   Generate ASCII Gantt chart:
#     ./build/seq_compiler assets/demo.seq --gantt=timeline.txt
#
#   Generate HTML/SVG Gantt chart (recommended):
#     ./build/seq_compiler assets/demo.seq --gantt-html=timeline.html
#     Open timeline.html in browser for interactive visualization
#
#   All modes can be combined:
#     ./build/seq_compiler assets/demo.seq timeline.cc --gantt=t.txt --gantt-html=t.html
#
# 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
# ============================================================================

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