diff --git a/paper/iclc2023.md b/paper/iclc2023.md index e6d5c41a4..a3e5ed059 100644 --- a/paper/iclc2023.md +++ b/paper/iclc2023.md @@ -47,7 +47,7 @@ The first tentative commit to the Strudel project was on 22nd January 2022 by Alex McLean, with the core representation implemented over the following few days. Although this was his first attempt at a JavaScript-based application, by 27th January, Alex had managed to -upload an initial version to the 'npm' javascript package database, +upload an initial version to the 'npm' JavaScript package database, sharing with the wider community for comment. By 4th February, Felix Roos had discovered Strudel and contributed a 'REPL' user interface to it, and a scheduler the following day, so that Strudel @@ -64,7 +64,7 @@ although within the different syntactical trade-offs and library ecosystems of JavaScript and Haskell, some divergence is inevitable and healthy. Now celebrating the first year of its life, Strudel is now a fully-fledged live -coding environment, porting Tidal's core represention of patterns, +coding environment, porting Tidal's core representation of patterns, pattern transformations, and mini-notation for polymetric sequences, combined with a wealth of features for synthesising and visualising those patterns. @@ -127,7 +127,7 @@ Such sequences are often treated only as a starting point for manipulation, wher # Pattern Example -The following example showcases how patterns can be utilized to create musical complexity from simple parts, using repetition and interference: +The following example showcases how patterns can be utilised to create musical complexity from simple parts, using repetition and interference: ```js "<0 2 [4 6](3,4,1) 3>" @@ -154,14 +154,14 @@ These numbers then undergo various pattern transformations. Here is a short desc - `.off(n, f)`: layers a pattern on top of itself, with the new layer offset by n cycles, and with function f applied - `.legato(n)`: multiply the duration of all events in a pattern by a factor of n - `.echo(t, n, v)`: copy each event t times, with n cycles in between each copy, decreasing velocity by v -- `.note()`: interpretes values as notes +- `.note()`: interprets values as notes - `.s(name)`: play back each event with the given sound - `.delay(wet)`: add delay - `.delaytime(t)`: set delay time Much of the above will be familiar to Tidal users. - + # Ways to make Sound (and other events) @@ -234,7 +234,7 @@ Other convenient features like pseudo variables, operator overloading and top le ### Mini-notation -While the transpilation allows us to express patterns in Javascript in a less verbose way, it is still preferable to use the mini-notation as a more compact way to express rhythm. Strudel aims to provide the same mini-notation features and syntax as used in Tidal. +While the transpilation allows us to express patterns in JavaScript in a less verbose way, it is still preferable to use the mini-notation as a more compact way to express rhythm. Strudel aims to provide the same mini-notation features and syntax as used in Tidal. The mini-notation parser is implemented using `peggy`, which allows generating performant parsers for Domain Specific Languages (DSLs) using a concise grammar notation. The generated parser turns the mini-notation string into an AST which is used to call the respective Strudel functions with the required structure. For example, `"c3 [e3 g3]*2"` will result in the following calls: @@ -305,7 +305,7 @@ const { x, y } = createParams('x', 'y') x(sine.range(0, 200)).y(cosine.range(0,200)) ``` -This example creates the custom control parameters `x` and `y` which are then used to form a pattern that descibes the coordinates of a circle. +This example creates the custom control parameters `x` and `y` which are then used to form a pattern that describes the coordinates of a circle. ### Outputs @@ -323,7 +323,7 @@ function onTrigger(hap, deadline, duration) { } ``` -The above example will create an `OscillatorNode` for each event, where the frequency is controlled by the `note` param. In essence, this is how the WebAudio API output of Strudel works, only with many more parameters to control synths, samples and effects. +The above example will create an `OscillatorNode` for each event, where the frequency is controlled by the `note` parameter. In essence, this is how the WebAudio API output of Strudel works, only with many more parameters to control synths, samples and effects. # Pattern alignment and combination @@ -427,7 +427,7 @@ techniques like partial application, we are so far very happy with the results. Tidal's functional reactive approach to pattern-making has in general translated well to JavaScript, and opportunities and constraints have traded off to create a very approachable and -useable live coding environment. +usable live coding environment. ## The trade-off of flexible typing @@ -448,7 +448,7 @@ While Haskell's type system makes it a great language for the ongoing developmen The Strudel REPL is available at , including an interactive tutorial. The repository is at , all the code is open source under the AGPL-3.0 License. -# Acknowledgments +# Acknowledgements Thanks to the Strudel and wider Tidal, live coding, WebAudio and free/open source software communities for inspiration and support. Alex McLean's work on this project is supported by a UKRI Future Leaders Fellowship [grant number MR/V025260/1].