This is TouchCreek
A sample-free procedural creek for the Synthux Touch synthesizer and Daisy Seed, from a quiet trickle to a lively shallow stream. Nothing is recorded: hundreds of tiny bubbles per second, slow eddies, small splashes, fine surface ticks and the low rumble of dense bubbling, all driven by one slowly changing creek state. Switch to Notes and play it: tap a pad for a tuned drop, hold it and the water pours onto the note.
Each bubble is a short decaying tone whose pitch comes from its size, f₀ ≈ 3 / r (Kees van den Doel, Physically-based Models for Liquid Sounds, 2005): small bubbles are high, big ones low.
Quick Install
Download the newest file from the latest release or releases/ (its README lists what each version changes) and flash it with the Daisy web programmer in Chrome or Edge:
- Unplugged: hold BOOT while plugging in USB
- Already powered: hold BOOT, tap RESET, release BOOT
Then Connect → DFU in FS Mode → choose the file → Program. To go back, flash any Synthux firmware the same way.
USB is MIDI. For measuring CPU there's a separate monitor build (see Emulator & Monitor); it isn't part of the releases.
Every version is kept in releases/ with a name saying what changed, so you can always flash an older one. build/CreekTouch.bin is a working build and may be newer than any release.
Controls
At power-up the creek plays whatever the knobs and faders are set to; the second-layer controls start at their defaults (natural width, default tone, attack and release, filter open, delay off). The left switch decides what the pads do.
Pads
| Pad | Presets (left switch up) | Notes (left switch centre) | Diagnostics (left switch down) |
|---|---|---|---|
| P00 | — | Octave down (to −1; in Chromatic −7 semitones, to −14) | — |
| P01 | Throw a stone (every mode): a deep falling plop, a burst of 10–24 larger bubbles spreading from the centre, and a disturbance (extra air, more bubbling, splashes and ripples) that settles over 2–3 s. Hit harder for a bigger stone. Works in still water too: the stone stirs it up, then it goes still again | ||
| P02 | — | Octave up (to +2; in Chromatic +7 semitones, to +28) | — |
| P03 | Quiet trickle | Notes of the scale, from C5 in C major pentatonic by default.
| — |
| P04 | Rocky creek | Bubbles on/off | |
| P05 | Small cascade | Eddies on/off | |
| P06 | Deeper run | Small waterfalls on/off | |
| P07 | — | Surface detail on/off | |
| P08 | — | All layers on | |
| P09 | — | Bubble cloud on/off (monitor build: stress test instead) | |
| P10 | Modifier:
| ||
| P11 | Modifier:
| ||
Presets glide over 250 ms. Diagnostic mutes are smooth (20 ms), don't change what the other layers do, and are remembered; in Presets and Notes all layers always play.
Knobs (clockwise)
| Knob | Main | Hold P10 / Hold P11 |
|---|---|---|
| S30 | Free flow (Notes): how much the creek plays by itself. Fully left = still water, only your notes sound. Presets and Diagnostics always flow | Width: mono fully left, natural at noon, wider fully right (as TouchPulsar). The low body of the creek stays centred P11: Delay time, 30 ms–2.4 s |
| S31 | Scale: fine shallow trickle → larger stream body. Bubbles get 0.6× to 1.8× bigger over most of the knob, so the typical pitch falls (about 3 kHz → 1.3 kHz); the last quarter bends up to 8× for bass, the deepest bubbles around 60 Hz ringing longer. Splashes get lower, eddies get slower | Hold P11: Tone: dark ↔ bright, wide. Noon = default mix; turning left brings in more and more of the big, low bubbles and, near the end, makes them all up to an octave lower; right does the same towards small, high ones (at mid Scale the average pitch goes from about 350 Hz to 7.5 kHz) |
| S32 | Aeration: sparse bubbling → bubbly white water. Fully left = no bubbles at all | P11: Delay amount, 0 = off |
| S33 | Flow: still → trickle → lively creek. More bubbles and more splashes at the drop (0.2 → 4 per second). Fully left: the creek fades to silence within about 1.5 s | Hold P11: Attack: 4 ms–3 s, how quickly a held note's pour swells in (default 0.25 s) |
| S34 | Decay: how long every bubble, drop, splash and tick rings. Noon = default; left shorter (down to ¼), right longer (up to 4×) | Hold P11: Release: 20 ms–4 s, how long the pour keeps going and settles after you let go (default 0.6 s); the tail stays on the notes you played |
| S35 | Variety (Notes): how the tuned bubbles spread. Noon = default (the held note, in the octave nearest each bubble's own size). Left: more and more exactly the held note (fully left = one note). Right: more and more other notes of the active scale, up to an octave around the held note |
Faders
| Fader | Main | Hold P11 |
|---|---|---|
| S36 (left) | Level: output volume. Silent at the bottom, 0 dB at about 70 %, +6 dB at the top | Resonance: Q 0.7–20 |
| S37 (right) | Roughness: smooth channel → rocky interruptions. More turbulence, so more bubbling, deeper eddies, more uneven splashes and more surface ticks | Cutoff: 30 Hz–18 kHz, fully up = open |
Switches
- Up: PRESETS (P03–P06 recall the four presets)
- Center: NOTES (P03–P09 play the scale; Free flow and Variety apply)
- Down: DIAGNOSTICS (P04–P07 and P09 mute layers, P08 all on)
- Up / Center: live
- Down in Notes: Latch. Notes you touch keep pouring after you let go (up to 4); tap a latched note again to release it; switching Latch off releases everything you're not touching
- Down in Presets / Diagnostics: Hold the slow creek state. Flow, turbulence and air stop changing so you can compare settings; bubbles keep happening
Creek Synthesis & Expression
Everything you hear is made of short decaying tones; there is no noise in the sound.
- Bubbles: the main voice. Up to 24 at once, mostly small and quiet, now and then a larger, lower and louder one. About a third rise slightly in pitch as they fade, like real bubbles leaving the surface. Their size sets their pitch (f₀ ≈ 3 / r), never a fixed note list, so the creek doesn't turn into a melody unless you ask it to.
- Three places, one creek: the open flow (centre), the wake behind a rock (slightly left) and a small drop (slightly right). Each has its own energy, turbulence and trapped air, following the knobs with a little inertia (0.1–0.35 s) and drifting on their own. They share causes, not timing, so surges feel connected without everything pulsing at once. Bubbles gather in the wake and the drop.
- Eddies: two to four overlapping slow swells (0.3–3 s; slower with larger Scale, deeper with Roughness) in the rock wake. They have no sound of their own: each one makes the left side surge with more, slightly bigger and lower bubbles, then settle.
- Small waterfalls: at the drop, 0.2–4 times a second as Flow rises: a quick fizz of 3–7 tiny bubbles (2.5–10 kHz) within 20 ms, then 2–8 bubbles settling over the next tenth of a second (more with Aeration), and a short burst of extra air in the drop. Rougher water gives more uneven splashes. Overlapping splashes share a limited energy, so they never swamp the creek.
- Surface detail: sparse, very short, quiet high ticks (2–9 kHz), more near the drop, at turbulence peaks and right after splashes, in loose bursts rather than a steady crackle. In Notes mode the ticks and the falls' fizz are tuned to the held notes (in their own high octaves; Variety spreads them over the scale), and stay on the last played notes after you let go, until you play new ones.
- Bubble cloud: dense bubbling also rings as one body: a soft, low rumble (about 40–400 Hz) under the rock wake and the drop. It comes in around Small cascade density (silent in a trickle), gets lower as the water gets denser and as Scale grows (down to ~40 Hz), and splashes give it a push. A cheap approximation of coupled bubble clouds (after Xue et al. 2023), not a physical solver. Diagnostics P09 mutes it.
- Ping-pong delay (from TouchPulsar): echoes of the whole creek bounce left ↔ right and get darker with each repeat. Time (P11 + S30) is free, 30 ms–2.4 s (no tempo: short = slap and space, long = separate echoes); changes glide like tape. Amount (P11 + S32) sets echo level and feedback together; 0 = off (the power-up setting). After the creek and the cloud, before the filter and the output limiter.
- Filter: hold P11 and move the faders: right = cutoff, left = resonance. A smooth 12 dB/oct low-pass on both channels (the same one as TouchPulsar), before the output limiter, so strong resonance can't clip. At power-up it's fully open.
- Throw a stone (P01, any mode; MIDI CC 29): a deep plop that falls in pitch (lower with larger Scale), a burst of larger bubbles spreading out from the centre over a third of a second, and a disturbance that settles over 2–3 s: air in every part of the creek, more bubbling and splashing, ripples of surface ticks. In still water (Free flow at zero) it stirs the water up and lets it go still again. Pad velocity sets the size of the stone.
- Hold (right switch down outside Notes): freezes the slow creek state while bubbles keep coming, to compare one setting with another.
- Output: a DC blocker and a linked stereo limiter keep peaks below −1 dBFS; at 0 dB level the presets peak around −5 to −7 dBFS, so the limiter only catches rare overlaps.
- Soft Takeover: after a preset, after a MIDI CC, or when you press or release P10 / P11, a knob only takes control once you move it, so values never jump. The emulator shows it: the gold arc is the value in use, the white pointer the knob.
Playing Notes
- Drops: tapping a note pad (or a MIDI key) drops one bubble tuned to the note, with 1–3 quieter bubbles at the same note or an octave up, like a drop falling into a pool. Velocity sets how loud.
- Pouring: holding a note makes the water pour onto it: bubbles in the rhythm of Flow, Roughness and Aeration, rising in about a quarter second and settling about half a second after you let go. Splash bubbles from the drop join in. Hold up to 4 notes for a chord.
- Chords: hold up to 4 notes at once (pads and MIDI keys together) and the water pours onto all of them: each bubble lands on whichever held note is nearest its own pitch, so a chord shimmers as one cloud. Variety spreads within the scale around them. Holding a 5th note releases the oldest one (it settles with Release). With Latch, tapped notes add up to a 4-note chord you can leave pouring.
- Free flow (S30): fully left, the creek is still and only your notes sound; turn it up and the creek plays by itself underneath, its own bubbles gathering onto the held notes too.
- Variety (S35): left of noon pulls everything onto the held note itself (fully left: one note, a pure rhythmic pattern from the flow). Right of noon spreads the bubbles over more and more notes of the active scale, up to an octave around the held note, so a held note becomes a shimmering cloud in the scale.
- Attack (P11 + S33) and Release (P11 + S34), both on P11 (ranges and CCs as TouchPulsar): Attack sets how quickly a held note's pour swells in (4 ms = at once, 3 s = a slow tide), Release how long it keeps pouring and settling after you let go (20 ms–4 s), still on the notes you played.
- Decay (S34): short, dry plinks to long ringing tones.
- Tone (P11 + S31): darker or brighter over a wide range: first the mix of big and small bubbles, then near the ends all bubbles move up to an octave (noon = default).
- Latch (right switch down): notes keep pouring hands-free; tap one again to stop it.
- Surge (MIDI mod wheel or aftertouch): the water rushes: Flow, Roughness and a little Aeration rise on top of the knob settings, a crescendo you can play.
- Range: tuned notes fold by octaves into about 41 Hz – 10 kHz; larger Scale (and a darker Tone) brings the low end in.
Scales
In Notes, hold P11 and tap a note pad to jump directly to a scale, or use P00 / P02 to cycle. Hold P10 and tap a note pad to move the root (shown here in C). The same seven scales as TouchPulsar; Variety spreads notes within the active scale and root.
| Pad | Scale | Notes (root C, octave 0) |
|---|---|---|
| P03 | Chromatic: all semitones; P00/P02 shift by 7 so you can reach every note | C5 C#5 D5 D#5 E5 F5 F#5 |
| P04 | Major: diatonic major | C5 D5 E5 F5 G5 A5 B5 |
| P05 | Natural Minor: diatonic minor | C5 D5 Eb5 F5 G5 Ab5 Bb5 |
| P06 | Minor Pentatonic: blues & folk | C5 Eb5 F5 G5 Bb5 C6 Eb6 |
| P07 | Major Pentatonic (default): bright & open | C5 D5 E5 G5 A5 C6 D6 |
| P08 | Dorian: minor with a raised sixth | C5 D5 Eb5 F5 G5 A5 Bb5 |
| P09 | Harmonic Minor: minor with a raised seventh | C5 D5 Eb5 F5 G5 Ab5 B5 |
Presets
| Pad | Preset | Flow | Roughness | Scale | Aeration |
|---|---|---|---|---|---|
| P03 | Quiet trickle | 0.20 | 0.25 | 0.20 | 0.30 |
| P04 | Rocky creek | 0.50 | 0.60 | 0.45 | 0.55 |
| P05 | Small cascade | 0.75 | 0.80 | 0.50 | 0.85 |
| P06 | Deeper run | 0.65 | 0.35 | 0.80 | 0.40 |
Presets set the four sound knobs (Flow, Roughness, Scale, Aeration); everything else (Level, Width, Tone, Decay, Attack, Release, Free flow, Variety, filter, delay) stays where it is. Also on MIDI Program Change 1–4.
LED Indicator
The onboard LED provides visual feedback:
- Bubbles: flickers with notes and the louder bubbles (in Diagnostics it stays lit and dips on them).
- Mode: 1 blink = Presets, 2 = Notes, 3 = Diagnostics when the left switch moves.
- Preset: 1–4 blinks for the preset number.
- Scale Confirmation: blinks N times for scale 1 through 7 (Chromatic = 1 blink, …, Harmonic Minor = 7 blinks).
- Octave Shift: quick blinks: 1 at octave 0, 2 at ±1, 3 at +2.
- Root Key: 1 long blink.
- Stone: a longer flash when a stone is thrown.
- Diagnostics: 2 blinks = layer on, 1 blink = layer muted, 3 quick blinks = all on (monitor build: stress test = 4 quick blinks, then fast blinking while it runs).
MIDI
TouchCreek appears as a USB MIDI device (listed as Creek) when connected via the Daisy Seed's USB port to a computer, DAW, iPad or USB-MIDI host. A keyboard plugged straight into the Touch won't work: both are USB devices, so route it through the computer or a host box. It listens on all MIDI channels.
- Notes: play like the note pads, in every mode: a tuned drop on press, the water pours onto the note while held. Fully chromatic, separate from the pad scale. Up to 4 held notes (pads and MIDI together). In Notes mode, Free flow and Latch apply.
- Velocity: drop level. Channel aftertouch: Surge.
- Pitch Bend: ±2 semitones (drops and pouring).
- Sustain (CC 64): holds released notes.
- Mod Wheel (CC 1): Surge: the water rushes, raising Flow, Roughness and a little Aeration on top of the knobs; back at zero it changes nothing.
- Program Change 1–4: the four presets.
CC Map
| CC | Control | CC | Control |
|---|---|---|---|
| 1 | Mod wheel → Surge | 24 | S30 Free flow |
| 7 | S36 Level | 25 | S35 Variety |
| 14 | Scale select (0–127 across the 7 scales) | 26 | S34 Decay |
| 15 | Root (0–127 across C … B) | 27 | Width (P10 + S30) |
| 28 | Tone (P11 + S31) | 72 | Release (P11 + S34) |
| 107 | Attack (P11 + S33) | 108 | Delay time (P11 + S30) |
| 109 | Delay amount (P11 + S32) | ||
| 20 | S33 Flow | 64 | Sustain |
| 21 | S37 Roughness | 102 | Filter Cutoff (P11 + S37) |
| 22 | S31 Scale (bubble size) | 103 | Filter Resonance (P11 + S36) |
| 23 | S32 Aeration | 120, 123 | All Notes Off |
| 29 | Throw a stone (P01; value = size, 0 = nothing) |
Soft Takeover: a value set via MIDI CC is kept until the corresponding knob or fader is moved; from then on the physical control takes over again.
Emulator & Monitor
- Browser emulator:
python3 web/serve.py 8766, then openhttp://localhost:8766. The same panel and the same engine (a JavaScript twin, tested against the firmware's), with pickup, layers and LED behaving as on the hardware. Every knob shows its name, S-number, second layer and value. Enable MIDI plays it from a keyboard on your computer; Render 30 s WAV saves what you hear. - Monitor (also for debugging): the emulator's Monitor button opens it for the emulator; for the Touch, build it with
make monitorindaisy/(USB sends the report instead of MIDI, and Diagnostics P09 becomes a stress test instead of the cloud mute), flashbuild-monitor/CreekTouch-monitor.bin, openhttp://localhost:8766/monitor.htmlin Chrome or Edge, plug in the Touch and click Connect. It shows which layers are sounding and how much (bubble voices and rate, played drops / stones, eddies, splash fizz, surface ticks, bubble cloud (emulator only), mutes, held notes), the last pressed pad / knob / switch with its meaning, CPU load (average and worst 1 ms block), stack use, dropped events and limiter activity. For the worst case use Diagnostics + P09 (stress test); measured on the Touch it stays under 25 % (limit 70 %).
Project Structure
creek/
├── daisy/
│ ├── CreekTouch.cpp # Main application entry point
│ ├── Makefile # Build configuration (make monitor = monitor build)
│ ├── creek/ # Instrument core: creek engine + controls (platform-free)
│ ├── touch/ # Touch wrapper (pads, knobs, switches) from TouchString
│ ├── ui/ # UI connecting instrument core with touch wrapper, MIDI, LED
│ ├── test/ # Host tests, soak test, offline renderer, C++ vs browser comparison
│ └── releases/ # Firmware to flash
├── web/ # Browser emulator and monitor; engine/ = the JavaScript twin
├── scenarios/ # Seeds and automation for the reference renders
└── tools/ # gen-config.js: one config file for both engines
Project Setup
Needs the Daisy toolchain. libDaisy is a git submodule in daisy/lib/libDaisy (Synthux's fork, pinned); DaisySP isn't needed. Clone with submodules, then build from daisy/:
$ git clone --recurse-submodules <repository URL> creek
$ cd creek/daisy
$ make libs -j8
$ make clean; make -j8
$ make program-dfu
make monitorbuildsbuild-monitor/CreekTouch-monitor.bin(only when needed): USB sends the CPU report instead of MIDI, and Diagnostics P09 runs a stress test.make -C testchecks the engine on your computer and compares its sound with the browser engine in../web;make -C test soakruns a 30-minute stability test;make -C test renderswrites reference WAVs of every scenario.- All tuning constants live in
web/engine/creek-config.js;node tools/gen-config.jswrites the C++ copy.
Credits
- Bubble model: Kees van den Doel, Physically-based Models for Liquid Sounds, ACM Transactions on Applied Perception, vol. 2, no. 4, 2005.
- Bubble cloud: after Xue, Aronson, Wang, Langlois and James, Improved Water Sound Synthesis using Coupled Bubbles, ACM Transactions on Graphics 42(4), 2023 (a cheap approximation, not their solver).
- Sound design method: Andy Farnell, Designing Sound, MIT Press, 2010.
- Touch drivers: Synthux Academy TouchString. Hardware: Touch 2 by Synthux Academy.
- Filter, ping-pong delay and scale handling shared with TouchPulsar.