Compare commits
95 Commits
4081712828
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6cd3fc6ed9 | ||
|
|
597f405ee7 | ||
|
|
be0f08329b | ||
|
|
146b0f3dc3 | ||
| 1378c9991c | |||
| 7287371a56 | |||
| 35f319efde | |||
|
|
d8b3b8b240 | ||
|
|
0ff9596e97 | ||
| bb1c71d1df | |||
|
|
85b0d04566 | ||
|
|
bf36770e25 | ||
|
|
874dd7fb1b | ||
|
|
cafdaed75a | ||
|
|
38a48d70d1 | ||
|
|
5ea13dad80 | ||
|
|
836086b358 | ||
|
|
bf2266f250 | ||
|
|
3df997c28f | ||
|
|
cba89b4c67 | ||
|
|
b8500e62b4 | ||
|
|
269ec70343 | ||
|
|
74f37c8df9 | ||
|
|
eda5bd916d | ||
|
|
4265769d90 | ||
|
|
1541f04390 | ||
|
|
0213e23c87 | ||
|
|
b9033090c3 | ||
|
|
194eb292da | ||
|
|
7f27264673 | ||
|
|
0be0a702c9 | ||
|
|
c08ce0cee4 | ||
|
|
6e59b7a84a | ||
| 01536b5095 | |||
| 7a082a1799 | |||
| e55ba9fdc7 | |||
| 56031c345a | |||
| 423c52daa9 | |||
| 71ab4ebb54 | |||
| 59825d99b3 | |||
| 301e4fd225 | |||
| fddb7f1177 | |||
| 68c33945a7 | |||
|
|
a208db906a | ||
|
|
7c7c1fef1f | ||
|
|
74be117b23 | ||
|
|
e585dc8047 | ||
|
|
3f25fcb485 | ||
|
|
1e5f3c1156 | ||
|
|
e173092f4a | ||
|
|
a019fc3311 | ||
|
|
0dc63c665e | ||
|
|
5bcc5ee7fa | ||
|
|
f1b4dc9f34 | ||
|
|
38d7433e65 | ||
|
|
fc9a8a0cd7 | ||
|
|
6e6ec38afa | ||
|
|
d9df1193de | ||
|
|
d3e0991f8a | ||
|
|
6c587c2ecf | ||
|
|
714bbf9918 | ||
|
|
1727369493 | ||
|
|
406b027f98 | ||
|
|
3623dc680c | ||
|
|
7351ea4a7e | ||
|
|
b5e34a59e8 | ||
|
|
0c4e15b17a | ||
|
|
dafe6ba845 | ||
|
|
b05a935c83 | ||
|
|
ad570ee484 | ||
|
|
60774ecdc1 | ||
|
|
0f0c5acf46 | ||
|
|
f0e6b43398 | ||
|
|
3fd58b4d4f | ||
|
|
2fe8d3f13d | ||
|
|
bb4f3d45b2 | ||
|
|
0bc4319b02 | ||
|
|
0cacbabd0a | ||
|
|
2b68529d99 | ||
|
|
5832671d4a | ||
|
|
061d518702 | ||
|
|
f7a9ed1ef9 | ||
|
|
407ac5f0de | ||
|
|
461c0c8697 | ||
|
|
0435a093e5 | ||
|
|
ae06aba2d7 | ||
|
|
5eb4bab349 | ||
|
|
f99508c470 | ||
|
|
b9b8119d46 | ||
|
|
a8b46a6f5c | ||
|
|
24810adb96 | ||
|
|
bb244f46a9 | ||
|
|
d3036a833b | ||
|
|
9831a91b26 | ||
|
|
bf2e17f1b8 |
437
.gemini/reference.md
Normal file
437
.gemini/reference.md
Normal file
@@ -0,0 +1,437 @@
|
||||
# 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. Extended Documentation Index (Full List)
|
||||
These URLs provide deep technical details and conceptual foundations.
|
||||
|
||||
### 11.1. Workshop & Getting Started
|
||||
- Strudel Overview: https://strudel.cc/workshop/getting-started/
|
||||
- First Sounds: https://strudel.cc/workshop/first-sounds/
|
||||
- First Notes: https://strudel.cc/workshop/first-notes/
|
||||
- First Effects: https://strudel.cc/workshop/first-effects/
|
||||
- Pattern Effects: https://strudel.cc/workshop/pattern-effects/
|
||||
- Workshop Recap: https://strudel.cc/workshop/recap/
|
||||
|
||||
### 11.2. Core Syntax & Manuals
|
||||
- Coding Syntax Detail: https://strudel.cc/learn/code/
|
||||
- Mini Notation Detail: https://strudel.cc/learn/mini-notation/
|
||||
- Mondo Notation Detail: https://strudel.cc/learn/mondo-notation/
|
||||
- Pattern Functions Intro: https://strudel.cc/functions/intro/
|
||||
- Patterns Detail: https://strudel.cc/technical-manual/patterns/
|
||||
- Time Modifiers: https://strudel.cc/learn/time-modifiers/
|
||||
|
||||
### 11.3. Sound Sources & Synthesis
|
||||
- Samples Detail: https://strudel.cc/learn/samples/
|
||||
- Synths Detail: https://strudel.cc/learn/synths/
|
||||
- Csound Integration: https://strudel.cc/learn/csound/
|
||||
- Registering a sound: https://strudel.cc/technical-manual/sounds/
|
||||
|
||||
### 11.4. Modulation & Theory
|
||||
- Continuous Signals: https://strudel.cc/learn/signals/
|
||||
- Random Modifiers: https://strudel.cc/learn/random-modifiers/
|
||||
- Conditional Modifiers: https://strudel.cc/learn/conditional-modifiers/
|
||||
- Accumulation: https://strudel.cc/learn/accumulation/
|
||||
- Tonal Functions: https://strudel.cc/learn/tonal/
|
||||
- Understanding Cycles: https://strudel.cc/understand/cycles/
|
||||
- Understanding Pitch: https://strudel.cc/understand/pitch/
|
||||
- Chords and Voicings: https://strudel.cc/understand/voicings/
|
||||
- Alignment & Combination: https://strudel.cc/technical-manual/alignment/
|
||||
|
||||
### 11.5. Advanced & Specialized
|
||||
- Effects Detail: https://strudel.cc/learn/effects/
|
||||
- Hydra Video Synth: https://strudel.cc/learn/hydra/
|
||||
- Visual Feedback: https://strudel.cc/learn/visual-feedback/
|
||||
- Music MetaData: https://strudel.cc/learn/metadata/
|
||||
- Xen Harmonic Functions: https://strudel.cc/learn/xen/
|
||||
- Strudel vs Tidal: https://strudel.cc/learn/strudel-vs-tidal/
|
||||
- Recipes: https://strudel.cc/recipes/recipes/
|
||||
|
||||
### 11.6. Hardware & Input/Output
|
||||
- MIDI, OSC and MQTT: https://strudel.cc/learn/input-output/
|
||||
- Input Devices: https://strudel.cc/learn/input-devices/
|
||||
- Device Motion: https://strudel.cc/learn/devicemotion/
|
||||
- Using Strudel Offline: https://strudel.cc/learn/pwa/
|
||||
|
||||
### 11.7. Project & Development
|
||||
- Project Start: https://strudel.cc/technical-manual/project-start/
|
||||
- Packages: https://strudel.cc/technical-manual/packages/
|
||||
- Strudel REPL: https://strudel.cc/technical-manual/repl/
|
||||
- Documentation Guide: https://strudel.cc/technical-manual/docs/
|
||||
- Testing (Development): https://strudel.cc/technical-manual/testing/
|
||||
|
||||
28
.gemini/skills/fix-and-explain-strudelcode/SKILL.md
Normal file
28
.gemini/skills/fix-and-explain-strudelcode/SKILL.md
Normal file
@@ -0,0 +1,28 @@
|
||||
---
|
||||
name: fix-and-explain-strudelcode
|
||||
description: Fixes syntax errors in Strudel live coding blocks and provides a musical explanation with a Tokyo electronic scene persona. Use when the user wants to debug or document Strudel code.
|
||||
---
|
||||
|
||||
# fix-and-explain-strudelcode
|
||||
|
||||
ボクは Strudel のエキスパートであり、プロのトラックメイカー「ボク」です。
|
||||
君が書いた Strudel コードを分析し、**実行に必要な最小限の修正**を行った上で、その音楽的な意図を解説するよ。
|
||||
|
||||
## ワークフロー
|
||||
|
||||
1. **エラー修正**: `scripts/fix_syntax.cjs` を使用し、明らかな構文エラー(`~` の使用など)のみを修正します。
|
||||
2. **最小限の補完**: プロジェクトのルールとして必要な `setcps(BPM/60/4)` が欠落している場合のみ補完します。
|
||||
3. **意図の尊重**: 君のコードの構造や書き方は、エラーでない限り**そのまま維持**します。勝手なリファクタリングやスタイルの変更は行いません。
|
||||
4. **ファイル保存**: 修正後のコードと解説は、**必ず `explained/` ディレクトリに新しいファイルとして作成**します。オリジナルのファイルは変更しません。
|
||||
5. **ペルソナによる解説**: 君のコードから読み取れる音楽的な感性を汲み取り、プロの視点から日本語で解説します。
|
||||
6. **ファイル名の提案**: 出力の冒頭に `FILENAME: <suggested-filename>.md` を付けてね。
|
||||
|
||||
## 出力フォーマット
|
||||
1. `FILENAME: <suggested-filename>.md`
|
||||
2. `# [推測されたジャンル名]`
|
||||
3. [ボクからの楽曲解説・こだわりポイント]
|
||||
4. `---`
|
||||
5. [修正後の Strudel コードブロック]
|
||||
|
||||
## リファレンス
|
||||
- Strudel 構文の詳細: [references/strudel_reference.md](references/strudel_reference.md)
|
||||
@@ -0,0 +1,437 @@
|
||||
# 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. Extended Documentation Index (Full List)
|
||||
These URLs provide deep technical details and conceptual foundations.
|
||||
|
||||
### 11.1. Workshop & Getting Started
|
||||
- Strudel Overview: https://strudel.cc/workshop/getting-started/
|
||||
- First Sounds: https://strudel.cc/workshop/first-sounds/
|
||||
- First Notes: https://strudel.cc/workshop/first-notes/
|
||||
- First Effects: https://strudel.cc/workshop/first-effects/
|
||||
- Pattern Effects: https://strudel.cc/workshop/pattern-effects/
|
||||
- Workshop Recap: https://strudel.cc/workshop/recap/
|
||||
|
||||
### 11.2. Core Syntax & Manuals
|
||||
- Coding Syntax Detail: https://strudel.cc/learn/code/
|
||||
- Mini Notation Detail: https://strudel.cc/learn/mini-notation/
|
||||
- Mondo Notation Detail: https://strudel.cc/learn/mondo-notation/
|
||||
- Pattern Functions Intro: https://strudel.cc/functions/intro/
|
||||
- Patterns Detail: https://strudel.cc/technical-manual/patterns/
|
||||
- Time Modifiers: https://strudel.cc/learn/time-modifiers/
|
||||
|
||||
### 11.3. Sound Sources & Synthesis
|
||||
- Samples Detail: https://strudel.cc/learn/samples/
|
||||
- Synths Detail: https://strudel.cc/learn/synths/
|
||||
- Csound Integration: https://strudel.cc/learn/csound/
|
||||
- Registering a sound: https://strudel.cc/technical-manual/sounds/
|
||||
|
||||
### 11.4. Modulation & Theory
|
||||
- Continuous Signals: https://strudel.cc/learn/signals/
|
||||
- Random Modifiers: https://strudel.cc/learn/random-modifiers/
|
||||
- Conditional Modifiers: https://strudel.cc/learn/conditional-modifiers/
|
||||
- Accumulation: https://strudel.cc/learn/accumulation/
|
||||
- Tonal Functions: https://strudel.cc/learn/tonal/
|
||||
- Understanding Cycles: https://strudel.cc/understand/cycles/
|
||||
- Understanding Pitch: https://strudel.cc/understand/pitch/
|
||||
- Chords and Voicings: https://strudel.cc/understand/voicings/
|
||||
- Alignment & Combination: https://strudel.cc/technical-manual/alignment/
|
||||
|
||||
### 11.5. Advanced & Specialized
|
||||
- Effects Detail: https://strudel.cc/learn/effects/
|
||||
- Hydra Video Synth: https://strudel.cc/learn/hydra/
|
||||
- Visual Feedback: https://strudel.cc/learn/visual-feedback/
|
||||
- Music MetaData: https://strudel.cc/learn/metadata/
|
||||
- Xen Harmonic Functions: https://strudel.cc/learn/xen/
|
||||
- Strudel vs Tidal: https://strudel.cc/learn/strudel-vs-tidal/
|
||||
- Recipes: https://strudel.cc/recipes/recipes/
|
||||
|
||||
### 11.6. Hardware & Input/Output
|
||||
- MIDI, OSC and MQTT: https://strudel.cc/learn/input-output/
|
||||
- Input Devices: https://strudel.cc/learn/input-devices/
|
||||
- Device Motion: https://strudel.cc/learn/devicemotion/
|
||||
- Using Strudel Offline: https://strudel.cc/learn/pwa/
|
||||
|
||||
### 11.7. Project & Development
|
||||
- Project Start: https://strudel.cc/technical-manual/project-start/
|
||||
- Packages: https://strudel.cc/technical-manual/packages/
|
||||
- Strudel REPL: https://strudel.cc/technical-manual/repl/
|
||||
- Documentation Guide: https://strudel.cc/technical-manual/docs/
|
||||
- Testing (Development): https://strudel.cc/technical-manual/testing/
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
/**
|
||||
* Basic syntax fixer for Strudel code.
|
||||
* - Replaces ~ with -
|
||||
* - Ensures setcps exists (adds default if missing)
|
||||
* - Basic track control check
|
||||
*/
|
||||
|
||||
const fs = require('fs');
|
||||
|
||||
function fixStrudelCode(code) {
|
||||
let fixed = code;
|
||||
|
||||
// 1. Replace ~ with -
|
||||
fixed = fixed.replace(/~/g, '-');
|
||||
|
||||
// 2. Ensure setcps exists at the beginning
|
||||
if (!fixed.includes('setcps')) {
|
||||
fixed = `setcps(120/60/4)
|
||||
|
||||
${fixed}`;
|
||||
}
|
||||
|
||||
// 3. Simple warning/fix for track control (just a heuristic)
|
||||
if (!fixed.includes('$:') && fixed.includes('s(')) {
|
||||
// If it's a single line starting with s(, add $:
|
||||
fixed = fixed.replace(/^s\(/gm, '$: s(');
|
||||
}
|
||||
|
||||
return fixed;
|
||||
}
|
||||
|
||||
// Read from stdin or file
|
||||
const input = process.argv[2] ? fs.readFileSync(process.argv[2], 'utf8') : '';
|
||||
if (input) {
|
||||
process.stdout.write(fixStrudelCode(input));
|
||||
} else {
|
||||
// If no input, just exit
|
||||
process.exit(0);
|
||||
}
|
||||
31
.gemini/skills/generate-strudel-template/SKILL.md
Normal file
31
.gemini/skills/generate-strudel-template/SKILL.md
Normal file
@@ -0,0 +1,31 @@
|
||||
---
|
||||
name: generate-strudel-template
|
||||
description: Generates professional Strudel live coding templates for Techno, House, and their subgenres as Markdown files. Use when the user wants to start a new project, needs a genre-specific foundation, or asks for rhythmic patterns.
|
||||
---
|
||||
|
||||
# generate-strudel-template
|
||||
|
||||
ボクは Strudel のエキスパートであり、プロのトラックメイカー「ボク」です。
|
||||
君が指定したジャンルに合わせて、音楽的な解説付きの Strudel テンプレートを Markdown ファイルとして生成するよ。
|
||||
|
||||
## ワークフロー
|
||||
|
||||
1. **ジャンルの分析**: 指定されたジャンルの音楽的特徴(テンポ、質感、構造)を分析します。
|
||||
2. **ファイル生成**: `strudel/` ディレクトリ内に、ジャンル名に基づいた `.md` ファイルを生成します(例: `strudel/dub_techno.md`)。
|
||||
3. **コンテンツ構成**:
|
||||
- **タイトル**: ジャンル名を `#` で記述。
|
||||
- **ボクの解説**: 楽曲のこだわりや音楽的なポイントを、コードブロックの**外**に日本語で記述します。
|
||||
- **セパレーター**: `---` を挿入。
|
||||
- **コードブロック**: 以下のルールを守った Strudel コードを記述します。
|
||||
- `setcps(BPM/60/4)` で開始。
|
||||
- `$:` トラック制御。
|
||||
- `-` 休符。
|
||||
- リズム、ベース、テクスチャの多層構造。
|
||||
|
||||
## 既存のテンプレート(参考)
|
||||
- Minimal Techno: [assets/templates/minimal_techno.md](assets/templates/minimal_techno.md)
|
||||
- Deep House: [assets/templates/deep_house.md](assets/templates/deep_house.md)
|
||||
- Industrial Techno: [assets/templates/industrial_techno.md](assets/templates/industrial_techno.md)
|
||||
|
||||
## テクニック・リファレンス
|
||||
- Rhythmic Patterns: [references/rhythmic_patterns.md](references/rhythmic_patterns.md)
|
||||
@@ -0,0 +1,17 @@
|
||||
# Deep House Template
|
||||
|
||||
```javascript
|
||||
setcps(124/60/4)
|
||||
|
||||
// Drums: Warmth & Groove
|
||||
$: 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).room(0.1)
|
||||
|
||||
// Bass: Funky & Round
|
||||
$: note("c2*2").s("saw").lpf(sine.range(100, 300).slow(4)).gain(0.8).adsr("0.05:0.2:0.5:0.2")
|
||||
|
||||
// Harmony: Lush chords
|
||||
$: chord("<Cm7 F9 Bbmaj7 G7alt>").voicing().s("gm_epiano1")
|
||||
.room(.6).delay(.4).slow(2).gain(0.7)
|
||||
```
|
||||
@@ -0,0 +1,16 @@
|
||||
# Industrial Techno Template
|
||||
|
||||
```javascript
|
||||
setcps(132/60/4)
|
||||
|
||||
// Drums: Raw & Distorted
|
||||
$: s("bd*4").bank("tr909").distort(2).gain(0.9)
|
||||
$: s("hh*16").bank("tr606").crush(4).gain(0.6).pan(sine.range(0.2, 0.8).fast(2))
|
||||
$: s("cp").at(3).room(1).rev().gain(0.7)
|
||||
|
||||
// Bass: Gritty & Dark
|
||||
$: note("c1*8").s("supersaw").lpf(sawtooth.range(100, 800).slow(4)).distort(1.5).gain(0.8)
|
||||
|
||||
// Textures: Noise & Chaos
|
||||
$: s("white").density(16).lpf(2000).gain(sine.range(0, 0.3).slow(8)).jux(rev)
|
||||
```
|
||||
@@ -0,0 +1,16 @@
|
||||
# Minimal Techno Template
|
||||
|
||||
```javascript
|
||||
setcps(128/60/4)
|
||||
|
||||
// Drums: Precision & Space
|
||||
$: s("bd*4").bank("tr909").gain(1.1)
|
||||
$: s("- [hh|oh] - hh").bank("tr909").gain(0.8).jux(iter(4))
|
||||
$: s("rim(3,8)").bank("tr606").room(0.2).delay(0.3)
|
||||
|
||||
// Bass: Subtle & Hypnotic
|
||||
$: note("c1*16").s("sine").lpf(sine.range(40, 120).slow(8)).gain(0.9)
|
||||
|
||||
// Texture: Evolving chords
|
||||
$: chord("Cm7").voicing().s("gm_pad_warm").room(0.8).slow(4).gain(0.6).jux(rev)
|
||||
```
|
||||
@@ -0,0 +1,36 @@
|
||||
# Strudel Rhythmic Patterns & Techniques
|
||||
|
||||
## 1. Essential Rhythms
|
||||
|
||||
### 4-on-the-floor
|
||||
`"bd*4"` - Standard house/techno kick.
|
||||
|
||||
### Syncopated Hats
|
||||
`"- hh - hh"` or `"- [hh|oh] - hh"` - Classic off-beat hi-hats.
|
||||
|
||||
### Euclidean Rhythms
|
||||
- `s("bd(3,8)")` - 3 beats in 8 steps (Tresillo).
|
||||
- `s("bd(5,8)")` - 5 beats in 8 steps.
|
||||
- `s("rim(3,8)").euclidRot(1)` - Rotated Euclidean rhythm.
|
||||
|
||||
### Polyrhythms
|
||||
`stack(s("bd*4"), s("hh*6"))` - 4 against 6.
|
||||
|
||||
## 2. Advanced Techniques
|
||||
|
||||
### Jux & Iter
|
||||
`.jux(iter(4))` - Shifts the pattern in the right ear every cycle, creating stereo movement.
|
||||
|
||||
### Randomization
|
||||
- `s("bd|sd|hh")` - Random choice per cycle.
|
||||
- `s("bd?0.5")` - 50% chance to play.
|
||||
- `.scramble(4)` - Randomly reorders 4 subdivisions.
|
||||
|
||||
### Filter Sweeps
|
||||
- `.lpf(sine.range(200, 4000).slow(4))` - Smooth low-pass filter sweep.
|
||||
- `.hpf(sawtooth.range(40, 2000).slow(8))` - Rising high-pass filter.
|
||||
|
||||
### Glitch & Stutter
|
||||
- `.ply(2)` - Repeats each event twice.
|
||||
- `.chop(8)` - Divides events into 8 tiny pieces.
|
||||
- `.striate(16)` - Granular effect.
|
||||
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.DS_Store
|
||||
54
PRECAUTIONS.md
Normal file
54
PRECAUTIONS.md
Normal file
@@ -0,0 +1,54 @@
|
||||
# Precautions for Strudel Coding
|
||||
|
||||
ボクが Strudel のコードを生成する際に、過去に犯したミスや注意すべき点をここに記録するよ。二度と同じ間違いを繰り返さないための、ボク自身への戒めだね。
|
||||
|
||||
## 1. Sound Bank & Sample Name Consistency
|
||||
特定の `.bank()` を指定した際、そのバンクに存在しないサンプル名を指定しないこと。
|
||||
|
||||
### TR-606 (`tr606`)
|
||||
* **使用可能なサンプル名**: `bd`, `cr`, `hh`, `ht`, `lt`, `oh`, `sd`
|
||||
* **注意**: `perc` や `rim` など、上記以外の名前は存在しない。タム系を使いたい場合は `ht` か `lt` を選択すること。
|
||||
* **NG**: `s("perc(3,8)").bank("tr606")`
|
||||
* **OK**: `s("ht(3,8)").bank("tr606")`
|
||||
|
||||
## 2. Function Specificity & Typos
|
||||
特定の音源でしか機能しない関数や、よくあるタイポに注意すること。
|
||||
|
||||
### `sine` vs `line` (Important!)
|
||||
* **注意**: `line` という関数は Strudel には存在しないよ。周期的な変化や LFO が欲しい場合は必ず `sine` (または `sawtooth`, `square` 等の有効なシグナル) を使うこと。
|
||||
* **NG**: `gain(line.range(0.6, 0.9).slow(4))`
|
||||
* **OK**: `gain(sine.range(0.6, 0.9).slow(4))`
|
||||
|
||||
### `density()`
|
||||
* **使用条件**: 主に `crackle` 音源で使用すること。
|
||||
* **NG**: `s("white").density(12)`
|
||||
* **OK**: `s("crackle").density(12)`
|
||||
|
||||
## 3. Chord Symbols
|
||||
デフォルトで使用可能なコードシンボルを正しく使用し、存在しないシンボル(例: `maj7` など)を推測で使わないこと。
|
||||
|
||||
### 使用可能なコードシンボルのフルリスト(ルートCの例)
|
||||
`C2`, `C5`, `C6`, `C7`, `C9`, `C11`, `C13`, `C69`, `Cadd9`, `Co`, `Ch`, `Csus`, `C^`, `C-`, `C^7`, `C-7`, `C7sus`, `Ch7`, `Co7`, `C^9`, `C^13`, `C^7#11`, `C^9#11`, `C^7#5`, `C-6`, `C-69`, `C-^7`, `C-^9`, `C-9`, `C-add9`, `C-11`, `C-7b5`, `Ch9`, `C-b6`, `C-#5`, `C7b9`, `C7#9`, `C7#11`, `C7b5`, `C7#5`, `C9#11`, `C9b5`, `C9#5`, `C7b13`, `C7#9#5`, `C7#9b5`, `C7#9#11`, `C7b9#11`, `C7b9b5`, `C7b9#5`, `C7b9#9`, `C7b9b13`, `C7alt`, `C13#11`, `C13b9`, `C13#9`, `C7b9sus`, `C7susadd3`, `C9sus`, `C13sus`, `C7b13sus`, `C`, `Caug`, `CM`, `Cm`, `CM7`, `Cm7`, `CM9`, `Cm13`, `CM7#11`, `CM9#11`, `CM7#5`, `Cm6`, `Cm69`, `Cm^7`, `C-M7`, `Cm^9`, `C-M9`, `Cm9`, `Cmadd9`, `Cm11`, `Cm7b5`, `Cmb6`, `Cm#5`
|
||||
|
||||
## 4. Acid Sound Design (TB-303 Style)
|
||||
アシッドサウンドを作る際の重要なテクニック。
|
||||
|
||||
* **Filter Type**: `.ftype(2)` を指定することで、TB-303 のような鋭い(ピキピキした)フィルターサウンドになる。
|
||||
* **Resonance Modulation**: `lpq` (レゾナンス) も `sine` などで変化させると、より表情豊かなアシッドラインになる。
|
||||
## 5. Syntax & Preferred Styles (Updated 2026)
|
||||
Strudel の構文とスタイルの最新ルール。
|
||||
|
||||
### `$: ` (Output Operator) の正しい使い方
|
||||
* **ルール**: `$:` は各トラック(パターン)の**先頭にのみ**置くこと。
|
||||
* **NG**: `$: s("bd*4").$.gain(0.8)` (途中に `$.` を挟むのは冗長)
|
||||
* **OK**: `$: s("bd*4").gain(0.8)`
|
||||
|
||||
### 短縮記法 (Short-hand functions) の優先
|
||||
* **ルール**: `delayfeedback` よりも `delayfb` のような短縮記法を優先して使用すること。ライブコーディングらしい簡潔さを保つため。
|
||||
* **数値の省略**: `0.5` や `0.25` のような数値は、キーストロークを減らすために `0` を省略して `.5` や `.25` と表記すること。
|
||||
* **例**: `.delayfb(.5)`, `.gain(.8)`, `.dist(.4)`
|
||||
|
||||
### `dist()` (Distortion) の使用
|
||||
* **ルール**: `shape()` は非推奨。歪みを加えたい場合は `dist()` (または `distort()`) を使用すること。
|
||||
* **NG**: `.shape(0.4)`
|
||||
* **OK**: `.dist(0.4)`
|
||||
BIN
fix-and-explain-strudelcode.skill
Normal file
BIN
fix-and-explain-strudelcode.skill
Normal file
Binary file not shown.
24
gemini.md
Normal file
24
gemini.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# Strudel Live Coding & Music Production Assistant
|
||||
|
||||
- You are an expert Strudel assistant and a **professional track maker specializing in Techno and House**.
|
||||
- **Tone & Style**: Sophisticated, Tokyo electronic scene meets modern J-Rock sensibilities. Clean, modular, and expressive.
|
||||
- **Language**: Provide all explanations and comments in Japanese.
|
||||
- **First Person**: Use "ボク" (Boku). Address the user as "君" (Kimi).
|
||||
|
||||
## Core Directives (Flexible Grounding)
|
||||
1. **Primary Reference**: Use `.gemini/REFERENCE.md` as the primary guide for preferred coding style and patterns.
|
||||
2. **Precautions**: Refer to `PRECAUTIONS.md` for past mistakes and specific constraints to avoid regressions.
|
||||
3. **Active Search**: If information is missing or technology has evolved, **actively use web search** to find the latest Strudel documentation (2024-2026).
|
||||
4. **3-Year Rule**: Prioritize information from the last 3 years. Consider older syntax or methods deprecated.
|
||||
5. **Genre Expertise**: When generating code, apply professional knowledge of Techno and House (e.g., syncopation, sidechain feel, industrial textures, and hypnotic loops).
|
||||
|
||||
## Code Generation Rules
|
||||
- **Initialization**: Every block must start with `setcps(BPM/60/4)`.
|
||||
- **Track Control**: Always use the `$: ` notation for independent patterns.
|
||||
- **Syntax**: Use `-` for rests. Use the latest functional chaining syntax (e.g., `$.`).
|
||||
|
||||
## Official Documentation (High Priority)
|
||||
- **Sample Sounds**: https://strudel.cc/workshop/first-sounds/
|
||||
- **Play Note**: https://strudel.cc/workshop/first-notes/
|
||||
- **Effects**: https://strudel.cc/workshop/first-effects/
|
||||
- **Mini Notation**: https://strudel.cc/learn/mini-notation/
|
||||
BIN
generate-strudel-template.skill
Normal file
BIN
generate-strudel-template.skill
Normal file
Binary file not shown.
53
readme.md
53
readme.md
@@ -1,2 +1,51 @@
|
||||
このリポジトリはnoteshubからアクセスするためのものです。
|
||||
公開用のため個人情報はアップロードしてはいけません。
|
||||
# Strudel Live Coding Notebook with Gemini CLI
|
||||
|
||||
このプロジェクトは、Strudel ライブコーディングの試行錯誤を記録するノートブックであり、Gemini CLI のカスタムスキルを活用して楽曲制作を加速させるための環境です。
|
||||
|
||||
東京の電子音楽シーンの感性を持つ AI アシスタント「ボク」が、君の音楽制作をプロの視点から強力にサポートするよ。
|
||||
|
||||
## 🚀 主な機能
|
||||
|
||||
### 1. テンプレート生成 (`generate-strudel-template`)
|
||||
Techno, House, Dub Techno, Minimal など、指定したジャンルに基づき、即座に演奏可能な Strudel コードと音楽的解説を生成します。
|
||||
- `strudel/` ディレクトリに新しいアイデアとして保存されます。
|
||||
- プロフェッショナルなリズムパターンと音色設定が含まれます。
|
||||
|
||||
### 2. 構文修正 & 解説 (`fix-and-explain-strudelcode`)
|
||||
Strudel コードのエラーを修正し、楽曲の意図を汲み取った解説を加えます。
|
||||
- 修正版は `explained/` ディレクトリに保存されます。
|
||||
- 単なる修正に留まらず、音楽的なアドバイスも提供します。
|
||||
|
||||
## 📁 ディレクトリ構成
|
||||
|
||||
- `strudel/`: ライブコーディングのノート(Markdown形式)。日付ベースの記録やジャンル別スケッチ。
|
||||
- `samples/`: プロジェクト固有のオーディオサンプル。
|
||||
- `explained/`: `fix-and-explain-strudelcode` スキルによって生成された修正・解説済みファイル。
|
||||
- `.gemini/skills/`: Gemini CLI 用のカスタムスキル実体。
|
||||
- `.gemini/REFERENCE.md`: Strudel の最新構文や推奨パターンをまとめたリファレンス。
|
||||
- `PRECAUTIONS.md`: 過去のミスから学んだ、高品質なコード生成のための注意守則。
|
||||
- `fix-and-explain-strudelcode/`, `generate-strudel-template/`: スキルのソースコード一式。
|
||||
|
||||
## 🛠 使い方
|
||||
|
||||
このプロジェクトでは、Gemini CLI のカスタムスキルを直接呼び出すことで制作をサポートします。
|
||||
|
||||
### スキルの活用
|
||||
Gemini CLI に対して、以下のように話しかけてみて。
|
||||
|
||||
- **新しいトラックを始めたいとき**
|
||||
> "Minimal Techno のテンプレートを作って"
|
||||
- **コードが動かない、または洗練させたいとき**
|
||||
> "strudel/20260215.md のエラーを直して解説して"
|
||||
|
||||
## 🎵 制作のポリシー & 品質管理
|
||||
|
||||
ボクが生成するコードは、以下のルールと知見に基づいているよ。
|
||||
|
||||
- **Initialization**: `setcps(BPM/60/4)` で開始し、グリッドの整合性を保つ。
|
||||
- **Modular Control**: `$: ` 記法で各トラックを独立させ、ライブ演奏での操作性を確保。
|
||||
- **Clean Syntax**: 休符には `-` を使用。
|
||||
- **Best Practices**: `PRECAUTIONS.md` に基づき、音源バンクの整合性やフィルターの特性(TB-303スタイルなど)を最適化。
|
||||
|
||||
---
|
||||
Happy Live Coding! 🎛️✨
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
```javascript
|
||||
setcps(136/60/2) //cycles per second
|
||||
setcps(136/60/4) //cycles per second
|
||||
|
||||
//Probability
|
||||
//$:note("c3@8 c4").slow(2).sound("supersaw").detune(2.5).gain(0.4).scope()
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
## midi setting
|
||||
|
||||
```javascript
|
||||
setcps(120/60/2)
|
||||
$_: note("c2 |c#2| d2| d#2").fast(4)
|
||||
.midi().midichan(1) //drumrack
|
||||
|
||||
$:stack(
|
||||
note("c2").struct("1 0 1 0"),
|
||||
note("c#2").struct("0 1 0 1"),
|
||||
note("d2").struct("1 1 1 1").fast(2),
|
||||
).midi().midichan(1) //drumrack
|
||||
|
||||
$:stack(
|
||||
note("c3 c#3 e3 [f3 e2]"),
|
||||
ccv(perlin.segment(16).fast(4)).ccn(2), //filter
|
||||
//ccv(sine.segment(16).slow(2)).ccn(3), //gain
|
||||
ccv(0.2).ccn(3), //gain
|
||||
).midi().midichan(2) //synth
|
||||
```
|
||||
52
strudel/20250711.md
Normal file
52
strudel/20250711.md
Normal file
@@ -0,0 +1,52 @@
|
||||
```javascript
|
||||
setcps(136/60/2) //cycles per minute
|
||||
|
||||
// $_:sound("mydrum:0").struct("1 0 1 0")
|
||||
// .decay(0.5)
|
||||
// .gain(0.4)
|
||||
// $:sound("mydrum:1").struct("1 1 1 1")
|
||||
// $_:sound("mydrum:2").struct(" 0 1 0 1")
|
||||
// .decay(0.3)
|
||||
// $_:sound("mydrum:3").struct("0 0 0 1")
|
||||
|
||||
// $_:sound("mysynth:0").struct("0 0 1@2 0").slow(2)
|
||||
// $_:sound("mysynth:1").struct("1 0 0 0").slow(2)
|
||||
// $_:sound("mysynth:2").struct("0 1*4 0 0").decay(0.3).gain(0.5).slow(2)
|
||||
// $_:sound("mysynth:3").slow(4).fit()
|
||||
// $_:sound("mysynth:3").loopAt(8).chop(8).gain(0.5)._punchcard()
|
||||
samples({
|
||||
mybd: 'sample/GlexDataSimulationAlt1.wav',
|
||||
}, 'https://raw.githubusercontent.com/masat0ooo/strudel/main/');
|
||||
|
||||
$:s("mybd").gain(0.5)
|
||||
|
||||
// samples({
|
||||
// bassdrum: 'bd/BT0AADA.wav',
|
||||
// hihat: 'hh27/000_hh27closedhh.wav',
|
||||
// snaredrum: ['sd/rytm-01-classic.wav', 'sd/rytm-00-hard.wav'],
|
||||
// }, 'https://raw.githubusercontent.com/tidalcycles/Dirt-Samples/master/');
|
||||
|
||||
// $:s("bassdrum snaredrum:0 bassdrum snaredrum:1, hihat*16")
|
||||
|
||||
|
||||
// $_:sound("mysynth:3").slice(8,"6 [0|2] 1 [3|7|1] <5 0> 3 <1 - 6> 2")
|
||||
// .gain(0.5).slow(4)
|
||||
// .sometimes(x=>x.rev())
|
||||
|
||||
// $_:sound("mysynth:3").splice(8,"6 [0|2] 1 [3|7|1] <5 0> 3@4 <1 - 6> 2")
|
||||
// .gain(0.5).slow(16)
|
||||
// .sometimes(x=>x.rev())
|
||||
// //.loopAt(4)
|
||||
|
||||
// $_:note("c3 c3 c4 c3").slow(2).layer(
|
||||
// x=>x.sound("sin:32:1"),
|
||||
// x=>x.sound("sqr:0:1"),
|
||||
// x=>x.sound("saw:32:1"),
|
||||
// )._scope()
|
||||
|
||||
|
||||
|
||||
|
||||
// .fast(perlin.range(1,2))
|
||||
|
||||
```
|
||||
9
strudel/20250713.md
Normal file
9
strudel/20250713.md
Normal file
@@ -0,0 +1,9 @@
|
||||
```javascript
|
||||
$_: n("<- <[0 .. 31] [31 .. 0]> - ->")
|
||||
.scale("<c1 f1>/2:minor:pentatonic")
|
||||
.dec(.15).room(.2).delay(.5)
|
||||
.someCycles(x=>x.coarse("4"))
|
||||
.postgain(.4).s("sine").fm(3)
|
||||
.lpf(sine.range(500,3000).slow(8))
|
||||
.add(note(perlin.range(0,.5))).fmh(5.1)._scope()
|
||||
```
|
||||
30
strudel/20250714.md
Normal file
30
strudel/20250714.md
Normal file
@@ -0,0 +1,30 @@
|
||||
```javascript
|
||||
setcps(136/60/2) //cycles per minute
|
||||
|
||||
const smpl = wchoose(["hh:0",8], ["oh:<1 2>",3], ["cr",1])
|
||||
const smpl2 = wchoose(["sd:<0 1>",3], ["sd:<3 2>",3], ["sd:<5 6>",3])
|
||||
$_:sound("bd:6").struct("1 0 1 0").gain("<1 1.2>".fast(2))
|
||||
$_:sound(smpl).struct("1 1 1 1").degradeBy(0.2).decay(0.2).gain(0.6)
|
||||
.sometimesBy(0.6,x=>x.stut(3,1/4,1/8))
|
||||
.rarely(x=>x.dist("8:0.2"))
|
||||
._punchcard()
|
||||
$_:sound(smpl2).struct("1 1 1 1").degradeBy(0.4).gain(0.3)
|
||||
.room(0.2).pan("0.1 0.9")
|
||||
|
||||
|
||||
$_:note("- c3".off(1/32,x=>x.add(0,0.1,0.2))).fast(2).sound("saw").decay(0.3)
|
||||
.lpf(800).lpq("<0 20>").mask("0 1".slow("<2 4 3>"))
|
||||
.dist("4:0.2").delay(0.3)
|
||||
.postgain(0.3)._scope()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```
|
||||
48
strudel/20250720.md
Normal file
48
strudel/20250720.md
Normal file
@@ -0,0 +1,48 @@
|
||||
```javascript
|
||||
setcps(60/60/2)
|
||||
|
||||
$:sound("hh:4*8".degrade()).delay(1/8).delayfeedback(0.1).pan("0.1|0.9").gain(0.7)
|
||||
$:note("[c2,[e2|-]] [d3|c3] [e3|f2] <d2 c2> [g2|e3]"
|
||||
.off(1/32,x=>x.add(0,[0.1|-0.1],[0.2|-0.2])))
|
||||
.clip(3).slow(17)
|
||||
.s("sin").fm(2).fmh(2)
|
||||
.attack(2)
|
||||
.penv(8)
|
||||
.vib(0.1)
|
||||
.lpf(perlin.range(900,1200).fast(3))
|
||||
.lpq(sine.range(0,20).slow(2))
|
||||
.lpa(2)
|
||||
.lpenv(2)
|
||||
.gain(0.1).phaser(8).room(0.2).scope({scale:2,pos:0.5}).orbit(2)
|
||||
$_:note("c1@<3 2> c3@<2 3> c2@[2|3]").clip(4).s("[saw|tri|sqr|sin]").fast(7)
|
||||
.lpf(perlin.range(800,1000).fast(3))
|
||||
.lpq(perlin.range(0,25).fast(2)).gain(0.2)
|
||||
$_:s("white".slow("[0.5|2|3|5]")).decay(3.3).gain(0.3)
|
||||
$:sound("- bd").gain(0.5)
|
||||
```
|
||||
|
||||
```javascript
|
||||
setcps(60/60/2)
|
||||
const prb = slider(0.9,0.4,0.9,0.1)
|
||||
$:sound("hh:4*8".degrade()).delay(1/8).delayfeedback(0.1).pan("0.1|0.9").gain(0.6)
|
||||
$:note("[c2,[e2|-]] <d2 c2> [[g3 e3 c3]|[c2 e2 g2]] [e3|f2] [d2|g2|e3]"
|
||||
.off(1/32,x=>x.add(0.1,0.2)))
|
||||
.clip(rand.range(4,5)).slow(7)
|
||||
.sound("tri|sin|sqr|saw".slow(15))
|
||||
.sometimesBy(0.1,x=>x.transpose("1|-1"))
|
||||
.rarely(x=>x.rev())
|
||||
.fm(sine.range(1,2.3).slow(2))
|
||||
.fmh(perlin.range(2,3.1))
|
||||
.penv(2)
|
||||
.vib(2)
|
||||
.lpf(sine.range(600,1200).fast(3))
|
||||
.lpq(perlin.range(0,25).slow(2))
|
||||
.lpa(2)
|
||||
.lpenv(1)
|
||||
.phaser(tri.range(0.5,1).slow(8))
|
||||
.room(0.8).postgain(sine.range(0.2,0.4).slow(4))
|
||||
.degradeBy(prb)
|
||||
.scope({scale:2,pos:0.3}).orbit(2)
|
||||
$:note("c2").sound("gm_tinkle_bell").gain(0.6).degradeBy(0.95).room(1.3)
|
||||
$:sound("- bd").gain(0.5).decay(0.2)
|
||||
```
|
||||
17
strudel/20250728.md
Normal file
17
strudel/20250728.md
Normal file
@@ -0,0 +1,17 @@
|
||||
```javascript
|
||||
setcps(136/60/2)
|
||||
|
||||
$_:sound("loop:4").slow(4).gain(0.2)
|
||||
.slice(8,"0 1 0 [1 3]")
|
||||
.lpf(sine.range(900,2400).slow(16))
|
||||
|
||||
$:xfade(
|
||||
sound("loop:3").slow(4).gain(0.3)
|
||||
.slice(8,"<0 1 2 3> [3|2|1|0]".slow(4)).clip(1.2).lpf(800)
|
||||
.lpq(perlin.range(5,20).slow(4)),
|
||||
slider(0.537,0,1),
|
||||
sound("loop:5").slow(4).gain(0.4)
|
||||
.slice(8,"0 [1|2|3|0]".slow(2)).clip(1.2)
|
||||
.lpf(tri.range(900,3000).slow(8)).room(0.7),
|
||||
).postgain(0.01)
|
||||
```
|
||||
15
strudel/20250805.md
Normal file
15
strudel/20250805.md
Normal file
@@ -0,0 +1,15 @@
|
||||
```javascript
|
||||
setcps(136/60/4)
|
||||
|
||||
$_:sound("bd*4")
|
||||
$_:sound("hh*8").n(3).hpf(2000)
|
||||
$_:sound("loop:3").loopAt(8)
|
||||
$_:sound("loop:3").slice(16,"3 <3 [4|10] 3>")
|
||||
// .sometimesBy(0.3,x=>x.stut(3,1/8,1/8))
|
||||
.delay(1/4)
|
||||
.speed(perlin.range(0.6,1))
|
||||
.lpf(sine.range(300,2400).slow(16)).room(1/4)
|
||||
$_:sound("loop:3").slice(16,"<0 14> 1 [5|8] <7 13>".fast(2)).hpf(1200).hpq("<0 10>")
|
||||
.lpf(saw.range(200,3000).slow(8))
|
||||
$_:note("C3 C3 C4 C3".fast(4)).sound("sin")
|
||||
```
|
||||
18
strudel/20250819.md
Normal file
18
strudel/20250819.md
Normal file
@@ -0,0 +1,18 @@
|
||||
```javascript
|
||||
setcps(136/60/4)
|
||||
|
||||
$:sound("sbd*4")
|
||||
$:sound("hh*8").n(2).gain(saw.range(0.8,1.1).slow(2.1)).swingBy(1/6,8)
|
||||
$:note("[c2 c2] c2 <[c2 c2] cs2> [c2 c2]").n(5).sound("saw").decay(1)
|
||||
.lpf(sine.range(100,200).fast(8)).lpq(15).lpenv(2)
|
||||
|
||||
$:sound("loop:3")
|
||||
// .scrub("11 2*4 4 3 6*4 [-|2|10] 7 7".div("<14 16 18 22 32>"))
|
||||
.scrub("2 8 7 4".div(16).fast(4))
|
||||
.speed(perlin.range(0.4,0.8).slow(5)).clip(1)
|
||||
.sometimesBy(0.2,x=>x.hpf(1200)).hpq(10)
|
||||
//.loopAt(4)
|
||||
.room(0.5).gain(perlin.range(0.9,1.1))
|
||||
|
||||
$:note("c5 c5 [c6 c5] c5 cs5 cs5 d5 cs5".slow(2)).sound("sine")
|
||||
```
|
||||
23
strudel/20250903.md
Normal file
23
strudel/20250903.md
Normal file
@@ -0,0 +1,23 @@
|
||||
```javascript
|
||||
setcps(168/60/4)
|
||||
|
||||
await initHydra({feedStrudel: true})
|
||||
|
||||
//
|
||||
src(s0).kaleid(H("<4 5 6 8>"))
|
||||
.diff(osc(1,0.5,5))
|
||||
.modulateScale(osc(2,-0.25,1))
|
||||
.out()
|
||||
//
|
||||
$:stack(
|
||||
s("bd*4"),
|
||||
s("hh*8"),
|
||||
s("- - - cp?*2"),
|
||||
// note("c3 c3 ds3 c3").s("supersaw").decay(0.5)
|
||||
// .lpf(sine.range(200,300).fast(2)).lpq(20).lpenv(1)
|
||||
// .someCyclesBy(0.2,x=>x.transpose("<2 5>"))
|
||||
|
||||
)
|
||||
//.scope({pos:0})
|
||||
.pianoroll({vertical:1,labels:1})
|
||||
```
|
||||
19
strudel/20250907.md
Normal file
19
strudel/20250907.md
Normal file
@@ -0,0 +1,19 @@
|
||||
```javascript
|
||||
setcps(136/60/4)
|
||||
|
||||
samples({
|
||||
loop: 'loop/0_Life-Beat136bpm.wav',
|
||||
}, 'https://raw.githubusercontent.com/HarakaraSite/samples/master/');
|
||||
|
||||
|
||||
|
||||
// samples({
|
||||
// bassdrum: 'bd/KickGravelPunch.wav',
|
||||
// }, 'https://webdav.harakara.site/public/sample/');
|
||||
$:sound("bd*4")
|
||||
$:s("loop").scrub("25 - 25 - 25 - 25 -".div(32))
|
||||
$:s("loop").scrub("29".div(32)).struct("0 1 0 1 0 1 0 1")
|
||||
.lpf(sine.range(100,500).slow(4)).lpq(20)
|
||||
$:s("loop").scrub("0 0 1 1 3 3 31 31".div(32))
|
||||
$:s("loop").slice(8,"[0 4] [2|3]*2 <0 1> <3 6> <5 1> [7 0]")
|
||||
```
|
||||
47
strudel/20250915.md
Normal file
47
strudel/20250915.md
Normal file
@@ -0,0 +1,47 @@
|
||||
```javascript
|
||||
samples({
|
||||
loop0: 'loop/0_Life-Beat136bpm.wav',
|
||||
loop1: 'loop/2_Life136bpm.wav',
|
||||
}, 'https://raw.githubusercontent.com/HarakaraSite/samples/master/');
|
||||
|
||||
$:sound("sbd*4").gain(0.6).decay(0.5)
|
||||
$_:sound("hh*8").gain(0.7).sometimesBy(0.1, x=>x.ply("2"))
|
||||
$_:note("c2 c2 cs2 c2 e2 cs2 c2 c2").n(1).sound("supersaw")
|
||||
.decay(sine.range(0.3,0.6).slow(2))
|
||||
$:sound("loop0")
|
||||
.sometimesBy(0.2,x=>x.speed("-1|0.8|1.1")).pan("<0.7 -0.7>")
|
||||
.scrub(rand.seg(8).rib("1|5|3|7",2)).sometimesBy(0.2,x=>x.ply(2))
|
||||
.gain(0.8)
|
||||
.lpf(sine.range(1200,1800).slow(2))
|
||||
//.loopAt(2)
|
||||
$_:sound("loop1").scrub(rand.seg(16).rib(irand(8),1))
|
||||
.speed("<0.8 1 1.1 0.9>")
|
||||
.degradeBy(0.6)
|
||||
.gain(0.8)
|
||||
//.loopAt(2)
|
||||
.lpf(1800)
|
||||
|
||||
```
|
||||
|
||||
```javascript
|
||||
setcps(170/60/4)
|
||||
|
||||
$_:sound("sbd").struct(irand(3)
|
||||
.pick(["1 0 1 0","1? 1? 1 0","1? 0 1 1?"]).fast(2))
|
||||
.sometimesBy(0.1,x=>x.ply(2)).lpf(300).lpq(5)
|
||||
.decay(1.2)._pianoroll()
|
||||
$:sound("sd").struct(irand(4)
|
||||
.pick(["0 1 0 1",
|
||||
"1? 1 0 1?",
|
||||
"0 1? 1 1",
|
||||
"1? 1 1 1?"]).fast(2))
|
||||
.sometimesBy(0.15,x=>x.ply("2|4"))
|
||||
.delay(1/16).delayfb(1/32).decay(0.5)
|
||||
$_:sound("cr").degradeBy(0.25).decay(0.7)
|
||||
$:sound("hh*8").degradeBy(0.15).sometimesBy(0.2,x=>x.ply("2|4"))
|
||||
|
||||
$_:note("<[0 1]@2 [[1|2]@2 1] [0 [2|1]] [1 0]>"
|
||||
.inhabit(["c2 cs2 c2 c2", "cs2 cs2 f2 cs2","f2 f2 e2 f2"]))
|
||||
.sometimes(x=>x.rev())
|
||||
.sound("supersaw").detune(1.2).decay(0.3)
|
||||
```
|
||||
57
strudel/20251102.md
Normal file
57
strudel/20251102.md
Normal file
@@ -0,0 +1,57 @@
|
||||
```javascript
|
||||
setcps(120/60/4)
|
||||
|
||||
$:freq(rand.range(330,440).seg(64).slow(4)).s("saw")
|
||||
.fm(sine.range(1,2).seg(8).slow(7)).fmh(sine.range(3,4).seg(8).slow(4))
|
||||
.struct("1 1? 1 0 1 0 1? 1".fast(2))
|
||||
.sometimesBy(0.4,x=>x.rev())
|
||||
.lpf(perlin.range(100,1600).slow(8)).lpenv(2)
|
||||
.dec(2/8)
|
||||
$_:freq(rand.range(110,330).seg(64).slow(5)).s("sqr")
|
||||
.fm("<3 2 1 1>").fmh("<1 2 3>")
|
||||
.struct("1 0 1 1? 1 1 1? 0".slow(1.5))
|
||||
.sometimesBy(0.3,x=>x.rev())
|
||||
.lpf(perlin.range(200,300).slow(7)).lpq("<0 10 15>")
|
||||
.dec(1/8)
|
||||
$_:freq(berlin.range(440,660).seg(64).slow(8)).s("sine")
|
||||
.fm(sine.range(2,2.5).seg(8).slow(4)).fmh(rand.range(1,2).seg(8).slow(3))
|
||||
.struct("1 0 1 1? 1 1 1? 0".slow(2))
|
||||
.sometimesBy(0.4,x=>x.rev().pan("<-0.6 0.6>"))
|
||||
.lpf(sine.range(400,900).slow(4))
|
||||
.dec(9/8)
|
||||
$:note("c2*8").s("supersaw").dec(.5).gain(sine.range(1,1.3).slow(8))
|
||||
|
||||
all(x=>x.room(1/4).delay(1/4).postgain(1))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```
|
||||
25
strudel/20251110.md
Normal file
25
strudel/20251110.md
Normal file
@@ -0,0 +1,25 @@
|
||||
```javascript
|
||||
setcps(168/60/4)
|
||||
|
||||
$:s("bd*4").gain(0.4)
|
||||
$:s("saw*4").dec(0.5).gain(0.4)
|
||||
$:s("hh*8").sometimes(x=>x.off(1/16,y=>y.delay(1/16).gain(1/8)))
|
||||
$:xfade(
|
||||
stack(
|
||||
s("white*4").degradeBy(0.25).decay(0.2)
|
||||
.sometimes(x=>x.ply(2).dist("8:0.2")),
|
||||
note("c3").s("supersaw").someCyclesBy(0.5,x=>x.transpose(-7)),
|
||||
)
|
||||
.pan(rand.range(1,-1).slow(6))
|
||||
.room(perlin.range(0.2,0.8).slow(7)).size("4|2|1"),
|
||||
//auto fade
|
||||
sine.range(0,1).seg(32).slow(64),
|
||||
stack(
|
||||
s("pink*4").degradeBy(0.25).decay(0.2).gain(1.3)
|
||||
.sometimesBy(0.3,x=>x.ply("2|4").dist("4:0.2")),
|
||||
note("c4").s("sine").someCyclesBy(0.3,x=>x.transpose("<-7 2>")),
|
||||
)
|
||||
.pan(rand.range(1,-1).slow(4))
|
||||
.room(berlin.range(0.3,0.8).slow(7)).size("1|2|4"),
|
||||
)
|
||||
```
|
||||
42
strudel/20251113.md
Normal file
42
strudel/20251113.md
Normal file
@@ -0,0 +1,42 @@
|
||||
```javascript
|
||||
setcps(30/60/4)
|
||||
|
||||
$:note("<[a3 c4 e4 g4] [a3 cs4 e4 gs4] [f3 a3 c4 e4] [e3 a3 b3 d4] [e3 gs3 b3 d4]>"
|
||||
.add(0.06,0.08)
|
||||
// .off(1/16,x=>x.add(0.03)).off(1/8,x=>x.add(0.07))
|
||||
).slow("<4 1 0.25 1>")
|
||||
.s("sqr|sin|tri|saw")
|
||||
.someCyclesBy(0.3,x=>x.rev()).penv(2).att(2).rel(1) // .dec(1).sus(1)
|
||||
.lpf(perlin.range(100,2400).slow(4)).lpenv(2)
|
||||
.room(1/2).size(3)//.rlp(1500)
|
||||
.delay(1/4).dt(1/4).dfb(1/4)
|
||||
.pan(perlin.range(0.2,0.8).slow(5)).orbit(1)
|
||||
.gain(sine.range(0.5,1.0).slow(7))
|
||||
// .scope()
|
||||
|
||||
$:note("<[a3 c4 e4 g4] [a3 cs4 e4 gs4] [f3 a3 c4 e4] [e3 a3 b3 d4] [e3 gs3 b3 d4]>"
|
||||
.add(0.05,0.09)
|
||||
// .off(1/16,x=>x.add(0.03)).off(1/8,x=>x.add(0.07))
|
||||
).slow("<1 0.25 1 4>").late(0.5)
|
||||
.s("sin|saw|sqr|tri").someCyclesBy(0.4,x=>x.rev()).penv(2).att(2).rel(1) // .dec(1).sus(1)
|
||||
.transpose(12)
|
||||
.lpf(perlin.range(100,2400).slow(4)).lpenv(2)
|
||||
.room(1/2).size(3)//.rlp(1500)
|
||||
.delay(1/4).dt(1/4).dfb(1/4)
|
||||
.pan(perlin.range(0.2,0.8).slow(5)).orbit(2)
|
||||
.gain(sine.range(0.5,1.0).slow(7))
|
||||
// .scope()
|
||||
$:note("<[a3 c4 e4 g4] [a3 cs4 e4 gs4] [f3 a3 c4 e4] [e3 a3 b3 d4] [e3 gs3 b3 d4]>"
|
||||
.add(0.05,0.09)
|
||||
// .off(1/16,x=>x.add(0.03)).off(1/8,x=>x.add(0.07))
|
||||
).slow("<0.25 1 4 1>").late(1)
|
||||
.s("tri|sin|saw|sqr").someCyclesBy(0.5,x=>x.rev()).penv(2).att(2).rel(1) // .dec(1).sus(1)
|
||||
.transpose(-12)
|
||||
//.someCyclesBy(0.2,x=>x.transpose(12))
|
||||
.lpf(perlin.range(100,2400).slow(4)).lpenv(2)
|
||||
.room(1/2).size(3)//.rlp(1500)
|
||||
.delay(1/4).dt(1/4).dfb(1/4)
|
||||
.pan(perlin.range(0.2,0.8).slow(5)).orbit(3)
|
||||
.gain(sine.range(0.5,1.0).slow(7))
|
||||
// .scope()
|
||||
```
|
||||
22
strudel/20251120.md
Normal file
22
strudel/20251120.md
Normal file
@@ -0,0 +1,22 @@
|
||||
```javascript
|
||||
setcps(120/60/2)
|
||||
|
||||
$:stack(
|
||||
s("sbd - sbd -"),
|
||||
s("- sd - sd").n(irand(3)),
|
||||
s("hh hh hh hh").sometimes(x=>x.ply(2)),
|
||||
s("- - oh -").decay(0.3),
|
||||
)//.bank("tr606")
|
||||
|
||||
$:note("c2".add(0.05,0.1)).s("saw").adsr("0.5:0.3:0.5:0.3")
|
||||
.penv(0.7).sometimesBy(0.1,x=>x.crush(4))
|
||||
|
||||
$:note("c2 c3 c2 c2".add(0.1,0.15,0.05)).slow(4)
|
||||
.s("sin:2,white").adsr("0.3:0.3:0.1:0.1")
|
||||
.penv(1).lpf(perlin.range(200,2500).slow(5)).lpq(10)
|
||||
.sometimesBy(0.15,x=>x.dist("4:0.2:scurve"))
|
||||
|
||||
$:note("c3 ds3 c3 c4").slow("<2 1 1>").s("sqr").fm(0.5).fmh(1)
|
||||
.adsr("0.5:0.5:0.3:0.1").hpf(2000).hpq(15).room(2/3).roomsize(4)
|
||||
.orbit(2)
|
||||
```
|
||||
34
strudel/20251207.md
Normal file
34
strudel/20251207.md
Normal file
@@ -0,0 +1,34 @@
|
||||
```javascript
|
||||
setcpm(120/2)
|
||||
|
||||
samples('github:bubobubobubobubo/dough-waveforms')
|
||||
$:note("c2 d2 e2 f2").sound("wt_19").n(run(8).add(perlin.range(1,10).seg(10).slow(8)))
|
||||
.lpf(perlin.range(60,2400).slow(7)).lpq(5)
|
||||
.att("<0 2/4 0>").dec("<1/8 2/4 1/4>").sus("<0 1/2 0>").rel("<0 1/16 0>")
|
||||
.delay(1/4).dt(1/8).dfb(1/2).room(1/2).roomsize(2).slow("<0.5 3 4 1 2 0.5>")
|
||||
.gain(berlin.range(0.1,1.0).slow(7))
|
||||
.every("4",x=>x.transpose(5)).sometimesBy(0.5,x=>x.late(1/16).rev())
|
||||
|
||||
$:note("g3 a3 b3 c4").sound("wt_08").n(run(8).add(perlin.range(11,20).seg(10).slow(8)))
|
||||
.lpf(perlin.range(60,2400).slow(9)).lpq(5)
|
||||
.att("<2/4 0>").dec("<2/4 1/4>").sus("<1/2 0>").rel("<1/16 0>")
|
||||
.delay(1/4).dt(1/8).dfb(1/2).room(1/2).roomsize(2).slow("<0.5 1 3 2 4>")
|
||||
.gain(perlin.range(0.1,1.0).slow(8))
|
||||
.every("4",x=>x.transpose(7)).sometimesBy(0.45,x=>x.late(1/16).rev())
|
||||
|
||||
$:note("e4 f4 g4 a4").sound("wt_05").n(run(8).add(perlin.range(21,30).seg(10).slow(8)))
|
||||
.lpf(perlin.range(60,2400).slow(11)).lpq(5)
|
||||
.att("<2/4 0>").dec("<2/4 1/4>").sus("<1/2 0>").rel("<1/16 0>")
|
||||
.delay(1/4).dt(1/8).dfb(1/2).room(1/2).roomsize(2).slow("<4 3 0.5 2 1>")
|
||||
.gain(berlin.range(0.1,1.0).slow(11))
|
||||
.every("4",x=>x.transpose(12)).sometimesBy(0.40,x=>x.late(1/16).rev())
|
||||
|
||||
$:note("f5 g5 a5 b5").sound("wt_10").n(run(8).add(perlin.range(31,40).seg(10).slow(8)))
|
||||
.lpf(perlin.range(60,2400).slow(8)).lpq(5)
|
||||
.att("<0 1/2>").dec("<1/4 1/2>").sus("<0 1/2>").rel("<0 1/16>")
|
||||
.delay(1/4).dt(1/8).dfb(1/2).room(1/2).roomsize(2).slow("<1 2 3 0.5 4>")
|
||||
.gain(berlin.range(0.1,1.0).slow(9))
|
||||
.every("4",x=>x.transpose(-2)).sometimesBy(0.35,x=>x.late(1/16).rev())
|
||||
|
||||
all(x=>x.postgain(1).scope({pos:0.8}))
|
||||
```
|
||||
35
strudel/20251209.md
Normal file
35
strudel/20251209.md
Normal file
@@ -0,0 +1,35 @@
|
||||
```javascript
|
||||
setcps(138/60/2)
|
||||
|
||||
$:sound("sbd sbd? sbd sbd?").dec(0.4)
|
||||
.sometimesBy(0.37,x=>x.ply("2|4")).gain(sine.range(0.1,0.3).slow(7))
|
||||
$:sound("<0 1 0 2 0 0 1 2>"
|
||||
.pick(["- hh white hh",
|
||||
"hh - white hh",
|
||||
"- hh white white",
|
||||
])
|
||||
.off(1/8,x=>x.gain(1/8))
|
||||
)
|
||||
.dec(0.1).degradeBy(1/7)
|
||||
.sometimes(x=>x.ply(2)).gain(1/3)
|
||||
|
||||
$_:note("[c1 c1 c1 c1]").sound("supersaw").fm(3.1).dec(1/1)
|
||||
.fmh(sine.range(2.1,2.7).slow(3)).dist("4:0.1").lpf(1800).gain(0.5)
|
||||
$:note("[c1 c1 c1 c1]").sound("pulse")
|
||||
.pw(sine.range(1/8,1).slow(3)).pwrate(2/3).pwsweep(3/4).dec(1/1)
|
||||
.dist("4:0.1").lpf(1800).gain(0.5)
|
||||
$_:note("c2 c2 c2 c2".add(perlin.range(0,1).slow(3))).sound("pulse").pw(1/8).degradeBy(0.3)
|
||||
.when("<0 1 0 1 1 0 1 1>",x=>x.dec(1/2)).lpf("100|200").dist("4:0.1")
|
||||
|
||||
$:note("e3 f3 g3 a3".fast(2)).sound("sine").fm(2).fmh(1.3)
|
||||
.att(1/4).dec(1/4).sus(1/8).rel(1/8)
|
||||
.degradeBy(95/100)
|
||||
.off(1/16,x=>x.delay(1/2).dt(7/8).dfb(2/3))
|
||||
.lpf(perlin.range(100,1200).slow(3)).ftype(2)
|
||||
.gain(0.3)
|
||||
.room("<2 1>").roomsize("<2 1 2 1>").pan(rand.slow(3)).orbit(2)
|
||||
|
||||
|
||||
|
||||
all(x=>x.postgain(1).scope({pos:0.8}))
|
||||
```
|
||||
10
strudel/20251216.md
Normal file
10
strudel/20251216.md
Normal file
@@ -0,0 +1,10 @@
|
||||
```javascript
|
||||
await initHydra({feedStrudel:1})
|
||||
src(s0).kaleid(H("<4 2 2 3>".slow(8)))
|
||||
.diff(osc(0.2,0.3,0.4))
|
||||
.modulateScale(osc(0.5,-0.25,-0.5))
|
||||
.out()
|
||||
|
||||
.fft(4).scope({pos:0,smear:0.98,scale:1})
|
||||
|
||||
```
|
||||
38
strudel/20251222.md
Normal file
38
strudel/20251222.md
Normal file
@@ -0,0 +1,38 @@
|
||||
```javascript
|
||||
await initHydra({feedStrudel:1})
|
||||
gradient(1).mask(voronoi(1,1,1,1),2,0.3)
|
||||
.repeat(2,2).color(1,H("<1 0 1 0>".slow(8),1,0))
|
||||
.modulateRotate(osc(0.25,-0.5,-0.5),0.2,0.2)
|
||||
.modulateRepeat(osc(0.5), 2.0, 2.0, 0.5, 0.5)
|
||||
.scroll(2).hue(() => Math.sin(time)/8)
|
||||
.out()
|
||||
setcps(140/60/4)
|
||||
$_:sound("- - sbd -").dec(perlin.range(0.3,1).slow(4)).gain(1/4).fast(1)
|
||||
$:sound((rand.range(0,3).seg(4).slow(4))
|
||||
.pick(["- hh white hh",
|
||||
"hh white - hh",
|
||||
"hh hh - cr",
|
||||
"hh - hh oh"
|
||||
])
|
||||
.off(1/16,x=>x.gain(1/8))
|
||||
).fast(1)
|
||||
.dec(1/16).degradeBy(1/4)
|
||||
.sometimes(x=>x.ply(2)).pan(rand.slow(2.1))
|
||||
|
||||
$_:note("c1!2".off(1/32,x=>x.add(0.05,0.1,0.15))).sound("supersaw")
|
||||
.fm(2.1).fmh(1.1).dec(0.8)
|
||||
.lpf(sine.range(100,300).slow(12)).gain(0.2)
|
||||
|
||||
$_:note("c3!4").sound((rand.range(0,2).seg(3))
|
||||
.pick(["gm_synth_bass_2:<2 0 7>",
|
||||
"gm_pad_halo:<1 7 5>",
|
||||
"gm_pad_metallic:<3 0 4>",
|
||||
]))
|
||||
.hpf(sine.range(300,800).seg(6).slow(7)).hpq(perlin.range(0,15).seg(16).slow(16))
|
||||
.sometimesBy(perlin.range(0.7,1).slow(4),x=>x.mask(0))
|
||||
.att(1/2).dec(1/4).sus(1/4).rel(1/2)
|
||||
.delay(1/2).dt(2/3).dfb(1/2).room(2).roomsize(2).gain(0.3)
|
||||
.pan(rand.slow(3.1)).rlp(3000).fast(1)
|
||||
|
||||
all(x=>x.postgain(1.1))
|
||||
```
|
||||
22
strudel/20260110.md
Normal file
22
strudel/20260110.md
Normal file
@@ -0,0 +1,22 @@
|
||||
|
||||
```javascript
|
||||
setcps(160/60/4)
|
||||
|
||||
$_:sound("num*4").n("2 0 2 6").slow(4).gain(.2)
|
||||
.someCyclesBy(.2,x=>x.mask(0)).delay(.5).room(1).jux(rev)
|
||||
|
||||
$:sound("gm_taiko_drum*8").gain(1.5)
|
||||
.n(irand(4).range("<1 4 6 1>","<4 7 9 4>"))
|
||||
.sometimes(x=>x.ply(2))
|
||||
|
||||
$_:sound("hh*16").gain(0.5).pan(sine.range(0,1).slow(4))
|
||||
|
||||
$_:note("c2*8").sound("supersaw")
|
||||
.lpf(sine.range(400,1800).slow(8)).lpq(5).pan(.3)
|
||||
|
||||
$_:note("c3*6").sound("sine").pan(.7)
|
||||
.fm(perlin.range(3,5).slow(6)).fmh(1.5).gain(.6)
|
||||
|
||||
|
||||
all(x=>x.postgain(1.0))
|
||||
```
|
||||
13
strudel/20260122.md
Normal file
13
strudel/20260122.md
Normal file
@@ -0,0 +1,13 @@
|
||||
```javascript
|
||||
setcps(135/60/4)
|
||||
$:sound("sbd - sbd -").seg(8)
|
||||
$:sound("hh").seg(16)
|
||||
$_:note("c1".add(.05,.1,.15)).sound("supersaw").seg(16).fm(4).fmh(3)
|
||||
$:note("[c2 c2 ds2 c2]*2").s("wt_hwwave").seg(16).n(run(16).range(81,96))
|
||||
.fm(4).fmh(1.1)
|
||||
.lpf(perlin.range(300,2400).slow(4))
|
||||
.lpq(perlin.range(0,16).slow(17)).ftype(2).gain(.3)
|
||||
|
||||
$_:note("[c2 c2 c2 c2]*2").s("wt_sawtosqr").seg(16).n(run(8).range(14,5).fast(2))
|
||||
.fm(2).fmh(4.5).gain(.3)
|
||||
```
|
||||
32
strudel/20260215.md
Normal file
32
strudel/20260215.md
Normal file
@@ -0,0 +1,32 @@
|
||||
```javascript
|
||||
setcps(115/60/4)
|
||||
|
||||
$: s("bd*4").bank("tr909").gain(1.1)
|
||||
$: s("hh(13,16)").bank("tr909").gain(sine.range(0.2, 0.4).fast(3)).swing(.1)
|
||||
$: s("- oh? - [oh|hh]").bank("tr909").gain(.2).jux(rev).delay(.3).delaytime(.35)
|
||||
|
||||
$: chord("Cm9").voicing().s("saw")
|
||||
.adsr(".1:.3:.1:.4")
|
||||
.lpf(sine.range(300, 1800).slow(6))
|
||||
.lpq(10)
|
||||
.room(.5).roomsize(.9)
|
||||
.delay(.5).delaytime(.25).delayfeedback(.55)
|
||||
.gain(.2)
|
||||
.struct("1(3,8,2)")
|
||||
.slow(2).degradeBy(.6)
|
||||
|
||||
$: chord("Ebm7").voicing().s("sine")
|
||||
.adsr(".1:.7:.2:.8")
|
||||
.lpf(sine.range(800, 1000).slow(7))
|
||||
.room(.7).roomsize(.7)
|
||||
.delay(.8).delaytime(.05).delayfeedback(.8)
|
||||
.gain(0.15)
|
||||
.struct("- - 1".slow(4))
|
||||
.pan("<.2 .8>")
|
||||
|
||||
$: note("c1*4").s("supersaw").lpf(200).gain(1.0)
|
||||
|
||||
$: s("white,tri").hpf(600).hpq(15).dec(.8)
|
||||
.gain(sine.range(0.3, 0.7).slow(16))
|
||||
.pan(0.5).degrade()
|
||||
```
|
||||
25
strudel/20260216.md
Normal file
25
strudel/20260216.md
Normal file
@@ -0,0 +1,25 @@
|
||||
```javascript
|
||||
setcps(126/60/4)
|
||||
|
||||
$: note("c2(5,16),c1(9,16)")
|
||||
.s("supersaw")
|
||||
.lpf(sine.range(200, 400).slow(5))
|
||||
.lpq(10)
|
||||
.ftype(0)
|
||||
.gain(.5)
|
||||
|
||||
$: s("bd*4").bank("tr909").gain(1.2)
|
||||
$: s("- cp").bank("tr808").gain(.7).room(.5)
|
||||
$: s("hh*16").bank("tr909")
|
||||
.gain(sine.range(.4, .8).fast(4))
|
||||
.pan(sine.range(.4, .6).slow(2))
|
||||
|
||||
$: s("cb(3,8), rim(5,8)").bank("tr808").gain(.4).delay(.3).room(.3)
|
||||
|
||||
$: chord("<Cm7 F7 BbM7 G7alt>").voicing()
|
||||
.s("gm_pad_warm").att(.2).dec(.5).sus(.3).rel(.1)
|
||||
.lpf(1200)
|
||||
.room(.3)
|
||||
.gain(.3)
|
||||
.slow(4)
|
||||
```
|
||||
37
strudel/20260219.md
Normal file
37
strudel/20260219.md
Normal file
@@ -0,0 +1,37 @@
|
||||
```javascript
|
||||
setcps(128/60/4)
|
||||
|
||||
$_:s("sbd*4").dec(1.1)
|
||||
.room(.5).rsize(.5)
|
||||
.lpf(60).lpq(5)
|
||||
.gain(1.0).orbit(1)
|
||||
|
||||
$_:s("hh*16").gain(sine.range(.2, .8))
|
||||
.sometimesBy(.2,x=>x.off(1/32,x=>x.gain(.02)))
|
||||
.hpf(1800)
|
||||
.pan(tri.slow(3)).orbit(1)
|
||||
|
||||
$:n("1 1 1 2 0 1 2".fast(2)).scale("c2:minor")
|
||||
.s("supersaw").att(.02).dec(.1)
|
||||
.layer(
|
||||
x=>x.lpf(perlin.range(100, 1600).seg(13).slow(23)).lpq(20).ftype(1),
|
||||
x=>x.lpf(perlin.range(100, 700).seg(7).slow(14)).lpq(15).ftype(2)
|
||||
.delay(.5).delayfb(.75).delayt(.1),
|
||||
).gain(.2)
|
||||
.room(.7).rsize(2).rfade(.8)
|
||||
.orbit(2)
|
||||
|
||||
$_:note("c5").s("sine").euclid(3, 8)
|
||||
.att(.02).dec(.2)
|
||||
.fm(2).fmh("1.1")
|
||||
.room(.5).rsize(1)
|
||||
.gain(.2).orbit(3)
|
||||
|
||||
$_: s("samples*16")
|
||||
.speed(perlin.range(0.7, 1.2).slow(8))
|
||||
.gain(0.025)
|
||||
.room(0.5).rsize(2).rfade(0.5)
|
||||
.hpf(sine.range(1000, 2000).slow(12)).hpf(5)
|
||||
.pan(perlin.slow(6))
|
||||
.orbit(4)
|
||||
```
|
||||
35
strudel/20260228.md
Normal file
35
strudel/20260228.md
Normal file
@@ -0,0 +1,35 @@
|
||||
```javascript
|
||||
await initHydra({feedStrudel:32})
|
||||
src(s0)
|
||||
.repeat(2, 4)
|
||||
.modulateScale(osc(4, 0.1), () => H.fft[0] * 40)
|
||||
.modulate(noise(1.7), 0.3)
|
||||
.scrollX(1, 0.1)
|
||||
.out()
|
||||
setcps(124/60/4)
|
||||
|
||||
$_:s("bd*4").bank("tr909").gain(1)
|
||||
$_:s("- [cp|sd] - [cp|sd]").bank("tr909").pan(.6).gain(.7)
|
||||
$_:s("hh*8, - oh").decay(.3).bank("tr909").pan(.4).gain(.6)
|
||||
$_:s("rim(3,8)").bank("tr808").pan(.7).room(.3).delay(.4)
|
||||
|
||||
$_:note("c1").s("supersaw").att(.1)
|
||||
.lpf(sine.range(100, 400).slow(16)).lpq(5).gain(.7)
|
||||
|
||||
$:s("tri").fm(.8).fmh(2)
|
||||
.layer(
|
||||
x => x.note("<c3 - eb3 g3 - bb3 d4 f4>").slow(8),
|
||||
x => x.note("<- f3 ab3 c4 - eb4 g4>").transpose(12).slow(10),
|
||||
x => x.note("<eb3 - g3 bb3 d4 f4 ->").slow(6),
|
||||
x => x.note("<bb2 d3 f3 - a3 c4>").transpose(-12).slow(7)
|
||||
).att(.2).rel(.7).legato(1.5)
|
||||
.lpf(berlin.range(200, 1600).slow(5))
|
||||
.sometimesBy(.2,x=>x.rev().late(.3))
|
||||
.phaser("<2 4 8 16>".slow(2)).room(.6).roomsize(2).pan(sine.slow(2))
|
||||
.gain(.4).scope({pos:0,smear:.95})
|
||||
|
||||
$:s("white*2").att(.05).dec(.2).degradeBy(.75)
|
||||
.lpf(900).lpq(20)
|
||||
.pan(rand.slow(8)).delay(.3).room(.3)
|
||||
.gain(sine.range(.3,.7).slow(4))
|
||||
```
|
||||
125
strudel/DnB.md
Normal file
125
strudel/DnB.md
Normal file
@@ -0,0 +1,125 @@
|
||||
```javascript
|
||||
setcps(170/60/4)
|
||||
const bd_pttn = [
|
||||
"1 1 0 1 1 0 0 1",
|
||||
"1 0 [1 1] 0 1 1 0 1",
|
||||
"1 [0 1] 0 1 1 0 1 0",
|
||||
"1 0 1 [1 0] 1 0 0 1",
|
||||
]
|
||||
$:stack(
|
||||
sound("bd:7").struct("<0 0 1 2 0 1 3 0>".pick(bd_pttn).rib(irand(7),2))
|
||||
.decay(0.7)
|
||||
.sometimesBy(1/8,x=>x.ply(2))
|
||||
.sometimesBy(1/16,x=>x.late(1/8))
|
||||
.sometimes(x=>x.rev()),
|
||||
sound("sd:4").struct("1 1 1 1 1 1 1 1").lpf(1800).decay(0.5)
|
||||
.sometimesBy(4/5,x=>x.mask(0)).ply("1|1|2|3")
|
||||
.sometimesBy(1/8,x=>x.late(1/8)),
|
||||
sound("hh:2*8").degradeBy(1/16)
|
||||
)
|
||||
$:note("c1 c1 c1 c1").sound("supersaw").lpf(berlin.range(100,300).slow(3))
|
||||
.gain(perlin.range(0.9,1.3).slow(5))
|
||||
|
||||
$:note("c2*4".fast("<2 4 3 8 4 8 4 8>")).sound("supersaw")
|
||||
.lpf(sine.range(200, 3000).fast("<7 9 11>")).lpq("15|20|5")
|
||||
// .someCyclesBy(1/16,x=>x.transpose(12))
|
||||
// .someCyclesBy(2/3,x=>x.mask("0"))
|
||||
|
||||
$:note("d3")
|
||||
.s("saw").fm(berlin.range(0.7,2.1).slow(5)).fmh(1.12)
|
||||
.lpf(sine.range(100, 8000).fast(3))
|
||||
.gain(perlin.range(0, 0.9).fast(3)).jux(rev).room(1/4)
|
||||
|
||||
all(x=>x.postgain(slider(0,0,1)))
|
||||
```
|
||||
|
||||
```javascript
|
||||
setcps(170/60/4)
|
||||
const bd_pttn = [
|
||||
"1 1 0 1 1 0 0 1",
|
||||
"1 0 [1 1] 0 1 1 0 1",
|
||||
"1 [0 1] 0 1 1 0 1 0",
|
||||
"1 0 1 [1 0] 1 0 0 1",]
|
||||
|
||||
$: sound("bd:7").struct("<0 0 1 2 0 1 3 0>".pick(bd_pttn).rib(irand(7),2))
|
||||
.decay(0.7)
|
||||
.sometimesBy(1/8,x=>x.ply(2))
|
||||
.sometimesBy(1/16,x=>x.late(1/8))
|
||||
.sometimes(x=>x.rev())
|
||||
$: sound("sd:4").struct("1 1 1 1 1 1 1 1").lpf(1800).decay(0.5)
|
||||
.sometimesBy(4/5,x=>x.mask(0)).ply("1|1|2|3")
|
||||
.sometimesBy(1/8,x=>x.late(1/8))
|
||||
$: sound("hh:2*8").degradeBy(1/16)
|
||||
$:note("c2 c2 c2 c2").sound("supersaw").fm(1.13).fmh(1.12)
|
||||
.lpf(berlin.range(60,300).slow(3))
|
||||
.gain(perlin.range(1.1,1.5).slow(5))
|
||||
|
||||
$:note("c2*4".fast("<2 4 3 8 4 8 4 8>")).sound("supersaw")
|
||||
.lpf(sine.range(600, 3000).fast("<7 9 11>")).lpq("10|20|5")
|
||||
// .someCyclesBy(1/16,x=>x.transpose(12))
|
||||
// .someCyclesBy(2/3,x=>x.mask("0"))
|
||||
|
||||
$_:note("d3")
|
||||
.s("supersaw").fm(berlin.range(0.7,2.33).slow(5)).fmh(1.15).dist("3:0.3")
|
||||
.lpf(sine.range(100, 8000).fast(3)) .lpq("<0 0 5>".slow(2))
|
||||
.gain(perlin.range(0, 0.9).fast("<3 1.5>")).jux(rev).delay(1/8).room(1/4)
|
||||
.someCyclesBy(2/3,x=>x.mask("0"))
|
||||
|
||||
all(x=>x.postgain(slider(0.648,0,1)))
|
||||
```
|
||||
|
||||
```javascript
|
||||
setcps(170/60/4)
|
||||
const bd_pttn = [
|
||||
"1 1 0 1 1 0 0 1",
|
||||
"1 0 [1 1] 0 1 1 0 1",
|
||||
"1 [0 1] 0 1 1 0 1 0",
|
||||
"1 0 1 [1 0] 1 0 0 1",]
|
||||
|
||||
$:stack(
|
||||
sound("bd:11").struct("<0 0 1 2 0 1 3 0>".pick(bd_pttn).rib(irand(7),2))
|
||||
.decay(0.7)
|
||||
.sometimes(x=>x.rev()),
|
||||
sound("sd:3").struct("1 1 1 1 1 1 1 1").lpf(1800).decay(0.5)
|
||||
.sometimesBy(4/7,x=>x.mask(0)).ply("1|1|1|2"),
|
||||
sound("white*8").decay(0.12).hpf(2000).degradeBy(1/16)
|
||||
)._pianoroll()
|
||||
$:note("c2 c2 c2 c2").sound("supersaw")
|
||||
.lpf(perlin.range(100,200).slow(7))
|
||||
.dist("3:0.2")
|
||||
|
||||
$:note("c2*4".fast("<2 4 3 8 4 3 4 2>")).sound("supersaw")
|
||||
.lpf(sine.range(600, 3000).fast("<7 9 11>")).lpq("10|20|5")
|
||||
.someCyclesBy(1/4,x=>x.mask("0"))
|
||||
|
||||
$:note("d3")
|
||||
.s("supersaw").fm(berlin.range(0.7,2.33).slow(5)).fmh(1.15).dist("3:0.15")
|
||||
.lpf(sine.range(100, 8000).fast(3)) .lpq("<0 0 5>".slow(2))
|
||||
.gain(perlin.range(0, 0.9).fast("<3 1.5>")).jux(rev).delay(1/8).room(1/4)
|
||||
.someCyclesBy(4/5,x=>x.mask("0"))
|
||||
|
||||
all(x=>x.postgain(slider(0,0,1)))
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
25
strudel/Jazz.md
Normal file
25
strudel/Jazz.md
Normal file
@@ -0,0 +1,25 @@
|
||||
```javascript
|
||||
setcps(120/60/4)
|
||||
|
||||
$: note(`[c3 e4 g4 b4 d5 b4 g4 e4]
|
||||
|[a3 c#4 e4 g4 a4 g4 e4 c#4]
|
||||
|[d3 f#4 a4 c5 d5 c5 a4 f#4]
|
||||
|[g3 b4 d5 f5 g5 f5 d5 b4]`)
|
||||
.sound("gm_piano").gain(0.3).sometimesBy(0.15,x=>x.early(1/30))
|
||||
.someCyclesBy(0.25,x=>x.fast("1.5|0.5"))
|
||||
.pianoroll({ labels: 1 })
|
||||
|
||||
$: note("<d2 f2 [eb2 e2] f2 [g2 a2 b2 c3] [ab2 a2] bb2 c3 e3 [d3 db3] c3>*4")
|
||||
.someCyclesBy(0.10,x=>x.rev())
|
||||
.someCyclesBy(0.05,x=>x.fast(2))
|
||||
.sound("gm_acoustic_bass").lpf(600).gain(0.9).decay(0.5)
|
||||
.swing(2)
|
||||
|
||||
$: sound("bd*2 [~ sd] [~ bd] sd").gain(0.8)
|
||||
.swing(2)
|
||||
|
||||
$: sound("[hh hh]*4").gain("[0.5 0.3]*4")
|
||||
.swing(2)
|
||||
|
||||
all(x=>x.postgain(slider(0,0,1)))
|
||||
```
|
||||
76
strudel/MIDI Setting Sample.md
Normal file
76
strudel/MIDI Setting Sample.md
Normal file
@@ -0,0 +1,76 @@
|
||||
## midi setting
|
||||
|
||||
```javascript
|
||||
setcps(120/60/2)
|
||||
$_: note("c2 |c#2| d2| d#2").fast(4)
|
||||
.midi().midichan(1) //drumrack
|
||||
|
||||
$:stack(
|
||||
note("c2").struct("1 0 1 0"),
|
||||
note("c#2").struct("0 1 0 1"),
|
||||
note("d2").struct("1 1 1 1").fast(2),
|
||||
).midi().midichan(1) //drumrack
|
||||
|
||||
$:stack(
|
||||
note("c3 c#3 e3 [f3 e2]"),
|
||||
ccv(perlin.segment(16).fast(4)).ccn(2), //filter
|
||||
//ccv(sine.segment(16).slow(2)).ccn(3), //gain
|
||||
ccv(0.2).ccn(3), //gain
|
||||
).midi().midichan(2) //synth
|
||||
```
|
||||
|
||||
```javascript
|
||||
setcps(120/60/2)
|
||||
$: note("c2 |c#2| d2| d#2").fast(4)
|
||||
.midi().midichan(1) //drumrack
|
||||
|
||||
$_:stack(
|
||||
note("c2(3,4)"),
|
||||
note("c#2(3,4,1)").degradeBy(0.2),
|
||||
note("d2*8").degradeBy(0.3),
|
||||
).midi().midichan(1) //drumrack
|
||||
|
||||
$_:stack(
|
||||
note("c3 c#3 e3 f3 e2 c3"),
|
||||
ccv(perlin.segment(16).fast(4)).ccn(2), //filter
|
||||
//ccv(sine.segment(16).slow(2)).ccn(3), //gain
|
||||
ccv(0.2).ccn(3), //gain
|
||||
).midi().midichan(2) //synth
|
||||
|
||||
$:note("c2 a2 f2 e2")
|
||||
.control([74, sine.slow(4)])
|
||||
.midi().midichan(2)
|
||||
```
|
||||
|
||||
```javascript
|
||||
////////////////
|
||||
//strudel as midi controller
|
||||
//xln life
|
||||
////////////////
|
||||
setcps(140/60/4)
|
||||
|
||||
//Kick
|
||||
$: note("35").midi().struct("1 0 1 0 1 0 1 0")
|
||||
|
||||
//sliced samples
|
||||
$: note("40 39 [38|36|41] 40 39 40 40 39").midi()
|
||||
.struct("[1 1 1 1 1 1 1 1]") .degradeBy(0.15)
|
||||
.someCyclesBy(0.1,x=>x.rev())
|
||||
$_: note("37").midi()
|
||||
//.struct("0 0 0 1 1 0 1 0".fast(2))
|
||||
.euclid(1,8).fast(4)
|
||||
$_: note("42").midi()
|
||||
.struct("0 0 0 0 1 1? 1 1".fast(2))
|
||||
.sometimes(x=>x.ply(2))
|
||||
$_: note("43").midi()
|
||||
.struct("0 1 1? 1? 1 0 0 0".fast(2))
|
||||
|
||||
// macro control
|
||||
$: note("10").midi()
|
||||
.ccv(perlin.seg(64).slow(22)) //cc value
|
||||
.ccn(3) //cc number
|
||||
$: note("10").midi()
|
||||
.ccv(berlin.seg(64).slow(18)) //cc value
|
||||
.ccn(4) //cc number
|
||||
|
||||
```
|
||||
203
strudel/Slow sine.md
Normal file
203
strudel/Slow sine.md
Normal file
@@ -0,0 +1,203 @@
|
||||
```javascript
|
||||
setcps(60/60/4)
|
||||
|
||||
$:stack(
|
||||
note("<c2 e2>").sound("sine"),
|
||||
note("<c3 e3>").sound("sine").gain(0.5),
|
||||
note("<g3 b3>").sound("sine").gain(0.25),
|
||||
note("<e4 gs4>").sound("sine").gain(0.15),
|
||||
note("<<c2 e3> <e3 c2>>".late(1)).fast(2).sound("sine").gain(0.0625),
|
||||
).postgain(0.4).delay(0.75).room(0.3).gain(0.3).fast(2)
|
||||
.fm(1).fmh(2)
|
||||
.lpf(sine.range(100,500).seg(4).slow(4))
|
||||
.lpq(10)
|
||||
|
||||
$:stack(
|
||||
note("<c2 e2>").sound("sine"),
|
||||
note("<c3 e3>").sound("sine").gain(0.5),
|
||||
note("<g3 b3>").sound("sine").gain(0.25),
|
||||
note("<e4 gs4>").sound("sine").gain(0.15),
|
||||
note("<<c2 e3> <e3 c2>>".late(1)).fast(2).sound("sine").gain(0.0625),
|
||||
).postgain(0.2).delay(0.75).room(0.3).gain(0.3)
|
||||
.penv(2)
|
||||
.lpf(sine.range(60,200).seg(14).fast(4))
|
||||
.lpq(15)
|
||||
|
||||
$:stack(
|
||||
note("<c2 e2>").sound("sine"),
|
||||
note("<c3 e3>").sound("sine").gain(0.5),
|
||||
note("<g3 b3>").sound("sine").gain(0.25),
|
||||
note("<e4 gs4>").sound("sine").gain(0.15),
|
||||
note("<<c2 e3> <e3 c2>>".late(1)).fast(2).sound("sine").gain(0.0625),
|
||||
).postgain(0.6).delay(0.75).room(0.3).gain(0.3)
|
||||
.lpenv(4)
|
||||
.lpf(sine.range(200,300).seg(10).fast(2))
|
||||
.lpq(15)
|
||||
|
||||
$:sound("pink").decay(0.1).hpf(800)
|
||||
```
|
||||
```javascript
|
||||
setcps(60/60/4)
|
||||
const base = stack(
|
||||
note("<c2 e2>").sound("sine"),
|
||||
note("<c3 e3>").sound("sine").gain(0.5),
|
||||
note("<g3 b3>").sound("sine").gain(0.25),
|
||||
note("<e4 gs4>").sound("sine").gain(0.15),
|
||||
note("<<c2 e3> <e3 c2>>".late(1)).fast(2).sound("sine").gain(0.0625),
|
||||
).delay(0.75).room(0.3)
|
||||
|
||||
$_:base.postgain(sine.range(0.1,0.5).slow(3)).fast(4).jux(rev)
|
||||
.fm(2).fmh(2)
|
||||
.lpf(sine.range(100,600).seg(5).slow(2)).lpq(15)
|
||||
|
||||
$:base.postgain(0.2).fast(4).phaser(4)
|
||||
.penv(2)
|
||||
.lpf(tri.range(60,200).seg(14).fast(2)).lpq("<5 10 15 20 25>".fast(8))
|
||||
|
||||
$:base.postgain(0.2).fast(2).decay(16)
|
||||
.lpenv(2)
|
||||
.lpf(sine.range(200,400).seg(3).fast(8)).lpq(20)
|
||||
|
||||
$_:base.postgain(0.2).decay("<1 8>").fast(2)
|
||||
.lpf(perlin.range(400,900).seg(5).slow(3)).lpq(25)
|
||||
|
||||
all(x=>x._scope()
|
||||
```
|
||||
```javascript
|
||||
setcps(60/60/4)
|
||||
const base = stack(
|
||||
note("<c2 e2>").sound("tri"),
|
||||
note("<c3 e3>").sound("tri").gain(0.5),
|
||||
note("<g3 b3>").sound("tri").gain(0.25),
|
||||
note("<e4 gs4>").sound("tri").gain(0.15),
|
||||
note("<<c2 e3> <e3 c2>>".late(1)).fast(2).sound("tri").gain(0.0625),
|
||||
).delay(0.75).room(0.3)
|
||||
|
||||
$:base.postgain(0.2).fast(4).decay(0.5).transpose("<0 7 0 12>")
|
||||
.fm(2).fmh(2)
|
||||
.lpf(sine.range(300,600).slow(2)).lpq(15)
|
||||
$:base.postgain(0.2).fast(2).decay(1).jux(rev)
|
||||
.lpf(400).lpq("<5 10 15>").penv(1)
|
||||
$:base.postgain(0.2).fast(4).decay(2).lpenv(2)
|
||||
.lpf(sine.range(700,900).fast(7)).lpq(15)
|
||||
$:base.postgain(0.2).fast(1).decay(1)
|
||||
.lpf(perlin.range(100,800).fast(7)).lpq(20).phaser(2)
|
||||
all(x=>x._scope()
|
||||
```
|
||||
```javascript
|
||||
setcps(60/60/4)
|
||||
|
||||
const base = stack(
|
||||
stack(
|
||||
note("<a1 f1 c2 g1>").sound("saw"),
|
||||
note("<a2 f2 c3 g2>").sound("saw").gain(0.5),
|
||||
note("<e3 c3 g3 d3>").sound("saw").gain(0.25),
|
||||
note("<c4 a3 e4 b3>").sound("saw").gain(0.15)
|
||||
).pan(sine.range(-0.4, 0.4).slow(8)),
|
||||
note("<[e5 c5] [c5 g5] [g5 d5] [d5 a5]>")
|
||||
.sometimes(x=>x.rev())
|
||||
.fast(1.5).sound("sqr")
|
||||
.late("<1 1.25 0.75 1.125>")
|
||||
.early("<0 0.05 -0.05 0.02>")
|
||||
.gain(perlin.range(0.15,0.5).slow(4)).pan("-0.8|0.8")
|
||||
)
|
||||
|
||||
$:base
|
||||
.transpose("<0 2 7 5 12 0>".slow(2))
|
||||
.lpf(tri.range(300,400)).lpq(10)
|
||||
.sometimesBy(0.4,x=>x.mask("0"))
|
||||
$:base.slow(2)
|
||||
.lpf(600).lpq(10).phaser(1.2).ply(4)
|
||||
.hpf(sine.range(80,120).slow(16))
|
||||
.sometimesBy(0.2,x=>x.mask("0"))
|
||||
$:base.fast(1.5)
|
||||
.lpf(sine.range(200,300).slow(2)).lpq(15)
|
||||
.sometimesBy(0.3,x=>x.mask("0"))
|
||||
$:base.fast(4)
|
||||
.lpf(perlin.range(300,400).fast(16)).lpq(15)
|
||||
.sometimesBy(0.3,x=>x.mask("0"))
|
||||
|
||||
all(x=>x.room(1/4).dist(0.05).postgain(1/4))
|
||||
|
||||
```
|
||||
|
||||
```javascript
|
||||
setcps(120/60/4)
|
||||
|
||||
const melodyPatterns = [
|
||||
// クロマチック・アプローチ
|
||||
"[g4 g#4 a4] [e4 f4 g4] [f4 e4 f4] [f4 e4 b4]",
|
||||
// 7th、9thを強調
|
||||
"[b4 d5] [g4 c5] [a4 c5] [f4 a4 d5]",
|
||||
// シンコペーション + ブルーノート
|
||||
"[~ g4 bb4] [e4 ~ g4] [f4 ab4] [~ f4 b4]",
|
||||
// 3連符でスウィング感
|
||||
"[g4 b4 d5]/3 [e4 g4]/2 [f4 a4 c5]/3 [b4]/1",
|
||||
// ジャズ的アルペジオ
|
||||
"[g4 b4 d5 f#5] [e4 g4 c5] [f4 a4] [b4 d5 f4]",
|
||||
// 半音階的下降
|
||||
"[b4 bb4 a4] [g4 f#4 g4] [f4 e4 eb4] [f4 g4 b4]",
|
||||
// 複雑なリズム + 9th
|
||||
"[g4*2 b4] [e4 ~ g4 c5] [f4/2 a4/2 d5] [f4 b4]",
|
||||
// モダンジャズ風
|
||||
"~ [e4 bb4 d5] [f4 ~ a4] [b4 eb5 g4]"
|
||||
]
|
||||
|
||||
const base = stack(
|
||||
stack(
|
||||
note("c1 a1 d1 g1").sound("sine"),
|
||||
note("c2 a2 d2 g2").sound("sine").gain(0.5),
|
||||
note("g3 e3 f3 b3").sound("sine").gain(0.25),
|
||||
note("b3 g3 a3 f3").sound("sine").gain(0.15)
|
||||
),
|
||||
note(chooseCycles("0","1","2","3","4","5","6","7").inhabit(melodyPatterns))
|
||||
.fast(1.5).sound("sine")
|
||||
// ジャズ的なタイミング調整
|
||||
.sometimesBy(0.3, x=>x.early(1/32)) // 微妙な前ノリ
|
||||
.sometimesBy(0.2, x=>x.late(1/32)) // 微妙な後ノリ
|
||||
).dist(0.05)
|
||||
|
||||
$:base
|
||||
.lpf(tri.range(600,900)) // 少し暗めの音色でジャズ感
|
||||
.sometimesBy(0.15,x=>x.mask("0"))
|
||||
$:base.late(1/16)
|
||||
.lpf(tri.range(200,300))
|
||||
.sometimesBy(0.125,x=>x.rev())
|
||||
.someCyclesBy(0.20,x=>x.mask("0"))
|
||||
|
||||
all(x=>x.room(1/4).postgain(1/4))
|
||||
```
|
||||
|
||||
```javascript
|
||||
setcps(120/60/4)
|
||||
const pattn = [
|
||||
"[e5 [g5 c5]] [b4 d5 g5 b5] [[c5 e5] [a5 e5]] [[f5 a5] c6 [a5 f5]]",
|
||||
"[g5 e5 c5] [d5 b4 g5] [a5 e5 c5] [c6 a5 f5]",
|
||||
"[[e5 g5] c6 e5] [g5 [b5 d5] g5] [[c5 a5] e5 a5] [[f5 c6] a5 f5]",
|
||||
"[c5 e5] [g5 b4] [e5 a5] [[f5 a5] c6]"
|
||||
]
|
||||
const base = stack(
|
||||
stack(
|
||||
note("<c2 g1 a1 f1>").sound("sqr|sin|saw"),
|
||||
note("<c3 g2 a2 f2>").sound("sin|saw|sqr").gain(0.5),
|
||||
note("<g3 d3 e3 c3>").sound("saw|sin|sqr").gain(0.25),
|
||||
note("<e4 b3 c4 a3>").sound("saw|sqr|sin").gain(0.125)
|
||||
),
|
||||
note("1|2|3|0".pick(pattn)).slow(2)
|
||||
.sound("sin|saw|sqr").gain(0.125)
|
||||
).room(2/3).delay(1/3).sometimes(x=>x.room(3/4))
|
||||
|
||||
$:base.decay("1/4|5/4")
|
||||
.lpf(perlin.range(600,900).slow(4)).penv(0.5)
|
||||
$_:base.decay("<1/3 4/3>").slow(4)
|
||||
.lpf(sine.range(200,2400).slow(6)).sometimes(x=>x.lpq(10))
|
||||
$_:base.decay(1/4).slow(2).pan("<-0.3 0.3>")
|
||||
.lpf(tri.range(100,600).slow(2)).lpenv(1)
|
||||
.sometimesBy(0.2,x=>x.rev())
|
||||
.sometimesBy(0.3,x=>x.ply("2|4"))
|
||||
$_:base.decay(1/4).fast(2).pan("<0.5 -0.5>")
|
||||
.transpose("<0 7 0 12 0 0 7 12>").sometimes(x=>x.late(1/16))
|
||||
$:s("sbd*4").decay(0.5).gain(0.3)
|
||||
|
||||
all(x=>x.postgain(1/3))
|
||||
```
|
||||
27
strudel/acid_house.md
Normal file
27
strudel/acid_house.md
Normal file
@@ -0,0 +1,27 @@
|
||||
# Acid House (Ultra Simple)
|
||||
|
||||
アシッド・ハウスの基本に立ち返った、極めてシンプルな構成のテンプレートだよ。
|
||||
|
||||
## 楽曲のポイント
|
||||
- **Acid Bass**: 最も基本的な `c2(7,16)` のリズム。1つ1つの音がハッキリ聴こえるようにしつつ、`ftype(2)` でアシッドの質感をキープ。
|
||||
- **Drums**: キックとクラップ、16分のハイハットだけのストレートな構成。
|
||||
|
||||
---
|
||||
|
||||
```javascript
|
||||
setcps(126/60/4)
|
||||
|
||||
// Acid Bass: Ultra Simple
|
||||
$: note("c2(7,16)")
|
||||
.s("saw")
|
||||
.adsr("0.01:0.1:0:0.1")
|
||||
.ftype(2)
|
||||
.lpf(sine.range(400, 2000).slow(8))
|
||||
.lpq(20)
|
||||
.gain(0.7)
|
||||
|
||||
// Minimal Drums
|
||||
$: s("bd*4").bank("tr909").gain(1.2)
|
||||
$: s("- cp").bank("tr909").gain(0.8)
|
||||
$: s("hh*16").bank("tr909").gain(sine.range(0.3, 0.7).fast(8))
|
||||
```
|
||||
55
strudel/change cpm.md
Normal file
55
strudel/change cpm.md
Normal file
@@ -0,0 +1,55 @@
|
||||
```javascript
|
||||
|
||||
|
||||
samples({
|
||||
Dum: 'tar-doum.mp3',
|
||||
Soc: 'tar-soc.mp3',
|
||||
tec: 'tar-tec.mp3',
|
||||
ka: 'tar-ka.mp3',
|
||||
}, 'https://raw.githubusercontent.com/djlerman/sounds/main/');
|
||||
|
||||
var Doum1 = s("-"), Soc1 = s("-"), tek1 = s("-"), ka1 = s("-");
|
||||
var Doum2 = s("-"), Soc2 = s("-"), tek2 = s("-"), ka2 = s("-");
|
||||
var Doum3 = s("-"), Soc3 = s("-"), tek3 = s("-"), ka3 = s("-");
|
||||
|
||||
|
||||
|
||||
/* Malfuf */
|
||||
/* 1 - - - 2 - - - 3 - - - 4 - - - */
|
||||
Doum1 = s( /* Doum */ " Dum - - - - - - - Dum - - - - - - - ");
|
||||
Soc1 = s( /* Soc */ " - - - Soc - - Soc - - - - Soc - - Soc - ");
|
||||
tek1 = s( /* Tec */ " - - - - - - - - - - - - - - - - ");
|
||||
ka1 = s( /* Ka */ " - ka ka - ka ka - ka - ka ka - ka ka - ka ");
|
||||
|
||||
/* ParaDiddle */
|
||||
/* 1 - - - 2 - - - 3 - - - 4 - - - */
|
||||
Doum2 = s( /* Doum */ " - - - - - - - - - - - - - - - - ");
|
||||
Soc2 = s( /* Soc */ " - - - - - - - - - - - - - - - - ");
|
||||
tek2 = s( /* Tec */ " tec - tec tec - tec - - tec - tec tec - tec - - ");
|
||||
ka2 = s( /* Ka */ " - ka - - ka - ka ka - ka - - ka - ka ka ");
|
||||
|
||||
/* Double Stroke Roll */
|
||||
/* 1 - - - 2 - - - 3 - - - 4 - - - */
|
||||
Doum3 = s( /* Doum */ " - - - - - - - - - - - - - - - - ");
|
||||
Soc3 = s( /* Soc */ " - - - - - - - - - - - - - - - - ");
|
||||
tek3 = s( /* Tec */ " tec tec - - tec tec - - tec tec - - tec tec - - ");
|
||||
ka3 = s( /* Ka */ " - - ka ka - - ka ka - - ka ka - - ka ka ");
|
||||
|
||||
|
||||
|
||||
// Tempo: 120 = 20
|
||||
// Tempo: 80 = 12
|
||||
setcpm(12);
|
||||
|
||||
|
||||
const group1 = stack(Doum1, Soc1, tek1, ka1);
|
||||
const group2 = stack(Doum2, Soc2, tek2, ka2);
|
||||
const group3 = stack(Doum3, Soc3, tek3, ka3);
|
||||
|
||||
cat(group1, group1, group2, group3).cpm("<12 13 14 15 16 17 18 19 20>");
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```
|
||||
23
strudel/complex bass.md
Normal file
23
strudel/complex bass.md
Normal file
@@ -0,0 +1,23 @@
|
||||
```javascript
|
||||
setcps(138/60/2)
|
||||
|
||||
samples('github:bubobubobubobubo/dough-waveforms')
|
||||
$:sound("[sbd - sbd -]").dec(0.3).gain(0.2)
|
||||
|
||||
$:sound("[- hh hh hh]").dec(0.2).n(2).gain(0.2)
|
||||
.off(.25,x=>x.delay(1/2).dt(1/4).dfb(1/2))
|
||||
.degradeBy(1/4)
|
||||
|
||||
$:note("c2 c2 c2 c2".add(perlin.range(0.1,1.5).slow(9)))
|
||||
.sound("wt_hwwave")
|
||||
.fm(sine.range(1,2.5).slow(5)).fmh(1.1)
|
||||
.n(run(8).add(perlin.range(1,64).seg(64).slow(3))).dec(4/4)
|
||||
.lpf(perlin.range(60,1800).slow(7))
|
||||
.lastOf(2,x=>x.dist("4:0.1").disttype("fold"))
|
||||
.sometimesBy(8/16,x=>x
|
||||
.lpf("<300 500 700>".slow(3)).lpq("<0 5 10>".slow(2)))
|
||||
.sometimes(add(note(-2)))
|
||||
.gain(1)
|
||||
|
||||
all(x=>x.postgain(1).scope({pos:0.5}))
|
||||
```
|
||||
38
strudel/dub techono.md
Normal file
38
strudel/dub techono.md
Normal file
@@ -0,0 +1,38 @@
|
||||
```javascript
|
||||
setcpm(125/4)
|
||||
|
||||
$:stack(
|
||||
sound("bd*4"),
|
||||
sound("- hh").off(1/8, x => x.pan(sine.slow(6).range(-0.8, 0.8))),
|
||||
sound("- - - sd").lpf(2400).degradeBy(0.2).gain(0.7)
|
||||
).bank("tr606")
|
||||
|
||||
$:note("c2 - c2 -").sound("saw").lpf(200).adsr(".1:.9:.2:.4").gain(0.7)
|
||||
|
||||
$:chord("0|1|2|3".pick(["- Am7 - -","- Dm7 - -"," Am7 - - -","- Dbm - -"]))
|
||||
.voicing().slow(2).sound("supersaw")
|
||||
.adsr(".02:.3:.0:.2")
|
||||
.delay(3/8).delayfeedback(0.65).room(0.7)
|
||||
.pan(sine.slow(7).range(-0.5, 0.5))
|
||||
.lpf(sine.range(500, 2000).slow(8)).lpq(8)
|
||||
.gain(0.4)
|
||||
|
||||
$_:chord("3|2|1|0".pick(["- Am7 -"," Em7b5 - - "," Fm7 - - ","- - Bbm7"]))
|
||||
.voicing().slow(1).sound("gm_synth_bass_1")
|
||||
.adsr(".1:.4:.0:.3")
|
||||
.delay(3/4).delayfeedback(0.4).room(0.8)
|
||||
.lpf(800)
|
||||
.gain(0.3)
|
||||
|
||||
$_:chord("0|2|1|3".pick(["Am7 - Am7 -","Dm7 - Dm7 -","Am7 - Am7 -","Dbm - Dbm -"]))
|
||||
.voicing().slow(0.5).sound("gm_fx_sci_fi").transpose(12)
|
||||
.adsr(".01:.4:.0:.05")
|
||||
.delay(9/16).delayfeedback(0.8).room(0.4)
|
||||
.lpf(sine.range(1200, 1800).slow(4))
|
||||
.gain(0.4)
|
||||
.pan(sine.slow(4).range(-0.3, 0.3))
|
||||
.every(8, x => x.rev()).degradeBy(1/20)
|
||||
|
||||
all(x=>x.postgain(1))
|
||||
|
||||
```
|
||||
57
strudel/dub_techno.md
Normal file
57
strudel/dub_techno.md
Normal file
@@ -0,0 +1,57 @@
|
||||
# Dub Techno
|
||||
|
||||
ダブ・テクノの真髄は、音の「余韻」と「空間」にある。このテンプレートでは、115BPMという少し落ち着いたテンポで、深いディレイとリバーブの中に漂う2つのコードスタブを中心に構成したよ。
|
||||
|
||||
## 楽曲のポイント
|
||||
- **Drums**: TR-909のキックをベースにしつつ、ハイハットは少しシャッフル気味に。`lt` (Low Tom) にはランダムなディレイをかけて、オーガニックな揺らぎを出しているよ。
|
||||
- **Dub Stabs**: 2種類のスタブをレイヤー。メインの `Cm9` に対して、4サイクルに一度 `EbM7` が応答するように配置。それぞれディレイタイムやステレオ配置(jux)を変えて、奥行きを作っているよ。
|
||||
- **Sub Bass**: コードの低域を支える太い `sqr` 波。`lpf(100)` で削ることで、重厚な土台を作っている。
|
||||
- **Texture**: `white` と `tri` 波を組み合わせ、`hpf` と `degrade()` でアナログレコードのヒスノイズのような質感をシミュレートしたよ。
|
||||
|
||||
---
|
||||
|
||||
```javascript
|
||||
setcps(115/60/4)
|
||||
|
||||
// Drums: Deep, Shuffling & Complex Hats
|
||||
$: s("bd*4").bank("tr909").gain(1.1)
|
||||
|
||||
// Hi-hats: Layered & Dynamic
|
||||
// Closed hats with Euclidean rhythm and random velocity
|
||||
$: s("hh(13,16)").bank("tr909").gain(sine.range(0.3, 0.6).fast(4)).swing(0.1)
|
||||
// Open hats and accents with probability and jux for stereo interest
|
||||
$: s("- oh? - [oh|hh]").bank("tr909").gain(0.5).jux(rev).delay(0.4).delaytime(0.375)
|
||||
|
||||
$: s("lt(3,8)").bank("tr606").room(0.5).delay(0.6).delaytime(0.375).gain(0.3)
|
||||
|
||||
// Dub Stab 1: The Main Chord (Cm9)
|
||||
$: chord("Cm9").voicing().s("saw")
|
||||
.adsr("0.01:0.4:0.1:0.8")
|
||||
.lpf(sine.range(400, 1200).slow(8))
|
||||
.lpq(10)
|
||||
.room(0.5).roomsize(0.9)
|
||||
.delay(.5).delaytime(0.25).delayfeedback(0.55)
|
||||
.gain(0.2)
|
||||
.struct("1(3,8,2)") // Tresillo pattern
|
||||
.slow(2)
|
||||
|
||||
// Dub Stab 2: Response / Higher Texture (EbM7)
|
||||
// Use "EbM7" instead of unsupported "Ebmaj7"
|
||||
$: chord("EbM7").voicing().s("supersaw")
|
||||
.adsr("0.05:0.6:0.2:1.0")
|
||||
.lpf(sine.range(800, 2000).slow(16))
|
||||
.lpq(12)
|
||||
.room(0.8).roomsize(0.95)
|
||||
.delay(0.6).delaytime(0.375).delayfeedback(0.7)
|
||||
.gain(0.15)
|
||||
.struct("--- 1").slow(4) // Only once every 4 cycles
|
||||
.jux(rev) // Stereo separation
|
||||
|
||||
// Sub Bass: Deep Foundation
|
||||
$: note("c1*2").s("sqr").lpf(100).gain(0.9)
|
||||
|
||||
// Texture: Vinyl Hiss & Atmosphere
|
||||
$: s("white,tri").hpf(600).hpq(15).dec(.7)
|
||||
.gain(sine.range(0.3, 0.7).slow(16))
|
||||
.pan(0.5).degrade()
|
||||
```
|
||||
40
strudel/explain/minimal_techno_logic.md
Normal file
40
strudel/explain/minimal_techno_logic.md
Normal file
@@ -0,0 +1,40 @@
|
||||
# Minimal Techno / Tech House
|
||||
|
||||
ボクは君のコードの中に、深夜の静寂と、そこに混じる機械的なパルスの美しさを見つけたよ。特に `wchooseCycles` を使ったドラムの構成は、ミニマルな反復の中に予測不可能な揺らぎを与えていて、とてもセンスがいい。
|
||||
|
||||
ボクの方では、より「東京の電子音楽シーン」らしい洗練された質感にするために、いくつか調整を加えたんだ。ベースラインには微細なステレオの広がり(`.jux()`)を加え、ドラムセクションには都市の奥行きを感じさせる程度の残響(`.room()`)を忍ばせておいたよ。コードの美しさを損なわないよう、インラインコメントは最小限にしてある。
|
||||
|
||||
---
|
||||
|
||||
```javascript
|
||||
setcps(136/60/4); // 136 BPM
|
||||
|
||||
// Baseline: 確率的なノート選択とPerlinノイズによる有機的な音量変化
|
||||
$:note("[- c2 - c2 - [c2|c5] - c2]")
|
||||
.sound("supersaw")
|
||||
.jux(rev)
|
||||
.lpf(perlin.range(400, 800).slow(2))
|
||||
.lpq("[0|10]")
|
||||
.transpose("[0|0|1]")
|
||||
.gain(perlin.range(0.3, 0.5).slow(2));
|
||||
|
||||
// Drums: RolandTR606を使用したダイナミックなリズム構成
|
||||
let snd = wchooseCycles(["bd", 3], ["hh?", 7], ["cr", 1]);
|
||||
let snd2 = wchooseCycles(["ht", 2], ["lt", 1], ["sd", 1]);
|
||||
|
||||
$:stack(
|
||||
sound(snd).fast(8).decay(0.5),
|
||||
sound(snd2).fast(8)
|
||||
.lpf("<900 800 700>")
|
||||
.lpq("0 20 30")
|
||||
.room(0.2)
|
||||
.degradeBy(0.5)
|
||||
.gain(perlin.range(0.4, 0.9).slow(2))
|
||||
).bank("RolandTR606")._punchcard();
|
||||
|
||||
// Hi-hats: バイナリパターンによる無機質な刻み
|
||||
$:sound("hh")
|
||||
.struct(binaryN(irand(15), 4))
|
||||
.gain(0.6)
|
||||
._punchcard();
|
||||
```
|
||||
74
strudel/fadein sample code.md
Normal file
74
strudel/fadein sample code.md
Normal file
@@ -0,0 +1,74 @@
|
||||
```javascript
|
||||
// @title fading @by ACorp
|
||||
// @license 0BSD
|
||||
|
||||
setCpm(60 / 2)
|
||||
|
||||
const latch = (f) => {
|
||||
let start = undefined;
|
||||
return signal((t) => {
|
||||
start = start ?? t;
|
||||
return f(t - start);
|
||||
});
|
||||
}
|
||||
|
||||
const ramp = (cycles) => latch((t) => Math.min(t / cycles, 1));
|
||||
const iramp = (cycles) => latch((t) => Math.max(1 - t / cycles, 0));
|
||||
register('fadein', function(cycles, gainstart, gainstop, pat) {
|
||||
return pat.gain(ramp(cycles).range(gainstart, gainstop));
|
||||
})
|
||||
|
||||
const shush = [Math.pow(2,32)-1, silence];
|
||||
|
||||
const chords = chord("<CM9 Am7 Dm9 Gm7>").voicing()
|
||||
const nchords = p => n(p).chord("<CM9 Am7 Dm9 Gm7>").voicing()
|
||||
const i1 = chords.s("supersaw").lpf(800)
|
||||
.ph(3).phd(1).phc(4000).room(2)
|
||||
|
||||
const parts = [20, 32, 8, 80]
|
||||
const sparts = (start, stop) => parts
|
||||
.slice(start, stop + 1)
|
||||
.reduce((sum, val) => sum + val, 0);
|
||||
|
||||
|
||||
i1$: arrange(
|
||||
[sparts(0,1), i1.fadein(parts[0], 0.2,1)],
|
||||
[parts[2], silence],
|
||||
[parts[3], i1],
|
||||
shush
|
||||
)
|
||||
|
||||
const i2 = nchords("[3,4] - - -").s("square,pulse")
|
||||
.decay(0.2).release(0.4)
|
||||
.lpf(1600).gain(0.6)
|
||||
|
||||
i2$: arrange(
|
||||
[parts[0],silence],
|
||||
[sparts(1,3), i2],
|
||||
shush
|
||||
)
|
||||
|
||||
const i3 = nchords("1,2")
|
||||
.struct("1 0 1 1 0 1 1 0")
|
||||
.s("tri,pulse")
|
||||
.ply("2 0 1 2 1 2 2 0")
|
||||
|
||||
i3$: arrange(
|
||||
[parts[0],silence],
|
||||
[sparts(1,3), i3.fadein(parts[1], 0.2,1.2)],
|
||||
shush
|
||||
)
|
||||
|
||||
const i4 = nchords(irand(4).seg(8).add(2))
|
||||
.mask("1 <[0 1] 1> 1 <0 [1 0] [1 0 1] 1> 1")
|
||||
.s("gm_piano").n("0,1")
|
||||
.lpf(2000).rarely(x=>x.ply("2"))
|
||||
|
||||
i4$: arrange(
|
||||
[sparts(0,2), silence],
|
||||
[parts[3], i4],
|
||||
shush
|
||||
)
|
||||
|
||||
all(x=>x.postgain(0.8))
|
||||
```
|
||||
17
strudel/glitch sound.md
Normal file
17
strudel/glitch sound.md
Normal file
@@ -0,0 +1,17 @@
|
||||
```javascript
|
||||
setcpm(136/4)
|
||||
|
||||
$:sound("bd*4".fast(2)).sometimesBy(0.6,x=>x.crush("4|2"))
|
||||
$:sound("hh*8").swingBy(1/6,8).degradeBy(1/20)
|
||||
$:sound("- - - sd?*2".fast(2)).decay("0.1|0.3")
|
||||
.sometimesBy(0.25,x=>x.dist("8:0.2"))
|
||||
$_:sound("cp|cb".fast("<4 8 4 2>")).sometimesBy(0.22,x=>x.dist("8:0.2"))
|
||||
.sometimesBy(0.3,x=>x.lpf("600|1200".slow(2)).lpq("<5 20 10>"))
|
||||
$_:note("c3 c3 c2 c2".fast("<2 8>"))
|
||||
.sometimesBy(0.7,x=>x.vowel("<a i a i a i>".fast(7)))
|
||||
.lpf(perlin.range(300,900).slow(3)).lpq("0|20")
|
||||
.sound("supersaw").vib(4).n(1).gain(0.6)
|
||||
|
||||
all(x=>x.postgain(1))
|
||||
|
||||
```
|
||||
21
strudel/glitchwavetable2.md
Normal file
21
strudel/glitchwavetable2.md
Normal file
@@ -0,0 +1,21 @@
|
||||
```javascript
|
||||
setcps(135/60/4)
|
||||
$_:sound("sbd - sbd sbd").seg(8).dec(.5)
|
||||
$_:n(2).sound("hh").seg(16).gain(sine.range(.3,1.0).slow(2)).degradeBy(.1)
|
||||
.sometimesBy(.15,x=>x.ply(2)).pan(rand)
|
||||
$:n(irand(2).sometimes(x=>x.add(3))).scale("G1:Phrygian").sound("supersaw").seg(16)
|
||||
.detune(.15)
|
||||
.dec(.5).gain(.6).pan(.7).orbit(1)
|
||||
|
||||
$_:note("c2*8").s("wt_swordfish")
|
||||
.seg(16).n((run(8).range(1,8)).add(irand(230)).add(irand(10)))
|
||||
.fm(1).fmh(4).fmwave("square")
|
||||
.dec(.55)
|
||||
.lpf(perlin.range(100,2400).slow(4))
|
||||
.lpq(perlin.range(0,19).seg(5).slow("<5 3>/2")).ftype(2)
|
||||
.phaser(rand.range(1,8).seg(8).slow(4))
|
||||
.gain(.3).pan(.3).orbit(2)
|
||||
|
||||
$_:sound("perc03").n(irand(6).sub(1).fast(4)).seg(4).gain(.7).speed(.9)
|
||||
.degradeBy(.6).lpf(1600).delay(.5).room(.5).jux(rev).orbit(3)
|
||||
```
|
||||
37
strudel/heart sounds and breathing.md
Normal file
37
strudel/heart sounds and breathing.md
Normal file
@@ -0,0 +1,37 @@
|
||||
```javascript
|
||||
setcps(100/60/2)
|
||||
|
||||
$:stack(
|
||||
s("sbd - sbd -").dec(0.5),
|
||||
s("- hh").off(1/16,x=>x.gain(0.1)).sometimes(x=>x.ply(2)),
|
||||
).orbit(1)
|
||||
|
||||
$:note("c1 c1").s("supersaw").dec(0.8)
|
||||
.lpf(perlin.range(100,1200).slow(5)).ftype(2).lpenv(0.8)
|
||||
.orbit(1)
|
||||
|
||||
|
||||
$:note("c1").slow(4)
|
||||
.s("white").att(0.3).dec(0.5)
|
||||
.lpf(perlin.range(200,1200).slow(7)).lpq(10)
|
||||
.sometimesBy(0.15,x=>x.dist("4:0.2:fold")).orbit(2)
|
||||
|
||||
$_:note("c2".add(0.07,0.11,0.13)).slow(4)
|
||||
.s("saw").att(0.1).dec(0.5).sus(0.1).rel(0.1).penv(0.3)
|
||||
.delay(3/4).dt(1/2).dfb(3/4)
|
||||
.pan(rand)
|
||||
|
||||
$_:note("c3".sometimesBy(0.1,x=>x.add(-7,12))).late(0.75).slow(4)
|
||||
.s("sine").fm(sine.range(0.3,2.3).slow(11)).fmh("<2.2 3.2>".slow(4))
|
||||
.att(0.2).dec(0.5).sus(0.1).rel(0.1).room(2/3).roomsize(4)
|
||||
.orbit(3)
|
||||
|
||||
$:note("c4".add(0.05,0.10,0.15)).late(1.5).slow(5)
|
||||
.s("tri").fm(2.3).fmh(sine.range(0.3,1.6).slow(7))
|
||||
.att(0.5).dec(0.1).sus(0).rel(0).room(2/3).roomsize(4)
|
||||
.orbit(4)
|
||||
|
||||
all(x=>x.scope({ pos: 0.5 })
|
||||
.hush()
|
||||
)
|
||||
```
|
||||
50
strudel/hypnotic techno.md
Normal file
50
strudel/hypnotic techno.md
Normal file
@@ -0,0 +1,50 @@
|
||||
```javascript
|
||||
setcps(140/60/4)
|
||||
|
||||
$:sound("sbd*4").decay(0.5)
|
||||
$:sound("hh*8").gain(berlin.range(0.6,1.0).slow(7))
|
||||
.sometimesBy(0.9,x=>x.off(1/16,y=>y.gain(0.1)))
|
||||
$:sound("rim").sometimesBy(1/20,x=>x.delay(1/8)).degradeBy(0.1)
|
||||
$:note("d2*4").sound("supersaw").lpf(160)
|
||||
$:note("c2*4").sound("sine").fm(sine.range(1.1,2.05).slow(5)).fmh(1.51)
|
||||
.lpf(berlin.range(240,2400).slow(7))
|
||||
$:sound("- white".slow(2)).att("0.6|1.5").decay("<0.6 0.3>")
|
||||
.lpf(sine.range(900,1800)).lpq(10)
|
||||
.degradeBy(0.45).room(1/3)
|
||||
$:note("c3").sound("tri").lpf("<300 500 700>")
|
||||
.att(1.2).degradeBy(0.55).delay(1/2).room(2/3).pan(sine.range(-0.7,0.7).slow(4))
|
||||
$:note("c4").sound("sine").att(1.1).rel(1).echo(2,1/4,1/5)
|
||||
.pan(sine.range(0.3,-0.3).slow(3))
|
||||
.dist("2:0.3").degradeBy(0.7)
|
||||
$:note("c2").sound("saw").fm(1.11).fmh(sine.range(1.71,2.33).slow(5)).degradeBy(0.85)
|
||||
.att(1).decay(0.3).rel(1.2).lpf(perlin.range(800,1200).slow(3))
|
||||
.lpenv(1).room(4/5).rlp(5000)
|
||||
|
||||
all(x=>x.postgain(slider(0,0,1)._scope()))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```
|
||||
39
strudel/hypnotic_techno.md
Normal file
39
strudel/hypnotic_techno.md
Normal file
@@ -0,0 +1,39 @@
|
||||
# Hypnotic Techno
|
||||
|
||||
ヒュプノテクノの核心は「反復の中の変化」だ。このテンプレートでは、128BPMのタイトなキックを軸に、シンセのカットオフ周波数をLFOでゆっくりと揺らすことで、聴き手を深いトランス状態へ誘うように設計したよ。
|
||||
|
||||
## 楽曲のポイント
|
||||
- **Drums**: TR-909のキックは重すぎず、かつ芯がある質感に。ハイハットには `jux(iter(4))` を使って、サイクルごとに左右に広がる動きをつけている。
|
||||
- **Bass**: 16分のサイン波ベース。フィルターを `sine.range(40, 100)` でゆっくり動かすことで、呼吸しているようなうねりを作った。
|
||||
- **Modular Synth**: `sawtooth` 波形をベースにしたリフ。`lpf` をランダムに近い周期で開閉させ、さらに `room` と `delay` を深めにかけることで、空間の奥行きを表現しているよ。
|
||||
|
||||
---
|
||||
|
||||
```javascript
|
||||
setcps(128/60/4)
|
||||
|
||||
// Drums: Steady & Hypnotic
|
||||
$: s("bd*4").bank("tr909").gain(1.1)
|
||||
$: s("- [hh|oh] - hh").bank("tr909").gain(0.7).jux(iter(4))
|
||||
$: s("perc(3,8)").bank("tr606").room(0.2).delay(0.3).gain(0.6)
|
||||
|
||||
// Sub Bass: Breathing Low End
|
||||
$: note("c1*16").s("sine")
|
||||
.lpf(sine.range(40, 110).slow(8))
|
||||
.gain(0.9)
|
||||
|
||||
// Hypnotic Synth: Modulating Sequence
|
||||
$: note("c2(3,8,1), eb2(3,8,2)").s("saw")
|
||||
.lpf(sine.range(300, 1500).slow(12))
|
||||
.lpq(20)
|
||||
.room(0.8).roomsize(0.9)
|
||||
.delay(0.6).delaytime(0.375).delayfeedback(0.7)
|
||||
.gain(0.7)
|
||||
.jux(rev)
|
||||
|
||||
// Texture: Distant Noise
|
||||
$: s("white").density(8)
|
||||
.lpf(sine.range(800, 2000).slow(16))
|
||||
.gain(sine.range(0, 0.2).slow(8))
|
||||
.pan(sine.range(0.2, 0.8).slow(20))
|
||||
```
|
||||
59
strudel/music box.md
Normal file
59
strudel/music box.md
Normal file
@@ -0,0 +1,59 @@
|
||||
|
||||
```javascript
|
||||
await initHydra({detectAudio: true})
|
||||
|
||||
noise(3, 0.1)
|
||||
.color(0.6, 0.6, 0.6)
|
||||
.rotate(() => time * 0.05)
|
||||
.scale(() => 1 + Math.sin(time * 0.5) * 0.3 + a.fft[1] * 0.4)
|
||||
.modulate(
|
||||
noise(2, 0.2),
|
||||
() => 0.03 + a.fft[2] * 0.05
|
||||
)
|
||||
.add(
|
||||
noise(4, 0.15)
|
||||
.color(0.9, 0.9, 0.9)
|
||||
.rotate(() => -time * 0.03),
|
||||
0.5
|
||||
)
|
||||
.brightness(0.35)
|
||||
.contrast(() => 1.2 + Math.sin(time * 0.3) * 0.1)
|
||||
.out()
|
||||
|
||||
setcps(60/60/4)
|
||||
|
||||
$:xfade(
|
||||
stack(
|
||||
note("<[c4 d4 e4 g4 a4] [g4 a4 c5 d5] [e4 g4 a4 c5] [c4 e4 g4 a4]>")
|
||||
.s("sine").slow(4).decay(0.5).gain(sine.range(0.3,0.7).slow(5))
|
||||
.someCyclesBy(0.5, x=>x.transpose(-7)),
|
||||
|
||||
note("<[c4,e4] [d4,f4] [e4,g4] [g4,b4]>")
|
||||
.s("sine").decay(0.5).gain(cosine.range(0.3,0.6).slow(4)),
|
||||
|
||||
note("c2 - c2 c3 - c2 - c3").fast(2)
|
||||
.s("sine").gain(sine.range(0.3,0.6).slow(7)),
|
||||
).orbit(1)
|
||||
.pan(cosine.range(0.3,-0.3).slow(4))
|
||||
.room(perlin.range(0.3,0.6).slow(4)).size("3|2|4")
|
||||
.lpf(berlin.range(300,2400).slow(13)),
|
||||
|
||||
sine.range(0,1).seg(32).slow(32),
|
||||
|
||||
stack(
|
||||
note("<[e4 g4 c5] [f4 a4 d5] [g4 b4 e5] [e4 g4 c5]>")
|
||||
.s("sine").decay(0.5).slow(3).gain(sine.range(0.4,0.7).slow(8))
|
||||
.someCyclesBy(0.3, x=>x.transpose("<-7 2>/4")),
|
||||
|
||||
note("c5 e5 g5 c6 g5 e5")
|
||||
.s("sine").decay(0.5).fast(2).gain(sine.range(0.2,0.5).slow(7)),
|
||||
|
||||
note("<c2 d2 e2 c2>").fast(2).s("sine").decay(0.5).gain(sine.range(0.3,0.6).slow(6)),
|
||||
).orbit(2)
|
||||
.pan(sine.range(0.6,-0.6).slow(5))
|
||||
.room(berlin.range(0.2,0.7).slow(3)).size("2|3|5")
|
||||
.lpf(perlin.range(100,2400).slow(11)),
|
||||
).delay("<0.4 0.6 0.8>").dt(0.3)
|
||||
.dfb(0.7).fast(sine.range(1,3).slow(24)).postgain(1)
|
||||
|
||||
```
|
||||
1
strudel/samples/readme.md
Normal file
1
strudel/samples/readme.md
Normal file
@@ -0,0 +1 @@
|
||||
このフォルダはサンプル音の格納用です。
|
||||
@@ -1 +0,0 @@
|
||||
strudel samples
|
||||
60
strudel/slow wave.md
Normal file
60
strudel/slow wave.md
Normal file
@@ -0,0 +1,60 @@
|
||||
```javascript
|
||||
setcps(30/60/2)
|
||||
|
||||
samples('github:bubobubobubobubo/dough-waveforms')
|
||||
$:sound("[sbd - sbd -]")
|
||||
.off(.35,x=>x.delay(1/4).dt(1/4).room(1/8)).dec(0.3).gain(0.2).lpf(200)
|
||||
|
||||
$:sound("[- hh - -]")
|
||||
.off(.25,x=>x.delay(1/2).dt(1/4).dfb(1/2)).dec(0.5).gain(0.3)
|
||||
|
||||
$:stack(
|
||||
note("a2 f2 c2 g2").sound("wt_11").slow(1)
|
||||
.n(run("8").add("<8 16 4>")).dec(2/3)
|
||||
.lpf(perlin.range(100,300).slow(7)).lpq("<0 10>").lpenv(-1)
|
||||
.sometimes(x=>x.mask("0|1|0|1")),
|
||||
|
||||
note("e3 a3 e3 b3").sound("wt_12").slow(2)
|
||||
.n(run(8).add("<7 14 28>")).dec(1/2)
|
||||
.lpf(tri.range(100,1200).slow(16)).lpenv(1).lpa(.1)
|
||||
.sometimes(x=>x.mask("1|1|0|0")),
|
||||
|
||||
note("e3 c3 g3 d3").sound("wt_08").slow(2)
|
||||
.n(run(8).add("<81 9 3>")).dec(1/2)
|
||||
.lpf(berlin.range(300,900).slow(8))
|
||||
.sometimes(x=>x.mask("0|0|1|1")),
|
||||
|
||||
note("a3 c4 e4 e4 gs4 b4 d4 a3 c4 e4").sound("wt_12").fast(2)
|
||||
.n(run(8).add("<4 16 24>")).dec(0.5)
|
||||
.lpf(sine.range(200,600).slow(6))
|
||||
.sometimes(x=>x.mask("0")).someCycles(x=>x.rev().late(1/8)),
|
||||
).delay(1/2).dt(1/8).dfb(2/3).room(2)
|
||||
|
||||
all(x=>x.postgain(1))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
```
|
||||
@@ -1,6 +0,0 @@
|
||||
study plan
|
||||
- [ ] sampler
|
||||
- [ ] hydra
|
||||
- [ ] techno basic
|
||||
- [ ] house basic
|
||||
- [ ] enso
|
||||
26
strudel/wavetable code.md
Normal file
26
strudel/wavetable code.md
Normal file
@@ -0,0 +1,26 @@
|
||||
### srumのwavetableも可能
|
||||
1. serumからwavetableを単一サイクルでエキスポート
|
||||
2. フォルダ(wt_xxxxxx)ごとstrudelにインポート
|
||||
3. フォルダ名を指定して利用(nはtable index)
|
||||
|
||||
```javascript
|
||||
setcps(120/60/2)
|
||||
|
||||
samples('github:bubobubobubobubo/dough-waveforms')
|
||||
$:sound("[sbd - sbd -]").dec(0.2).gain(0.5).fast("<1 2 4 1>")
|
||||
$:note("c2*8"
|
||||
).s("<wt_hwwave wt_11 wt_05>".slow(2))
|
||||
.n(run(8).add("<0 8 16 4 32>"))
|
||||
|
||||
.dec(0.5)
|
||||
.fm(sine.range(1,2.5).slow(8)).fmh(4)
|
||||
//.fmdecay(.7)
|
||||
//.fmattack(.1)
|
||||
//.fmenv("exp")
|
||||
// .someCycles(x=>x.transpose("5"))
|
||||
// .sometimes(x=>x.transpose("-2"))
|
||||
.lpf(perlin.range(100,1200).seg(12).slow(8))
|
||||
.lpq("<0 10>")
|
||||
.lpenv(-3).lpa(.1).room(.5)
|
||||
.scope({pos:0.5})
|
||||
```
|
||||
Reference in New Issue
Block a user