mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-11 05:38:34 +00:00
fix citations, build
This commit is contained in:
parent
b80d7d226b
commit
d5957035fa
@ -386,6 +386,145 @@
|
||||
"title": "Feedforward",
|
||||
"type": ""
|
||||
}
|
||||
},
|
||||
"https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.72.1340": {
|
||||
"fetched": "2022-04-24T21:09:16.724Z",
|
||||
"bibtex": [
|
||||
"",
|
||||
"@inproceedings{toussaint_euclidean_2005,",
|
||||
" title = {The {Euclidean} algorithm generates traditional musical rhythms},",
|
||||
" url = {https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.72.1340},",
|
||||
" 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.},",
|
||||
" urldate = {2022-04-24},",
|
||||
" booktitle = {In {Proceedings} of {BRIDGES}: {Mathematical} {Connections} in {Art}, {Music} and {Science}},",
|
||||
" author = {Toussaint, Godfried},",
|
||||
" year = {2005},",
|
||||
" pages = {47--56},",
|
||||
"}",
|
||||
""
|
||||
],
|
||||
"csl": {
|
||||
"URL": "https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.72.1340",
|
||||
"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"
|
||||
}
|
||||
},
|
||||
"https://webaudioconf.com/posts/2021_8/": {
|
||||
"fetched": "2022-04-24T21:14:10.409Z",
|
||||
"bibtex": [
|
||||
"",
|
||||
"@misc{noauthor_wac_nodate,",
|
||||
" title = {{WAC} {\\textbar} {Glicol}: {A} {Graph}-oriented {Live} {Coding} {Language} {Developed} with {Rust}, {WebAssembly} and {AudioWorklet}},",
|
||||
" url = {https://webaudioconf.com/posts/2021_8/},",
|
||||
" urldate = {2022-04-24},",
|
||||
" journal = {webaudioconf.com},",
|
||||
"}",
|
||||
""
|
||||
],
|
||||
"csl": {
|
||||
"URL": "https://webaudioconf.com/posts/2021_8/",
|
||||
"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",
|
||||
"type": ""
|
||||
}
|
||||
},
|
||||
"https://webaudioconf.com/posts/2019_38/": {
|
||||
"fetched": "2022-04-24T21:14:46.954Z",
|
||||
"bibtex": [
|
||||
"",
|
||||
"@misc{noauthor_wac_nodate,",
|
||||
" title = {{WAC} {\\textbar} {FAUST} online {IDE}: dynamically compile and publish {FAUST} code as {WebAudio} {Plugins}},",
|
||||
" url = {https://webaudioconf.com/posts/2019_38/},",
|
||||
" urldate = {2022-04-24},",
|
||||
" journal = {webaudioconf.com},",
|
||||
"}",
|
||||
""
|
||||
],
|
||||
"csl": {
|
||||
"URL": "https://webaudioconf.com/posts/2019_38/",
|
||||
"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",
|
||||
"type": ""
|
||||
}
|
||||
},
|
||||
"https://strudel.tidalcycles.org": {
|
||||
"fetched": "2022-04-24T21:14:47.822Z",
|
||||
"bibtex": [
|
||||
"",
|
||||
"@misc{noauthor_strudel_nodate,",
|
||||
" title = {Strudel {REPL}},",
|
||||
" url = {https://strudel.tidalcycles.org/},",
|
||||
" abstract = {Strudel REPL},",
|
||||
" urldate = {2022-04-24},",
|
||||
" journal = {strudel.tidalcycles.org},",
|
||||
"}",
|
||||
""
|
||||
],
|
||||
"csl": {
|
||||
"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": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
|
||||
|
||||
@ -6,15 +6,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].
|
||||
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 [@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 (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 [@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.
|
||||
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; @tidalvortex], 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 pure functional reactive programming.
|
||||
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 time.
|
||||
From now on, this process of generating events from a time span will be called **querying**.
|
||||
@ -26,7 +26,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`.
|
||||
In this example, we create a pattern using the `sequence` function and **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:
|
||||
|
||||
@ -133,6 +133,6 @@ Thanks to the Strudel and wider Tidal, live coding, webaudio and free/open sourc
|
||||
[@fabricating]: https://zenodo.org/record/2155745
|
||||
[@cyclic-patterns]: https://zenodo.org/record/1548969
|
||||
[@feedforward]: https://zenodo.org/record/6353969
|
||||
[@godfried]: http://cgm.cs.mcgill.ca/~godfried/publications/banff-extended.pdf
|
||||
[@glicol]: https://webaudioconf2021.com/wp-content/uploads/2021/06/Glicol_WAC_paper.pdf
|
||||
[@faust]: https://ccrma.stanford.edu/~rmichon/publications/doc/WAC-19-ide.pdf
|
||||
[@godfried]: https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.72.1340
|
||||
[@glicol]: https://webaudioconf.com/posts/2021_8/
|
||||
[@faust]: https://webaudioconf.com/posts/2019_38/
|
||||
|
||||
BIN
paper/demo.pdf
BIN
paper/demo.pdf
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user