Drone Meditations

A 4-oscillator drone synth with physically-calibrated Chladni visualization.
User Manual Β· web + iOS
Feature highlights
  • Automation Timeline (AUTOMATION pill) β€” a per-patch sequencer. Schedule chord progressions, fades, waveform/sample switches, level/mute, and LFO rate/depth moves at bar+beat positions; loop a phrase or run once. Chord changes transpose (voicings stay intact), positions are tempo-relative, and it's fully cross-platform β€” build, edit, and play on both web and iOS. See Β§11 β†’ AUTOMATION.
  • BPM & metronome in the header β€” the tempo readout and metronome toggle now live in the always-visible top icon row (no more hunting in the master strip, especially in iPhone landscape). See Β§15.
  • Per-oscillator Tune to Room (πŸ‘‚) β€” every strip now has an ear icon that opens a mic-pitch sheet and snaps just that voice's frequency to whatever you sing or play. See Β§3.
  • Per-oscillator Record sample (πŸŽ™) β€” capture a sample directly from the mic into a voice without ever opening Files; reference-pitch is the voice's current frequency at record time. See Β§3.
  • BPM-quantized grain density β€” sync the grain scheduler to the global BPM at musical subdivisions (Β½ β†’ 1/32T). Locks granular textures to your tempo. See Β§7 β†’ Granular synthesis.
  • FX Mix LFO target β€” a single LFO target ("FX") biases reverb / delay / chorus mix together for breathing wet/dry swells. See Β§9.
  • Modal chord templates β€” Ionian, Dorian, Phrygian, Lydian, Mixolydian, Aeolian, Locrian, Harmonic Minor, Melodic Minor as a dedicated Modal chord category. See Β§4.
  • Multi-target LFOs β€” each LFO can drive several destinations at once (tap multiple target chips). See Β§9.
  • Quantize-to-scale drift β€” per-voice toggle in the πŸŒ€ menu that snaps continuous pitch motion to the current chord's notes β€” arpeggios instead of smears. See Β§11 β†’ DRIFT.
  • Replay Γ— N timing envelope β€” voice cycles repeat 2/3/5/10/∞ times. See Β§3 β†’ ⏱ Timing.
  • Granular sampling (web + iOS) β€” apply the grain scheduler to any loaded sample. See Β§10 β†’ Granular sampling.
  • Sand particles in Perform mode β€” drifting sand grains follow nodal lines while the cymatic pattern fills the screen. See Β§11 β†’ PERFORM.
  • Cross-device preset sharing β€” every saved preset (incl. inline sample audio) exports as a .dronepreset file that round-trips between web, iPhone, and iPad. See Β§6.
  • INIT preset + Developer Patches category β€” a neutral "INIT" patch pinned to the top of every preset list (a clean starting state), plus 16 character-rich Developer Patches showcasing the new tools. See Β§6.
  • Global BPM + delay sync β€” drives every voice's delay-time when its timing is set to a musical division. See Β§8 β†’ Delay.
  • Haptics intensity (iOS) β€” Off / Light / Heavy cycle, persisted across launches. See Β§17.

1Quick start

Tap Play. Tweak. Breathe.

Drone Meditations on iPhone showing the live Chladni pattern in Performance mode β€” a circular nodal ring intersected by a diagonal line on a green field
Performance mode: the live cymatics pattern fills the screen while a slim Exit pill stays in the corner.
  1. Open the app (web at dronemeditations.com or the iOS app).
  2. Press the round play button at the bottom. A 30-min session timer starts; audio fades in.
  3. Try the PRESET pill β€” start with "Earth Drone" or "Tibetan Bowl."
  4. To explore: drag any oscillator's frequency slider; toggle S (solo) and M (mute) to listen to one voice at a time.
  5. Tap the screen anywhere outside controls to hide the panel and watch the Chladni visualization respond.
Headphones recommended. Many presets use stereo panning, binaural beats, or ping-pong delay that only land properly in stereo.
Highlights β€” what makes Drone Meditations its own thing rather than yet another drone synth:
  • Physically-calibrated cymatics β€” Chladni patterns rendered from real-world high-speed plate-vibration measurements, responding live to the actual frequency of every voice (not just a stylised animation). See Β§12.
  • Six tuning systems β€” 12-TET, Just Intonation, Pythagorean, Verdi 432 Hz, Lou Harrison Free JI, Harry Partch 43-tone, Wendy Carlos Ξ±/Ξ²/Ξ³. See Β§5.
  • 38 Drone Artists presets β€” character-rich tributes to Pauline Oliveros, Γ‰liane Radigue, Stars of the Lid, Sunn O))), William Basinski, and 14 more masters, with granular / fading variants plus a Drift Showcase set. See Β§6.
  • Granular waveform β€” pink noise chopped into Hann-windowed grains for geiger / rain / cloud textures. See Β§7.
  • Sample play window β€” trim start/end + per-loop fade-in/out on any loaded sample, so you can turn a long field recording into a seamless loop. See Β§10.
  • Per-voice drift β€” Static / Up/Down / Wave / Ocean / Glacial pitch motion, plus configurable amount + period chips so each voice drifts on its own clock. See Β§11 β†’ DRIFT.
  • Auto-morph β€” duration-driven 0β†’100 % morph between any two presets, optional ping-pong. See Β§11 β†’ MORPH.
  • 25 scripted Journeys β€” multi-stage timed meditations (Deep Listening Lineage, Heavy Resonance, Minimalist Arc, Spiritual Path…) plus a composer for your own. See Β§11 β†’ JOURNEY.
  • Tune to Room (LISTEN) β€” YIN pitch detection from the mic, snap the chord root to whatever you sing or play. See Β§11 β†’ LISTEN.
  • Reverb-bloom Pause/Stop (iOS) β€” Pause and Stop don't just fade volume; per-voice reverb mix + decay bloom upward then descend with the master, so the sound dissolves into the room rather than disappearing. See Β§15 β†’ Play / pause / stop.
  • Mastered WAV + M4A export (iOS) β€” record any session and get two files: a 24-bit PCM WAV for editing / archival and an AAC M4A sidecar for sharing. Both carry loudness normalization + 2 s/4 s fades + metadata, ready to drop into a DAW or AirDrop. See Β§15 β†’ Recording.

2Anatomy of the screen

Four floating zones: header, pill row, oscillator strips, transport.

Drone Meditations main screen on iPhone β€” header with help / camera / spectrum / cymatics icons, CHORD Β· PRESET Β· DRIFT pill row, then the OSC 1 Β· OSC 2 Β· OSC 3 Β· OSC 4 row ending in a 🎲 randomize-all dice plus a faint disabled β†Ά undo, oscillator 1 strip with waveform icons / PAN / LVL / FILT (LP HP BP, CUTOFF, Q, DRIVE) / FM / CHO / DLY / REV / LFO 1 row with shape icons and a target row (pan, amp, cut, pitch, Q, FM) showing PAN highlighted to demo a multi-target LFO, then the play-stop-record transport with 07:01 / 15:00 timer and the Β© 2026 Jose Gude MD Β· Manual link at the bottom
The full controls panel. Note the 🎲 dice and faint β†Ά undo at the right end of the OSC pill row (top-of-strip global randomize / undo), and the LFO target row where multiple destinations can be enabled simultaneously.

From top to bottom: header (app name, tuning + chord summary, spectrum / camera / cymatics-style toggles) β†’ pill row (CHORD Β· PRESET Β· DRIFT Β· LISTEN Β· PERFORM Β· JOURNEY Β· MORPH Β· GALLERY) β†’ oscillator strips (one per voice, each carrying waveform + frequency + pan + level + filter + FX + 5 LFOs) β†’ transport (Play / Stop / Record + session timer) β†’ copyright + Manual link (the slim row at the very bottom).

Tap or click anywhere outside a control to dismiss the panel and reveal the visualization full-screen. Tap again to bring it back. A slim "Tap to show controls" hint appears at the bottom when hidden, with mini freq + S/M controls so you can still adjust audio while watching the Chladni.

3Oscillator strips

Four independent voices, each routed through its own FX chain to the master limiter.

Per-strip controls

ControlWhat it does
WaveformSine, triangle, sawtooth, square, white / pink noise, granular, or loaded sample. Picking Granular reveals a GRAIN row; picking Sample reveals a sample-row + amber WINDOW row for trim & per-loop fades.
FrequencyLogarithmic 20–2000 Hz slider. Tap the readout to type an exact value (2 decimals).
LevelPer-voice volume, 0–100%.
SSolo. Any voice soloed silences the unsoloed ones.
MMute.
🎲 Randomize (per strip)Re-rolls just this oscillator. Everything except level changes: waveform, freq, filter, all 5 LFOs, reverb, delay, drift. One tap = a new world.
🎲 Randomize all (top OSC bar)The dice button at the end of the OSC 1Β·2Β·3Β·4 pill row rolls all four voices at once, then picks a fresh chord β€” without disturbing your master volumes. The faint β†Ά undo button next to it restores the exact state you had before the last randomize, so you can A/B between "the patch you had" and "the patch the dice gave you."
⭐ Voice presetsSave / load / delete just this oscillator's settings. Great for keeping a favorite bass + cycling through pads above.
πŸ‘‚ Tune to Room (per voice)Opens a mic-pitch sheet scoped to just this voice. Sing or play a steady tone β€” the YIN detector locks on, and tapping Set as Freq snaps the voice's frequency to whatever pitch you held. Each voice can be tuned independently (so OSC 1 to a singing bowl, OSC 2 to your voice, OSC 3 to a tuning fork). Unlike the global LISTEN pill which retunes the chord root, this only touches the freq slider on the strip you tapped β€” leaving the others alone.
πŸŽ™ Record sample (per voice)Captures audio from the mic directly into this oscillator's sample slot β€” no Files-app round-trip, no upload dialog. Tap to arm, mic-permission prompts the first time, then tap again to stop. The recording is normalized to a consistent loudness, saved into the in-app sample library under a "Recorded Samples" group, and loaded into this voice with the WINDOW row revealed for trim+fade. The voice's frequency at the moment you tapped Record becomes the reference pitch, so resampling pitch later matches what you sang. Stack this with Per-voice Tune to Room and you can sing a chord into the synth voice-by-voice.
πŸŒ€ DriftPer-voice pitch & pan drift (off, glacial up/down, octave up/down, slow pan, deep vibrato, etc.).
⏱ TimingStagger when this voice enters the mix: Start after (Now / 15 s / 30 s / 1 / 2 / 5 / 10 min β€” silent then 8 s fade-in) and Play duration (Forever / 1 / 3 / 5 / 10 / 15 / 20 min β€” 8 s fade-out at the end). Lets you introduce drones gradually during long meditations, then let them recede. Several Drone Artists presets use this β€” Stars of the Lid blooms its chord at 0 / 30 / 90 / 180 s; Basinski's pink-noise hiss enters at 90 s; Riley's cascade enters at 0 / 15 / 45 / 90 s. A third chip row sets Replay to Once / Γ— 2 / Γ— 3 / Γ— 5 / Γ— 10 / ∞ β€” the [silent Start after β†’ fade-in β†’ Play duration β†’ fade-out] cycle repeats N times before going silent forever. Each subsequent cycle uses a shorter 4 s fade-in (vs. 8 s on the first) and a per-cycle reverb-bloom fade-out so the seam between repetitions feels like the same dissolve-into-the-room that the global Stop button uses, only voice-local.
Panβˆ’1 (full left) to +1 (full right). 0 = center.

Filter

Each voice has a state-variable filter with selectable mode (LP, HP, BP), cutoff (20 Hz – 8 kHz, log), and Q 0.3 – 20.

Q = resonance. They're the same control under two names β€” Q is the technical term (quality factor: cutoff Γ· bandwidth), resonance is the common synth term. Higher Q narrows the filter peak around the cutoff, which we hear as a taller, more whistling/squelchy emphasis at that frequency. Low Q (0.3–1) = smooth pad shaping; high Q (5–20) = vowel-like resonant sweeps.

4Chord, key, octave

Press the CHORD pill to generate all 4 voice frequencies from a chord template.

Choose a root note (C, Cβ™―, D…), an octave (1–6), and a chord type from one of these categories:

Tip. A chord overwrites all four frequencies, but solo/mute, waveform, FX, LFOs, and drift are kept. So you can dial in a sound, then sweep chords to try it in different harmonic contexts.

5Tuning systems

The frequencies the chord pill produces depend on the tuning you choose.

Tunings only affect how chord frequencies are computed; the per-voice frequency sliders remain free continuous controls so you can hand-tune outside the lattice anytime.

6Presets & voice presets

Two kinds: full presets (all 4 voices + master + FX) and per-voice voice presets (one strip at a time).

Full presets

Press the PRESET pill. Categories include:

The preset picker sheet listing categories: Drone Artists, Binaural, Natural Resonance, Cymatics, Mystic, Solfeggio β€” with named entries underneath
Preset picker β€” each category groups dozens of named factory presets. User-saved presets appear in a "Your presets" section above the factory list.

Tap "Save as preset…" to capture the current full state under a custom name. User presets live alongside the factory list in their own section.

Drone Artists presets carry full character. Unlike the simpler categories (which only set frequencies + pan), these write waveform, filter, reverb, chorus, delay, LFOs, and per-voice drift in one step β€” so loading one captures the artist's sound, not just their notes. Tweak afterward to make it your own.
Full preset reference. Every built-in preset that ships in the app β€” voices, FX highlights, timing envelopes, and (for the Drone Artists) artistic context β€” is documented on a single page: preset-reference.html. Auto-generated from the Swift + JS sources so it never drifts out of date.

Voice presets

The ⭐ button on each oscillator strip opens a menu to Save current, Load…, or Delete… a single-voice snapshot β€” waveform, freq, level, pan, filter, all 5 LFOs, FX, drift. Useful for keeping a perfect bass and quickly swapping the pad above.

Sharing presets between devices β€” iPhone ↔ iPad ↔ browser ↔ a friend

Every saved user preset can be packed into a .dronepreset file β€” a single JSON envelope containing the full per-voice state plus any loaded sample audio inline. The receiving device reconstructs everything end-to-end, no extra copy of the audio needed.

For automatic iPhone ↔ iPad sync without manual sharing, see the iCloud preset sync note in the iOS app's Presets sheet (presets you save on one device appear on the other within a few seconds; samples still travel via .dronepreset files).

7Waveforms

Eight source options per voice β€” four periodic, three stochastic (incl. granular), plus user samples.

WaveformCharacterBest for
SinePure fundamental, no harmonics.Binaural carriers, calm pads, sub-bass.
TriangleSoft harmonic content, falls off fast.Organ-like, warm thirds, Riley/Reich repetition.
SawtoothRich harmonic stack, classic bowed-string / brass.Stars of the Lid pads, Coltrane organ, Sunn O))) low end.
SquareHollow, odd harmonics only.Doom octaves, NWW textures, Earth dyads.
White noiseFlat spectrum β€” equal energy at every frequency.Tape hiss, wind, breath, NWW bursts. Frequency knob has no effect.
Pink noise1/f spectrum β€” natural-sounding, warmer than white.Surf, rain, Basinski tape-decay layer, ambient ground floor.
GranularPink noise chopped into Hann-windowed grains scheduled at a chosen density. Each grain gets a random stereo placement so the texture breathes.Geiger counters, rain drops, sparse crackle clouds β€” the negative-space between grains is what makes the texture feel alive. See the four (Granular) Drone Artists presets.
SampleUser-loaded audio file looped at chosen pitch.Tibetan bowls, field recordings, your own loops.

Noise voices ignore the frequency slider and just hiss. They still pass through every per-voice control downstream: filter (HP for airy hiss, BP for vowel-noise), drive (warmer texture), chorus, delay, reverb, LFOs (S&H on cutoff gives the gritty pattern shifts in the Nurse With Wound preset). Pink noise is generated by Paul Kellet's economy variant of the Voss-McCartney filter; white is uniform random.

Granular synthesis (the Granular waveform)

OSC 1 strip with the Granular waveform selected (the pink-noise droplet icon in the waveform picker). A blue GRAIN row now sits between the waveform picker and the FILT row with four sliders labelled size Β· 13 ms, density Β· 57/min, jitter Β· 36, and spread Β· 82
Picking the granular waveform reveals the blue GRAIN row directly under the waveform picker β€” size Β· density Β· jitter Β· spread.

When you pick Granular as the waveform, a GRAIN row appears under the picker with four sliders:

The source material is pink noise (warmer than white for meditation). Filter and reverb apply downstream, so a high-pass + plate-reverb stack turns granular noise into raindrops landing in a glass-walled room. Stack two granular voices panned opposite for stereo rain showers β€” the Sparse Rain and Rain Shower presets do exactly this.

8Per-voice FX β€” filter, drive, FM, chorus, delay, reverb

Each oscillator has its own filter + drive + FX chain β€” vertical order on the strip is FM β†’ Chorus β†’ Delay β†’ Reverb. Drive lives next to the filter since it shapes the source before the rest of the chain.

Filter

Mode (LP / HP / BP), cutoff, Q (= resonance). LFO 2 by default modulates cutoff. Use BP + high Q for "vowel" sweeps; LP + low Q for warm pads. Q is also an LFO target β€” sweeping it makes the filter peak "breathe."

Drive (soft saturation)

Per-voice tanh waveshaper applied to the raw oscillator output before the filter. 1.0Γ— = clean (bypass). Up to 12Γ— for heavy doom-guitar grit. Because it sits pre-filter, the harmonics it generates get carved by the LP filter β€” the same architecture that turns a clean amp into a guitar cab. Use sparingly: 1.5–3Γ— warms; 4–7Γ— saturates; 8–12Γ— is full overdrive (Sunn O))) / Earth territory).

FM (cross-oscillator)

Pick one of the other three voices as the modulator from the source dropdown, then dial index (0–800 Hz, log). The modulator's raw oscillator signal is scaled by index and added to the carrier's frequency β€” small values give vibrato, mid values give chime-like timbres, large values give bell or FM-bass character. Set source to Off to disable.

Chorus (stereo)

Two short delay lines fed by the post-filter signal, modulated by a sine LFO whose L/R phases are offset by width Γ— Ο€. Rate 0.05–6 Hz, depth 0–1 (Β±12 ms swing at depth = 1), width 0–1 (full counter-phase at 1.0), mix 0–1. The chorus's stereo width persists regardless of pan position.

Reverb

Algorithmic reverb with decay time (0.1–10 s, log) and wet/dry mix. Long decay + low mix = ambient halo. Short decay + high mix = wet plate.

Delay β€” mode

Three routings: Mono (both sides equal), Stereo (each side has its own line), Ping-Pong (echoes bounce L β†’ R β†’ L). Pick mode from the dropdown next to the delay sliders.

Delay β€” timing

Either a manual time (20 ms – 2 s) or a musical division: 1/2, 1/3, 1/3t, 1/4, 1/4t, 1/8, 1/8t, 1/16, 1/16t. Musical timings sync to the global BPM (default 80, range 30–240). Tap the monospaced "80" pill in the master row (iOS) or the BPM segment of the header subtitle (web) to pick a new tempo β€” every sync'd delay across all four voices recomputes instantly, and so does every BPM-quantized grain density. Free-timing delays are unaffected by BPM changes; they keep whatever absolute ms value you dialed.

The feedback slider controls how many echoes you get. Above ~0.85 it starts feeding into itself β€” use sparingly.

9The 5 LFOs per voice

Each voice has five low-frequency oscillators. LFOs 1–4 share a common pool of synth targets; LFO 5 has its own dedicated row of granular + delay + reverb targets β€” so a single patch carries up to 20 multi-target modulators.

LFODefault targetSuggested use
LFO 1AmplitudeSlow tremolo / breathing pad.
LFO 2Filter cutoffVowel-like sweeps.
LFO 3PanStereo wander, auto-pan.
LFO 4PitchVibrato (small depth) or wobble (large).
LFO 5Grain densityStuttering grain pulses, rhythmic delay swing, breathing reverb decay.

Shared controls (all 5 LFOs)

LFOs 1–4 β€” synth targets

Each of the first four LFOs picks from a shared seven-target pool:

LFO 5 β€” granular + FX targets

LFO 5 sits in its own row right below LFO 4, with a two-row chip grid grouping its nine dedicated targets. None of LFOs 1–4 can reach these β€” they're reserved for LFO 5 so the lower LFOs stay focused on synth modulation and the rhythmic FX gestures live on their own line.

GroupChipEffect
GraingSizeMultiplicative Β±50% on grain size (ms). Slow shapes = breathing texture, S&H = grain-size stutter.
gDensMultiplicative Β±50% on grain density (Hz). With BPM-quantize on the density chip, S&H gives Steve Reich-style rate phasing.
gJitAdditive Β±0.5 on grain timing jitter. Loose grain field comes and goes.
gSprAdditive Β±0.5 on grain pan spread. Mono / wide breathing.
DelaydTimeMultiplicative Β±15% on delay tap length. Chorus-y shimmer; intentionally small swing to keep clean at S&H.
dFB †Additive Β±0.10 on delay feedback. Tail length breathes. Clamped 0–0.95 to prevent runaway.
dMix †Additive Β±0.5 on the delay wet mix. Stacks with the FX-Mix macro.
ReverbrDec †Multiplicative Β±25% on reverb decay seconds. Subtle "room breathing" effect.
rMixAdditive Β±0.5 on the reverb wet mix. Independent wet swell from the FX macro.

† iOS only. On the web app, dFB, dMix, and rDec chips are present and store correctly in .dronepreset files, but the underlying Web Audio nodes can't be modulated cleanly per-buffer the way the iOS DSP can, so they no-op at the audio layer. iOS presets sharing these targets remain compatible β€” they just sound a little simpler on web.

Why LFO 5 exists. Bumps the modulator count from 16 to 20 per patch, but the bigger reason is texture: stuttering grain pulses, grain-rate accelerandos, two grain clouds at slightly different rates beating against each other, delay-time chorusing, breathing reverb decay β€” all things you couldn't do with LFOs 1–4. Try a square shape on LFO 5 at gDens with the density chip locked to 1/8 β€” instant rhythmic grain pulse without touching any sliders.

10Samples β€” upload + bundled

Any of the four voices can play back a looped audio sample instead of a generated wave. Two ways to load one:

Bundled samples

The bundled samples picker showing categories Atmospheric, Cosmic, Field, Instruments, Urban with named audio files underneath each
The bundled samples picker groups 50+ shipped files into categories (Acoustic, Atmospheric, Cosmic, Developer, Field, Instruments, Urban).

The Bundled β–Ύ button on each oscillator strip opens a small picker of audio files shipped with the app. Tap one and it loads instantly β€” no upload dialog, no Files-app round-trip. Web sources files from web/samples/ via a manifest (web/samples/index.json); iOS sources from a Samples folder inside the app bundle. Both folders have a README explaining how to drop in your own audio. The picker groups entries by an optional category (e.g. "Acoustic", "Cosmic", "Field", "Instruments").

Anything you capture with the per-voice πŸŽ™ Record sample button (see Β§3) automatically appears at the top of the picker under a Recorded Samples group, so you can drop your own recordings into other voices without re-recording. Recorded samples persist across launches.

Adding to the bundled list β€” for maintainers + contributors

iOS and web are kept in sync by a small Python script. New samples land on iOS first (where they auto-include in the next Xcode build), then a one-line command mirrors them to web and regenerates the picker manifest.

  1. Drop the file in iOS first. Put it in DroneMeditations/Samples/<Category>/. Pick an existing category folder (Acoustic, Atmospheric, Cosmic, Developer, Field, Instruments, Urban) or make a new one. Supported formats: WAV, MP3, M4A, AAC, OGG, FLAC, AIF/AIFF. Filename without the extension becomes the default display name.
  2. Run the mirror script.
    python3 web/samples/mirror_from_ios.py

    It copies every audio file from DroneMeditations/Samples/ into web/samples/<Category>/, deletes web entries that no longer exist on iOS, and regenerates web/samples/index.json fresh. Pass --exclude-larger-than 10 to skip files over 10 MB (or whatever cap you want) if a particular sample would inflate the static site too much.

  3. (Optional) pretty up the display name. The script auto-titles obvious kebab-case stems (phi-drone β†’ Phi Drone) and passes through already-pretty names (Bansuri B2). For everything else β€” em-dashes, ampersands, branded casing β€” add a row to web/samples/display_names.json:
    {
      "overrides": {
        "your-file-stem": "Your Pretty Display Name"
      }
    }

    Re-run the script after editing.

  4. Commit + push. The script makes the iOS folder, the web folder, the manifest, and (optionally) the display names file all change together β€” one commit covers it.
Categories naming. The category folder name is the picker section header verbatim. Title Case singular nouns work best ("Drones" not "drone-loops"). New categories show up automatically next time the script runs.

Converting a .dronepreset into a built-in preset β€” for maintainers + contributors

Saving a preset on iOS or web gives you a .dronepreset file you can AirDrop or import elsewhere. Promoting one of those personal saves into a built-in preset (the kind that ships in the app's Developer Patches / Drone Artists / etc. categories) needs a two-script pipeline that extracts the embedded audio and generates the matching Swift code. Just dropping a .dronepreset into a folder does not auto-pick-up on the next launch.

  1. Drop the .dronepreset into the staging folder. Put the file in JGPresets/ (named for the original "JG…" patches but used as the staging area for any incoming preset envelope, regardless of who authored it).
  2. Extract the embedded sample(s).
    python3 JGPresets/extract.py

    Walks every .dronepreset in the staging folder, pulls the inline-encoded WAV bytes out of each envelope, and writes them into DroneMeditations/Samples/Developer/<canonical-name>.wav. Samples are content-hash-deduped β€” if two presets share a sample, the second one is matched against the first by SHA-256 and not re-written. The script also refreshes JGPresets/_summary.json with the preset metadata + which canonical sample names each voice references. Pass --max-mb 60 (default) to skip envelopes whose embedded audio is larger than the cap.

  3. Tell the Swift generator to include the new preset. Edit JGPresets/gen_swift.py and add the preset's name to the INCLUDE set, plus a one-line subtitle to SUBTITLES:
    INCLUDE = {"JG Dub Wave", "JG Ondulations", "JG JoG", ...}
    
    SUBTITLES = {
      ...
      "JG JoG": "Author recording Β· JoG sample-granular study",
    }

    Names that aren't in INCLUDE are silently ignored β€” useful for staging presets you haven't curated subtitles for yet, or that have huge samples you want to trim before bundling.

  4. Generate the Swift block.
    python3 JGPresets/gen_swift.py

    Writes JGPresets/_generated_presets.swift β€” a paste-ready list of Swift Preset(…) initializers, one per included preset. Each block translates the JSON envelope into typed Swift fields (Voice, FilterState, ReverbState, etc.) so it reads naturally inside Preset.swift.

  5. Paste the block into Preset.swift. Open DroneMeditations/Models/Preset.swift, scroll to the Developer Patches section (look for the comment "Generated from JG .dronepreset files…"), and paste the newly-generated block in alphabetical order. The Xcode Samples/ folder is a folder reference, so the new WAV ships in the app bundle on the next build with no project.pbxproj edit needed.
  6. Mirror the new sample to web.
    python3 web/samples/mirror_from_ios.py

    Same script used for the bundled-samples sync above. Copies the new .wav from the iOS folder into web/samples/Developer/ so it appears in the Bundled β–Ύ picker on web. (Web built-in presets don't yet auto-load bundled samples; for parity, the easiest path is to add a synth-only mirror entry to web/js/music.js in the same Developer Patches section.)

  7. Commit + push. One commit covers all four touched areas: JGPresets/<name>.dronepreset, DroneMeditations/Samples/Developer/<name>.wav, the regenerated _summary.json / _generated_presets.swift, and the Preset.swift paste.
Why this isn't automatic. A .dronepreset file is a JSON envelope with base64-encoded audio inline β€” fine for user-to-user sharing where the receiving app can decode at runtime, but inefficient as a built-in: every launch would re-decode the same bytes. The pipeline above extracts the audio once into a real .wav that ships in the app bundle, and emits Swift code that references it by name. Net result: app launches are fast and the preset reads with the same syntax as every other curated patch.

Regenerating the preset reference page β€” for maintainers + contributors

The page at preset-reference.html is auto-generated from DroneMeditations/Models/Preset.swift and web/js/music.js. Re-run the generator any time you add a preset, swap a sample, or tweak a curated Drone Artist note:

python3 tools/render_preset_reference.py

Hand-written artistic context for the Drone Artists category lives in tools/drone_artists_descriptions.json β€” keyed by preset name, value is a one-to-three-sentence HTML snippet rendered above each preset's auto voice table. Add or edit entries there and re-run the script to surface them on the page; other categories stay purely auto-described.

Upload your own

Sample voice behavior

Sample play window β€” trim, loop, fade

Oscillator strip after loading a sample β€” the SAMPLE row shows the bundled filename and a Clear button, and the amber WINDOW row below it has four sliders labelled start Β· 0%, end Β· 100%, fade-in Β· 0.7s, and fade-out Β· 3.5s
The amber WINDOW row appears under the SAMPLE row once a file is loaded. Here: start at 0%, end at 100%, with a 0.7 s loop-in fade and a 3.5 s loop-out fade β€” enough taper to mask the loop seam on most sustained material.

Once a file is loaded, a WINDOW row (amber-tinted) appears under the sample row with four sliders that shape which slice of the file loops:

The window + fade settings are saved with full presets, so a bundled Tibetan-bowl sample with a 4-second window + 1-second fades becomes a fixed instrument inside the preset rather than the raw recording. Many of the new (Granular) and faded Drone Artists presets rely on this β€” the Basinski tape-decay cycle, for instance, uses a tight window with long crossfades to suggest the original loop is wearing away.

Storage. Browsers cap IndexedDB at a few hundred MB per origin. iOS shares the app's container with everything else you've saved. Long uncompressed WAVs add up fast β€” convert to OGG/MP3/M4A for archival.

Granular sampling β€” web + iOS

A GRAINY toggle button appears under the WINDOW row whenever a sample is loaded. When on, continuous playback is replaced by a Hann-windowed grain scheduler that reads slices around a user-set position. Combined with the existing GRAIN row (size / density / jitter / spread) plus two new sliders, this is full granular sampling:

The grain scheduler is the same one used by the granular pink-noise waveform, so size / density / jitter / pan-spread behave identically β€” including the new BPM-quantized density chip, so you can lock sample-grain timing to a musical division. The only thing that changes between sample-granular and noise-granular is the source: a recognizable sample instead of pink noise.

What you can build with this: a Tibetan bowl strike frozen on its sustain forever, shimmering. The first second of a vocal vowel held indefinitely. A long ambient field recording chopped into rain-like fragments. A piano sustain decaying into a glittering cloud. Basinski-style tape-decay drones from any source. The Developer Patches presets (Β§6) lean heavily on this β€” most use 1/8t or 1/16 BPM-quantized grain density over a slow scan to produce intricate rhythmic patterns from a single sustained sample.

11The pill row

Shortcuts to the app's modal features.

CHORD PRESET AUTOMATION (iOS) DRIFT LISTEN PERFORM JOURNEY MORPH GALLERY
Scrollable. The pill row is horizontally scrollable on iPhone (and any narrow viewport) β€” all 8 pills won't fit in portrait, so swipe left/right on the row itself to reach the ones that scroll off-screen. Look for the subtle fade at the row's right edge that indicates "more pills this way." On iPad and wide browser windows the entire row fits without scrolling.

AUTOMATION β€” scheduled events (web + iOS, v1.1)

A per-patch sequencer. Schedule chord changes, fades, waveform / sample switches, level / mute changes, and LFO rate / depth moves at musical positions; the dispatcher fires each one as the transport reaches it.

Tap the AUTOMATION pill (right after PRESET) to open a sheet listing scheduled events in time order. Tap + to add an event, tap a row to edit it, swipe left to delete. Each event has these fields:

Chord changes transpose, they don't respell. A chord event shifts each affected voice's pitch by an interval relative to the patch's starting state, so non-triadic voicings β€” Sunn O))) power chords, Solfeggio frequency stacks β€” keep their shape; only the root moves. A Direction toggle (Up / Down / Nearest) picks whether the move climbs, falls, or takes the shortest path. Each chord holds until the next chord event. The Duration picker is an editing convenience β€” it auto-positions the next event you add (so "1 bar" drops the next chord one bar later), letting you lay down a flowing progression in a few taps.

The Timeline section at the top sets Length (Manual stop, or 1-64 bars) and Repeat (Once → 16× → Forever). Manual stop = events fire once and the last state holds until you tap Stop. A bar length loops the phrase back to the start; Repeat caps how many times it runs. Every replay restores the patch's captured baseline first, so loops and Stop→Play always start clean — no drift across cycles.

Saved setups. The Saved setups section at the bottom of the sheet is a reusable library β€” tap Save current… to store the timeline under a name, then load it onto any patch later (independent of the sound). Handy for reusing a favourite chord progression or S&H build across different drones. Setups are stored per-device on each platform; a full patch's timeline still travels with it via .dronepreset.

Automation vs Journey. Two separate features with separate use cases.
  • Journey scripts a sequence of whole-preset swaps β€” multi-stage arcs of 20-60 minutes that fade between completely different patches (e.g. Pauline Oliveros β†’ Stars of the Lid β†’ Basinski Tape Decay). Pick a Journey, hit Play, the app drives the whole patch state through the script.
  • Automation modifies a single preset over its own playback. The patch's voices, FX, and LFOs stay as you saved them; the timeline just changes chord, voice levels, waveforms, etc. at the times you scheduled. Save the automation along with the patch so the schedule travels via .dronepreset.
Use Journey for "I want a 30-min meditation that morphs through five drone-artist sounds." Use Automation for "this single patch should shift from A minor to D dorian at 5 minutes, fade OSC 1 out at 8 minutes, and switch OSC 3 to a square at 12."
Full parity on the web. As of v1.1, dronemeditations.com has the same AUTOMATION pill, event-list sheet, and bar/beat editor as the app β€” build and edit timelines in the browser, and they play with the same chord transposition, fades, and LFO moves at the live BPM. Timelines round-trip through the automation field inside .dronepreset files, so a patch authored on either platform animates identically on the other.

DRIFT β€” generative slow motion

The per-voice drift menu open on OSC 1 β€” top section labelled OSC 1 Β· Pitch lists Static (checked), Up 1 oct, Down 1 oct, Up/Down, Down/Up, Wave (sine), Ocean (Β±ΒΌ semi Β· 90 s), Glacial wander; below it a second section labelled OSC 1 Β· Amount lists Default (checked) and Β± ΒΌ semi
The per-voice πŸŒ€ Drift menu is sectioned into Pitch / Amount / Period / Pan. Pitch picks the shape (Static, Up/Down, Wave, Ocean, Glacial…); Amount and Period override the scene defaults so each voice can drift on its own clock.

Pick a drift scene and the app gently wanders the chosen parameters over minutes. Scenes include:

Drift speed is calibrated to your session length: the full arc completes by the time the timer ends β€” unless you override it.

Per-voice drift overrides (Amount + Period)

Each oscillator strip's πŸŒ€ Drift menu has four sections: Pitch (the motion shape), Amount (how far it travels), Period (how long one cycle lasts), and Pan (the stereo motion). Defaults follow the scene; pick a chip in Amount or Period to override that voice individually.

These overrides make every voice's motion independent of session length, so you can build slow-bloom textures inside a long meditation: a 20-minute glacial-up bass paired with a 30-second wave on a high pad creates intentional layered motion that the simple "scene" presets can't produce alone.

Quantize to scale

At the top of each oscillator's πŸŒ€ Drift menu there's a Quantize to scale toggle. When on, that voice's final pitch β€” drift + any pitch-targeted LFOs + FM, all combined β€” is snapped in real time to the nearest note of the current chord across roughly 2 octaves around the voice's base frequency.

What this turns into musically: continuous pitch wobble becomes arpeggio-like jumps along the chord tones. A slow wave drift that would normally smear Β±ΒΌ octave now steps through the chord notes inside that range. Faster LFOs on pitch turn into bouncing arpeggios. The voice always lands on chord-correct pitches, so dense modulation no longer dissonates against the rest of the chord.

Per-voice β€” so you can leave bass continuous and quantize only the high pad, or vice versa. Changes to the chord (CHORD pill, root, type, octave) recompute the snap targets immediately. Set to off to return to smooth/continuous drift.

LISTEN β€” tune to room

The Tune to Room sheet with a Done button in the corner, a Listening label, a very large note readout (A3), the detected frequency (223.39 Hz) and offset (+26 cents) below it, a blue-to-pink gradient level meter, and the blue Set as Root primary button next to a smaller Reset button. Below: 'Hold a steady tone β€” voice, instrument, tuning fork. The last detected pitch is held on screen until you tap Reset or sing a new one β€” so you don't have to race the readout.'
The Tune to Room sheet detects the nearest note + cents offset in real time and holds the last reading on screen. Tap Set as Root to snap the chord generator to the pitch you're playing; Reset clears the readout to listen for a new tone.

Pop the sheet, grant mic access, and play a sustained note from any instrument (voice, tuning fork, singing bowl). The app runs YIN pitch detection (de CheveignΓ© & Kawahara) in real time, displays the nearest note + cents offset + Hz + live audio level, and a "Set as Root" button snaps the chord generator's root key to match.

The displayed pitch is held on screen until you tap Reset or sing a new stable pitch β€” you don't have to race the readout to hit Set as Root. A subtle "HELD" badge appears when the value is sticky (mic went quiet). The status line reads "Held β€” tap Set as Root, or sing a new note".

On web there's a source picker dropdown β€” switch to a USB mic / interface input mid-session. iOS uses the system audio input.

Per-voice equivalent. If you want to tune only one oscillator (e.g. dial OSC 2 to whatever you're humming without retuning the others), use the πŸ‘‚ ear icon on that strip instead β€” see Β§3 β†’ πŸ‘‚ Tune to Room. The global LISTEN pill on this page retunes the chord root, which means all four voices move together.

PERFORM β€” cymatics fullscreen

Hides every control element, leaving only the live Chladni pattern (with sand particles + zoom). A tiny "Exit" pill stays in the top-left; on iOS it auto-dims after 3 s but never disappears, and tapping anywhere wakes it back to full brightness. Esc exits on web.

Sand particles. Hundreds of drifting grains (~3000 on web, ~1500 on iOS) ride the cymatic gradient toward nodal lines while the Chladni pattern fills the screen β€” the same particle simulation as the pop-out window, now native to fullscreen. The grains physically migrate to new positions when frequency changes, so a slow pitch-LFO produces visibly sweeping sand currents. Turn the grains off with the sand toggle if you want a pure shader-only image.

JOURNEY β€” scripted meditations

The Journey picker sheet showing General, Drone Artists, and Your Journeys sections with named multi-stage timed meditation sequences
25 curated journeys plus a composer for your own β€” each is a sequence of preset + drift + duration stages.

25 multi-stage timed journeys auto-advance through presets + drift scenes. 15 general + 10 drone-artist:

The session timer auto-sets to the journey total. Stop halts both the journey scheduler and the transport.

Compose your own. The "οΌ‹ Create your own journey" button at the top of the Journey sheet opens a composer where you name a journey and add any number of stages β€” each one a preset + drift scene + duration (0.5–90 minutes). User journeys are saved locally and appear in a "Your journeys" section above the curated list, with pencil (edit) and Γ— (delete) controls.

MORPH β€” interpolate between two presets

The Morph sheet showing From and To preset dropdowns, a 0–100% slider, and an Auto-morph panel with duration choices and Play / Pause / Reset buttons
Morph sheet β€” drag the slider manually, or set a duration and hit Play to auto-morph between any two presets over time.

The MORPH pill opens a sheet with two preset dropdowns and a 0–100% slider. As you drag, every per-voice parameter is interpolated between A and B in real time:

The preset name flips to "A β†’ B (NN%)" while morphing. Clear morph wipes the From/To pair and returns to plain preset behavior.

Auto-morph (time-driven). Below the slider, the Auto-morph panel lets you pick a duration (30 s Β· 1 / 3 / 5 / 10 / 20 / 30 / 60 min) and tap β–Ά Play. The morph slider then crawls from 0 β†’ 100 % over that duration, applying every parameter blend continuously β€” a 20-minute Oliveros β†’ Basinski morph becomes a guided meditation in itself. ⏸ Pause freezes mid-morph; β†Ί Reset snaps back to 0 % without losing the From/To selection. Tick Ping-pong to bounce back and forth between A and B forever. The timer keeps running when you close the sheet, so you can dismiss the controls and watch Chladni evolve through the full duration. Especially fun between Drone Artists presets β€” try morphing Oliveros β†’ Stars of the Lid, or Sunn O))) β†’ Earth.

GALLERY β€” cymatics snapshots (web)

Every snapshot you save in the pop-out Chladni window is mirrored here. Tap a thumbnail to re-download; the Γ— button removes it from the gallery only β€” already-downloaded PNGs aren't touched. Capped at 200 to keep localStorage healthy.

12Chladni visualization

A physically-calibrated render of how each frequency would vibrate a square plate.

The field is drawn per-pixel on the GPU on both platforms β€” a WebGL fragment shader on the web and a Metal shader on iOS β€” so the nodal lines stay sharp and animate smoothly with vibrato at any zoom, at low CPU cost. Sand grains ride on top.

The frequency β†’ pattern mapping was fit from 17 brusspup demo frames (345 Hz β†’ 6051 Hz), where each frame was visually identified as a (m,n) antisymmetric eigenmode on a thin square plate:

f(m, n) β‰ˆ K Β· (mΒ² + nΒ²), K β‰ˆ 18.6 Β± 0.8 Hz

For each voice, the renderer picks the two adjacent eigenmode pairs that bracket the live frequency and crossfades between them, so vibrato (pitch-LFO modulation) breathes smoothly between physical modes instead of snapping or following an arbitrary continuous curve.

f = 460 Hz crossfade 70% / 30% (3, 5) Β· w 0.7 + (4, 5) Β· w 0.3 = live pattern
Two adjacent eigenmodes are crossfaded by their relative distance to the live frequency.

The Chladni renderer also adds a small center "driver bolt" (brusspup's plate is center-driven), and a thin nodal ring at small radius, on top of every frame.

Tiling

The Chladni cos math is naturally periodic, so the pattern tiles to fill the viewport at any zoom level. You'll never see a clipped plate boundary β€” even zoomed all the way out, the whole screen is filled.

Zoom

The vertical zoom slider on the left (web) or pinch gesture (iOS) controls plate scale, 0.25Γ— to 4Γ—. Persists across launches. On iOS the slider/pinch fades when the main controls are visible so it never competes with the panel.

14Spectrum analyzer

Real-time FFT view tapped post-limiter.

Spectrum analyzer overlay on iPhone β€” a tall green bar graph in the middle of the screen shows the live frequency content of the master bus over the Chladni background, with the mini-osc strip and the Manual capsule visible at the bottom
The spectrum analyzer overlays a log-frequency bar graph (20 Hz – 16 kHz) on the Chladni background. Toggle from the chart-bar icon in the header.

Toggle the chart-bar button in the header to overlay a log-frequency spectrum bar graph (20 Hz – 16 kHz). It's a quick way to verify what's actually leaving the master bus β€” useful when chasing why a "bass-only" preset isn't producing low energy (often a runaway high-pass filter or an LFO killing the fundamental).

The web version uses AnalyserNode.getByteFrequencyData; iOS uses vDSP forward FFT with a Hann window on a tap installed on engine.outputNode.

15Transport & recording

Play / pause / stop

The round play button fades audio in over ~1 s (or 3 s if this is the first play of a fresh session). Pause and Stop both do something different from any other synth's transport β€” read on.

Reverb-bloom fades (iOS)

When you tap Pause or Stop, the app doesn't just drop the master volume. Each voice's reverb mix and decay simultaneously bloom upward, then descend back to your preset values as the master volume fades to silence. The effect is the sound dissolving into the room rather than getting quieter and quieter β€” like the last note of a song letting the hall finish for it.

Both fades restore each voice's original reverb settings on completion (or immediately, if you press Play while a fade is in flight) β€” so your preset reverb mix isn't permanently changed. Stop also resets the session timer to 0.

Why the bloom helps. The human ear has a hard time hearing pure amplitude fades as smooth past ~6 dB per second β€” drops faster than that read as steps rather than continuous descent. The reverb tail gives the ear something rich to follow during the fade window, so the descent feels gradual and musical even at the longer durations meditation work needs.

Session timer

Default 30 min. Tap the timer readout to change the duration. The app fades out gently in the last few seconds. Useful when you're using Drone Meditations as a sleep aid β€” set 20 min and trust it to fade itself.

BPM & metronome

The tempo readout and the metronome toggle live in the top icon row, always visible (they used to be buried in the master strip β€” awkward to reach in iPhone landscape). Tap the BPM to set the session tempo; tap the metronome icon for an audible click locked to the transport's downbeat.

BPM is the master clock for everything tempo-aware: delay-time sync, LFO rate-sync, granular density sync, and the Automation Timeline (bar/beat positions resolve at the live BPM, so changing tempo rescales a whole automated phrase in proportion).

Recording (web + iOS)

The record button writes the master output to a file:

Recording captures whatever is going through the master limiter β€” so all FX, drift, LFO modulation, journeys, etc. β€” exactly as you hear them. The share sheet appears automatically when mastering finishes (typically < 1 second after Stop).

16MIDI input (web)

Any connected MIDI controller can drive the chord generator's root key.

Connect a USB MIDI keyboard / controller and press any key. The chord generator's root key snaps to the played note (octave clamped to the 1–6 range); the active chord template stays the same so you can play the chord type by sliding around the keyboard.

Web MIDI is initialized on first user gesture (click anywhere). Browsers that don't support Web MIDI (Safari without flags) silently fall back to no-MIDI.

17iOS-only features

First-launch tour

The first time you open the iOS app, a 5-card tour walks you through Play / Preset / Tweak / Cymatics / Go Further. Swipe through or tap Next; Skip jumps to the synth. You can re-open the tour any time from the ? button in the controls header.

The Welcome to Drone Meditations onboarding card on first launch β€” sound-wave glyph, intro text crediting Pauline Oliveros, Γ‰liane Radigue, Stars of the Lid, Sunn O))), and a Next button with five page-dots
First-launch onboarding card 1 of 5 (Welcome).

Now Playing / Lock Screen

While playing, iOS shows Drone Meditations on the Lock Screen and Control Center with play / pause controls. Plays through silent mode (the audio session uses the .playback category) and supports background audio so you can lock the screen mid-session.

Haptics

Optional. The haptic button in the master row cycles through three states on tap: Off β†’ Light β†’ Heavy β†’ Off. The device taps in sync with the slowest active LFO across all voices; depth determines per-tap intensity, and the mode scales it: Light halves the intensity for a barely-there pulse, Heavy uses the full computed scale. Most noticeable with a 0.5–1 Hz amplitude LFO. The choice persists across launches.

Photos library snapshot

The πŸ“· camera button renders a 1500Γ—1500 frame of the current Chladni state and saves it directly to your Photos library (add-only permission β€” the app never reads your existing photos). First save prompts for permission; subsequent saves are silent. A "Saved to Photos" toast confirms.

Pinch zoom

Two-finger pinch on the Chladni view zooms in and out. Persists across launches.

Performance exit safety

In cymatics fullscreen, the tiny "Exit" pill dims to 45% after 3 seconds, but never fully disappears, and tapping anywhere on screen brings it back to full brightness. (You can't get stuck.)

18Keyboard shortcuts (web)

KeyAction
SpacePlay / pause transport.
EscClose any open sheet; exit Performance mode; close the pop-out Chladni window.
S (pop-out)Take a snapshot.
G (pop-out)Toggle sand particles.
Scroll wheelZoom Chladni in the pop-out window.

19A note on the Solfeggio claims

An honest, evidence-based take.

The Solfeggio preset descriptions in this app use language like "Traditionally associated with…" β€” and that wording is deliberate.

The popular Solfeggio system (174, 285, 396, 417, 528, 639, 741, 852, 963 Hz) is a 20th-century invention. It was published in 1999 by Joseph Puleo and Leonard Horowitz; the frequencies were derived numerologically (each reduces to a single digit in a specific Pythagorean scheme), not from any medieval chant or ancient text. The medieval "ut/re/mi/fa/sol/la" was a solmization system, not a list of frequencies.

There is no peer-reviewed evidence that 528 Hz "repairs DNA," that 396 Hz "liberates guilt," or any of the other claims that circulate around these tones. A handful of papers in low-rigor journals (including predatory or low-impact outlets) discuss possible psychoacoustic effects, but these don't replicate at the level mainstream medicine would accept.

That said: specific frequencies do affect mood, attention, and physiology β€” and so does sitting still for 20 minutes listening to anything calming. The presets are included because people enjoy them and the harmonic context is interesting, not as a medical claim. If you find them useful for relaxation or focus, that's a real and welcome outcome β€” just don't expect the literal claims attached to them in pop wellness culture.

20Tips & gotchas

Use the dice.

🎲 randomize is the fastest way to find new sounds. Hit it on one strip while leaving the other three steady β€” instant variation against a stable base.

Solo to learn.

S a single voice and slowly walk through every parameter (filter, LFOs, drift). It's the best way to learn what each control sounds like in isolation.

Master volume defaults to 65%.

Four voices summed through FX into a limiter can clip easily. The limiter at βˆ’0.1 dB protects your ears, but if it's working too hard you'll hear pumping β€” pull master down.

Long delay + slow drift = drone.

For ambient pieces, try delay time 1.5 s, feedback 0.7, plus a glacial-up drift scene. The delay keeps reintroducing past frequencies as the present drifts up.

Voice presets compose.

Save four favorites β€” a deep sub, a singing pad, a slow bell, a ping-pong glitch β€” then load them into different strips for instant 4-voice arrangements.

Tune to room before recording.

If you're recording with an acoustic instrument or singing bowl in the room, use LISTEN to snap the chord generator to its pitch so the drone won't beat against it.

21Credits

Drone Meditations is a personal project by Jose Gude MD, designed and shipped on both web and iOS in 2026.

Special thanks to:

← Back to Drone Meditations