1#!/bin/sh
2# create WAV-Files that can be used to create an audio Test CD
3#
4# The intent of this Test CD is to allow you to test the reproduction
5# quality and response of an audio system by playing back audio
6# of various frequencies and power levels.  Browse through the
7# script comments to see what all audio files are created.
8#
9# all files are created in the current directory
10#
11# Command Line options:
12#   testcd.sh filename_prefix audio_length
13#
14#   filename_prefix is what each soundfile starts with.  Defaults to
15#   using testcd as the prefix.
16#   audio_length is the length of audio data in seconds.  Defaults to 30
17#   seconds.
18
19
20# length of sample file in seconds
21
22if  [ "$2"  = "" ] ; then
23    LENGTH="30"
24else
25    LENGTH=$2
26fi
27# use 'fade' effect for smooth start and end of tone
28FT="0.05"
29
30# a different default volume
31VOL=""
32
33#output file type
34OFT=".wav"
35
36#our binary
37SOX=../src/sox
38
39# filenameprefix
40if  [ "$1" = "" ] ; then
41    PRE="testcd"
42else
43    PRE=$1;
44fi
45# 2 channel 16 bit signed linear int with CD sampling rate
46SOXOPT="-c 2 -r 44100 -e signed-integer -b 16 -n"
47
48# file with list of filenames
49LST="${PRE}.lst"
50
51
52#summarise seconds
53TC="0"
54#summarize file numbers
55FC="0"
56
57
58newname()
59{
60    FC="$(( $FC + 1 ))"
61    LEN="$2"
62    FADE=" fade $FT $LEN $FT"
63
64    TC="$(( $TC + $LEN ))"
65
66    if [ $FC -lt 10 ] ; then
67        NAME="${PRE}_0${FC}_${1}${OFT}"
68    else
69        NAME="${PRE}_${FC}_${1}${OFT}"
70    fi
71    echo -n -e  " \t$1"
72    echo "$NAME" >>$LST
73}
74
75#empty / delete list file
76echo "" >$LST
77
78
79#
80# ok, lets start with the actual creation of the files
81#
82
83#
84# fixed frequencies,
85FREQ="                   19.4  23.1  27.5  32.7  38.9  46.2"
86FREQ="$FREQ  55.0  64.4  77.8  92.5 110.0 130.8 155.6 185.0"
87FREQ="$FREQ 220.0 261.6 311.1 367.0 440.0 523.3 622.3 740.0"
88FREQ="$FREQ 880.0  1046  1245  1480  1760  2093  2489  2960"
89FREQ="$FREQ  3520  4186  4978  5920  7040  8372  9956 11840"
90FREQ="$FREQ 14080 16744 19912"
91#FREQ="5 10 20 50 100 200 500 1000 2000 5000 10000 20000"
92echo "\n--- different frequencies"
93for f in $FREQ; do
94    newname "${f}hz" $LENGTH
95$SOX $SOXOPT $NAME synth $LEN sine $f $FADE $VOL
96done
97
98
99
100#
101# frequency sweep
102# need some mark every octave
103#
104FREQ="220-3520"    #4
105FREQ="55-14080"    # 8 oct
106FREQ="13.75-28160" # 10 oct
107OCT=10
108TOCT=10
109TGES="$(( $OCT * $TOCT ))"
110MARKFREQ=622
111echo "\n--- frequency sweep range $FREQ"
112newname ${FREQ}hz $TGES
113$SOX $SOXOPT $NAME synth $LEN sine $MARKFREQ synth square amod 0.1 0 97 94 vol -3 db synth $LEN sine mix $FREQ  $VOL
114
115FREQ="3520-220"
116FREQ="28160-13.75" # 9 oct
117newname ${FREQ}hz $TGES
118$SOX $SOXOPT $NAME synth $LEN sine $MARKFREQ synth square amod 0.1 0 97 94 vol -3 db synth $LEN sine mix $FREQ  $VOL
119
120# CD frequencies
121FREQ="22050 11025 5512.5 "
122echo "\n--- different frequencies $FREQ"
123for f in $FREQ; do
124    newname "cd${f}hz" $LENGTH
125$SOX $SOXOPT $NAME synth $LEN sine $f $FADE $VOL
126done
127
128
129#
130# similar frequencies
131#
132FREQ1="9000"
133FREQ2="10000"
134echo "\n--- similar frequencies"
135newname ${FREQ1}_${FREQ2} $LENGTH
136$SOX $SOXOPT $NAME synth $LEN sine $FREQ1 synth sine mix $FREQ2 $FADE $VOL
137FREQ1="440"
138FREQ2="445"
139newname ${FREQ1}_${FREQ2} $LENGTH
140$SOX $SOXOPT $NAME synth $LEN sine $FREQ1 synth sine mix $FREQ2 $FADE $VOL
141
142#
143#noise
144#
145echo "\n--- noise"
146newname whitenoise $LENGTH
147$SOX  $SOXOPT $NAME synth $LEN whitenoise $FADE $VOL
148newname pinknoise $LENGTH
149$SOX  $SOXOPT $NAME synth $LEN pinknoise  $FADE $VOL
150newname brownnoise $LENGTH
151$SOX  $SOXOPT $NAME synth $LEN brownnoise $FADE $VOL
152
153
154
155#
156# square waves
157#
158FREQ="100 1000 10000"
159echo "\n--- square waves at $FREQ"
160for f in $FREQ; do
161  newname ${f}_square $LENGTH
162$SOX $SOXOPT $NAME synth $LEN square $f vol -12 db $FADE
163done
164
165
166#
167# different volumes at a few frequencies
168#
169FREQ="100 1000 10000"
170DB="0 12 24 36 48 60 72 84 96"
171echo "\n--- different volumes $DB db at Frequencies $FREQ"
172 for f in $FREQ; do
173   for d in $DB; do
174    newname ${f}_${d}db $LENGTH
175    $SOX $SOXOPT $NAME synth $LEN sine $f  vol -$d db $FADE
176  done
177done
178
179# silence
180echo "\n-- silence"
181newname silence $LENGTH
182$SOX $SOXOPT $NAME synth $LEN sine 1000 vol 0
183
184
185
186
187#
188# volume sweep at different frequencies
189#
190
191FREQ="100 1000 10000"
192MARKFREQ=662
193DB=100 # 10sec for 10db
194echo "\n--- volume sweep 0..100% at Frequencies $FREQ"
195for f in $FREQ; do
196  newname ${f}_dbsweep 200
197$SOX $SOXOPT $NAME synth $LEN sine $f synth exp amod 0.005 0 0 50 $DB
198done
199
200
201#
202# offset test - a 1K sine with 1Hz square offset of 10%
203#
204echo "\n--- offset test, 1KHz tone with 1HZ 10% offset"
205newname offset $LENGTH
206$SOX $SOXOPT $NAME synth $LEN square 1 vol 0.1  synth sine mix 1000 $FADE $VOL
207newname offset1 $LENGTH
208$SOX $SOXOPT $NAME synth $LEN square 1 0 0 square 1 vol 0.1 $FADE
209
210
211
212# effects for different channels
213#
214# silence on one channel, full power on the other - different frequencies
215FREQ="100 1000 10000"
216echo "\n--- single channel"
217for f in $FREQ; do
218 newname ${f}leftchan $LENGTH
219 $SOX $SOXOPT $NAME synth $LEN sine $f synth square amod 0 100 square amod 0   0 $Fade $VOL
220 newname ${f}rightchan $LENGTH
221 $SOX $SOXOPT $NAME synth $LEN sine $f synth square amod 0   0 square amod 0 100 $Fade $VOL
222done
223
224# phase error between channels
225FREQ="100 1000 10000"
226# equal phase/ 24 degrees / 90 degrees / 180 degrees
227PHASE="25"
228echo "\n--- phase error test between channels at $FREQ "
229for f in $FREQ; do
230  for p in $PHASE; do
231    newname ${f}hz_phase${p} $LENGTH
232    $SOX $SOXOPT $NAME synth $LEN sine $f 0 0 sine $f 0 $p  $FADE $VOL
233  done
234done
235
236#
237#
238# end - show statistics
239#
240
241echo "\n------------------\ncreated $FC files with prefix $PRE type $OFT"
242MIN="$(( $TC / 60 ))"
243echo "total length is $TC sec = $MIN min"
244#---------
245
246
247
248
249
250
251
252