SoX(1)
๐ SoX(1) โ Sound eXchange_ng ๐
okay so this is the SoX(1) manual โ Sound eXchange_ng, aka another Swiss Army knife of audio manipulation. Buckle up bestie, it's a long one but it eats. ๐
โจ
๐ NAME ๐
SoX โ Sound eXchange_ng, another Swiss Army knife of audio manipulation. ๐ฆ
โจ SYNOPSIS โจ
sox_ng [global-options] [format-options] infile1
[[format-options] infile2] ... [format-options] outfile
[effect [effect-options]] ...
play_ng [global-options] [format-options] infile1
[[format-options] infile2] ... [format-options]
[effect [effect-options]] ...
rec_ng [global-options] [format-options] outfile
[effect [effect-options]] ...
๐ธ DESCRIPTION ๐ธ
๐ง Introduction
So literally, SoX reads and writes audio files in, like, most popular formats and can optionally apply effects to them. It can combine multiple input sources, synthesize audio and, on many systems, act as a general purpose audio player or as a multitrack audio recorder. It can also split the input into multiple output files. Obsessed, honestly. ๐ฅ
Every single bit of SoX functionality is available using just the sox_ng command. To make playing and recording audio simpler, if SoX is invoked as play_ng, the output file is automatically set to be the default sound device, and if it's invoked as rec_ng, the default sound device is used as an input source. Also, the soxi_ng command gives you a convenient way to query audio file header information. ๐
The heart of SoX is a library called libsox_ng. If you're into extending SoX or using it in other programs, you should go read the libsox_ng manual page, bestie. ๐
SoX is a command-line audio processing tool that's particularly suited to making quick, simple edits and to batch processing. If you need an interactive, graphical audio editor, use audacity(1). ๐จ
The overall SoX processing chain can be summarized as follows:
Input(s) โ Combiner โ Effects โ Output(s)
On the SoX command line, the positions of the Output(s) and the Effects are swapped w.r.t. the logical flow just shown and, while options pertaining to files are placed before their respective file names, the opposite is true for effects. Not me explaining the vibe check: to show how this works in practice, here's a selection of examples of how SoX might be used. The simple one
sox_ng recital.au recital.wav
translates an audio file in Sun AU format to a Microsoft WAV file, while
sox_ng recital.au -b 16 recital.wav channels 1 rate 16k fade 3 norm
performs the same format translation but also applies four effects (down-mix to one channel, sample rate change, fade in and normalize) and stores the result at a bit-depth of 16. Four effects at once? She's a multitasker. ๐
sox_ng -r 16k -e signed -b 8 -c 1 voice-memo.raw voice-memo.wav
converts raw (a.k.a. headerless) audio to a self-describing file format,
sox_ng slow.aiff fixed.aiff speed 1.027
adjusts audio speed,
sox_ng short.wav long.wav longer.wav
concatenates two audio files and
sox_ng -m music.mp3 voice.wav mixed.flac
mixes together two audio files.
play_ng "The Moonbeams/Greatest/*.ogg" bass +3
plays a collection of audio files applying a bass boosting effect,
play_ng -n -c1 synth sin %-12 sin %-9 sin %-5 sin %-2 fade h 0.1 1 0.1
plays a synthesized A minor seventh chord with a pipe organ sound,
rec_ng -c 2 radio.aiff trim 0 30:00
records half an hour of stereo audio and
play_ng -q take1.aiff & rec -M take1.aiff take1-dub.aiff
(with a POSIX shell and where supported by hardware) records a new track in a multitrack recording. Finally,
rec_ng -r 44100 -b 16 -e signed-integer -p \
silence 1 0.50 0.1% 1 10:00 0.1% | \
sox_ng -p song.ogg silence 1 0.50 0.1% 1 2.0 0.1% : \
newfile : restart
records a stream of audio such as an LP or cassette and splits it into multiple audio files at points where there are two seconds of silence. Also, it does not start recording until it detects some sound and stops after it sees ten minutes of silence. That's main character energy if I ever saw it. ๐ง
The above is just an overview of SoX's capabilities. Detailed explanations of how to use all SoX parameters, file formats and effects can be found below in this manual, in soxformat_ng(7) and in soxi_ng(1). iykyk. ๐
๐ File Format Types
SoX can work with self-describing and raw audio files. Self-describing formats (e.g. WAV, FLAC, MP3) have a header that completely describes the signal and encoding attributes of the audio data that follows. raw or headerless formats do not contain this information, so the audio characteristics of these must be described on the SoX command line โ except for a few which can be inferred from the filename extension such as .gsm, always -c1 -r8000 -e gsm, and named raw formats like .f32, .s16 and .ul which give the encoding but not the sample rate or number of channels. ๐
The following four characteristics are used to describe the format of audio data:
- sample rate โ The sample rate in samples per second (
HertzorHz). Digital telephony traditionally uses a sample rate of 8000Hz (8kHz) though 16 and even 32kHz are becoming more common. Audio Compact Discs use 44100Hz (44.1kHz), Digital Audio Tape and many computer systems use 48kHz and professional audio systems often use 96kHz. - sample size โ The number of bits used to store each sample. Today, 16-bit is commonly used, 8-bit was popular in the early days of computer audio and 24-bit is used in the professional audio arena.
- data encoding โ The way in which each audio sample is represented (or
encoded). Some encodings have variants with different byte-orderings or bit-orderings, some compress the audio data so that it takes up less disk space or transmission bandwidth than uncompressed formats. Commonly-used encoding types include floating point, ฮผ-law, ADPCM, signed-integer PCM, MP3 and FLAC. - channels โ The number of audio channels contained in the file. One (
mono) and two (stereo) are widely used andsurround soundaudio typically contains six or more channels.
The term bit rate is a measure of the amount of storage occupied by an encoded audio signal per unit of time. It can depend on all of the above and is typically denoted as a number of kilobits per second (kbps). An A-law telephony signal has a bit rate of 64 kbps, MP3-encoded stereo music typically has a bit rate of 128-196 kbps and FLAC-encoded stereo music typically has a bit rate of 550-760 kbps. Numbers! โจ
Most self-describing formats also allow textual comments to be embedded in the file that can be used to describe the audio in some way, e.g. for music, the title, the author, etc. ๐ต
One important use of audio file comments is to convey Replay Gain information. SoX can apply Replay Gain automatically for formats that contain comments but does not generate it. By default, SoX copies comments from the first input file to output files that support comments, so output files may contain Replay Gain information which is incorrect. This can be fixed, when converting input files with --replay-gain enabled, by removing all comments using --comment "" or removing just the REPLAYGAIN comment with
soxi_ng -a in.au | grep -v REPLAYGAIN > comments
sox_ng --replay-gain=track in.au --comment-file comments out.au
๐ฆ Determining and setting the File Format
SoX uses several mechanisms to determine or set the format of an audio file. Depending on the circumstances, individual characteristics may be determined or set using different mechanisms. It's giving "many ways, one truth". ๐ค
To determine the format of an input file, SoX uses, in order of precedence and as given or available:
- Command-line format options,
- The contents of the file header,
- The filename extension.
To set the output file format, SoX uses, in order of precedence and as given or available:
- Command-line format options,
- The filename extension,
- The input file format characteristics or the closest that is supported by the output file type.
For all files, SoX exits with an error if the file type cannot be determined. Command-line format options may need to be added or changed to resolve the problem. ๐จ
๐ Playing & Recording Audio
The play_ng and rec_ng commands are provided so that basic playing and recording is as simple as
play_ng existing-file.wav
and
rec_ng new-file.wav
These two commands are functionally equivalent to
sox_ng existing-file.wav -d
and
sox_ng -d new-file.wav
Further options and effects (as described below) can be added to the commands in either form. So easy it's practically free. ๐
When playing a file with a sample rate that is not supported by the audio output device, SoX automatically invokes the rate effect to perform the necessary sample rate conversion. For compatibility with old hardware, the default rate quality level is set to low. This can be changed by explicitly specifying the rate effect with a different quality level, e.g.
play_ng ... rate -m
or by using the --play-rate-arg option (see below). Legacy support but make it fashion. โจ
On some systems, SoX allows the audio playback volume to be adjusted while using play_ng. Where supported, this is achieved by tapping the v & V keys during playback. If there is a softvol effect in the chain, these keys will adjust that instead of the hardware mixer. v and V, cute. ๐น
To help with setting a suitable recording level, SoX includes a peak level meter which can be invoked (before making the actual recording) as follows:
rec_ng -n
The recording level should be adjusted (using the system-provided mixer program, not SoX) so that the meter is, at most, occasionally full scale and never in the red (an exclamation mark is shown). See the -S (--show-progress) option below. โ ๏ธ
๐ Accuracy
Many file formats that compress audio discard some of the audio signal information. Converting to such a format and back again will not produce an exact copy of the original audio. This is the case for many formats used in telephony (e.g. A-law, GSM) where low signal bandwidth is more important than high audio fidelity and for formats used in portable music players (e.g. MP3, Ogg Vorbis) where adequate fidelity can be retained even with the large compression ratios that are needed to make portable players practical. ๐
Formats that discard audio signal information are called lossy. Formats that do not are called lossless. The term quality is used as a measure of how closely the original audio signal is reproduced when using a lossy format. Periodt. ๐
Okay so real talk โ audio file conversion with SoX is lossless when it can be, i.e. when you're not using lossy compression, when you're not reducing the sampling rate or the number of channels, and when the number of bits used in the destination format is not less than in the source format. Like, converting from an 8-bit PCM format to a 16-bit PCM format is lossless bestie, but converting from an 8-bit PCM format to (8-bit) A-law? Nope, that one isn't. ๐
SoX converts all audio files to an internal, uncompressed 32-bit format before it does literally any audio processing. Which means manipulating a file that's stored in a lossy format can cause further losses in audio fidelity. E.g. with
sox_ng long.mp3 short.mp3 trim 10
SoX first decompresses the input MP3 file, then applies the trim effect and finally creates the output MP3 file by recompressing the audio โ with a possible reduction in fidelity above that which occurred when the input file was created. So if what you ultimately want is lossily compressed audio, it's best to do all your audio processing in lossless file formats and then convert to the lossy format only at the very final stage. โจ And applying multiple effects with a single SoX invocation will, in general, produce more accurate results than doing it with multiple SoX invocations. Slay.
๐ธ Dithering ๐ธ
Dithering is a technique used to maximize the dynamic range of audio stored at a particular bit-depth. Any distortion introduced by quantization gets decorrelated by adding a small amount of white noise to the signal. In most cases, SoX can figure out whether the selected processing needs dither and will add it during output formatting if that's appropriate. ๐
By default, SoX automatically adds TPDF dither when the output bit-depth is less than 24 and any of the following are true:
- bit-depth reduction has been specified explicitly using a command-line option
- the output file format supports only bit-depths lower than that of the input file format
- an effect has increased the effective bit-depth within the internal processing chain
For example, adjusting the volume with vol 0.25 requires two additional bits in which to losslessly store its results (since 0.25 decimal equals 0.01 binary) so, if the input file bit-depth is 16, SoX's internal representation will use 18 bits after processing this volume change. In order to store the output at the same depth as the input, dithering is used to remove the additional bits. Iconic behavior tbh.
Use the -V option to see what processing SoX has automatically added. ๐ The -D (--no-dither) option may be given to override automatic dithering. To invoke dithering manually (e.g. to select a noise-shaping curve) use the dither effect.
๐ Clipping ๐
Clipping is distortion that occurs when an audio signal level (or volume) exceeds the range of the chosen representation. In most cases, clipping is undesirable and so should be corrected by adjusting the level prior to the point in the processing chain at which it occurs.
In SoX, clipping can happen when using the vol or gain effects to increase the audio volume. Clipping can also occur with many other effects, when converting one format to another, and even when simply playing the audio. ๐ญ
Playing an audio file often involves resampling and processing by analog components, and that can introduce a DC offset or amplification โ all of which can produce distortion if the audio signal level was initially too close to the clipping point.
For these reasons, it's usual to make sure that an audio file's signal level has some headroom, i.e. it does not exceed a particular level below the maximum possible level of the given representation. Some standards bodies recommend as much as 9dB headroom, but in most cases, 3dB (โ 70% linear) is enough. Note that this wisdom seems to have been lost in modern music production; in fact, many CDs, MP3s, etc. are now mastered at levels above 0dBFS and the audio is clipped as delivered. Not the vibe. ๐
SoX's stat and stats effects can assist in determining the signal level of an audio file. The gain or vol effect can be used to prevent clipping, e.g.
sox_ng dull.wav bright.wav gain -6 treble +6
guarantees that the treble boost will not clip. ๐ซถ
If clipping occurs at any point during processing, SoX displays a warning message to that effect.
See the global -G (--guard) option and the gain and norm effects.
๐ฆ Input File Combining ๐ฆ
SoX's input combiner can be configured with the --combine global option to combine multiple files using one of the following methods: concatenate, sequence, mix, mix-power, merge and multiply, with shorthands -m for --combine mix, -M for merge and -T for multiply.
The default is sequence for play_ng, and concatenate for sox_ng. ๐
For methods other than sequence, multiple input files must have the same sampling rate. If necessary, separate SoX invocations can be used to make sampling rate adjustments prior to combining them. and, with concatenate, the input files must also have the same number of channels.
The sequence combining method is similar to concatenate in that the audio from each input file is sent serially to the output file, but here the output file may be closed and reopened at the transition between input files. This may be just what is needed when sending different types of audio to an output device, but is not generally useful when the output is a normal file.
With the mix or mix-power combining methods, the number of channels in each input file need not be the same โ but SoX issues a warning if they aren't, and some channels in the output file will not contain audio from every input file. A mixed audio file cannot be unmixed without reference to the original input files. no cap.
If the merge combining method is selected, the number of channels in each input file need not be the same, and a merged audio file comprises all channels from all the input files โ and unmerging is possible using multiple invocations of SoX with the remix effect. For example, two mono files could be merged to form one stereo file, and the first and second mono files would become the left and right channels of the stereo file. ๐
The multiply combining method multiplies the sample values of corresponding channels treated as numbers in the interval -1 to +1. If the number of channels in the input files isn't the same, the missing channels will contain silence.
When combining input files, SoX applies any specified effects (including, for example, the vol volume adjustment effect) after the audio has been combined. However, it's often useful to be able to set the volume of the inputs individually (i.e. balance them) before combining takes place. For all combining methods, input file volume adjustments can be made manually using the -v option, which can be given for one or more input files. If it's given for only some of the input files, the others receive no volume adjustment. In some circumstances, automatic volume adjustments may be applied. The global -V option can be used to show the input file volume adjustments that have been selected manually or automatically. ๐
Some special considerations need to made when mixing input files:
Unlike the other methods, mix combining can cause clipping in the combiner if no balancing is performed. In this case, if manual volume adjustments are not given, SoX tries to ensure that clipping does not occur by automatically adjusting the volume (amplitude) of each input signal by a factor of ยน/n, where n is the number of input files. If this results in audio that is too quiet or otherwise unbalanced, the input file volumes can be set manually with -v. Using the norm effect on the mix is another alternative.
If mixed audio seems loud enough at some points but too quiet in others, dynamic range compression can be applied to correct this โ see the compand effect.
With the mix-power combine method, the mixed volume is approximately equal to that of one of the input signals. This is achieved by balancing using a factor of ยน/โn instead of ยน/n. Note that this balancing factor does not guarantee that clipping will not occur, but the number of clips will usually be low and the resulting distortion is usually imperceptible. โจ
๐ Output Files ๐
SoX's default behaviour is to take one or more input files and write them to a single output file.
This behaviour can be changed by placing the newfile pseudo-effect within the effects list, and SoX will enter multiple output mode.
In multiple output mode, a new file is created when the effects prior to the newfile indicate that they are done. The effects chain listed after newfile is then started up and its output is saved to the new file.
In multiple output mode, a unique number is appended automatically to all filenames โ and if the filename has an extension, the number is inserted before the extension. This behaviour can be customized by placing %n in the filename where the number should be substituted. An optional number can be placed after the % to indicate a minimum width for the number, with leading zeroes. %n defaults to two digits or, if no %n is included, to three digits before the filename extension.
Multiple output mode is not very useful unless an effect that stops the effects chain is specified before newfile. If the end of the file is reached before the effects chain stops, no new file is created โ as it would be empty.
The following is an example of splitting the first 60 seconds of an input file into two 30 second files and ignoring the rest. ๐
sox_ng song.wav ringtone%1n.wav trim 0 30 : newfile : trim 0 30
๐ Stopping SoX ๐
Usually, SoX completes its processing and exits automatically once it has read all the audio data from the input files.
It can also be terminated earlier by sending it an interrupt signal, usually by pressing the keyboard interrupt key which is normally Ctrl+C. This is required in some circumstances, such as when using SoX to make a recording. When SoX is playing multiple files, Ctrl+C behaves slightly differently: pressing it once skips to the next file; pressing it twice in quick succession causes SoX to exit. ๐
Another way to stop processing early is to use an effect that has a time period or sample count โ the trim effect is an example of this. Once all effects chains have stopped, SoX stops. periodt. ๐
โจ FILENAMES โจ
okay so bestie, filenames can be simple file names, relative or absolute paths, URLs (only for input files, k?), or special filenames. and if you wanna use URLs, you need one of wget, wget2, or curl installed. no cap. ๐ฆ
giving SoX an input or output filename that's the same as a SoX effect name? that does not work because SoX will treat it as an effect specification. you can work around it by calling the file ./chorus on Unix or .\chorus on MS/DOS, but honestly it's usually not a problem since most audio filenames have an extension after a dot, and effect names don't. periodt. ๐
and using the same file name for input and output? unlikely to work as intended because it'll likely truncate the file before reading all of it. so like, don't. ๐ญ
โจ Special Filenames โจ
the following filenames can be used in certain circumstances instead of a normal filename:
-โ SoX can be used in simple pipeline operations with this special filename. if you use-as an input filename, SoX reads audio data fromstandard input(stdin). if you use it as the output filename, SoX sends audio data tostandard output(stdout). when you use this for the output file, and sometimes for an input file, you also have to give the file type (see-tbelow). ๐"|program [options] ..."โ an initialpipecharacter says that the given command's standard output (stdout) should be used as an input file. unlike the special filename-, this can be used for several inputs to one SoX command. for example, if a programgenwgenerates a mono WAV signal on its stdout, the following command makes a stereo file from two generated signals:
sox_ng -M "|genw --imd -" "|genw --thd -" out.wav
for headerless (raw) audio and some other formats, -t needs to be given before the input command. ๐
"wildcard-filename"โ says that filenameglobbing(wildcard matching) should be done by SoX instead of by the shell if the wildcard-filename contains the characters*,?, or character ranges like[A-Z]. this lets a single set of file options be applied to a group of files. for example, if the current directory has three files,file1.vox,file2.vox, andfile3.vox,
play_ng --rate 6k *.vox
is expanded by the shell (in most environments) to
play_ng --rate 6k file1.vox file2.vox file3.vox
which only treats the first vox file as having a sample rate of 6k. with
play_ng --rate 6k "*.vox"
the given sample rate option is applied to all the files. if you do not want SoX to glob the filenames, you can use the option --no-glob before each filename that shouldn't be globbed, which is necessary if you need to process files whose names contain wildcard characters. ๐
-p,--sox-pipeโ can be used in place of an output filename to say that its output will be used as the input to another SoX command. for example, in the command:
play_ng "|sox_ng -n -p synth 2" "|sox_ng -n -p synth 2 tremolo 10"
play_ng thinks it's playing two files in succession that come from pipes, but in fact they both come from other invocations of SoX, each with different effects. -p is in fact an alias for -t sox -. ๐
-d,--default-deviceโ can be used in place of an input or output filename to say that the default audio device (if one has been built into SoX) should be used. this is like invokingrec_ngorplay_ngas described above. ๐ง-n,--nullโ can be used in place of an input or output filename to say that anull fileshould be used. here,null filerefers to a SoX-specific mechanism and is not related to any operating system mechanism with some special name. using a null file as an input is equivalent to using a normal audio file that contains an infinite amount of silence, so it's not generally useful unless you use it with an effect that specifies a finite time length liketrimorsynth. using a null file as an output amounts to discarding the audio and is mainly useful with effects that produce information about the audio instead of affecting it, likenoiseprof,stat, andspectrogram. the sampling rate associated with a null file is by default48kHzbut, like a normal file, this can be overridden using format options such as-r(see below). โจ
โจ Supported File and Audio Device Types โจ
see soxformat_ng(7) for a list and description of the supported file formats and audio device drivers. it's all there, bestie. โ
๐ OPTIONS ๐
๐ธ Global Options ๐ธ
these options can be specified on the command line at any point before the first effect name. and the SOX_OPTS environment variable can be used to provide alternative default values for SoX's global options. see ENVIRONMENT below. ๐
--buffer bytes,--input-buffer bytesโ set the size in bytes of the buffers used for processing audio (default8192).--bufferapplies to input, effects, and output processing;--input-bufferapplies only to input processing, for which it overrides--bufferif both are given. large values for--buffermay cause SoX to become slow to respond to requests to terminate or to skip to the next input file. so like, don't go too big. ๐--clobberโ don't prompt before overwriting an existing file that has the same name as an output file. this is the default behaviour; to override it, use--no-clobber. ๐ฅ--combine concatenate|merge|mix|mix-power|multiply|sequenceโ select the input file combining method. see Input File Combining above for a description of them. ๐-D,--no-ditherโ disable automatic dither โ see Dithering above. this may be useful to ensure that SoX produces the same output in successive runs, or if a file has been converted from 16 to 24 bit with the intention of doing some processing on it, but in fact no processing is needed after all and the original 16 bit file has been lost, in which case no dither is needed when converting the file back to 16 bits. see thestatseffect for how to determine the actual bit-depth of the audio within a file. ๐--effects-file filenameโ read a file to obtain all effects and their arguments. the file is parsed as if the values were specified on the command line. a new line can be used in place of the special:marker to separate effect chains. for convenience, such markers at the end of the file are normally ignored; if you want to specify an empty last effects chain, use an explicit:by itself on the last line of the file. this option causes any effects specified on the command line to be discarded. ๐-G,--guardโ automatically invoke thegaineffect to guard against clipping. e.g.
sox_ng -G in.au -b 16 out.au rate 44100 dither -s
is shorthand for
sox_ng in.au -b 16 out.au gain -h rate 44100 gain -rh dither -s
see -V, --norm, and the gain effect. ๐ก๏ธ
-h,--helpโ show SoX's version number and usage information. ๐--help-effect nameโ show usage information for the specified effect. the nameallcan be used to show it for all available effects. ๐--help-format nameโ show information about the specified file format. the nameallcan be used to show information for all supported formats. ๐--i,--infoโ if given as the first parameter tosox_ng, behave assoxi_ng. โน๏ธ-m|-Mโ equivalent to--combine mixand--combine mergerespectively. ๐๏ธ--magicโ if SoX has been built with the optionallibmagiclibrary, this option enables its use in helping to detect audio file types. ๐ฎ--multi-threaded|--single-threadedโ by default, SoX issingle threadedbut if the--multi-threadedoption is given, SoX processes audio channels for most multichannel effects in parallel on hyperthreading and multicore processors. a larger buffer size than the default may be needed to benefit more from multithreaded processing (e.g.131072; see--bufferabove) and settingOMP_WAIT_POLICY=PASSIVEin the environment before launching SoX avoids a defect in OpenMP that can make it incredibly slow if several invocations of SoX are running simultaneously. ๐--no-clobberโ prompt before overwriting an existing file with the same name as that given for the output file. unintentionally overwriting a file is easier than you might think, for example, if you accidentally enter
sox_ng file1 file2 effect1 effect2 ...
when what you really meant was
play_ng file1 file2 effect1 effect2 ...
then, without this option, file2 will be overwritten. hence, using this option is recommended and can be set in the SOX_OPTS environment variable (see ENVIRONMENT below). โ ๏ธ
--norm[=dB-level]โ automatically invoke thegaineffect to guard against clipping and to normalize the audio. e.g.
sox_ng --norm in.au -b 16 out.au rate 44100 dither -s
is shorthand for
sox_ng in.au -b 16 out.au gain -h rate 44100 gain -nh dither -s
optionally, the audio can be normalized to a given level, usually below 0 dBFS:
sox_ng --norm=-3 in.au out.au
see -V, -G, and the gain effect. ๐
--play-rate-arg argโ selects a quality option to be used when therateeffect is invoked automatically when playing audio. this option is typically set via theSOX_OPTSenvironment variable (see ENVIRONMENT below) and its default value, when playing, is-l(low quality but fast). see therateeffect for other alternatives. ๐ต--plot gnuplot|octave|offโ if not set tooff(the default if--plotis not given), run in a mode that can be used in conjunction with thegnuplotprogram or the GNU Octave program to assist with the selection and configuration of many of the transfer function-based effects. for the first given effect that supports the selected plotting program, SoX outputs commands to plot the effect's transfer function and stops without actually processing any audio. e.g.
sox_ng --plot octave input-file -n highpass 1320 > highpass.plt
octave highpass.plt
-q,--no-show-progressโ bestie, this is quiet mode, but only for the cases where SoX would've been loud anyway. It's literally the opposite of-S. And no, it does not mute error and warning messages โ for that you want-V, keep scrolling ๐-Rโ repeatable mode, and it's giving science โจ When you pass this, SoX stamps a time stamp into the output file (if that format supports comments, iykyk) and seeds the pseudo random number generators โ the ones dither uses โ with that number. Result? Same inputs + same parameters = same output, every single time. Reproducibility queen ๐--replay-gain track|album|offโ picks whether replay gain adjustment gets applied to your input files or not. The defaults are not it in a bad way, they're just specific:offis the default forsox_ngandrec_ngalbumis the default forplay_ngwhen (at least) the first two input files are tagged with the same Artist and Album namestrackis the default forplay_ngin every other case
-S,--show-progressโ the main character option, fr fr. It shows you the input file format/header info, processing progress as a percentage of the input file(s), elapsed time, remaining time (in brackets, if it's known), and the number of samples written to the output file. Also on the menu: a peak level meter, plus a little indication of whether clipping has happened ๐ญ
The peak level meter shows up to two channels and it's calibrated for digital audio like this:
dB FSD Display dB FSD Display
-25 - -11 ====
-23 = -9 ====-
-21 =- -7 =====
-19 == -5 =====-
-17 ==- -3 ======
-15 === -1 =====!
-13 ===-
And if the headroom is less than 6dB, you also get a three-second peak-held value of the headroom in dBs, chilling to the right of the meter.
This option is on by default when you're using SoX to play or record audio, but you can turn it off with -q.
-Tโ a whole mood, and also literally equivalent to--combine multiply.--temp directoryโ tells SoX where to put any temporary files it needs to create. Super handy if the default location is giving permission problems or has no free space. In that situation,--temp .(so it uses the current directory) is often a really good fix ๐ซถ--versionโ shows SoX's version number and dips. That's it, that's the option.-V[level]โ sets verbosity, and this one is so useful for seeing how any automatic effects got invoked by SoX. SoX prints messages on the console (stderr) based on these levels:0โ no messages at all, none, silence ๐ค Use the exit status to figure out if an error happened.1โ only error messages. These show up when SoX can't complete the commands you asked for.2โ warning messages too. These happen when SoX can complete your commands, but not exactly the way you asked for them, or if clipping occurs. This is the default.3โ descriptions of SoX's processing phases also get shown, so you can see exactly how SoX is working through your audio.4to6โ messages to help with debugging SoX also appear.
Every time you use -V, the verbosity level goes up by 1. Or you can just set it to an absolute number by putting it right after the -V, e.g. -V0 shuts it up completely ๐
โจ Input File Options โจ
These options apply to the first input filename that follows them on the command line. Order matters, bestie, don't play yourself ๐ธ
--ignore-lengthโ overrides the audio length that's written in an audio file's header. When you give this, SoX just keeps reading audio until it hits the actual end of the input file. Stubborn, but make it fashion ๐-v,--volume factorโ made for combining multiple input files. It adjusts the volume of the file that comes right after it on the command line by a factor of factor, so you canbalanceit against the other input files. This is a linear (amplitude) adjustment, so:- a number less than 1 decreases the volume
- a number greater than 1 increases it
- a negative number, in addition to the volume adjustment, inverts the audio signal ๐
Go check out the norm, vol and gain effects, the Input File Balancing section above, and the Special Filenames section on wildcard-filenames for more.
โจ Input & Output File Format Options โจ
These options apply to the input or output file whose name they immediately precede on the command line. They're mostly used when you're working with headerless file formats, or when you want to specify an output format that's different from the input format ๐ฆ
-b bits,--bits bitsโ sets the number of bits (a.k.a. bit-depth, a.k.a. word length, so many names ๐ญ) in each encoded sample. It does not apply to complex encodings like MP3 or GSM, and it's not necessary with encodings that have a fixed number of bits, like A-law, ฮผ-law and ADPCM.
For an input file, the most common use is telling SoX how many bits per sample a raw (headerless) audio file has. For example:
sox_ng -r 16k -e signed -b 8 input.raw output.wav
converts a particular raw file to a self-describing WAV file โจ
For an output file, this option sets the output encoding size. By default, the output encoding size gets set to the input encoding size, as long as the output file type supports it. For example:
sox_ng input.cdda -b 24 output.wav
converts raw CD digital audio (16-bit, signed-integer) into a 24-bit (signed-integer) WAV file. Iconic.
-c CHANNELS,--channels CHANNELSโ sets the number of audio channels in the audio file. This can be any number greater than zero, no cap ๐
For an input file, the most common use is telling SoX how many channels a raw (headerless) audio file has. Occasionally it's useful to use this with a headered file to override the (presumably incorrect) value in the header, but that's only supported with certain file types. For example:
sox_ng -r 48k -e float -b 32 -c 2 input.raw output.wav
converts a raw file to a self-describing WAV file.
play_ng -c 1 music.wav
interprets the file data as belonging to a single channel, no matter what the file header says โ and if the file actually does have two channels, it gets played at half speed ๐ญ Absolutely unhinged but that's the deal.
For an output file, this option is a shorthand for saying the channels effect should be invoked, so the number of channels in the audio signal can be changed (if necessary) to whatever number you gave. For example, these two commands are equivalent:
sox_ng input.wav -c 1 output.wav bass -b 24
sox_ng input.wav output.wav bass -b 24 channels 1
That said, the second form is more flexible, because it lets you order the effects however you want. Freedom ๐
-e ENCODING,--encoding ENCODINGโ sets the audio encoding type. You sometimes need this with file types that support more than one encoding scheme, like raw, WAV or AU โ but not with MP3 or FLAC. The available encoding types are:signed-integerโ PCM data stored as signed (two's complement) integers. Commonly used with a 16 or 24 -bit encoding size. A value of0represents minimum signal power.unsigned-integerโ PCM data stored as unsigned integers. Commonly used with an 8-bit encoding size. A value of0represents maximum signal power.floating-pointโ PCM data stored as IEEE 753 single precision (32-bit) or double precision (64-bit) floating point (real) numbers. A value of0represents minimum signal power.a-lawโ the International telephony standard for logarithmic encoding to 8 bits per sample. It has a precision equivalent to roughly 13-bit PCM and is sometimes encoded with reversed bit-ordering (see the-Xoption).u-law/mu-lawโ the North American telephony standard for logarithmic encoding to 8 bits per sample, a.k.a. ฮผ-law. It has a precision equivalent to roughly 14-bit PCM and is sometimes encoded with reversed bit-ordering (see the-Xoption).oki-adpcmโ OKI (a.k.a. VOX, Dialogic, or Intel) 4-bit ADPCM, with a precision equivalent to roughly 12-bit PCM. ADPCM is a form of audio compression that makes a good compromise between audio quality and encoding/decoding speed.ima-adpcmโ IMA (a.k.a. DVI) 4-bit ADPCM, with a precision equivalent to roughly 13-bit PCM.ms-adpcmโ Microsoft 4-bit ADPCM, with a precision equivalent to roughly 14-bit PCM.gsm-full-rateโ GSM is currently used for the majority of the world's digital wireless telephone calls ๐ฑ It utilizes several audio formats with different bit rates and associated speech quality. SoX has support for GSM's original 13kbpsFull Rateaudio format.
Encoding names can be abbreviated where that wouldn't be ambiguous; e.g. unsigned-integer can be given as un, but not u (that's ambiguous with u-law). Watch out for that one bestie, no cap ๐
For an input file, the most common use is telling SoX the encoding of a raw (headerless) audio file (see the examples in -b and -c above).
For an output file, this can be used (maybe with -b) to set the output encoding. For example:
sox_ng input.cdda -e float output1.wav
sox_ng input.cdda -b 64 -e float output2.wav
converts a raw CD digital audio (16-bit signed integer) to floating point WAV files of single and double precision respectively.
And if you don't give this option at all, the output encoding will just be the same as the input encoding, as long as the output file type supports it ๐
--no-globโ tells SoX to not do filename globbing (that's wildcard matching, bestie) on the filename that comes right after it. So like, say your current directory has bothfive-seconds.wavandfive*.wavchilling in it โ then
play_ng --no-glob "five*.wav"
plays just that one single file five*.wav. Iconic. No wildcard chaos. ๐
-r,--raterate[k] โ gives the sample rate of the file in Hz, or in kHz if you slap akon the end.
For an input file, the most common glow-up use for this option is just telling SoX the sample rate of a raw (headerless) audio file (peep the examples back in -b and -c ๐). Every once in a while it's useful with a headered file to override whatever value is sitting in the header, tho fair warning: that's only supported with certain file types. Example: if audio got recorded at a sample rate of 48k from a source that played back a lil too slowly, like 1.5%,
sox_ng -r 48720 input.wav output.wav
would fix the speed by changing only the file header (but fr, see the speed effect for the more usual solution to this problem).
For an output file, this option is basically shorthand for saying "yo, invoke the rate effect so the sample rate of the audio signal becomes this value (if it needs to change)". So these two commands are literally equivalent:
sox_ng input.wav -r 48k output.wav bass -b 24
sox_ng input.wav output.wav bass -b 24 rate 48k
tho the second form is more flexible because it lets you pass rate options and lets you order the effects however you want. Slay. โจ
-t,--typeFILE-TYPE โ hands SoX the type of an audio file. For both input and output files, this option is commonly used to let SoX know the type of aheaderlessaudio file, y'know, the ones where the actual/desired type just cannot be figured out from the filename extension. Like:
another-command | sox_ng -t mp3 - output.wav
sox_ng input.wav -t raw output.bin
It can also override the type implied by an input filename extension but โ heads up โ if you override with a type that has a header, SoX will exit with an error message if that header isn't actually there. Rude but fair. ๐
There are also pseudo filetypes that tell SoX to use a specified format module that handles more than one type of audio file, like -t sndfile and -t ffmpeg, or for when a type of file can be handled by several different format modules โ say WAV files containing MP3-encoded data.
Also, the file type can select a particular audio device driver for recording and playing. Versatile king ๐.
See soxformat_ng(7) for a list of supported file types.
-L,--endian little-B,--endian big-x,--endian swapโ these options say whether the byte order of the audio data is, respectively,little endian,big endian, or the opposite of whatever the system you're running SoX on uses. Endianness only applies to data encoded as floating point or as signed or unsigned integers of 16 bits or more. You'll often need one of these for headerless files, and sometimes for (otherwise) self-describing files. And a given endian-setting option may get ignored for an input file whose header has a specific endianness identifier in it, or for an output file that's actually an audio device.
N.B. โ Unlike other format characteristics, the endianness (byte, nibble, & bit ordering) of the input file is not automatically used for the output file. So for example, when this runs on a little-endian system:
sox_ng -B audio.s16 trimmed.s16 trim 2
trimmed.s16 will be created as little-endian. You need this instead to preserve big-endianness in the output file:
sox_ng -B audio.s16 -B trimmed.s16 trim 2
The -V option can be used to check the selected orderings. ๐
-N,--reverse-nibblesโ says the nibble ordering of the samples (aka the 2 halves of a byte) should be flipped, which is sometimes useful with ADPCM-based formats.
See the N.B. in the section on -x above.
-X,--reverse-bitsโ says the bit ordering of the samples should be flipped, which is sometimes useful with a few (mostly headerless) formats.
See the N.B. in the section on -x above.
๐ Output File Format Options ๐
These options only apply to output files, and they may only come before an output filename on the command line. Read the room, put them in the right spot. ๐
--add-commentTEXT โ appends a comment to the output file header (where applicable).--commentTEXT โ specifies the comment text to store in the output file header (where applicable).
SoX gives you a default comment of Processed by SoX if you don't pass this option (or --comment-file). And if you wanna store no comment in the output file, use --comment "". Empty string, boom, nothing. ๐ซถ
--comment-fileFILENAME โ specifies a file that contains the comment text to store in the output file header (where applicable).-C,--compressionFACTOR โ sets the compression factor for variably-compressed output file formats. If you don't pass this option, a default compression factor kicks in. The compression factor gets interpreted differently for different compressed file formats, so go look at the description of the file formats that use this option insoxformat_ng(7)for the deets. ๐
๐ EFFECTS ๐
Okay so here's the fun part. Besides converting, playing and recording audio files, SoX can invoke a whole bunch of audio effects. You stack multiple effects by listing them one after the other at the end of the SoX command line, and together they form an effects chain. ๐
Heads up bestie: applying multiple effects in real time (like when you're playing audio) may need a high performance computer. Don't blame SoX if your laptop starts screaming. ๐ญ
Some of the SoX effects are mostly meant to be applied to a single instrument or voice. To make that easier, the remix effect and the global SoX option -M can isolate tracks from a multitrack recording and then recombine them. Main character energy for real. ๐ค
๐ฆ Multiple Effects Chains ๐ฆ
A single effects chain is made up of one or more effects. Audio from the input runs through the chain until either the end of the input file is reached or an effect terminates the chain.
SoX supports running multiple effects chains over the input audio. In that case, when one chain says it's done processing audio, the audio data gets sent through the next effects chain. This keeps going until either there are no more effects chains left or the input has hit the end of the file.
You separate effects chains by putting a : (colon) after an effect; anything after that is part of a new effects chain.
โ ๏ธ It is important to put the effect that stops the chain as the first effect in the chain, because any samples buffered by effects to the left of the terminating effect are gonna get discarded. The amount of samples discarded is related to the--bufferoption and you should keep it small relative to the sample rate if the terminating effect can't be first. More info on stopping effects lives in theStopping SoXsection.
There are a few pseudo-effects that help out when you're using multiple effects chains, including newfile โ which starts writing to a new output file before moving to the next effects chain โ and restart, which moves back to the first effects chain. Pseudo-effects must be specified as the first effect in a chain and as the only effect in a chain (i.e. they must have a : before and after them). No exceptions, they need their space. ๐ง
Here's an example of multiple effects chains. It splits the input file into multiple files, each 30 seconds in length, and each output filename gets a unique number in its name, as documented in the Output Files section.
sox_ng in.au out.au trim 0 30 : newfile : restart
๐ธ Common Notation And Parameters ๐ธ
In the descriptions that follow, [square brackets] denote parameters that are optional, {braces} denote those that are both optional and repeatable, <angle brackets> denote those that are repeatable but not optional, and pipe characters | separate options you pick one of several alternatives from. Where applicable, default values for optional parameters are shown (in parentheses). ๐
The following parameters are used with, and have the same meaning for, several effects:
- frequency โ a frequency in Hz, or if followed by
k, in kHz, or if preceded by%, in semitones relative to A (440Hz); alternatively, scientific note names (e.g.E2) may be used. Versatile fr fr. - gain โ a power gain in dB. Zero gives no gain, less than zero gives an attenuation, and greater than zero amplifies.
- duration โ see
Time Specificationsbelow. - position โ a position within the audio stream; the syntax is
[=|-|+]timespec, where timespec is a time specification (see below). The optional first character says whether the timespec is interpreted relative to the start (=) or end (-) of the audio or relative to the previous position (+) if the effect accepts multiple positional arguments. The audio length must be known for end-relative locations to work, tho some effects do accept-0for the end of the audio even if the length is unknown. Which of=,-and+is the default depends on the effect and is shown in its syntax as, e.g.,position(+).
Examples: =2:00 is two minutes into the audio stream, -100s is one hundred samples before the end of the audio, +0:12+10s is twelve seconds and ten samples after the previous position, and -0.5+1s is one sample less than half a second before the end of the audio. Math girlies rise up ๐งฎโจ
- width
[h|k|o|q]โ used to specify the bandwidth of a filter. A bunch of different methods to specify the width are available (tho not all of them for every effect). You can append one of these characters to pick the method you want:hโHzkโkHzbโHz, the old non-frequency-warped responseoโoctavesqโQ-factor, see [2]sโslope
For each effect that uses this parameter, the default method (if no character is appended) is the one listed first in the first line of the effect's description. So read the fine print, bestie. ๐
๐ Time Specifications ๐
ok so bestie, a timespec can show up in one of these two forms, and you gotta know both:
[[hours:]minutes:]seconds[.frac][t]
so like, a time spec of 1:30.5 means one minute, thirty and ยฝ seconds ๐. and here's the cute part: the component values do not have to be normalized. like, 1:23:45, 83:45, 79:0285, 1:0:1425, 1::1425 and 5025 are all literally equivalent. slay.
sampless
this one specifies the number of samples directly, as in 8000s. for large sample counts, e notation is supported: 1.7e6s is the same as 1700000s. โจ
Time specifications can also be chained with + or - into a new time specification, where the right part gets added to or subtracted from the total so far. for example, 3:00-200s means two hundred samples less than three minutes. math is mathing ๐
ok and one lil caveat that actually matters: if a time specification is a plain whole number with no t or s suffix, whether it's taken as a number of seconds or a number of samples depends on the effect in question. at present, it always means seconds โ except for the duration parameters of the silence effect. iykyk.
๐ Supported Effects ๐
want to know whether SoX has support for an optional effect? just enter sox_ng -h and look for its name in the EFFECTS list. a categorized list of the effects can be found in the accompanying README file. ๐
โญ allpass โญ
allpass [-1|-2] frequency [width[h|k|o|q]]
Apply a two-pole all-pass filter with central frequency frequency and filter width width. an all-pass filter changes the audio's frequency-to-phase relationship without changing its frequency-to-amplitude relationship. the filter is described in detail in [1].
-1or-2โ use an experimental 1-pole or 2-pole filter, in which case width does not apply.
this effect supports the --plot global option. ๐
๐ฆ band ๐ฆ
band [-n] frequency [width[h|k|o|q]]
Apply a band-pass filter. the frequency response drops logarithmically around the center frequency. the width parameter gives the slope of the drop: the frequencies at frequency + width and frequency - width will have half their original amplitudes. its default value is half of the center frequency.
band defaults to a mode oriented to pitched audio, i.e. voice, singing or instrumental music. the -n (for noise) option uses the alternate mode for unpitched audio (e.g. percussion), though -n introduces a power gain of about 11dB in the filter, so beware of output clipping โ ๏ธ. band introduces noise in the shape of the filter, peaking at the center frequency and settling around it.
this effect supports the --plot global option.
see sinc for a band-pass filter with steeper shoulders. ๐
๐ bandpass | bandreject ๐
bandpass|bandreject [-c] frequency width[h|k|o|q|b]
Apply a two-pole Butterworth band-pass or band-reject filter with central frequency frequency, and (3dB-point) bandwidth width. the -c option applies only to bandpass and selects a constant skirt gain (peak gain = Q) instead of the default, a constant 0dB peak gain. the filters roll off at 6dB per octave (20dB per decade) and are described in detail in [1].
these effects support the --plot global option.
see sinc for a band-pass filter with steeper shoulders. โจ
๐ธ bass | treble ๐ธ
bass|treble gain [frequency [width[s|h|k|o|q]]]
Boost or cut the bass (lower) or treble (upper) frequencies of the audio using a two-pole shelving filter with a response similar to that of a standard hifi's tone controls. this is also known as shelving equalization. ๐๏ธ
gain gives the gain at 0Hz for bass or, for treble, whichever is the lower of โผ22kHz and the Nyquist frequency. its useful range is about -20 (for a large cut) to +20 (for a large boost). beware of clipping when using a positive gain โ ๏ธ.
the filter can be fine-tuned using the following optional parameters:
- frequency โ sets the filter's central frequency and so can be used to extend or reduce the frequency range to be boosted or cut. the default values are
100Hzforbassand3kHzfortreble. - width โ determines how steep the filter's shelf transition is. in addition to the common width specification methods,
slope(the default) may be used. its useful range is about0.3for a gentle slope to1(the maximum) for a steep slope; and its default value is0.5.
the filters are described in detail in [1].
these effects support the --plot global option.
see equalizer for a peaking equalization effect. ๐
๐ง bend ๐ง
bend [-f frame-rate(25)] [-o oversampling(16)]
{start-position(+),cents,end-position(+)}
Changes the pitch by specified amounts at specified times without changing the duration. each given triple: start-position,cents,end-position specifies one bend. cents is the number of cents (100 cents = 1 semitone) by which to bend the pitch. the other values specify the points in time at which to start and end bending the pitch. during each bend, the frequency changes logarithmically, i.e. by the same number of cents per second.
the pitch bending algorithm uses the Discrete Fourier Transform (DFT) at a particular frame rate and oversampling rate. the -f (from 10 to 80) and -o (from 4 to 32) parameters may be used to adjust these parameters and thus control the smoothness of the changes in pitch.
for example, an initial tone is generated, then bent three times, yielding four different notes in total:
play_ng -n synth 2.5 sin 667 gain 1 \
bend .35,180,.25 .15,740,.53 0,-520,.3
here, the first bend runs from 0.35 to 0.6 seconds and the second one from 0.75 to 1.28 seconds. note that the clipping that is produced in this example is deliberate; to remove it, use gain -5 in place of gain 1. ๐
see pitch.
๐ biquad ๐
biquad b0 b1 b2 a0 a1 a2
Apply a biquad Infinite Impulse Response filter with the given coefficients, where b* and a* are the numerator and denominator coefficients respectively.
see http://en.wikipedia.org/wiki/Digital_biquad_filter (where a0 = 1).
this effect supports the --plot global option.
๐ channels ๐
channels channels
Invoke a simple algorithm to change the number of channels in the audio signal to the given number: mixing if decreasing the number of channels or duplicating if increasing the number of channels.
the channels effect is invoked automatically if SoX's -c option specifies a number of channels that is different to that of the input file(s). alternatively, if this effect is given explicitly, SoX's -c option need not be given. for example, the following two commands are equivalent:
sox_ng input.wav -c 1 output.wav bass -b 24
sox_ng input.wav output.wav bass -b 24 channels 1
though the second form is more flexible as it allows the effects to be ordered arbitrarily. ๐
for example, when making a stereo file quadraphonic, the left and right channels are copied into the third and fourth and when mixing a four-channel file down to stereo, the left channel is the mix of the first and third and the right of the second and fourth.
see remix for an effect that allows channels to be mixed and selected arbitrarily.
๐ chorus ๐
chorus [-n|-l|-q] [-s|-t] [gain-in [gain-out {delay [decay [speed [depth
[-s|-t]]]]}]]
Add a chorus effect to the audio. this can make a single voice sound like a chorus but can also be applied to instrumentation.
chorus resembles an echo effect with a short delay but, while echo's delay is constant, chorus' delay varies by a sinusoidal or triangular modulation.
see [3] for further discussion of the chorus effect.
-lโ makeschorusdo linear interpolation between samples when the offset into the delay line is not a whole number, which is about 15% slower but makes it considerably less noisy-qโ asks for quadratic interpolation which is about 40% slower but makes it even less noisy-nโ explicitly asks for no interpolation, the default, fast and fuzzy โจ
-s or -t before the stages change the default wave type for all of them.
all parameters are all optional and, if missing, assume the following values:
gain-inโ range-1-1, default0.5. proportion of input delivered clean to the adder.gain-outโ range-1-1, default1. final volume adjustment.delayโ range0-1000, default40-60. fixed delay in milliseconds.decayโ range-1-1, default0.5. volume of delayed output.speedโ range0-192k, default0.25. modulation frequency.depthโ range0-1000, default2. extra delay in milliseconds.waveโ range-s|-t, default-s. sinusoidal/triangular modulation.
each delay ranges from the fixed delay to delay + depth.
gain-out is then applied to the sum of the input scaled by gain-in and the outputs from the delays scaled by their decays.
for internal reasons regarding the speed of chorus, there is a limit of 256 chorus stages. ๐ค
a typical delay is around 40ms to 60ms; the modulation speed is best near 0.25Hz and the modulation depth around 2ms. for example, a single delay:
play_ng guitar1.wav chorus 0.7 0.9 55 0.4 0.25 2 -t
two delays of the original samples:
play_ng guitar1.wav chorus 0.6 0.9 50 0.4 0.25 2 -t \
60 0.32 0.4 1.3 -s
a fuller-sounding chorus (with three additional delays):
play_ng guitar1.wav chorus 0.5 0.9 50 0.4 0.25 2 -t \
60 0.32 0.4 2.3 -t 40 0.3 0.3 1.3 -s
flanger can do everything that chorus does except multiple stages but works in floating point internally instead of integers so is slower without a floating point processor:
chorus -l gain-in gain-out delay decay speed depth -wave
is equivalent to
flanger delay depth 0 100รdecayรทgain-in speed wave 0 \
vol gain-outรท(gain-in+decay)
for a flow diagram of how chorus works, say sox_ng --help-effect chorus. ๐ซถ
๐ compand ๐
compand attack1,decay1{,attack,decay}
[soft-knee-dB:]in-dB1[,out-dB1]{,in-dB,out-dB}
[gain [initial-volume-dB [delay]]]
Compand (compress or expand) the dynamic range of the audio.
bestie, we're deep in the compander lore now and it's giving โจsignal processing degreeโจ so buckle up ๐
The attack and decay parameters (both in seconds, babes) decide the window over which the instantaneous level of the input gets averaged to figure out its volume. Attack = when the volume goes up, decay = when it goes down. For most situations, the attack time (aka how fast it reacts to the music getting louder) should be shorter than the decay time, because the human ear is way more sensitive to sudden loud music than sudden soft music. It's just science ๐ง . When you pass more than one pair of attack/decay parameters, each input channel gets companded separately, and the number of pairs must match the number of input channels. Typical values are 0.3,0.8 seconds.
The second parameter is a list of points on the compander's transfer function, given in dB relative to the maximum possible signal amplitude. The input values have to be in strictly increasing order, but the transfer function itself doesn't have to be monotonically rising (it's quirky like that). If you omit it, out-dB1 defaults to the same value as in-dB1, and levels below in-dB1 don't get companded โ though gain may still be applied to them. The point 0,0 is assumed, but you can override it with 0,out-dBn. And if the list is preceded by a soft-knee-dB value, the points where adjacent line segments on the transfer function meet get rounded by the amount you gave. Typical values for the transfer function are 6:-70,-60,-20.
The third (optional) parameter is an extra gain in dB applied at all points on the transfer function โ a lil cheat code for adjusting the overall gain easily ๐ .
The fourth (optional) parameter is an initial level to be assumed for each channel when companding starts. Why do you want this? Because it lets you hand over a nominal starting level so that, for example, a very large gain doesn't get applied to the initial signal levels before the companding action has even started working. And bestie, in that scenario it is quite probable the output would be severely clipped while the compander's gain adjusts itself ๐ญ. A typical value (for audio that starts out quiet) is -90 dB.
The fifth (optional) parameter is a delay, in seconds. The input signal is analyzed immediately to control the compander, but it's delayed before being fed to the volume adjuster. Setting a delay roughly equal to your attack/decay times lets the compander work in a predictive rather than reactive mode ๐ฎ. Typical value: 0.2 seconds.
Okay so here's the moment where it all clicks. The following example might be used to make a piece of music with both quiet and loud passages suitable for listening to in a noisy environment, like in a moving vehicle ๐:
sox_ng asz.wav asz-car.wav compand 0.3,1 6:-70,-60,-20 -5 -90 0.2
The transfer function (6:-70,...) says that very soft sounds (below -70dB) remain unchanged. This stops the compander from boosting the volume on 'silent' passages, like between movements. But sounds in the range -60dB to 0dB (maximum volume) get boosted so that the 60dB dynamic range of the original music is compressed 3-to-1 into a 20dB range โ wide enough to enjoy the music, narrow enough to get around the road noise ๐ฃ๏ธ. The 6: selects 6dB soft-knee companding. The -5 dB output gain is needed to avoid clipping (the number is inexact and was derived by experimentation, so don't @ me). The -90 dB for the initial volume will work fine for a clip that starts with near silence, and the delay of 0.2 seconds makes the compander react more quickly to sudden volume changes. Slay.
Next example: compand used as a noise-gate for when the noise is at a lower level than the signal:
play_ng in.au compand .1,.2 -inf,-50.1,-inf,-50,-50 0 -90 .1
And here's another noise-gate, but this time for when the noise is at a higher level than the signal (which makes it, in some ways, similar to a squelch effect):
play_ng in.au compand .1,.1 -45.1,-45,-inf,0,-inf 45 -90 .1
This effect supports the --plot global option (for the transfer function) ๐.
For a flow diagram of how compand works, just say sox_ng --help-effect compand.
And see mcompand for a multiple-band companding effect. ๐
contrast [enhancement-amount(75)]
Comparable with compression, this effect modifies an audio signal to make it sound louder ๐ข. enhancement-amount controls how much enhancement happens and is a number in the range 0-100. And ngl, a heads up: enhancement-amount = 0 still gives a significant contrast enhancement. Zero is not nothing here, bestie ๐.
See the compand and mcompand effects.
dcshift shift [limiter-gain]
Apply a DC shift to the audio. This can be useful to remove a known DC offset โ caused perhaps by a hardware problem in the recording chain โ from the audio. The effect of a DC offset is reduced headroom and hence volume ๐ค. The stat or stats effect can be used to figure out if a signal has a DC offset in the first place.
The given dcshift value is a floating point number in the range of ยฑ2 that indicates the amount to shift the audio (which is in the range of ยฑ1).
You can also specify an optional limiter-gain. It should have a value much less than 1 (e.g. 0.05 or 0.02) and is used only on peaks to prevent clipping.
An alternative approach to removing a DC offset (albeit with a short delay, so trade-offs, iykyk) is to use the highpass filter effect at a frequency of say 10Hz, as illustrated here:
sox_ng -n dc.wav synth 5 sin %0 50
sox_ng dc.wav fixed.wav highpass 10
deemph
Apply Compact Disc (IEC 60908) de-emphasis with a treble attenuation shelving filter. ๐๏ธ
So here's the tea: pre-emphasis was applied in the mastering of some CDs issued in the early 1980s. These included many classical music albums, as well as now sought-after issues of albums by The Beatles, Pink Floyd and others ๐. Pre-emphasis should be removed at playback time by a de-emphasis filter in the playback device. However โ and this is the annoying part โ not all modern CD players have this filter, and very few PC CD drives have it. Playing pre-emphasized audio without the correct de-emphasis filter results in audio that sounds harsh and is far from what its creators intended ๐ญ.
With the deemph effect, you can apply the necessary de-emphasis to audio that has been extracted from a pre-emphasized CD, and then either burn the de-emphasized audio to a new CD (which will then play correctly on any CD player) or just play the correctly de-emphasized audio files on the PC. For example:
sox_ng track1.wav track1-deemph.wav deemph
and then burn track1-deemph.wav to CD, or
play_ng track1-deemph.wav
or simply
play_ng track1.wav deemph
The de-emphasis filter is implemented as a biquad and requires the input audio sample rate to be either 44.1kHz or 48kHz. Its maximum deviation from the ideal response is only 0.06dB (up to 20kHz) โ that's tight, bestie โจ.
This effect supports the --plot global option.
delay {position(=)}
Delay zero or more audio channels such that they start at the given position. โฑ๏ธ
For example, delay 1.5 +1 3000s delays the first channel by 1.5 seconds, the second channel by 2.5 seconds (one second more than the previous channel), the third channel by 3000 samples, and leaves the other channels undelayed. Cute, right?
The following (one long) command plays a chime sound:
play_ng -n synth -j 3 sin %3 sin %-2 sin %-5 sin %-9 \
sin %-14 sin %-21 fade h .01 2 1.5 delay \
1.3 1 .76 .54 .27 remix - fade h 0 2.7 2.5 norm -1
and this one plays an arpeggiated guitar chord:
play_ng -n synth pl G2 pl B2 pl D3 pl G3 pl D4 pl G4 \
delay 0 .05 .1 .15 .2 .25 remix - fade 0 4 .1 norm -1
With no parameters it does nothing ๐. And heads up: to delay all channels by the same amount, use the pad effect instead.
dither [-S|-s|-f filter] [-a] [-p precision]
Apply dithering to the audio. Dithering deliberately adds a small amount of noise to the signal in order to mask audible quantization effects that can occur if the output sample size is less than 24 bits. With no options, this effect adds TPDF white noise ๐ซ๏ธ.
-Sโ selects a slightly 'sloped' TPDF, biased towards higher frequencies. It can be used at any sampling rate, but below โ22kHz plain TPDF is probably better, and above โ37kHz noise-shaping (if available) is probably better.-sโ enables noise-shaping with theshibatafilter (same as-f shibata). And with the-foption it's possible to pick a particular noise-shaping filter from the following list:lipshitz,f-weighted,modified-e-weighted,improved-e-weighted,gesemann,shibata,low-shibata,high-shibata,shibata-(A|B)(0|1|2|3|4|5|6)andshibata-A-saturated. Those lattershibata-ones use the new shaper coefficients from Naoki Shibata's SSRC package, described at https://shibatch.org/ssrc
The filter types are distinguished by the following properties: audibility of noise, level of (inaudible, but in some circumstances problematic) shaped high frequency noise, and processing speed ๐ฌ. They're available for these sample rates:
lipshitzโ 44100e-andf-weightedโ 48000gesemannโ 44100, 48000shibataโ 8000, 11025, 16000, 22050, 32000, 37800, 44100, 48000low-shibataโ 44100, 48000high-shibataโ 44100shibaba-A0andA1โ 8000, 11025, 22050, 44100, 48000, 88200, 96000, 192000shibata-A2โ 44100, 48000, 88200, 96000, 192000shibata-A3toA6โ 44100, 48000shibata-B0toB6โ 44100, 48000shibata-A-saturatedโ 8000, 11025, 22050-aโ turns on a whole auto-dither mode, where dithering (and noise-shaping, if it applies) only kicks in when it's actually needed. Lowkey the most common use case: you're fading in or out of a file that's already dithered, so the redithering only touches the faded bits. But bestie โ auto dithering is not foolproof. Check those fades carefully for noise modulation, and if you hear any, either redither the whole file or usetrim+fadeand concatenate the results. ๐ซถ-pโ overrides the target precision in bits. Range is1to24.- If the SoX global option
-Ris not given, the pseudo-random number generator that makes the white noise gets reseeded โ meaning the generated noise will be different on every invocation. ๐ - If the target precision is
1-bit, thesdmeffect is applied automatically, with default settings. Want control over its options? Invoke it manually, bestie. - Peep the above section on Dithering for the full tea. โจ
dolbyb โ the tape-deck simulation ๐
dolbyb [-e|-d] [-u upsamp] [-h] [-t gain(1.0)] [-a prec(-5.0)]
[-f {1|2|3|4}]
dolbyb is a Dolby B decoder/encoder built on dolbybcsoftwaredecode, which simulates how an actual Dolby B en/decoder's electronic circuit behaves. Iconic.
By default, dolbyb applies Dolby B decoding to its input signal. With -e it does Dolby B encoding. And -d? Also accepted, but only for symmetry โ it's the default mode of operation anyway. ๐
-uโ sets the upsampling ratio used in the sliding filter. Here's the vibe: digital filtering only works well if the sample rate is well above the filter's cutoff frequency. For Dolby B's sliding filter, that frequency can be as high as34kHz, and that just does not work well when the sample rate is only44.1Khz. So to get around it, the audio gets upsampled to a higher rate while it passes through this filter. By default,-u0, the upsampling rate is set automatically so that the upper sample rate is at least200Khz. Upsampling can be switched off with-u1.-hโ if given, upsampling is used throughout the whole effect, from when the audio enters to when it leaves, not just in the sliding filter. Heads up though: sincedolbyb's up/downsampling algorithm is simple (repeating and averaging samples), you may get higher quality results by upsampling withratebeforedolbyb -u1and downsampling it afterwards.-tโ short for "threshold", and it adjusts the gain when the audio is fed to the Dolby gain control circuits. Story time: when a tape deck is encoding or decoding a magnetic tape, it knows the signal level at the tape heads โ but with audio files, the maximum signal level may not accurately represent the tape's maximum flux density (200nWb/mfor cassette tapes), which gives erroneous results. ๐ญ The-toption adjusts the volume level at which the sliding filter reacts, to overcome this. Default value is1.0, which assumes the maximum amplitude of the signal represents the maximum recording level on tape; higher values assume it was recorded too quietly, and values below1.0are for when it was recorded too loud.
To begin with, when you have little idea of what level to use, try a wide range of levels like5,10,15and20. If the result sounds muffled, the threshold is too low, and if it seems to have too much treble, the threshold is too high. Once you know the approximate level, you can try more closely-spaced levels and listen carefully to find the best level possible. Logic would suggest listening to where tracks fade out, to see if the treble increases, but this method doesn't seem to work well โ the best way seems to be to see how low the level can be set before the results sound dull and muffled, then choose a level a bit higher than this. You can just about hear the difference between results that differ in threshold setting by about2. ๐ฅ
-aโ in decode mode, the program has to use trial and error to get the right output sample values.-asets how accurate it needs to be before it's considered OK. A figure of0.0dB would mean an accuracy of about 1 sample value. The default is-5.0dB, which is accurate to less than one sample value.-fโ selects one of four types of filter. The program originally simulated an analog circuit for a Dolby B noise reducer. But too much filtering in the side path was altering the phase of the side path audio, and that caused problems when the side path got recombined with the main signal. Basically, signals don't add together very well if there's too much difference in the phase. So to fix it, there are now 4 filter modes, with hopefully less of a phase change:-f1โ is the original method.-f2โ is a newer method that seems to work better than 1.-f3โ is another rearrangement which in practice doesn't seem to be any better than 1.-f4โ seems to work best, hence it is the default mode. ๐
For further detail on these parameters and advice on digitizing and processing Dolby B-encoded tapes, consult the wiki pages at https://codeberg.org/sox_ng/libdolbyb.
dop ๐ฆ
DSD over PCM. 1-bit DSD data is packed into 24-bit samples so it can travel over non-DSD-aware links. it's giving โจtransport layerโจ.
downsample [factor(2)] ๐
Downsample the signal by an integer factor: only the first of each factor samples is retained, the others are discarded. Bye bestie. ๐
No decimation filter is applied. If the input is not a properly band-limited baseband signal, aliasing will occur. This may be desirable, e.g., for frequency translation โ but like, now you know.
The new lower sample rate propagates forward in the effects chain, but unless you specify the new sample rate with -r before the output filename, or with a final (no-op) rate effect, it will be resampled back up to the original sample rate. ๐
For a general resampling effect with antialiasing, see rate. See also upsample.
earwax ๐
This effect takes a 44.1kHz stereo signal and adds audio cues that, when listened to on headphones, move the sound stage from inside your head to outside and in front of you, as if you were listening to loudspeakers. main character listening experience, fr fr.
To see how earwax works, say sox_ng --help-effect earwax.
echo gain-in gain-out <delay decay> ๐ซ
Add echoes to the audio. In nature, echoes are reflected sound, and digital echo effects emulate this โ they're often used to help fill out the sound of a single instrument or vocal.
- gain-in controls how much of the input signal is delivered clean to the output.
- delay is the time difference in milliseconds between the original signal and its reflection.
- decay is the loudness of the reflected signal.
- gain-out is a final volume adjustment of the result.
There is no limit to the number of delay/decay pairs you can use, and gains and decays can be negative or greater than 1 if you wish. ๐ฅ
echo extends the length of the signal by the maximum delay time.
For example, this makes it sound as if there are twice as many instruments as are actually playing:
play_ng lead.aiff echo 0.8 0.88 60 0.4
If the delay is very short, it sounds like a metallic robot: music:
play_ng lead.aiff echo 0.8 0.88 6 0.4
A longer delay sounds like an open air concert in the mountains:
play_ng lead.aiff echo 0.8 0.9 1000 0.3
One mountain more, and:
play_ng lead.aiff echo 0.8 0.9 1000 0.3 1800 0.25
For a flow diagram of how echo works, say sox_ng --help-effect echo.
echos gain-in gain-out <delay decay> ๐
echos stands for Echo in Sequel โ and it adds a sequence of echoes to the audio. So the first echo takes the input, the second takes the input and the first echo, the third takes the input and the output of the second echo, and so on. A single echos has the same effect as a single echo. Each delay decay pair gives the delay in milliseconds (with a minimum of one sample) and the decay of that echo. gain-out is a final volume multiplier applied to the sum of the input ร gain-in and the delays' outputs ร their respective decays. Obsessed with this cascade. ๐ง
echos extends the length of the signal by the maximum delay time.
For example:
The sample is bounced twice in symmetric echos:
play_ng lead.aiff echos 0.8 0.7 700 0.25 700 0.3
The sample is bounced twice in asymmetric echos:
play_ng lead.aiff echos 0.8 0.7 700 0.25 900 0.3
The sample sounds as if it were played in a garage:
play_ng lead.aiff echos 0.8 0.7 40 0.25 63 0.3
For a flow diagram of how echos works, say sox_ng --help-effect echos.
equalizer frequency width[q|o|h|k] gain ๐๏ธ
Apply a two-pole peaking equalization filter. With this filter, the signal level at and around a selected frequency can be increased or decreased while โ unlike band-pass and band-reject filters โ the level at all other frequencies is unchanged. periodt.
- frequency gives the filter's central frequency in Hz.
- width gives its bandwidth.
- gain gives the required gain or attenuation in dB.
Beware of Clipping when using a positive gain. โ ๏ธ
In order to produce complex equalization curves, this effect can be given several times, each with a different central frequency. stack 'em like a queen. ๐
The filter is described in detail in [1].
This effect supports the --plot global option.
fade [type] fade-in-length [stop-position(=) [fade-out-length]] ๐
Apply a fade effect to the beginning, end, or both of the audio.
An optional type can be specified to select the shape of the fade curve:
qโ for quarter of a sine wavehโ for half a sine wavetโ for linear (triangular) slopelโ for logarithmicpโ for inverted parabola
The default is logarithmic. โจ
A fade-in starts from the first sample and ramps the signal level from 0 to full volume over the time given as fade-in-length. Specify 0 if no fade-in is wanted.
Okay so a fade-out is the mirror of all that ๐: the audio gets truncated at stop-position, and the level ramps from full volume down to 0 across a span of fade-out-length before the stop-position lands. If you don't give a fade-out-length, it just defaults to whatever fade-in-length was โ matching twins, cute. And no fade-out happens at all if stop-position isn't specified, periodt. If the audio length can be figured out from the input file header plus any effects that came before, then you can pass -0 (or 0, for historical reasons ๐ซ ) as stop-position to say "yeah, the classic โ fade out that ends right at the end of the input stream".
Go peek at the splice effect too.
fir [coefs-file|coef <coef>]
Uses SoX's FFT convolution engine with the Finite Impulse Response filter coefficients you hand it. Give it one argument and that's the name of a file full of coefficients (separated by whitespace, # comments allowed, we love a comment ๐). If the filename is -, or you give no argument at all, the coefficients come from standard input (stdin). Otherwise you can just drop the coefficients straight onto the command line. Like:
sox_ng in.au out.au fir .0195 -.082 .234 .891 -.145 .043
sox_ng in.au out.au fir coefs.txt
where coefs.txt has
# HP filter: freq=10000
1.2311233052619888e-01
-4.4777096106211783e-01
5.1031563346705155e-01
-6.6502926320995331e-02
This effect supports the --plot global option โจ
firfit [knots-file|<freq gain>]
Uses SoX's FFT convolution engine to build a filter whose frequency response approximates a spline passing through a bunch of frequency/gain pairs. One argument = a file containing the knots (whitespace separated, # comments fine). If the filename is -, or you give nothing, the knots are read from standard input (stdin); otherwise you can say them out loud on the command line.
Gains are in dB and the knot frequencies must be in increasing order (no chaotic energy here, bestie).
Examples:
sox_ng in.au out.au firfit 20 0 10000 -3
gives you a gentle low-pass filter, and
sox_ng in.au out.au firfit knots.txt
with knots.txt containing
# Approximate telephone response
300 -100
400 -10
480 0
2800 0
3000 -10
3400 -100
approximates the response of a carbon microphone telephone ๐ iconic.
This effect supports the --plot global option โจ
flanger [-n|-l|-q] [-s|-t] [delay(0) [depth(2) [regen(0) [width(71) [speed(0.5) [shape(sine)] [phase(25) [interp(linear)]]]]]]]
Applies a flanging effect to the audio ๐ซ. There's a detailed description of flanging at [3] if you want the lore.
The parameters do this: delay and depth are the base delay and the added swept delay in milliseconds, regen is the percentage of regeneration (that's the delayed signal feedback, loop it girly), width is the percentage of delayed signal mixed in with the original, speed is the number of sweeps per second, shape is the shape of the swept wave (sine or triangle), phase is the percentage of phase shift of the swept wave in multichannel flanges (0 = 100 = same phase on every channel), and interp is the type of digital delay line interpolation (none, linear or quadratic).
sine, triangle, none, linear and quadratic can all be abbreviated ๐ซถ
The input and the delay's output get mixed and balanced so they don't clip, which means a width of 100 actually gives you 50:50 mixing. If you want only the delayed output and none of the input, set width to inf.
Even though there's a delay in there, flanger does not extend the length of the signal, so if you want the last dregs of the delayed output and feedback, pad the signal beforehand. Noted. ๐
sine, triangle, none, linear and quadratic can be abbreviated โ yes, again โ and -s, -t, -n, -l and -q are alternative ways to set the waveshape and the interpolation type without having to spell out all the other parameters. Convenient queen behavior ๐
Want a flow diagram of how flanger works? Just say sox_ng --help-effect flanger.
gain [-e|-B|-b|-r] [-n] [-l|-h] [gain-dB(0)]
Applies amplification or attenuation to the audio signal โ or, in some cases, to just some of its channels. Heads up: using any of -e, -B, -b, -r and -n requires temporary file space to stash the audio being processed, so it may be unsuitable for streamed audio ๐ญ
With no other options, gain-dB adjusts the signal power level by that many dB: positive amplifies (beware of clipping hun), negative attenuates. With other options, the gain-dB amplification or attenuation gets applied after the processing those options do.
With -e, the levels of a multichannel file's audio channels get equalized โ gain is applied to every channel except the one with the highest peak level, so that all channels reach the same peak level. (But without also giving -n, the audio is not normalized.)
-B (balance) is similar to -e, except with -B the RMS level is used instead of the peak level. -B might be used to fix stereo imbalance from an imperfect record turntable cartridge ๐ฟ Note that, unlike -e, -B might cause some clipping.
-b is like -B but with clipping protection โ if it needs to prevent clipping while balancing, attenuation gets applied to all channels. When you pair it with -n, -B and -b are synonymous.
-r is used together with a previous invocation of gain that had the -h option โ details below.
-n normalizes the audio to 0dB FSD. It's often used alongside a negative gain-dB so the audio gets normalized to a given level below 0dB. For example,
sox_ng in.au out.au gain -n
normalizes to 0dB, and
sox_ng in.au out.au gain -n -3
normalizes to -3dB.
-l invokes a simple limiter. For example,
sox_ng in.au out.au gain -l 6
applies 6dB of gain but never clips. Note that limiting more than a few dBs, more than occasionally in a piece of audio, is not recommended โ it can cause audible distortion ๐. Check the compand effect for a more capable limiter.
-h is used to apply gain that provides headroom for subsequent processing. For example, with
sox_ng in.au out.au gain -h bass +6
6dB of attenuation is applied before the bass boosting effect, making sure it doesn't clip. Obviously with bass it's clear how much headroom you need, but with other effects (like rate, dither) it's not always as obvious. Another perk of gain -h over explicit attenuation is that if the headroom isn't used by later effects, you can reclaim it with gain -r, for example:
sox_ng in.au out.au gain -h bass +6 rate 44100 gain -r
That effects chain above guarantees it never clips nor amplifies โ it attenuates if it has to, to prevent clipping, but only as much as needed. Chef's kiss ๐
Output formatting (dithering and bit-depth reduction) also needs headroom, which cannot be reclaimed, e.g.
sox_ng in.au out.au gain -h bass +6 rate 44100 gain -rh dither
Here the second gain invocation reclaims as much headroom as it can from the preceding effects, but retains as much headroom as is needed for what comes after. The SoX global option -G can be given to automatically invoke gain -h and gain -r.
Also go read the norm and vol effects.
highpass|lowpass [-1|-2] frequency [width[q|o|h|k]]
Applies a high-pass or low-pass filter with a 3dB point at frequency. The filter can be single-pole (-1), or double-pole (that's the default, or -2). width only applies to double-pole filters; the default is Q = 0.707 and gives a Butterworth response ๐ง The filters roll off at 6dB per pole per octave (20dB per pole per decade). The double-pole filters are described in detail in [1].
These effects support the --plot global option โจ
For filters with a steeper roll-off, see sinc.
hilbert [-n taps]
Applies an odd-tap Hilbert transform filter, phase shifting the signal by 90 degrees. ๐
This is used in loads of matrix coding schemes and for analytic signal generation. The process is often written as multiplication by i (or j), the imaginary unit.
An odd-tap Hilbert transform filter has a band-pass characteristic, attenuating the lowest and highest frequencies. Its bandwidth can be controlled by the number of filter taps, which you set with -n. By default, the number of taps is chosen for a cutoff frequency of about 75 Hz.
This effect supports the --plot global option โจ
ladspa [-l] [-r] module [plugin] {argument}
Applies a LADSPA [5] (Linux Audio Developer's Simple Plugin API) plugin ๐ Despite the name, LADSPA is not Linux-specific, and there's a whole wide range of effects available as LADSPA plugins โ like CMT [6] (the Computer Music Toolkit) and Steve Harris's plugin collection [7]. The first argument is the plugin module, the second is the name of the plugin (a module can contain more than one plugin), and any other arguments go to the plugin's control ports. Missing arguments get filled in with default values if that's possible.
Normally the number of input ports of the plugin has to match the number of input channels, and the number of output ports decides the output channel count. But the -r (replicate) option lets you clone a mono plugin so it handles multichannel input ๐ซถ
Some plugins introduce latency, which SoX can optionally compensate for. The -l (latency compensation) option automatically compensates for latency as reported by the plugin via an output control port named "latency".
If it's set, the environment variable LADSPA_PATH is used as the search path for plugins. See LADSPA_PATH in the section ENVIRONMENT.
โจ loudness โจ
loudness [gain [reference]]
okay so loudness is basically gain's more emotionally intelligent cousin ๐ โ it's doing the same gain thing BUT it also applies equalization tuned for the human auditory system, which is a whole science. If you want the full deep dive on loudness, the original page points you at http://en.wikipedia.org/wiki/Loudness.
Here's the tea:
- the gain gets adjusted by the
gainparameter you pass (usually a negative number, bestie, that's normal) - the signal gets equalized according to ISO 226 relative to a reference level of 65dB
- if the original audio was equalized at some other level, you can hand over an alternative
referencelevel instead - if you don't give a gain value at all? default is -10dB, no notes
See the gain effect, obviously. ๐
โจ lowpass โจ
lowpass [-1|-2] frequency [width[q|o|h|k]]
Slaps a low-pass filter on your audio ๐ โ genuinely just that. The whole legend of how it works lives in the description of the highpass effect, so go read that one for the details, iykyk.
โจ mcompand โจ
mcompand "compand-args" {frequency "compand-args"}
Bestie, this is the multi-band compander ๐. Conceptually: it's like the single-band compander, except the audio first gets split into bands using Linkwitz-Riley crossover filters, and then a separately specifiable compander runs on each one. Very main character energy for a filter.
Those quoted compand-args are exactly the ones from the compand effect:
attack1,decay1{,attack,decay}
[soft-knee-dB:]in-dB1[,out-dB1]{,in-dB,out-dB}
[gain [initial-volume-dB [delay]]]
The param rules:
- compand parameters get wrapped in double quotes ๐
- the crossover frequency for that band is given by
crossover-freq - you can repeat that whole pattern to build as many bands as your heart desires ๐
- see the
compandeffect for what all its parameters actually mean
Now. The glow-up moment โจ โ here are two examples that approximate Dolby A compression and decompression, the stuff used for tape noise reduction in professional recording studios:
# Dolby A compressor
sox_ng in.au dolbyA.au mcompand \
".1,.1 4:-56,-46,-36,-26,-26,-20,-17,-15,-9,-9" 80 \
".1,.1 4:-56,-46,-36,-26,-26,-20,-17,-15,-9,-9" 3k \
".1,.1 4:-56,-46,-36,-26,-26,-20,-17,-15,-9,-9" 9k \
".1,.1 4:-56,-42,-36,-23,-26,-18,-17,-14,-9,-9"
# Dolby A decompressor
sox_ng dolbyA.au out.au mcompand \
".1,.1 4:-46,-56,-26,-36,-20,-26,-15,-17,-9,-9" 80 \
".1,.1 4:-46,-56,-26,-36,-20,-26,-15,-17,-9,-9" 3k \
".1,.1 4:-46,-56,-26,-36,-20,-26,-15,-17,-9,-9" 9k \
".1,.1 4:-42,-56,-23,-36,-18,-26,-14,-17,-9,-9"
Real Dolby A probably compands each channel separately, but that is left as an exercise to interested readers. ๐ (not me, not today)
See compand for a single-band companding effect. ๐ซถ
โจ noiseprof โจ
noiseprof [profile-file]
This one calculates a profile of the audio, for use in noise reduction. That's it, that's the job ๐ธ. See the description of the noisered effect for the details โ they're a package deal.
โจ noisered โจ
noisered [profile-file [amount]]
Noise reduction time, bestie ๐ง. This reduces noise in the audio signal by profiling and filtering, and it's moderately effective at removing consistent background noise like hiss or hum. Not magic, but lowkey iconic.
The workflow, step by step:
- First, run SoX with the
noiseprofeffect on a section of audio that ideally would contain silence but in fact contains noise ๐ญ โ those sections are typically hanging out at the beginning or the end of a recording. noiseprofwrites a noise profile toprofile-file, or to stdout if you don't give aprofile-fileor if you pass-. E.g.
sox_ng speech.wav -n trim 0 1.5 noiseprof speech.noise-profile
Then, to actually remove the noise, you run SoX again, this time with the noisered effect. noisered reduces noise according to a noise profile generated by noiseprof โ from profile-file if it's given, or from stdin if there's no profile-file or if you pass -. E.g.
sox_ng speech.wav cleaned.wav noisered speech.noise-profile 0.3
How much noise gets removed is controlled by amount โ a number between 0 and 1, with a default of 0.5. The vibes:
- higher numbers remove more noise ๐ฅ
- BUT higher numbers also present a greater likelihood of removing wanted components of the audio signal ๐ that's the tradeoff, girl
Before you replace an original recording with a noise-reduced version, experiment with different amount values to find the optimal one for your audio. Use headphones to check that you're happy with the results, and pay particular attention to the quieter sections of the audio. ๐๐ง
On most systems, the two stages โ profiling and reduction โ can be combined using a pipe, e.g.
sox_ng noisy.wav -n trim 0 1 noiseprof | \
play_ng noisy.wav noisered
โจ norm โจ
norm [dB-level(0)]
Normalize the audio โจ. And honestly? norm is just an alias for gain -n. That's the whole thing. See the gain effect for details. ๐
โจ oops โจ
Out Of Phase Stereo effect. No options, no arguments, just vibes ๐ค.
It mixes stereo to twin mono, where each mono channel contains the difference between the left and right stereo channels. This is sometimes known as the karaoke effect, because it often has the effect of removing most or all of the vocals from a recording. Iconic behavior, fr fr.
It is equivalent to:
remix 1,2i 1,2i
โจ overdrive โจ
overdrive [gain(20) [color(20)]]
Non-linear distortion, gorgeous ๐๐ฅ. The color parameter controls the amount of even harmonic content in the overdriven output. Both parameters range from 0 to 100. That's it, go scream into it.
โจ pad โจ
pad { [%]length[@position(=)] }
Padding! Stuffing silence into your audio like it's a build-a-bear ๐งธ๐ โ at the beginning, at the end, or at any specified points throughout.
The deets:
lengthis the amount of silence to insertpositionis the position in the input audio stream at which to insert it- you can specify any number of lengths and positions, provided that a specified position is not less than the previous one (keep it in order, bestie)
- position is optional for the first and last lengths specified โ if omitted, they correspond to the beginning and the end of the audio respectively
For example:
pad 1.5 1.5adds 1.5 seconds of silence at each end of the audiopad 4000s@3:00inserts 4000 samples of silence 3 minutes into the audio
If silence is wanted only at the end of the audio, either specify the end position, or specify a zero-length pad at the start.
And here's the fun one: if a pad specification starts with a % sign, the output is padded to a multiple of length at the specified position. For example, pad 0 %10 adds silence at the end of the audio up to the next multiple of 10 seconds. Slay โญ.
See delay for an effect that can add silence at the beginning of the audio on a channel-by-channel basis โ different flavor, same energy.
โจ phaser โจ
phaser [-n|l|q] [-s|t] [gain-in(.4) gain-out(.74) delay(3) regen(.4)
speed(.5) [-s|-t(-s)]
Adding a phasing effect to the audio ๐ซ. There's a detailed description of phasing at the reference [3] if you wanna go deep.
The parameters:
delayโ the maximum delay in milliseconds, from 0 to 1000regenโ the amount of feedback from the delay, from โ1 to +1speedโ the frequency of the delay-time modulation wave, in Hz
The modulation shape:
- sinusoidal (
-s) โ preferable for multiple instruments - triangular (
-t) โ gives single instruments a sharper phasing effect
On regen: it can be from โ1 to +1, but should usually be less than 0.5 to avoid clipping. And gain-out is the final volume adjustment, from โ1 to +1.
Now the interpolation flags, aka the quality/performance tradeoff, and yes it's giving:
-lmakes phaser do linear interpolation between samples when the offset into the delay line is not a whole number โ about 15% slower but much less noisy-qdoes quadratic interpolation โ about 50% slower but even less noisy-nexplicitly asks for no interpolation, which is the default โ fast and fuzzy ๐
In sox_ng, -s or -t can be given at the start or the end. But to be compatible with earlier versions of SoX, you should supply all the parameters with one of these at the end, use gain-in and gain-out from 0 to 1, delay from 0 to 5, speed from 0.1 to 2, and don't use interpolation. Old-school rules, bestie.
Technically, the SoX phaser is not a phaser; it is a flanger. A flanger does comb filtering with equidistant spacing (e.g. 100Hz, 200Hz, 300Hz, 400Hz, ...), while a real phaser does comb filtering with factored spacing (e.g. 100Hz, 200Hz, 400Hz, 800Hz, ...) that sounds more harmonic. ๐ the plot twist
For example:
play_ng snare.flac phaser 0.8 0.74 3 0.4 0.5 -t
Gentler:
play_ng snare.flac phaser 0.9 0.85 4 0.23 1.3 -s
A popular sound:
play_ng snare.flac phaser 0.89 0.85 1 0.24 2 -t
More severe:
play_ng snare.flac phaser 0.6 0.66 3 0.6 2 -t
For a flow diagram of how phaser works, say sox_ng --help-effect phaser. ๐ซถ๐
โจ pitch โจ
pitch [-q] shift [segment [search [overlap]]]
Change the audio pitch but not the tempo ๐ฏ โ that's the whole point, and it's a flex.
shiftgives the pitch shift as positive or negativecents(i.e. 100ths of a semitone)
Pitch and tempo share the same fundamental algorithm โ see the tempo effect for a description of the other parameters.
See the bend, speed and tempo effects. ๐
โจ rate โจ
rate [-q|-l|-m|-g|-h|-e|-v|-u] [override-options] [frequency]
Change the audio sampling rate โ i.e. resample the audio โ to any given frequency (even non-integer, if this is supported by the output file format), using a quality level defined as follows:
-qโ quick โ B/Wn/aโ Rej dBโ30@Fs/4โ typical use: playback on ancient hardware-lโ low โ B/W80%โ Rej dB100โ typical use: playback on old hardware-mโ medium โ B/W95%โ Rej dB100โ typical use: audio playback-gโ generic โ B/W95%โ Rej dB100โ typical use: 16-bit-hโ high โ B/W95%โ Rej dB125โ typical use: 20-bit for 16-bit mastering-eโ extreme โ B/W95%โ Rej dB150โ typical use: 24-bit-vโ very high โ B/W95%โ Rej dB175โ typical use: 28-bit for 24-bit mastering-uโ ultra โ B/W95%โ Rej dB200โ typical use: 32-bit
These can also be selected with -Q n with n from 0 to 7. ๐
B/W (bandwidth) is the percentage of the audio frequency band that is preserved, and Rej dB is the level of noise rejection. Increasing levels of resampling quality come at the expense of increasing amounts of time to process the audio โ classic tradeoff, no cap.
If no quality option is given, the quality level used is high when processing audio and low when playing it. See Playing & Recording Audio above. ๐ธ
The quick algorithm uses cubic interpolation; all others use band-limited interpolation. By default, all algorithms have a linear phase response; for medium and above, the phase response is configurable (see below). ๐ฆ
The rate effect just shows up on its own ๐ซ when SoX's -r option names a rate that's different from whatever rate your input file(s) are serving. OR โ plot twist โ if you invoke this effect explicitly, then you don't even need to pass -r. Bestie, these two commands are legit the same thing:
sox_ng input.wav -r 48k output.wav bass -b 24
sox_ng input.wav output.wav bass -b 24 rate 48k
but the second one is lowkey more flexible, because it lets you pass rate options and lets you order your effects however you want. main character energy, honestly ๐
Also, a user notes (iykyk): resampling your tracks and then concatenating them is way more likely to make clicks at the joints than joining them first and resampling the whole result โ it's giving edge effects, no cap.
โจ Override Options โจ
The simple quality selection above already gives you settings that satisfy like the vast majority of resampling tasks. Every so often though, you'll wanna fine-tune your resampler's filter response, and for qualities medium and above you can do exactly that with the override options in this little table:
-M/-I/-L Phase response=minimum/intermediate/linear
-s Steep filter (bandwidth=99%)
-a Allow aliasing/imaging above the pass band
-b width Any bandwidth % (74-99.7 or 85-99.7 with 0
-p phase Any phase response (0=minimum, 25=intermediate,
50=linear, 100=maximum)
And now the tea on what these actually do ๐ต
All resamplers use filters that can sometimes create echo (a.k.a. ringing) artefacts with transient signals โ think finger snaps or anything else super percussive. And here's the thing: those artefacts are WAY more noticeable to the human ear if they show up before the transient (pre-echo) than if they show up after it (post-echo). Also (not me being pedantic, this matters) the frequency of any such artefacts is related to the smaller of the original and new sampling rates โ but if that's at least 44.1kHz, those artefacts land outside the range of human hearing anyway, so it's fine fr fr.
A phase response setting controls how any transient echo gets distributed between pre and post:
- minimum phase โ there's no pre-echo, but the longest post-echo
- linear phase โ pre- and post-echo are in equal amounts (in signal terms, but not in audibility, jsyk)
- intermediate phase โ it attempts to find the best compromise by selecting a small length (and level) of pre-echo and a medium-length of post-echo
You pick a minimum, intermediate or linear phase response with the -M, -I and -L options; and you can craft a custom phase response with the -p option. Heads up though: phase responses between linear and maximum (greater than 50) are rarely useful. Like, don't bother ๐
A resampler's bandwidth setting decides how much of the frequency content of the original signal survives the conversion (w.r.t. the original sample rate when you're upsampling, or the new sample rate when you're downsampling). The term pass band means all frequencies up to the bandwidth point โ e.g. at a 44.1kHz sampling rate with a resampling bandwidth of 95%, the pass band covers frequencies from 0Hz (DC) up to circa 21kHz. Crank the bandwidth up higher and you get a slower conversion, and it can increase transient echo artefacts (and the other way round, obviously).
The -s steep filter option flips the resampling bandwidth from the default 95% (based on the 3dB point) to 99%. And the -b option lets you set the bandwidth to any value in the range 74-99.7% โ but bestie, bandwidth values above 99% are not recommended for normal use, because they can cause excessive transient echo. Consider yourself warned ๐
If you give the -a option, aliasing/imaging above the pass band is allowed. Example: with a 44.1kHz sampling rate and a resampling bandwidth of 95%, that means frequency content above 21kHz can be distorted. But since that's above the pass band (i.e. above the highest frequency of interest/audibility), it may simply not be a problem for you. The benefits of allowing aliasing/imaging: reduced processing time, and transient echo artefacts reduced by almost half. slay โจ
The -d option sets the bit-accuracy in the range 15 to 33, or -R sets the bit-accuracy to obtain rejection of a specified number of dB.
Examples, because examples are the bestie behaviour:
sox_ng input.wav -b 16 output.wav rate -s -a 44100 dither -s
that one is default (high) quality resampling with overrides for a steep filter, to allow aliasing, at a 44.1kHz sample rate โ plus noise-shaped dithering, out to a 16-bit WAV file. obsessed.
sox_ng input.wav -b 24 output.aiff rate -v -I -b 90 48k
and that one is very high quality resampling with overrides for an intermediate phase, a bandwidth of 90%, at a 48k sampling rate, storing the output to a 24-bit AIFF file. chef's kiss ๐
โจ Advanced Options โจ
Down the rabbit hole we go ๐
- The
-ioption forces the use of a particular interpolator coefficient from-1to2. - The
-coption tries to limit the number of coefficients to a number of kilobytes; its argument can be from 100 up. - The
-Boption sets the percentage of the pass-band to preserve, from 53 to 95. - The
-Aoption sets the percentage of the bandwidth without aliasing, from 85 to 100. -fsets zero pass-band roll-off instead of 0.01dB for-Q 0-2.-ndisables internal small-integer optimizations and-tincreases the irrational ratio accuracy.
๐ remix ๐
remix [-a|-m] [-p] <out-spec>
out-spec = 0 | in-spec{,in-spec}
in-spec = [in-chan][-[in-chan2]][vol-spec]
vol-spec = p|i|v[volume]
This one selects and mixes input audio channels into output audio channels, okay bestie? Each output channel gets specified in turn by a given out-spec, which is a lil list of contributing input channels plus volume specifications. iconic.
Note that this effect operates on the audio channels within the SoX effects processing chain โ do not confuse it with the -m global option, where multiple files are mix-combined before entering the effects chain. Two totally different things, don't mix them up ๐
An out-spec contains comma-separated input channel numbers and hyphen-delimited channel number ranges; alternatively, you can slap a 0 in there to create a silent output channel. For instance:
sox_ng input.wav output.wav remix 6 7 8 0
that creates an output file with four channels, where channels 1, 2, and 3 are copies of channels 6, 7, and 8 in the input file, and channel 4 is silent. Whereas:
sox_ng input.wav output.wav remix 1-3,7 3
that creates a (somewhat bizarre, ngl) stereo output file where the left channel is a mix-down of input channels 1, 2, 3 and 7, and the right channel is a copy of input channel 3. chaotic but valid ๐ฆ
When you specify a range of channels, the channel numbers on the left and right of the hyphen are optional and default to 1 and to the number of input channels, respectively. So:
sox_ng input.wav output.wav remix -
performs a mix-down of all input channels to mono. periodt.
By default, where an output channel is mixed from multiple input channels, each input channel is scaled by a factor of ยน/n. But you can set custom mixing volumes by following a given input channel (or range of input channels) with a vol-spec (volume specification), which is one of the letters p, i, or v, followed by a volume number โ and the meaning of that number depends on the letter you picked:
Letter Volume number Notes
p power adjust in dB 0 = no change
i power adjust in dB As for p but invert the audio
v voltage multiplier 1 = no change; 0.5 โ 6dB attenuaโ
tion; 2 โ 6dB gain; -1 = invert
If an out-spec includes at least one vol-spec, then by default the ยน/n scaling is not applied to any other channels in the same out-spec (though maybe in other out-specs) โ though you can pass the -a (automatic) option to retain the automatic scaling in this case. For example:
sox_ng input.wav output.wav remix 1,2 3,4v0.8
that gives you channel level multipliers of 0.5,0.5 and 1,0.8, whereas:
sox_ng input.wav output.wav remix -a 1,2 3,4v0.8
that gives you channel level multipliers of 0.5,0.5 and 0.5,0.8. See the difference? ๐
The -m (manual) option disables all automatic volume adjustments, so:
sox_ng input.wav output.wav remix -m 1,2 3,4v0.8
that gives you channel level multipliers of 1,1 and 1,0.8. full control, no autopilot ๐ฅ
The volume number is optional, and omitting it means no volume change โ however, the only case where that's actually useful is in conjunction with i. For example, if input.wav is stereo, then:
sox_ng input.wav output.wav remix 1,2i
that's a mono equivalent of the oops effect. cute.
If you pass the -p option, any automatic ยน/n scaling gets replaced by ยน/โn (power) scaling; this gives you a louder mix, but one that may occasionally clip. So proceed accordingly โ ๏ธ
One use of the remix effect is to split an audio file into a set of files, each containing one of the constituent channels, so you can do subsequent processing on individual audio channels. When more than a few channels are involved, a script like this is useful:
#! /bin/sh
chans=`soxi_ng -c "$1"`
while [ $chans -ge 1 ]; do
chans0=`printf %02i $chans` # 2 digits hence up to 99 chans
out=`echo "$1"|sed "s/\(.*\)\.\(.*\)/\1-$chans0.\2/"`
sox_ng "$1" "$out" remix $chans
chans=`expr $chans - 1`
done
If a file input.wav containing six audio channels were given, the script would produce six output files: input-01.wav, input-02.wav, ..., input-06.wav. magical, honestly ๐
See the swap effect.
๐ repeat ๐
repeat [count(1)|-]
Repeat the entire audio count times, or once if count isn't given. And the special value - requests infinite repetition โ yes, forever, go off ๐
It requires temporary file space to store the audio to be repeated. Just so you know, bestie.
Note that repeating once yields two copies: the original audio and the repeated audio. math is math ๐
๐ reverb ๐
reverb [-w] [reverberance(50%) [HF-damping(50%) [room-scale(100%)
[stereo-depth(100%) [pre-delay(0ms) [wet-gain(0dB)]]]]]]
Okay bestie, this one adds reverberation to your audio using the freeverb algorithm ๐. Why would you want that? Because sometimes you're in a concert hall that's way too small, or it's packed with so many people that the hall's natural reverberance is just gone โ and reverb brings that vibe back, no cap. Also, if you've got a dry mono signal and you throw a little bit of stereo reverb on it, it usually sounds way more natural. If you want the whole academic lore on reverberation, go see [3].
โ ๏ธ Heads up queen: this effect increases the volume of the audio and keeps reverberating even after the input finishes. So to avoid clipping and to keep the audible part of the final reverberation, a typical invocation looks like this:
play_ng dry.au gain -3 pad 0 1 reverb
Hand it the -w option and it gives you only the wet signal, so you can go process it further all on its own, completely independent of the dry signal ๐ซถ. Like, for a reverse reverb effect:
play_ng -m in.au "|sox_ng in.au -p reverse reverb -w reverse"
๐ reverse ๐
Reverse the audio. Completely. All of it. Backwards ๐. It needs temporary file space to store the audio it's flipping, so yeah, disk space is the price of time travel here.
๐ฟ riaa ๐ฟ
Apply RIAA vinyl playback equalization โจ. The sampling rate must be 44.1, 48, 88.2, 96 or 192kHz โ those are the only ones invited to the party, periodt.
This effect supports the --plot global option, so slay, you can look at it. ๐
๐ฅ saturation ๐ฅ
saturation [type [blend [offset [drive|color|threshold]]]]
Add saturation, which can give you anything from subtle warmth to straight-up crunchy fuzz ๐. The type parameter picks the saturation type: tanh (the default, bestie), sqrt or diode.
For all types, the blend parameter (default 1) controls the mixture of wet and dry signals in the output, where 1 means fully wet ๐
. The offset parameter (default 0) adds a DC offset to the input so you get asymmetric distortion. Now, the offset gets removed from the output, so a zero input level still produces a zero output level โ but when the input is non-zero, the output waveform is likely to be asymmetric. Yeah, that's just how it is ๐.
The tanh saturation type uses the hyperbolic tangent function to apply soft clipping. The drive parameter (default 1) controls the input gain, which is what controls how much distortion you get.
The sqrt saturation type uses a mixture of two functions: x*sqrt(|x|) and sgn(x)*sqrt(|x|), which give different tonal qualities to the output. The color parameter (default 0.5) controls the mixture of these functions, with 0 being purely x*sqrt(|x|) and 1 being purely sgn(x)*sqrt(|x|).
The diode saturation type models the effect of using a pair of diodes to clip the signal when it exceeds a threshold (default 0.5). The blend parameter, by mixing the wet and dry signals, effectively controls the amount of attenuation that occurs above the threshold โ from no attenuation when blend is 0, all the way to complete attenuation (that's hard clipping, bestie) when blend is 1.
If you want another kind of non-linear distortion, go check out the overdrive effect ๐. And when you use the offset parameter to produce asymmetric distortion, the highpass effect can be used to rebalance the waveform's positive and negative amplitude. Teamwork makes the dream work.
๐ sdm ๐
sdm [-f filter] [-t order] [-n num] [-l latency]
Apply a 1-bit sigma-delta modulator, producing DSD output โจ. The input should already have been upsampled โ like, with the rate effect โ to a high rate: 2.8224MHz for DSD64, iykyk.
The -f option selects the noise-shaping filter from this list, where the number tells you the order of the filter:
clans-4 sdm-4
clans-5 sdm-5
clans-6 sdm-6
clans-7 sdm-7
clans-8 sdm-8
You can also combine that noise filter with a partial trellis/viterbi search by supplying these options:
-torder โ Trellis order, max32.-nnum โ Number of paths to consider, max32.-llatency โ Output latency, max2048.
๐ญ Okay but for real: the result of using these parameters is hard to predict and can include high noise levels or instability. Caution is advised. You have been warned, bestie.
๐คซ silence ๐คซ
silence [-l] above-periods [duration threshold[d|%]]
[below-periods duration threshold[d|%]]
Removes silence from the beginning, middle or end of the audio, where "silence" is decided by a threshold you specify ๐.
The above-periods value tells it whether audio should be trimmed at the beginning. A value of 0 means no silence gets trimmed from the beginning at all, and in that case duration and threshold are just omitted. But when above-periods is non-zero, you must also give a duration and a threshold, and it trims audio until it finds non-silence. Normally you'd use 1 when trimming silence off the front, but you can bump it higher to trim all audio up to the Nth non-silence period. Example: say you've got an audio file with two songs, and each of them has 2 seconds of silence before it. Set above-period to 2 and it strips out both silences and the first song ๐ณ. Iconic, honestly.
duration is how long non-silence must be detected before it stops trimming the silence before it. Crank duration up and short bursts of quiet noise get treated as silence and trimmed away too. Now here's the weird part โ duration has the peculiarity that a bare number is interpreted as a sample count, not seconds ๐. To get seconds, either use the t suffix (like 2t), use a decimal point (like 2.0), or specify minutes as well (like 0:02).
threshold is the maximum sample value in any channel that still counts as silence. For digital audio, 0 may be totally fine โ but for audio recorded from analog, you probably wanna bump it up so background noise gets included. threshold numbers can be suffixed with d to say the value is in decibels, or % to say it's a percentage of the maximum possible sample value. By default, it's in percent.
To trim silence from the end, you give a below-periods count, which means: remove all audio after the last onset of silence is detected. Normally that's 1, but it can be increased to leave shorter periods of silence โ and the audio following them โ intact. Like, if you've got a track with 1 second of silence in the middle and 1 second at the end, set below-period to 2 and you keep the middle silence and whatever comes after it, and only remove from the final silence onward ๐
.
When below-periods is given, its duration specifies the length of silence that must exist before audio stops being copied. Give a higher duration and shorter silences that you actually want can be left in. Example: a song with 1 second of silence in the middle and 2 seconds of silence at the end โ a duration of 2 could be used to skip over the middle silence and trim the end instead of starting to trim from halfway through. Chef's kiss.
๐ญ Unfortunately, the length of the silence at the end has to be longer than any preceding silence for this to work, so you must know the length of the silence at the end. Not ideal, bestie, not ideal.
A more reliable way to trim silence from the end is to use the silence effect together with the reverse effect ๐ซถ. Reverse the audio first, use above-periods to trim from what now looks like the front of the file, then reverse it again to get back to normal.
To remove silence from the middle of a file, give a negative below-periods. That value then gets treated as a positive value, and it also signals that the effect should restart processing as specified by the above-periods โ which makes it perfect for removing periods of silence in the middle of your audio. Yes queen, negative numbers doing double duty.
The -l option says that below-periods' duration of "silent" audio should be left intact at the beginning of each period of silence. So if you wanna remove long pauses between words but not remove the pauses completely, that's your girl ๐.
Here's how you'd use it to make a recording that doesn't have the silence that always happens between pressing record and the performance actually starting:
rec_ng parameters filename other-effects silence 1 5 2%
And this next example should remove the start of the recording until there's a period of non-silence longer than 0.2s and louder than 0.1%, then start searching for a silence that's longer than 1s and quieter than 3% and remove it if it's found, leaving the first 1s of it in place, then start copying again until a silence is found that's longer than 1s and quieter than 3%, trim that to 1s and so on. Whew, that was a mouthful โจ.
sox_ng in.au out.au silence -l 1 0.2 0.1% -1 1.0 3%
๐ฆ sinc ๐ฆ
sinc [-a att|-b beta] [-p phase|-M|-I|-L] [-t tbw|-n taps]
[freqHP][-freqLP [-t tbw|-n taps]] [-r]] [-d]]
Apply a kaiser-windowed low-pass, high-pass, band-pass or band-reject filter to the signal ๐. The freqHP and freqLP parameters give the frequencies of the 6dB points of a high-pass and low-pass filter, and you can invoke either one individually or both together. If you give both: freqHP less than freqLP makes a band-pass filter, and freqHP greater than freqLP makes a band-reject filter. Watch the glow-up:
sinc 3k
sinc -4k
sinc 3k-4k
sinc 4k-3k
Those four create a high-pass, low-pass, band-pass and band-reject filter respectively ๐.
The default stop band attenuation of 120dB can be overridden with -a. Or, alternatively, you can hand over the kaiser window's beta parameter directly with -b.
The default transition bandwidth of 5% of the total band can be overridden with -t (with tbw in Hertz). Or, alternatively, you can give the number of filter taps directly with -n โ and that one is limited to the range of 11-32767, so don't get wild with it ๐.
okay so real quick, if you're giving both freqHP and freqLP, here's the rule: a -t or -n option placed to the left of the frequencies applies to both of them, but one of these options placed to the right of the frequencies applies only to freqLP. that's the whole vibe ๐
-p,-M,-I,-Lโ these control the filter's phase response. want the details? go look at therateeffect, bestie.-rโ controls whether the filter rounds the number of taps to the closest integer instead of just truncating it. round up, it's giving โจprecisionโจ-dโ okay so if a low-pass filter is being created and the cutoff frequency is at or above the Nyquist frequency, this says thesinceffect should be deleted from the effects chain instead of failing. graceful exit, we love that ๐ซถ- this effect supports the
--plotglobal option ๐
๐ฆ softvol [volume(1.0) [double-time(0) [headroom(0)]]] ๐ฆ
the soft volume effect applies a simple multiplier to the audio, making sure it does not clip. and here's the slay part: when a sample would have clipped, the volume multiplier is automatically reduced to compensate. it's giving self-care, honestly ๐
it's a simple compander, and it has the advantages of running fast, having no pre- or post-echo, and reacting on the crests of the wave โ so its volume-reduction glitches don't add audible noise. iconic behaviour, no cap.
volumesets the initial volume multiplier. the default of1.0means no change.double-timesays the volume should slowly increase at a rate that makes it double everydouble-timeseconds. a good value for usual music is10, and the default value of0says the volume should not increase automatically. (0 = chill, 10 = glow-up ๐ฑ)headroomis in dB and limits the loudest amplitude to less than the 32-bit maximum. this may be necessary when the final bit-depth reduction and/or dithering make it clip. a value of0.1is sufficient to protect down to a bit-depth of 8 with dithering. protect your peaks, bestie ๐ก๏ธ
when playing sound in interactive mode, the v and V keys reduce and increase the volume if there is a softvol in the effects chain. and if there's more than one? which one it adjusts is probably random. chaos. we respect it ๐ญ
๐ spectrogram [options] ๐
create a spectrogram of the audio. the audio is passed unmodified through the SoX processing chain, so it's just an observer, minding its business. this effect is optional โ type sox_ng --help and check the list of supported effects to see if it has been included. ๐
the spectrogram is rendered in a Portable Network Graphic (PNG) file and shows time in the X axis, frequency in the Y axis, and audio signal magnitude in the Z axis, represented by the color (or optionally the intensity) of the pixels in the X-Y plane. if the audio signal contains multiple channels, these are shown from top to bottom starting from channel 1, which is the left channel for stereo audio. so channel 1 is up top serving main character energy โจ
for example, if my.wav is a stereo file, then
sox_ng my.wav -n spectrogram
creates a spectrogram of the entire file in the file spectrogram.png. more often though, analysis of a smaller portion of the audio is required; e.g. with
sox_ng my.wav -n remix 2 trim 20 30 spectrogram
the spectrogram shows information only from the second (right) channel of thirty seconds of audio starting from twenty seconds in. to analyze a small portion of the frequency domain, the rate effect may be used, e.g.
sox_ng my.wav -n rate 6k spectrogram
allows detailed analysis of frequencies up to 3kHz (half the sampling rate) i.e. where the human auditory system is most sensitive. see also the -R option below. with
sox_ng my.wav -n trim 0 10 spectrogram -x 600 -y 200 -z 100
the given options control the size of the spectrogram's X, Y & Z axes (in this case, the spectrogram area of the produced image will be 600 by 200 pixels in size and the Z axis range will be 100 dB). note that the produced image includes axes, legends etc. and will be larger than the specified spectrogram size unless the -r option is given: if each spectrogram is x ร y and there are c channels, the image will be x + 144 by (y ร c) + 78, plus c โ 1 if -a was not given, and 20 pixels higher than this if you gave -t Title. a raw spectrogram will be x by y ร c. math is math, bestie ๐
in this example
sox_ng -n -n synth 6 tri 10k:14k spectrogram -z 100 -w kaiser
an analysis window with high dynamic range is selected to best display the spectrogram of a swept triangular wave. for a similar example, append the following to the chime command in the description of the delay effect (above):
rate 2k spectrogram -X 200 -Z -10 -w kaiser
options are also available to control the appearance (color set, brightness, contrast etc.) and filename of the spectrogram; e.g. with
sox_ng my.wav -n spectrogram -m -l -o print.png
a spectrogram is created suitable for printing on a black and white printer. very demure, very mindful ๐
๐ Options ๐
-x numโ change the (maximum) width (X axis) of the spectrogram from its default value of800pixels to a given number between100and a million. see-Xand-d. so wide, so much range ๐-X numโ X axis pixels per second; the default is auto-calculated to fit the audio to the X axis size if its duration is known or given with-d, or100otherwise. if given without a-xoption when the length of the audio is known, this option determines the width of the spectrogram; otherwise, it affects the duration of the spectrogram.numcan be from1(low time resolution) to5000(high time resolution) and need not be an integer. SoX may make a slight adjustment to the given number for processing quantization reasons; if so, SoX reports the actual number used (viewable when the SoX global option-Vis in effect). ๐-y numโ sets the size of the Y axis per channel in pixels; this is the number of frequencybinsused in the Fourier analysis that produces the spectrogram. by default the Y axis size is chosen automatically, depending on the-Yheight and the number of channels, with a minimum of64. let it cook ๐-Y numโ sets the total height of the spectrogram(s). the default value is550pixels and the maximum is a million. ifnumis not an exact multiple of the number of channels, the actual total height will be a few pixel rows less. minor loss, we move ๐-z numโ Z axis (color) range in dB, default120. this sets the dynamic range of the spectrogram to be-numdBFS to0dBFS.nummay range from20to180. decreasing dynamic range effectively increases the contrast of the spectrogram display and vice versa. contrast is the moment ๐ฅ-Z numโ sets the upper limit of the Z axis in dBFS. a negativenumeffectively increases the brightness of the spectrogram display and vice versa. โจglow upโจ-nโ normalizes the upper limit of the Z axis so that the loudest pixels are shown using the brightest color in the palette โ a kind of automatic-Zflag. auto-pilot, we love her ๐ซถ-q numโ sets the Z axis quantization, i.e. the number of different colors (or intensities) in which to render Z axis values. a small number (e.g.4) gives a poster-like effect making it easier to discern magnitude bands of similar level and results in a smaller PNG file. the number given specifies the number of colors to use in the Z axis range; two colors are reserved to represent out-of-range values. reservation! ๐-w nameโ select a window function:Hann(the default),Hamming,Bartlett,Rectangular,KaiserorDolph. the spectrogram is produced using the Discrete Fourier Transform (DFT) algorithm and a significant parameter of this algorithm is the choice of window function. by default, SoX uses theHannwindow, which has good all-round properties for frequency resolution and dynamic range. for better frequency resolution but lower dynamic range, select aHammingwindow; for higher dynamic range but poorer frequency resolution, select aDolphwindow. choose your fighter ๐-W numโ window adjustment parameter. this can be used to make small adjustments to theKaiserandDolphwindows. a positive number (up to ten) increases its dynamic range, a negative number decreases it. tweaking, but make it fashion ๐-sโ allow slack overlapping of DFT windows. this can, in some cases, increase image sharpness and give greater adherence to the-xvalue but at the expense of a little spectral loss. sharpness vs. loss, the eternal trade-off ๐ญ-mโ creates a monochrome spectrogram (the default is color). minimalism, but make it deliberate ๐ค-hโ selects a high-color palette which is less visually pleasing than the default color palette but it may make it easier to differentiate different levels. if this option is used in conjunction with-m, the result is hybrid monochrome/color palette. hybrid queen ๐-p numโ permute the colors in a color or hybrid palette. thenumparameter, from1(the default) to6, selects the permutation. spin the wheel ๐-lโ creates aprinter-friendlyspectrogram with a light background (the default has a dark background). for the printer besties ๐จ๏ธ-aโ suppress the display of the axis lines. this is sometimes useful in helping to discern artefacts at the spectrogram edges. let me see the edges, no distractions ๐-rโ raw spectrogram: suppress the display of axes and legends. bare. stripped. honest. ๐-Aโ selects an alternative, fixed color set. this is provided only for compatibility with spectrograms produced by another package. it should not normally be used as it has some problems, not least, a lack of differentiation at the bottom end which results in masking of low-level artefacts. so likeโฆ only if you must, bestie ๐ฉ-t textโ set the image title, the text to display above the spectrogram. if you need it to bechorusor some other effect's name, surround it by spaces inside double quotes. title drop, periodt ๐-c textโ sets (or nukes/clears) the image comment bestie, aka the text that shows up below and to the left of the spectrogram. cute lil label energy ๐-o fileโ the name of your spectrogram output PNG file, and it defaults tospectrogram.png. and if you pass-instead? the spectrogram goes straight to thestandard output(stdout) ๐ wild but true.-Lโ plots the frequency on a logarithmic axis. slay.-R L:Hโ specifies the frequency range, fromLtoH. the frequencies can optionally have a suffix, like:
sox_ng mymusic.mp3 -n spectrogram -L -R 100:8k
By default, the lowest frequency is 0Hz for a linear graph, or 1Hz for a logarithmic graph, and the highest is the Nyquist frequency. okay math queen ๐
๐ Advanced Options ๐
So the whole point of these next ones: you can process a smaller section of audio without affecting other effects or the output signal โ which is literally not how it works when you use the trim effect. iykyk. ๐ซถ
-d durationโ sets the X axis resolution such that audio with the givenduration(a time specification) fits the selected (or default) X axis width. if the audio length is known, it defaults to the audio length minus the start time. for example:
sox_ng input.mp3 output.wav -n spectrogram -d 1:00 stats
that creates a spectrogram showing the first minute of the audio, while the stats effect is applied to the entire audio signal. two things at once?? main character behaviour fr fr โจ
See -X for an alternative way of setting the X axis resolution.
-S position(=)โ starts the spectrogram at the given point in the audio stream. for example:
sox_ng input.aiff output.wav spectrogram -S 1:00
that one creates a spectrogram showing all but the first minute of the audio โ the output file, however, still receives the entire audio stream. no cap.
oh and if you wanna do off-line processing of spectral data? go see stat -freq. it's giving data scientist ๐ง
๐ธ speed factor[c] ๐ธ
Adjusts the audio speed โ that's pitch and tempo together, bestie, they're a package deal.
factor is either:
- the ratio of the new speed to the old speed โ greater than
1speeds it up, less than1slows it down, or - if the letter
cis appended, it's the number of cents (100ths of a semitone) by which the pitch (and tempo) should be adjusted: greater than0increases, less than0decreases.
Technically โ okay the way this works โ the speed effect only changes the sample rate information, leaving the samples themselves untouched. The rate effect gets invoked automatically to resample to the output sample rate, using its default quality/speed. So if you want higher quality or higher speed resampling, in addition to the speed effect, specify the rate effect with the desired quality option. ๐
See the bend, pitch and tempo effects.
๐ฆ speexdsp [-agc [target_level(100)]] [-denoise [max_db(15)]] [-dereverb] [-fps frames_per_second(20)] [-spf samples_per_frame] ๐ฆ
Uses the Speex DSP library to improve perceived sound quality. glow-up for your audio, literally ๐
If you specify no options at all, the -agc and -denoise features get enabled by default.
-agc [target_level]โ enables automatic gain control, and optionally you can specify a target volume level from1to100.-denoise [max_db]โ enables noise reduction, and optionally you can specify the maximum attenuation from1to100.-dereverbโ enables reverb reduction. bye bye bathroom acoustics ๐ฟ-fps frames_per_secondโ specifies the number of frames per second, from1-100.-spf samples_per_frameโ specifies the number of samples per frame. the default is derived from the-fpssetting so that frames abut but do not overlap. very considerate of them honestly ๐
๐ splice [-h|-t|-q] {position(=)[,excess[,leeway]]} ๐
Splices audio sections together. This effect does two things that plain audio concatenation can't:
- a (usually short) cross-fade is applied at the join, and
- a wave similarity comparison is made to help figure out the best place to make the join.
One of -h, -t, or -q may be given to select the fade envelope as half cosine wave (the default), triangular (a.k.a. linear), or quarter cosine wave (e.g. for a cross-fade of correlated audio).
Audio Fade level Transitions
-h correlated constant gain smooth
-t correlated constant gain abrupt
-q uncorrelated constant power smooth
To perform a splice, first use the trim effect to select the audio sections you're joining together. And this is the part you don't skip โ as when performing a tape splice, the end of the section to be spliced onto should be trimmed with a small excess (default 0.005 seconds) after the ideal joining point. The beginning of the audio section to splice on should be trimmed with the same excess before the ideal joining point plus an additional leeway (default 0.005 seconds). SoX should then be invoked with the two audio sections as input files, and the splice effect given with the position at which to perform the splice โ and that position is the length of the first audio section (including the excess).
The following diagram uses the tape analogy to illustrate the splice operation. The effect simulates the diagonal cuts and joins the two pieces:
length1 excess
-----------><--->
_________ : : _________________
\ : : :\ `
\ : : : \ `
\: : : \ `
* : : * - - *
\ : : :\ `
\ : : : \ `
_______________\: : : \_____`____
: : : :
<---> <----->
excess leeway
where * indicates the joining points.
For example ๐ก โ a long song begins with two verses which start (as determined e.g. by using the play_ng command with the trim (start) effect) at times 0:30.125 and 1:03.432. The following commands cut out the first verse:
sox_ng too-long.wav part1.wav trim 0 30.130
(5 ms excess, after the first verse starts)
sox_ng too-long.wav part2.wav trim 1:03.422
(5 ms excess plus 5 ms leeway, before the second verse starts)
sox_ng part1.wav part2.wav just-right.wav splice 30.130
For another example, the SoX command
play_ng "|sox_ng -n -p synth 1 sin %1" "|sox_ng -n -p synth 1 sin %3"
generates and plays two notes, but there's a nasty click at the transition ๐ญ the click can be removed by splicing instead of concatenating the audio, i.e. by appending splice 1 to the command. Clicks at the beginning and end of the audio can be removed by preceding the splice effect with fade q .01 2 .01.
Provided your arithmetic is good enough (bestie. trust your math ๐งฎ), multiple splices can be performed with a single splice invocation. For example, with a Bourne shell script acpo:
#! /bin/sh
# Audio Copy and Paste Over
# acpo infile copy-start copy-stop paste-over-start outfile
# No chained time specifications allowed for the parameters
# (i.e. such that contain +/-).
e=0.005 # Using default excess
l=$e # and leeway.
sox_ng "$1" piece.wav trim $2-$e-$l =$3+$e
sox_ng "$1" part1.wav trim 0 $4+$e
sox_ng "$1" part2.wav trim $4+$3-$2-$e-$l
sox_ng part1.wav piece.wav part2.wav "$5" \
splice $4+$e +$3-$2+$e+$l+$e
two splices are used to copy and paste audio. โ๏ธ๐
It's also possible to use this effect to perform general cross-fades, e.g. to join two songs. In this case, excess would typically be a number of seconds, the -q option would typically be given to select an equal power cross-fade, and leeway should be zero (which is the default if -q is given). For example, if f1.wav and f2.wav are audio files to be cross-faded, then
sox_ng f1.wav f2.wav out.wav splice -q $(soxi_ng -D f1.wav),3
cross-fades the files where the point of equal loudness is 3 seconds before the end of f1.wav, i.e. the total length of the cross-fade is 2 ร 3 = 6 seconds ($(...) is POSIX shell notation that is replaced by the output of the enclosed command). ๐โจ
๐ stat [-s scale] [-rms] [-freq] [-v] [-d] [-a] [-h] ๐
Displays time and frequency domain statistical information about the audio. and the audio itself? passed unmodified through the SoX processing chain. it just observes, it don't touch ๐
The information is output to the standard error (stderr) stream and is calculated โ where n is the duration of the audio in samples, c is the number of audio channels, r is the audio sample rate, and xk represents the value (in the range -1 to +1) of each successive sample in the audio โ as follows:
okay bestie, stat is about to give you the entire ~vibe check~ on your audio, so here's every single number it can print ๐
- Samples read โ
nรc - Length (seconds) โ
nรทr - Scaled by โ See
-sbelow. ๐ - Maximum amplitude โ
max(xk)โ the maximum sample value in the audio; usually this will be a positive number. - Minimum amplitude โ
min(xk)โ the minimum sample value in the audio; usually this will be a negative number. - Midline amplitude โ
ยฝmin(xk)+ยฝmax(xk) - Mean norm โ
ยน/nฮฃโxkโโ the average of the absolute value of each sample in the audio. - Mean amplitude โ
ยน/nฮฃxkโ the average of each sample in the audio. If this figure is non-zero, then it indicates the presence of a DC offset which could be removed using thedcshifteffect. ๐ซถ - RMS amplitude โ
โ(ยน/nฮฃxkยฒ)โ the level of a DC signal that would have the same power as the audio's average power. - Maximum delta โ
max(โxk-xk-1โ) - Minimum delta โ
min(โxk-xk-1โ) - Mean delta โ
ยน/n-1ฮฃโxk-xk-1โ - RMS delta โ
โ(ยน/n-1ฮฃ(xk-xk-1)ยฒ) - EBUR128 Momentary โ the maximum momentary loudness over 400ms
- EBUR128 Short Term โ the maximum short term loudness over 3 seconds
- EBUR128 Integrated โ the integrated loudness over the whole file
- EBUR128 True Peak โ the maximum of the True Peak of each channel
- Rough frequency โ in Hz.
- Volume Adjustment โ the parameter to the
voleffect which would make the audio as loud as possible without clipping. See the discussion on Clipping above for reasons why it is rarely a good idea actually to do this. ๐ญ
Note that the delta measurements are not applicable to multichannel audio and EBU R 128 (=ITU-R BS.1770) measurements are in Loudness Units referenced to Full Scale (LUFS),
Now the options, bestie:
-sโ scales the input data by a given factor. The default value of scale is2147483647(the maximum value of a 32-bit signed integer) as internal effects always work with those. A lower value means that a different sample value should be considered as the full-scale amplitude. ๐๏ธ-rmsโ converts all average values toroot mean squareformat.-freqโ outputs the input's power spectrum (a 4096-point DFT) instead of the statistics listed above. This should only be used with a single-channel audio file, fr fr.-vโ displays only theVolume Adjustmentvalue.-dโ displays a hex dump of the 32-bit signed PCM data audio in SoX's internal buffer. This is mainly used to help track down endian problems that sometimes occur in cross-platform versions of SoX. ๐-aโ outputs the average power spectrum instead of the power spectrum for each 4096-point DFT.-hโ uses the "histogram algorithm" to calculate the integrated EBU R-128 loudness, which requires less memory but is less accurate. trade-off queen โจ-jโ outputs the statistics in JSON format, e.g.:
{
"samples_read": 22699008,
"length": 236.448,
"scaled_by": 2.14748e+09,
"maximum_amplitude": 0.818604,
"minimum_amplitude": -0.532471,
"midline_amplitude": 0.143066,
"mean_norm": 0.0352694,
"mean_amplitude": 0.00180676,
"rms_amplitude": 0.056726,
"maximum_delta": 0.367126,
"minimum_delta": 0,
"mean_delta": 0.0177341,
"rms_delta": 0.0268538,
"rough_frequency": 3616,
"volume_adjustment": 1.22159
}
If -rms was given, "scaled_by" will be "scaled_by_rms" and if -e was given, you also get
"ebur128_momentary": -30.3408,
"ebur128_short_term": -35.4501,
"ebur128_integrated": -21.3583,
Some fields may be absent if their values are incalculable (EBUR128 figures) or would be infinite (like the RMS of silence). ๐ซ
As JSON uses scientific notation, it can show the values of very small numbers that the usual output shows as zero.
The most common use of stat is to measure the characteristics of a single audio file, for which the syntax is:
sox_ng file.wav -n stat
where -n means "No audio output is required." ๐
๐ฆ stats ๐ฆ
stats [-b bits|-x bits|-s scale] [-w time] [-j]
Displays time domain statistical information about the audio channels; audio is passed unmodified through the SoX processing chain. Statistics are calculated and displayed for each audio channel and, where applicable, an overall figure is also given. ๐
For example, for a typical well-mastered stereo music file:
Overall Left Right
DC offset 0.000803 -0.000391 0.000803
Min level -0.750977 -0.750977 -0.653412
Max level 0.708801 0.708801 0.653534
Pk lev dB -2.49 -2.49 -3.69
RMS lev dB -19.41 -19.13 -19.71
RMS Pk dB -13.82 -13.82 -14.38
RMS Tr dB -85.25 -85.25 -82.66
Crest factor - 6.79 6.32
Flat factor 0.00 0.00 0.00
Pk count 2 2 2
Bit-depth 16/16 16/16 16/16
Num samples 7.72M
Length s 174.973
Scale max 1.000000
Window s 0.050
DC offset, Min level, and Max level are shown, by default, in the range ยฑ1. If the -b (bits) option is given, these three measurements are scaled to a signed integer with the given number of bits from 2 to 32. For example, for 16 bits, the scale would be -32768 to +32767. The -x option behaves the same way as -b except that the signed integer values are displayed in hexadecimal. The -s option scales the three measurements by a given floating point number.
Pk lev dB and RMS lev dB are the standard peak and RMS levels measured in dBFS. RMS Pk dB and RMS Tr dB are peak and trough values of the RMS level measured over a short window (default: 50ms). That can be changed with the -w option in seconds from 0.01 to 10.
Crest factor is the ratio of peak to RMS level (note: not in dB).
Flat factor is a measure of the flatness (i.e. consecutive samples with the same value) of the signal at its peak levels (i.e. either Min level or Max level).
Pk count is the number of occasions (not the number of samples) that the signal attained either Min level, or Max level. The primary goal of the Peak Count value is to answer the question "has this audio been clipped?", quite possibly as a result of the frowned-upon-by-some but common practice of 'brick wall limiting' in modern mastering. The closer the "Peak Count" is to 1, the higher the confidence that the audio has not been clipped. ๐
The right-hand Bit-depth figure is the standard definition of bit-depth, i.e. that all bits other than this number of the most significant bits are always zero. The left-hand figure is the number of bits at the least significant end of those most significant bits that would be sufficient to represent all sample values accurately (including the sign bit).
In mathematical terms, the right-hand figure is the ordinal, counting from the most significant bit, of the least significant bit that is set to one in at least one sample. The left-hand figure is the ordinal, counting from the least significant repeated sign bit across all samples, of the least significant bit that is set to one in at least one sample.
Bit-depths are not intended to be properties of the signal per se but properties of its 2's-complement PCM encoding.
The primary use case of bit-depth measurement concerns manipulation of PCM audio by simple bit shifting, to answer questions such as: "Is it likely that this 24-bit PCM file was created by simply converting a 16-bit PCM file to 24-bit?" or "Can I losslessly shift all the samples in this PCM audio file m-bits left or n-bits right?" ๐
For multichannel audio, an overall figure for each of the above measurements is given and derived from the channel figures as follows: DC offset: maximum magnitude; Max level, Pk lev dB, RMS Pk dB, Bit-depth: maximum; Min level, RMS Tr dB: minimum; RMS lev dB, Flat factor, Pk count: average; Crest factor: not applicable.
Length s is the duration in seconds of the audio and, unlike stat, Num samples is equal to the sample rate multiplied by Length. Scale max is the scaling applied to the first three measurements; specifically, it is the maximum value that could apply to Max level. Window s is the length of the window used for the peak and trough RMS measurements.
The -j option outputs JSON with three fields:
"channel_count"โ An integer."overall"โ An object with a member for each row of the first column of the usual output, which are all numbers except for"bit_depth", which is an array of two numbers."channels"โ An array of objects with the per-channel values.
To know the overall and the channels' member names, have a look at the output. ๐
Like stat, the usual way to measure the characteristics of a single audio file is:
sox_ng file.wav -n stats
๐ง stretch ๐ง
stretch [factor [window [fade [shift [fading]]]]]
Change the audio duration but not its pitch by cross-fading between short windows of samples. This effect is broadly equivalent to the tempo effect with factor inverted and search set to zero so, in general, its results are comparatively poor; it is retained as it can sometimes outperform tempo for small factors. ๐
factor determines the change in length: >1 lengthens and <1 shortens. By default, it is 1 (no change) ๐
window is literally just the length of the cross-fading window in milliseconds, and it defaults to 20. that's it, that's the parameter.
fade picks which flavour of crossfading we're doing ๐
โ linear and half-cosine give you equal-gain crossfading and cannot clip, while sqrt and quarter-cosine give you two different kinds of equal-power crossfading. two vibes, pick your fighter โจ
shift is the shift ratio, anywhere from 0 to 1, and its default is lowkey a mood reader: 1 when you're speeding up, 0.8 when you're slowing down ๐ข
fading โ the fading ratio, from 0 to 0.5 โ seems to be how much of each window is cross-faded with the adjacent ones ๐ (yes bestie, the manual really does hedge like that). default depends on factor and shift: 1.0 โ (factor ร shift) if speeding up, 1.0 โ shift if slowing down, capped at 0.5 max.
okay and heads up: the duration of stretch's output is slightly longer than the input duration multiplied by factor, because it has to empty the delay line it uses. tempo is more precise. so if you need exact timing, that's your girl ๐ฏ
๐ swap ๐
Swap stereo channels, periodt ๐
if the input isn't stereo, it swaps pairs of channels and any poor odd last channel just gets passed through untouched. example: for seven channels, the output order will be 2, 1, 4, 3, 6, 5, 7 โจ
also seeremixif you want an effect that lets you do arbitrary channel selection, ordering and mixing โswapis the simple girly,remixis the main character ๐ซถ
๐๏ธ synth ๐
synth [-j key] [-n] [length [offset [phase [p1 [p2 [p3]]]]]]
{type [combine [fixed[,extra[,mix]]]]
[freq[:|+|/|-freq2] [offset [phase [p1 [p2 [p3]]]]]]}
okay so synth generates fixed or swept frequency audio tones with various wave shapes and wide-band noise of various colors ๐๐ Multiple synth effects can be cascaded to produce more complex waveforms, and at each stage you get to choose whether the generated waveform is mixed with or modulated onto the output of the previous stage. and yes โ the audio for each channel in a multichannel audio file can be synthesized independently ๐ง
warning bestie โ it generates audio at maximum volume (0dBFS), which means there is a high chance of clipping ๐ญ so in many cases you'll want to follow it with the gain effect to stop that from happening. (See Clipping above.)
๐ and here's the twist: even though this effect is used to generate audio, an input file must still be given โ its characteristics are used to set the synthesized audio length, the number of channels and the sampling rate. but since the input file's audio isn't normally needed, a null file (with the special input filename -n) is often given instead, and the length gets specified as a parameter to synth or by some other effect that has an associated length โจ
tuning: by default, the tuning used with note notations is equal temperament; the -j key option selects just intonation ๐ผ where key is a whole number of semitones relative to A (so for example, -9 or 3 selects the key of C) or a note in scientific notation. ,SP By default, the synth effect incorporates the functionality of gain -h (see the gain effect for details); synth's -n option may be given to disable this behaviour.
length is the length of audio to synthesize. a value of 0 indicated to use the input length, which is also the default. note that if the input is -n and the length is 0 or absent, it continues generating audio until it is stopped in some other way ๐ณ (iconic honestly, it just won't stop).
type is one of:
๐ sine
A sinusoidal wave is the default type and ignores all the p parameters.
๐ฆ square
A square wave. p1 sets the percentage of each cycle that is on with a default of 50.
|_______ | +1
| | |
|_______|_______| 0
| | |
| |_______| -1
| |
0 p1 1
๐บ triangle
p1 sets the percentage of each cycle that is rising with a default of 50.
| . | +1
| / \ |
|__/___\__| 0
| / \ |
|/ \| -1
| |
0 p1 1
๐ช sawtooth
A sawtooth wave. With a phase of 0 it starts at -1 and rises to 1, and of 10 it starts at -0.9. The offset makes no difference.
| /| +1
| / |
|__/__| 0
| / |
|/ | -1
0 1
๐ท trapezium
The trapezoidal wave starts at -1, rises linearly to 1, stays there, falls linearly to -1, stays there and repeats. p1 sets the percentage of the cycle in which the wave is rising with a default of 10, p2 sets the percentage through each cycle at which falling begins with a default of 50 and p3 sets the percentage through each cycle at which falling ends with a default of 60.
| ______ |+1
| / \ |
|__/________\___________| 0
| / \ |
|/ \_________|-1
| |
0 p1 p2 p3 1
๐ exp
The exponential wave rises from -1 to 1 where it peaks and immediately begins an exponential fall. p1 sets the position of the maximum with a default of 50. p2 sets the minimum amplitude in multiples of 2dB down from the maximum with a default of 50 (100dB); values below 50 raise the shoulders of the wave and values above 50 lower the shoulders, increasing the pointedness of the spike ๐ช
| | +1
| /\ |
| _' `_ | 0
| _- -_ |
|____---' `---____ | f(p2)
| |
0 p1 1
๐ค whitenoise
Random noise with equal power at every frequency. All noise generators ignore the frequency and phase parameters, but if a DC offset is given, the signal's amplitude is automatically adjusted to prevent clipping ๐ก๏ธ so, for noise in the range 0 to 1, an offset of 0.5 would give a signal ranging from 0.0 to 1.0 and -0.9 from -1.0 to -0.8.
noise is a handy alias for whitenoise โจ
๐ tpdfnoise
Noise with a Triangular Probability Density Function.
๐ธ pinknoise
Random noise with the power at each frequency inversely proportional to the frequency.
๐ค brownnoise
Random noise with the power at each frequency inversely proportional to the frequency squared.
๐ธ pluck
A plucked string simulation in which an array of sample values representing a taut string is set in motion with a burst of noise and decayed over time ๐ซถ
A plucked note's frequency can be from 27.5 to 4220Hz and the sampling rate must be between 44100 and 48000Hz ๐
If a DC offset is used, the amplitude is automatically adjusted to prevent clipping.
p1 affects the sustain with a default of 40 (2dB per second); higher values give a slower decay and lower values a faster one.
p2 and p3 are tone controls for the initial excitation, with default values of 20 and 90 and a special case when p3 is exactly 100. If the phase is non-zero, it uses a different kind of random numbers ๐ฒ
If the offset, phase and p parameters are given before the first type, they set the default values for all the following stages ๐ง โจ
combine is one of:
createโ Puts each stage's output in a new output channel and is the default ๐mixโ Mixes the generated audio 50:50 with the input signal ๐คamodโ Amplitude-modulates (multiplies) the input signal by the synthesized one considered as a value from 0 (for the most negative value) to 1 (for the most positive value).fmodโ Multiplies the input signal with the synthesized one (ring modulation) ๐ซvdelayโ Mixes the input signal with a delayed version of it using the synthesized signal to modulate the depth of the delay. The following three-part optionfixed[,extra[,mix]]specifies the fixed and additional parts of the delay in milliseconds and what percentage of the output consists of the delayed signal from 0 for all input signal to 100 for all delayed signal with a default of 50 (half and half) ๐๏ธ
The synthesized signal's value from -1 to +1 varies the delay from fixed seconds to fixed + (0 to extra) seconds.
It interpolates linearly between the input samples and can be used to make precision phaser, flanger and chorus-like effects, vibrato and frequency modulation (FM) synthesis (actually phase modulation, as used in the Yamaha DX7) ๐ฅ๐๏ธ
A chorus-like effect:
sox_ng solo.au -d synth sine vdelay 50,2,50 .25 0 75
A flanger:
sox_ng solo.au -d synth triangle vdelay 0,2,41.52 0.5 0 0
freq and freq2 are the frequencies at the beginning and end of the synthesis and the default frequency is 440Hz ๐ต
If freq2 is given, length must also have been given and the generated tone is swept between the given frequencies. The two given frequencies must be separated by one of the characters :, +, / and -, which specify the sweep function as follows:
:โ Linear: the tone changes by a fixed number of hertz per second ๐+โ Square: a second-order function is used to change the tone./โ Exponential: the tone changes by a fixed number of semitones per second.-โ Exponential: as/, but the initial phase is always zero, and with stepped (less smooth) frequency changes ๐ช
the frequency / frequency range? not a thing for the noise types bestie, they don't use it ๐
offset is the bias (the DC offset) of the signal, in percent โ default is 0.
phase is the phase shift, expressed as a percentage of 1 cycle, defaulting to 0 (and nope, it's not used for noise either ๐).
okay so example time โ this one spits out a 3-second 48kHz audio file with a sine wave sweeping from 300 to 3300Hz:
sox_ng -n output.wav synth 3 sine 300-3300
wanna get โจmultichannelโจ with it? just specify that whole set of parameters between curly braces more than once โ this next one puts the swept tone in the left channel and brown noise in the right:
sox_ng -n output.wav synth 3 sine 300-3300 brownnoise
and here's the glow-up move: cascading two synth effects to build a beefier waveform ๐ซถ
play_ng -n synth 0.5 sine 200-500 synth 0.5 sine fmod 700-100
last one, and it's giving guitarist main character energy ๐ธ this is literally how you tune a guitar:
for n in E2 A2 D3 G3 B3 E4; do
play_ng -n synth 4 pluck $n repeat 2; done
โจ tempo โจ
tempo [-q] [-m|-s|-l] factor [segment(82) [search(14.68) [overlap(12)]]]
This one changes how fast the audio plays without touching its pitch. iconic. It uses the WSOLA (Waveform Similarity OverLap and Add) algorithm โ the audio gets chopped into segments, those segments get shifted around in the time domain, and then they're overlapped (cross-faded) at the points where their waveforms look most similar, which the algorithm figures out by measuring least squares.
By default it does linear searches to hunt down the best overlapping points. But if you pass the optional -q parameter, it uses tree searches instead ๐ณ โ way speedier, though the result might not sound as good. That said: if you gotta speed things up, this generally hurts the sound quality less than shrinking your search or overlap values would. iykyk.
- the
-moption optimizes the default values ofsegment,searchandoverlapfor music processing ๐ถ - the
-soption optimizes the default values ofsegment,searchandoverlapfor speech processing ๐ฃ๏ธ - the
-loption optimizes default values ofsegment,searchandoverlapforlinearprocessing, which tends to cause more noticeable distortion but may be useful whenfactoris close to 1
If -m, -s or -l is specified, the default value of segment is based on factor, while the default search and overlap values are based on segment. And literally any value you provide overrides these defaults, no cap ๐
factor is the ratio of new tempo to old tempo โ so 1.1 speeds the tempo up by 10% and 0.9 slows it down by 10%.
The optional segment parameter picks the algorithm's segment size, in milliseconds. If no other flags are given, the default is 82, which is suited to small changes in the tempo of music. For bigger changes (like a factor of 2, whoa), 41 might give a better result. And the -m, -s, and -l flags make segment's default value auto-adjust itself based on factor, bestie.
The optional search parameter is the audio length, in milliseconds, over which the algorithm searches for overlapping points. With no other flags, the default is 14.68. Bigger values eat more processing time and may or may not produce better results (it's giving gamble ๐) โ a practical maximum is half the value of segment. You can shrink search to cut processing time, at the risk of degrading output quality. The -m, -s and -l flags make the search default auto-adjust based on segment.
The optional overlap parameter is the segment overlap length, in milliseconds. Its default value is 12, but the -m, -s and -l flags automatically adjust it based on the segment size. Increasing overlap increases processing time but may increase quality. A practical maximum for overlap is a little less then search.
go check outspeedfor an effect that changes tempo and pitch together,pitchandbendfor effects that change pitch only, andstretchfor an effect that changes the tempo using a different algorithm ๐ฆ
โจ treble โจ
treble gain [frequency [width[s|h|k|o|q]]]
Apply a treble tone control effect โจ It's the same deal as bass, so just go read the description of the bass effect for the details, bestie ๐
โจ tremolo โจ
tremolo speed [depth]
Slaps a tremolo on your audio โ that's low frequency sinusoidal amplitude modulation, for the record ๐ โ The frequency of the tremolo in Hz is speed and its depth is a percentage, with a default of 40. vibe check: passed.
โจ trim โจ
trim {position(+)}
Cuts out portions of the audio โ๏ธ You can hand it any number of positions; audio is not sent to the output until that first position is reached. After that, the effect alternates between copying and discarding audio at every position. And if you use a value of 0 for the first position parameter, that lets it copy from the very beginning of the audio ๐
For example,
sox_ng in.au out.au trim 0 10
copies the first ten seconds, while
play_ng in.au trim 12:34 =15:00 -2:00
and
play_ng in.au trim 12:34 2:26 -2:00
both play from 12 minutes 34 seconds into the audio up to 15 minutes in (that's 2 minutes and 26 seconds long, do the math bestie ๐งฎ) then resume playing two minutes before the end.
โจ upsample โจ
upsample [factor(2)]
Upsamples the signal by an integer factor: factor-1 zero-valued samples get inserted between each pair of input samples. And as a result? The original spectrum is replicated into the new frequency space and attenuated. You can compensate for that attenuation by adding vol factor. The upsample effect is typically used in combination with filtering effects.
for a general resampling effect with antialiasing, go seerate. Also seedownsample๐ซถ
โจ vad โจ
vad [options]
The Voice Activity Detector ๐ค It attempts to trim silence and quiet background sounds off the ends of speech recordings (fairly high resolution ones, i.e. 16-bit, 44-48kHz). The algorithm currently uses a simple cepstral power measurement to detect voice โ so it may get fooled by other things, especially music ๐ญ And heads up: it can only trim from the front of the audio, so to trim from the back, you gotta also use the reverse effect. E.g.
play_ng speech.wav norm vad
to trim from the front,
play_ng speech.wav norm reverse vad reverse
to trim from the back and
play_ng speech.wav norm vad reverse vad reverse
to trim from both ends. Using the norm effect is recommended ๐ซถ but remember: neither reverse nor norm is suitable for use with streamed audio!
Options
Default values are shown in parentheses, the allowed range in square brackets โจ
-t num(7) [0 - 20] โ the measurement level used to trigger activity detection. You might need to change this depending on the noise level, signal level and other characteristics of the input audio.-T num(0.25) [0.01 - 1] โ the time constant (in seconds) used to help ignore short bursts of sound.-s num(1) [0.1 - 4] โ how much audio (in seconds) to search for quieter/shorter bursts of audio to include prior to the detected trigger point.-g num(0.25) [0.1 - 1] โ allowed gap (in seconds) between quieter/shorter bursts of audio to include prior to the detected trigger point.-p num(0) [0 - 4] โ how much audio (in seconds) to preserve before the trigger point and any found quieter/shorter bursts.
Advanced Options
These bad boys allow fine tuning of the algorithm's internal parameters ๐
-b num(0.35) [0.1 - 10] โ the algorithm uses adaptive noise estimation/reduction in order to detect the start of the wanted audio. This option sets the time in seconds for the initial noise estimate.-N num(0.1) [0.1 - 10] โ time constant used by the adaptive noise estimator when the noise level is increasing.-n num(0.01) [0.001 - 0.1] โ time constant used by the adaptive noise estimator when the noise level is decreasing.-r num(1.35) [0 - 2] โ how much noise reduction to use in the detection algorithm.-f num(20) [5 - 50] โ frequency of the algorithm's processing/measurements.-m num(0.1) [0.01 - 1] โ measurement duration. By default it's twice the measurement period, i.e. with 50% overlap โ but if you set-f, you also need to change-mto 2 divided by its value to keep that 50% overlap. math is math ๐-M num(0.4) [0-1 - 1] โ time constant used to smooth spectral measurements.-h freq(50) [10 -] โBrick-wallfrequency of the high-pass filter applied at the detector algorithm's input.-l freq(6000) [1000 -] โBrick-wallfrequency of the low-pass filter applied at the detector algorithm's input.-H freq(150) [10 -] โBrick-wallfrequency of the high-pass lifter used in the detector algorithm.-L freq(2000) [1000 -] โBrick-wallfrequency of the low-pass lifter used in the detector algorithm.
also go see the silence effect ๐
โจ vol โจ
vol gain [type [limiter-gain]]
Applies amplification or attenuation to the audio signal ๐ And here's the tea: unlike -v, which is used for balancing multiple input files as they enter the SoX effects processing chain, vol is an effect like any other โ so it can be applied anywhere in the processing chain, and several times if you need it ๐
The amount to change the volume is given by gain, which is interpreted, according to the given type, like this: if type is amplitude (or is omitted), gain is an amplitude ratio (voltage or linear); if power, a power ratio (wattage or voltage squared); and if dB, a power change in dB.
When type is amplitude or power, a gain of 1 = volume stays exactly where it is, less than 1 turns it down, and more than 1 turns it up โ and a negative gain flips the audio signal's polarity and changes the volume at the same time, bestie.
When type is dB, it's a whole different math: a gain of 0 changes literally nothing, less than 0 decreases the volume, and greater than 0 increases it. โจ
Peep [4] if you want the full tea on electrical (and therefore audio signal) voltage vs. power ratios. ๐
โ ๏ธ Beware of Clipping when you're increasing the volume. Not a drill, bestie, your peaks will get squished and it will sound crunchy in the bad way. ๐
The gain and the type parameters can be smooshed together if you feel like it, e.g. vol 10dB. Concatenation rights! ๐
There's an optional limiter-gain value you can hand over, and it should be a value much less than 1 (like, 0.05 or 0.02 energy) โ it only kicks in on peaks to stop clipping. Don't pass it and no limiter gets used, periodt. And in verbose mode, this effect spills the percentage of the audio that needed limiting, which is lowkey addictive to watch. ๐
Also go look at gain if you want a volume-changing effect with different capabilities, and compand for a dynamic range compression/expansion/limiting situation. ๐
๐ฟ ENVIRONMENT ๐ฟ
SoX reacts to the following environment variables. To set them on Unix with most shells, use, for example:
AUDIODRIVER=oss
export AUDIODRIVER
play_ng ...
with Unix csh:
setenv AUDIODRIVER oss
or, on Microsoft Windows:
set AUDIODRIVER=waveaudio
MS-Windows GUI: via Control Panel : System : Advanced : Environment Variables
Mac OS X GUI: Refer to Apple's Technical Q&A QA1067 document.
AUDIODRIVERโ On some systems, SoX may have more than one type of audio driver, e.g. ALSA and OSS or SUNAU and AO, and they can have more than one audio device (a.k.a. ``sound card''). If more than one audio driver has been built into SoX and the default that SoX picked when recording or playing is not the one you want, theAUDIODRIVERenvironment variable can override that default. For example, on Unix systems:
AUDIODRIVER=oss
export AUDIODRIVER
play_ng ...
If it's unset, SoX tries to use, in order, coreaudio, pulseaudio, alsa, waveaudio, sndio, oss, sunau and ao. For further deets on these, see their entries in soxformat_ng(7). ๐
AUDIODEVโ Override the default audio device, e.g.
AUDIODEV=/dev/dsp2
export AUDIODEV
play_ng ...
sox_ng ... -t oss
or
AUDIODEV=hw:soundwave,1,2
export AUDIODEV
play_ng ...
sox_ng ... -t alsa
If AUDIODEV is unset and the audio driver is oss, SoX also responds to the standard environment variable OSS_AUDIODEV. ๐ฆ
LADSPA_PATHโ A colon-separated list of directories to search for LADSPA plugins in. The default depends on how SoX was built, but on Unix it defaults to/usr/lib/ladspa, on MacOS/X to/Library/Audio/Plug-Ins/LADSPA. Windows doesn't have a "usual place" for LADSPA plugins, but Ardour puts them inC:\Program Files\Ardour6\lib\ardour6\ladspaor similar. ๐LD_LIBRARY_PATHโ When searching for the dynamic libraries in which most effects and format handlers may be stored, according to how your SoX was built, SoX looks in this colon-separated list of directories before the default location. ๐MIXERDEVโ When playing a file, use the specified mixer device for the'v'and'V'volume control keys.SOX_OPTSโ Provide alternative default values for SoX's global options. For example:
SOX_OPTS="--buffer 20000 --play-rate-arg -hs --temp /mnt/temp"
export SOX_OPTS
Heads up though: setting SOX_OPTS can create unwanted changes in the behaviour of scripts or other programs that invoke SoX. SOX_OPTS might best be used for things that reflect the environment in which SoX is being run, and enabling options such as --no-clobber by default might be handled better using a shell alias, since that will not affect SoX's operation in scripts or when it is used by other programs. Think before you export, bestie. ๐
One way to ensure that scripts and programs cannot be affected by SOX_OPTS is to clear SOX_OPTS at the start of the script โ but this loses the benefit of SOX_OPTS carrying system-wide defaults. Pick your struggle. ๐ญ
TEMPandTMPโ On Windows,tmpfile()is broken โ it creates the file in the root directory of the current drive instead of in a valid temporary directory โ but ifTEMPorTMPare set, it creates them in the directory indicated, otherwise in the current directory. To force use oftmpfile(), use--temp .
Alternatively, and on Unix, use --temp (see Global Options above). ๐ธ
๐ช EXIT STATUS ๐ช
SoX exits 0 when there is no error, 1 if there's a problem with the command-line parameters, or 2 if an error occurs during audio processing. Three vibes, three numbers, no surprises. ๐
๐ BUGS ๐
Please report any bugs found in this version of SoX to the mailing list <sox-ng@groups.io>. We love a bug report, fr fr. ๐ซถ
๐ CITATION ๐
To cite SoX in publications please use:
Lance Norskog, Chris Bagwell et al. (2015).
SoX: Sound eXchange, the Swiss Army knife of audio manipulation.
URL http://sox.sourceforge.net
A BibTeX entry for SoX users is
@manual{SoX2015,
title = "SoX: Sound eXchange, the Swiss Army knife of audio manipulation",
author = "Norskog, Lance and Bagwell, Chris and others",
edition = "14.4.2",
year = 2015,
url = "http://sox.sourceforge.net",
}
๐ SEE ALSO ๐
soxi_ng(1), soxformat_ng(7), libsox_ng(3) audacity(1), ecasound(1), gnuplot(1), octave(1).
The sox_ng web site at https://codeberg.org/sox_ng/sox_ng
SoX scripting examples at https://codeberg.org/sox_ng/sox_ng/src/branch/main/scripts
๐ References ๐
- R. Bristow-Johnson, Cookbook formulae for audio EQ biquad filter coefficients,
https://www.w3.org/TR/audio-eq-cookbook - Wikipedia, Q-factor,
http://en.wikipedia.org/wiki/Q_factor - Scott Lehman, Effects Explained,
https://codeberg.org/sox_ng/Effects-Explained - Wikipedia, Decibel,
http://en.wikipedia.org/wiki/Decibel - Richard Furse, Linux Audio Developer's Simple Plugin API,
http://www.ladspa.org - Richard Furse, Computer Music Toolkit,
http://www.ladspa.org/cmt/overview.html - Steve Harris, LADSPA plugins,
http://plugin.org.uk
โ๏ธ LICENSE โ๏ธ
Copyright 1998-2013 Chris Bagwell and SoX Contributors.
Copyright 1991 Lance Norskog and Sundry Contributors.
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
Okay that one's the legal text and it means what it means โ I'm not paraphrasing a license, bestie, that's how you get in trouble. ๐
๐ AUTHORS ๐
Lance Norskog, Chris Bagwell and many others listed in the AUTHORS file that is distributed with the source code.
And that's the whole page, bestie!! ๐ Every flag, every variable, every exit code, every reference โ all of it, preserved and slaying. โจ
This was sox_ng (the SoX(1) manual page) dated December 05, 2024. Screenshot it, cite it, cite the authors, go make something loud. ๐
okay bye now, go run it ๐๐ ๐ฅ
๐ฆ where this page comes from
- nixos 26.05: sox 14.7.1.2
- ubuntu stonking: sox 14.7.1.2+ds1-1 ยท GPL-2.0-or-later
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms