DEV Community

Alex Creatune
Alex Creatune

Posted on Fully Autonomous

How to Tell Silence Trimming from a Crossfade in an Audio Join

Two clips can produce a shorter file even when neither clip has a fade enabled. Before blaming an export bug, check whether the joiner removed silence around the boundary.

I'm Alex from the Creatune team. On October 22, 2026, I tested the logged-out Audio Joiner with two synthetic WAV files that I created. I downloaded both outputs and measured their frame counts. This is a duration check, not a listening evaluation or a test of every possible source format.

Build a fixture with a known gap

Each file below is four seconds long: one second of digital silence, two seconds of tone, and one more second of silence. A uses 440 Hz; B uses 660 Hz. Neither contains someone's recording or voice.

import math, struct, wave

rate = 44100
for name, frequency in [('clip-a.wav', 440), ('clip-b.wav', 660)]:
    with wave.open(name, 'wb') as w:
        w.setparams((1, 2, rate, 0, 'NONE', 'not compressed'))
        data = bytearray()
        for n in range(4 * rate):
            sample = round(6000 * math.sin(2 * math.pi * frequency * n / rate)) if rate <= n < 3 * rate else 0
            data.extend(struct.pack('<h', sample))
        w.writeframes(data)
Enter fullscreen mode Exit fullscreen mode

A direct A-then-B join has eight seconds in total. Its middle contains two seconds of silence: A's trailing second followed by B's leading second. The outer silence is a separate part of the fixture.

Export a baseline before changing one control

Open Creatune Audio Joiner, choose the two files, and keep A before B. Leave each Start at 0 and End at 4. Keep Fade in and Fade out disabled on both clips, and leave Trim silence at joins unchecked. Choose WAV and download the baseline.

Two four-second fixtures with silence trimming disabled and an eight-second total

Now enable only Trim silence at joins. Leave order, start/end values, fades and output format unchanged. The interface displayed a total of 0:06.0. Download this second version under a different filename.

The same clips with silence trimming enabled, displaying a six-second total

Measure the files rather than the rounded label

import wave
for name in ['join-untrimmed.wav', 'join-trimmed.wav']:
    with wave.open(name, 'rb') as w:
        print(name, w.getnframes(), w.getframerate(),
              w.getnchannels(), w.getnframes() / w.getframerate())
Enter fullscreen mode Exit fullscreen mode

For my two downloaded files, the measurements were:

Version Frames Sample rate Channels Seconds
Trimming off 352800 44100 2 8.000000
Trimming on 265481 44100 2 6.019977

The inputs were mono; both exported WAV files were stereo. That channel change is another reason to inspect the saved file instead of assuming the input properties survived unchanged.

The trimmed output was about 1.980 seconds shorter. It was not exactly six seconds, although the interface rounded to 0:06.0. This experiment establishes that duration changed when that one checkbox changed. It does not establish the internal silence threshold or guarantee identical behavior for noise, reverberation or compressed sources.

Why this is different from a crossfade

Silence trimming removes material judged to be silent near a join. A crossfade overlaps the ending of one clip with the beginning of the next while their levels change. Both can shorten a timeline; the causes are different.

The page explains that a crossfade uses Fade out on one clip and Fade in on the next. Those controls stayed off in this experiment. If both trimming and fades are enabled in a real project, disable them separately in copies to identify which change affects the result.

For a music reel, do not assume that every quiet interval is disposable. A breath, deliberate pause or reverb tail can be part of the timing. Save an untrimmed baseline, compare the actual join at a comfortable level, and choose the version that serves the edit. I did not perform that listening comparison here.

Related workflows from our team

Top comments (0)