ferraus concat
Join files end to end, optionally with crossfades or gaps
Synopsis
ferraus concat <inputs...> [options] [-o <output>]
What it does
Joins the inputs in the order given. --crossfade overlaps the end of each file with the start of the next (each overlap shortens the result by the crossfade length); --gap inserts silence instead. With --match on (the default) every input is resampled and remixed to the first file's sample rate and channel count.
Examples
Join three files back to back
ferraus concat intro.wav body.wav outro.wav -o episode.wav
DJ-style 3-second equal-power crossfade; b.mp3 is converted to a.flac's format
ferraus concat a.flac b.mp3 --crossfade 3s -o mix.flac
Join every take with a second of silence between them
ferraus concat take*.wav --gap 1s -o all_takes.wav
Options
| Flag | Type | Default | Meaning |
|---|---|---|---|
--crossfade | time | 0ms | Overlap (duration) between consecutive files, e.g. 2s |
--crossfade-curve | equal-power | linear | equal-power | Crossfade shape: equal-power keeps perceived loudness constant through the overlap |
--gap | time | 0ms | Silence (duration) inserted between files |
--match | on|off | on | Resample and remix inputs to the first file's sample rate and channels; off fails on a mismatch |
Global options
Every command also accepts the global options (-o, --json, --dry-run, --overwrite, --progress, ...). See Global options.
Exit codes
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | Processing failed |
| 2 | Usage or parameter error |
| 3 | Input missing or unreadable |
| 4 | Unsupported format or codec |
| 8 | Cancelled |
| 70 | Internal error (bug) |
Common mistakes
- Forgetting that outputs are never overwritten: pass
--overwriteor a new-opath when re-running. - Beat-based times (
4b,1/4) need a tempo: pass--bpmor write4b@120.
For models
- MCP tool:
ferraus_concat - Schema:
ferraus schema concat - Pipeline:
{ op: concat, args: { ... } }(flag names with_instead of-) - fx stage: no
{"command": "concat", "defaults": {"crossfade": "0ms", "crossfade_curve": "equal-power", "gap": "0ms", "match": "on"}}