summaryrefslogtreecommitdiff
path: root/doc/TRACKER.md
diff options
context:
space:
mode:
Diffstat (limited to 'doc/TRACKER.md')
-rw-r--r--doc/TRACKER.md74
1 files changed, 13 insertions, 61 deletions
diff --git a/doc/TRACKER.md b/doc/TRACKER.md
index f3a34a3..6e71951 100644
--- a/doc/TRACKER.md
+++ b/doc/TRACKER.md
@@ -1,56 +1,17 @@
# Minimal Audio Tracker
-in addition to being able to generate spectrograms (aka "Samples") on the
-fly and play them at once, we need a way to assemble samples (assets or
-generated) into modifiable patterns and loops. Like what the Trackers were
-doing in the old time.
-
-## The idea
-
-A script can take a 'tracker music' text file that describes the sequence
-of samples (a 'pattern') in a first part. In a second part, these sequence
-a laid out with a timestamp (potentially overlapping) to generate the full
-music score.
-
-The patterns' samples (spectrograms) are not yet generated, it's just the
-'musical score' here. We still need to 'play' the score but with modifiers
-applied.
-
-### Modifiers
-
-For diversity, these essential patterns can be modified on the fly before
-being generated as spectrogram on the fly.
-Modifiers could be:
- * randomize (for drums, e.g.)
- * add accents and stresses
- * modulate volume
- * add distortion or noise
- * add 'grain' and static noise
- * flanger, vocoding, robotic voice, etc.
- * etc.
-
-These modifiers are applied to a predefined pattern just before it's
-generated for playback (or assembling in the final track).
-
-### How would that work in practice?
-
-The musical score is a text file, that a tool will convert to run-time
-code to be compiled in the final binary demo64k.
-This generated code can be mixed with fixed code from the demo codebase
-itself (explosion predefined at a given time ,etc.)
-The baking is done at compile time, and the code will go in src/generated/
+System for assembling audio samples (assets or procedural) into patterns and loops.
## .track File Format
-### Timing System
+### Timing Convention
-**Unit-less Timing Convention:**
-- All time values are **unit-less** (not beats or seconds)
-- Convention: **1 unit = 4 beats**
-- Conversion to seconds: `seconds = units * (4 / BPM) * 60`
+**Unit-less timing:**
+- **1 unit = 4 beats**
+- Conversion: `seconds = units * (4 / BPM) * 60`
- At 120 BPM: 1 unit = 2 seconds
-This makes patterns independent of BPM - changing BPM only affects playback speed, not pattern structure.
+Patterns are BPM-independent. Changing BPM only affects playback speed.
### File Structure
@@ -96,29 +57,20 @@ PATTERN melody LENGTH 1.0
0.50, NOTE_G4, 0.8, 0.0
```
-### Conversion Reference
-
-At 120 BPM (1 unit = 4 beats = 2 seconds):
-
-| Units | Beats | Seconds | Description |
-|-------|-------|---------|-------------|
-| 0.00 | 0 | 0.0 | Start |
-| 0.25 | 1 | 0.5 | Quarter |
-| 0.50 | 2 | 1.0 | Half |
-| 0.75 | 3 | 1.5 | Three-quarter |
-| 1.00 | 4 | 2.0 | Full pattern |
-
### Pattern Length
-- `LENGTH` parameter is optional, defaults to 1.0
-- Can be any value (0.5 for half-length, 2.0 for double-length, etc.)
-- Events must be within range `[0.0, LENGTH]`
+- `LENGTH` parameter defaults to 1.0 if omitted
+- Can be any value (0.5 for half-length, 2.0 for double-length)
+- Events must be within `[0.0, LENGTH]`
-Example of half-length pattern:
+Example half-length pattern:
```
PATTERN short_fill LENGTH 0.5 # 2 beats = 1 second at 120 BPM
0.00, ASSET_HIHAT, 0.7, 0.0
0.50, ASSET_HIHAT, 0.6, 0.0 # 0.50 * 0.5 = 1 beat into the pattern
```
+### Future: Modifiers
+Potential runtime modifiers (not yet implemented):
+- Randomization, accents, volume modulation, distortion, noise, effects