4.6 KiB
title, date, url2cite
| title | date | url2cite |
|---|---|---|
| Strudel | 2022-03-22 | all-links |
Introduction
That @roberts2016 are excellent, I reference their work at least twice per sentence [@roberts2016, p. 3]. Another reference @mclean21.
"1 2 3"
Background
General motivations / related work. Reference vortex paper and summarise its background.
Introducing TidalStrudel
(do we want to call it TidalStrudel once, and Strudel for short from then on as with vortex? Or just stick with Strudel? Should we start calling TidalCycles just Cycles??)
- Motivating musical example
Tidal patterns
- Some comparisons of -Strudel with -Vortex and -Cycles code?
(the following examples are from vortex paper, with added js versions)
1
sound "bd ~ [sd cp]"
sound("bd", silence, ["sd", "cp"])
sound("bd ~ [sd cp]")
without mini notation:
sound $ cat
[pure "bd", silence,
cat(pure "sd", pure "cp")]
sound('bd', silence, cat('sd', 'cp'))
2
sound "bd ~ <sd cp>"
sound("bd", silence, slowcat("sd", "cp"))
sound("bd ~ <sd cp>")
// sound('bd', silence, slowcat('sd', 'cp'))
3
sound "bd {cp sd, lt mt ht}"
sound("bd", pm(["cp", "sd"], ["lt", "mt", "ht"]))
?
4
sound "bd {cp sd, [lt mt,bd bd bd] ht}"
sound("bd", pm(["cp", "sd"],
[pr(["lt", "mt"],
["bd", "bd", "bd"]
),
"ht" ]))
??
5
sound "bd sd cp" # speed "1 2"
sound("bd", "sd", "cp") >> speed (1, 2)
sound("bd sd cp").speed("1 2")
(operator overloading like in vortex?)
6
rev $ sound "bd sd"
rev(sound("bd", "sd"))
sound("bd", "sd").rev()
rev(sound("bd sd"))
sound("bd sd").rev()
7
jux rev $ every 3 (fast 2) $ sound "bd sd"
jux(rev, every(3, fast(2), sound("bd", "sd")))
sound("bd","sd").every(3, fast(2)).jux(rev)
jux(rev, every(3, fast(2), sound("bd sd")))
sound("bd sd").every(3, fast(2)).jux(rev)
(partial application)
8
n ("1 2 3" + "4 5") # sound "drum"
n (sequence(1,2,3) + sequence(4,5)) >> sound "drum"
n("1 2 3".add("4 5")).sound("drum")
n("5 [6 7] 8").sound("drum")
(operator overloading?)
9
speed("1 2 3" + sine)
speed(sequence(1,2,3) + sine)
speed("1 2 3".add(sine))
"c3*4".add(sine.mul(12).slow(8)).pianoroll()
10
- Mininotation
Strudel/web specifics
Some discussion about whether strudel is really a port of TidalCycles, or whether javascript affordances mean it's going its own way..
- Recursive Scheduling: "calling itself in the future"
- Optimizing Syntax for minimal keystrokes / readability: "AST Hacking" via shift-ast
pseudo variables
- Handling mininotation - double quoted and template strings to mini calls
- Operator overloading
- Fixing inconsistencies (e.g. with stut/echo) adding source locations
- Dynamic HUD: Highlighting + drawing
- Translation of Tidal concepts to Javascript - different constraints, affordances, aesthetics
- Dynamic Harmonic Programming?
- emulating musician thought patterns
- microtonal features? webserial
User Code Transpilation
(compare user input vs shifted output)
double quotes -> mini calls
"c3 e3" // or `c3 e3`
mini("c3 e3")
operator overloading
cat(c3, e3) * 4
reify(cat("c3","e3")).fast(4)
(reify is redundant here, the shapeshifter could have an additional check...)
(TBD: ability to multiply mini notation strings)
pseudo variables
cat(c3, r, e3)
cat("c3",silence,"e3")
locations
cat(c3, e3)
cat(
reify("c3").withLocation([1,4,4],[1,6,6]),
reify("e3").withLocation([1,8,8],[1,10,10])
)
mini("c3 e3")
with locations:
// "c3 e3"
mini("c3 e3").withMiniLocation([1,0,0],[1,7,7])
(talk about mini adding locations of mini notation parser)
top level await
const p = (await piano()).toDestination()
cat(c3).tone(p)
(async()=>{
const p = (await piano()).toDestination();
return cat("c3").tone(p);
})()
Musical examples
...
Ongoing work/future aims
- WASM Sound Backend
- OSC -> Supercollider
- mininotation as the 'regex' of metre