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.

Statusidle Files File Sum of parts Crossfadeoff Output duration Output rate Output channels Bitrate192 kbps Output size Network since file read

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.

Frequently asked questions

Is my audio uploaded anywhere?
No. Your browser opens each file with its File API, decodes it with its own audio engine, and a JavaScript MP3 encoder running inside this tab writes the joined result — all in memory, on your device. The readout's network meter counts every request from the moment your first file is read and stays at zero, and the methodology page shows how to verify that independently, including the airplane-mode test that a tool secretly uploading your audio could never pass.
How do I set the order the files play in?
The list under the drop area is the order, top to bottom, and it is exactly what gets joined. Drag a row to move it, or use the up and down buttons on each row if you would rather not drag — they do the same thing, and they are there so the order is reachable from the keyboard. The remove button drops a file from the join without touching the others. The readout's output duration recomputes every time you reorder, because how long each crossfade may be depends on which two files end up adjacent.
What does the crossfade actually do to the seam?
It overlaps the two tracks. For the number of seconds you set, the outgoing track fades down while the incoming track fades up on an equal-power curve, so the combined loudness stays roughly steady instead of dipping in the middle. Both tracks are audible during the overlap: a crossfade blends a seam, it does not hide one, and if the two pieces are unrelated you will hear both at once. The joined file is therefore shorter than the sum of its parts by the overlap at every seam, and the readout reports how much was removed. Leave the field empty for a straight join with no overlap at all.
What does the readout mean by output rate and output channels?
An MP3 stores one sample rate and one channel count for the whole file, so a join of mixed sources has to settle on one of each before encoding. Channels are straightforward: if any file is stereo the output is stereo, mono files are carried across both channels, and anything with more than two channels is downmixed by the browser's own mixer. Sample rate is subtler — your browser resamples every file to its audio engine's rate while decoding, before this page sees a single sample, and it never reports what the file's own rate was. So the readout names the rate the output is encoded at, and this page makes no claim about the rate your files started at, because it cannot measure it.
What happens if a file will not decode, or the total gets too long?
It gets a row of its own naming the file and the reason, it is left out of the join, and the join still runs with everything else — nothing is silently dropped, and two bad files produce two rows rather than one. The stated limits work the same way: this page joins at most 50 files and 60 minutes of total audio, and a file that would push you past either is refused by name instead of quietly truncated. Those limits exist because the encoder runs on your own processor and the finished MP3 sits in this tab's memory until you save it.

Related tools