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