diff --git a/talk/deck.mdx b/talk/deck.mdx
index df6b14238..64e79b701 100644
--- a/talk/deck.mdx
+++ b/talk/deck.mdx
@@ -43,7 +43,7 @@ import ImgTile from './ImgTile';
- 🎤 Dilettante Music Producer of all kinds of genres
- 💿 ocassionally publishes music with Lui Mafuta & Puste
- 🔌 Modular Synth & Electronics Lover, Dilettante DJ ..
-- 💌 Coding Blog: [Loophole Letters](https://loophole-letters.vercel.app/)
+- 💌 Coding Blog: [loophole-letters.vercel.app](https://loophole-letters.vercel.app/)
- 👀 Loves visualizations
@@ -141,6 +141,16 @@ import ImgTile from './ImgTile';
"
+.scale('D minor')
+.color('salmon')
+.off(1/4, x=>x.scaleTranspose(2).color('green'))
+.off(1/2, x=>x.scaleTranspose(6).color('steelblue'))
+.legato(.5)
+.echo(2, 1/8, .5)
+.tone((await piano()).chain(out()))
+.pianoroll()`,
+ //
`// froos - xylophone on the floor
const t = x => x.scaleTranspose("<0 2 4 3>/4").transpose(-2)
const s = x => x.scale(
@@ -188,83 +198,6 @@ stack(
"c3*4".transpose("[-24 0]*2").tone(metal(adsr(0,.02))
.chain(vol(0.5).connect(delay),out()))
).slow(1)`,
- //
- `// froos - giant steps, chiptune version
-stack(
- // melody
- seq(
- "[F#5 D5] [B4 G4] Bb4 [B4 A4]",
- "[D5 Bb4] [G4 Eb4] F#4 [G4 F4]",
- "Bb4 [B4 A4] D5 [D#5 C#5]",
- "F#5 [G5 F5] Bb5 [F#5 [F#5 ~@3]]",
- ),
- // chords
- seq(
- "[B^7 D7] [G^7 Bb7] Eb^7 [Am7 D7]",
- "[G^7 Bb7] [Eb^7 F#7] B^7 [Fm7 Bb7]",
- "Eb^7 [Am7 D7] G^7 [C#m7 F#7]",
- "B^7 [Fm7 Bb7] Eb^7 [C#m7 F#7]"
- )
- .struct("~ [x ~]".fast(4*8))
- .voicings(['E3', 'G4']),
- // bass
- seq(
- "[B2 D2] [G2 D2] [Eb2 Bb2] [A2 D2]",
- "[G2 Bb2] [Eb2 F#2] [B2 F#2] [F2 Bb2]",
- "[Eb2 Bb2] [A2 D2] [G2 D2] [C#2 F#2]",
- "[B2 F#2] [F2 Bb2] [Eb2 Bb2] [C#2 F#2]"
- )
- .struct("x ~".fast(4*8))
-).slow(25)`,
- //
- `// froos - piano tune #3829
-"0 4 <5 7> 2"
- .off(1/16,x=>x.add(5).color('salmon'))
- .echo(4,.125,.7)
- .scale(cat(
- 'C hirajoshi',
- slowcat('F hirajoshi','E pentatonic')
- ))
- .slow(4)
- .tone((await piano()).toDestination())
- .pianoroll({ cycles:16, fold:1, vertical:0 })`,
- //
- `// froos - if so what else
-const mix = (key) => vol({
- chords: .2,
- lead: 0.8,
- bass: .4,
- snare: .95,
- kick: .9,
- hihat: .35,
-}[key]||0);
-const delay = new FeedbackDelay(1/6, .3).chain(vol(.7), out());
-const delay2 = new FeedbackDelay(1/6, .2).chain(vol(.15), out());
-const chorus = new Chorus(1,2.5,0.5).start();
-// instruments
-const instr = (instrument) => ({
- organ: polysynth().set({...osc('sawtooth4'), ...adsr(.01,.2,0)}).chain(mix('chords').connect(delay),out()),
- lead: polysynth().set({...osc('triangle4'),...adsr(0.01,.05,0)}).chain(mix('lead').connect(delay2), out()),
- bass: polysynth().set({...osc('sawtooth8'),...adsr(.02,.05,.3,.2)}).chain(mix('bass'),lowpass(3000), out()),
- pad: polysynth().set({...osc('square2'),...adsr(0.1,.4,0.8)}).chain(vol(0.15),chorus,out()),
- hihat: metal(adsr(0, .02, 0)).chain(mix('hihat'), out()),
- snare: noise(adsr(0, .15, 0.01)).chain(mix('snare'), lowpass(5000), out()),
- kick: membrane().chain(mix('kick'), out())
-}[instrument]);
-// harmony
-const t = transpose("<0 0 1 0>/8");
-const sowhat = scaleTranspose("0,3,6,9,11");
-// track
-stack(
- "[<0 4 [3 [2 1]]>]/4".struct("[x]*3").mask("[~ x ~]").scale('D5 dorian').off(1/6, scaleTranspose(-7)).off(1/3, scaleTranspose(-5)).apply(t).tone(instr('lead')).mask("<~ ~ x x>/8"),
- "< <[d3 ~] [c3 f3] g3>>".scale('D dorian').apply(sowhat).apply(t).tone(instr('organ')).mask("/8"),
- "<[d2 [d2 ~]*3]!3 >".apply(t).tone(instr('bass')),
- "c1*6".tone(instr('hihat')),
- "~ c3".tone(instr('snare')),
- "<[c1@5 c1] >".tone(instr('kick')),
- "[2,4]/4".scale('D dorian').apply(t).tone(instr('pad')).mask("/8")
-).fast(6/8)`,
- //
`// froos - strudel schneckno
samples({
clubkick: 'clubkick/2.wav',
@@ -274,9 +207,14 @@ samples({
jvbass: ['jvbass/000_01.wav','jvbass/001_02.wav','jvbass/003_04.wav','jvbass/004_05.wav','jvbass/005_06.wav']
}, 'https://raw.githubusercontent.com/tidalcycles/Dirt-Samples/master/');
stack(
- s(",[~ ],hh(3,4,2)").n("<0 1 2>").speed(.8),
- n("<0 1*2 4(3,8) 2>").speed(.6).off(1/8,x=>x.speed(1.2).degradeBy(.5)).s("jvbass")
-).reset(">").cutoff(perlin.slow(7).range(100,20000)).webdirt().slow(3/2)`,
+ s(",[~ ],hh(3,4,2)")
+ .n("<0 1 2>").speed(.8),
+ n("<0 1*2 4(3,8) 2>").speed(.6)
+ .off(1/8, x => x.speed(1.2).degradeBy(.5))
+ .s("jvbass")
+).reset(">")
+ .cutoff(perlin.slow(7).range(100,20000))
+ .webdirt().slow(3/2)`,
`stack( // drum pattern by yaxu
"24*2 [~ 25]".chunk(4, x => x.sub("12").fast(2))
.tone(membrane().toDestination()),
@@ -317,15 +255,18 @@ stack(
+
+
## Mini Notation
+\* \[\] ~ , / <\> ! @ \(\)
+
- Embedded Domain Specific Language
- PEG.js grammar based on krill by Marc Resibois
-- \* \[\] ~ , / <\> ! @ \(\)
@@ -389,6 +330,185 @@ s("bd,[~ sd],hh*4").webdirt()`,
+## Pattern Factories
+
+seq, cat, stack
+
+"
+ .tone((await piano()).toDestination())
+ .pianoroll()`,
+ `stack(c3,e3,g3) // "c3,e3,g3"
+ .tone((await piano()).toDestination())
+ .pianoroll()`,
+ ]}
+/>
+
+
+
+## Time Control
+
+fast / slow, early / late, rev
+
+".early(.16)).late(.16)
+ .tone((await piano()).toDestination())
+ .pianoroll()`,
+ `"c3 e3 g3 bb3".rev()
+ .tone((await piano()).toDestination())
+ .pianoroll()`,
+ ]}
+/>
+
+
+
+## Arithmetic & Patternified Params
+
+add, sub, mul, div
+
+/2")
+ .tone((await piano()).toDestination())
+ .pianoroll({fold:1,cycles:8})`,
+ ]}
+/>
+
+
+
+## Scales
+
+")
+ .scale('F#2 major')
+ .tone((await piano()).toDestination())
+ .pianoroll({autorange:1})`,
+ `"-7, 0 2 4 7".add("<0 1 2 1>")
+ .scale(cat('F#2 major','A2 major').slow(8))
+ .tone((await piano()).toDestination())
+ .pianoroll({autorange:1,cycles:16,fold:1,inactive:'orange'})`,
+ ]}
+/>
+
+
+
+## Articulation
+
+velocity, legato
+
+")
+ .scale(cat('F#2 major','A2 major').slow(8))
+ .legato(.25)
+ .velocity(.5)
+ .tone((await piano()).toDestination())
+ .pianoroll({autorange:1,cycles:16,fold:1,inactive:'orange'})`,
+ `"-7, 0 2 4 7".add("<0 1 2 1>")
+ .scale(cat('F#2 major','A2 major').slow(8))
+ .legato("<0.25 2>/8")
+ .velocity("<1 .8>/8")
+ .tone((await piano()).toDestination())
+ .pianoroll({autorange:1,cycles:16,fold:1,inactive:'orange'})`,
+ ]}
+/>
+
+
+
+## Continuous Signals / Randomness
+
+sine / saw / tri / square / rand / perlin, range, segment
+
+
+
+
+
+## Humanization
+
+"articulate randomness"
+
+")
+ .scale(cat('F#2 major','A2 major').slow(8))
+ .legato(perlin.range(.5,2))
+ .velocity("<0.4 .3 .7>*3")
+ .late(perlin.range(0,.05))
+ .tone((await piano()).toDestination())
+ .pianoroll({autorange:1,cycles:16,fold:1,inactive:'orange'})`,
+ ]}
+/>
+
+
+
+## Shuffling
+
+iter
+
+")
+ .scale(cat('F#2 major','A2 major').slow(8))
+ .legato(perlin.range(.5,2))
+ .velocity(rand.range(.6,.9))
+ .tone((await piano()).toDestination())
+ .pianoroll({autorange:1,cycles:16,fold:1,inactive:'indigo'})`,
+ ]}
+/>
+
+
+
+## Superposition
+
+superimpose, off, echo, echoWith
+
+x.add(7).color('green'))
+ .scale('C major').slow(2)
+ .tone((await piano()).toDestination())
+ .pianoroll({autorange:1,cycles:8,fold:1,inactive:'indigo'})`,
+ `"0 2 4 7"
+ .off(.17, x=>x.add(12).color('green'))
+ .scale('C major').slow(2)
+ .tone((await piano()).toDestination())
+ .pianoroll({autorange:1,cycles:8,fold:1,inactive:'indigo'})`,
+ `"0 2 4 7"
+ .echo(6,.125,.8)
+ .scale('C major').slow(2)
+ .tone((await piano()).toDestination())
+ .pianoroll({autorange:1,cycles:8,fold:1,inactive:'indigo'})`,
+ ]}
+/>
+
+
+
## Phasing
Oscillator Detune in slow motion
@@ -402,10 +522,10 @@ Oscillator Detune in slow motion
.tone((await piano()).toDestination())
.pianoroll({fold:1,vertical:0,cycles:8})`,
`// Steve Reich - Clapping Music
-s("hh").struct("x!3 ~ x!2 ~ x ~ x!2 ~").speed(.8)
+s("cp").struct("x!3 ~ x!2 ~ x ~ x!2 ~").speed(.8)
.jux(x=>x.speed(1.2)
.late("<0 1 2 3 4 5 6 7 8 9 10 11>/8".div(12))
- ).slow(2).webdirt().pianoroll()`,
+ ).slow(2).webdirt()`,
]}
/>
@@ -431,5 +551,38 @@ s("hh").struct("x!3 ~ x!2 ~ x ~ x!2 ~").speed(.8)
.webdirt()`}
/>
+
+
+## Chords and Scales
+
+
+
diff --git a/talk/public/repl.png b/talk/public/repl.png
new file mode 100644
index 000000000..431febc6f
Binary files /dev/null and b/talk/public/repl.png differ