Strudel Blog

Welcome to the Strudel Blog, where we will keep you updated with the latest changes and things happening in the strudelsphere. You can subscribe to this blog using this rss link

Release Notes v1.0.0

These are the release notes for Strudel 1.0.0 aka “Geburtstagskuchen”

This release marks the 2 year anniversary of the project, the first commit was on the 22nd January 2022 by Alex McLean.

If you generally need a heads up on what happened to Strudel in the last year, read the 2023 recap

A lot has happened since then, and also since the last release 16 weeks ago.

Let me write up some of the highlights:

Breaking Change

This version changes the default cps value from 1 to 0.5 to give patterns a little bit more time by default. If you find your existing patterns to be suddenly half the speed, just add a setcps(1) to the top and it should sound as it did before!

New Domain

Strudel is now available under strudel.cc. The old domain still works but you might not get the most recent version.

Strudel on Mastodon

Strudel now has a mastodon presence: https://social.toplap.org/@strudel

New Audio Engine Features

superdough, the audio engine of strudel has gotten some new features:

Slider Controls

The new slider function inlines a draggable slider element into the code, bridging the gap between code and GUI.

Improved MIDI integration

Pattern params can now be controlled with cc messages + you can now send a MIDI clock to sync your DAW with strudel.

hydra

hydra, the live coding video synth can now be used directly inside the strudel REPL.

Vanilla REPL

The codemirror editor and the repl abstraction have been refactored from react to vanilla JS! This should give some performance improvements and less dependency / maintenance burden:

Doc Changes

Plenty of things have been added to the docs, including a showcase of what people have been done with strudel and the new Community Bakery!

show PRs

Other Features

There is a lot more

Other Fixes

show

New Contributors

Full Changelog: https://github.com/tidalcycles/strudel/compare/v0.9.0…v1.0.0

2 Years of Strudel

Strudel is now 2 years old! This was the first commit to the strudel repo:

commit 38b5a0d5cdf28685b2b5e18d460772b70246207b
Author: Alex McLean <alex@slab.org>
Date:   Sat Jan 22 20:24:36 2022 +0000

Initial commit

I have already written these 2 posts about the first year of strudel:

To continue that tradition, let me recap what happened around Strudel in 2023, at least what I have noticed:

ICLC 2023

I presented strudel at the International Conference on Live Coding (ICLC), which took place in April in Utrecht. Here is the (pretty technical) video of my presentation:

For the conference, I wrote a paper with Alex McLean, called Strudel: Live Coding Patterns on the Web. For me personally, this was my first major contact with the live coding scene and it was a very memorable experience!

Workshops and Courses

A lot of workshops have been using strudel in the last year, from many parts of the world: Iceland, UK, Japan, France and the US (probably more I’ve missed). I’ve also given workshops in Switzerland and Germany, where we even had real strudel, thanks to TOPLAP Karlsruhe!

strudel workshop space

Additionally, there is now a Creative Coding course at Chalmers in Sweden, consisting of “a 10-week series of workshops […] for younger girls to have fun and experiment with code and music”. I was very delighted to see this video of the girls having fun with Strudel:

The course was also encompassed by a study on female empowerement through Creative Coding, read more in Jasmina Maric’s paper “Singing Code”.

Another bigger installment was the (Algo|Afro) Futures programme led by Antonio Roberts, which is “a mentoring programme for early career Black artists who want to explore creative coding and live coding”. For the final concert they recorded this amazing live stream:

I am so happy to see that the project I’ve co-created has had such an impact already, making live coding workshops more easy and accessible. In my opinion, the reasons why people seem to choose strudel for teaching are:

  • it does not require an installation, so it even runs on your phone / tablet or a chromebook
  • in-code and behind-code visualizations help learners to understand what the system is doing
  • the interactive documentation
  • the simple javascript syntax, which is very similar to hydra
  • tidal’s mini notation for playful expression of rhythms (based on the Bol Processor’s polymetric expressions)
  • its range of functions for transforming patterns for those getting deeper into exploring strange rhythms

Performances

strudel performance

People are starting to use Strudel for performances, many of which can be watched in the new Showcase! The above photo comes from the Mars College Department of Future Music

New Features

Let’s talk about some of the major features that landed since last year.

Audio Engine Improved

The audio engine has gotten a lot of attention! Once integrated into Strudel itself, the engine has been pulled out and named superdough, the name being based on SuperDirt, which is the audio engine of Tidal. Superdough is now also used by topos, a creation of Raphaël Forment, who helped me implement a bunch of new features. Lately, Jade Rowland has also developed many synthesis features into superdough! Here is a non-exhaustive list of new features:

Here’s an example that shows off filter envelopes:

// "acidic tooth" @by eddyflux
setcps(1)
stack(
note("[<g1 f1>/8](<3 5>,8)")
.clip(perlin.range(.15,1.5))
.release(.1)
.s("sawtooth")
.lpf(sine.range(400,800).slow(16))
.lpq(cosine.range(6,14).slow(3))
.lpenv(sine.mul(4).slow(4))
.lpd(.2).lpa(.02)
.ftype('24db')
.rarely(add(note(12)))
.room(.2).shape(.3).postgain(.5)
.superimpose(x=>x.add(note(12)).delay(.5).bpf(1000))
.gain("[.2 1@3]*2") // fake sidechain
,
stack(
  s("bd*2").mask("<0@4 1@16>"),
  s("hh*8").gain(saw.mul(saw.fast(2))).clip(sine)
  .mask("<0@8 1@16>")
).bank('RolandTR909')
)

Import Sounds

In the “sounds” tab, you can now press “import sounds” to select sounds from your local disk, allowing you to use your own samples without the need to upload them! Keep in mind that if you share a pattern that uses local samples that the samples will fail to load on other people’s machines..

Community Bakery / Patterns Tab

You can now share your patterns publicly to the Community Bakery, via the “Share” button! The Community Patterns are also listed in the new “patterns”, where you can also save your own patterns locally!

Quality of Life Improvements

You can now change the theme and font of the editor:

strudel themes

You can now enable autocompletion in the settings:

autocomplete

If you enable tooltips, you will get the same info by hovering the mouse over functions while holding the ctrl key!

Another handy thing is that Strudel now has offline support! Even samples will work once you have played them once. More info

New Visualizations

There is now a new .spiral() visualization that renders events in a spiral, elevating the cyclical nature of time (+ swirl also means Strudel in german).

strudel alien ui

Ah yes and you see one of the less readable fonts in this screenshot too :)

The .scope() function renders you an oscilloscope:

scope

The pianoroll also got some more options, including the ability to set labels:

scope

Sliders

The slider is the first of a family of functions that render UI widgets inline:

note("<c eb g bb>*8")
.s("sawtooth").lpenv(2).lpq(8)
.lpf(slider(500, 100, 2000, 1))

Sliders are especially useful for gradual changes like fading things in and out by hand, which is not very practical with just code. The fact that the slider is inside the code and also changes the code itself, makes it feel connected to the rest of the system + doesn’t distract or obstruct from the code. Other widgets will come for sure.

More Voicings

One of my personal goals that got me involved with live coding in the first place is to be able to generate good sounding chord voicings on the fly. Strudel now supports most chord symbols:

chord("<C^9 C7b9 Fm9 Db^7>/2")
.dict('ireal').voicing()
.s("sawtooth")
.lpf(400).lpa(.5).lpenv(4)
.phaser(4).room(.5)

So far, this is only documented briefly, a more in-depth guide will follow!

Multiplayer / Collaborative Coding

The collaborative live coding editor flok had strudel support early on, thanks to Damián Silvani. Later, I’ve added support for multiple strudel instances, which was merged to the official version just a few days ago. This photo shows a flok jam I did with my workshop participants in basel:

collaborative coding

The cool thing about flok is that you can jam with people on the other side of the planet! Here is a recording of the first session we organized over the discord server:

Better MIDI integration

The midi integration has gotten a few new features:

  • clock out to sync your midi devices / DAW to the strudel clock (better doc coming soon)
  • cc output to send cc values to your gear
  • cc input to control strudel via MIDI (better doc coming soon)

Here is a little demo of me fiddling with a midi controller, changing a piano pattern:

Experimental Features

Stats

Let’s end the recap with some naked numbers:

Releases

  • 0.0.2 Schwindlig
  • 0.1.0 Stürmisch
  • 0.0.3 Maelstrom - state of last strudel post
  • 0.0.4 Gischt
  • 0.3.0 Donauwelle
  • 0.4.0 Brandung
  • 0.5.0 Wirbel
  • 0.6.0 Zimtschnecke - state after 1 year
  • 0.7.0 Zuckerguss
  • 0.8.0 Himbeermuffin
  • 0.9.0 Bananenbrot
  • 0.10.0 Kuchenboden
  • 0.11.0 Kuchengabel
  • 1.0.0 Geburtstagskuchen - now!

Repo Stats

  • 3399 commits (+1521)
  • 427 stars (+243)
  • 90 forks (+45)
  • 163 open issues (+110), 186 closed (+100)
  • 20 open PRs (+18), 515 closed (+292)
  • 32 contributors (+17)
  • 12 releases (+4)

Thank you 💗

A big thanks to everyone contributing to this project in one way or another, be it by writing code, fixing typos, asking questions or making sounds! I am very grateful for how all of this came together and I’m looking forward to year 3! If you have some spare cash to support the tidal project, we’d be happy if you can insert some coins here.

Release Notes v0.9.0

These are the release notes for Strudel 0.9.0 aka “Bananenbrot”!

The last release was over 11 weeks ago, so a lot of things have happened!

Let me write up some of the highlights:

Improved Synth Engine

The synth engine has gotten a lot of love + a name: superdough encapsulates the web audio based synth / sampler / fx engine into a reusable package, which is already used by Topos. Main new features include:

Related PRs:

Desktop App Improvements

Thanks to @daslyfe and @vasilymilovidov , the desktop app now has its own rust based MIDI and OSC integrations, which do not depend on browser APIs!

You can see superdough, superdirt via OSC + hardware synths via MIDI all together playing in harmony in this awesome video. These are the related PRs:

Visuals

  • 2 new FFT based vizualisations have now landed: scope and fscope (featured in the video at the top).
  • pianoroll has new options, see PR

Related PRs:

Voicings

There is now a new way to play chord voicings + a huge selection of chord voicings available. Find out more in these PRs:

Adaptive Highlighting

Thanks to @mindofmatthew , the highlighting will adapt to edits instantly! Related PRs:

UI Changes

Other New Features

Articles

Other Fixes & Enhancements

New Contributors

Full Changelog: https://github.com/tidalcycles/strudel/compare/v0.8.0…v0.9.0

A big thanks to all the contributors!

Release Notes v0.8.0

These are the release notes for Strudel 0.8.0 aka “Himbeermuffin”!

Go to Tidal Club Forum for this Release

Let me write up some of the highlights:

Desktop App

Besides the REPL (https://strudel.tidalcycles.org/), Strudel is now also distributed as a Desktop App via https://tauri.app/! Thanks to vasilymilovidov!

edit: the desktop app performance on linux is currently not that great.. the web REPL runs much smoother (using firefox or chromium)

The desktop App has the same features as the webapp, with the additional ability to load samples from disk. It is currently not documented yet, but you can do something like

samples('~/music/xxx');

s('my_sound');

You have to start with ~/music/, followed by an arbitrary folder path that is expected to be present in the systems audio directory. When you first run it, the app will create a strudel.json file in that directory to map out the available samples.

I would be very happy to collect some feedback on how it works across different platforms & systems!

Spiral Visualization

Also still undocumented, but you can now visualize patterns as a spiral via .spiral():

This is especially nice because strudel is not only the name of a dessert but also the german word for vortex! The spiral is very fitting to visualize cycles because you can align cycles vertically, while surfing along an infinite twisted timeline.

More settings

In the settings tab, you can now toggle:

  • line numbers
  • auto-complete
  • line wrapping

Thanks to roipoussiere!

More

Scroll down to see the full list of Changes!

A big thanks to all the contributors!

Package Versions

  • @strudel.cycles/core: 0.8.2
  • @strudel.cycles/mini: 0.8.2
  • @strudel.cycles/transpiler: 0.8.2
  • @strudel.cycles/webaudio: 0.8.2
  • @strudel.cycles/soundfonts: 0.8.2
  • @strudel.cycles/react: 0.8.0
  • @strudel.cycles/midi: 0.8.0
  • @strudel.cycles/osc: 0.8.0
  • @strudel.cycles/csound: 0.8.0
  • @strudel.cycles/serial: 0.8.0
  • @strudel.cycles/tonal: 0.8.2
  • @strudel.cycles/xen: 0.8.0
  • @strudel/codemirror: 0.8.4
  • @strudel/web: 0.8.3

What’s Changed

New Contributors

Full Changelog: https://github.com/tidalcycles/strudel/compare/v0.7.0…v0.8.0

Release Notes v0.7.0

Package Versions

  • @strudel.cycles/core@0.7.2
  • @strudel.cycles/transpiler@0.7.1
  • @strudel.cycles/mini@0.7.2
  • @strudel.cycles/tonal@0.7.1
  • @strudel.cycles/xen@0.7.1
  • @strudel.cycles/tone@0.7.1
  • @strudel.cycles/webaudio@0.7.1
  • @strudel.cycles/react@0.7.1
  • @strudel.cycles/osc@0.7.1
  • @strudel.cycles/serial@0.7.1
  • @strudel.cycles/midi@0.7.1
  • @strudel.cycles/csound@0.7.1

What’s Changed

New Contributors

Full Changelog: https://github.com/tidalcycles/strudel/compare/v0.6.0…v0.7.0

Release Notes v0.6.0

Package Versions

  • @strudel.cycles/core@0.6.8
  • @strudel.cycles/eval@0.6.2
  • @strudel.cycles/transpiler@0.6.0
  • @strudel.cycles/mini@0.6.0
  • @strudel.cycles/tonal@0.6.0
  • @strudel.cycles/tone@0.6.0
  • @strudel.cycles/xen@0.6.0
  • @strudel.cycles/webaudio@0.6.1
  • @strudel.cycles/react@0.6.0
  • @strudel.cycles/osc@0.6.0
  • @strudel.cycles/midi@0.6.0
  • @strudel.cycles/webdirt@0.6.0
  • @strudel.cycles/serial@0.6.0
  • @strudel.cycles/soundfonts@0.6.0
  • @strudel.cycles/csound@0.6.0

What’s Changed

New Contributors

Full Changelog: https://github.com/tidalcycles/strudel/compare/v0.5.0…v0.6.0

Release Notes v0.5.0

Package Versions

  • @strudel.cycles/core@0.5.0
  • @strudel.cycles/osc@0.4.0
  • @strudel.cycles/serial@0.3.0
  • @strudel.cycles/csound@0.5.1
  • @strudel.cycles/eval@0.5.0
  • @strudel.cycles/midi@0.5.0
  • @strudel.cycles/mini@0.5.0
  • @strudel.cycles/react@0.5.0
  • @strudel.cycles/soundfonts@0.5.0
  • @strudel.cycles/tonal@0.5.0
  • @strudel.cycles/tone@0.5.0
  • @strudel.cycles/transpiler@0.5.0
  • @strudel.cycles/webaudio@0.5.0
  • @strudel.cycles/webdirt@0.5.0
  • @strudel.cycles/xen@0.5.0

What’s Changed

New Contributors

Full Changelog: https://github.com/tidalcycles/strudel/compare/v0.4.0…v0.5.0

Release Notes v0.3.0

Package Versions

  • @strudel.cycles/core@0.3.1
  • @strudel.cycles/eval@0.3.1
  • @strudel.cycles/midi@0.3.1
  • @strudel.cycles/mini@0.3.1
  • @strudel.cycles/react@0.3.1
  • @strudel.cycles/soundfonts@0.3.1
  • @strudel.cycles/tonal@0.3.1
  • @strudel.cycles/tone@0.3.1
  • @strudel.cycles/webaudio@0.3.1
  • @strudel.cycles/webdirt@0.3.1
  • @strudel.cycles/xen@0.3.1

What’s Changed

New Contributors

Full Changelog: https://github.com/tidalcycles/strudel/compare/v0.0.4…v0.3.0

Release Notes v0.0.4

What’s Changed

New Contributors

Full Changelog: https://github.com/tidalcycles/strudel/compare/v0.0.3…v0.0.4

Release Notes v0.0.3

What’s Changed

New Contributors

Full Changelog: https://github.com/tidalcycles/strudel/compare/v0.0.2…v0.0.3

Release Notes v0.0.3

What’s Changed

New Contributors

Full Changelog: https://github.com/tidalcycles/strudel/compare/v0.0.2…@strudel.cycles/core@0.1.0

Release Notes v0.0.2

What’s Changed

New Contributors

Full Changelog: https://github.com/tidalcycles/strudel/commits/2a0d8c3f77ff7b34e82602e2d02400707f367316