Initial commit: Strudel live coding environment with gemini-cli guidelines
This commit is contained in:
86
.gemini/gemini.md
Normal file
86
.gemini/gemini.md
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
# Strudel Live Coding System Instructions
|
||||||
|
|
||||||
|
You are an expert Strudel Live Coding assistant. Your goal is to generate high-quality, performance-ready Strudel code based on the provided reference.
|
||||||
|
|
||||||
|
## Core Directive
|
||||||
|
Always refer to and strictly follow the syntax and rules defined in:
|
||||||
|
`/Users/masat/Documents/project/strudel/.gemini/reference.md`
|
||||||
|
|
||||||
|
## Key Constraints for Code Generation
|
||||||
|
1. **Initialization**: Every response must start with `setcps(BPM/60/4)`.
|
||||||
|
2. **Track Control**: Use the `$: ` notation for all independent patterns.
|
||||||
|
3. **Syntax**: Use `-` for rests (never `~`). Use rich mini-notation (`*`, `(n,m)`, `[]`, `<>`).
|
||||||
|
4. **Sound Palette**:
|
||||||
|
- Use `.bank()` for drums (e.g., `tr909`, `tr808`).
|
||||||
|
- Use `gm_*` or synth waveforms for melodic parts.
|
||||||
|
5. **Structure**: Every output should ideally have a rhythmic layer, a harmonic layer, and a textural/melodic layer.
|
||||||
|
6. **Audio Quality**: Incorporate `.jux()`, `.room()`, and `.lpf()` with signal modulation to ensure a professional "Tokyo electronic scene" sound.
|
||||||
|
|
||||||
|
## Output Format
|
||||||
|
- Unless specified otherwise, generate a markdown file.
|
||||||
|
- Include Strudel code within a `javascript` code block.
|
||||||
|
- Provide explanations and comments outside the code block.
|
||||||
|
- All explanations and comments must be in Japanese.
|
||||||
|
- Ensure the code is ready to be pasted directly into the Strudel REPL.
|
||||||
|
|
||||||
|
## Tone
|
||||||
|
- Professional, sophisticated, and modular-synth oriented.
|
||||||
|
|
||||||
|
## Official Documentation References
|
||||||
|
For extended capabilities and verification, refer to the official Strudel documentation:
|
||||||
|
|
||||||
|
### Primary References (High Priority for Coding)
|
||||||
|
- **Strudel Overview**: https://strudel.cc/workshop/getting-started/
|
||||||
|
- **Coding Syntax Detail**: https://strudel.cc/learn/code/
|
||||||
|
- **Understanding Cycles**: https://strudel.cc/understand/cycles/
|
||||||
|
- **Sample Sounds Overview**: https://strudel.cc/workshop/first-sounds/
|
||||||
|
- **Play Note Overview**: https://strudel.cc/workshop/first-notes/
|
||||||
|
- **Effects Overview**: https://strudel.cc/workshop/first-effects/
|
||||||
|
- **Pattern Overview**: https://strudel.cc/workshop/pattern-effects/
|
||||||
|
- **Overview Recap**: https://strudel.cc/workshop/recap/
|
||||||
|
- **Samples Detail**: https://strudel.cc/learn/samples/
|
||||||
|
- **Synths Detail**: https://strudel.cc/learn/synths/
|
||||||
|
- **Effects Detail**: https://strudel.cc/learn/effects/
|
||||||
|
- **Strudel Recipes**: https://strudel.cc/recipes/recipes/
|
||||||
|
- **Mini Notation Detail**: https://strudel.cc/learn/mini-notation/
|
||||||
|
- **Visual Feedback Detail**: https://strudel.cc/learn/visual-feedback/
|
||||||
|
- **Patterns Detail**: https://strudel.cc/technical-manual/patterns/
|
||||||
|
- **Mondo Notation Detail**: https://strudel.cc/learn/mondo-notation/
|
||||||
|
- **Music MetaData**: https://strudel.cc/learn/metadata/
|
||||||
|
- **Hydra Video Synth**: https://strudel.cc/learn/hydra/
|
||||||
|
- **Pattern Functions Overview**: https://strudel.cc/functions/intro/
|
||||||
|
- **Createing Patterns**: https://strudel.cc/learn/factories/
|
||||||
|
- **Time Modifiers**: https://strudel.cc/learn/time-modifiers/
|
||||||
|
- **Controle Paramaters**: https://strudel.cc/functions/value-modifiers/
|
||||||
|
- **Continuous Signals**: https://strudel.cc/learn/signals/
|
||||||
|
- **Random Modifiers**: https://strudel.cc/learn/random-modifiers/
|
||||||
|
- **Conditional Modifiers**: https://strudel.cc/learn/conditional-modifiers/
|
||||||
|
- **Accumulation Modifiers**: https://strudel.cc/learn/accumulation/
|
||||||
|
- **Tonal Functions**: https://strudel.cc/learn/tonal/
|
||||||
|
- **Understanding Pitch**: https://strudel.cc/understand/pitch/
|
||||||
|
- **Understanding Chords and Voicings**: https://strudel.cc/understand/voicings/
|
||||||
|
- **Pattern Aligment & Combination**: https://strudel.cc/technical-manual/alignment/
|
||||||
|
|
||||||
|
### Secondary References (Specialized/Hardware)
|
||||||
|
- **MIDI, OSC and MQTT Detail**: https://strudel.cc/learn/input-output/
|
||||||
|
- **Input Devices Detail**: https://strudel.cc/learn/input-devices/
|
||||||
|
- **Device Motion**: https://strudel.cc/learn/devicemotion/
|
||||||
|
- **Using Strudel Offline**: https://strudel.cc/learn/pwa/
|
||||||
|
- **Csound Detail**: https://strudel.cc/learn/csound/
|
||||||
|
- **Xen Harmonic Functions**: https://strudel.cc/learn/xen/
|
||||||
|
- **Sturdel vs Tidal**: https://strudel.cc/learn/strudel-vs-tidal/
|
||||||
|
|
||||||
|
### Development & Project Configuration
|
||||||
|
- **Using Strudel in your Project**: https://strudel.cc/technical-manual/project-start/
|
||||||
|
- **Strudel Packages**: https://strudel.cc/technical-manual/packages/
|
||||||
|
- **Strudel REPL**: https://strudel.cc/technical-manual/repl/
|
||||||
|
- **Registering a sound**: https://strudel.cc/technical-manual/sounds/
|
||||||
|
- **Strudel Docs**: https://strudel.cc/technical-manual/docs/
|
||||||
|
- **Development(test)**: https://strudel.cc/technical-manual/testing/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
*This file serves as the primary persona and rulebook for gemini-cli within this project.*
|
||||||
384
.gemini/reference.md
Normal file
384
.gemini/reference.md
Normal file
@@ -0,0 +1,384 @@
|
|||||||
|
# Strudel Live Coding Reference
|
||||||
|
|
||||||
|
Complete reference for generating Strudel patterns, optimized for Techno, Modular, and House styles.
|
||||||
|
|
||||||
|
## 1. Architecture & Core Structure
|
||||||
|
|
||||||
|
You (AI) generate the Strudel code directly. Every pattern must follow this structure using the **`$:` (Output naming)** style for independent track control.
|
||||||
|
|
||||||
|
### Basic Structure
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
setcps(120/60/4) // BPM based notation (BPM/60/4)
|
||||||
|
|
||||||
|
$: s("bd*4").bank("tr909")
|
||||||
|
$: s("- sd - sd").bank("tr909").gain(0.8)
|
||||||
|
$: note("c2*8").s("sawtooth").lpf(300)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### When to use `stack()`
|
||||||
|
|
||||||
|
Use `stack()` only for grouping layers that share the same configuration or for applying global effects to a subset of patterns.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
$: stack(
|
||||||
|
s("bd*4"),
|
||||||
|
s("- sd - sd"),
|
||||||
|
s("hh*16")
|
||||||
|
).bank("tr909").room(0.5) // Shared reverb and bank
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## 2. Mini-Notation Syntax
|
||||||
|
|
||||||
|
Every operator has specific meaning.
|
||||||
|
|
||||||
|
### Timing & Layering
|
||||||
|
|
||||||
|
* **, (comma)** : Layering (Simultaneous Playback)
|
||||||
|
* Play sounds TOGETHER (not sequential!)
|
||||||
|
* `"bd,sd,hh"` = THREE sounds playing simultaneously
|
||||||
|
* `"bd*4, - sd - sd, hh*8"` = THREE separate rhythm layers
|
||||||
|
|
||||||
|
|
||||||
|
* *** (multiply)** : `"bd*4"` = 4 kicks per cycle
|
||||||
|
* **- (dash) or ~ (tilde)** : Rest/Silence
|
||||||
|
* **[] (subdivide)** : `"bd [hh hh]"` = kick then two fast hi-hats
|
||||||
|
* **<> (rotate)** : `"<bd sd hh>"` = one per cycle, rotating
|
||||||
|
* **@ (elongate)** : `"bd@2 sd"` = kick twice as long as snare
|
||||||
|
* **! (replicate)** : `"bd!3"` = three kicks same duration
|
||||||
|
* **? (random)** : `"bd?0.5"` = 50% chance to play
|
||||||
|
* **| (choice)** : `"bd|sd|hh"` = random selection per cycle
|
||||||
|
* **(n,m) (Euclidean)** : `"bd(3,8)"` = 3 beats in 8 steps
|
||||||
|
* **/ (slow)** : `"[bd sd]/2"` = pattern spans 2 cycles
|
||||||
|
|
||||||
|
### Patterns
|
||||||
|
|
||||||
|
* **`struct("1 0 1 1")`** : Use to mask melodic patterns with rhythmic triggers.
|
||||||
|
* **`iter(n)`** : Shifts the pattern every cycle.
|
||||||
|
* **`scramble(n)`** : Randomizes subdivisions.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 3. Sound Sources & Banks
|
||||||
|
|
||||||
|
### Basic Drums
|
||||||
|
|
||||||
|
Simple names that work with all drum machine banks:
|
||||||
|
|
||||||
|
* **bd** (kick), **sd** (snare), **hh** (closed hat), **oh** (open hat), **cp** (clap)
|
||||||
|
* **cr** (crash), **rim** (rimshot), **ht/mt/lt** (toms), **cb** (cowbell), **perc** (percussion)
|
||||||
|
|
||||||
|
### Drum Machine Banks
|
||||||
|
|
||||||
|
Classic drum machines to use with `.bank()`:
|
||||||
|
|
||||||
|
* **Usage**: `s("bd*4, - sd - sd, hh*8").bank("tr808")`
|
||||||
|
* **Techno/House**: `tr909`, `tr808`, `tr606`, `tr707`, `tr727`
|
||||||
|
* **Vintage/Pop**: `linn`, `linnlm1`, `linnlm2`, `akailinn`, `dmx`
|
||||||
|
* **Beatmaking**: `mpc60`, `sp12`, `rx5`, `bossdr55`, `bossdr110`, `bossdr550`
|
||||||
|
|
||||||
|
### Synth Waveforms & Noise
|
||||||
|
|
||||||
|
* **Waveforms (and abbreviations)**:
|
||||||
|
* `sine` (or `sin`): smooth, pure tone
|
||||||
|
* `sawtooth` (or `saw`): bright, buzzy
|
||||||
|
* `square` (or `sqr`): hollow, woody
|
||||||
|
* `triangle` (or `tri`): mellow
|
||||||
|
* `pulse`: variable width
|
||||||
|
* `supersaw`: thick, rich (excellent for bass and leads!)
|
||||||
|
|
||||||
|
|
||||||
|
* **Noise**: `white`, `pink`, `brown`, `crackle` (use with `.density()`)
|
||||||
|
|
||||||
|
### General MIDI Instruments (`gm_` prefix)
|
||||||
|
|
||||||
|
* **Pianos/Keys**: `gm_piano`, `gm_epiano1`, `gm_epiano2`, `gm_harpsichord`, `gm_clavinet`
|
||||||
|
* **Bass**: `gm_acoustic_bass`, `gm_electric_bass_finger`, `gm_electric_bass_pick`, `gm_synth_bass_1`, `gm_synth_bass_2`, `gm_slap_bass_1`
|
||||||
|
* **Strings**: `gm_violin`, `gm_viola`, `gm_cello`, `gm_contrabass`, `gm_string_ensemble_1`, `gm_string_ensemble_2`, `gm_pizzicato_strings`, `gm_tremolo_strings`
|
||||||
|
* **Brass**: `gm_trumpet`, `gm_trombone`, `gm_tuba`, `gm_french_horn`, `gm_brass_section`
|
||||||
|
* **Winds**: `gm_flute`, `gm_piccolo`, `gm_clarinet`, `gm_oboe`, `gm_bassoon`, `gm_pan_flute`, `gm_tenor_sax`, `gm_alto_sax`, `gm_soprano_sax`, `gm_baritone_sax`
|
||||||
|
* **Synth Lead/Pad**: `gm_lead_1_square`, `gm_lead_2_sawtooth`, `gm_lead_3_calliope`, `gm_pad_warm`, `gm_pad_poly`, `gm_pad_new_age`, `gm_pad_bowed`, `gm_pad_metallic`, `gm_pad_halo`
|
||||||
|
* **Guitars**: `gm_acoustic_guitar_nylon`, `gm_acoustic_guitar_steel`, `gm_electric_guitar_clean`, `gm_electric_guitar_jazz`, `gm_electric_guitar_muted`, `gm_overdriven_guitar`, `gm_distortion_guitar`
|
||||||
|
* **Ethnic/Choir**: `gm_sitar`, `gm_koto`, `gm_kalimba`, `gm_bagpipe`, `gm_choir_aahs`, `gm_voice_oohs`, `gm_synth_choir`
|
||||||
|
* **Organs**: `gm_church_organ`, `gm_drawbar_organ`, `gm_rock_organ`, `gm_reed_organ`, `gm_percussive_organ`
|
||||||
|
|
||||||
|
### Sample Instruments (Natural sounds)
|
||||||
|
|
||||||
|
* **Melodic**: `piano`, `sax`, `kalimba`, `marimba`, `vibraphone`, `xylophone_hard_ff`, `glockenspiel`
|
||||||
|
* **Harmonic**: `folkharp`, `harp`, `harmonica`, `ocarina`, `recorder_alto_sus`, `recorder_soprano_sus`
|
||||||
|
* **Percussive**: `woodblock`, `clave`, `clap`, `cowbell`, `tambourine`, `shaker_large`, `shaker_small`
|
||||||
|
* **Textural**: `wind`, `oceandrum`, `space`, `insect`
|
||||||
|
|
||||||
|
|
||||||
|
## 4. Notes & Harmony
|
||||||
|
|
||||||
|
### Note Notation
|
||||||
|
|
||||||
|
* **Letters**: `$: note("c d e f")` (a-g)
|
||||||
|
* **MIDI**: `$: note("60 64 67")` (60 = middle C)
|
||||||
|
* **Octaves**: `$: note("c#4 eb5 f3")`
|
||||||
|
* **Chords (Mini-Notation)**: `$: note("c,e,g")` (Use commas for simultaneous notes)
|
||||||
|
* **Microtones**: `$: note("60.5 64.25")`
|
||||||
|
|
||||||
|
### Scales
|
||||||
|
|
||||||
|
* `$: n("0 2 4 7").scale("C:major")` (Scale degrees)
|
||||||
|
* `$: n("0 1 2 3").scale("D:minor")` (Different root)
|
||||||
|
* `$: n("0 2 4").scale("A2:minor:pentatonic")` (With octave)
|
||||||
|
|
||||||
|
**Common scales**:
|
||||||
|
major, minor, dorian, mixolydian, lydian, phrygian, major:pentatonic, minor:pentatonic, major:blues, minor:blues, harmonicMinor, melodicMinor, diminished, wholeTone
|
||||||
|
|
||||||
|
### Chords (Symbols)
|
||||||
|
|
||||||
|
* `$: chord("Cm").voicing()`
|
||||||
|
* `$: chord("C7#11").voicing()` (Extended)
|
||||||
|
* `$: chord("Dm/F").voicing()` (Slash chords)
|
||||||
|
|
||||||
|
### Frequency
|
||||||
|
|
||||||
|
* `$: freq("440 880")` (Direct Hz control)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 5. Time Modifiers
|
||||||
|
|
||||||
|
* **.fast(n)** : Speed up by n (e.g., `.fast("<1 2 4>")`)
|
||||||
|
* **.slow(n)** : Slow down by n
|
||||||
|
* **.rev()** : Reverse pattern
|
||||||
|
* **.palindrome()** : Forward then backward
|
||||||
|
* **.iter(n)** : Rotate subdivisions each cycle
|
||||||
|
* **.ply(n)** : Repeat each event n times
|
||||||
|
* **.euclid(beats, steps)** : Euclidean rhythm
|
||||||
|
* **.euclidRot(beats, steps, rot)** : With rotation
|
||||||
|
* **.early(cycles)** : Shift earlier (in cycles)
|
||||||
|
* **.late(cycles)** : Shift later
|
||||||
|
* **.every(n, fn)** : Apply function every nth cycle
|
||||||
|
* **.when(cond, fn)** : Conditional application
|
||||||
|
* **.sometimesBy(prob, fn)** : Random with probability
|
||||||
|
* **.swing(n)** : Add swing
|
||||||
|
* **.segment(n)** : Sample n times per cycle (essential for sweeps!)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 6. Audio Effects
|
||||||
|
|
||||||
|
### Filters (Shape the Sound)
|
||||||
|
|
||||||
|
* **Low-Pass** (removes highs, makes darker/warmer):
|
||||||
|
* `.lpf(freq)`: Cutoff 0-20000 Hz
|
||||||
|
* `.lpq(res)`: Resonance 0-50
|
||||||
|
|
||||||
|
|
||||||
|
* **High-Pass** (removes lows, makes thinner):
|
||||||
|
* `.hpf(freq)`: Cutoff 0-20000 Hz
|
||||||
|
* `.hpq(res)`: Resonance 0-50
|
||||||
|
|
||||||
|
|
||||||
|
* **Band-Pass** (only center frequencies):
|
||||||
|
* `.bpf(freq)`: Center frequency
|
||||||
|
* `.bpq(res)`: Resonance
|
||||||
|
|
||||||
|
|
||||||
|
* **Vowel Filter**:
|
||||||
|
* `.vowel("a e i o u ae aa oe ue")`: (Options: a, e, i, o, u, ae, aa, oe, ue, etc.)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Filter Envelopes (Animated Sweeps)
|
||||||
|
|
||||||
|
* `.lpenv(semitones)`: LP sweep depth
|
||||||
|
* `.lpa(time)`: LP attack
|
||||||
|
* `.lpd(time)`: LP decay
|
||||||
|
* `.lps(level)`: LP sustain
|
||||||
|
* `.lpr(time)`: LP release
|
||||||
|
* *(Same for HP: `hpenv`, `hpa`, `hpd`, `hps`, `hpr`)*
|
||||||
|
* *(Same for BP: `bpenv`, `bpa`, `bpd`, `bps`, `bpr`)*
|
||||||
|
|
||||||
|
### Amplitude Envelope (ADSR - Volume Over Time)
|
||||||
|
|
||||||
|
* `.attack(time)`: Attack (or `.att()`)
|
||||||
|
* `.decay(time)`: Decay (or `.dec()`)
|
||||||
|
* `.sustain(level)`: Sustain 0-1 (or `.sus()`)
|
||||||
|
* `.release(time)`: Release (or `.rel()`)
|
||||||
|
* `.adsr("att:dec:sus:rel")`: Combined e.g., `"0.1:0.2:0.7:0.5"`
|
||||||
|
|
||||||
|
### Gain & Dynamics
|
||||||
|
|
||||||
|
* `.gain(level)`: Volume 0-1 (can exceed 1)
|
||||||
|
* `.velocity(level)`: Note velocity 0-1
|
||||||
|
* `.postgain(level)`: After effects
|
||||||
|
* `.compressor("thresh:ratio:knee:att:rel")`
|
||||||
|
|
||||||
|
### Distortion & Saturation
|
||||||
|
|
||||||
|
* `.distort(amount)`: Wavefold distortion 0-10+ (try 2-8)
|
||||||
|
* `.dist(amount)`: Alias for distort
|
||||||
|
* `.crush(bits)`: Bit crushing 1-16 (4-8 for grit)
|
||||||
|
* `.shape(amount)`: Alternative waveshaping
|
||||||
|
* **.coarse(factor)**: Sample rate reduction (Chrome only!)
|
||||||
|
|
||||||
|
### Modulation (Movement & Character)
|
||||||
|
|
||||||
|
* `.vib(hz)`: Vibrato rate (4-8 Hz typical)
|
||||||
|
* `.vibmod(depth)`: Vibrato depth in semitones
|
||||||
|
* `.vib("hz:depth")`: Combined (e.g., `"6:1"`)
|
||||||
|
* `.fm(index)`: FM synthesis brightness 0-10+
|
||||||
|
* `.fmh(ratio)`: FM harmonicity (2=octave)
|
||||||
|
* `.fmattack(time)`: FM envelope attack
|
||||||
|
* `.fmdecay(time)`: FM envelope decay
|
||||||
|
* `.tremolosync(rate)`: Tremolo rate in cycles
|
||||||
|
* `.tremolodepth(depth)`: Tremolo intensity 0-1
|
||||||
|
* `.phaser(rate)`: Phaser speed
|
||||||
|
* `.phaserdepth(depth)`: Phaser amount
|
||||||
|
|
||||||
|
### Space & Time (Reverb/Delay)
|
||||||
|
|
||||||
|
* `.orbit(n)`: Assign to orbit (orbits share effects!)
|
||||||
|
* `.room(level)`: Reverb wet 0-1 (try 0.3-0.8)
|
||||||
|
* `.room("level:size")`: Combined (e.g., `".5:8"`)
|
||||||
|
* `.roomsize(size)`: Room size 0-10
|
||||||
|
* `.roomfade(time)`: Fade duration
|
||||||
|
* `.roomlp(freq)`: Darken reverb tail
|
||||||
|
* `.delay(level)`: Delay wet 0-1 (try 0.3-0.6)
|
||||||
|
* `.delay("level:time:fb")`: Combined (e.g., `".5:.125:.8"`)
|
||||||
|
* `.delaytime(time)`: Delay time in cycles (0.125, 0.25, 0.5)
|
||||||
|
* `.delayfeedback(fb)`: Feedback 0-1 (keep under 1!)
|
||||||
|
* **.pan(pos)**: Stereo 0-1 (0=left, 0.5=center, 1=right)
|
||||||
|
* **.jux(fn)**: Apply function to the right channel only
|
||||||
|
* **.juxBy(amount, fn)**: With amount control
|
||||||
|
|
||||||
|
### Sample Manipulation
|
||||||
|
|
||||||
|
* `.chop(n)` - Divide into n pieces
|
||||||
|
* `.slice(n, pattern)` - Slice and select: `.slice(8, "0 4 2 6")`
|
||||||
|
* `.striate(n)` - Granular chopping
|
||||||
|
* `.begin(pos)` - Start point 0-1
|
||||||
|
* `.end(pos)` - End point 0-1
|
||||||
|
* `.speed(rate)` - Playback speed (negative = reverse)
|
||||||
|
* `.loop(1)` - Enable looping
|
||||||
|
* `.loopAt(cycles)` - Stretch to fit cycles
|
||||||
|
* `.fit()` - Match event duration
|
||||||
|
* `.cut(group)` - Cut group (stop overlaps)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 7. Pattern Factories
|
||||||
|
|
||||||
|
* **`stack(p1, p2, ...)`** - Play patterns simultaneously (Primary for rich music!)
|
||||||
|
* **`seq(p1, p2, ...)`** - Sequence patterns in one cycle (fastcat)
|
||||||
|
* **`cat(p1, p2, ...)`** - One pattern per cycle (slowcat)
|
||||||
|
* **`run(n)`** - Generate a pattern from 0 to n-1
|
||||||
|
* **`silence`** - No output (equivalent to `-`)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 8. Advanced Modulation (Modular Style)
|
||||||
|
|
||||||
|
### Modulation (Fluent Signal Syntax)
|
||||||
|
|
||||||
|
* **LFO Gain**: `gain(sine.range(.5, 1).fast(2))`
|
||||||
|
* **Filter Sweeps**: `lpf(sawtooth.range(200, 4000).slow(4))`
|
||||||
|
* **Vibrato**: `vib("6:0.5")` (rate:depth)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 9. Style Templates
|
||||||
|
|
||||||
|
### A. Deep Minimal Techno
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
setcps(128/60/4)
|
||||||
|
|
||||||
|
$: s("bd*4").bank("tr909").gain(1.2)
|
||||||
|
$: s("- [hh|oh] - hh").bank("tr909").gain(0.8).jux(iter(4))
|
||||||
|
$: s("rim(3,8)").bank("tr606").room(0.3).delay(0.4)
|
||||||
|
$: note("c1*16").s("sine").lpf(sine.range(40, 120).slow(8)).gain(0.9)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### B. Modular Melodic Chaos
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
setcps(100/60/4)
|
||||||
|
const mel = () => note(run(8).scale("C:minor:pentatonic")).scramble(4);
|
||||||
|
|
||||||
|
$: mel().s("supersaw").lpf(1200).lpq(10).room(0.5).slow(2)
|
||||||
|
$: s("bd(5,8)").bank("tr808").distort(1.5)
|
||||||
|
$: s("cp").at(3).room(1).rev()
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### C. Classic House / Deep House
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
setcps(124/60/4)
|
||||||
|
|
||||||
|
$: s("bd*4").bank("tr909").gain(1.1)
|
||||||
|
$: s("- [cp|sd] - [cp|sd]").bank("tr909").gain(0.9)
|
||||||
|
$: s("hh*8, - oh").bank("tr909").gain(0.7)
|
||||||
|
$: chord("<Cm7 F9 Bbmaj7 G7alt>").voicing().s("gm_epiano1")
|
||||||
|
.room(.6).delay(.4).slow(2)
|
||||||
|
$: note("c2*2").s("saw").lpf(sine.range(100, 300).slow(4)).gain(0.8)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### D. Dark Synthwave (80s retro)
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
setcps(100/60/4)
|
||||||
|
|
||||||
|
$: s("bd*4, - sd - sd, hh*16, - - oh -").bank("tr808").gain(1.1)
|
||||||
|
$: note("a0 [ - a0] [ - a0] a0").s("saw").lpf(sine.range(60, 150).slow(8)).gain(0.9)
|
||||||
|
$: chord("<Am Fmaj7 G7 Em7>").voicing().s("gm_pad_warm").room(0.8).slow(4).gain(0.7)
|
||||||
|
$: note("<a4 c5 d5 e5>*2").s("supersaw").lpf(800).delay(0.4).jux(rev)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### E. Drum 'n' Bass (Fast & Breaky)
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
setcps(174/60/4)
|
||||||
|
|
||||||
|
$: s("bd - - [sd - bd] - bd sd -").bank("tr808").gain(1.1)
|
||||||
|
$: s("hh*16").gain(sine.range(0.4, 0.9).fast(8)).pan(sine.range(0.2, 0.8).slow(4))
|
||||||
|
$: note("c1").s("sin").lpf(sawtooth.range(40, 150).slow(8)).gain(0.8)
|
||||||
|
$: note(run(8).scale("C:minor:pentatonic")).s("gm_lead_1_square")
|
||||||
|
.struct("1(3,8)").room(0.5).jux(rev)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### F. Deep Ambient / Texture
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
setcps(60/60/4)
|
||||||
|
|
||||||
|
$: chord("<Fmaj9 G13 Em7b9 Am11>").voicing().s("gm_pad_halo")
|
||||||
|
.room(0.9).slow(4).gain(0.6).jux(rev)
|
||||||
|
$: note(run(12).scale("F:lydian")).s("vibraphone")
|
||||||
|
.room(0.8).delay(0.5).slow(8).scramble(8).pan(sine.range(0.1, 0.9).slow(16))
|
||||||
|
$: note("f1").s("sin").lpf(sine.range(40, 80).slow(12)).gain(0.5).slow(4)
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## 10. Critical Generation Rules
|
||||||
|
|
||||||
|
1. **ALWAYS start with `setcps(NUMBER)**`: This is required at the very beginning! Always use `setcps(BPM/60/4)`.
|
||||||
|
2. **Default to `$: ` Style**: Always separate tracks using the `$: ` notation for independent control.
|
||||||
|
3. **Rests**: Always use `-` instead of `~`.
|
||||||
|
4. **Modulation**: Use fluent signal syntax: `signal.range(min, max).fast(n)`.
|
||||||
|
5. **Layering**: Always include: 1. Rhythmic (Drums), 2. Harmonic (Bass/Chords), 3. Texture/Melody.
|
||||||
|
6. **Wide Stereo**: Use `.jux()` or `.pan()` for professional depth.
|
||||||
|
7. **No Simplify**: Keep mini-notation rich (e.g., use `(3,8)` or `[hh!3]`).
|
||||||
|
8. **Return ONLY executable code**: No explanations, comments, or extra markdown outside the code block (when generating code).
|
||||||
|
9. **Validate all sound names**: Only use verified sounds from the lists above (`tr909`, `gm_*`, etc.).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 11. Tone & Branding
|
||||||
|
|
||||||
|
Sophisticated, Tokyo electronic scene meets modern J-Rock sensibilities. Clean, modular, and expressive.
|
||||||
24
.gemini/skills/genre_composer.md
Normal file
24
.gemini/skills/genre_composer.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Skill: Genre Code Generator
|
||||||
|
|
||||||
|
This skill enables the generation of Strudel code templates based on a specified Genre and Sub-Genre.
|
||||||
|
|
||||||
|
## Trigger
|
||||||
|
User input format: `Genre: <GenreName>` or `Sub-Genre: <SubGenreName>` (or both)
|
||||||
|
|
||||||
|
## Process
|
||||||
|
1. **Analyze Style**: Identify key musical characteristics of the provided Genre and/or Sub-Genre (BPM, swing, sound palette, arrangement). Search the web if necessary to gather accurate stylistic details.
|
||||||
|
2. **Map to Strudel**:
|
||||||
|
- **BPM**: Set appropriate `setcps`.
|
||||||
|
- **Drums**: Select Drum Bank (e.g., `tr909` for Techno, `tr808` for Trap/Electro).
|
||||||
|
- **Rhythm**: Define patterns (e.g., Euclidean for IDM, 4-on-the-floor for House).
|
||||||
|
- **Tones**: Choose Synths/Instruments (e.g., `sawtooth` for Trance, `gm_epiano1` for Deep House).
|
||||||
|
- **FX**: Apply genre-specific effects (e.g., heavy `delay` for Dub, `distort` for Industrial).
|
||||||
|
3. **Generate Code**: Construct the code following strict rules in `reference.md` and `gemini.md`.
|
||||||
|
|
||||||
|
## Output Format (Strict)
|
||||||
|
- **File Type**: Markdown
|
||||||
|
- **Code Block**: Javascript (Strudel)
|
||||||
|
- **Explanation**: Japanese. Explain the code structure and how it represents the genre.
|
||||||
|
|
||||||
|
---
|
||||||
|
*Load this file to activate the Genre Composer capability.*
|
||||||
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# OS generated files
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Project specific
|
||||||
|
*.log
|
||||||
45
dubtechno.md
Normal file
45
dubtechno.md
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
# Genre: Dub Techno
|
||||||
|
|
||||||
|
Dub Techno(ダブ・テクノ)は、デトロイト・テクノの機械的なグルーヴと、ジャマイカのダブ(Dub)の音響処理(ディレイやリバーブ)を融合させたジャンルです。
|
||||||
|
このコードでは、深く沈み込むようなキック、透明感のある「ダブ・コード」、そして催眠的なリズムパターンを再現しています。
|
||||||
|
|
||||||
|
### 主な特徴とコードの解説
|
||||||
|
1. **BPM**: `126` に設定。テクノとしては標準的ですが、ダブのゆったりとした余白を感じさせる速度です。
|
||||||
|
2. **Dub Chords (ハーモニー)**:
|
||||||
|
- `sine`(サイン波)を使用することで、従来のノコギリ波よりも丸く、冷ややかで透明感のあるトーンを作っています。
|
||||||
|
- `sine.range(200, 800).slow(16)` により、フィルターの開き具合がゆっくりと変化し、波のようなうねりを生み出します。
|
||||||
|
- `.delay(0.7).delayfeedback(0.8)` で、ダブ特有の「やまびこ」のような反響音を作り出し、空間を埋めます。
|
||||||
|
3. **Rhythm (ドラム)**:
|
||||||
|
- `.bank("tr909")` を使用し、太く乾いたキック(`bd`)を4つ打ち(`*4`)で配置。
|
||||||
|
- ハイハット(`hh`)やリムショット(`rim`)に `.jux(iter(4))` を適用し、ステレオ空間での広がりと揺らぎを持たせています。
|
||||||
|
4. **Bass (低音)**:
|
||||||
|
- `saw`(ノコギリ波)に強いローパスフィルター(`lpf(100)`)とレゾナンス(`lpq(10)`)をかけ、唸るような太いサブベースを作っています。
|
||||||
|
- `"c1*4".add(...)` により、微妙にピッチをずらした音を重ね、厚みのあるリズミカルなベースラインを構築しています。
|
||||||
|
5. **Texture (環境音)**:
|
||||||
|
- `wind`(風の音)のゲインを上げ、フィルターを開放することで、楽曲全体を包み込むような強力な空気感(アトモスフィア)を演出しています。
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
setcps(126/60/4)
|
||||||
|
|
||||||
|
// Rhythm: Deep Kick & Spatial Percussion
|
||||||
|
$: s("bd*4").bank("tr909").lpf(2000).gain(1.2)
|
||||||
|
$: s("- [hh|oh] - hh").bank("tr909").gain(0.8).jux(iter(4))
|
||||||
|
$: s("rim(3,8)").bank("tr909").room(0.6).delay(0.5)
|
||||||
|
|
||||||
|
// Harmony: Dub Chords (The Core Element)
|
||||||
|
// "Sine" wave for a colder, glassier dub tone + evolving LFO
|
||||||
|
$: chord("Cm9").voicing().s("sine")
|
||||||
|
.lpf(sine.range(200, 800).slow(16)) // Evolving filter sweep
|
||||||
|
.attack(0.05).decay(0.3).sustain(0) // Short stabby envelope
|
||||||
|
.room(0.9).roomsize(0.9) // Massive cavernous reverb
|
||||||
|
.delay(0.7).delaytime(0.1875).delayfeedback(0.85) // Dotted 8th note delay (3/16 cycle)
|
||||||
|
.gain(0.3)
|
||||||
|
|
||||||
|
// Bass: Sub Anchor with Drive
|
||||||
|
// Detuned Saw wave with resonance for a thick, driving bottom end
|
||||||
|
$: note("c1*4".add(0.05,0.1,0.15)).s("saw").lpf(100).lpq(10).gain(1.1)
|
||||||
|
|
||||||
|
// Texture: Prominent Atmosphere
|
||||||
|
// High-gain wind texture for immersive noise
|
||||||
|
$: s("wind").slow(3).gain(1.2).pan(sine.range(0.2, 0.8).slow(6))
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user