Audio tool · No upload
Slow down or speed up a song — and change its key, separately
Drop in your own audio and move the tempo and the pitch independently: slow a song down or speed it up without dropping the key, or change the key without changing the tempo. It is a music speed changer and a pitch shifter in one, and everything runs inside your browser — nothing is uploaded, and the network meter below proves the zero live.
Two recipes these dials already make: 0.80× speed with hall reverb, or 1.25× speed with the pitch a few semitones up.
Time stretch 1.00× — nothing to process at 0 semitones, 1.00× speed and no reverb: the audio is decoded and re-encoded to MP3 unchanged.
How this tool works
When you choose a file, the browser's File API hands this page the bytes in memory — no transfer happens, because the file is already on your machine — and your browser decodes the audio itself. What happens next is written on this page and nowhere else. The samples are cut into overlapping 2048-sample frames, each frame goes through a fast Fourier transform written here, and the frames are laid back down further apart or closer together than they were picked up. That alone changes the length and leaves the pitch alone. Reading the stretched result faster or slower then moves the pitch and takes the length back to where you asked for it, and those two steps together are what make the pitch dial and the speed dial independent instead of one dial wearing two labels. Each spectral peak's phase is advanced by its own measured frequency and every bin around that peak is rotated by the same amount, which is what keeps a chord sounding like one chord rather than a smeared chorus of it.
There is no digital-signal-processing library on this page. The transform, the phase vocoder, the resampler and its anti-alias filter, and the reverb's comb and allpass delay lines are all written in the page's own JavaScript, which you can read in your browser's view-source. The one thing that ever downloads is the MP3 encoder — lamejs, a JavaScript port of the LAME encoder (LGPL) — and it arrives once, before any file of yours is read, so the network meter's zero is honest rather than decorative. You can run the strongest check yourself: let the encoder land, switch your wifi off, and convert something. It still works. All of that arithmetic happens on this page's own thread, so a full-length track takes real time rather than arriving instantly — the status line counts the percentage out as it goes, and the page keeps responding while it does. The methodology page covers the other verifications and publishes the encoder's license and provenance.
The honest limits, because this is a corner of the web that oversells. Pitch shifting of this kind is not transparent, and the cost was measured rather than described. A 2 ms percussive burst put through this page keeps over 99% of its energy inside a 5 ms window at any time stretch from 0.25× up to 1.50×, and loses about half of it at a 2.00× stretch — because a hit shorter than the 46 ms analysis window lands in several frames at once, and spreading those frames apart lays the hit down more than once. That is the whole reason the readout prints the time stretch your two settings add up to, and why the result row flags anything above 1.50×: half speed at unchanged pitch is a 2.00× stretch, and 0.80× speed is a 1.25× stretch. Sustained notes take a gentler penalty instead, a faint metallic colour that grows with distance from 1.00×. Formants move with the pitch, so voices change character; this is not a formant-preserving vocal shifter. Files longer than ten minutes are refused by name rather than attempted, because the whole track sits in your device's memory several times over. The output is MP3, which is lossy, so this is a re-encode and costs a generation of quality on top of whatever the processing did — and if the result would clip it is turned down, with the row naming the decibels rather than clipping quietly.