-
Notifications
You must be signed in to change notification settings - Fork 253
supradough poc #1362
base: main
Are you sure you want to change the base?
supradough poc #1362
Conversation
|
this looks excellent, I will try it out tomorrow morning |
|
Works pretty well! I noticed that with long release times it ends in a popping sound, volume could also be lowered to match superdough volume. The filter sounds really tasty |
|
fixed the release envelope, volume, and clicking issue :) |
|
this rocks |
nice! i failed to find the bug with my sleep deprived brain on the way back :D i still have question marks on how to use this tactic to implement the rest of superdough, mainly:
i see 2 potential ways:
imo 1 would be the "purest" approach, making it maximally portable. not sure what's more performant, but i guess we have to try |
|
ok i've implemented 1 and it seems to be working :) i think i like it. the Dough class could now handle global fx as well |
|
i've added another poc (dough-export.mjs) to show how to use Dough in a node.js script to render the audio for a pattern |
| } | ||
|
|
||
| let externalWorklets = []; | ||
| export function registerWorklet(url) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i've added this to be able to register worklets from the outside without depending on them from superdough
|
still a bit of refactoring to do, to make sure stereo samples (and eventually stereo waveforms) are processed accordingly.. all the local effects ugens need to exist once for every channel i guess. envelopes are only needed once. also not sure how to best integrate the existing sample map loading logic |
| case 'decay': { | ||
| let time = curTime - this.startTime; | ||
| let curVal = lerp(time / decay, 1, susVal, -this.curve); | ||
| let curVal = lerp(time / decay, 1, susVal, -this.decayCurve); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
curious: why only decay and not attack / release ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It should be on the release and decay stage, the reason is that seems to be standard on most synthesizers so I played around with different curves and preferred the standard linear rate on attack, it was not scientific
fx now work channelwise! so stereo samples should now work |
the doughsamples('github:eddyflux/crate')
all(x=>x.supradough())
$: s("crate_bd*[4 0] crate_rim, crate_hh*4")for now, all samples are immediately loaded into memory! not sure if this is a good idea.. also |
|
new demo pattern: doughsamples('github:eddyflux/crate')
all(x=>x.supradough())
$: s("crate_bd*[<4 [8 0]> 0] crate_rim")
$: s("<pink white>*8").dec(.07)
.rarely(ply("2")).delay(.5)
.hpf(sine.range(200,2000).slow(4)).hpq(.2)
$: note("c,eb,g,bb").s("sine").press()
.add(note(24))
.fmi(3).fmh(5.1)
.dec(.5)
.delay(".6:<.12 .22>:.7")
.jux(press).rarely(add(note("12")))
.lpf(400).lpq(.2).lpd(.4).lpenv(3)
.fmdecay(.2).fmenv(1)
$: chord("<Cm Cm7 Cm9 Cm11 Fm Fm7 Fm9 Fm11>").voicing()
.s("<sine>").clip(1).rel(.4)
.gain(.4)
.fm(1.4).att(1).lpa(.5).lpf(200).lpenv(4) |
|
Loading all samples into memory is one of the problem areas in superdirt
that causes initialization to be slow, if we can stream from disk somehow
or only load samples being used that would probs be better
…On Mon, Jun 9, 2025 at 11:29 AM Felix Roos ***@***.***> wrote:
*felixroos* left a comment (tidalcycles/strudel#1362)
<#1362 (comment)>
new demo pattern:
doughsamples('github:eddyflux/crate')
all(x=>x.supradough())
$: s("crate_bd*[4 0] crate_rim")
$: s("<pink white>*8").dec(.07)
.rarely(ply("2")).delay(.5).hpf(sine.range(200,2000).slow(4)).hpq(.2)
$: note("<c2 g2>,c,eb,g,bb").s("sine")
.add(note(12))
.fmi(3).fmh(5.02).dec(.2)
.delay(".6:<.12 .22>:.7")
.jux(press).rarely(add(note("12")))
.lpf(200).lpq(.2).lpd(.2).lpenv(3)
.fmdecay(.1).fmenv(1)
.postgain(.8)
$: chord("<Cm Cm7 Cm9 Cm11 Fm Fm7 Fm9 Fm11>").voicing()
.s("<sine>").clip(1).rel(.4)
.gain(.4)
.fm(1.4).att(1).lpa(.5).lpf(200).lpenv(4)
—
Reply to this email directly, view it on GitHub
<#1362 (comment)>,
or unsubscribe
<https://github.com/notifications/unsubscribe-auth/ALHDMLQZPWJHWV4VGYRAUDL3CVHW7AVCNFSM6AAAAAB6LJN7KGVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDSNJVGIYTKOJWGE>
.
You are receiving this because your review was requested.Message ID:
***@***.***>
|
|
|
||
| return sl + sr | ||
| //TODO: make stereo | ||
| // return [sl, sr]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
i'd go for a property on the class, rather than creating an array for each sample (avoids memory allocation (i think))
|
Added delayspeed to create pitched and reversed delay effects, implementation inspired by this article
|

this is a poc for implementing a small part of superdough without ties to webaudio. it can be used like this:
the
supradoughmethod completely bypasses superdough and spawns an instance ofthedough-processorworkletDoughVoicea for each event. DoughVoice spawning and despawning is handled byDough, which runs in the long-liveddough-processorworklet.the
Doughclass is self contained, so it could be used to render a strudel pattern in any environment that supports js (e.g. node.js) + it would be easy to prerender a strudel tune from a pattern, without the use of the web audio api. thedough.mjscontains ugens from kabelsalat. we don't really need a graph, as superdough is static.superdough controls
sounds
fx
more fx
other