fileformer
search⌘KtranslateENexpand_moreupload_fileConvert
Converters8 file families · 44 direct conversions
What changes in a conversionarrow_forward
home/audio-tools/audio-joiner

Join clips into one track, without the jumps between them.

Add voice notes, song parts or podcast segments, put them in order and choose how each one meets the next. Quiet clips are levelled up to match the loud ones. Everything is mixed in your browser and saved as a WAV.

restart_altReset to sample clips
3 sample clips · add your own to replace them
1
2
3
0:000:20
1intro-voice.m4a0:06 · 48.0 kHz · mono+9 dB boostarrow_upwardarrow_downwardclose
south
cutcrossfadegap
overlap 1.0 s
2interview-part1.wav0:09 · 44.1 kHz · stereo-10 dB RMSarrow_upwardarrow_downwardclose
south
cutcrossfadegap
overlap 1.0 s
3outro-music.mp30:07 · 44.1 kHz · stereo+4 dB boostarrow_upwardarrow_downwardclose
south
join length1.0 s
crossfade curve
equal powerequal gain
Match loudnessbrings every clip to the same level
clips3length0:20wav size3.5 MB
play_arrowPreviewdownloadDownload WAV
44.1 kHz (your files resampled by the browser’s decoder), stereo, 16-bit; equal-power crossfades, 5 ms fades on cuts. Levels matched to the loudest clip; peaks are kept just below clipping.
~/where-clips-meet

Three ways for one clip to hand over to the next.

The volume curves show what happens across a two-second join. The right choice depends on what you're joining: talk, music or recordings from different places.

Cutpodcasts, editsThe next clip starts the instant the last one ends. Clean for speech recorded in one place; can click if a clip ends mid-sound.
Crossfademusic, ambienceOne fades out while the next fades in, overlapping by the join length. Smooth, and shortens the total by that overlap.
Gapseparate itemsA short silence between clips. Best when joining unrelated recordings, like a playlist of voice notes.
outgoing clipincoming clip
~/not-all-audio-is-alike

Why you can't just glue the files end to end.

Joining raw files byte by byte only works when every clip has the same format. Usually they don't, so each one is decoded, adjusted to a shared setting, then mixed. These are the differences we reconcile for the clips above.

clipsample ratechannelslevel
intro-voice.m4a48.0 kHzmono-19 dB
interview-part1.wav44.1 kHzstereo-10 dB
outro-music.mp344.1 kHzstereo-14 dB
joined output44.1 kHz · resampledstereo · mono → both-10 dB matched
~/why-cuts-click

A cut clicks when the wave jumps.

A straight cut joins whatever sample one clip ends on to whatever the next begins with. If those values differ, the speaker cone has to jump instantly, a step that contains every frequency at once, heard as a click. Below, a 220 Hz tone is cut into a 330 Hz tone three ways, and the energy the join adds above 4 kHz is measured.

where the first clip ends (phase)90° · 0.60
Straight cutaudible click
jump at join0.600splatter > 4 kHz-28.3 dB
Joins wherever the first clip happens to end.
Snap to zero crossingclean
jump at join0.017splatter > 4 kHz-62.8 dB
Moves the cut back to where the wave crosses zero going up. Small step, but it trims up to one cycle.
5 ms fadeclean
jump at join0.004splatter > 4 kHz-69.0 dB
Fades the last and first 5 ms. Hides any step at the cost of a tiny dip.
Each panel shows 20 ms around the join at 44.1 kHz. “Splatter” is the energy above 4 kHz in a 46 ms Hann window centred on the join, relative to the whole window, both tones sit far below 4 kHz, so anything there was created by the join. The 5 ms fade is what this page’s “cut” join uses on your clips.
~/equal-gain-or-equal-power

Which crossfade dips, which one bulges, and why it depends on the audio.

When two unrelated sounds overlap, their powers add. When two identical sounds overlap, their waves add. A linear fade keeps the waves constant but loses power in the middle; a sine/cosine “equal-power” fade keeps power constant but overshoots when both clips are the same. Measured on 1-second fades:

loudness through the overlap · dB vs beforestart → end of fade
Equal gain × identicalEqual gain × unrelatedEqual power × identicalEqual power × unrelated
Curve × materialMiddleWorst
Equal gain × identical-0.0 dB-0.4 dB
Equal gain × unrelated-2.9 dB-3.2 dB
Equal power × identical+3.0 dB+3.2 dB
Equal power × unrelated+0.1 dB-0.4 dB
tuneEqual power keeps unrelated material level (-0.4 dB at worst) but bulges +3.2 dB when both clips are identical; equal gain is flat for identical material but dips -3.2 dB for unrelated. Different recordings are almost always unrelated, which is why the joiner defaults to equal power. Switch to equal gain above for loops or a clip joined to itself.
~/48k-into-44.1k

Changing the sample rate can fold high notes back down.

Phone recordings are often 48 kHz and music 44.1 kHz, so joining them means resampling one. A 48 kHz test tone sweeping from 0 to 24 kHz is converted three ways. Anything above 22.05 kHz can’t exist at 44.1 kHz; a careless converter reflects it back as a falling tone that was never in the source.

Sample and holdaliases badly
aliasing+0.1 dBmethodnearest
Takes the nearest earlier sample. Fast, but folds every frequency above 22 kHz back down and adds images.
Linear interpolationaliases badly
aliasing-3.1 dBmethodlinear
Draws a straight line between neighbours. Cheap, but barely better than hold near the top, so this joiner doesn’t rely on it for your files.
Your browser’s resamplersome aliasing
aliasing-36.3 dBmethodbrowser
decodeAudioData converting a 48 kHz WAV for a 44.1 kHz context: exactly what happens to your files when you add them. Browsers use a filtered (windowed-sinc) converter here.
Spectrograms: time left to right, 0-22 kHz bottom to top, 1,024-point FFT. Aliasing = energy during the part of the sweep above 22.05 kHz (which should be silent) relative to the sweep below it. This joiner decodes your files straight to 44.1 kHz with the browser’s converter (the third panel); linear interpolation is only used for the generated sample clips.
~/reference

The silence you didn’t record.

Lossy encoders add silent “priming” samples at the start and pad the end to a whole frame. Joining decoded MP3 or AAC files without trimming those leaves tiny gaps, the reason gapless albums need metadata. Values are typical for common encoders, from general knowledge of their documentation.

FormatFrame sizePrimingWhere the trim is storedAt 44.1 kHz
WAV / FLACany0Nothing to trim; lossless frames are exact.Joins are sample-accurate.
MP3 (LAME)1,152≈ 1,105LAME/Xing header in the first frame (encoder delay + padding).≈ 25 ms of silence at the start
AAC (iTunes)1,0242,112iTunSMPB comment, or the MP4 edit list (elst).≈ 48 ms at the start
AAC (other)1,0241,024-2,112MP4 edit list, if the muxer writes one.23-48 ms, often untrimmed
Opus120-2,880 (at 48 kHz)312 typicalpre-skip field in the OpusHead header (RFC 7845).6.5 ms at 48 kHz
Vorbisvariable0 netGranule positions in the Ogg pages mark the exact end.Gapless when decoders honour them.
AC-31,536256Not stored; players apply it by convention.≈ 5 ms
Timeline
1928Nyquist shows a signal must be sampled at twice its highest frequency, the reason 22.05 kHz is a hard ceiling at 44.1 kHz.
1949Shannon proves the sampling theorem and the ideal sinc reconstruction.
1979Sony’s PCM adaptors for video recorders settle on 44.1 kHz.
1982CD audio fixes 44.1 kHz, 16-bit stereo.
1984Smith and Gossett publish bandlimited interpolation for sample-rate conversion.
1991Microsoft and IBM publish RIFF WAVE.
1993MP3 is standardised; its frames introduce encoder delay.
2004LAME adds encoder delay and padding to its info tag for gapless playback.
2012Opus (RFC 6716) stores pre-skip in its header.
2015Web Audio’s OfflineAudioContext gives browsers a built-in resampler for decodeAudioData.