Hi all...
Well I have not been inactive but working out how to make OSX 10.14.x command line audio player have a variable sample rate.
This is a back door as afplay
does not have a sample rate flag unlike aplay
for ALSA, in Linux flavours.
This is a DEMO only but a derivative of it will be used in a kids level, variable, AUDIO Function Generator from around 50HZ to 20KHz for pure audio use.
The other limitation is that the shell script must adhere to full POSIX compliance.
I use dash
in the script but it should work on the majority of shells.
How does it work?
Well it creates the file everytime you run the script in the following order:
First the frequency '$1' is converted to the big endian word, hex, sample rate.
Next the bytes are extracted and converted to octal.
Finally these octal bytes are reversed and a string created in the correct order.
Now the 'WAV' header is built up using octal values with the 'RATE' placed in the middle.
After that the 'DATA' is added which makes the whole file 65580 bytes in size.
Although this was designed purely for OSX's command line audio player it also works with the ALSA's one too.
USAGE: [./]VFO.sh <Integer FREQUENCY value from 250 to 6000>
As it is a DEMO there is only limited error detection!
#/usr/local/bin/dash
# #!/bin/sh
#
# USAGE" [./]VFO.sh <Integer FREQUENCY value from 250 to 6000>
FREQ=$1
if [ "${FREQ}" = "" ]
then
FREQ=1000
fi
if [ ${FREQ} -lt 250 ] || [ ${FREQ} -gt 6000 ]
then
FREQ=1000
fi
# Get individual little endian words, convert to bytes, reverse and convert to octal.
RATE=$( printf "%04x" $(( FREQ * 8 )) )
BYTE2='\'$( printf "%03o" "0x${RATE%??}" )
BYTE1='\'$( printf "%03o" "0x${RATE#??}" )
# The RATE string to be inserted into the header.
RATE="${BYTE1}${BYTE2}"'\000\000'"${BYTE1}${BYTE2}"
# Create the wav header, 44 bytes in size.
: > /tmp/sine.wav
printf "%b" "\122\111\106\106\044\000\001\000\127\101\126\105\146\155\164\040\020\000\000\000\001\000\001\000" >> /tmp/sine.wav
printf "%b" "${RATE}" >> /tmp/sine.wav
printf "%b" "\000\000\001\000\010\000\144\141\164\141\000\000\001\000" >> /tmp/sine.wav
# Add the sinewave data, 65536 bytes in size.
DATA="Oq~qO- -"
COUNTER=0
while [ ${COUNTER} -le 12 ]
do
DATA=${DATA}${DATA}
COUNTER=$(( COUNTER + 1 ))
done
# Entire filesize 65580 bytes, 8+ seconds long for 1000[Hz].
printf "%b" "${DATA}" >> /tmp/sine.wav
# OSX command line player.
afplay /tmp/sine.wav > /dev/null 2>&1
# ALSA command line player.
aplay /tmp/sine.wav > /dev/null 2>&1
Enjoy...
Bazza.