summaryrefslogtreecommitdiff
path: root/BEAT_TIMING_SUMMARY.md
blob: 6df8152173b06382a4291a09954df882befda0b8 (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
# Beat-Based Timing Implementation Summary

## Changes Made

### 1. **Documentation Updated**
- `doc/SEQUENCE.md`: Beat-based format as primary, updated runtime parameters
- `tools/timeline_editor/README.md`: Beat notation as default

### 2. **Uniform Structure Enhanced**
```cpp
struct CommonPostProcessUniforms {
  vec2 resolution;        // Screen dimensions
  float aspect_ratio;     // Width/height ratio
  float time;             // Physical seconds (unaffected by tempo)
  float beat_time;        // NEW: Absolute beats (musical time)
  float beat_phase;       // NEW: Fractional beat 0-1 (was "beat")
  float audio_intensity;  // Audio peak
  float _pad;            // Alignment
};  // 32 bytes (unchanged size)
```

### 3. **Shader Updates**
- All `common_uniforms.wgsl` files updated with new field names
- Effects can now use:
  - `time` for physics-based animation (constant speed)
  - `beat_time` for musical animation (bars/beats)
  - `beat_phase` for smooth per-beat oscillation

### 4. **Seq Compiler**
- `tools/seq_compiler.cc`: Beat notation as default parser behavior
- Format: `5` = beats, `2.5s` = explicit seconds
- BPM-based conversion at compile time (beats → seconds)

### 5. **Timeline Files Converted**
- `workspaces/main/timeline.seq`: Added 's' suffix to preserve timing
- `workspaces/test/timeline.seq`: Added 's' suffix to preserve timing
- Existing demos run unchanged with explicit seconds notation

### 6. **Runtime Updates**
- `main.cc`: Calculates `beat_time` and `beat_phase` from audio time
- `gpu.cc`: Passes both physical time and beat time to effects
- `effect.cc`: Updated uniform construction with new fields

## Key Benefits

✅ **Musical Alignment:** Sequences defined in beats stay synchronized to music  
✅ **BPM Independence:** Changing BPM doesn't break sequence timing  
✅ **Intuitive Authoring:** Timeline matches musical structure (bars/beats)  
✅ **Tempo Separation:** Variable tempo affects only audio, not visual rendering  
✅ **New Capabilities:** Shaders can animate to musical time  
✅ **Backward Compatible:** Explicit 's' suffix preserves existing timelines  

## Migration Path

**Existing timelines:** Use explicit `s` suffix (already done)
```
SEQUENCE 2.50s 0
  EFFECT + Flash 0.00s 1.00s
```

**New content:** Use beat notation (natural default)
```
# BPM 120
SEQUENCE 0 0 "Intro"     # Beat 0 = bar 1
  EFFECT + Flash 0 2     # Beats 0-2 (half bar)
  EFFECT + Fade 4 8      # Beats 4-8 (full bar)
```

## Testing

- **Build:** ✅ Complete (100%)
- **Tests:** ✅ 34/36 passing (94%)
- **Demo:** Ready to run with `./build/demo64k`

## Next Steps

1. Test visual effects with new beat_time parameter
2. Create beat-synchronized shader animations
3. Consider converting existing timelines to beat notation