- 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
.dronepresetfile 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.
- Open the app (web at dronemeditations.com or the iOS app).
- Press the round play button at the bottom. A 30-min session timer starts; audio fades in.
- Try the PRESET pill β start with "Earth Drone" or "Tibetan Bowl."
- To explore: drag any oscillator's frequency slider; toggle S (solo) and M (mute) to listen to one voice at a time.
- Tap the screen anywhere outside controls to hide the panel and watch the Chladni visualization respond.
- 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.
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
| Control | What it does |
|---|---|
| Waveform | Sine, 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. |
| Frequency | Logarithmic 20β2000 Hz slider. Tap the readout to type an exact value (2 decimals). |
| Level | Per-voice volume, 0β100%. |
| S | Solo. Any voice soloed silences the unsoloed ones. |
| M | Mute. |
| π² 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 presets | Save / 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. |
| π Drift | Per-voice pitch & pan drift (off, glacial up/down, octave up/down, slow pan, deep vibrato, etc.). |
| β± Timing | Stagger 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:
- Common β Major, Minor, Sus2, Sus4, dim, aug, Maj7, m7, 7, 9, β¦
- Extended β 11, 13, add6, m9, maj9, mMaj7, 7β9, 7β―11, β¦
- Modal β characteristic 4-note slices of each diatonic / harmonic / melodic mode: Ionian, Dorian, Phrygian, Lydian, Mixolydian, Aeolian, Locrian, Harmonic Minor, Melodic Minor. Each entry captures the mode's most identifying degrees (e.g. Phrygian = 1 / β2 / β3 / β7). When Quantize to scale is on, the snap cache fills with those notes so a pitch-LFO arpeggiates inside the mode instead of wandering chromatically.
- Cymatic β Tetrachord 4:5:6:7, 3:4:5:7, harmonic 6:8:10:13, etc. Chosen to give visually striking nodal patterns.
- Spectral β Sable's chord (Vingt Regards), Scriabin Mystic, Ligeti Lontano, β¦
5Tuning systems
The frequencies the chord pill produces depend on the tuning you choose.
- 12-TET β modern equal temperament (default). 12 equal semitones per octave.
- Just Intonation β small-integer ratios. Beats less; sounds "locked."
- Pythagorean β stacks of 3:2 fifths. Bright, edgy.
- Verdi (432 Hz) β A4 = 432 Hz instead of 440.
- Lou Harrison Free JI β flexible just intervals tuned to a 1/1.
- Harry Partch 43-tone β Partch's 11-limit microtonal lattice.
- Wendy Carlos Ξ± (alpha) β 78Β’ step, ~15.4 notes per octave.
- Wendy Carlos Ξ² (beta) β 63.8Β’ step, ~18.8 notes per octave.
- Wendy Carlos Ξ³ (gamma) β 35.1Β’ step, ~34.2 notes per octave.
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:
- INIT (pinned to the top) β a neutral starting patch. Four sine voices at A2 / E3 / A3 / Cβ―4, modest pan spread, all FX zeroed, all LFOs off. Identical to the state the app boots into on first launch. Use it as a blank canvas when you want to build a sound from nothing instead of editing a character preset.
- Drone Artists β 38 character-rich presets that capture each artist's signature waveforms + FX + LFOs, not just their pitches: Pauline Oliveros, Terry Riley, Γliane Radigue, Stars of the Lid, Sunn O))) (drop master volume first), William Basinski, Phill Niblock, Charlemagne Palestine, Yoshi Wada, Harold Budd, Alice Coltrane, Earth, Nurse With Wound, Keiji Haino β most appear twice, once as the original tribute and again as a (Granular) or (Fading) variant that exploits the new granular waveform and per-loop sample fades. A final Drift Showcase sub-set (Tide Breath, Detune Choir, Quarter-Tone Cluster, Pendulum Dawn, Tibetan Bowl Cycle, Microtonal Dance) demos the per-voice drift amount / period overrides β each preset uses a different drift shape so you can hear what the Ocean / Wave / configurable-period modes actually do.
- Developer Patches β 16 patches showcasing the granular sampler, BPM-quantized grain density, FX Mix LFO, modal chords, and per-voice timing envelopes. Includes four named JG patches converted from a personal collection (Ondulations, Dub Wave, Freedom Did Not Lose, Piano Repetition), 10 procedural patches in the same vein (built around unusual scales, modal tunings, granular sampling, and staggered start delays), and two showcase patches (Pulse Lock, Bloom Swell) that lean specifically on BPM grain sync + FX Mix LFO swells. Treat this section as the demo-reel for "what the new tools can do."
- Binaural β Theta, Alpha, Beta and Gamma beat presets (paired carriers ~7, 10, 17, 40 Hz apart).
- Natural Resonance β Earth, OM 136.1, Sun 126.22, Moon 210.42, Phi-augmented chord, Sable's chord.
- Cymatics β chords chosen to produce especially symmetric Chladni patterns.
- Mystic & Composers β Scriabin Mystic chord, Ligeti chromatic / whole-tone / microtone clusters.
- Solfeggio β 96, 174, 285, 396, 417, 528, 639, 741, 852, 963 Hz singles. See the note on Solfeggio claims below.
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.
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.
- Share (iOS): in the Presets sheet, tap the β icon next to a preset. The iOS share sheet opens β pick AirDrop, Save to Files, iCloud Drive, Mail, or Messages. Typical preset is ~5β15 KB without a sample, ~7 MB with a 5 MB WAV.
- Import (iOS): top-right β icon in the Presets sheet opens the Files picker filtered to
.dronepreset. Or β even simpler β just tap the file in Files / Mail / AirDrop and iOS hands it directly to Drone Meditations. - Share (web): the βͺ button on each row downloads the file. Drag it to a Files window or iCloud Drive folder and it appears on every device signed in.
- Import (web): top-right Import⦠button in the Presets sheet opens a file picker; pick a
.dronepresetand it's added to Your Presets. - Same format on iOS and web β a preset shared from the iPhone app loads in the browser app and vice versa.
- Re-imports never overwrite β every import gets a fresh id, so importing the same file twice gives you two distinct entries. The original creation date is preserved so you can see when the author saved it.
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.
| Waveform | Character | Best for |
|---|---|---|
| Sine | Pure fundamental, no harmonics. | Binaural carriers, calm pads, sub-bass. |
| Triangle | Soft harmonic content, falls off fast. | Organ-like, warm thirds, Riley/Reich repetition. |
| Sawtooth | Rich harmonic stack, classic bowed-string / brass. | Stars of the Lid pads, Coltrane organ, Sunn O))) low end. |
| Square | Hollow, odd harmonics only. | Doom octaves, NWW textures, Earth dyads. |
| White noise | Flat spectrum β equal energy at every frequency. | Tape hiss, wind, breath, NWW bursts. Frequency knob has no effect. |
| Pink noise | 1/f spectrum β natural-sounding, warmer than white. | Surf, rain, Basinski tape-decay layer, ambient ground floor. |
| Granular | Pink 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. |
| Sample | User-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)
When you pick Granular as the waveform, a GRAIN row appears under the picker with four sliders:
- SIZE β grain length, 5β500 ms (log). Short grains read as clicks; medium grains (~25β80 ms) sound like raindrops; long grains (~200β500 ms) bleed into soft clouds.
- DENSITY β average grains per second, 0.5β50/s (log). Below 1/s the readout flips to N/min for the geiger-counter range. Combine sparse density + short grains for "rare events," or dense + medium for a downpour. BPM-quantized density: tap the small denomination chip next to the slider (it cycles off β Β½ β ΒΌ β ΒΌt β β β β t β 1/16 β 1/16t β 1/32 β 1/32t) to lock grain spacing to a musical division of the global BPM. The slider then becomes a visual indicator only β the actual density follows tempo. Change the BPM and every quantized voice retimes instantly. Combine 1/16t grains on one voice with ΒΌ grains on another for polyrhythmic clouds that still feel locked.
- JITTER β randomness in inter-grain timing, 0β100 %. 0 = perfectly clocked; 100 = pure Poisson scatter (each grain feels independent).
- SPREAD β random per-grain stereo placement, 0β100 %. Acts on top of the voice's main pan slider, so you can offset the grain field while keeping its center.
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.
| LFO | Default target | Suggested use |
|---|---|---|
| LFO 1 | Amplitude | Slow tremolo / breathing pad. |
| LFO 2 | Filter cutoff | Vowel-like sweeps. |
| LFO 3 | Pan | Stereo wander, auto-pan. |
| LFO 4 | Pitch | Vibrato (small depth) or wobble (large). |
| LFO 5 | Grain density | Stuttering grain pulses, rhythmic delay swing, breathing reverb decay. |
Shared controls (all 5 LFOs)
- Shape β Sine, Triangle, Sawtooth, Ramp, Square, Sample & Hold.
- Rate β 0.02 β 8 Hz (log). Each LFO can also lock its rate to a musical subdivision of the global BPM (Β½ β 1/32T).
- Depth β how strongly it modulates the target.
- Target(s) β toggleable chips: one LFO can drive multiple targets at once. Tap PAN and CUT on the same LFO and a single triangle wave will sweep both stereo position and cutoff in lock-step.
LFOs 1β4 β synth targets
Each of the first four LFOs picks from a shared seven-target pool:
- VOL (amplitude), PAN, CUT (filter cutoff), Q (filter resonance), Pitch, FM (FM index), and FX (FX Mix macro).
- The FX target is a macro: it biases the voice's reverb, delay, and chorus mix amounts together (Β±0.5 around their base values), so a slow sine on FX produces a single coordinated wet/dry breathing swell across the whole effects rack β much more cohesive than independently modulating each wet-mix slider. Pair with a fast pitch-LFO or grain texture for dub-style "let it ring out, pull it back" gestures.
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.
| Group | Chip | Effect |
|---|---|---|
| Grain | gSize | Multiplicative Β±50% on grain size (ms). Slow shapes = breathing texture, S&H = grain-size stutter. |
| gDens | Multiplicative Β±50% on grain density (Hz). With BPM-quantize on the density chip, S&H gives Steve Reich-style rate phasing. | |
| gJit | Additive Β±0.5 on grain timing jitter. Loose grain field comes and goes. | |
| gSpr | Additive Β±0.5 on grain pan spread. Mono / wide breathing. | |
| Delay | dTime | Multiplicative Β±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. | |
| Reverb | rDec β | Multiplicative Β±25% on reverb decay seconds. Subtle "room breathing" effect. |
| rMix | Additive Β±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 βΎ 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.
-
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. -
Run the mirror script.
python3 web/samples/mirror_from_ios.pyIt copies every audio file from
DroneMeditations/Samples/intoweb/samples/<Category>/, deletes web entries that no longer exist on iOS, and regeneratesweb/samples/index.jsonfresh. Pass--exclude-larger-than 10to skip files over 10 MB (or whatever cap you want) if a particular sample would inflate the static site too much. -
(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 toweb/samples/display_names.json:{ "overrides": { "your-file-stem": "Your Pretty Display Name" } }Re-run the script after editing.
- 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.
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.
-
Drop the
.dronepresetinto the staging folder. Put the file inJGPresets/(named for the original "JGβ¦" patches but used as the staging area for any incoming preset envelope, regardless of who authored it). -
Extract the embedded sample(s).
python3 JGPresets/extract.pyWalks every
.dronepresetin the staging folder, pulls the inline-encoded WAV bytes out of each envelope, and writes them intoDroneMeditations/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 refreshesJGPresets/_summary.jsonwith 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. -
Tell the Swift generator to include the new preset. Edit
JGPresets/gen_swift.pyand add the preset's name to theINCLUDEset, plus a one-line subtitle toSUBTITLES:INCLUDE = {"JG Dub Wave", "JG Ondulations", "JG JoG", ...} SUBTITLES = { ... "JG JoG": "Author recording Β· JoG sample-granular study", }Names that aren't in
INCLUDEare silently ignored β useful for staging presets you haven't curated subtitles for yet, or that have huge samples you want to trim before bundling. -
Generate the Swift block.
python3 JGPresets/gen_swift.pyWrites
JGPresets/_generated_presets.swiftβ a paste-ready list of SwiftPreset(β¦)initializers, one per included preset. Each block translates the JSON envelope into typed Swift fields (Voice,FilterState,ReverbState, etc.) so it reads naturally insidePreset.swift. -
Paste the block into
Preset.swift. OpenDroneMeditations/Models/Preset.swift, scroll to the Developer Patches section (look for the comment "Generated from JG.dronepresetfilesβ¦"), and paste the newly-generated block in alphabetical order. The XcodeSamples/folder is a folder reference, so the new WAV ships in the app bundle on the next build with no project.pbxproj edit needed. -
Mirror the new sample to web.
python3 web/samples/mirror_from_ios.pySame script used for the bundled-samples sync above. Copies the new
.wavfrom the iOS folder intoweb/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 toweb/js/music.jsin the same Developer Patches section.) -
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 thePreset.swiftpaste.
.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
- Click Load file⦠on any oscillator's sample row.
- Pick a WAV / MP3 / OGG / FLAC file. Mono or stereo, any sample rate.
- The file is stored in your browser's IndexedDB (web) or the app's Documents folder (iOS) so it persists across sessions and into saved presets.
Sample voice behavior
- The frequency slider becomes a playback rate control β sliding up resamples the file faster (higher pitch).
- The same FX chain (filter / drive / chorus / delay / reverb / LFOs / drift) applies to samples.
- Samples are referenced by ID in user presets, so multiple presets can share one file without duplication.
Sample play window β trim, loop, fade
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:
- START (0β100%) β where in the file looping begins. Skip past silence, bowing scrapes, or a recording's noisy intro.
- END (0β100%) β where the loop wraps back to START. Trim off the decay tail so the loop point lands somewhere musically useful.
- FADE IN (0β10 s) β each loop pass fades up over this duration. Set to ~0.5β2 s to soften the loop-start seam on percussive material.
- FADE OUT (0β10 s) β each loop pass fades down toward END. The classic trick: equal fade-in and fade-out at ~β of the window length give you a continuous breathing loop with no audible seam, even on harsh source material.
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.
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:
- pos (0β100%) β centre position in the sample. Grains are pulled from around this offset. 0 = start of file, 100 = end. A slow drift on pos via a pitch-LFO target gives you scanning-over-time textures.
- scan (0β100%) β per-grain position jitter. 0 = freeze on the exact offset (the most static, cymatic result). 100 = pull grains from anywhere in the sample (most chaotic). Mid-range gives a softly-rumbling cloud.
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.
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:
- Position β when it fires, entered in bars + beats at the session BPM (e.g. "Bar 2, Beat 2.5" = the upbeat of beat 2 in the second bar), snapped to a 1/16-bar grid. Positions are tempo-relative: change the BPM and the whole timeline rescales in proportion, so the structure holds at any tempo.
- Apply to β All voices or OSC 1-4. All voices fires for every voice regardless of fade / mute state. A per-voice chord change transposes just that voice; All voices also updates the patch's key + chord pill.
- Action β one of eight: Chord change, Fade in / Fade out (0-15 s ramp), Waveform (including picking a bundled sample), Level (0-100% set), Mute toggle, plus LFO rate and LFO depth β target any of the 5 LFOs to, say, ramp an S&H pitch envelope from a whisper to a storm across a session.
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.
- 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.
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
Pick a drift scene and the app gently wanders the chosen parameters over minutes. Scenes include:
- Glacial up / down β every voice slowly climbs or descends by a few cents.
- Octave up / down β voices migrate Β±1 octave over the session.
- Wave / Ocean β sine-shaped pitch sway that breathes up and down forever. Wave is the slow up-and-back swing tied to the session timer; Ocean is a perpetual ~90-second Β±ΒΌ semitone tide that never resolves β the closest thing to a "still" preset that still feels alive.
- Opposite pan β voices 1&2 drift left, 3&4 right.
- Coordinated scenes β 2 voices up + 2 down, centered drone w/ pair drifting, full panning spiral, β¦
- Custom β set the dropdown on any single oscillator strip (π) to mix-and-match modes per voice.
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.
- Amount β Β½ Β· 1 Β· 2 Β· 3 Β· 5 Β· 12 Β· 24 semitones. Lets you turn a glacial 12-cent drift into a 1- or 2-octave migration, or pull a 1-semitone bend down to a near-static Β½-semitone breath.
- Period β 10 s Β· 30 s Β· 1 / 3 / 5 / 10 / 20 min (Ocean defaults to ~90 s if you don't override). Slower periods turn drift into pure ambience; faster periods make it audibly cyclic.
- An Auto chip in each section resets that voice to the scene's default amount/period.
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
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
25 multi-stage timed journeys auto-advance through presets + drift scenes. 15 general + 10 drone-artist:
- General: Sundown, Awakening, Floating, Body Scan, Cathedral, Mountain Climb, Vespers, Crystal Cave, Phi Spiral, Quartz, Lullaby, Tibetan Bowl, Storm Front, Centering, Spiral Descent.
- Drone-artist arcs: Deep Listening Lineage (Oliveros β Radigue β Stars of the Lid Β· 45 min), Heavy Resonance (Sunn O))) β Earth β Niblock Β· 30 min Β· drop master volume!), Minimalist Arc (Riley β Budd β Palestine Β· 25 min), Spiritual Path (Coltrane β Wada β Haino Β· 35 min), Sonic Cathedral, Black Mass, Slow Bloom, Tape & Tar, Awakening Drone, Microtonal Garden.
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 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:
- Log interpolation on frequencies, filter cutoff & Q, reverb decay, delay time, chorus rate, FM index (musically smoother than linear across octaves).
- Linear on mix / depth / pan / drive / feedback / width.
- Discrete swap at the midpoint (β₯ 50%) on waveform, filter type, delay mode, FM source, LFO shape + target.
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.
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.
13Pop-out Chladni (web)
A dedicated window with WebGL-accelerated rendering, 3000 sand particles, and snapshot export.
- Open from the Chladni toggle's pop-out arrow.
- Receives live oscillator state from the main window via
BroadcastChannelβ frequencies, mutes, solos, vibrato all sync at ~15 fps. - 3000 sand grains drift along the gradient toward nodal lines. Particles physically migrate to new positions when frequencies change.
- Bottom controls strip mirrors frequency/solo/mute for each voice β adjust without flipping back to the main window.
- The π· snapshot button (or S) saves a PNG to Downloads and mirrors it into the in-app Gallery.
- The sand toggle (or G) removes the particle layer for a cleaner shader-only image.
- Scroll wheel zooms; Esc closes the window.
14Spectrum analyzer
Real-time FFT view tapped post-limiter.
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.
- Stop: 8 s total fade. Logarithmic master descent (every second drops the same number of dB, so the wind-down feels uniform). Reverb bloom peaks at ~2.4 s (mix climbs to 0.7, decay to 7 s), then ramps back down so the wet signal joins the master in silence by t=8 s.
- Pause: 1.4 s total fade. Same triangular shape, smaller bloom (peak mix 0.35, decay 3.5 s, peaks at ~0.35 s). A gentle "lift then settle" β quick enough to feel like a pause, atmospheric enough to feel composed.
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.
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:
- Web β WebM/Opus or WebM/PCM (whatever your browser supports), saved to Downloads.
- iOS β two files per session, both written into
Drone Meditations/Recordings/in the Files app:- .wav β 24-bit uncompressed PCM. The primary deliverable: bit-perfect, professional-grade, ideal for editing in a DAW or archival. Large (~17 MB/min stereo).
- .m4a β AAC sidecar, ~10Γ smaller, identical loudness + fades baked in. Ideal for AirDropping, emailing, or dropping into the Music app.
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.
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)
| Key | Action |
|---|---|
| Space | Play / pause transport. |
| Esc | Close 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 wheel | Zoom 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:
- brusspup (Eric Roner) β for the Chladni demo footage used to physically calibrate the visualization.
- The Web Audio, AVAudioEngine, and SwiftUI teams β for primitives stable enough to ship a 4-voice synth in a weekend.
- Wendy Carlos, Harry Partch, Lou Harrison β for the tuning systems that broaden what "in tune" can mean.