strudel-docker/paper/demo-preprocessed.md
2022-04-15 08:55:53 +01:00

18 KiB
Raw Blame History

date, references, title, url2cite
date references title url2cite
2022-04-15
abstract accessed author container-title DOI id ISSN issue issued keyword page title type URL volume
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.
date-parts
2022
3
24
family given
Roberts Charles
International Journal of Performance Arts and Digital Media 10.1080/14794713.2016.1227602 https://www.tandfonline.com/doi/abs/10.1080/14794713.2016.1227602?journalCode_x61_rpdm20 1479-4713 2
date-parts
2016
7
Live coding, psychology of programming, notation, audiences, algorithms 201-206 Code as information and code as spectacle article-journal https://doi.org/10.1080/14794713.2016.1227602 12
abstract accessed id issued keyword publisher-place title URL
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.
date-parts
2022
3
24
https://zenodo.org/record/5788732
date-parts
2021
12
live coding, algorithmic pattern, tidalcycles, haskell, python Valdivia, Chile Alternate Timelines for TidalCycles https://zenodo.org/record/5788732
abstract accessed author container-title id issued title URL
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.
date-parts
2022
4
12
family given
Roberts Charles
www.semanticscholar.org https://www.semanticscholar.org/paper/Bringing-the-TidalCycles-Mini-Notation-to-the-Roberts/74965efadd572ae3f40d14c633a5c8581c1b9f42
date-parts
2019
Bringing the TidalCycles Mini-Notation to the Browser https://www.semanticscholar.org/paper/Bringing-the-TidalCycles-Mini-Notation-to-the-Roberts/74965efadd572ae3f40d14c633a5c8581c1b9f42
abstract accessed id issued publisher-place title URL
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.
date-parts
2022
4
14
https://zenodo.org/record/6456380
date-parts
2022
4
Limerick, Ireland TidalVortex Zero https://zenodo.org/record/6456380
abstract accessed id issued keyword publisher-place title URL
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.
date-parts
2022
4
15
https://zenodo.org/record/4299661
date-parts
2020
7
pattern, tidalcycles, algorithmic music, textiles, live coding, algorave Birmingham UK Algorithmic Pattern https://zenodo.org/record/4299661
accessed author container-title id ISSN issued title title-short type URL volume
date-parts
2022
4
15
family given
Charlie Roberts
family given
Joann Kuchera-Morin
International Computer Music Conference Proceedings 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 2223-3881
date-parts
2012
GIBBER: LIVE CODING AUDIO IN THE BROWSER GIBBER article-journal 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 2012
abstract accessed author container-title id issued title title-short URL
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.
date-parts
2022
4
15
family given
Ogborn David
family given
Beverley J.
www.semanticscholar.org https://www.semanticscholar.org/paper/Estuary_x37_3A-Browser-based-Collaborative-Projectional-Ogborn-Beverley/c6b5d34575d6230dfd8751ca4af8e5f6e44d916b
date-parts
2017
Estuary: Browser-based Collaborative Projectional Live Coding of Musical Patterns Estuary https://www.semanticscholar.org/paper/Estuary%3A-Browser-based-Collaborative-Projectional-Ogborn-Beverley/c6b5d34575d6230dfd8751ca4af8e5f6e44d916b
abstract accessed id issued publisher-place title URL
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.
date-parts
2022
4
15
https://zenodo.org/record/6353969
date-parts
2020
7
Birmingham Feedforward https://zenodo.org/record/6353969
Strudel: Algorithmic Patterns for the Web 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:

<MiniRepl tune={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:

<MiniRepl tune={[{ 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:

<MiniRepl tune={"<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:

<MiniRepl tune={"<d3 f3 [a3 c3](3, 4, 1) g3*2>"} />

This line could also be expressed without mini notation:

<MiniRepl tune={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