Slowed, Nightcore, 8D: What Each One Actually Does to a Song
Slowed, nightcore and 8D are three filter chains sharing one component. The exact asetrate, apulsator and aecho values, and the order to stack them in.
Four pages on this site, one file in the codebase: components/tools/AudioEffect.tsx holds four presets and the page you land on decides which one is rendered. Three of them are the subject here — two are the same filter with the multiplier on opposite sides of 1.0, and the third is unrelated to both. (The fourth, Bass Booster, shares the plumbing and nothing else.) The easiest way to get this wrong is to reach for a speed control that was built to do the opposite: Video Speed Changer holds pitch steady on purpose.
Pick the tool in one line
| You want | Tool | Core filter | Control | Pitch moves with tempo? |
|---|---|---|---|---|
| Slowed + reverb | Slowed + Reverb | asetrate below 1.0 + aecho |
slider, 0.70–0.95× | Yes — that's the sound |
| Nightcore | Nightcore Maker | asetrate above 1.0 + treble |
slider, 1.10–1.40× | Yes |
| 8D / "rotating" audio | 8D Audio Converter | apulsator |
slider, 0.04–0.30 Hz | No — speed is untouched |
| Slower talk, same voice | Audio Speed & Pitch | atempo |
slider, 0.25×–4× | No |
| Different key, same length | Audio Speed & Pitch | asetrate + atempo undo |
slider, −12 to +12 st | No |
| Slowed video, picture follows | Slowed + Reverb, video kept | setpts + asetrate |
slider, 0.70–0.95× | Yes |
| Faster video, voice unchanged | Video Speed Changer | setpts + atempo |
eight fixed buttons | No |
The last row is the trap, and it is worse than it looks. Video Speed Changer does not offer a slider at all: SPEED_PRESETS = [0.25, 0.5, 0.75, 1, 1.5, 2, 3, 4], rendered as eight buttons, defaulting to 2×. The nearest thing to a slowed edit is 0.75×, and because the audio path is an atempo chain the song comes back in its original key — a slow video with a normal-sounding track. Technically correct, wrong genre.
Slowed + reverb: the exact chain
At the 0.85× default with the heavy-reverb box unchecked, the chain built in components/tools/AudioEffect.tsx is:
aresample=44100,asetrate=44100*0.8500,aresample=44100,aecho=0.8:0.88:60:0.4,alimiter=limit=0.97
asetrate does not process samples — it relabels them. Tell FFmpeg the 44,100 samples it has are 37,485 samples per second and everything slows down and drops in pitch by the same ratio, exactly like a turntable at the wrong speed. The trailing aresample=44100 puts the sample rate back so the file is playable; the slowdown stays.
The leading aresample=44100 matters more than it looks. 44100 is hardcoded in the multiplication, so a 48 kHz source without that first resample would land at 44100 × 0.85 ÷ 48000 = 0.781× — you'd click "Classic" and silently get "Deep".
| Preset | Speed | Pitch shift | 3:30 track becomes | Slider |
|---|---|---|---|---|
| Slight | 0.92× | −1.4 semitones | 3:48 | — |
| Classic (default) | 0.85× | −2.8 semitones | 4:07 | — |
| Deep | 0.78× | −4.3 semitones | 4:29 | — |
| Slider floor | 0.70× | −6.2 semitones | 5:00 | min |
| Slider ceiling | 0.95× | −0.9 semitones | 3:41 | max |
Semitones are 12 × log2(speed) — arithmetic, not taste. 0.85× is a hair under a minor third down, which is why vocals sit in a recognisably different register rather than sounding merely sluggish.
The reverb is two numbers on a checkbox. Off: aecho=0.8:0.88:60:0.4. On: aecho=0.8:0.9:80:0.55. That is in_gain:out_gain:delay_ms:decay — one echo tap at 60 ms or 80 ms, not a reverb tail. Call it slapback. It gives the wash the genre is known for and will not survive comparison with a convolution reverb. The engine ships afir, so impulse-response reverb is technically possible, but no tool exposes it; for a real hall, bounce the slowed file and reverb it in a DAW.
0.85× also drags the whole spectrum down 15%. A 128 kbps MP3 already lowpassed near 16 kHz comes out near 13.6 kHz; at 0.78×, near 12.5 kHz. Part of the "muffled" complaint is the source, not the filter — start from WAV or FLAC where you can.
Nightcore is the same filter, mirrored
aresample=44100,asetrate=44100*1.2500,aresample=44100,treble=g=3,alimiter=limit=0.97
Identical structure, multiplier above 1.0, plus a treble=g=3 shelf that is on by default and is the page's only checkbox — there is no reverb control here at all.
| Preset | Speed | Pitch shift | 3:30 track becomes |
|---|---|---|---|
| Mild | 1.15× | +2.4 semitones | 3:03 |
| Classic (default) | 1.25× | +3.9 semitones | 2:48 |
| Hyper | 1.35× | +5.2 semitones | 2:36 |
| Slider floor | 1.10× | +1.7 semitones | 3:11 |
| Slider ceiling | 1.40× | +5.8 semitones | 2:30 |
The useful fact is in the bounds, not the presets: one component, two mirrored slider ranges — 0.70–0.95 on one page, 1.10–1.40 on the other — and neither can reach 1.00×. The nightcore page cannot produce a slowed edit no matter what you drag, the slowed page cannot speed anything up, and neither will hand you an unmodified file.
8D is not reverb, and it is not slow
aformat=channel_layouts=stereo,apulsator=hz=0.120:amount=1:mode=sine,aecho=0.8:0.88:60:0.3,alimiter=limit=0.97
Two details in that string are worth more than any description of the effect. The first is the aformat=channel_layouts=stereo prefix: apulsator has nothing to sweep between unless there are two channels, so a mono file is upmixed to stereo first, after which the same signal is swept between the two. A stereo mix keeps whatever width it already had, and that width moves with the sweep. The second is the echo tap — aecho=0.8:0.88:60:0.3 against the slowed page's 0.8:0.88:60:0.4. Same delay, lower decay. The 8D echo is deliberately the weaker of the two, because a long tail smears the left-right position the effect exists to create.
| Preset | Rate | Seconds per full rotation |
|---|---|---|
| Slow | 0.08 Hz | 12.5 s |
| Classic (default) | 0.12 Hz | 8.3 s |
| Fast | 0.20 Hz | 5.0 s |
| Slider floor | 0.04 Hz | 25 s |
| Slider ceiling | 0.30 Hz | 3.3 s |
Two things to know before you publish one. This is amplitude panning, not binaural HRTF — the shipped core has no sofalizer, so there is no head-related filtering, no elevation, nothing behind you. And amplitude panning is fragile downstream: on a mono downmix the two channels' opposite gain curves sum back to a near-constant level and the rotation flattens out — exactly so for a mono source, near enough for a stereo one. A single-speaker device that plays only one channel does the opposite, turning the sweep into obvious volume pumping. Either way 8D is a headphone format, which is the short version of the tool page's own answer about speakers. Label your upload accordingly.
When the pitch must not move
Audio Speed & Pitch is the tool that refuses to do what the other three do, and it exposes two independent sliders:
- Speed, 0.25×–4×: a chain of
atempofilters.atempois capped at 0.5–2.0 per instance, so the tool stacks them — 0.25× becomesatempo=0.5,atempo=0.5. Time changes, pitch does not. Right for a lecture, an interview, a podcast. - Pitch, −12 to +12 semitones:
aresample=44100,asetrate=44100*2^(n/12),aresample=44100, then anatempoof the reciprocal to put the duration back. Key changes, length does not. Right for transposing a backing track.
Set the speed slider to 0.85 here and you get a slow song in the original key — a correct result, and the wrong one for this genre. This tool also routes through the shared audio uploader, which hard-rejects anything over 2048 MB and anything that is not audio; the four effect pages have no size check in their drop zone at all and will simply try, then fail on device memory.
Stacking them: slowed + reverb + 8D
Every page applies exactly one preset — the spec table is keyed by a single effect id and there is no chaining UI — so the combination that dominates the format is a manual relay. Four steps:
- Convert the source to WAV with Audio Converter. Lossy in means lossy out at every hop, and there are three hops.
- Run Slowed + Reverb on the WAV. WAV in gives
pcm_s16leout, so nothing is re-compressed. Download it. - Feed that file into 8D Audio Converter. Same deal: WAV in, WAV out.
- Convert back to MP3 or M4A with Audio Converter when you are done.
The order in the middle is not interchangeable. asetrate rescales everything already baked into the file, including a rotation, but apulsator's Hz is wall-clock. Pan first and then slow to 0.85× and your 0.12 Hz rotation arrives at 0.102 Hz — a full circle every 9.8 seconds instead of 8.3. Slow first, pan second, and you get the rate you picked. Nightcore does the same thing in reverse and spins your 8D pass faster than the slider said.
Why every chain ends in alimiter=limit=0.97
aecho adds the echo to the dry signal, so peaks grow. Worst-case peak multiplier is out_gain × (in_gain + decay):
| Chain | Peak factor | Headroom needed |
|---|---|---|
| Slowed, default reverb | 0.88 × 1.20 = 1.056 | +0.5 dB |
| Slowed, heavy reverb | 0.90 × 1.35 = 1.215 | +1.7 dB |
| 8D echo | 0.88 × 1.10 = 0.968 | none |
A track already mastered near full scale plus heavy reverb clips by about 1.7 dB. alimiter=limit=0.97 caps it at −0.26 dBFS. It is always on for slowed, nightcore and 8D — no checkbox.
The same logic drives the pre-cut in Bass Booster, the fourth preset in that same file: volume=-{gain/4}dB, bass=g={gain}:f=110:w=0.6. At +10 dB it pulls everything down 2.5 dB first, so the net is +7.5 dB under 110 Hz and −2.5 dB everywhere else. Its limiter is a checkbox, on by default; turning it off on a loud track will clip.
What actually comes out of the file
This table is the three effect pages plus Bass Booster, which share lib/audioCodecs.ts. Audio Speed & Pitch inlines its own shorter ladder with no Opus and no AIFF branch, so an .opus or .aiff file comes back from that tool as MP3 data wearing the original extension — convert it first.
| Input | Keep video | Output |
|---|---|---|
| MP3 | — | MP3, libmp3lame 192 kbps |
| WAV / AIFF | — | same, pcm_s16le |
| FLAC | — | FLAC |
| OGG / OGA | — | Vorbis, -q:a 6 |
| M4A / AAC | — | AAC 192 kbps |
| OPUS | — | Opus 160 kbps |
| Video, speed effect | yes | always MP4, libx264 -preset veryfast -crf 23, AAC 192 kbps |
| Video, 8D or bass | yes | container kept (mp4/mov/webm/mkv/m4v), -c:v copy |
| Video | no | MP3 192 kbps |
An MP3 in is an MP3 out at 192 kbps, which is the whole reason step 1 of the relay above exists. And a video with a speed effect is fully re-encoded: the shipped core's own configure line reads --disable-pthreads --disable-w32threads --disable-os2threads, so x264 here encodes on one thread however many cores the machine has. Audio-only is quick; a long 1080p music video wants a desktop encoder.
Known failure modes
- Silent video. The speed path builds
[0:a]into afilter_complexand the tone path maps0:a:0. No audio stream, no output. - Two audio tracks. Both paths take the first audio stream and discard the rest. The speed path's
[0:a]label binds the first match — the shipped core carries "matches no streams", "matches a disabled input stream" and an invalid-file-index error, but no "matches multiple streams" — and the tone path maps0:a:0explicitly. So a commentary-plus-music MKV will not error; it will quietly come back single-track. Strip to the track you want first. Read out of the core's error strings, not run end to end. - Nothing normalises loudness. The limiter is a ceiling, not a target, so a quiet master stays quiet. If you kept the video, Audio Normalizer will run a single-pass
loudnorm=I=-14:TP=-1:LRA=11over it. For an audio-only export there is no loudness tool here: the normalizer's drop zone takes video files only and rejects an MP3 before FFmpeg ever starts. Level it in a DAW.
The number nobody measured
Every filter string, bound and codec argument above is read out of this site's own source — components/tools/AudioEffect.tsx, components/tools/AudioSpeedPitch.tsx, lib/audioCodecs.ts — and the semitones and durations are arithmetic on those values. One number in the set is not like the others. 0.85× is genre convention, not a measurement: it is the value shipped as the default in this component, and nothing about it is acoustically privileged.
It is also slightly off a real interval. Three semitones down is exactly 0.8409×, so the default lands about 19 cents sharp of a clean minor third — inaudible on its own, audible the moment you layer anything tuned over it. Drag the slider to 0.84 and the whole track sits in a genuine key a minor third below the original. Nightcore has the same near-miss: 1.25× is +3.9 semitones, while 1.26× is a major third up almost exactly. If you plan to sing, sample or mash anything on top of the result, those two clicks are the difference between a key and a smear.
Try it yourself — free in your browser
No upload, no signup, no watermark — these tools run on FFmpeg WebAssembly locally.