I am able to join and crossfade two audio files using SoX, like so:
sox file1.wav file2.wav outfile.wav splice -q `soxi -D file1.wav`,0.5
where the soxi substitution is fetching the duration of file1 and 0.5 is the length of the cross-fade. I am now trying to extend this to an arbitrary number of files, in order to string them together with short crossfades in between. There would seem to be 2 approaches: piping and scripting. Sox has a -p option telling it to treat it's output as piped (instead of writing a file). But, with many input and arguments per command, it's not clear how that output (and input?) gets assigned in subsequent commands. So far I've got the line below, which does not work, trying to extend to 3 files.
sox -p file1.wav file2.wav splice -q `soxi -D file1.wav`,0.5 | sox -p file3.wav outfile.wav splice -q `soxi -D file3.wav`,0.5
Your tips on sox piping and scripting would be greatly appreciated.
I have gotten most of the way there with
sox --combine concatenate *.wav _merge.wav splice -q 3,1
The splice effect at the end places the beginning of the cross-fade at 3 seconds into the first file, and uses 1 second as cross-fade duration (half second at beginning and end of two files). This method is a temporary fix as I can choose to include only ~3 second files in my output (using other methods). A better answer would figure out how to grab duration of current file and substitute that in place of the 3.
sox --combine concatenate *.wav _merge.wav splice -q $(soxi −D {}),1
If the {} here selected the current item (as in find
), that would do it. But that doesn't seem to work.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With