fix citations, build
This commit is contained in:
parent
b80d7d226b
commit
d5957035fa
4 changed files with 290 additions and 60 deletions
|
|
@ -242,30 +242,98 @@ references:
|
|||
publisher-place: Birmingham
|
||||
title: Feedforward
|
||||
URL: "https://zenodo.org/record/6353969"
|
||||
- abstract: The Euclidean algorithm (which comes down to us from
|
||||
Euclid's Elements) computes the greatest common divisor of two given
|
||||
integers. It is shown here that the structure of the Euclidean
|
||||
algorithm may be used to automatically generate, very efficiently, a
|
||||
large family of rhythms used as timelines (rhythmic ostinatos), in
|
||||
traditional world music. These rhythms, here dubbed Euclidean
|
||||
rhythms, have the property that their onset patterns are distributed
|
||||
as evenly as possible in a mathematically precise sense, and optimal
|
||||
manner. Euclidean rhythms are closely related to the family of Aksak
|
||||
rhythms studied by ethnomusicologists, and occur in a wide variety
|
||||
of other disciplines as well. For example they characterize
|
||||
algorithms for drawing digital straight lines in computer graphics,
|
||||
as well as algorithms for calculating leap years in calendar design.
|
||||
Euclidean rhythms also find application in nuclear physics
|
||||
accelerators and in computer science, and are closely related to
|
||||
several families of words and sequences of interest in the study of
|
||||
the combinatorics of words, such as mechanical words, Sturmian
|
||||
words, two-distance sequences, and Euclidean strings, to which the
|
||||
Euclidean rhythms are compared. 1.
|
||||
accessed:
|
||||
date-parts:
|
||||
- - 2022
|
||||
- 4
|
||||
- 24
|
||||
author:
|
||||
- family: Toussaint
|
||||
given: Godfried
|
||||
container-title: "In Proceedings of BRIDGES: Mathematical Connections
|
||||
in Art, Music and Science"
|
||||
id: "https://citeseerx.ist.psu.edu/viewdoc/summary?doi_x61_10.1.1.72.1340"
|
||||
issued:
|
||||
date-parts:
|
||||
- - 2005
|
||||
page: 47-56
|
||||
title: The Euclidean algorithm generates traditional musical rhythms
|
||||
type: paper-conference
|
||||
URL: "https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.72.1340"
|
||||
- accessed:
|
||||
date-parts:
|
||||
- - 2022
|
||||
- 4
|
||||
- 24
|
||||
container-title: webaudioconf.com
|
||||
id: "https://webaudioconf.com/posts/2021_8/"
|
||||
title: "WAC Glicol: A Graph-oriented Live Coding Language Developed
|
||||
with Rust, WebAssembly and AudioWorklet"
|
||||
title-short: WAC Glicol
|
||||
URL: "https://webaudioconf.com/posts/2021_8/"
|
||||
- accessed:
|
||||
date-parts:
|
||||
- - 2022
|
||||
- 4
|
||||
- 24
|
||||
container-title: webaudioconf.com
|
||||
id: "https://webaudioconf.com/posts/2019_38/"
|
||||
title: "WAC FAUST online IDE: Dynamically compile and publish FAUST
|
||||
code as WebAudio Plugins"
|
||||
title-short: WAC FAUST online IDE
|
||||
URL: "https://webaudioconf.com/posts/2019_38/"
|
||||
- abstract: Strudel REPL
|
||||
accessed:
|
||||
date-parts:
|
||||
- - 2022
|
||||
- 4
|
||||
- 24
|
||||
container-title: strudel.tidalcycles.org
|
||||
id: "https://strudel.tidalcycles.org"
|
||||
title: Strudel REPL
|
||||
URL: "https://strudel.tidalcycles.org/"
|
||||
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
|
||||
This paper introduces Strudel (or sometimes 'StrudelCycles'), an
|
||||
alternative implementation of the Tidal (or 'TidalCycles') live coding
|
||||
system, using the JavaScript programming language. Strudel is an attempt
|
||||
to make live coding more accessible, by 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
|
||||
including Tone.js, Web Audio nodes, OSC (Open Sound Control) messages,
|
||||
Web Serial and Web MIDI. The project is split into multiple packages,
|
||||
allowing granular reuse in other applications. Apart from TidalCycles,
|
||||
Strudel 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]
|
||||
|
|
@ -273,29 +341,29 @@ 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.
|
||||
The original 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 always clear that 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 have now
|
||||
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
|
||||
Patterns are the essence of Tidal. Its patterns are abstract entities
|
||||
that represent flows of time as functions, 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
|
||||
|
|
@ -307,7 +375,7 @@ 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
|
||||
**query** it for the time span 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:
|
||||
|
||||
|
|
@ -367,42 +435,65 @@ 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
|
||||
Here is a short description of all the functions used:
|
||||
|
||||
- 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)
|
||||
|
||||
- euclid(p, s, o): place p pulses evenly over s steps, with offset o
|
||||
[@https://citeseerx.ist.psu.edu/viewdoc/summary?doi_x61_10.1.1.72.1340]
|
||||
- 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
|
||||
# Future Outlook
|
||||
|
||||
- Links to examples/existing tutorial etc
|
||||
The project is still young, with many features on the horizon. As
|
||||
general guiding principles, Strudel aims to be
|
||||
|
||||
1. accessible
|
||||
2. as compatible as possible with Tidal
|
||||
3. modular and extensible
|
||||
|
||||
The main accessibility advantage over Tidal is the zero install browser
|
||||
environment. While OSC output to SuperCollider is possible with Strudel,
|
||||
it requires the user to install SuperCollider with a custom setup
|
||||
script, which is not trivial. Without OSC output, Strudel is able to
|
||||
output sound inside the browser via Tone.js, which is a major limiting
|
||||
factor, both in terms of available features and runtime performance. For
|
||||
the future, it is planned to integrate alternative sound engines, with
|
||||
possible candidates being like glicol
|
||||
[@{https://webaudioconf.com/posts/2021_8/}] or faust
|
||||
[@{https://webaudioconf.com/posts/2019_38/}]. To improve compatibility
|
||||
with Tidal, more Tidal functions are planned to be ported, as well as
|
||||
full compatibility with Tidal's SuperDirt synth. Besides sound output,
|
||||
other ways to render events will be explored, such as graphical, serial
|
||||
or kinetic output.
|
||||
|
||||
# Links
|
||||
|
||||
The Strudel REPL is available at [https://strudel.tidalcycles.org
|
||||
[@https://strudel.tidalcycles.org]](https://strudel.tidalcycles.org){.uri
|
||||
cite-meta="{\"URL\":\"https://strudel.tidalcycles.org/\",\"abstract\":\"Strudel REPL\",\"accessed\":{\"date-parts\":[[2022,4,24]]},\"container-title\":\"strudel.tidalcycles.org\",\"id\":\"https://strudel.tidalcycles.org\",\"title\":\"Strudel REPL\",\"type\":\"\"}"},
|
||||
including an interactive tutorial. The repository is at
|
||||
\<github.com/tidalcycles/strudel\>, all the code is open source under
|
||||
the GPL-3.0 License.
|
||||
|
||||
# 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.)
|
||||
- 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)
|
||||
- Projector / screen (HDMI.)
|
||||
|
||||
# Acknowledgments
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue