Compare commits

..

95 Commits

Author SHA1 Message Date
HarakaraSite
6cd3fc6ed9 20260228v3 2026-02-28 14:23:11 +09:00
HarakaraSite
597f405ee7 20260228v2 2026-02-28 14:19:45 +09:00
HarakaraSite
be0f08329b 20260228 2026-02-28 14:09:08 +09:00
HarakaraSite
146b0f3dc3 Merge remote-tracking branch 'origin/main' 2026-02-24 14:29:39 +09:00
1378c9991c strudel/2026219.md を削除 2026-02-24 04:59:24 +00:00
7287371a56 strudel/20260219.md を追加 2026-02-24 04:58:44 +00:00
35f319efde strudel/2026219.md を追加 2026-02-19 06:56:28 +00:00
HarakaraSite
d8b3b8b240 commit 24 2026-02-17 19:31:42 +09:00
HarakaraSite
0ff9596e97 commit 23 2026-02-17 19:22:43 +09:00
bb1c71d1df strudel/20260216.md を追加 2026-02-17 08:21:33 +00:00
HarakaraSite
85b0d04566 docs: update README.md for skill-based workflow 2026-02-16 18:11:05 +09:00
HarakaraSite
bf36770e25 commit 22 2026-02-15 22:18:27 +09:00
HarakaraSite
874dd7fb1b commit 21 2026-02-15 21:35:34 +09:00
HarakaraSite
cafdaed75a commit 20 2026-02-15 21:32:46 +09:00
HarakaraSite
38a48d70d1 commit 19 2026-02-15 18:32:45 +09:00
HarakaraSite
5ea13dad80 commit 18 2026-02-15 18:30:04 +09:00
HarakaraSite
836086b358 commit 17 2026-02-12 20:36:22 +09:00
HarakaraSite
bf2266f250 commit 16 2026-02-12 20:35:06 +09:00
HarakaraSite
3df997c28f commit 15 2026-02-12 20:13:41 +09:00
HarakaraSite
cba89b4c67 commit 14 2026-02-12 19:38:53 +09:00
HarakaraSite
b8500e62b4 commit 13 2026-02-12 19:01:26 +09:00
HarakaraSite
269ec70343 commit 12 2026-02-12 18:05:19 +09:00
HarakaraSite
74f37c8df9 commit 11 2026-02-12 01:01:16 +09:00
HarakaraSite
eda5bd916d commit 10 2026-02-12 00:17:42 +09:00
HarakaraSite
4265769d90 commit 9 2026-02-11 23:03:35 +09:00
HarakaraSite
1541f04390 commit 8 2026-02-11 22:15:18 +09:00
HarakaraSite
0213e23c87 commit 7 2026-02-11 22:11:14 +09:00
HarakaraSite
b9033090c3 commit 6 2026-02-11 22:00:59 +09:00
HarakaraSite
194eb292da commit 5 2026-02-11 21:55:34 +09:00
HarakaraSite
7f27264673 3rd commit 2026-02-11 21:32:22 +09:00
HarakaraSite
0be0a702c9 3rd commit 2026-02-11 21:26:03 +09:00
HarakaraSite
c08ce0cee4 2nd commit 2026-02-11 20:49:25 +09:00
HarakaraSite
6e59b7a84a change commit 2026-02-11 20:44:30 +09:00
01536b5095 strudel/glitchwavetable2.md を追加 2026-02-05 05:04:23 +00:00
7a082a1799 strudelglitchwavetable2.md を削除 2026-02-05 05:03:33 +00:00
e55ba9fdc7 strudelglitchwavetable2.md を追加 2026-02-05 05:02:55 +00:00
56031c345a strudel/20260122.md を追加 2026-01-22 08:05:55 +00:00
423c52daa9 strudel/20260110.md を更新 2026-01-10 12:50:25 +00:00
71ab4ebb54 strudel/20260110.md を更新 2026-01-10 12:49:54 +00:00
59825d99b3 strudel/20260110.md を追加 2026-01-10 12:48:53 +00:00
301e4fd225 strudel/20251222.md を追加 2025-12-22 10:12:11 +00:00
fddb7f1177 strudel/20251216.md を更新 2025-12-16 04:17:54 +00:00
68c33945a7 strudel/20251216.md を追加 2025-12-16 04:16:44 +00:00
littleisland
a208db906a create/update '20251209.md' file 2025-12-09 16:24:36 +09:00
littleisland
7c7c1fef1f create/update '20251207.md' file 2025-12-07 17:14:49 +09:00
littleisland
74be117b23 create/update 'change cpm.md' file 2025-12-03 11:57:37 +09:00
littleisland
e585dc8047 create/update 'complex bass.md' file 2025-12-02 10:31:56 +09:00
littleisland
3f25fcb485 create/update 'slow wave.md' file 2025-11-30 16:12:29 +09:00
littleisland
1e5f3c1156 create/update 'wavetable code.md' file 2025-11-27 16:35:59 +09:00
littleisland
e173092f4a create/update 'fadein sample code.md' file 2025-11-27 15:14:35 +09:00
littleisland
a019fc3311 create/update 'heart sounds and breathing.md' file 2025-11-22 18:45:38 +09:00
littleisland
0dc63c665e create/update '20251120.md' file 2025-11-20 23:20:08 +09:00
littleisland
5bcc5ee7fa create/update '20251113.md' file 2025-11-13 20:21:08 +09:00
littleisland
f1b4dc9f34 create/update '20251113.md' file 2025-11-13 20:20:45 +09:00
littleisland
38d7433e65 create/update 'music box.md' file 2025-11-11 13:46:26 +09:00
littleisland
fc9a8a0cd7 create/update 'music box.md' file 2025-11-11 13:46:03 +09:00
littleisland
6e6ec38afa create/update '20251110.md' file 2025-11-10 18:31:18 +09:00
littleisland
d9df1193de create/update 'MIDI Setting Sample.md' file 2025-11-03 19:20:55 +09:00
littleisland
d3e0991f8a create/update '20251102.md' file 2025-11-02 23:54:24 +09:00
littleisland
6c587c2ecf delete '2025-07-01_test.md' file 2025-10-23 21:34:07 +09:00
littleisland
714bbf9918 create/update 'Jazz.md' file 2025-10-23 21:33:41 +09:00
littleisland
1727369493 create/update 'hypnotic techno.md' file 2025-10-19 20:08:12 +09:00
littleisland
406b027f98 create/update 'hyp techno.md' file 2025-10-19 20:07:13 +09:00
littleisland
3623dc680c create/update 'DnB.md' file 2025-10-14 20:53:55 +09:00
littleisland
7351ea4a7e create/update 'DnB.md' file 2025-10-13 23:06:19 +09:00
littleisland
b5e34a59e8 create/update 'DnB.md' file 2025-10-13 22:02:44 +09:00
littleisland
0c4e15b17a delete 'todo.md' file 2025-10-13 22:01:58 +09:00
littleisland
dafe6ba845 create/update 'Slow sine.md' file 2025-10-11 00:28:02 +09:00
littleisland
b05a935c83 create/update 'glitch sound.md' file 2025-09-28 17:04:32 +09:00
littleisland
ad570ee484 create/update 'dub techono.md' file 2025-09-23 14:24:53 +09:00
littleisland
60774ecdc1 create/update 'Slow sine.md' file 2025-09-16 17:36:21 +09:00
littleisland
0f0c5acf46 create/update 'Slow sine.md' file 2025-09-16 17:36:07 +09:00
littleisland
f0e6b43398 create/update '20250915.md' file 2025-09-16 14:11:34 +09:00
littleisland
3fd58b4d4f create/update '20250915.md' file 2025-09-15 12:56:16 +09:00
littleisland
2fe8d3f13d create/update '20250907.md' file 2025-09-07 12:32:09 +09:00
littleisland
bb4f3d45b2 create/update '20250903.md' file 2025-09-03 21:39:25 +09:00
littleisland
0bc4319b02 create/update 'Slow sine.md' file 2025-08-30 19:02:34 +09:00
littleisland
0cacbabd0a create/update '20250819.md' file 2025-08-19 20:57:41 +09:00
littleisland
2b68529d99 create/update '20250812.md' file 2025-08-14 13:41:20 +09:00
littleisland
5832671d4a create/update '20250812.md' file 2025-08-12 19:36:38 +09:00
littleisland
061d518702 create/update '20250812.md' file 2025-08-12 19:34:34 +09:00
littleisland
f7a9ed1ef9 create/update '20250812.md' file 2025-08-12 19:34:06 +09:00
littleisland
407ac5f0de create/update '20250812.md' file 2025-08-12 19:33:19 +09:00
littleisland
461c0c8697 create/update '20250812.md' file 2025-08-12 15:49:18 +09:00
littleisland
0435a093e5 create/update '20250805.md' file 2025-08-05 21:26:11 +09:00
littleisland
ae06aba2d7 create/update '20250728.md' file 2025-07-28 16:34:12 +09:00
littleisland
5eb4bab349 create/update 'MIDI Setting Sample.md' file 2025-07-25 14:16:45 +09:00
littleisland
f99508c470 create/update 'MIDI Setting Sample.md' file 2025-07-22 14:33:46 +09:00
littleisland
b9b8119d46 create/update '20250720.md' file 2025-07-21 12:46:15 +09:00
littleisland
a8b46a6f5c create/update '20250720.md' file 2025-07-21 12:45:42 +09:00
littleisland
24810adb96 create/update '20250720.md' file 2025-07-20 16:09:07 +09:00
littleisland
bb244f46a9 create/update '20250714.md' file 2025-07-14 22:38:40 +09:00
littleisland
d3036a833b create/update '20250713.md' file 2025-07-13 13:24:27 +09:00
littleisland
9831a91b26 Merge branch 'main' of https://gitea.harakara.site/littleisland/notebook.git 2025-07-11 22:36:43 +09:00
littleisland
bf2e17f1b8 create/update '20250711.md' file 2025-07-11 22:36:43 +09:00
66 changed files with 2948 additions and 3480 deletions

437
.gemini/reference.md Normal file
View 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/

View 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)

View 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/

View File

@@ -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);
}

View 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)

View File

@@ -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)
```

View File

@@ -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)
```

View File

@@ -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)
```

View File

@@ -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
View File

@@ -0,0 +1 @@
.DS_Store

54
PRECAUTIONS.md Normal file
View 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)`

Binary file not shown.

24
gemini.md Normal file
View 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/

Binary file not shown.

View File

@@ -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

View File

@@ -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()

View File

@@ -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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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)))
```

View 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
View 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
View 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
View 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
View 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
View 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
View 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()
```

View 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();
```

View 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
View 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))
```

View 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)
```

View 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()
)
```

View 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()))
```

View 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
View 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)
```

View File

@@ -0,0 +1 @@
このフォルダはサンプル音の格納用です。

View File

@@ -1 +0,0 @@
strudel samples

60
strudel/slow wave.md Normal file
View 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))
```

View File

@@ -1,6 +0,0 @@
study plan
- [ ] sampler
- [ ] hydra
- [ ] techno basic
- [ ] house basic
- [ ] enso

26
strudel/wavetable code.md Normal file
View 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})
```