Joiner · No upload
Audio joiner and merger: merge files into one MP3, without uploading
Add MP3, M4A, WAV or anything else your browser can read, drag the rows into the order you want, and download a single MP3. The join runs entirely inside your browser: nothing is uploaded, and the network meter below proves it live.
The list is the play order, top to bottom. Drag a row to move it, or use the ↑ and ↓ buttons — the buttons do the same job from the keyboard. Files are joined in this order when you press Join.
How this joiner works
When you add files, the browser's File API hands this page their bytes in memory — no transfer happens, because the files are already on your machine. Your browser's own audio engine decodes each one, which is why this site ships no decoder for your files at all: the page measures the length and channel count, shows them on the row, and then lets that audio go again. When you press Join, the files are decoded a second time, in the order your list shows, and fed straight into lamejs, a JavaScript port of the LAME encoder (LGPL) running inside this tab. Decoding twice is deliberate: it is what lets the list tell you every file's duration before you commit, while the join itself never holds more than one file's audio in memory at a time — a single concatenated buffer of an hour of stereo audio would be well over a gigabyte. One encoder instance spans the whole join, so the seams sit inside one MPEG stream rather than being glued-together MP3 files. A server never appears in the pipeline because this site doesn't have one.
The seam between two tracks is either a straight join or a crossfade. With the crossfade field empty the last sample of one file is followed by the first sample of the next, exactly. With a duration set, the two tracks overlap for that long: the outgoing one fades down and the incoming one fades up on an equal-power curve, so the loudness through the overlap stays roughly steady rather than sagging in the middle. Both tracks are audible in that window — a crossfade blends a seam, it does not conceal one — and the joined file is shorter than the sum of its parts by the overlap at every seam. A crossfade is never allowed to exceed 45% of the shorter of the two files it joins, so no short track can be swallowed by its neighbours, and every clamp is printed above the result rather than applied quietly. Because an MP3 stores one sample rate and one channel count for a whole file, mixed sources are normalised before encoding: the output is stereo if any input is, mono only if every input is, more than two channels are downmixed by the browser's own mixer, and the readout names the rate and channel count actually encoded.
The honest limits. MP3 is lossy, so joining MP3s is a lossy-to-lossy re-encode: the output inherits whatever the inputs already discarded and adds a small generation of its own, so keep your originals. Tags and album art are not carried across, because only decoded audio is re-encoded. A file your browser cannot decode gets a named row and is left out while the rest still join, and two bad files produce two rows — nothing is silently skipped. Your browser resamples every file to its own audio engine's rate during decoding and never reports what the file's rate was beforehand, so this page does not claim to show you one. And the work happens on your device, which is what the caps are about: at most 50 files and 60 minutes of total audio, each refusal reported by name, because the encoder runs on your processor and the finished MP3 sits in this tab's memory until you save it.