From 89934886f7270ffa1cad8fe581806f143088fdb3 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 15 Apr 2022 08:55:53 +0100 Subject: [PATCH] initial demo submission --- paper/citation-cache.json | 235 ++++++++++++++++++++ paper/demo-preprocessed.md | 414 +++++++++++++++++++++++++++++++++++ paper/demo.md | 119 ++++++++++ paper/demo.pdf | Bin 0 -> 54800 bytes paper/make.sh | 8 +- paper/tex/latex-template.tex | 16 +- 6 files changed, 780 insertions(+), 12 deletions(-) create mode 100644 paper/demo-preprocessed.md create mode 100644 paper/demo.md create mode 100644 paper/demo.pdf diff --git a/paper/citation-cache.json b/paper/citation-cache.json index a84d7c20..918250f5 100644 --- a/paper/citation-cache.json +++ b/paper/citation-cache.json @@ -151,6 +151,241 @@ "title": "Bringing the TidalCycles Mini-Notation to the Browser", "type": "" } + }, + "https://zenodo.org/record/6456380": { + "fetched": "2022-04-14T21:26:21.302Z", + "bibtex": [ + "", + "@misc{mclean_tidalvortex_2022,", + " address = {Limerick, Ireland},", + " title = {{TidalVortex} {Zero}},", + " url = {https://zenodo.org/record/6456380},", + " abstract = {In this paper we introduce ‘version zero’ of TidalVortex, an alternative implementation of the TidalCycles live coding system, using the Python programming language.  This is open-ended work, exploring what happens when we try to extract the 'essence' of a system like TidalCycles and translate it into another programming language, while taking advantage of the affordance of its new host. First, we review the substantial prior art in porting TidalCycles, and in representing musical patterns in Python. We then compare equivalent patterns written in Haskell (TidalCycles) and Python (TidalVortex), and relate implementation details of how functional reactive paradigms have translated from the pure functional, strongly typed Haskell to the more multi-paradigm, dynamically typed Python. Finally, we conclude with reflections and generalisable outcomes.},", + " urldate = {2022-04-14},", + " collaborator = {McLean, Alex and Forment, Raphaël and Le Beux, Sylvain and Silvani, Damián},", + " month = apr,", + " year = {2022},", + "}", + "" + ], + "csl": { + "URL": "https://zenodo.org/record/6456380", + "abstract": "In this paper we introduce “version zero” of TidalVortex, an alternative implementation of the TidalCycles live coding system, using the Python programming language.  This is open-ended work, exploring what happens when we try to extract the ’essence’ of a system like TidalCycles and translate it into another programming language, while taking advantage of the affordance of its new host. First, we review the substantial prior art in porting TidalCycles, and in representing musical patterns in Python. We then compare equivalent patterns written in Haskell (TidalCycles) and Python (TidalVortex), and relate implementation details of how functional reactive paradigms have translated from the pure functional, strongly typed Haskell to the more multi-paradigm, dynamically typed Python. Finally, we conclude with reflections and generalisable outcomes.", + "accessed": { + "date-parts": [ + [ + 2022, + 4, + 14 + ] + ] + }, + "id": "https://zenodo.org/record/6456380", + "issued": { + "date-parts": [ + [ + 2022, + 4 + ] + ] + }, + "publisher-place": "Limerick, Ireland", + "title": "TidalVortex Zero", + "type": "" + } + }, + "https://zenodo.org/record/4299661": { + "fetched": "2022-04-15T07:40:08.702Z", + "bibtex": [ + "", + "@misc{mclean_algorithmic_2020,", + " address = {Birmingham UK},", + " title = {Algorithmic {Pattern}},", + " url = {https://zenodo.org/record/4299661},", + " abstract = {This paper brings together two main perspectives on algorithmic pattern. First, the writing of musical patterns in live coding performance, and second, the weaving of patterns in textiles. In both cases, algorithmic pattern is an interface between the human and the outcome, where small changes have far-reaching impact on the results. By bringing contemporary live coding and ancient textile approaches together, we reach a common view of pattern as algorithmic movement (e.g. looping, shifting, reflecting, interfering) in the making of things. This works beyond the usual definition of pattern used in musical interfaces, of mere repeating sequences. We conclude by considering the place of algorithmic pattern in a wider activity of making.},", + " urldate = {2022-04-15},", + " collaborator = {McLean, Alex},", + " month = jul,", + " year = {2020},", + " keywords = {pattern, tidalcycles, algorithmic music, textiles, live coding, algorave},", + "}", + "" + ], + "csl": { + "URL": "https://zenodo.org/record/4299661", + "abstract": "This paper brings together two main perspectives on algorithmic pattern. First, the writing of musical patterns in live coding performance, and second, the weaving of patterns in textiles. In both cases, algorithmic pattern is an interface between the human and the outcome, where small changes have far-reaching impact on the results. By bringing contemporary live coding and ancient textile approaches together, we reach a common view of pattern as algorithmic movement (e.g. looping, shifting, reflecting, interfering) in the making of things. This works beyond the usual definition of pattern used in musical interfaces, of mere repeating sequences. We conclude by considering the place of algorithmic pattern in a wider activity of making.", + "accessed": { + "date-parts": [ + [ + 2022, + 4, + 15 + ] + ] + }, + "id": "https://zenodo.org/record/4299661", + "issued": { + "date-parts": [ + [ + 2020, + 7 + ] + ] + }, + "keyword": "pattern, tidalcycles, algorithmic music, textiles, live coding, algorave", + "publisher-place": "Birmingham UK", + "title": "Algorithmic Pattern", + "type": "" + } + }, + "https://quod.lib.umich.edu/i/icmc/bbp2372.2012.011/2/–gibber-live-coding-audio-in-the-browser?page=root;size=150;view=text": { + "fetched": "2022-04-15T07:40:15.037Z", + "bibtex": [ + "", + "@article{charlie_gibber:_2012,", + " title = {{GIBBER}: {LIVE} {CODING} {AUDIO} {IN} {THE} {BROWSER}},", + " volume = {2012},", + " issn = {2223-3881},", + " url = {https://quod.lib.umich.edu/i/icmc/bbp2372.2012.011/2/%E2%80%93gibber-live-coding-audio-in-the-browser?page=root;size=150;view=text},", + " language = {en},", + " urldate = {2022-04-15},", + " journal = {International Computer Music Conference Proceedings},", + " author = {Charlie, , Roberts and Joann, , Kuchera-Morin},", + " year = {2012},", + "}", + "" + ], + "csl": { + "ISSN": "2223-3881", + "URL": "https://quod.lib.umich.edu/i/icmc/bbp2372.2012.011/2/%E2%80%93gibber-live-coding-audio-in-the-browser?page=root;size=150;view=text", + "accessed": { + "date-parts": [ + [ + 2022, + 4, + 15 + ] + ] + }, + "author": [ + { + "family": "Charlie", + "given": "Roberts" + }, + { + "family": "Joann", + "given": "Kuchera-Morin" + } + ], + "container-title": "International Computer Music Conference Proceedings", + "id": "https://quod.lib.umich.edu/i/icmc/bbp2372.2012.011/2/–gibber-live-coding-audio-in-the-browser?page_x61_root;size_x61_150;view_x61_text", + "issued": { + "date-parts": [ + [ + 2012 + ] + ] + }, + "title": "GIBBER: LIVE CODING AUDIO IN THE BROWSER", + "title-short": "GIBBER", + "type": "article-journal", + "volume": "2012" + } + }, + "https://www.semanticscholar.org/paper/Estuary%3A-Browser-based-Collaborative-Projectional-Ogborn-Beverley/c6b5d34575d6230dfd8751ca4af8e5f6e44d916b": { + "fetched": "2022-04-15T07:40:17.179Z", + "bibtex": [ + "", + "@misc{ogborn_estuary:_2017,", + " title = {Estuary: {Browser}-based {Collaborative} {Projectional} {Live} {Coding} of {Musical} {Patterns}},", + " shorttitle = {Estuary},", + " url = {https://www.semanticscholar.org/paper/Estuary%3A-Browser-based-Collaborative-Projectional-Ogborn-Beverley/c6b5d34575d6230dfd8751ca4af8e5f6e44d916b},", + " abstract = {Estuary is a browser-based collaborative projectional editing environment built on top of the popular TidalCycles language for the live coding of musical pattern that includes a strict form of structure editing, a click-only border-free approach to interface design, and explicit notations to modulate the liveness of different parts of the code. This paper describes the initial design and development of Estuary, a browser-based collaborative projectional editing environment built on top of the popular TidalCycles language for the live coding of musical pattern. Key features of Estuary include a strict form of structure editing (making syntactical errors impossible), a click-only border-free approach to interface design, explicit notations to modulate the liveness of different parts of the code, and a server-based network collaboration system that can be used for many simultaneous collaborative live coding performances, as well as to present different views of the same live coding activity. Estuary has been developed using Reflex-DOM, a Haskell-based framework for web development whose strictness promises robustness and security advantages.},", + " language = {en},", + " urldate = {2022-04-15},", + " journal = {www.semanticscholar.org},", + " author = {Ogborn, David and Beverley, J.},", + " year = {2017},", + "}", + "" + ], + "csl": { + "URL": "https://www.semanticscholar.org/paper/Estuary%3A-Browser-based-Collaborative-Projectional-Ogborn-Beverley/c6b5d34575d6230dfd8751ca4af8e5f6e44d916b", + "abstract": "Estuary is a browser-based collaborative projectional editing environment built on top of the popular TidalCycles language for the live coding of musical pattern that includes a strict form of structure editing, a click-only border-free approach to interface design, and explicit notations to modulate the liveness of different parts of the code. This paper describes the initial design and development of Estuary, a browser-based collaborative projectional editing environment built on top of the popular TidalCycles language for the live coding of musical pattern. Key features of Estuary include a strict form of structure editing (making syntactical errors impossible), a click-only border-free approach to interface design, explicit notations to modulate the liveness of different parts of the code, and a server-based network collaboration system that can be used for many simultaneous collaborative live coding performances, as well as to present different views of the same live coding activity. Estuary has been developed using Reflex-DOM, a Haskell-based framework for web development whose strictness promises robustness and security advantages.", + "accessed": { + "date-parts": [ + [ + 2022, + 4, + 15 + ] + ] + }, + "author": [ + { + "family": "Ogborn", + "given": "David" + }, + { + "family": "Beverley", + "given": "J." + } + ], + "container-title": "www.semanticscholar.org", + "id": "https://www.semanticscholar.org/paper/Estuary_x37_3A-Browser-based-Collaborative-Projectional-Ogborn-Beverley/c6b5d34575d6230dfd8751ca4af8e5f6e44d916b", + "issued": { + "date-parts": [ + [ + 2017 + ] + ] + }, + "title": "Estuary: Browser-based Collaborative Projectional Live Coding of Musical Patterns", + "title-short": "Estuary", + "type": "" + } + }, + "https://zenodo.org/record/6353969": { + "fetched": "2022-04-15T07:40:20.966Z", + "bibtex": [ + "", + "@misc{mclean_feedforward_2020,", + " address = {Birmingham},", + " title = {Feedforward},", + " url = {https://zenodo.org/record/6353969},", + " abstract = {This is an improvised, from-scratch live coding performance. The NIME interface which this performance showcases is the new Feedfoward editor for the TidalCycles live coding environment. Feedforward is written in Haskell using the ncurses library for terminal-based user interfaces. It runs on low-powered hardware including the Raspberry Pi Zero, with formative testing of prototypes conducted with several groups of children between the ages of 8 and 14. Feedforward has a number of features designed to support improvised, multi-pattern live coding. Individual Tidal patterns are addressable with hotkeys for fast mute and unmuting. Each pattern has a stereo VU meter, to aid the quick matching of sound to pattern within a mix. In addition, TidalCycles has been extended to store context with each event, so that source code positions in its polyrhythmic sequence mini-notation are tracked. This allows steps to be highlighted in the source code when- ever they are active. This works even when Tidal combinators have been applied to manipulate the timeline. Formal evaluation has yet to take place, but this feature appears to support learning of how pattern manipulations work in Tidal. Feedforward and TidalCycles is free/open source software under a GPL licence version 3.0.},", + " urldate = {2022-04-15},", + " collaborator = {McLean, Alex},", + " month = jul,", + " year = {2020},", + "}", + "" + ], + "csl": { + "URL": "https://zenodo.org/record/6353969", + "abstract": "This is an improvised, from-scratch live coding performance. The NIME interface which this performance showcases is the new Feedfoward editor for the TidalCycles live coding environment. Feedforward is written in Haskell using the ncurses library for terminal-based user interfaces. It runs on low-powered hardware including the Raspberry Pi Zero, with formative testing of prototypes conducted with several groups of children between the ages of 8 and 14. Feedforward has a number of features designed to support improvised, multi-pattern live coding. Individual Tidal patterns are addressable with hotkeys for fast mute and unmuting. Each pattern has a stereo VU meter, to aid the quick matching of sound to pattern within a mix. In addition, TidalCycles has been extended to store context with each event, so that source code positions in its polyrhythmic sequence mini-notation are tracked. This allows steps to be highlighted in the source code when- ever they are active. This works even when Tidal combinators have been applied to manipulate the timeline. Formal evaluation has yet to take place, but this feature appears to support learning of how pattern manipulations work in Tidal. Feedforward and TidalCycles is free/open source software under a GPL licence version 3.0.", + "accessed": { + "date-parts": [ + [ + 2022, + 4, + 15 + ] + ] + }, + "id": "https://zenodo.org/record/6353969", + "issued": { + "date-parts": [ + [ + 2020, + 7 + ] + ] + }, + "publisher-place": "Birmingham", + "title": "Feedforward", + "type": "" + } } } } \ No newline at end of file diff --git a/paper/demo-preprocessed.md b/paper/demo-preprocessed.md new file mode 100644 index 00000000..ed603851 --- /dev/null +++ b/paper/demo-preprocessed.md @@ -0,0 +1,414 @@ +--- +date: 2022-04-15 +references: +- abstract: In this artist statement, I will discuss the tension between + source code as an interactive system for performers and source code + as information and entertainment for audiences in live-coding + performances. I then describe augmentations I developed for the + presentation of source code in the live-coding environment Gibber, + including animations and annotations that visually reveal aspects of + system state during performances. I briefly describe audience + responses to these techniques and, more importantly, how they are + critical to my own artistic practice. + accessed: + date-parts: + - - 2022 + - 3 + - 24 + author: + - family: Roberts + given: Charles + container-title: International Journal of Performance Arts and Digital + Media + DOI: 10.1080/14794713.2016.1227602 + id: "https://www.tandfonline.com/doi/abs/10.1080/14794713.2016.1227602?journalCode_x61_rpdm20" + ISSN: 1479-4713 + issue: 2 + issued: + date-parts: + - - 2016 + - 7 + keyword: Live coding, psychology of programming, notation, audiences, + algorithms + page: 201-206 + title: Code as information and code as spectacle + type: article-journal + URL: "https://doi.org/10.1080/14794713.2016.1227602" + volume: 12 +- abstract: The TidalCycles (or Tidal for short) live coding environment + has been developed since around 2009, via several rewrites of its + core representation. Rather than having fixed goals, this + development has been guided by use, motivated by the open aim to + make music. This development process can be seen as a long-form + improvisation, with insights into the nature of Tidal gained through + the process of writing it, feeding back to guide the next steps of + development. This brings the worrying thought that key insights will + have been missed along this development journey, that would + otherwise have lead to very different software. Indeed participants + at beginners' workshops that I have lead or co-lead have often asked + questions without good answers, because they made deficiencies or + missing features in the software clear. It is well known that a + beginner's mind is able to see much that an expert has become blind + to. Running workshops are an excellent way to find new development + ideas, but the present paper explores a different technique -- the + rewrite. + accessed: + date-parts: + - - 2022 + - 3 + - 24 + id: "https://zenodo.org/record/5788732" + issued: + date-parts: + - - 2021 + - 12 + keyword: live coding, algorithmic pattern, tidalcycles, haskell, + python + publisher-place: Valdivia, Chile + title: Alternate Timelines for TidalCycles + URL: "https://zenodo.org/record/5788732" +- abstract: A JavaScript dialect of its mini-notation for pattern is + created, enabling easy integration with creative coding tools and an + accompanying technique for visually annotating the playback of + TidalCycles patterns over time. TidalCycles has rapidly become the + most popular system for many styles of live coding performance, in + particular Algoraves. We created a JavaScript dialect of its + mini-notation for pattern, enabling easy integration with creative + coding tools. Our research pairs a formalism describing the + mini-notation with a small JavaScript library for generating events + over time; this library is suitable for generating events inside of + an AudioWorkletProcessor thread and for assisting with scheduling in + JavaScript environments more generally. We describe integrating the + library into the two live coding systems, Gibber and Hydra, and + discuss an accompanying technique for visually annotating the + playback of TidalCycles patterns over time. + accessed: + date-parts: + - - 2022 + - 4 + - 12 + author: + - family: Roberts + given: Charles + container-title: www.semanticscholar.org + id: "https://www.semanticscholar.org/paper/Bringing-the-TidalCycles-Mini-Notation-to-the-Roberts/74965efadd572ae3f40d14c633a5c8581c1b9f42" + issued: + date-parts: + - - 2019 + title: Bringing the TidalCycles Mini-Notation to the Browser + URL: "https://www.semanticscholar.org/paper/Bringing-the-TidalCycles-Mini-Notation-to-the-Roberts/74965efadd572ae3f40d14c633a5c8581c1b9f42" +- abstract: In this paper we introduce "version zero" of TidalVortex, an + alternative implementation of the TidalCycles live coding system, + using the Python programming language.  This is open-ended work, + exploring what happens when we try to extract the 'essence' of a + system like TidalCycles and translate it into another programming + language, while taking advantage of the affordance of its new host. + First, we review the substantial prior art in porting TidalCycles, + and in representing musical patterns in Python. We then compare + equivalent patterns written in Haskell (TidalCycles) and Python + (TidalVortex), and relate implementation details of how functional + reactive paradigms have translated from the pure functional, + strongly typed Haskell to the more multi-paradigm, dynamically typed + Python. Finally, we conclude with reflections and generalisable + outcomes. + accessed: + date-parts: + - - 2022 + - 4 + - 14 + id: "https://zenodo.org/record/6456380" + issued: + date-parts: + - - 2022 + - 4 + publisher-place: Limerick, Ireland + title: TidalVortex Zero + URL: "https://zenodo.org/record/6456380" +- abstract: This paper brings together two main perspectives on + algorithmic pattern. First, the writing of musical patterns in live + coding performance, and second, the weaving of patterns in textiles. + In both cases, algorithmic pattern is an interface between the human + and the outcome, where small changes have far-reaching impact on the + results. By bringing contemporary live coding and ancient textile + approaches together, we reach a common view of pattern as + algorithmic movement (e.g. looping, shifting, reflecting, + interfering) in the making of things. This works beyond the usual + definition of pattern used in musical interfaces, of mere repeating + sequences. We conclude by considering the place of algorithmic + pattern in a wider activity of making. + accessed: + date-parts: + - - 2022 + - 4 + - 15 + id: "https://zenodo.org/record/4299661" + issued: + date-parts: + - - 2020 + - 7 + keyword: pattern, tidalcycles, algorithmic music, textiles, live + coding, algorave + publisher-place: Birmingham UK + title: Algorithmic Pattern + URL: "https://zenodo.org/record/4299661" +- accessed: + date-parts: + - - 2022 + - 4 + - 15 + author: + - family: Charlie + given: Roberts + - family: Joann + given: Kuchera-Morin + container-title: International Computer Music Conference Proceedings + id: "https://quod.lib.umich.edu/i/icmc/bbp2372.2012.011/2/--gibber-live-coding-audio-in-the-browser?page_x61_root;size_x61_150;view_x61_text" + ISSN: 2223-3881 + issued: + date-parts: + - - 2012 + title: "GIBBER: LIVE CODING AUDIO IN THE BROWSER" + title-short: GIBBER + type: article-journal + URL: "https://quod.lib.umich.edu/i/icmc/bbp2372.2012.011/2/%E2%80%93gibber-live-coding-audio-in-the-browser?page=root;size=150;view=text" + volume: 2012 +- abstract: Estuary is a browser-based collaborative projectional + editing environment built on top of the popular TidalCycles language + for the live coding of musical pattern that includes a strict form + of structure editing, a click-only border-free approach to interface + design, and explicit notations to modulate the liveness of different + parts of the code. This paper describes the initial design and + development of Estuary, a browser-based collaborative projectional + editing environment built on top of the popular TidalCycles language + for the live coding of musical pattern. Key features of Estuary + include a strict form of structure editing (making syntactical + errors impossible), a click-only border-free approach to interface + design, explicit notations to modulate the liveness of different + parts of the code, and a server-based network collaboration system + that can be used for many simultaneous collaborative live coding + performances, as well as to present different views of the same live + coding activity. Estuary has been developed using Reflex-DOM, a + Haskell-based framework for web development whose strictness + promises robustness and security advantages. + accessed: + date-parts: + - - 2022 + - 4 + - 15 + author: + - family: Ogborn + given: David + - family: Beverley + given: J. + container-title: www.semanticscholar.org + id: "https://www.semanticscholar.org/paper/Estuary_x37_3A-Browser-based-Collaborative-Projectional-Ogborn-Beverley/c6b5d34575d6230dfd8751ca4af8e5f6e44d916b" + issued: + date-parts: + - - 2017 + title: "Estuary: Browser-based Collaborative Projectional Live Coding + of Musical Patterns" + title-short: Estuary + URL: "https://www.semanticscholar.org/paper/Estuary%3A-Browser-based-Collaborative-Projectional-Ogborn-Beverley/c6b5d34575d6230dfd8751ca4af8e5f6e44d916b" +- abstract: This is an improvised, from-scratch live coding performance. + The NIME interface which this performance showcases is the new + Feedfoward editor for the TidalCycles live coding environment. + Feedforward is written in Haskell using the ncurses library for + terminal-based user interfaces. It runs on low-powered hardware + including the Raspberry Pi Zero, with formative testing of + prototypes conducted with several groups of children between the + ages of 8 and 14. Feedforward has a number of features designed to + support improvised, multi-pattern live coding. Individual Tidal + patterns are addressable with hotkeys for fast mute and unmuting. + Each pattern has a stereo VU meter, to aid the quick matching of + sound to pattern within a mix. In addition, TidalCycles has been + extended to store context with each event, so that source code + positions in its polyrhythmic sequence mini-notation are tracked. + This allows steps to be highlighted in the source code when- ever + they are active. This works even when Tidal combinators have been + applied to manipulate the timeline. Formal evaluation has yet to + take place, but this feature appears to support learning of how + pattern manipulations work in Tidal. Feedforward and TidalCycles is + free/open source software under a GPL licence version 3.0. + accessed: + date-parts: + - - 2022 + - 4 + - 15 + id: "https://zenodo.org/record/6353969" + issued: + date-parts: + - - 2020 + - 7 + publisher-place: Birmingham + title: Feedforward + URL: "https://zenodo.org/record/6353969" +title: "Strudel: Algorithmic Patterns for the Web" +url2cite: all-links +--- + +# Introduction + +This paper introduces StrudelCycles (generally known as just 'Strudel', +including in the following), an alternative implementation of the +TidalCycles live coding system, using the JavaScript programming +language. It is an attempt to make live coding more accessible through +creating a system that runs entirely in the browser, while opening +Tidal's approach to algorithmic patterns +[@https://zenodo.org/record/4299661] up to modern audio/visual web +technologies. The Strudel REPL is a live code editor dedicated to +manipulating strudel patterns while they play, with builtin visual +feedback. While Strudel is written in JavaScript, the API is optimized +for simplicity and readability by applying code transformations on the +syntax tree level, allowing language operations that would otherwise be +impossible. The application supports multiple ways to output sound, +including Tone.js, Web Audio nodes, OSC messages and WebMIDI. The +project is split into multiple packages, allowing granular reuse in +other applications. Apart from TidalCycles, it draws inspiration from +prior projects like TidalVortex [@https://zenodo.org/record/6456380], +Gibber +[@{https://quod.lib.umich.edu/i/icmc/bbp2372.2012.011/2/–gibber-live-coding-audio-in-the-browser?page_x61_root;size_x61_150;view_x61_text}], +Estuary +[@https://www.semanticscholar.org/paper/Estuary_x37_3A-Browser-based-Collaborative-Projectional-Ogborn-Beverley/c6b5d34575d6230dfd8751ca4af8e5f6e44d916b] +and Feedforward [@https://zenodo.org/record/6353969]. + +# Porting from Haskell + +The original TidalCycles (generally known as just 'Tidal') is +implemented as a domain specific language (DSL), embedded in the Haskell +pure functional programming language, taking advantage of Haskell's +terse syntax and advanced, 'strong' type system. Javascript on the other +hand, is a multi-paradigm programming language, with a dynamic type +system. Because Tidal leans heavily on many of Haskell's more unique +features, it was not clear whether it could meaningfully be ported to a +multi-paradigm scripting language. However, this already proved to be +the case with an earlier port to Python \[TidalVortex; +@https://zenodo.org/record/6456380\], and we successfully implemented +Tidal's pure functional representation of patterns in Strudel, including +partial application, and functor, applicative and monad structures. Over +the past few months since the project started in January 2022, a large +part of Tidal's functionality has already been ported, including it's +mini-notation for polymetric sequences, and a large part of its library +of pattern manipulations. The result is a terse and highly composable +system, where just about everything is a pattern, that may be +transformed and combined with other patterns in a myriad of ways. + +# Representing Patterns + +The essence of Tidal are Patterns. Patterns are abstract entities that +represent flows of time as functions, by adapting a technique called +pure functional reactive programming. Taking a time span as its input, a +Pattern can output a set of events that happen within that time span. It +depends on the structure of the Pattern how the events are located in +time. From now on, this process of generating events from a time span +will be called **querying**. Example: + + e.show()))`} /> + +In this example, we create a pattern using the `sequence` function and +**query** it for the timespan from `0` to `1`. Those numbers represent +units of time called **cycles**. The length of one cycle depends on the +tempo, which defaults to one cycle per second. The resulting events are: + + + +Each event has a value, a begin time and an end time, where time is +represented as a fraction. In the above case, the events are placed in +sequential order, where c3 takes the first half, and e3 and g3 together +take the second half. This temporal placement is the result of the +`sequence` function, which divides its arguments equally over one cycle. +If an argument is an array, the same rule applies to that part of the +cycle. In the example, e3 and g3 are divided equally over the second +half of the whole cycle. + +In the REPL, the user only has to type in the pattern itself, the +querying will be handled by the scheduler. The scheduler will repeatedly +query the pattern for events, which then will be used for playback. + +# Making Patterns + +In practice, the end-user live coder will not deal with constructing +patterns directly, but will rather build patterns using Strudel's +extensive combinator library to create, combine and transform patterns. + +The live coder may use the `sequence` function as already seen above, or +more often the mini-notation for even terser notation of rhythmic +sequences. Such sequences are often treated only a starting point for +manipulation, where they then are undergo pattern transformations such +as repetition, symmetry, interference or randomisation, potentially at +multiple timescales. Because Strudel patterns are represented as pure +functions of time rather than as data structures, very long and complex +generative results can be represented and manipulated without having to +store the resulting sequences in memory. + +# Pattern Example + +The following example showcases how patterns can be utilized to create +musical complexity from simple parts, using repetition and interference: + +".scale('D minor') +.off(1/4, scaleTranspose(2)) +.off(1/2, scaleTranspose(6)) +.legato(.5) +.echo(4, 1/8, .5) +.tone((await piano()).chain(out())) +.pianoroll()`} /> + +The pattern starts with a rhythm of numbers in mini notation, which are +interpreted inside the scale of D minor. Without the scale function, the +first line can be expressed as: + +"`} /> + +This line could also be expressed without mini notation: + + + +- slowcat: play elements sequentially, where each lasts one cycle + +- brackets: elements inside brackets are divided equally over the time + of their parent + +- euclid(p, s, o): place p pulses evenly over s steps, with offset o, + see + https://taogaede.com/wp-content/uploads/2020/01/Research-Paper-on-Euclidean-Rhythms-Aug.-2018-Edit.pdf + (cite) + +- fast(n): speed up by n. `g3.fast(2)` will play g3 two times. + +- off(n, f): copy each event, offset it by n cycles and apply function + f + +- legato(n): multiply duration of event with n + +- echo(t, n, v): copy each event t times, with n cycles in between + each copy, decreasing velocity by v + +- tone(instrument): play back each event with the given Tone.js + instrument + +- pianoroll(): visualize events as midi notes in a pianoroll + +- Description of structure of demo + +- Links to examples/existing tutorial etc + +# Technical requirements + +Space for one laptop + small audio interface (\~20 cm x 20cm), with +mains power. Stereo sound system, either placed behind presenter (for +direct monitoring) or with additional stereo monitors. Audio from audio +interface: stereo pair 6,3mm jack outputs (balanced?) good question :) +\* Projector / screen (HDMI.) + +# Acknowledgments + +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\]. + +# References diff --git a/paper/demo.md b/paper/demo.md new file mode 100644 index 00000000..0d7f2c30 --- /dev/null +++ b/paper/demo.md @@ -0,0 +1,119 @@ +--- +title: 'Strudel: Algorithmic Patterns for the Web' +date: '2022-04-15' +url2cite: all-links +--- + +# Introduction + +This paper introduces StrudelCycles (generally known as just 'Strudel', including in the following), an alternative implementation of the TidalCycles live coding system, using the JavaScript programming language. It is an attempt to make live coding more accessible through creating a system that runs entirely in the browser, while opening Tidal's approach to algorithmic patterns [@algorithmicpattern] up to modern audio/visual web technologies. The Strudel REPL is a live code editor dedicated to manipulating strudel patterns while they play, with builtin visual feedback. While Strudel is written in JavaScript, the API is optimized for simplicity and readability by applying code transformations on the syntax tree level, allowing language operations that would otherwise be impossible. The application supports multiple ways to output sound, including Tone.js, Web Audio nodes, OSC messages and WebMIDI. The project is split into multiple packages, allowing granular reuse in other applications. Apart from TidalCycles, it draws inspiration from prior projects like TidalVortex [@tidalvortex], Gibber [@gibber], Estuary [@estuary] and Feedforward [@feedforward]. + +# Porting from Haskell + +The original TidalCycles (generally known as just 'Tidal') is implemented as a domain specific language (DSL), embedded in the Haskell pure functional programming language, taking advantage of Haskell's terse syntax and advanced, 'strong' type system. Javascript on the other hand, is a multi-paradigm programming language, with a dynamic type system. Because Tidal leans heavily on many of Haskell's more unique features, it was not clear whether it could meaningfully be ported to a multi-paradigm scripting language. However, this already proved to be the case with an earlier port to Python [TidalVortex; @tidalvortex], and we successfully implemented Tidal's pure functional representation of patterns in Strudel, including partial application, and functor, applicative and monad structures. Over the past few months since the project started in January 2022, a large part of Tidal's functionality has already been ported, including it's mini-notation for polymetric sequences, and a large part of its library of pattern manipulations. The result is a terse and highly composable system, where just about everything is a pattern, that may be transformed and combined with other patterns in a myriad of ways. + +# Representing Patterns + +The essence of Tidal are Patterns. Patterns are abstract entities that represent flows of time as functions, by adapting a technique called pure functional reactive programming. +Taking a time span as its input, a Pattern can output a set of events that happen within that time span. +It depends on the structure of the Pattern how the events are located in time. +From now on, this process of generating events from a time span will be called **querying**. +Example: + +```js +const pattern = sequence(c3, [e3, g3]); +const events = pattern.query(0, 1); +console.log(events.map(e => e.show())) +``` + +In this example, we create a pattern using the `sequence` function and **query** it for the timespan from `0` to `1`. +Those numbers represent units of time called **cycles**. The length of one cycle depends on the tempo, which defaults to one cycle per second. +The resulting events are: + +```js +[{ value: 'c3', begin: 0, end: 1/2 }, +{ value: 'e3', begin: 1/2, end: 3/4 }, +{ value: 'g3', begin: 3/4, end: 1 }] +``` + +Each event has a value, a begin time and an end time, where time is represented as a fraction. +In the above case, the events are placed in sequential order, where c3 takes the first half, and e3 and g3 together take the second half. +This temporal placement is the result of the `sequence` function, which divides its arguments equally over one cycle. +If an argument is an array, the same rule applies to that part of the cycle. In the example, e3 and g3 are divided equally over the second half of the whole cycle. + +In the REPL, the user only has to type in the pattern itself, the querying will be handled by the scheduler. +The scheduler will repeatedly query the pattern for events, which then will be used for playback. + +# Making Patterns + +In practice, the end-user live coder will not deal with constructing patterns directly, but will rather build patterns using Strudel's extensive combinator library to create, combine and transform patterns. + +The live coder may use the `sequence` function as already seen above, or more often the mini-notation for even terser notation of rhythmic sequences. Such sequences are often treated only a starting point for manipulation, where they then are undergo pattern transformations such as repetition, symmetry, interference or randomisation, potentially at multiple timescales. Because Strudel patterns are represented as pure functions of time rather than as data structures, very long and complex generative results can be represented and manipulated without having to store the resulting sequences in memory. + +# Pattern Example + +The following example showcases how patterns can be utilized to create musical complexity from simple parts, using repetition and interference: + +```js +"<0 2 [4 6](3,4,1) 3*2>".scale('D minor') +.off(1/4, scaleTranspose(2)) +.off(1/2, scaleTranspose(6)) +.legato(.5) +.echo(4, 1/8, .5) +.tone((await piano()).chain(out())) +.pianoroll() +``` + +The pattern starts with a rhythm of numbers in mini notation, which are interpreted inside the scale of D minor. +Without the scale function, the first line can be expressed as: + +```js +"" +``` + +This line could also be expressed without mini notation: + +```js +slowcat(d3, f3, [a3, c3].euclid(3, 4, 1), g3.fast(2)) +``` + +- slowcat: play elements sequentially, where each lasts one cycle +- brackets: elements inside brackets are divided equally over the time of their parent +- euclid(p, s, o): place p pulses evenly over s steps, with offset o, see https://taogaede.com/wp-content/uploads/2020/01/Research-Paper-on-Euclidean-Rhythms-Aug.-2018-Edit.pdf (cite) +- fast(n): speed up by n. `g3.fast(2)` will play g3 two times. +- off(n, f): copy each event, offset it by n cycles and apply function f +- legato(n): multiply duration of event with n +- echo(t, n, v): copy each event t times, with n cycles in between each copy, decreasing velocity by v +- tone(instrument): play back each event with the given Tone.js instrument +- pianoroll(): visualize events as midi notes in a pianoroll + +* Description of structure of demo +* Links to examples/existing tutorial etc + +# Technical requirements + +Space for one laptop + small audio interface (~20 cm x 20cm), with mains power. +Stereo sound system, either placed behind presenter (for direct monitoring) or with additional stereo monitors. +Audio from audio interface: stereo pair 6,3mm jack outputs (balanced?) good question :) + * Projector / screen (HDMI.) + +# Acknowledgments + +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]. + +# References + +[@roberts2016]: https://www.tandfonline.com/doi/abs/10.1080/14794713.2016.1227602?journalCode=rpdm20 +[@gibber]: https://quod.lib.umich.edu/i/icmc/bbp2372.2012.011/2/--gibber-live-coding-audio-in-the-browser?page=root;size=150;view=text +[@alternate-timelines]: https://zenodo.org/record/5788732 +[@tidal.pegjs]: https://www.semanticscholar.org/paper/Bringing-the-TidalCycles-Mini-Notation-to-the-Roberts/74965efadd572ae3f40d14c633a5c8581c1b9f42 +[@tidalvortex]: https://zenodo.org/record/6456380 +[@estuary]: https://www.semanticscholar.org/paper/Estuary%3A-Browser-based-Collaborative-Projectional-Ogborn-Beverley/c6b5d34575d6230dfd8751ca4af8e5f6e44d916b +[@tidalcycles]: https://dl.acm.org/doi/10.1145/2633638.2633647 +[@hession]: https://www.scopus.com/record/display.uri?eid=2-s2.0-84907386880&origin=inward&txGid=03307e26fba02a27bdc68bda462016f6266316467_Extending_Instruments_with_Live_Algorithms_in_a_Percussion_Code_Duo +[@spiegel]: https://www.academia.edu/664807/Manipulations_of_musical_patterns +[@bel]: https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.517.7129 +[@algorithmicpattern]: https://zenodo.org/record/4299661 +[@fabricating]: https://zenodo.org/record/2155745 +[@cyclic-patterns]: https://zenodo.org/record/1548969 +[@feedforward]: https://zenodo.org/record/6353969 diff --git a/paper/demo.pdf b/paper/demo.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8b902d7eef30c47c8e3ad4bc97f681b44844b76b GIT binary patch literal 54800 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 Uz}W=|l9QDI0|f-MjJ1LP1$AkhT>t<8 literal 0 HcmV?d00001 diff --git a/paper/make.sh b/paper/make.sh index 0abdda34..18f36526 100755 --- a/paper/make.sh +++ b/paper/make.sh @@ -6,12 +6,12 @@ fi # --template=templates/template.latex \ -pandoc -s paper.md \ +pandoc -s demo.md \ --from markdown+auto_identifiers --pdf-engine=xelatex --template tex/latex-template.tex -V colorlinks --number-sections \ --filter=pandoc-url2cite --citeproc --pdf-engine=xelatex \ - --dpi=300 -o paper.pdf + --dpi=300 -o demo.pdf -pandoc -s paper.md --filter bin/code-filter.py --filter=pandoc-url2cite \ +pandoc -s demo.md --filter bin/code-filter.py --filter=pandoc-url2cite \ --citeproc \ -t markdown-citations -t markdown-fenced_divs \ - -o paper-preprocessed.md + -o demo-preprocessed.md diff --git a/paper/tex/latex-template.tex b/paper/tex/latex-template.tex index e972a843..cd0c859d 100755 --- a/paper/tex/latex-template.tex +++ b/paper/tex/latex-template.tex @@ -84,30 +84,30 @@ \setcopyright{waclicense} -\conferenceinfo{Web Audio Conference WAC-2022,}{December 6--8, 2022, Cannes, France.} +\conferenceinfo{Web Audio Conference WAC-2022,}{July 6--8, 2022, Cannes, France.} \CopyrightYear{2022} -\title{Strudel} +\title{Strudel: Algorithmic Patterns for the Web} \numberofauthors{2} \author{ \alignauthor \name{Felix Roos} - \affaddr{Affiliation?} - \email{x@x.com} + \affaddr{Lembach, France} + \email{flix91@gmail.com} % 2nd. author \alignauthor \name{Alex McLean} - \affaddr{Then Try This\\ Sheffield/Penryn} + \affaddr{Then Try This\\ Sheffield/Penryn, UK} \email{alex@slab.org} } \maketitle \begin{sloppypar} -\begin{abstract} -Abstract goes here (find me in the latex template) -\end{abstract} +%\begin{abstract} +%Abstract goes here (find me in the latex template) +%\end{abstract} \end{sloppypar} $body$