what is dough?
dough is a monolithic audio engine for live coding, written in a single c file. it is designed after superdough, the audio engine behind strudel. it runs both natively and in the browser.
dough is free & open source software: you can redistribute and/or modify it under the terms of the GNU Affero General Public License. you can find the source code here.
read more about the backstory here. dough draws inspiration from dirt, superdough, kabelsalat and noisecraft.
caution: dough is still in development, so expect rough edges..
function reference
this page introduces dough and its ideas in a linear fashion. to see all available parameters, see the function reference
what is dough, technically?
dough is an opinionated, fixed path, semi-modular synth that is remote-controlled via messages. each message contains one or more key/value pairs, which control the many parameters of the synth.
- sound sources: 6 basic waveforms, 3 noise types, samples
- filters: low pass, high pass, band pass
- fm synthesis & pitch modulations
- per-voice fx, like bitcrush, distortion and waveshaping
- envelopes on many parameters
- effect sends: delay, reverb, ...
dough-lang
to explain dough, this page uses these inputs:
you can change any of these. to hear the result, press ctrl+enter (or press stop/run). to stop, you can also use ctrl+. try it!
or with multiple lines:
lines can also be commented out by putting // at the start.
envelopes
the following parameters have envelopes:
- lp*: low pass frequency
- hp*: high pass frequency
- bp*: band pass frequency
- p*: pitch envelope
- fm*: frequency modulation
for each of these, we can set the following envelope params:
- a: attack time in seconds
- d: decay time in seconds
- s: sustain level
- r: release time in seconds
- e: envelope amount
for example, to get a low-pass decay, we can use the lpd param:
if we replace lpd with lpa, it turns into an attack:
we can also combine both lpa and lpd for an AD envelope:
note that the sustain value changed, based on what we set:
- if we set only attack, sustain will be 1 (opens up)
- if we set only decay, sustain will be 0 (closes down)
- if we set attack and decay, sustain will be 0 (closes down)
of course, we can also set the sustain value explicitly:
you are strongly encouraged to play with the values to get a feel for what they do!
these examples used a low pass filter envelope, but you can replace the lp with any other param on the list above:
how to run dough
- run it in the browser through dough.js
- run the native binary and send osc
running in the browser
here's how you can run dough in the browser:
note that dough uses shared memory, so the server you're serving from needs to set the following headers:
Cross-Origin-Opener-Policy: same-origin Cross-Origin-Embedder-Policy: require-corp
for local development, dough provides a simple dev server that can be used:
npx --yes dough-synth@latest
run it in the same directory as the above html file, then open localhost:8888/. the command will only work if you have node.js installed.
running natively
so far, dough has no prebuilt binaries, so you need to build from source. see development setup for more info.