TuttiDAW Musique en codeTuttiDAW Code guide

TuttiDAW extensions

Load any TuttiDAW instrument, MIDI effect or audio effect with presets and parameters; voices, groups and Open in TuttiDAW.

This page has not been translated yet, so it is shown in English.

Strudel controls such as .lpf or .room describe a sound in general terms. TuttiDAW adds three methods that name real devices - the same ones you find in the studio's browser - with their factory presets and parameters:

Method What it adds Where it goes
.inst(name, params) an instrument (one per voice) the voice's instrument slot
.midifx(name, params) a MIDI effect before the instrument, in call order
.fx(name, params) an audio effect after the instrument, in call order

These are TuttiDAW-only: a program that uses them does not play on strudel.cc, so the /code page hides its "Open in strudel.cc" link for it.

Instruments: .inst

The name is a device, or a device and one of its factory presets joined by a colon. Case and punctuation do not matter.

setcpm(30)
bass: note("c2 [~ c2] eb2 [~ g1]").inst("Drift:Deep Bass")
keys: chord("<Cm7 Ab^7 Fm7 G7>").voicing().inst("Electric")
Open in /code

.inst decides the instrument, even when the voice also has an s(...). On a drum voice s(...) still picks the pads, so you can play the names on any kit:

s("bd*2 [~ bd] sd ~, hh*8").inst("Drum Rack:909 Core Kit")
Open in /code

Audio effects: .fx

Effects are added after the instrument in the order you call them. Use several .fx calls to build a chain.

note("<[c3,eb3,g3] [bb2,d3,f3]>")
  .inst("Wavetable")
  .fx("Chorus:Wide Classic")
  .fx("Reverb:Large Hall", { decayTime: "4s", dryWetBalance: 0.35 })
Open in /code

MIDI effects: .midifx

MIDI effects change the notes on their way into the instrument - for example an Arpeggiator turns held chords into runs. The clip keeps the notes you wrote; the effect plays them live, as in the studio.

note("<[c3,eb3,g3] [ab2,c3,eb3]>")
  .midifx("Arpeggiator", { style: "UpDown", rate: "1/16" })
  .inst("Operator")
Open in /code
note("c3 ~ f3 ~").midifx("Chord:Minor 7 Chord").inst("Electric")
Open in /code

Parameters

The second argument is an object of parameter values:

  • Keys are the device's parameter keys (decayTime, cutoff, dryWetBalance); a parameter's unique Live label works too. The device catalogue lists every key with its range and unit.
  • Numbers are in the parameter's own unit (Hz, ms, dB, semitones). A string with a unit is converted: "250ms", "2s", "-6dB", "1.2kHz", "30%".
  • Choices take their label ("UpDown", "1/16", "Dorian") or a 0-based index; switches take true or false.
  • Two reserved keys: on switches the device on or off, id names a device when a voice uses the same one twice.
s("bd*4, ~ sd, hh*8")
  .fx("Saturator", { drive: "6dB" })
  .fx("Compressor", { threshold: "-18dB", ratio: 4, attack: "10ms" })
Open in /code

Values outside a parameter's range are clamped, with a warning. Device parameters take constant values for now; a pattern such as "<300 600>" as a device parameter is reported and not applied yet. Strudel controls (.lpf("<300 600>")) can already change over time.

Strudel controls and devices together

Strudel controls keep working next to devices: .lpf(...) still adds an Auto Filter. When a voice names the same kind of device itself, the control goes onto that device instead of adding a second one - .room(0.4) with .fx("Reverb:...") sets that Reverb's mix.

Inline controls: slider and toggle

slider(value, min, max) puts a small slider in the editor next to the number; dragging it changes the program while it plays. toggle(1) (a TuttiDAW addition) puts an on/off switch there.

note("c2*8").s("sawtooth").lpf(slider(800, 200, 4000))
Open in /code
stack(
  s("bd*4"),
  s("hh*8").mask(toggle(1))
)
Open in /code

Voices become tracks

Each labelled voice of a program is one track. Open in TuttiDAW on the /code page saves the program as a studio project:

  • the program lives on a group track: its {} button opens the code, and evaluating there updates every voice;
  • each voice is a track in the group, with its instrument, effects and a Pattern Clip holding that voice's code;
  • moving controls become clip envelopes.

Editing a voice by hand - its notes, or a parameter the code set - detaches that voice from the code, so your edit is kept. Re-attach gives it back to the code. A single Pattern Clip (code in a MIDI clip without a group) plays notes only: devices named in its code are not applied there.