ChronoFlow is a browser-based modular synthesizer with 57 module types, hierarchical patching, send/return effect buses, a real-time audio analysis API for visuals integration, and generative sequencing tools designed for ambient music.
โถ Launch ChronoFlowClick and drag vertically. Hold Shift for fine control. Double-click to reset to default.
Each node shows a small LED that glows green (signal present) or orange (loud). Output nodes show a level meter.
Standard audio oscillator with sine, saw, square, triangle waveforms.
Multi-voice pad oscillator with up to 8 stacked voices, organic per-voice drift, sub-oscillator. Modes: unison, harmonics, fifths, octaves.
8 morphable wavetables: sine โ warm saw โ soft square โ formant โ organ โ glass โ choir โ digital. Smooth crossfade morphing.
White or pink noise generator. Essential for percussion, texture, and as resonator exciter.
Physical modeling string synthesis. Produces realistic plucked string and bell tones.
Granular processor. Records audio input and plays overlapping grains with position, spray, pitch, and reverse controls.
Random walk generator that wanders smoothly. Perfect for slow ambient modulation.
Microphone or external audio stream input.
Low frequency oscillator for modulation. Connect to any modulation input (purple ports on top of nodes).
Attack/Decay/Sustain/Release envelope. Trigger via MIDI, keyboard, or trigger input.
Tracks the amplitude of input signal and outputs a CV envelope.
Master tempo clock. Outputs trigger pulses at the set BPM.
Divides clock rate into /1, /2, /4, /8 outputs.
8-step CV sequencer with per-step velocity and probability.
Euclidean rhythm generator. Distributes N pulses across M steps as evenly as possible.
Samples input value on each trigger.
Quantizes CV to musical scales (chromatic, major, minor, pentatonic, etc.).
Smooths/portamentos CV changes. Separate rise/fall times.
Scales and inverts signals. Add offset.
Boolean logic (AND, OR, XOR) on trigger signals.
Randomly passes or blocks gate signals.
Single knob that outputs to 4 mapped parameters.
Compares CV to threshold, outputs gate.
Shift register-based pseudo-random CV generator. Lock probability controls how much it mutates.
Counts triggers, fires output after N pulses.
Progresses through scenes/sections on clock. Great for long-form composition.
Routes between up to 4 inputs.
Blends between two audio sources with CV control.
Resonant lowpass/highpass/bandpass filter.
Voltage controlled amplifier. Use with ADSR for amplitude envelopes.
Bank of up to 12 tuned resonant bandpass filters. 5 modes: harmonic, inharmonic (bell/bar), octaves, chord, free. Trigger input for struck excitation.
Harmonic waveshaping distortion.
Ring modulator for metallic/bell tones.
Granular pitch shifting.
Shifts vocal formants independently of pitch.
Fixed Hz frequency shifting (Bode shifter).
Resonant metallic comb filter.
Channel vocoder with carrier/modulator inputs.
3-band parametric equalizer.
Dynamics compressor with sidechain input.
Bit depth and sample rate reduction.
Clean stereo delay with feedback.
Analog tape echo with wow, flutter, soft-clip saturation, and per-repeat high-frequency degradation. Each repeat gets darker like real tape.
Convolution reverb.
Reverb with pitch-shifted feedback for ethereal, infinite textures. Classic ambient effect.
FFT-based spectral freeze/blur. Captures the frequency spectrum and resynthesizes with randomized phases for infinite sustain (PaulStretch-style). Spectral shift and feedback for evolution.
Multi-voice ensemble/chorus effect.
Buffer stutter, reverse, and pitch-ramp effects.
Pan, stereo width (mono to hyper-wide), mid/side balance, and Haas effect delay for psychoacoustic width.
4-channel audio mixer.
Aux send to a named bus. Taps a percentage of signal while passing dry through. Multiple sends can feed one bus.
Receives audio from a named bus. Connect to shared effects (e.g., one shimmer reverb serving multiple sources).
A lush, immersive ambient piece demonstrating parallel effects routing.
Generative plucked textures raining through shimmer reverb.
Deep evolving ambient with multiple layered textures and extensive bus routing.
Drag from any output port (right side of node) to any input port (left side). Modulation inputs (CV) appear as small purple dots on the top of nodes. All signal types are compatible โ ChronoFlow is permissive like real modular synths.
Send/Return enables parallel effects processing โ the studio standard for ambient music production.
Available: A, B, C, D, reverb, delay. The name is just a label โ any Send and Return with the same name are connected.
| Key | Action |
|---|---|
| โK / Ctrl+K | Command Palette (search everything) |
| P | Toggle piano keyboard |
| โZ | Undo |
| โโงZ | Redo |
| Delete / Backspace | Delete selected nodes |
| AโK (piano row) | Play notes on piano keyboard |
ChronoFlow includes a real-time Audio Analysis Bus that external JavaScript can subscribe to for driving visuals (Three.js, p5.js, Canvas, WebGL, etc.).
import { audioAnalysisBus } from 'chronoflow/engine';
// Subscribe to full spectrum data at 60fps
audioAnalysisBus.onSpectrum((data) => {
// data.bands.bass โ 0-1 bass energy
// data.bands.treble โ 0-1 treble energy
// data.centroid โ spectral brightness (Hz)
// data.loudness โ 0-1 RMS loudness
// data.beat โ boolean beat detected
// data.beatStrength โ 0-1 beat intensity
// data.envelope โ smoothed amplitude
// data.frequencies โ Float32Array FFT data
// data.waveform โ Float32Array oscilloscope data
updateVisualization(data);
});
// Or subscribe to specific features:
audioAnalysisBus.onBeat(({ beat, strength }) => {
if (beat) triggerParticleExplosion(strength);
});
audioAnalysisBus.onBands((bands) => {
setBackgroundColor(bands.bass, bands.mid, bands.treble);
});
// Configuration
audioAnalysisBus.setFFTSize(4096); // Higher frequency resolution
audioAnalysisBus.setFrameRate(30); // Lower rate if 60fps not needed
audioAnalysisBus.setBeatSensitivity(1.3); // Lower = more sensitive
Use ChronoFlow's audio engine without the UI โ embed it in any web project.
import { ChronoFlowEngine } from 'chronoflow/engine';
const engine = new ChronoFlowEngine({
masterVolume: 0.7,
autoConnect: true, // connects to AudioContext.destination
});
await engine.init();
engine.loadPatch(myPatchJSON);
// Tweak parameters at runtime
engine.setParam('delay-1', 'mix', 0.6);
engine.setParam('shimmer-1', 'shimmer', 0.8);
// Play notes
engine.noteOn(60, 100); // MIDI note 60, velocity 100
engine.noteOff(60);
// Route to your own audio graph
engine.disconnectFromDestination();
engine.routeTo(myGainNode);
// Event callbacks
engine.on({
onParamChanged: (nodeId, param, value) => { ... },
onPatchLoaded: (patch) => { ... },
});
Start with a Drone Oscillator in fifths or octaves mode. Set drift to 0.3โ0.5 and spread to 15โ25 cents. Route through a lowpass filter with a very slow LFO (0.03โ0.1 Hz) on the cutoff. Send 50โ70% to a Shimmer Reverb bus.
Use Turing Machine โ Slew Limiter โ Quantizer (pentatonic scale). Feed the quantized CV to a Karplus-Strong or Oscillator's frequency mod input. Clock the Turing Machine from an Euclidean rhythm for irregular timing.
Feed any interesting audio into a Spectral Freeze. Enable freeze, set blur to 0.6โ0.9, and adjust brightness to taste. The shift parameter moves the frozen spectrum up/down in pitch โ try +7 semitones (a fifth) for harmonic interest.
Replace clean delays with Tape Delay. Set degradation to 0.5+ so each repeat gets darker. Increase wow/flutter for pitch instability. Chain into Shimmer Reverb for infinite dissolving echoes.
Instead of putting reverb inline (which makes everything wet), use Send/Return. Each sound source gets its own send amount to the reverb bus. This keeps the mix clean while still having deep, shared reverb.
Use Smooth Random nodes to slowly modulate filter cutoffs, reverb mix, and delay feedback. Set rate to 0.02โ0.08 Hz for changes that happen over 15โ60 seconds. Use Scene Chain for structural progression over minutes.