The patch sounded fine on its own. Then it went into the game and every player who crossed a healing shrine heard a teleport beam: a bright zip that rose and cut off before the heal number had faded in. No oscillator was wrong. The envelope and the filter were on the wrong schedule.
A heal shimmer is not a reverb setting. Reverb on a chime gives you a chime in a room. What sells the heal is a stack of partials that arrives slowly, holds its tuning, and sits over a noise filter that keeps opening after the note has already peaked.
Four layers, in build order, with the settings I type. No sample is involved at any point.
Layer 1: Four Sines, Spread by a Few Cents
Start with a root at 220 Hz. Add a fifth at 330 Hz, an octave at 440 Hz, and a quiet partial at 550 Hz. That last one is 2.5 times the root, a major third above the octave.
Level them unevenly: root 0 dB, fifth -3 dB, octave -6 dB, 2.5x partial -18 dB. Equal levels give you an organ, and an organ does not heal anything.
Then detune them, slightly and unevenly: root 0 cents, fifth +4,
octave -3, 2.5x partial +7. In the Web Audio API that is the
detune value on each OscillatorNode, in
cents. In a soft synth it is the fine-tune field beside coarse
tuning.
Detune instead of vibrato
The uneven cents produce slow beating between the partials, roughly 0.5 to 2 Hz at this spread. That is the alive quality in a shimmer: it moves without a pitch gesture, which matters later when the laser reading comes up. Vibrato on one oscillator gives a wobble instead, a far more obvious effect.
Keep the total spread under about 12 cents. Past that the stack stops sounding like one note with movement and starts sounding like a chorus, or simply out of tune. The same stacking logic appears in layering chimes for heal sounds , where the partials come from recorded bells instead.
Why 2.5x and not another octave
An octave at 880 Hz adds brightness but no new information, and it competes with the 440 in a dense mix. The 550 Hz partial adds a colour outside the root chord, sits high enough to survive small speakers, and stays quiet enough never to become the identity of the patch. It is the layer the ring modulation will grab.
Layer 2: Noise Enters Through a Filter, Not a Fader
Take pink noise, high-pass it at 1.5 kHz with a 12 dB per octave slope, then run it through a resonant bandpass at 2 kHz, Q 3. This is the breath of the sound, peaking around -24 dB against the summed tone.
The bandpass is what makes it shimmer instead of hiss. Set its
centre to open from 2 kHz to 6 kHz over 400 ms on an exponential
curve. In Web Audio, exponentialRampToValueAtTime on
the BiquadFilterNode.frequency parameter does this.
A linear ramp sounds mechanical, because the ear hears ratios,
not hertz.
Do not fade the noise in with the amplitude envelope. If its gain rises alongside the tone you get a whoosh under a chime, and a whoosh is a transition, not a state correction. The noise can be there from the first millisecond. Let the filter do the opening.
Q is the whole character
Below a Q of about 1.5 the bandpass is so wide it acts as a tone control, and the layer becomes broadband hiss that tires the ear after twenty pickups. Above about 6 the resonance whistles on its own, which reads as a synth lead rather than air. Between 2.5 and 4 you get a defined peak that moves without the filter becoming the melody.
If the layer needs EQ before or after the filter, the trades in warm versus bright EQ choices are the same ones you would make on any heal cue. A lift near 5 kHz adds sparkle. A lift near 800 Hz adds body and pushes the patch toward a chime.
Layer 3: Ring Modulate the Top Partial
Ring modulation across the whole stack turns a shimmer into a bell or a robot voice, because it multiplies every partial and the sidebands stop being harmonic. Applied to the 550 Hz partial alone, it adds edge where the ear pays least attention to tuning.
Multiply that partial by a sine at 110 Hz. The sidebands land at 440 Hz and 660 Hz, the octave and the twelfth, so the result stays harmonic and thickens the top. Mix at 15 to 20 percent wet. For sparkle instead of thickness, move the modulator to 137.5 Hz: the sidebands go to 412.5 and 687.5 Hz, inharmonic, rubbing against the fixed partials.
The arithmetic is the carrier plus and minus the modulator, each at the depth you dial in. Keep it low. At 15 percent the sidebands sit near -16 dB below the carrier and read as texture; at 50 percent they become the sound.
Layer 4: A Short Reverb Send, Placed Under the Swell
The reverb is not pitch material. It is what makes the stack occupy a space instead of sitting flat on the bus. Send at -14 dB into a plate or room with a 1.6 second decay and 25 ms of pre-delay, high-pass the return at 400 Hz, low-pass it at 8 kHz.
Now the envelope. Attack between 40 and 120 ms, a hold of 200 to 300 ms, an exponential decay of 800 to 1000 ms. Below roughly 20 ms the onset reads as a click or a pluck, and a pluck is an event, not a state change. Past about 150 ms the ear files the sound as a pad fading in, and in combat it gets masked before it arrives.
Why the laser reading happens
A laser is fast, high and moving in one direction. It usually gets built by accident, when a filter sweep, a pitch rise and a short envelope all happen at once. If your bandpass crosses 2 to 6 kHz in 40 ms with a Q of 8 while the root glides up, you have built a laser with a heal patch on top.
Decouple the movements. Let the filter sweep take 300 ms or more, keep Q at 4 or below, and do not glide the pitch. The detuned partials already supply motion. One moving element at a time is often the whole difference between a shimmer and a weapon.
Phase alignment is not cosmetic
Four oscillators starting at zero phase sum constructively in the
first few milliseconds, which is exactly where the attack lives.
Start them at different phases and the onset sum can drop by 3 to
6 dB, differently on every retrigger. An
OscillatorNode starts at zero by default, but
scheduler drift, a random offset or a running LFO will break that.
Render the same note four times and compare peaks at 10 ms, then
check the mono sum, where a cancelling beat between detuned
partials can drop the level for a moment.
Checking It on a Phone Speaker
High-pass the whole patch at 500 Hz, fold it to mono, play it at half volume. The 220 Hz root nearly disappears, the fifth goes thin, and what remains is the octave, the 550 Hz partial and whatever the noise is doing. If the shimmer collapses into hiss there, the identity was living in the noise, and a laptop will not save it.
Then high-pass at 800 Hz, roughly what a phone speaker does at its worst. The 440, the 550 and the ring sidebands should still carry a recognisable pitch and movement. If they do not, raise the 550 partial before reaching for EQ.
Trigger the patch three times with 150 ms between hits. The swell restarts each time, so the attacks stack; decide whether that is the behaviour you want or whether the second trigger should duck the first. For several pickups, the approach in generating heal variants keeps them related.
Starting Parameters
| Layer | Starting value |
|---|---|
| Root sine | 220 Hz, 0 dB, 0 cents |
| Fifth | 330 Hz, -3 dB, +4 cents |
| Octave | 440 Hz, -6 dB, -3 cents |
| 2.5x partial | 550 Hz, -18 dB, +7 cents |
| Noise | Pink, high-pass 1.5 kHz at 12 dB per octave, -24 dB |
| Bandpass | 2 kHz to 6 kHz, Q 3.0, 400 ms exponential |
| Ring mod | 550 Hz into 110 Hz sine, 18 percent wet |
| Envelope | 80 ms attack, 250 ms hold, 900 ms decay |
| Reverb | -14 dB send, 1.6 s decay, 25 ms pre-delay |
Render at 48 kHz, 24-bit, master around -6 dBFS before import. Leave enough tail that the decay is not truncated, but check the file length against the voice limit; a 1.4 second shimmer six voices deep is a real cost in a busy scene.
None of these numbers are a specification. They are a starting point that already dodges two common failures: the laser reading and a shimmer that only exists in headphones. Adjust against the palette of the game, and listen on the smallest speaker you can find.