diff --git a/packages/core/pattern.mjs b/packages/core/pattern.mjs index f5c7cd51..737df84f 100644 --- a/packages/core/pattern.mjs +++ b/packages/core/pattern.mjs @@ -1014,13 +1014,6 @@ export class Pattern { return this._chunk(n, func, true); } - edit(...funcs) { - return stack(...funcs.map((func) => func(this))); - } - pipe(func) { - return func(this); - } - _bypass(on) { on = Boolean(parseInt(on)); return on ? silence : this; diff --git a/repl/src/tunes.mjs b/repl/src/tunes.mjs index ca35f5ea..a70eef13 100644 --- a/repl/src/tunes.mjs +++ b/repl/src/tunes.mjs @@ -306,7 +306,7 @@ const drums = stack( const thru = (x) => x.transpose("<0 1>/8").transpose(-1); const synths = stack( "/2".scale(timeCat([3,'C minor'],[1,'C melodic minor']).slow(8)).struct("[~ x]*2") - .edit( + .layer( scaleTranspose(0).early(0), scaleTranspose(2).early(1/8), scaleTranspose(7).early(1/4), @@ -517,7 +517,7 @@ const snare = noise({type:'white',...adsr(0,0.2,0)}).chain(lowpass(5000),vol(1.8 const s = polysynth().set({...osc('sawtooth4'),...adsr(0.01,.2,.6,0.2)}).chain(vol(.23).connect(delay),out()); stack( stack( - "0 1 4 [3!2 5]".edit( + "0 1 4 [3!2 5]".layer( // chords x=>x.add("0,3").duration("0.05!3 0.02"), // bass diff --git a/tutorial/tutorial.mdx b/tutorial/tutorial.mdx index d39c6259..ca1ec749 100644 --- a/tutorial/tutorial.mdx +++ b/tutorial/tutorial.mdx @@ -32,14 +32,14 @@ const drums = stack( const thru = (x) => x.transpose("<0 1>/8").transpose(-1); const synths = stack( "/2".scale(timeCat([3,'C minor'],[1,'C melodic minor']).slow(8)).struct("[~ x]\*2") -.edit( +.layer( scaleTranspose(0).early(0), scaleTranspose(2).early(1/8), scaleTranspose(7).early(1/4), scaleTranspose(8).early(3/8) -).edit(thru).tone(keys).bypass("<1 0>/16"), -"/2".struct("[x [~ x] <[~ [~ x]]!3 [x x]>@2]/2".fast(2)).edit(thru).tone(bass), -"/2".struct("~ [x@0.1 ~]".fast(2)).voicings().edit(thru).every(2, early(1/8)).tone(keys).bypass("<0@7 1>/8".early(1/4)) +).layer(thru).tone(keys).bypass("<1 0>/16"), +"/2".struct("[x [~ x] <[~ [~ x]]!3 [x x]>@2]/2".fast(2)).layer(thru).tone(bass), +"/2".struct("~ [x@0.1 ~]".fast(2)).voicings().layer(thru).every(2, early(1/8)).tone(keys).bypass("<0@7 1>/8".early(1/4)) ) stack( drums.fast(2), @@ -175,11 +175,21 @@ Using "!" we can repeat without speeding up: In essence, the `x!n` is like a shortcut for `[x*n]@n`. +## Euclidian + +Using round brackets, we can create rhythmical sub-divisions based on three parameters: beats, segments and offset. +The first parameter controls how may beats will be played. +The second parameter controls the total amount of segments the beats will be distributed over. +The third (optional) parameter controls the starting position for distributing the beats. +One popular Euclidian rhythm (going by various names, such as "Pop Clave") is "(3,8,1)" or simply "(3,8)", +resulting in a rhythmical structure of "x ~ ~ x ~ ~ x ~" (3 beats over 8 segments, starting on position 1). + + + ## Mini Notation TODO Compared to [tidal mini notation](https://tidalcycles.org/docs/patternlib/tutorials/mini_notation/), the following mini notation features are missing from Strudel: -- [x] Euclidean algorithm "c3(3,2,1)" TODO: document - [ ] Tie symbols "\_" - [ ] feet marking "." - [ ] random choice "|" @@ -436,12 +446,6 @@ Applies the given function by the given time offset: -### append(pat) - -Appends the given pattern after the current pattern: - - - ### stack(pat) Stacks the given pattern to the current pattern: @@ -643,10 +647,10 @@ Turns chord symbols into root notes of chords in given octave. ".rootNotes(3)`} /> -Together with edit, struct and voicings, this can be used to create a basic backing track: +Together with layer, struct and voicings, this can be used to create a basic backing track: ".edit( + tune={`"".layer( x => x.voicings(['d3','g4']).struct("~ x"), x => x.rootNotes(2).tone(synth(osc('sawtooth4')).chain(out())) )`}