These are the release notes for Strudel 1.1.0 aka "Bananensplit".
The last release was over 19 weeks ago, so a lot of things have happened!
First, here's a little demo, teasing some of the new features:
strudel11.mp4
Let's write up some of the highlights:
New DSP Features
Stereo Supersaw
with spread, unison, and detune parameters
note("d f a a# a d3").fast(2)
.s("supersaw").spread(".8").detune(.3).unison("2 7")
Analog "ladder" filter type
works great for acid basslines and vibey tones
note("{d d d a a# d3 f4}%16".sub(12)).gain(1).s("sawtooth")
.lpf(200).lpenv(slider(1.36,0,8)).lpq(7).distort("1.5:.7")`
.ftype('ladder')
stereo distortion effect
note("{g g a# g g4}%8".add("{0 7 12 0}%8")).lpf(500)
.s("supersaw").dist("4:.2")
Editor Features
inline viz
The editor now supports multiple visuals within the code, using the _
prefix for viz functions:
._pianoroll()
: inline pianoroll._punchcard()
: inline punchcard._scope()
: inline scope._pitchwheel()
: inline pitchwheel
For more info, check out the new Visual Feedback Page
label notation
This new notation simplifies writing patterns at the top level:
d1: s("bd*4")
d2: s("[- hh]*4")
This is equivalent to:
stack(
s("bd*4"),
s("[- hh]*4")
)
The labels you choose are arbitrary, the above d1
and d2
are a typical thing you'd write in tidal, for example d1 $ s "bd*4"
.
If the same label is used multiple times, the last one wins:
d1: s("bd*4")
d1: s("[- hh]*4") // <-- only this plays
There is a special label anonymous label $
, which can appear multiple times without overriding itself:
// both of these will play:
$: s("bd*4")
$: s("[- hh]*4")
You can mute a pattern by prefixing _
:
_$: s("bd*4") // <-- this one is muted
$: s("[- hh]*4")
To run a transformation on all patterns, you can use all
:
$: s("bd*4")
$: s("[- hh]*4")
all(x=>x.room(.5))
This notation is now the recommended way to play patterns in parallel
Clock sync between multiple instances
timing has received a major overhaul, and is now much more accurate on all browsers. Additionally, you can now sync timing across multiple windows.
Better sample upload support
you can now upload large amounts of samples much faster across all browsers including on IOS devices. supported filetypes now include: ogg flac mp3 wav aac m4a
experimental tidal syntax
The new tidal
function allows you to write strudel patterns in tidal syntax:
await initTidal()
tidal`
d1 $ s "bd*4"
d2 $ s "[- hh]*4"
`
As we're looking to improve compatibility with tidal, we're happy to hear feedback.
breaking changes
This release comes with a bunch of breaking changes. If you find your patterns to sound different, check out the PRs below for guidance on how to update them. Most of these changes shouldn't affect a lot of patterns.
In case of doubt, add the line // @version 1.0
to your old pattern.
If you're having problems, please let us know!
- remove legacy legato + duration implementations by @felixroos in #965
- Velocity in value by @felixroos in #974
- use ireal as default voicing dict by @felixroos in #967
- Color in hap value by @felixroos in #1007
- rename trig -> reset, trigzero -> restart by @felixroos in #1010
- remove dangerous arithmetic feature by @felixroos in #1030
- change fanchor to 0 by @daslyfe in #1107
superdough features
- replace shape with distort in learn doc by @daslyfe in #982
- Worklet Improvents / fixes by @daslyfe in #963
- supersaw oscillator by @daslyfe in #978
- Add analog-style ladder filter by @daslyfe in #1103
- Calculate phaser modulation phase based on time by @daslyfe in #1110
- rollback phaser by @daslyfe in #1113
editor / ui features
- 'Enable Bracket Matching' option in Codemirror by @eefano in #956
- REPL sync between windows by @daslyfe in #900
- inline viz / widgets package by @felixroos in #989
- Inline punchcard + spiral by @felixroos in #1008
- More fonts by @felixroos in #1023
- better theme integration for visuals + various fixes by @felixroos in #1024
- add setting for sync flag by @felixroos in #1025
- add closeBrackets setting by @felixroos in #1031
- add font file types to offline cache by @felixroos in #1032
- pitchwheel visual by @felixroos in #1041
- repl: set document.title from @title by @kasparsj in #1090
- Samples tab improvements by @daslyfe in #1102
language features
- pickOut(), pickRestart(), pickReset() by @eefano in #950
- Auto await samples by @felixroos in #955
- feat: can now invert euclid pulses with negative numbers by @felixroos in #959
- Nested controls by @felixroos in #973
- alias - for ~ by @yaxu in #981
- Beat-oriented functionality by @yaxu in #976
- Labeled statements by @felixroos in #991
- accidentals in scale degrees by @eefano in #1000
- Feature: tactus marking by @yaxu in #1021
- Tactus tidy by @yaxu in #1027
- Wax, wane, taper and taperlist by @yaxu in #1042
- transpose: support all combinations of numbers and strings for notes and intervals by @felixroos in #1048
- anonymous patterns + muting by @felixroos in #1059
- add swing + swingBy by @felixroos in #1038
- Stepwise functions from Tidal by @yaxu in #1060
- Tactus tweaks - fixes for maintaining tactus and highlight locations by @yaxu in #1065
- Fix stepjoin by @yaxu in #1067
- More tactus tidying by @yaxu in #1071
- Tactus calculation toggle and breaking change to tactus calculation in fast/slow/hurry by @yaxu in #1081
- hs2js package / tidal parser by @felixroos in #870
- Add the mousex and mousey signal by @Enelg52 in #1112
- can now access strudelMirror from repl by @felixroos in #1117
sampler
If you have nodejs installed on your system, you can now use @strudel/sampler to serve samples from disk to the REPL or flok.
- local sample server cli by @felixroos in #1033
- Fix sampler paths by @felixroos in #1034
- Fix sampler windows by @felixroos in #1108
- fix sampler on windows by @geikha in #1109
docs
- V1 release notes by @felixroos in #935
- Minor documentation error: Update first-sounds.mdx by @mhetrick in #941
- Update synths.mdx by @andresgottlieb in #984
- using strudel in your project guide + cleanup examples by @felixroos in #1006
- Document signals by @ilesinge in #1015
- improve tutorial + custom samples doc by @felixroos in #1053
- fix cr typo on first-sounds.mdx by @cleary in #1068
- fix first sounds typo by @cleary in #1069
- add
<...>
to first-sounds.mdx recap by @cleary in #1070 - add nesting to
off
example variation in pattern-effects.mdx by @cleary in #1075 - fix translation issue in first-effects.mdx by @cleary in #1072
- add signals to recap in first-effects.mdx by @cleary in #1073
- fix docs on alignment.mdx by @diegodorado in #1076
- fix little dub tune example by @lukad in #1104
- clarify
off
in pattern-effects.mdx by @cleary in #1074 - Fixes drawPianoroll import in codemirror example by @giohappy in #1116
- Migrate tutorial fanchor by @felixroos in #1122
internals
- remove cjs builds by @felixroos in #945
- controls refactoring: simplify exports by @felixroos in #962
- move canvas related helpers from core to new draw package by @felixroos in #971
- remove canvas, externalize samples, delete junk by @felixroos in #1003
- Improve performance of ! (replicate) by @yaxu in #1084
- Benchmarks by @yaxu in #1079
fixes
- fix midi issue on firefox and added quote error by @Enelg52 in #936
- fix: pianoroll sorting by @felixroos in #938
- account for cps in midi time duration by @daslyfe in #954
- fix script importable packages (web + repl) by @felixroos in #957
- fix: reset global fx on pattern change by @felixroos in #960
- add debounce to logger by @felixroos in #968
- fix for transpose(): preserve hap value object structure by @eefano in #966
- fix: clear hydra on reset by @felixroos in #983
- little fix for withVal by @eefano in #980
- fix: share now shares what's visible instead of active by @felixroos in #985
- Fix pure mini highlight by @yaxu in #994
- fix: await injectPatternMethods by @felixroos in #1012
- update undocumented script by @felixroos in #1013
- eliminate chromium clock jitter by @felixroos in #1004
- Repl sync fixes by @daslyfe in #1014
- hotfix for 1017 by @daslyfe in #1020
- fix cyclist fizzling out by @felixroos in #1046
- Midi Time hotfix for scheduler updates by @daslyfe in #1047
- fix: do not reset cc input values on each eval by @felixroos in #1054
- Fix wchooseCycles not picking the whole pattern by @ilesinge in #1061
- fix OSC timing for recent scheduler updates by @daslyfe in #1062
- clarify license by @yaxu in #1064
- fix failing format test by @daslyfe in #1077
- fix: url parsing with extra params by @felixroos in #1083
- fix: csound + dough timing by @felixroos in #1086
- fix: missing events due to premature worklet cleanup by @felixroos in #1089
- Use sessionStorage for viewingPatternData and activePattern by @kasparsj in #1091
- osc: couple of fixes by @kasparsj in #1093
- web package fixes by @felixroos in #1044
- Fix audio worklets by @daslyfe in #1114
- fix: use full repl in web package by @felixroos in #1119
- [BUG FIX] Audio worklets sometimes dont load by @daslyfe in #1121
New Contributors
- @mhetrick made their first contribution in #941
- @eefano made their first contribution in #956
- @Enelg52 made their first contribution in #936
- @andresgottlieb made their first contribution in #984
- @cleary made their first contribution in #1068
- @diegodorado made their first contribution in #1076
- @lukad made their first contribution in #1104
- @giohappy made their first contribution in #1116
A huge thanks to all contributors!!!
Packages
- @strudel/[email protected]
- @strudel/[email protected]
- @strudel/[email protected]
- @strudel/[email protected]
- @strudel/[email protected]
- [email protected]
- @strudel/[email protected]
- @strudel/[email protected]
- @strudel/[email protected]
- @strudel/[email protected]
- @strudel/[email protected]
- @strudel/[email protected]
- @strudel/[email protected]
- @strudel/[email protected]
- [email protected]
- @strudel/[email protected]
- @strudel/[email protected]
- @strudel/[email protected]
- @strudel/[email protected]
- @strudel/[email protected]
- @strudel/[email protected]
Full Changelog: v1.0.0...v1.1.0