ref: 39fa45a7edd0a05898bec9ac9eae80e5e18013d7
parent: 22a16468c8b39d1333d4489432a2e010883d3aa2
author: cbagwell <cbagwell>
date: Wed Sep 29 12:23:49 EDT 1999
Adding compander effect, fixing record problem in script, causing SoX to not overwrite existing files.
--- a/Changelog
+++ b/Changelog
@@ -4,6 +4,14 @@
This file contains a list of all changes starting after the release of
sox-11gamma.
+sox-12.17
+---------
+ o Added AVR handler from Jan Paul Schmidt.
+ o SoX will no longer write to files that exists. This will keep
+ it from deleting files when a user mistakenly types "sox *.wav".
+ o Added new compander effect from Nick Bailey. Nice general purpose
+ filter.
+
sox-12.16
---------
--- a/Makefile.ami
+++ b/Makefile.ami
@@ -20,8 +20,8 @@
g721.c g723_24.c g723_40.c g72x.c gsm.c hcom.c maud.c oss.c raw.c \
sbdsp.c sf.c smp.c sndrtool.c sunaudio.c tx16w.c voc.c wav.c wve.c
-ESRC = avg.c band.c chorus.c copy.c cut.c deemphas.c dyn.c echo.c echos.c \
- flanger.c highp.c lowp.c map.c mask.c phaser.c pick.c \
+ESRC = avg.c band.c chorus.c compandc copy.c cut.c deemphas.c dyn.c echo.c \
+ echos.c flanger.c highp.c lowp.c map.c mask.c phaser.c pick.c \
polyphas.c rate.c resample.c reverb.c reverse.c split.c \
stat.c swap.c vibro.c
@@ -53,8 +53,8 @@
g721.o g723_24.o g723_40.o g72x.o gsm.o hcom.o maud.o oss.o raw.o \
sbdsp.o sf.o smp.o sndrtool.o sunaudio.o tx16w.o voc.o wav.o wve.o
-EOBJ = avg.o band.o chorus.o copy.o cut.o deemphas.o dyn.o echo.o echos.o \
- flanger.o highp.o lowp.o map.o mask.o phaser.o pick.o \
+EOBJ = avg.o band.o chorus.o compand.o copy.o cut.o deemphas.o dyn.o echo.o \
+ echos.o flanger.o highp.o lowp.o map.o mask.o phaser.o pick.o \
polyphas.o rate.o resample.o reverb.o reverse.o split.o \
stat.o swap.o vibro.o
--- a/Makefile.dos
+++ b/Makefile.dos
@@ -15,9 +15,9 @@
hcom.obj maud.obj oss.obj raw.obj sbdsp.obj sf.obj smp.obj \
sndrtool.obj sunaudio.obj tx16w.obj voc.obj wav.obj wve.obj
-EOBJ = avg.obj band.obj chorus.obj copy.obj cut.obj deemphas.obj \
- dyn.obj echo.obj echos.obj flanger.obj highp.obj lowp.obj \
- map.obj mask.obj phaser.obj pick.obj polyphas.obj \
+EOBJ = avg.obj band.obj chorus.obj compand.obj copy.obj cut.obj \
+ deemphas.obj dyn.obj echo.obj echos.obj flanger.obj highp.obj \
+ lowp.obj map.obj mask.obj phaser.obj pick.obj polyphas.obj \
rate.obj resample.obj reverb.obj reverse.obj split.obj \
stat.obj swap.obj vibro.obj
--- a/Makefile.os9
+++ b/Makefile.os9
@@ -22,10 +22,10 @@
$(RDIR)/tx16w.r $(RDIR)/voc.r $(RDIR)/wav.r $(RDIR)/wve.r
EOBJ = $(RDIR)/avg.r $(RDIR)/band.r $(RDIR)/chorus.r \
- $(RDIR)/copy.r $(RDIR)/cut.r $(RDIR)/deemphas.r $(RDIR)/dyn.r \
- $(RDIR)/echo.r $(RDIR)/echos.r $(RDIR)/flanger.r $(RDIR)/highp.r \
- $(RDIR)/lowp.r $(RDIR)/map.r $(RDIR)/mask.r $(RDIR)/phaser.r \
- $(RDIR)/pick.r $(RDIR)/polyphas.r $(RDIR)/rate.r \
+ $(RDIR)/copy.r $(RDIR)/comand.r $(RDIR)/cut.r $(RDIR)/deemphas.r \
+ $(RDIR)/dyn.r $(RDIR)/echo.r $(RDIR)/echos.r $(RDIR)/flanger.r \
+ $(RDIR)/highp.r $(RDIR)/lowp.r $(RDIR)/map.r $(RDIR)/mask.r \
+ $(RDIR)/phaser.r $(RDIR)/pick.r $(RDIR)/polyphas.r $(RDIR)/rate.r \
$(RDIR)/resample.r $(RDIR)/reverb.r $(RDIR)/reverse.r \
$(RDIR)/split.r $(RDIR)/stat.r $(RDIR)/swap.r $(RDIR)/vibro.r
--- a/Makefile.unx
+++ b/Makefile.unx
@@ -22,6 +22,7 @@
BINDIR = $(PREFIX)/bin
LIBDIR = $(PREFIX)/lib
MANDIR = $(PREFIX)/man
+INCDIR = $(PREFIX)/include
SRCDIR = sox-12.16
@@ -31,8 +32,8 @@
g721.c g723_24.c g723_40.c g72x.c gsm.c hcom.c maud.c oss.c raw.c \
sbdsp.c sf.c smp.c sndrtool.c sunaudio.c tx16w.c voc.c wav.c wve.c
-ESRC = avg.c band.c chorus.c copy.c cut.c deemphas.c dyn.c echo.c echos.c \
- flanger.c highp.c lowp.c map.c mask.c phaser.c pick.c \
+ESRC = avg.c band.c chorus.c compand.c copy.c cut.c deemphas.c dyn.c echo.c \
+ echos.c flanger.c highp.c lowp.c map.c mask.c phaser.c pick.c \
polyphas.c rate.c resample.c reverb.c reverse.c split.c \
stat.c swap.c vibro.c
@@ -72,8 +73,8 @@
g721.o g723_24.o g723_40.o g72x.o gsm.o hcom.o maud.o oss.o raw.o \
sbdsp.o sf.o smp.o sndrtool.o sunaudio.o tx16w.o voc.o wav.o wve.o
-EOBJ = avg.o band.o chorus.o copy.o cut.o deemphas.o dyn.o echo.o echos.o \
- flanger.o highp.o lowp.o map.o mask.o phaser.o pick.o \
+EOBJ = avg.o band.o chorus.o compand.o copy.o cut.o deemphas.o dyn.o echo.o \
+ echos.o flanger.o highp.o lowp.o map.o mask.o phaser.o pick.o \
polyphas.o rate.o resample.o reverb.o reverse.o split.o \
stat.o swap.o vibro.o
@@ -261,6 +262,7 @@
install-lib: libst.a
install -c -m 644 libst.a $(LIBDIR)
install -c -m 644 libst.3 $(MANDIR)/man3
+ install -c -m 644 st.h $(INCDIR)
clean:
$(RM) *~ *.o *.raw *.sf core sox libst.a
--- a/libst.txt
+++ b/libst.txt
@@ -1,213 +1,212 @@
-ST(3) ST(3)
+C Library Functions ST(3)
+
NAME
- libst - Sound Tools : sound sample file and effects
- libraries.
+ libst - Sound Tools : sound sample file and effects
+ libraries.
SYNOPSIS
- cc file.c -o file libst.a
+ cc file.c -o file libst.a
DESCRIPTION
- Sound Tools is a library of sound sample file format read-
- ers/writers and sound effects processors.
+ Sound Tools is a library of sound sample file format
+ readers/writers and sound effects processors.
- Sound Tools includes skeleton C files to assist you in
- writing new formats and effects. The full skeleton
- driver, skel.c, helps you write drivers for a new format
- which has data structures. The simple skeleton drivers
- help you write a new driver for raw (headerless) formats,
- or for formats which just have a simple header followed by
- raw data.
+ Sound Tools includes skeleton C files to assist you in writ-
+ ing new formats and effects. The full skeleton driver,
+ skel.c, helps you write drivers for a new format which has
+ data structures. The simple skeleton drivers help you write
+ a new driver for raw (headerless) formats, or for formats
+ which just have a simple header followed by raw data.
- Most sound sample formats are fairly simple: they are just
- a string of bytes or words and are presumed to be sampled
- at a known data rate. Most of them have a short data
- structure at the beginning of the file.
+ Most sound sample formats are fairly simple: they are just a
+ string of bytes or words and are presumed to be sampled at a
+ known data rate. Most of them have a short data structure
+ at the beginning of the file.
INTERNALS
- The Sound Tools formats and effects operate on an internal
- buffer format of signed 32-bit longs. The data processing
- routines are called with buffers of these samples, and
- buffer sizes which refer to the number of samples pro-
- cessed, not the number of bytes. File readers translate
- the input samples to signed longs and return the number of
- longs read. For example, data in linear signed byte for-
- mat is left-shifted 24 bits.
+ The Sound Tools formats and effects operate on an internal
+ buffer format of signed 32-bit longs. The data processing
+ routines are called with buffers of these samples, and
+ buffer sizes which refer to the number of samples processed,
+ not the number of bytes. File readers translate the input
+ samples to signed longs and return the number of longs read.
+ For example, data in linear signed byte format is left-
+ shifted 24 bits.
- This does cause problems in processing the data. For
- example:
- *obuf++ = (*ibuf++ + *ibuf++)/2;
- would not mix down left and right channels into one mono-
- phonic channel, because the resulting samples would over-
- flow 32 bits. Instead, the ``avg'' effects must use:
- *obuf++ = *ibuf++/2 + *ibuf++/2;
+ This does cause problems in processing the data. For exam-
+ ple:
+ *obuf++ = (*ibuf++ + *ibuf++)/2;
+ would not mix down left and right channels into one mono-
+ phonic channel, because the resulting samples would overflow
+ 32 bits. Instead, the ``avg'' effects must use:
+ *obuf++ = *ibuf++/2 + *ibuf++/2;
- Stereo data is stored with the left and right speaker data
- in successive samples. Quadraphonic data is stored in
- this order: left front, right front, left rear, right
- rear.
+ Stereo data is stored with the left and right speaker data
+ in successive samples. Quadraphonic data is stored in this
+ order: left front, right front, left rear, right rear.
FORMATS
- A format is responsible for translating between sound sam-
- ple files and an internal buffer. The internal buffer is
- store in signed longs with a fixed sampling rate. The
- format operates from two data structures: a format struc-
- ture, and a private structure.
+ A format is responsible for translating between sound sample
+ files and an internal buffer. The internal buffer is store
+ in signed longs with a fixed sampling rate. The format
+ operates from two data structures: a format structure, and
+ a private structure.
- October 15 1996 1
+SunOS 5.6 Last change: October 15 1996 1
-ST(3) ST(3)
+C Library Functions ST(3)
- The format structure contains a list of control parameters
- for the sample: sampling rate, data size (bytes, words,
- floats, etc.), style (unsigned, signed, logarithmic), num-
- ber of sound channels. It also contains other state
- information: whether the sample file needs to be byte-
- swapped, whether fseek() will work, its suffix, its file
- stream pointer, its format pointer, and the private struc-
- ture for the format .
- The private area is just a preallocated data array for the
- format to use however it wishes. It should have a defined
- data structure and cast the array to that structure. See
- voc.c for the use of a private data area. Voc.c has to
- track the number of samples it writes and when finishing,
- seek back to the beginning of the file and write it out.
- The private area is not very large. The ``echo'' effect
- has to malloc() a much larger area for its delay line
- buffers.
- A format has 6 routines:
+ The format structure contains a list of control parameters
+ for the sample: sampling rate, data size (bytes, words,
+ floats, etc.), style (unsigned, signed, logarithmic), number
+ of sound channels. It also contains other state informa-
+ tion: whether the sample file needs to be byte-swapped,
+ whether fseek() will work, its suffix, its file stream
+ pointer, its format pointer, and the private structure for
+ the format .
- startread Set up the format parameters, or read
- in a data header, or do what needs to
- be done.
+ The private area is just a preallocated data array for the
+ format to use however it wishes. It should have a defined
+ data structure and cast the array to that structure. See
+ voc.c for the use of a private data area. Voc.c has to track
+ the number of samples it writes and when finishing, seek
+ back to the beginning of the file and write it out. The
+ private area is not very large. The ``echo'' effect has to
+ malloc() a much larger area for its delay line buffers.
- read Given a buffer and a length: read up
- to that many samples, transform them
- into signed long integers, and copy
- them into the buffer. Return the num-
- ber of samples actually read.
+ A format has 6 routines:
- stopread Do what needs to be done.
+ startread Set up the format parameters, or read in
+ a data header, or do what needs to be
+ done.
- startwrite Set up the format parameters, or write
- out a data header, or do what needs to
- be done.
+ read Given a buffer and a length: read up to
+ that many samples, transform them into
+ signed long integers, and copy them into
+ the buffer. Return the number of sam-
+ ples actually read.
- write Given a buffer and a length: copy that
- many samples out of the buffer, con-
- vert them from signed longs to the
- appropriate data, and write them to
- the file. If it can't write out all
- the samples, fail.
+ stopread Do what needs to be done.
- stopwrite Fix up any file header, or do what
- needs to be done.
+ startwrite Set up the format parameters, or write
+ out a data header, or do what needs to
+ be done.
+ write Given a buffer and a length: copy that
+ many samples out of the buffer, convert
+ them from signed longs to the appropri-
+ ate data, and write them to the file.
+ If it can't write out all the samples,
+ fail.
+
+ stopwrite Fix up any file header, or do what needs
+ to be done.
+
EFFECTS
- An effects loop has one input and one output stream. It
- has 5 routines.
+ An effects loop has one input and one output stream. It has
+ 5 routines.
- getopts is called with a character string
- argument list for the effect.
+ getopts is called with a character string argu-
+ ment list for the effect.
+SunOS 5.6 Last change: October 15 1996 2
- October 15 1996 2
-ST(3) ST(3)
+C Library Functions ST(3)
- start is called with the signal parameters
- for the input and output streams.
- flow is called with input and output data
- buffers, and (by reference) the input
- and output data sizes. It processes
- the input buffer into the output
- buffer, and sets the size variables to
- the numbers of samples actually pro-
- cessed. It is under no obligation to
- fill the output buffer.
+ start is called with the signal parameters for
+ the input and output streams.
- drain is called after there are no more
- input data samples. If the effect
- wishes to generate more data samples
- it copies the generated data into a
- given buffer and returns the number of
- samples generated. If it fills the
- buffer, it will be called again, etc.
- The echo effect uses this to fade
- away.
+ flow is called with input and output data
+ buffers, and (by reference) the input
+ and output data sizes. It processes the
+ input buffer into the output buffer, and
+ sets the size variables to the numbers
+ of samples actually processed. It is
+ under no obligation to fill the output
+ buffer.
- stop is called when there are no more input
- samples to process. stop may generate
- output samples on its own. See echo.c
- for how to do this, and see that what
- it does is absolutely bogus.
+ drain is called after there are no more input
+ data samples. If the effect wishes to
+ generate more data samples it copies the
+ generated data into a given buffer and
+ returns the number of samples generated.
+ If it fills the buffer, it will be
+ called again, etc. The echo effect uses
+ this to fade away.
+ stop is called when there are no more input
+ samples to process. stop may generate
+ output samples on its own. See echo.c
+ for how to do this, and see that what it
+ does is absolutely bogus.
+
COMMENTS
- Theoretically, formats can be used to manipulate several
- files inside one program. Multi-sample files, for example
- the download for a sampling keyboard, can be handled
- cleanly with this feature.
+ Theoretically, formats can be used to manipulate several
+ files inside one program. Multi-sample files, for example
+ the download for a sampling keyboard, can be handled cleanly
+ with this feature.
PORTABILITY PROBLEMS
- Many computers don't supply arithmetic shifting, so do
- multiplies and divides instead of << and >>. The compiler
- will do the right thing if the CPU supplies arithmetic
- shifting.
+ Many computers don't supply arithmetic shifting, so do mul-
+ tiplies and divides instead of << and >>. The compiler will
+ do the right thing if the CPU supplies arithmetic shifting.
- Do all arithmetic conversions one stage at a time. I've
- had too many problems with "obviously clean" combinations.
+ Do all arithmetic conversions one stage at a time. I've had
+ too many problems with "obviously clean" combinations.
- In general, don't worry about "efficiency". The sox.c
- base translator is disk-bound on any machine (other than a
- 8088 PC with an SMD disk controller). Just comment your
- code and make sure it's clean and simple. You'll find
- that DSP code is extremely painful to write as it is.
+ In general, don't worry about "efficiency". The sox.c base
+ translator is disk-bound on any machine (other than a 8088
+ PC with an SMD disk controller). Just comment your code and
+ make sure it's clean and simple. You'll find that DSP code
+ is extremely painful to write as it is.
BUGS
- The HCOM format is not re-entrant; it can only be used
- once in a program.
+ The HCOM format is not re-entrant; it can only be used once
+ in a program.
- The program/library interface is pretty weak. There's too
- October 15 1996 3
+SunOS 5.6 Last change: October 15 1996 3
-ST(3) ST(3)
- much ad-hoc information which a program is supposed to
- gather up. Sound Tools wants to be an object-oriented
- dataflow architecture.
+C Library Functions ST(3)
+ The program/library interface is pretty weak. There's too
+ much ad-hoc information which a program is supposed to
+ gather up. Sound Tools wants to be an object-oriented
+ dataflow architecture.
@@ -259,6 +258,7 @@
- October 15 1996 4
+SunOS 5.6 Last change: October 15 1996 4
+
--- a/play
+++ b/play
@@ -106,10 +106,10 @@
;;
-t)
shift
- fopts="$fopts -t $1"
+ fopts2="$fopts -t $1"
;;
--type=*)
- fopts="$fopts -t `echo $1 | sed 's/.*=//'`"
+ fopts2="$fopts -t `echo $1 | sed 's/.*=//'`"
;;
-v)
shift
@@ -184,8 +184,15 @@
# If name is "rec" then record else assume user is wanting to play
# a sound file.
if [ "$program_name" = "rec" ]; then
- echo "Send break (control-c) to end recording"
- sox $volume $arch_defines $fopts $device "$filename" $effects
+
+ # Don't send data to stdout if they are reading from it.
+ if [ "$filename" = "-" ]; then
+ echo "Send break (control-c) to end recording" 1>&2
+ else
+ echo "Send break (control-c) to end recording"
+ fi
+ sox $volume $arch_defines $fopts $device $fopts2 "$filename" $effects
+
else
- sox $volume $fopts "$filename" $arch_defines $device $effects
+ sox $volume $fopts $fopts2 "$filename" $arch_defines $device $effects
fi
--- a/sox.1
+++ b/sox.1
@@ -55,6 +55,10 @@
chorus \fIgain-in gain out delay decay speed depth
-s\fB | \fI-t\fB [ \fIdelay decay speed depth -s\fB | -fI-t\fB ]
.br
+ compand \fIattack1,decay1\fB[,\fIattack2,decay2\fB...]
+ \fIin-dB1,out-dB1\fB[,\fIin-dB2,out-dB2\fB...]
+ [\fIgain\fB] [\fIinitial-volume\fB]
+.br
copy
.br
cut
@@ -503,6 +507,33 @@
speed in Hz using depth in milliseconds.
The modulation is either sinodial (-s) or triangular
(-t). Gain-out is the volume of the output.
+.TP
+compand \fIattack1,decay1\fR[,\fIattack2,decay2\fR...]
+.TP
+ \fIin-dB1,out-dB1\fR[,\fIin-dB2,out-dB2\fR...]
+.TP 10
+ [\fIgain\fR] [\fIinitial-volume\fR]
+Compand (compress or expand) the dynamic range of a sample. The
+attack and decay time specify the integration time over which the
+absolute value of the input signal is integrated to determine its
+volume. Where more than one pair of attack/decay parameters are
+specified, each channel is treated separately and the number of pairs
+must agree with the number of input channels. The second parameter is
+a list of points on the compander's transfer function specified in dB
+relative to the maximum possible signal amplitude. The input values
+must be in a strictly increasing order but the transfer function does
+not have to be monotonically rising. The special value \fI-inf\fR may
+be used to indicate that the input volume should be associated output
+volume. The points \fI-inf,-inf\fR and \fI0,0\fR are assumed; the
+latter may be overridden, but the former may not. The third
+(optional) parameter is a postprocessing gain in dB which is applied
+after the compression has taken place; the fourth (optional) parameter
+is an initial volume to be assumed for each channel when the effect
+starts. This permits the user to supply a nominal level initially, so
+that, for example, a very large gain is not applied to initial signal
+levels before the companding action has begun to operate: it is quite
+probable that in such an event, the output would be severely clipped
+while the compander gain properly adjusts itself.
.TP 10
copy
Copy the input file to the output file.
--- a/sox.txt
+++ b/sox.txt
@@ -1,752 +1,807 @@
-SoX(1) SoX(1)
+User Commands SoX(1)
+
NAME
- sox - Sound eXchange : universal sound sample translator
+ sox - Sound eXchange : universal sound sample translator
SYNOPSIS
- sox infile outfile
- sox infile outfile [ effect [ effect options ... ] ]
- sox infile -e effect [ effect options ... ]
- sox [ general options ] [ format options ] ifile [ for-
- mat options ] ofile [ effect [ effect options ... ] ]
+ sox infile outfile
+ sox infile outfile [ effect [ effect options ... ] ]
+ sox infile -e effect [ effect options ... ]
+ sox [ general options ] [ format options ] ifile [ format
+ options ] ofile [ effect [ effect options ... ] ]
- General options: [ -e ] [ -h ] [ -p ] [ -v volume ] [ -V ]
+ General options: [ -e ] [ -h ] [ -p ] [ -v volume ] [ -V ]
- Format options: [ -t filetype ] [ -r rate ] [
- -s/-u/-U/-A/-a/-g ] [ -b/-w/-l/-f/-d/-D ] [ -c channels ]
- [ -x ]
+ Format options: [ -t filetype ] [ -r rate ] [ -s/-u/-U/-
+ A/-a/-g ] [ -b/-w/-l/-f/-d/-D ] [ -c channels ] [ -x ]
- Effects:
- avg [ -l | -r ]
- band [ -n ] center [ width ]
- check
- chorus gain-in gain out delay decay speed depth
- -s | -t [ delay decay speed depth -s | -fI-t ]
- copy
- cut
- deemph
- echo gain-in gain-out delay decay [ delay decay ...]
- echos gain-in gain-out delay decay [ delay decay ...]
- flanger gain-in gain-out delay decay speed -s | -fI-t
- highp center
- lowp center
- map
- mask
- phaser gain-in gain-out delay decay speed -s | -t
- pick
- polyphase [ -w < num / ham > ]
- [ -width < long / short / # > ]
- [ -cutoff # ]
- rate
- resample
- reverb gain-out reverb-time delay [ delay ... ]
- reverse
- split
- stat [ debug | -v ]
- swap [ 1 2 3 4 ]
- vibro speed [ depth ]
+ Effects:
+ avg [ -l | -r ]
+ band [ -n ] center [ width ]
+ check
+ chorus gain-in gain out delay decay speed depth
+ -s | -t [ delay decay speed depth -s | -fI-t ]
+ compand attack1,decay1[,attack2,decay2...]
+ in-dB1,out-dB1[,in-dB2,out-dB2...]
+ [gain] [initial-volume]
+ copy
+ cut
+ deemph
+ echo gain-in gain-out delay decay [ delay decay ...]
+ echos gain-in gain-out delay decay [ delay decay ...]
+ flanger gain-in gain-out delay decay speed -s | -fI-t
+ highp center
+ lowp center
+ map
+ mask
+ phaser gain-in gain-out delay decay speed -s | -t
+ pick
+ polyphase [ -w < num / ham > ]
+ [ -width < long / short / # > ]
+ [ -cutoff # ]
+ rate
+ resample
+ reverb gain-out reverb-time delay [ delay ... ]
+ reverse
+ split
+ stat [ debug | -v ]
+ swap [ 1 2 3 4 ]
+ vibro speed [ depth ]
DESCRIPTION
- Sox translates sound files from one format to another,
- possibly doing a sound effect.
+ Sox translates sound files from one format to another, pos-
+ sibly doing a sound effect.
-OPTIONS
- The option syntax is a little grotty, but in essence:
- sox file.au file.voc
- translates a sound sample in SUN Sparc .AU format into a
- June 28, 1999 1
+SunOS 5.6 Last change: June 28, 1999 1
-SoX(1) SoX(1)
+User Commands SoX(1)
- SoundBlaster .VOC file, while
- sox -v 0.5 file.au -r 12000 file.voc rate
- does the same format translation but also lowers the
- amplitude by 1/2 and changes the sampling rate from 8000
- hertz to 12000 hertz via the rate sound effect loop.
- File type options:
- -t filetype
- gives the type of the sound sample file.
+OPTIONS
+ The option syntax is a little grotty, but in essence:
+ sox file.au file.voc
+ translates a sound sample in SUN Sparc .AU format into a
+ SoundBlaster .VOC file, while
+ sox -v 0.5 file.au -r 12000 file.voc rate
+ does the same format translation but also lowers the ampli-
+ tude by 1/2 and changes the sampling rate from 8000 hertz to
+ 12000 hertz via the rate sound effect loop.
- -r rate Give sample rate in Hertz of file.
+ File type options:
- -s/-u/-U/-A/-a/-g
- The sample data is signed linear (2's comple-
- ment), unsigned linear, U-law (logarithmic), A-
- law (logarithmic), ADPCM, or GSM. U-law and A-
- law are the U.S. and international standards for
- logarithmic telephone sound compression. ADPCM
- is form of sound compression that has a good
- compromise between good sound quality and fast
- encoding/decoding time. GSM is a standard used
- for telephone sound compression in European
- countries and its gaining popularity because of
- its quality.
+ -t filetype
+ gives the type of the sound sample file.
- -b/-w/-l/-f/-d/-D
- The sample data is in bytes, 16-bit words,
- 32-bit longwords, 32-bit floats, 64-bit double
- floats, or 80-bit IEEE floats. Floats and dou-
- ble floats are in native machine format.
+ -r rate Give sample rate in Hertz of file.
- -x The sample data is in XINU format; that is, it
- comes from a machine with the opposite word
- order than yours and must be swapped according
- to the word-size given above. Only 16-bit and
- 32-bit integer data may be swapped. Machine-
- format floating-point data is not portable.
- IEEE floats are a fixed, portable format. ???
+ -s/-u/-U/-A/-a/-g
+ The sample data is signed linear (2's complement),
+ unsigned linear, U-law (logarithmic), A-law (loga-
+ rithmic), ADPCM, or GSM. U-law and A-law are the
+ U.S. and international standards for logarithmic
+ telephone sound compression. ADPCM is form of
+ sound compression that has a good compromise
+ between good sound quality and fast
+ encoding/decoding time. GSM is a standard used
+ for telephone sound compression in European coun-
+ tries and its gaining popularity because of its
+ quality.
- -c channels
- The number of sound channels in the data file.
- This may be 1, 2, or 4; for mono, stereo, or
- quad sound data.
+ -b/-w/-l/-f/-d/-D
+ The sample data is in bytes, 16-bit words, 32-bit
+ longwords, 32-bit floats, 64-bit double floats, or
+ 80-bit IEEE floats. Floats and double floats are
+ in native machine format.
- General options:
+ -x The sample data is in XINU format; that is, it
+ comes from a machine with the opposite word order
+ than yours and must be swapped according to the
+ word-size given above. Only 16-bit and 32-bit
+ integer data may be swapped. Machine-format
+ floating-point data is not portable. IEEE floats
+ are a fixed, portable format. ???
- -e after the input file allows you to avoid giving
- an output file and just name an effect. This is
- mainly useful with the stat effect but can be
- used with others.
+ -c channels
+ The number of sound channels in the data file.
+ This may be 1, 2, or 4; for mono, stereo, or quad
+ sound data.
- -h Print version number and usage information.
+ General options:
+ -e after the input file allows you to avoid giving an
- June 28, 1999 2
+SunOS 5.6 Last change: June 28, 1999 2
-SoX(1) SoX(1)
+User Commands SoX(1)
- -p Run in preview mode and run fast. This will
- somewhat speed up sox when the output format has
- a different number of channels and a different
- rate then the input file. The order that the
- effects are run in will be arranged for maximum
- speed and not quality.
- -v volume Change amplitude (floating point); less than 1.0
- decreases, greater than 1.0 increases. Note: we
- perceive volume logarithmically, not linearly.
- Note: see the stat effect.
- -V Print a description of processing phases. Use-
- ful for figuring out exactly how sox is mangling
- your sound samples.
+ output file and just name an effect. This is
+ mainly useful with the stat effect but can be used
+ with others.
- The input and output files may be standard input and out-
- put. This is specified by '-'. The -t type option must
- be given in this case, else sox will not know the format
- of the given file. The -t, -r, -s/-u/-U/-A,
- -b/-w/-l/-f/-d/-D and -x options refer to the input data
- when given before the input file name. After, they refer
- to the output data.
+ -h Print version number and usage information.
- If you don't give an output file name, sox will just read
- the input file. This is useful for validating structured
- file formats; the stat effect may also be used via the -e
- option.
+ -p Run in preview mode and run fast. This will some-
+ what speed up sox when the output format has a
+ different number of channels and a different rate
+ then the input file. The order that the effects
+ are run in will be arranged for maximum speed and
+ not quality.
+ -v volume Change amplitude (floating point); less than 1.0
+ decreases, greater than 1.0 increases. Note: we
+ perceive volume logarithmically, not linearly.
+ Note: see the stat effect.
+
+ -V Print a description of processing phases. Useful
+ for figuring out exactly how sox is mangling your
+ sound samples.
+
+ The input and output files may be standard input and output.
+ This is specified by '-'. The -t type option must be given
+ in this case, else sox will not know the format of the given
+ file. The -t, -r, -s/-u/-U/-A, -b/-w/-l/-f/-d/-D and -x
+ options refer to the input data when given before the input
+ file name. After, they refer to the output data.
+
+ If you don't give an output file name, sox will just read
+ the input file. This is useful for validating structured
+ file formats; the stat effect may also be used via the -e
+ option.
+
FILE TYPES
- Sox needs to know the formats of the input and output
- files. File formats which have headers are checked, if
- that header doesn't seem right, the program exits with an
- appropriate message. Currently, raw (no header) binary
- and textual data, Amiga 8SVX, Apple/SGI AIFF, SPARC .AU
- (w/header), AVR, NeXT .SND, CD-R, CVSD, GSM 06.10, Mac
- HCOM, Sound Tools MAUD, OSS device drivers, Turtle Beach
- .SMP, Sound Blaster, Sndtool, and Sounder, Sun Audio
- device driver, Yamaha TX-16W Sampler, IRCAM Sound Files,
- Creative Labs VOC, Psion .WVE, and Microsoft RIFF/WAV are
- supported.
+ Sox needs to know the formats of the input and output files.
+ File formats which have headers are checked, if that header
+ doesn't seem right, the program exits with an appropriate
+ message. Currently, raw (no header) binary and textual
+ data, Amiga 8SVX, Apple/SGI AIFF, SPARC .AU (w/header), AVR,
+ NeXT .SND, CD-R, CVSD, GSM 06.10, Mac HCOM, Sound Tools
+ MAUD, OSS device drivers, Turtle Beach .SMP, Sound Blaster,
+ Sndtool, and Sounder, Sun Audio device driver, Yamaha TX-16W
+ Sampler, IRCAM Sound Files, Creative Labs VOC, Psion .WVE,
+ and Microsoft RIFF/WAV are supported.
+ .8svx Amiga 8SVX musical instrument description format.
- .8svx Amiga 8SVX musical instrument description for-
- mat.
+ .aiff AIFF files used on Apple IIc/IIgs and SGI. Note:
+ the AIFF format supports only one SSND chunk. It
+ does not support multiple sound chunks, or the
+ 8SVX musical instrument description format. AIFF
- .aiff AIFF files used on Apple IIc/IIgs and SGI.
- Note: the AIFF format supports only one SSND
- chunk. It does not support multiple sound
- chunks, or the 8SVX musical instrument descrip-
- tion format. AIFF files are multimedia archives
- and and can have multiple audio and picture
- chunks. You may need a separate archiver to
- work with them.
+SunOS 5.6 Last change: June 28, 1999 3
- June 28, 1999 3
-SoX(1) SoX(1)
+User Commands SoX(1)
- .au SUN Microsystems AU files. There are apparently
- many types of .au files; DEC has invented its
- own with a different magic number and word
- order. The .au handler can read these files but
- will not write them. Some .au files have valid
- AU headers and some do not. The latter are
- probably original SUN u-law 8000 hz samples.
- These can be dealt with using the .ul format
- (see below).
- .avr Audio Visual Research
- The AVR format is produced by a number of com-
- mercial packages on the Mac.
+ files are multimedia archives and and can have
+ multiple audio and picture chunks. You may need a
+ separate archiver to work with them.
- .cdr CD-R
- CD-R files are used in mastering music Compact
- Disks. The file format is, as you might expect,
- raw stereo raw unsigned samples at 44khz. But,
- there's some blocking/padding oddity in the for-
- mat, so it needs its own handler.
+ .au SUN Microsystems AU files. There are apparently
+ many types of .au files; DEC has invented its own
+ with a different magic number and word order. The
+ .au handler can read these files but will not
+ write them. Some .au files have valid AU headers
+ and some do not. The latter are probably original
+ SUN u-law 8000 hz samples. These can be dealt
+ with using the .ul format (see below).
- .cvs Continuously Variable Slope Delta modulation
- Used to compress speech audio for applications
- such as voice mail.
+ .avr Audio Visual Research
+ The AVR format is produced by a number of commer-
+ cial packages on the Mac.
- .dat Text Data files
- These files contain a textual representation of
- the sample data. There is one line at the
- beginning that contains the sample rate. Subse-
- quent lines contain two numeric data items: the
- time since the beginning of the sample and the
- sample value. Values are normalized so that the
- maximum and minimum are 1.00 and -1.00. This
- file format can be used to create data files for
- external programs such as FFT analyzers or graph
- routines. SoX can also convert a file in this
- format back into one of the other file formats.
+ .cdr CD-R
+ CD-R files are used in mastering music Compact
+ Disks. The file format is, as you might expect,
+ raw stereo raw unsigned samples at 44khz. But,
+ there's some blocking/padding oddity in the for-
+ mat, so it needs its own handler.
- .gsm GSM 06.10 Lossy Speech Compression
- A standard for compressing speech which is used
- in the Global Standard for Mobil telecommunica-
- tions (GSM). Its good for its purpose, shrink-
- ing audio data size, but it will introduce lots
- of noise when a given sound sample is encoded
- and decoded multiple times. This format is used
- by some voice mail applications. It is rather
- CPU intensive. GSM in sox is optional and
- requires access to an external GSM library. To
- see if there is support for gsm run sox -h and
- look for it under the list of supported file
- formats.
+ .cvs Continuously Variable Slope Delta modulation
+ Used to compress speech audio for applications
+ such as voice mail.
- .hcom Macintosh HCOM files. These are (apparently)
- Mac FSSD files with some variant of Huffman
+ .dat Text Data files
+ These files contain a textual representation of
+ the sample data. There is one line at the begin-
+ ning that contains the sample rate. Subsequent
+ lines contain two numeric data items: the time
+ since the beginning of the sample and the sample
+ value. Values are normalized so that the maximum
+ and minimum are 1.00 and -1.00. This file format
+ can be used to create data files for external pro-
+ grams such as FFT analyzers or graph routines.
+ SoX can also convert a file in this format back
+ into one of the other file formats.
+ .gsm GSM 06.10 Lossy Speech Compression
+ A standard for compressing speech which is used in
+ the Global Standard for Mobil telecommunications
+ (GSM). Its good for its purpose, shrinking audio
+ data size, but it will introduce lots of noise
+ when a given sound sample is encoded and decoded
+ multiple times. This format is used by some voice
+ mail applications. It is rather CPU intensive.
+ GSM in sox is optional and requires access to an
+ external GSM library. To see if there is support
+ for gsm run sox -h and look for it under the list
- June 28, 1999 4
+SunOS 5.6 Last change: June 28, 1999 4
-SoX(1) SoX(1)
- compression. The Macintosh has wacky file for-
- mats and this format handler apparently doesn't
- handle all the ones it should. Mac users will
- need your usual arsenal of file converters to
- deal with an HCOM file under Unix or DOS.
+User Commands SoX(1)
- .maud An Amiga format
- An IFF-conform sound file type, registered by MS
- MacroSystem Computer GmbH, published along with
- the "Toccata" sound-card on the Amiga. Allows
- 8bit linear, 16bit linear, A-Law, u-law in mono
- and stereo.
- ossdsp OSS /dev/dsp device driver
- This is a psuedo-file type and can be optionally
- compiled into Sox. Run sox -h to see if you
- have support for this file type. When this
- driver is used it allows you to open up the OSS
- /dev/dsp file and configure it to use the same
- data type as passed in to Sox. It works for
- both playing and recording sound samples. When
- playing sound files it attempts to set up the
- OSS driver to use the same format as the input
- file. It is suggested to always override the
- output values to use the highest quality samples
- your sound card can handle. Example: -t ossdsp
- -w -s /dev/dsp
- .sf IRCAM Sound Files.
- SoundFiles are used by academic music software
- such as the CSound package, and the MixView
- sound sample editor.
+ of supported file formats.
- .smp Turtle Beach SampleVision files.
- SMP files are for use with the PC-DOS package
- SampleVision by Turtle Beach Softworks. This
- package is for communication to several MIDI
- samplers. All sample rates are supported by the
- package, although not all are supported by the
- samplers themselves. Currently loop points are
- ignored.
+ .hcom Macintosh HCOM files. These are (apparently) Mac
+ FSSD files with some variant of Huffman compres-
+ sion. The Macintosh has wacky file formats and
+ this format handler apparently doesn't handle all
+ the ones it should. Mac users will need your
+ usual arsenal of file converters to deal with an
+ HCOM file under Unix or DOS.
- sunau Sun /dev/audio device driver
- This is a psuedo-file type and can be optionally
- compiled into Sox. Run sox -h to see if you
- have support for this file type. When this
- driver is used it allows you to open up a Sun
- /dev/audio file and configure it to use the same
- data type as passed in to Sox. It works for
- both playing and recording sound samples. When
- playing sound files it attempts to set up the
- audio driver to use the same format as the input
- file. It is suggested to always override the
- output values to use the highest quality samples
+ .maud An Amiga format
+ An IFF-conform sound file type, registered by MS
+ MacroSystem Computer GmbH, published along with
+ the "Toccata" sound-card on the Amiga. Allows
+ 8bit linear, 16bit linear, A-Law, u-law in mono
+ and stereo.
+
+ ossdsp OSS /dev/dsp device driver
+ This is a psuedo-file type and can be optionally
+ compiled into Sox. Run sox -h to see if you have
+ support for this file type. When this driver is
+ used it allows you to open up the OSS /dev/dsp
+ file and configure it to use the same data type as
+ passed in to Sox. It works for both playing and
+ recording sound samples. When playing sound files
+ it attempts to set up the OSS driver to use the
+ same format as the input file. It is suggested to
+ always override the output values to use the
+ highest quality samples your sound card can han-
+ dle. Example: -t ossdsp -w -s /dev/dsp
+
+ .sf IRCAM Sound Files.
+ SoundFiles are used by academic music software
+ such as the CSound package, and the MixView sound
+ sample editor.
+
+ .smp Turtle Beach SampleVision files.
+ SMP files are for use with the PC-DOS package Sam-
+ pleVision by Turtle Beach Softworks. This package
+ is for communication to several MIDI samplers. All
+ sample rates are supported by the package,
+ although not all are supported by the samplers
+ themselves. Currently loop points are ignored.
+ sunau Sun /dev/audio device driver
+ This is a psuedo-file type and can be optionally
+ compiled into Sox. Run sox -h to see if you have
+ support for this file type. When this driver is
+ used it allows you to open up a Sun /dev/audio
+ file and configure it to use the same data type as
+ passed in to Sox. It works for both playing and
+ recording sound samples. When playing sound files
- June 28, 1999 5
+SunOS 5.6 Last change: June 28, 1999 5
-SoX(1) SoX(1)
- your hardware can handle. Example: -t sunau -w
- -s /dev/audio or -t sunau -U -c 1 /dev/audio for
- older sun equipment.
+User Commands SoX(1)
- .txw Yamaha TX-16W sampler.
- A file format from a Yamaha sampling keyboard
- which wrote IBM-PC format 3.5" floppies. Han-
- dles reading of files which do not have the sam-
- ple rate field set to one of the expected by
- looking at some other bytes in the attack/loop
- length fields, and defaulting to 33kHz if the
- sample rate is still unknown.
- .vms More info to come.
- Used to compress speech audio for applications
- such as voice mail.
- .voc Sound Blaster VOC files.
- VOC files are multi-part and contain silence
- parts, looping, and different sample rates for
- different chunks. On input, the silence parts
- are filled out, loops are rejected, and sample
- data with a new sample rate is rejected.
- Silence with a different sample rate is gener-
- ated appropriately. On output, silence is not
- detected, nor are impossible sample rates.
+ it attempts to set up the audio driver to use the
+ same format as the input file. It is suggested to
+ always override the output values to use the
+ highest quality samples your hardware can handle.
+ Example: -t sunau -w -s /dev/audio or -t sunau -U
+ -c 1 /dev/audio for older sun equipment.
- .wav Microsoft .WAV RIFF files.
- These appear to be very similar to IFF files,
- but not the same. They are the native sound
- file format of Windows. (Obviously, Windows was
- of such incredible importance to the computer
- industry that it just had to have its own sound
- file format.) Normally .wav files have all for-
- matting information in their headers, and so do
- not need any format options specified for an
- input file. If any are, they will override the
- file header, and you will be warned to this
- effect. You had better know what you are doing!
- Output format options will cause a format con-
- version, and the .wav will written appropri-
- ately. Note that it is possible to write data
- of a type that cannot be specified by the .wav
- header, and you will be warned that you a writ-
- ing a bad file ! Sox currently can read PCM,
- ULAW, ALAW, MS ADPCM, and IMA (or DVI) ADPCM.
- It can output all of these formats except the
- ADPCM styles.
+ .txw Yamaha TX-16W sampler.
+ A file format from a Yamaha sampling keyboard
+ which wrote IBM-PC format 3.5" floppies. Handles
+ reading of files which do not have the sample rate
+ field set to one of the expected by looking at
+ some other bytes in the attack/loop length fields,
+ and defaulting to 33kHz if the sample rate is
+ still unknown.
- .wve Psion 8-bit alaw
- These are 8-bit a-law 8khz sound files used on
- the Psion palmtop portable computer.
+ .vms More info to come.
+ Used to compress speech audio for applications
+ such as voice mail.
- .raw Raw files (no header).
+ .voc Sound Blaster VOC files.
+ VOC files are multi-part and contain silence
+ parts, looping, and different sample rates for
+ different chunks. On input, the silence parts are
+ filled out, loops are rejected, and sample data
+ with a new sample rate is rejected. Silence with
+ a different sample rate is generated appropri-
+ ately. On output, silence is not detected, nor
+ are impossible sample rates.
+ .wav Microsoft .WAV RIFF files.
+ These appear to be very similar to IFF files, but
+ not the same. They are the native sound file for-
+ mat of Windows. (Obviously, Windows was of such
+ incredible importance to the computer industry
+ that it just had to have its own sound file for-
+ mat.) Normally .wav files have all formatting
+ information in their headers, and so do not need
+ any format options specified for an input file. If
+ any are, they will override the file header, and
+ you will be warned to this effect. You had better
+ know what you are doing! Output format options
+ will cause a format conversion, and the .wav will
+ written appropriately. Note that it is possible
+ to write data of a type that cannot be specified
+ by the .wav header, and you will be warned that
+ you a writing a bad file ! Sox currently can read
+ PCM, ULAW, ALAW, MS ADPCM, and IMA (or DVI) ADPCM.
+ It can output all of these formats except the
+ ADPCM styles.
+ .wve Psion 8-bit alaw
- June 28, 1999 6
+SunOS 5.6 Last change: June 28, 1999 6
-SoX(1) SoX(1)
- The sample rate, size (byte, word, etc), and
- style (signed, unsigned, etc.) of the sample
- file must be given. The number of channels
- defaults to 1.
- .ub, .sb, .uw, .sw, .ul
- These are several suffices which serve as a
- shorthand for raw files with a given size and
- style. Thus, ub, sb, uw, sw, and ul correspond
- to "unsigned byte", "signed byte", "unsigned
- word", "signed word", and "ulaw" (byte). The
- sample rate defaults to 8000 hz if not explic-
- itly set, and the number of channels (as always)
- defaults to 1. There are lots of Sparc samples
- floating around in u-law format with no header
- and fixed at a sample rate of 8000 hz. (Certain
- sound management software cheerfully ignores the
- headers.) Similarly, most Mac sound files are
- in unsigned byte format with a sample rate of
- 11025 or 22050 hz.
+User Commands SoX(1)
- .auto This is a ``meta-type'': specifying this type
- for an input file triggers some code that tries
- to guess the real type by looking for magic
- words in the header. If the type can't be
- guessed, the program exits with an error mes-
- sage. The input must be a plain file, not a
- pipe. This type can't be used for output files.
+
+ These are 8-bit a-law 8khz sound files used on the
+ Psion palmtop portable computer.
+
+ .raw Raw files (no header).
+ The sample rate, size (byte, word, etc), and style
+ (signed, unsigned, etc.) of the sample file must
+ be given. The number of channels defaults to 1.
+
+ .ub, .sb, .uw, .sw, .ul
+ These are several suffices which serve as a short-
+ hand for raw files with a given size and style.
+ Thus, ub, sb, uw, sw, and ul correspond to
+ "unsigned byte", "signed byte", "unsigned word",
+ "signed word", and "ulaw" (byte). The sample rate
+ defaults to 8000 hz if not explicitly set, and the
+ number of channels (as always) defaults to 1.
+ There are lots of Sparc samples floating around in
+ u-law format with no header and fixed at a sample
+ rate of 8000 hz. (Certain sound management
+ software cheerfully ignores the headers.) Simi-
+ larly, most Mac sound files are in unsigned byte
+ format with a sample rate of 11025 or 22050 hz.
+
+ .auto This is a ``meta-type'': specifying this type for
+ an input file triggers some code that tries to
+ guess the real type by looking for magic words in
+ the header. If the type can't be guessed, the
+ program exits with an error message. The input
+ must be a plain file, not a pipe. This type can't
+ be used for output files.
+
EFFECTS
- Only one effect from the palette may be applied to a sound
- sample. To do multiple effects you'll need to run sox in
- a pipeline.
+ Only one effect from the palette may be applied to a sound
+ sample. To do multiple effects you'll need to run sox in a
+ pipeline.
- avg [ -l | -r ]
- Reduce the number of channels by averaging the
- samples, or duplicate channels to increase the
- number of channels. Valid combinations are 1 -
- 2, 1 - 4, 2 - 4, 4 - 2, 4 - 1, 2 - 1. The -l or
- -r option is not really averaging but either
- duplicates or leaves just the left or right
- channel, depending on if your increasing or
- decreasing the number of output channels.
+ avg [ -l | -r ]
+ Reduce the number of channels by averaging the
+ samples, or duplicate channels to increase the
+ number of channels. Valid combinations are 1 - 2,
+ 1 - 4, 2 - 4, 4 - 2, 4 - 1, 2 - 1. The -l or -r
+ option is not really averaging but either dupli-
+ cates or leaves just the left or right channel,
+ depending on if your increasing or decreasing the
+ number of output channels.
- band [ -n ] center [ width ]
- Apply a band-pass filter. The frequency
- response drops logarithmically around the center
- frequency. The width gives the slope of the
- drop. The frequencies at center + width and
- center - width will be half of their original
- amplitudes. Band defaults to a mode oriented to
- pitched signals, i.e. voice, singing, or instru-
- mental music. The -n (for noise) option uses
- the alternate mode for un-pitched signals. Band
+ band [ -n ] center [ width ]
+ Apply a band-pass filter. The frequency response
+ drops logarithmically around the center frequency.
+ The width gives the slope of the drop. The fre-
+ quencies at center + width and center - width will
+ be half of their original amplitudes. Band
- June 28, 1999 7
+SunOS 5.6 Last change: June 28, 1999 7
-SoX(1) SoX(1)
+User Commands SoX(1)
- introduces noise in the shape of the filter,
- i.e. peaking at the center frequency and set-
- tling around it.
- chorus gain-in gain-out delay decay speed deptch
- -s | -t [ delay decay speed depth -s | -t ... ]
- Add a chorus to a sound sample. Each quadtuple
- delay/decay/speed/depth gives the delay in mil-
- liseconds and the decay (relative to gain-in)
- with a modulation speed in Hz using depth in
- milliseconds. The modulation is either sinodial
- (-s) or triangular (-t). Gain-out is the volume
- of the output.
+ defaults to a mode oriented to pitched signals,
+ i.e. voice, singing, or instrumental music. The
+ -n (for noise) option uses the alternate mode for
+ un-pitched signals. Band introduces noise in the
+ shape of the filter, i.e. peaking at the center
+ frequency and settling around it.
- copy Copy the input file to the output file. This is
- the default effect if both files have the same
- sampling rate.
+ chorus gain-in gain-out delay decay speed deptch
- cut loopnumber
- Extract loop #N from a sample.
+ -s | -t [ delay decay speed depth -s | -t ... ]
+ Add a chorus to a sound sample. Each quadtuple
+ delay/decay/speed/depth gives the delay in mil-
+ liseconds and the decay (relative to gain-in) with
+ a modulation speed in Hz using depth in mil-
+ liseconds. The modulation is either sinodial (-s)
+ or triangular (-t). Gain-out is the volume of the
+ output.
- deemph Apply a treble attenuation shelving filter to
- samples in audio cd format. The frequency
- response of pre-emphasized recordings is recti-
- fied. The filtering is defined in the standard
- document ISO 908.
+ compand attack1,decay1[,attack2,decay2...]
- echo gain-in gain-out delay decay [ delay decay ... ]
- Add echoing to a sound sample. Each delay/decay
- part gives the delay in milliseconds and the
- decay (relative to gain-in) of that echo. Gain-
- out is the volume of the output.
+ in-dB1,out-dB1[,in-dB2,out-dB2...]
- echos gain-in gain-out delay decay [ delay decay ... ]
- Add a sequence of echos to a sound sample. Each
- delay/decay part gives the delay in milliseconds
- and the decay (relative to gain-in) of that
- echo. Gain-out is the volume of the output.
+ [gain] [initial-volume]
+ Compand (compress or expand) the dynamic range of
+ a sample. The attack and decay time specify the
+ integration time over which the absolute value of
+ the input signal is integrated to determine its
+ volume. Where more than one pair of attack/decay
+ parameters are specified, each channel is treated
+ separately and the number of pairs must agree with
+ the number of input channels. The second parame-
+ ter is a list of points on the compander's
+ transfer function specified in dB relative to the
+ maximum possible signal amplitude. The input
+ values must be in a strictly increasing order but
+ the transfer function does not have to be monoton-
+ ically rising. The special value -inf may be used
+ to indicate that the input volume should be asso-
+ ciated output volume. The points -inf,-inf and
+ 0,0 are assumed; the latter may be overridden, but
+ the former may not. The third (optional) parame-
+ ter is a postprocessing gain in dB which is
+ applied after the compression has taken place; the
+ fourth (optional) parameter is an initial volume
+ to be assumed for each channel when the effect
+ starts. This permits the user to supply a nominal
+ level initially, so that, for example, a very
+ large gain is not applied to initial signal levels
+ before the companding action has begun to operate:
+ it is quite probable that in such an event, the
+ output would be severely clipped while the com-
+ pander gain properly adjusts itself.
- flanger gain-in gain-out delay decay speed -s | -t
- Add a flanger to a sound sample. Each triple
- delay/decay/speed gives the delay in millisec-
- onds and the decay (relative to gain-in) with a
- modulation speed in Hz. The modulation is
- either sinodial (-s) or triangular (-t). Gain-
- out is the volume of the output.
- highp center
- Apply a high-pass filter. The frequency
- response drops logarithmically with center fre-
- quency in the middle of the drop. The slope of
- the filter is quite gentle.
+SunOS 5.6 Last change: June 28, 1999 8
- June 28, 1999 8
+User Commands SoX(1)
-SoX(1) SoX(1)
+ copy Copy the input file to the output file. This is
+ the default effect if both files have the same
+ sampling rate.
- lowp center
- Apply a low-pass filter. The frequency response
- drops logarithmically with center frequency in
- the middle of the drop. The slope of the filter
- is quite gentle.
+ cut loopnumber
+ Extract loop #N from a sample.
- map Display a list of loops in a sample, and miscel-
- laneous loop info.
+ deemph Apply a treble attenuation shelving filter to sam-
+ ples in audio cd format. The frequency response
+ of pre-emphasized recordings is rectified. The
+ filtering is defined in the standard document ISO
+ 908.
- mask Add "masking noise" to signal. This effect
- deliberately adds white noise to a sound in
- order to mask quantization effects, created by
- the process of playing a sound digitally. It
- tends to mask buzzing voices, for example. It
- adds 1/2 bit of noise to the sound file at the
- output bit depth.
+ echo gain-in gain-out delay decay [ delay decay ... ]
+ Add echoing to a sound sample. Each delay/decay
+ part gives the delay in milliseconds and the decay
+ (relative to gain-in) of that echo. Gain-out is
+ the volume of the output.
- phaser gain-in gain-out delay decay speed -s | -t
- Add a phaser to a sound sample. Each triple
- delay/decay/speed gives the delay in millisec-
- onds and the decay (relative to gain-in) with a
- modulation speed in Hz. The modulation is
- either sinodial (-s) or triangular (-t). The
- decay should be less than 0.5 to avoid feedback.
- Gain-out is the volume of the output.
+ echos gain-in gain-out delay decay [ delay decay ... ]
+ Add a sequence of echos to a sound sample. Each
+ delay/decay part gives the delay in milliseconds
+ and the decay (relative to gain-in) of that echo.
+ Gain-out is the volume of the output.
- pick Select the left or right channel of a stereo
- sample, or one of four channels in a quadro-
- phonic sample.
+ flanger gain-in gain-out delay decay speed -s | -t
+ Add a flanger to a sound sample. Each triple
+ delay/decay/speed gives the delay in milliseconds
+ and the decay (relative to gain-in) with a modula-
+ tion speed in Hz. The modulation is either sino-
+ dial (-s) or triangular (-t). Gain-out is the
+ volume of the output.
- polyphase [ -w < num / ham > ]
+ highp center
+ Apply a high-pass filter. The frequency response
+ drops logarithmically with center frequency in the
+ middle of the drop. The slope of the filter is
+ quite gentle.
- [ -width < long / short / # > ]
+ lowp center
+ Apply a low-pass filter. The frequency response
+ drops logarithmically with center frequency in the
+ middle of the drop. The slope of the filter is
+ quite gentle.
- [ -cutoff # ]
- Translate input sampling rate to output sampling
- rate via polyphase interpolation, a DSP algo-
- rithm. This method is slow and uses lots of
- RAM, but gives much better results then rate.
- -w < nut / ham > : select either a Nuttal (~90
- dB stopband) or Hamming (~43 dB stopband) win-
- dow. Warning: Nuttall windows require 2x length
- than Hamming windows. Default is nut.
- -width long / short / # : specify the width of
- the filter. long is 1024 samples; short is 128
- samples. Alternatively, an exact number can be
- used. Default is long.
- -cutoff # : specify the filter cutoff frequency
- in terms of fraction of bandwidth. If upsam-
- pling, then this is the fraction of the orignal
- signal that should go through. If downsampling,
- this is the fraction of the signal left after
- downsampling. Default is 0.95. Remember that
- this is a float.
+ map Display a list of loops in a sample, and miscel-
+ laneous loop info.
+ mask Add "masking noise" to signal. This effect deli-
+ berately adds white noise to a sound in order to
+ mask quantization effects, created by the process
+ of playing a sound digitally. It tends to mask
- June 28, 1999 9
+SunOS 5.6 Last change: June 28, 1999 9
-SoX(1) SoX(1)
- rate Translate input sampling rate to output sampling
- rate via linear interpolation to the Least Com-
- mon Multiple of the two sampling rates. This is
- the default effect if the two files have differ-
- ent sampling rates and the preview options was
- specified. This is fast but noisy: the spectrum
- of the original sound will be shifted upwards
- and duplicated faintly when up-translating by a
- multiple. Lerp-ing is acceptable for cheap
- 8-bit sound hardware, but for CD-quality sound
- you should instead use either resample or
- polyphase. If you are wondering which of Sox's
- rate changing effects to ues, you will want to
- read a detailed analysis of all of them at
- http://eakaw2.et.tu-dresden.de/~andreas/resam-
- ple/resample.html
+User Commands SoX(1)
- resample [ rolloff [ beta ] ]
- Translate input sampling rate to output sampling
- rate via simulated analog filtration. This
- method is slower than rate, but gives much bet-
- ter results. rolloff refers to the cut-off fre-
- quency of the low pass filter and is given in
- terms of the Nyquist frequency for the lower
- sample rate. rolloff therefor should be some-
- thing between 0. and 1., in practice 0.8-0.95.
- beta trades stop band rejection against transi-
- tion width from passband to stop band. Larger
- beta means a slower transition and greater stop-
- band rejection. beta should be at least greater
- than 2. The default is rollof 0.8, beta 17.5,
- which is rather conservative with respect to
- aliasing. Lower beta and higher rolloff values
- preserve more high frequency signal energy, but
- introduce measurable artifacts. This is the
- default effect if the two files have different
- sampling rates.
- reverb gain-out delay [ delay ... ]
- Add reverbation to a sound sample. Each delay
- is given in milliseconds and its feedback is
- depending on the reverb-time in milliseconds.
- Each delay should be in the range of half to
- quarter of reverb-time to get a realistic rever-
- bation. Gain-out is the volume of the output.
- reverse Reverse the sound sample completely. Included
- for finding Satanic subliminals.
+ buzzing voices, for example. It adds 1/2 bit of
+ noise to the sound file at the output bit depth.
- split Turn a mono sample into a stereo sample by copy-
- ing the input channel to the left and right
- channels.
+ phaser gain-in gain-out delay decay speed -s | -t
+ Add a phaser to a sound sample. Each triple
+ delay/decay/speed gives the delay in milliseconds
+ and the decay (relative to gain-in) with a modula-
+ tion speed in Hz. The modulation is either sino-
+ dial (-s) or triangular (-t). The decay should be
+ less than 0.5 to avoid feedback. Gain-out is the
+ volume of the output.
+ pick Select the left or right channel of a stereo sam-
+ ple, or one of four channels in a quadrophonic
+ sample.
+ polyphase [ -w < num / ham > ]
+ [ -width < long / short / # > ]
+ [ -cutoff # ]
+ Translate input sampling rate to output sampling
+ rate via polyphase interpolation, a DSP algorithm.
+ This method is slow and uses lots of RAM, but
+ gives much better results then rate.
+ -w < nut / ham > : select either a Nuttal (~90 dB
+ stopband) or Hamming (~43 dB stopband) window.
+ Warning: Nuttall windows require 2x length than
+ Hamming windows. Default is nut.
+ -width long / short / # : specify the width of the
+ filter. long is 1024 samples; short is 128 sam-
+ ples. Alternatively, an exact number can be used.
+ Default is long.
+ -cutoff # : specify the filter cutoff frequency in
+ terms of fraction of bandwidth. If upsampling,
+ then this is the fraction of the orignal signal
+ that should go through. If downsampling, this is
+ the fraction of the signal left after downsam-
+ pling. Default is 0.95. Remember that this is a
+ float.
- June 28, 1999 10
+ rate Translate input sampling rate to output sampling
+ rate via linear interpolation to the Least Common
+ Multiple of the two sampling rates. This is the
+ default effect if the two files have different
+ sampling rates and the preview options was speci-
+ fied. This is fast but noisy: the spectrum of
+ the original sound will be shifted upwards and
+ duplicated faintly when up-translating by a multi-
+ ple. Lerp-ing is acceptable for cheap 8-bit sound
+ hardware, but for CD-quality sound you should
+SunOS 5.6 Last change: June 28, 1999 10
-SoX(1) SoX(1)
- stat [ debug | -v ]
- Do a statistical check on the input file, and
- print results on the standard error file. stat
- may copy the file untouched from input to out-
- put, if you select an output file. The "Volume
- Adjustment:" field in the statistics gives you
- the argument to the -v number which will make
- the sample as loud as possible without clipping.
- There is an optional parameter -v that will
- print out the "Volume Adjustment:" field's value
- and return. This could be of use in scripts to
- auto convert the volume. There is an also an
- optional parameter debug that will place sox
- into debug mode and print out a hex dump of the
- sound file from the internal buffer that is in
- 32-bit signed PCM data. This is mainly only of
- use in tracking down endian problems that creep
- in to sox on cross-platform versions.
- swap [ 1 2 3 4 ]
- Swap channels in multi-channel sound files. In
- files with more than 2 channels you may specify
- the order that the channels should be rearranged
- in.
- vibro speed [ depth ]
- Add the world-famous Fender Vibro-Champ sound
- effect to a sound sample by using a sine wave as
- the volume knob. Speed gives the Hertz value of
- the wave. This must be under 30. Depth gives
- the amount the volume is cut into by the sine
- wave, ranging 0.0 to 1.0 and defaulting to 0.5.
- Sox enforces certain effects. If the two files have dif-
- ferent sampling rates, the requested effect must be one of
- copy, or rate, If the two files have different numbers of
- channels, the avg effect must be requested.
+User Commands SoX(1)
+
+
+ instead use either resample or polyphase. If you
+ are wondering which of Sox's rate changing effects
+ to ues, you will want to read a detailed analysis
+ of all of them at http://eakaw2.et.tu-
+ dresden.de/~andreas/resample/resample.html
+
+ resample [ rolloff [ beta ] ]
+ Translate input sampling rate to output sampling
+ rate via simulated analog filtration. This method
+ is slower than rate, but gives much better
+ results. rolloff refers to the cut-off frequency
+ of the low pass filter and is given in terms of
+ the Nyquist frequency for the lower sample rate.
+ rolloff therefor should be something between 0.
+ and 1., in practice 0.8-0.95. beta trades stop
+ band rejection against transition width from
+ passband to stop band. Larger beta means a slower
+ transition and greater stopband rejection. beta
+ should be at least greater than 2. The default is
+ rollof 0.8, beta 17.5, which is rather conserva-
+ tive with respect to aliasing. Lower beta and
+ higher rolloff values preserve more high frequency
+ signal energy, but introduce measurable artifacts.
+ This is the default effect if the two files have
+ different sampling rates.
+
+ reverb gain-out delay [ delay ... ]
+ Add reverbation to a sound sample. Each delay is
+ given in milliseconds and its feedback is depend-
+ ing on the reverb-time in milliseconds. Each
+ delay should be in the range of half to quarter of
+ reverb-time to get a realistic reverbation.
+ Gain-out is the volume of the output.
+
+ reverse Reverse the sound sample completely. Included for
+ finding Satanic subliminals.
+
+ split Turn a mono sample into a stereo sample by copying
+ the input channel to the left and right channels.
+
+ stat [ debug | -v ]
+ Do a statistical check on the input file, and
+ print results on the standard error file. stat
+ may copy the file untouched from input to output,
+ if you select an output file. The "Volume Adjust-
+ ment:" field in the statistics gives you the argu-
+ ment to the -v number which will make the sample
+ as loud as possible without clipping. There is an
+ optional parameter -v that will print out the
+ "Volume Adjustment:" field's value and return.
+ This could be of use in scripts to auto convert
+ the volume. There is an also an optional
+
+
+
+SunOS 5.6 Last change: June 28, 1999 11
+
+
+
+
+
+
+User Commands SoX(1)
+
+
+
+ parameter debug that will place sox into debug
+ mode and print out a hex dump of the sound file
+ from the internal buffer that is in 32-bit signed
+ PCM data. This is mainly only of use in tracking
+ down endian problems that creep in to sox on
+ cross-platform versions.
+
+ swap [ 1 2 3 4 ]
+ Swap channels in multi-channel sound files. In
+ files with more than 2 channels you may specify
+ the order that the channels should be rearranged
+ in.
+
+ vibro speed [ depth ]
+ Add the world-famous Fender Vibro-Champ sound
+ effect to a sound sample by using a sine wave as
+ the volume knob. Speed gives the Hertz value of
+ the wave. This must be under 30. Depth gives the
+ amount the volume is cut into by the sine wave,
+ ranging 0.0 to 1.0 and defaulting to 0.5.
+
+ Sox enforces certain effects. If the two files have dif-
+ ferent sampling rates, the requested effect must be one of
+ copy, or rate, If the two files have different numbers of
+ channels, the avg effect must be requested.
+
BUGS
- The syntax is horrific. It's very tempting to include a
- default system that allows an effect name as the program
- name and just pipes a sound sample from standard input to
- standard output, but the problem of inputting the sample
- rates makes this unworkable.
+ The syntax is horrific. It's very tempting to include a
+ default system that allows an effect name as the program
+ name and just pipes a sound sample from standard input to
+ standard output, but the problem of inputting the sample
+ rates makes this unworkable.
- Please report any bugs found in this version of sox to
- Chris Bagwell ([email protected])
+ Please report any bugs found in this version of sox to Chris
+ Bagwell ([email protected])
FILES
SEE ALSO
- play(1), rec(1)
+ play(1), rec(1)
NOTICES
- The echoplex effect is: Copyright (C) 1989 by Jef
+ The echoplex effect is: Copyright (C) 1989 by Jef
+ Poskanzer.
+ Permission to use, copy, modify, and distribute this
+ software and its documentation for any purpose and without
+ fee is hereby granted, provided that the above copyright
+ notice appear in all copies and that both that copyright
+ notice and this permission notice appear in supporting docu-
+ mentation. This software is provided "as is" without
+ express or implied warranty.
- June 28, 1999 11
+SunOS 5.6 Last change: June 28, 1999 12
-SoX(1) SoX(1)
- Poskanzer.
- Permission to use, copy, modify, and distribute this soft-
- ware and its documentation for any purpose and without fee
- is hereby granted, provided that the above copyright
- notice appear in all copies and that both that copyright
- notice and this permission notice appear in supporting
- documentation. This software is provided "as is" without
- express or implied warranty.
+User Commands SoX(1)
- The version of Sox that accompanies this manual page is
- support by Chris Bagwell ([email protected]). Please
- refer any questions regarding it to this address. You may
- obtain the latest version at the the web site
- http://home.sprynet.com/~cbagwell/sox.html
+ The version of Sox that accompanies this manual page is sup-
+ port by Chris Bagwell ([email protected]). Please refer
+ any questions regarding it to this address. You may obtain
+ the latest version at the the web site
+ http://home.sprynet.com/~cbagwell/sox.html
@@ -787,6 +842,17 @@
- June 28, 1999 12
+
+
+
+
+
+
+
+
+
+
+SunOS 5.6 Last change: June 28, 1999 13
+
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -30,6 +30,7 @@
BINDIR = $(prefix)/bin
LIBDIR = $(prefix)/lib
MANDIR = $(prefix)/man
+INCDIR = $(prefix)/include
# Other macros.
@@ -44,8 +45,8 @@
g723_24.c g723_40.c g72x.c gsm.c hcom.c maud.c raw.c \
sbdsp.c sf.c smp.c sndrtool.c tx16w.c voc.c wav.c wve.c
-ESRC = avg.c band.c chorus.c copy.c cut.c deemphas.c dyn.c echo.c echos.c \
- flanger.c highp.c lowp.c map.c mask.c phaser.c pick.c \
+ESRC = avg.c band.c chorus.c compand.c copy.c cut.c deemphas.c dyn.c echo.c \
+ echos.c flanger.c highp.c lowp.c map.c mask.c phaser.c pick.c \
polyphas.c rate.c resample.c reverb.c reverse.c split.c \
stat.c swap.c vibro.c
@@ -65,8 +66,8 @@
g723_24.o g723_40.o g72x.o gsm.o hcom.o maud.o raw.o \
sbdsp.o sf.o smp.o sndrtool.o tx16w.o voc.o wav.o wve.o
-EOBJ = avg.o band.o chorus.o copy.o cut.o deemphas.o dyn.o echo.o echos.o \
- flanger.o highp.o lowp.o map.o mask.o phaser.o pick.o \
+EOBJ = avg.o band.o chorus.o compand.o copy.o cut.o deemphas.o dyn.o echo.o \
+ echos.o flanger.o highp.o lowp.o map.o mask.o phaser.o pick.o \
polyphas.o rate.o resample.o reverb.o reverse.o split.o \
stat.o swap.o vibro.o
@@ -113,6 +114,7 @@
install-lib: libst.a
$(INSTALL) -c -m 644 libst.a $(LIBDIR)
$(INSTALL) -c -m 644 libst.3 $(MANDIR)/man3
+ $(INSTALL) -c -m 644 st.h $(INCDIR)
clean:
$(RM) *.o
--- /dev/null
+++ b/src/compand.c
@@ -1,0 +1,263 @@
+/*
+ * Compander effect
+ *
+ * Written by Nick Bailey ([email protected] or
+ * [email protected]). Hope page for this effect:
+ * http://www.ee.keeds.ac.uk/homes/NJB/Softwere/Compand/compand.html
+ *
+ * Copyright 1999 Chris Bagwell And Nick Bailey
+ * This source code is freely redistributable and may be used for
+ * any purpose. This copyright notice must be maintained.
+ * Chris Bagwell And Nick Bailey are not responsible for
+ * the consequences of using this software.
+ */
+
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+#include "st.h"
+
+/* Private data for SKEL file */
+typedef struct {
+ int expectedChannels; /* Also flags that channels aren't to be treated
+ individually when = 1 and input not mono */
+ int transferPoints; /* Number of points specified on the transfer
+ function */
+ double *attackRate; /* An array of attack rates */
+ double *decayRate; /* ... and of decay rates */
+ double *transferIns; /* ... and points on the transfer function */
+ double *transferOuts;
+ double *volume; /* Current "volume" of each channel */
+ LONG *lastSamp; /* Remeber the value of the previous sample */
+ double outgain; /* Post processor gain */
+} *compand_t;
+
+/*
+ * Process options
+ *
+ * Don't do initialization now.
+ * The 'info' fields are not yet filled in.
+ */
+void compand_getopts(effp, n, argv)
+eff_t effp;
+int n;
+char **argv;
+{
+ compand_t l = (compand_t) effp->priv;
+
+ if (n < 2 || n > 4)
+ fail("Wrong number of arguments for the compander effect\n"
+ "Use: {<attack_time>,<decay_time>}+ {<dB_in>,<db_out>}+ "
+ "[<dB_postamp>]\n"
+ "where {}+ means `one or more in a comma-separated, "
+ "white-space-free list'\n"
+ "and [] indications possible omission. dB values are floating\n"
+ "point or `-inf'; times are in seconds.");
+ else { /* Right no. of args, but are they well formed? */
+ char *s;
+ int rates, tfers, i, commas;
+
+ /* Start by checking the attack and decay rates */
+
+ for (s = argv[0], commas = 0; *s; ++s)
+ if (*s == ',') ++commas;
+
+ if (commas % 2 == 0) /* There must be an even number of
+ attack/decay parameters */
+ fail("compander: Odd number of attack & decay rate parameters");
+
+ rates = 1 + commas/2;
+ if ((l->attackRate = malloc(sizeof(double) * rates)) == NULL ||
+ (l->decayRate = malloc(sizeof(double) * rates)) == NULL ||
+ (l->volume = malloc(sizeof(double) * rates)) == NULL ||
+ (l->lastSamp = calloc(rates, sizeof(LONG))) == NULL)
+ fail("Out of memory");
+ l->expectedChannels = rates;
+
+ /* Now tokenise the rates string and set up these arrays. Keep
+ them in seconds at the moment: we don't know the sample rate yet. */
+
+ s = strtok(argv[0], ","); i = 0;
+ do {
+ l->attackRate[i] = atof(s); s = strtok(NULL, ",");
+ l->decayRate[i] = atof(s); s = strtok(NULL, ",");
+ ++i;
+ } while (s != NULL);
+
+ /* Same business, but this time for the transfer function */
+
+ for (s = argv[1], commas = 0; *s; ++s)
+ if (*s == ',') ++commas;
+
+ if (commas % 2 == 0) /* There must be an even number of
+ transfer parameters */
+ fail("compander: Odd number of transfer function parameters\n"
+ "Each input value in dB must have a corresponding output value");
+
+ tfers = 3 + commas/2; /* 0, 0 at start; 1, 1 at end */
+ if ((l->transferIns = malloc(sizeof(double) * tfers)) == NULL ||
+ (l->transferOuts = malloc(sizeof(double) * tfers)) == NULL)
+ fail("Out of memory");
+ l->transferPoints = tfers;
+ l->transferIns[0] = 0.0; l->transferOuts[0] = 0.0;
+ l->transferIns[tfers-1] = 1.0; l->transferOuts[tfers-1] = 1.0;
+ s = strtok(argv[1], ","); i = 1;
+ do {
+ if (!strcasecmp(s, "-inf"))
+ fail("Input signals of zero level must always generate zero output");
+ l->transferIns[i] = pow(10.0, atof(s)/20.0);
+ if (l->transferIns[i] > 1.0)
+ fail("dB values are relative to maximum input, and, ipso facto, "
+ "cannot exceed 0");
+ if (l->transferIns[i] == 1.0) /* Final point was explicit */
+ --(l->transferPoints);
+ if (i > 0 && l->transferIns[i] <= l->transferIns[i-1])
+ fail("Transfer function points don't have strictly ascending "
+ "input amplitude");
+ s = strtok(NULL, ",");
+ l->transferOuts[i] = strcasecmp(s, "-inf") ?
+ pow(10.0, atof(s)/20.0) : 0;
+ s = strtok(NULL, ",");
+ ++i;
+ } while (s != NULL);
+
+ /* If there is a postprocessor gain, store it */
+ if (n >= 3) l->outgain = pow(10.0, atof(argv[2])/20.0);
+ else l->outgain = 1.0;
+
+ /* Set the initial "volume" to be attibuted to the input channels.
+ Unless specified, choose 1.0 (maximum) otherwise clipping will
+ result if the user has seleced a long attack time */
+ for (i = 0; i < l->expectedChannels; ++i) {
+ double v = n>=4 ? pow(10.0, atof(argv[3])/20) : 1.0;
+ l->volume[i] = v;
+ }
+ }
+}
+
+/*
+ * Prepare processing.
+ * Do all initializations.
+ */
+void compand_start(effp)
+eff_t effp;
+{
+ compand_t l = (compand_t) effp->priv;
+ int i;
+
+# ifdef DEBUG
+ {
+ printf("Starting compand effect\n");
+ printf("\nRate %ld, size %d, style %d, output gain %g.\n",
+ effp->outinfo.rate, effp->outinfo.size, effp->outinfo.style,
+ l->outgain);
+ printf("%d input channel(s) expected: actually %d\n",
+ l->expectedChannels, effp->outinfo.channels);
+ printf("\nAttack and decay rates\n"
+ "======================\n");
+ for (i = 0; i < l->expectedChannels; ++i)
+ printf("Channel %d: attack = %-12g decay = %-12g\n",
+ i, l->attackRate[i], l->decayRate[i]);
+ printf("\nTransfer function (linear values)\n"
+ "================= =============\n");
+ for (i = 0; i < l->transferPoints; ++i)
+ printf("%12g -> %-12g\n",
+ l->transferIns[i], l->transferOuts[i]);
+ }
+# endif
+
+ /* Convert attack and decay rates using number of samples */
+
+ for (i = 0; i < l->expectedChannels; ++i) {
+ if (l->attackRate[i] > 1.0/effp->outinfo.rate)
+ l->attackRate[i] = 1.0 -
+ exp(-1.0/(effp->outinfo.rate * l->attackRate[i]));
+ else
+ l->attackRate[i] = 1.0;
+ if (l->decayRate[i] > 1.0/effp->outinfo.rate)
+ l->decayRate[i] = 1.0 -
+ exp(-1.0/(effp->outinfo.rate * l->decayRate[i]));
+ else
+ l->decayRate[i] = 1.0;
+ }
+}
+
+/*
+ * Update a volume value using the given sample
+ * value, the attack rate and decay rate
+ */
+
+static inline void doVolume(double *v, double samp, compand_t l, int chan)
+{
+ double s = samp/(~((LONG)1<<31));
+ double delta = s - *v;
+
+ if (delta > 0.0) /* increase volume according to attack rate */
+ *v += delta * l->attackRate[chan];
+ else /* reduce volume according to decay rate */
+ *v += delta * l->decayRate[chan];
+}
+
+/*
+ * Processed signed long samples from ibuf to obuf.
+ * Return number of samples processed.
+ */
+
+void compand_flow(effp, ibuf, obuf, isamp, osamp)
+eff_t effp;
+LONG *ibuf, *obuf;
+int *isamp, *osamp;
+{
+ compand_t l = (compand_t) effp->priv;
+ int len = (*isamp > *osamp) ? *osamp : *isamp;
+ int filechans = effp->outinfo.channels;
+ int done;
+
+ for (done = 0; done < len;
+ done += filechans, obuf += filechans, ibuf += filechans) {
+ int chan;
+
+ /* Maintain the volume fields by simulating a leaky pump circuit */
+
+ for (chan = 0; chan < filechans; ++chan) {
+ if (l->expectedChannels == 1 && filechans > 1) {
+ /* User is expecting same compander for all channels */
+ int i;
+ double maxsamp = 0.0;
+ for (i = 0; i < filechans; ++i) {
+ double rect = fabs(ibuf[i]);
+ if (rect > maxsamp) maxsamp = rect;
+ }
+ doVolume(&l->volume[0], maxsamp, l, 0);
+ break;
+ } else
+ doVolume(&l->volume[chan], fabs(ibuf[chan]), l, chan);
+ }
+
+ /* Volume memory is updated: perform compand */
+
+ for (chan = 0; chan < filechans; ++chan) {
+ double v = l->expectedChannels > 1 ?
+ l->volume[chan] : l->volume[0];
+ double outv;
+ int piece;
+
+ for (piece = 1 /* yes, 1 */;
+ piece < l->transferPoints;
+ ++piece)
+ if (v >= l->transferIns[piece - 1] &&
+ v < l->transferIns[piece])
+ break;
+
+ outv = l->transferOuts[piece-1] +
+ (l->transferOuts[piece] - l->transferOuts[piece-1]) *
+ (v - l->transferIns[piece-1]) /
+ (l->transferIns[piece] - l->transferIns[piece-1]);
+
+ obuf[chan] = ibuf[chan]*(outv/v)*l->outgain;
+
+ }
+ }
+
+ *isamp = len; *osamp = len;
+}
--- a/src/handlers.c
+++ b/src/handlers.c
@@ -452,6 +452,10 @@
extern void chorus_drain();
extern void chorus_stop();
+extern void compand_getopts();
+extern void compand_start();
+extern void compand_flow();
+
extern void copy_getopts();
extern void copy_start();
extern void copy_flow();
@@ -589,6 +593,9 @@
{"chorus", 0,
chorus_getopts, chorus_start, chorus_flow,
chorus_drain, chorus_stop},
+ {"compand", EFF_MCHAN,
+ compand_getopts, compand_start, compand_flow,
+ null_drain, nothing},
{"copy", EFF_MCHAN,
copy_getopts, copy_start, copy_flow, null_drain, nothing},
{"cut", EFF_MCHAN,
--- a/src/sox.c
+++ b/src/sox.c
@@ -166,6 +166,12 @@
}
else {
+ if ((ft->fp = fopen(ofile, READBINARY)) != NULL)
+ {
+ fclose(ft->fp);
+ fail("File '%s' already exists.", ofile);
+ }
+
ft->fp = fopen(ofile, WRITEBINARY);
if (ft->fp == NULL)
--- a/src/testall.bat
+++ b/src/testall.bat
@@ -10,7 +10,9 @@
echo cls >>t.bat
echo echo Format: %%format%% Options: %%opts%% >>t.bat
echo echo on >>t.bat
+echo del %%tmp%%\monkey.%%format%%
echo .\sox monkey.voc %%opts%% %%tmp%%\monkey.%%format%% %%effect%% >>t.bat
+echo del %%tmp%%\monkey1.voc
echo .\sox %%opts%% %%tmp%%\monkey.%%format%% %%tmp%%\monkey1.voc %%effect%% >>t.bat
echo @echo off >>t.bat
echo echo. >>t.bat
@@ -27,6 +29,7 @@
call t.bat 8svx
call t.bat aiff
call t.bat au
+call t.bat avr
call t.bat cdr
call t.bat cvs
call t.bat dat
--- a/src/testall.sh
+++ b/src/testall.sh
@@ -5,12 +5,15 @@
opts="$*"
echo "Format: $format Options: $opts"
+ rm /tmp/monkey.$format
./sox monkey.voc $opts /tmp/monkey.$format $effect
+ rm /tmp/monkey1.voc
./sox $opts /tmp/monkey.$format /tmp/monkey1.voc $effect
}
t 8svx
t aiff
t au
+t avr
t cdr
t cvs
t dat
--- a/src/util.c
+++ b/src/util.c
@@ -259,7 +259,7 @@
{
if (ft->info.rate == 0)
fail("Sampling rate for %s file was not given\n", ft->filename);
- if ((ft->info.rate < 100) || (ft->info.rate > 50000L))
+ if ((ft->info.rate < 100) || (ft->info.rate > 999999L))
fail("Sampling rate %lu for %s file is bogus\n",
ft->info.rate, ft->filename);
if (ft->info.size == -1)
--- a/src/wav.c
+++ b/src/wav.c
@@ -887,7 +887,7 @@
ft->info.style == ALAW) &&
!wav->second_header)
{
- warn("Do not support Unsigned, ulaw, or alay with 16 bit data. Forcing to Signed");
+ warn("Do not support Unsigned, ulaw, or alaw with 16 bit data. Forcing to Signed");
ft->info.style = SIGN2;
}
break;