#!/bin/bash # # AudioScope.sh # # At this point I will include and say thank you to "Corona688", a member of http://www.unix.com for his input... # Also to others on the same site for their input too. # Many thanks also go to the guys who have helped with this on http://www.linuxformat.com for all your input too... # # Tested in SOX mode on this Macbook Pro 13 inch, OSX 10.7.5 with the SOX sinewave generator enabled. # Tested in /dev/dsp mode on an aging HP notebook running Debian 6.0.x with the /dev/dsp sinewave generator enabled. # Tested in /dev/dsp mode on an Acer Aspire One netbook booting from a USB stick running PCLinuxOS 2009; also with # the /dev/dsp sinewave generator enabled. # Tested on all three in DEMO mode. # # Added the first simple circuit at the end of this script. # # Relevant pointers to help:- # http://wisecracker.host22.com/public/AudioScope_Manual.readme # http://wisecracker.host22.com/public/cal_draw.jpg # http://wisecracker.host22.com/public/cal_plot.jpg # http://wisecracker.host22.com/public/mic_ear1.jpg # http://wisecracker.host22.com/public/mic_ear2.jpg # http://wisecracker.host22.com/public/mic_ear3.jpg # http://wisecracker.host22.com/public/mic_ear4.jpg # # The latest vesrion will always be here:- # http://www.unix.com/shell-programming-scripting/212939-start-simple-audio-scope-shell-script.html # # NOTE TO SELF:- Remove "/tmp" and replace with "~" when ready, AND, "/tmp" is automatically cleared on this machine per reboot. # ######################################################### # FOR SOund eXchance USERS ONLY!!! TESTED!!! # The lines below, from ">" to "xterm", will generate a new shell script and execute it in a new xterm terminal... # Just EDIT out the comments and then EDIT the line pointing to the correct to use it. # It assumes that you have SoX installed. When this script is run it generates a 1KHz sinewave in a separate window # that lasts for 8 seconds. Just press ENTER when this window is active and it will repeat again. To quit this script # and close the window just press Ctrl-C. This generator will be needed for the calibration of some timebase ranges. #> /tmp/1KHz-Test.sh #chmod 744 /tmp/1KHz-Test.sh #printf '#!/bin/bash\n' >> /tmp/1KHz-Test.sh #printf '> /tmp/sinewave.raw\n' >> /tmp/1KHz-Test.sh #printf 'data="\\\\x80\\\\x26\\\\x00\\\\x26\\\\x7F\\\\xD9\\\\xFF\\\\xD9"\n' >> /tmp/1KHz-Test.sh #printf 'for waveform in {0..8191}\n' >> /tmp/1KHz-Test.sh #printf 'do\n' >> /tmp/1KHz-Test.sh #printf ' printf "$data" >> /tmp/sinewave.raw\n' >> /tmp/1KHz-Test.sh #printf 'done\n' >> /tmp/1KHz-Test.sh #printf 'while true\n' >> /tmp/1KHz-Test.sh #printf 'do\n' >> /tmp/1KHz-Test.sh #printf ' /full/path/to/sox/play -b 8 -r 8000 -e unsigned-integer /tmp/sinewave.raw\n' >> /tmp/1KHz-Test.sh #printf ' read -p "Press ENTER to rerun OR Ctrl-C to quit:- " -e kbinput\n' >> /tmp/1KHz-Test.sh #printf 'done\n' >> /tmp/1KHz-Test.sh #sleep 1 #xterm -e /tmp/1KHz-Test.sh & # ######################################################### # FOR /dev/dsp USERS ONLY!!! TESTED!!! # The lines below, from ">" to "xterm", will generate a new shell script and execute it in a new xterm terminal... # Just EDIT out the comments to use it. # It assumes that you have /dev/dsp _installed_. When this script is run it generates a 1KHz sinewave in a separate window # that lasts for 8 seconds. Just press ENTER when this window is active and it will repeat again. To quit this script # and close the window just press Ctrl-C. This generator will be needed for the calibration of some timebase ranges. #> /tmp/1KHz-Test.sh #chmod 744 /tmp/1KHz-Test.sh #printf '#!/bin/bash\n' >> /tmp/1KHz-Test.sh #printf '> /tmp/sinewave.raw\n' >> /tmp/1KHz-Test.sh #printf 'data="\\\\x80\\\\x26\\\\x00\\\\x26\\\\x7F\\\\xD9\\\\xFF\\\\xD9"\n' >> /tmp/1KHz-Test.sh #printf 'for waveform in {0..8191}\n' >> /tmp/1KHz-Test.sh #printf 'do\n' >> /tmp/1KHz-Test.sh #printf ' printf "$data" >> /tmp/sinewave.raw\n' >> /tmp/1KHz-Test.sh #printf 'done\n' >> /tmp/1KHz-Test.sh #printf 'while true\n' >> /tmp/1KHz-Test.sh #printf 'do\n' >> /tmp/1KHz-Test.sh #printf ' cat /tmp/sinewave.raw > /dev/dsp\n' >> /tmp/1KHz-Test.sh #printf ' read -p "Press ENTER to rerun OR Ctrl-C to quit:- " -e kbinput\n' >> /tmp/1KHz-Test.sh #printf 'done\n' >> /tmp/1KHz-Test.sh #sleep 1 #xterm -e /tmp/1KHz-Test.sh & # ######################################################### # Variables in use. ifs_str=$IFS version=" \$VER: AudioScope.sh_Version_0.00.70_PD_B.Walker_G0LCU. " setup=" Please wait while the very first scan and configuration file is generated. " # Default first time run capture mode, 0 = DEMO. demo=0 # Draw proceedure mode, 0 = OFF drawline=0 # Pseudo-continuous data file saving. savefile="0000000000" save_string="OFF" # "hold" and "status" will always be reset to "1" on program exit. hold=1 status=1 # "count", "number" and "char" are reusable variables... count=0 number=0 char="?" # Vertical components... # vert_one and vert_two are the vertical plotting points for the draw() function... vert_one=2 vert_two=2 vert=12 vert_shift=2 vshift="?" vert_array="" vert_draw=9 # Display setup... graticule="Public Domain, 2013, B.Walker, G0LCU." # Keyboard components... kbinput="?" tbinput=1 # "str_len" is a reusable variable IF required... str_len=1 # "grab" is used for internal pseudo-synchronisation... grab=0 # "zero_offset" can only be manually changed in the AudioScope.config file, OR, here... zero_offset=-2 # Horizontal components... horiz=9 # Scan retraces... scan=1 scanloops=1 # Timebase variable components... subscript=0 # "scan_start" is from 0 to ( length of file - 64 )... scan_start=0 # "scan_jump" is from 1 to ( ( ( scan_end - scan_start ) / 64) + 1 )... scan_jump=1 # "scan_end" is at least 64 bytes in from the absolute file end... scan_end=47935 # Synchronisation variables... # synchronise switches the syncchroisation ON or OFF... synchronise="OFF" # sync_point is any value between 15 and 240 of the REAL grab(s)... sync_point=128 sync_input="?" # ######################################################### # Add the program tilte to the Terminal title bar... # This may NOT work in every Terminal so just comment it out if it doesn't. printf "\x1B]0;Shell AudioScope.\x07" # ######################################################### # Generate a config file and temporarily store inside /tmp if [ -f /tmp/AudioScope.config ] then . /tmp/AudioScope.config else user_config fi user_config() { > /tmp/AudioScope.config chmod 644 /tmp/AudioScope.config printf "demo=$demo\n" >> /tmp/AudioScope.config printf "drawline=$drawline\n" >> /tmp/AudioScope.config printf "hold=1\n" >> /tmp/AudioScope.config printf "status=1\n" >> /tmp/AudioScope.config printf "zero_offset=$zero_offset\n" >> /tmp/AudioScope.config printf "scanloops=$scanloops\n" >> /tmp/AudioScope.config printf "scan_start=$scan_start\n" >> /tmp/AudioScope.config printf "scan_jump=$scan_jump\n" >> /tmp/AudioScope.config printf "scan_end=$scan_end\n" >> /tmp/AudioScope.config printf "vert_shift=$vert_shift\n" >> /tmp/AudioScope.config printf "setup='$setup'\n" >> /tmp/AudioScope.config printf "save_string='$save_string'\n" >> /tmp/AudioScope.config } # ######################################################### # Screen display setup function. display() { # Set foregound and background graticule colours and foreground and background other window colours. printf "\x1B[0;36;44m" clear graticule=" +-------+-------+-------+---[\x1B[0;37;44mDISPLAY\x1B[0;36;44m]---+-------+-------+--------+ \n" graticule=$graticule" | | | | + | | | | \n" graticule=$graticule" | | | | + | | | | \n" graticule=$graticule" | | | | + | | | | \n" graticule=$graticule" +-------+-------+-------+-------+-------+-------+-------+--------+ < \n" graticule=$graticule" | | | | + | | | | \n" graticule=$graticule" | | | | + | | | | \n" graticule=$graticule" | | | | + | | | | \n" graticule=$graticule" 0 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+--+ < \n" graticule=$graticule" | | | | + | | | | \n" graticule=$graticule" | | | | + | | | | \n" graticule=$graticule" | | | | + | | | | \n" graticule=$graticule" +-------+-------+-------+-------+-------+-------+-------+--------+ < \n" graticule=$graticule" | | | | + | | | | \n" graticule=$graticule" | | | | + | | | | \n" graticule=$graticule" | | | | + | | | | \n" graticule=$graticule" | | | | + | | | | \n" graticule=$graticule" +-------+-------+-------+-------+-------+-------+-------+--------+ \n" graticule=$graticule" \x1B[0;37;40m+-----------------------------[COMMAND WINDOW]------------------------------+\x1B[0;37;44m \n" graticule=$graticule" \x1B[0;37;40m| COMMAND:- |\x1B[0;37;44m \n" graticule=$graticule" \x1B[0;37;40m+------------------------------[STATUS WINDOW]-------------------------------+\x1B[0;37;44m \n" graticule=$graticule" \x1B[0;37;40m| Stopped... |\x1B[0;37;44m \n" graticule=$graticule" \x1B[0;37;40m|$setup|\x1B[0;37;44m \n" graticule=$graticule" \x1B[0;37;40m+----------------------------------------------------------------------------+\x1B[0;37;44m " printf "$graticule" # Set the colours for plotting. printf "\x1B[1;37;44m" } # ######################################################### # Pick which method to capture, (and store), the waveform on the fly. waveform() { > /tmp/waveform.raw chmod 644 /tmp/waveform.raw # Demo mode, generate 48000 bytes of random data. if [ $demo -eq 0 ] then # Use "sleep" to simulate a 1 second burst. sleep 1 # "/dev/urandom is now used instead of RANDOM as it is MUCH faster. dd if=/dev/urandom of=/tmp/waveform.raw bs=48000 count=1 fi # Using the aging(/old) /dev/dsp device, mono, 8 bits per sample and 8KHz sampling rate, 8000 unsigned-integer bytes of data... # Now tested on PCLinuxOS 2009 and Debian 6.0.x. if [ $demo -eq 1 ] then # This uses the oss-compat installation from your distro's repository... dd if=/dev/dsp of=/tmp/waveform.raw bs=8000 count=1 fi # The main means of obtaining the unsigned-integer data, using SoX, (Sound eXcahnge) from http://sox.sourceforge.net ... if [ $demo -eq 2 ] then # Change the absolute address for your location of "sox"... /Users/barrywalker/Downloads/sox-14.4.0/sox -q -V0 -d -t raw -r 48000 -b 8 -c 1 -e unsigned-integer -> /tmp/waveform.raw trim 0 00:01 fi } # ######################################################### # Plot the points inside the window... plot() { subscript=$scan_start vert_array="" for horiz in {9..72} do vert=`hexdump -n1 -s$subscript -v -e '1/1 "%u"' /tmp/waveform.raw` # Add a small offset to give a straight line with zero input allowing for mid-point sound card bit error. vert=$[ ( $vert + $zero_offset ) ] if [ $vert -le 0 ] then vert=0 fi if [ $vert -ge 255 ] then vert=255 fi # Pseudo-vertical shift of + or - 1 vertical division maximum. vert=$[ ( ( $vert / 16 ) + $vert_shift ) ] # Ensure the plot is NOT out of bounds after moving the shift position. if [ $vert -le 2 ] then vert=2 fi if [ $vert -ge 17 ] then vert=17 fi subscript=$[ ( $subscript + $scan_jump ) ] # Generate a smple space delimited 64 sample array. vert_array="$vert_array$vert " printf "\x1B[1;37;44m\x1B["$vert";"$horiz"f*" done # Set end of plot to COMMAND window. printf "\x1B[0;37;40m\x1B[20;14f" } # ######################################################### # This function connects up the plotted points. # Defaults to OFF on the very first time run and must be manually enabled if needed. draw() { statusline IFS=" " subscript=0 number=0 vert_one=2 vert_two=2 vert_draw=( $vert_array ) for horiz in {9..71} do # Obtain the two vertical components. vert_one=${vert_draw[ $subscript ]} subscript=$[ ( $subscript + 1 ) ] vert_two=${vert_draw[ $subscript ]} # Now subtract them and obtain an absolute value - ALWAYS 0 to positive... number=$[ ( $vert_two - $vert_one ) ] number=${number#-} # This decision section _is_ needed. if [ $number -le 1 ] then : # NOP. Do nothing... fi # This section does the drawing... if [ $number -ge 2 ] then if [ $vert_one -gt $vert_two ] then vert_one=$[ ( $vert_one - 1 ) ] while [ $vert_one -gt $vert_two ] do printf "\x1B[1;37;44m\x1B["$vert_one";"$horiz"f*" vert_one=$[ $vert_one - 1 ] done fi if [ $vert_two -gt $vert_one ] then vert_one=$[ ( $vert_one + 1 ) ] while [ $vert_one -lt $vert_two ] do printf "\x1B[1;37;44m\x1B["$vert_one";"$horiz"f*" vert_one=$[ $vert_one + 1 ] done fi fi IFS=$ifs_str done # Set end of plot to COMMAND window. printf "\x1B[0;37;40m\x1B[20;14f" } # ######################################################### # This is the information line _parser_... statusline() { printf "\x1B[0;37;40m\x1B[22;3f \x1B[22;4f" if [ $status -eq 0 ] then printf "Stopped..." fi if [ $status -eq 1 ] then printf "Running $scan of $scanloops scans..." fi if [ $status -eq 2 ] then printf "Running in single shot storage mode..." fi if [ $status -eq 3 ] then printf "Drawing the scan..." fi if [ $status -eq 4 ] then printf "Synchroniastion set to $sync_point$synchronise..." fi if [ $status -eq 5 ] then printf "CAUTION, AUTO-SAVING FACILITY ENABLED!!!" fi if [ $status -eq 254 ] then status=1 setup=$version printf "\x1B[23;3f$setup" fi # Set end of plot to COMMAND window. printf "\x1B[0;37;40m\x1B[20;14f" } # ######################################################### # All keyboard commands appear here when the scanning stops; there will be lots of them to make subtle changes... kbcommands() { IFS=$ifs_str status=1 scan=1 read -p "Press to (re)run, HELP or QUIT " -e kbinput printf "\x1B[0;37;40m\x1B[20;14f " # Rerun scans captured or stored. if [ "$kbinput" == "" ] then status=1 statusline fi # Run scans in captured, (REAL scan), mode only. if [ "$kbinput" == "RUN" ] then status=1 hold=1 statusline fi # Swtich off capture mode and rerun one storage shot only, this disables the DRAW command. # Use DRAW to re-enable again. This is deliberate for slow machines... if [ "$kbinput" == "HOLD" ] then drawline=0 status=2 hold=0 scanloops=1 statusline sleep 1 fi # Quit the program. if [ "$kbinput" == "QUIT" ] then status=255 break fi # Display the _online_ HELP file in default terminal colours. if [ "$kbinput" == "HELP" ] then status=0 scanloops=1 hold=0 commandhelp fi # Enable DEMO pseudo-capture mode, default, but with 10 sweeps... if [ "$kbinput" == "DEMO" ] then status=1 scan_start=0 scan_jump=1 scanloops=10 scan_end=47935 demo=0 hold=1 statusline sleep 1 fi # Enable /dev/dsp capture mode, if your Linux flavour does NOT have it, install oss-compat from the distro's repository. # This is the mode used to test on Debian 6.0.x and now PCLinuxOS 2009... if [ "$kbinput" == "DSP" ] then status=1 scan_start=0 scan_jump=1 scanloops=1 scan_end=7935 hold=1 demo=1 statusline sleep 1 fi # Eable SOX capture mode, this code is designed around this application on a Macbook Pro 13 inch OSX 10.7.5... if [ "$kbinput" == "SOX" ] then status=1 scan_start=0 scan_jump=1 scanloops=1 scan_end=47935 hold=1 demo=2 statusline sleep 1 fi # The next three commands set the timebase scans; 1, 10 or 100 before COMMAND mode is re-enabled and can be used. if [ "$kbinput" == "ONE" ] then status=1 scanloops=1 hold=1 fi if [ "$kbinput" == "TEN" ] then status=1 scanloops=10 hold=1 fi if [ "$kbinput" == "HUNDRED" ] then status=1 scanloops=100 hold=1 fi if [ "$kbinput" == "VER" ] then status=254 fi # ************ Horizontal components. ************* # ************ User timebase section. ************* # Written longhand for kids to understand. if [ "$kbinput" == "TBVAR" ] then # Ensure capture mode is turned off. # RUN will re-enable it if required. scanloops=1 status=1 hold=0 printf "\x1B[0;37;40m\x1B[20;14f" read -p "Set timebase starting point. From 0 to $scan_end " -e tbinput printf "\x1B[0;37;40m\x1B[20;14f \x1B[0;37;40m\x1B[20;14f" # Ensure the timebase values are set to default before changing. scan_start=0 scan_jump=1 # Eliminate any keyboard error longhand... # Ensure a NULL string does NOT exist. if [ "$tbinput" == "" ] then scan_start=0 tbinput=0 fi # Find the length of the inputted string. str_len=`printf "${#tbinput}"` # Set the string to the correct last position for the _subscript_ point. str_len=$[ ( $str_len - 1 ) ] # Now check for continuous numerical charaters ONLY. for count in $( seq 0 $str_len ) do # Reuse variable _number_ to obtain each character per loop. number=`printf "${tbinput:$count:1}"` # Now convert the character to a decimal number. number=`printf "%d" \'$number` # IF ANY ASCII character exists that is not numerical then reset the scan start point. if [ $number -le 47 ] then scan_start=0 tbinput=0 fi if [ $number -ge 58 ] then scan_start=0 tbinput=0 fi done # If all is OK pass the "tbinput" value into the "scan_start" variable. scan_start=$tbinput # Do a final check that the number is not out of bounds. if [ $scan_start -le 0 ] then scan_start=0 fi if [ $scan_start -ge $scan_end ] then scan_start=$scan_end fi # Use exactly the same method as above to determine the jump interval. # Now set the jump interval, this is the scan speed... printf "\x1B[0;37;40m\x1B[20;14f" read -p "Set timebase user speed. From 1 to $[ ( ( ( ( $scan_end - $scan_start ) / 64 ) + 1 ) ) ] " -e tbinput printf "\x1B[0;37;40m\x1B[20;14f \x1B[0;37;40m\x1B[20;14f" # Eliminate any keyboard error longhand... # Ensure a NULL string does NOT exist. if [ "$tbinput" == "" ] then scan_jump=1 tbinput=1 fi # Find the length of the inputted string. str_len=`printf "${#tbinput}"` # Set the string to the correct last position for the _subscript_ point. str_len=$[ ( $str_len - 1 ) ] # Now check for continuous numerical charaters ONLY. for count in $( seq 0 $str_len ) do # Reuse variable _number_ to obtain each character per loop. number=`printf "${tbinput:$count:1}"` # Now convert the character to a decimal number. number=`printf "%d" \'$number` # IF ANY ASCII character exists that is not numerical then reset the scan jump value. if [ $number -le 47 ] then scan_jump=1 tbinput=1 fi if [ $number -ge 58 ] then scan_jump=1 tbinput=1 fi done # If all is OK pass the "tbinput" value into the "scan_jump" variable. scan_jump=$tbinput # Do a final check that the number is not out of bounds. if [ $scan_jump -le 1 ] then scan_jump=1 fi # Reuse number for upper limit... number=$[ ( ( ( $scan_end - $scan_start ) / 64 ) + 1 ) ] if [ $scan_jump -ge $number ] then scan_jump=$number fi printf "\x1B[0;37;40m\x1B[22;4fScan start at offset $scan_start, with a jump rate of $scan_jump." sleep 1 setup=" Uncalibrated horizontal scan, vertical and storage modes, AC coupled only. " fi # ********** User timebase section end. *********** # ********* Calibrated timebase section. ********** if [ "$kbinput" == "FASTEST" ] then scan_start=0 scan_jump=1 setup=" Uncalibrated horizontal scan, vertical and storage modes, AC coupled only. " fi if [ "$kbinput" == "1mS" ] then scan_start=0 setup=" 1mS/DIV, uncalibrated vertical and storage modes, AC coupled only. " if [ $demo -eq 0 ] then scan_jump=6 fi if [ $demo -eq 1 ] then scan_jump=1 fi if [ $demo -eq 2 ] then scan_jump=6 fi fi if [ "$kbinput" == "10mS" ] then scan_start=0 setup=" 10mS/DIV, uncalibrated vertical and storage modes, AC coupled only. " if [ $demo -eq 0 ] then scan_jump=60 fi if [ $demo -eq 1 ] then scan_jump=10 fi if [ $demo -eq 2 ] then scan_jump=60 fi fi if [ "$kbinput" == "100mS" ] then scan_start=0 setup=" 100mS/DIV, uncalibrated vertical and storage modes, AC coupled only. " if [ $demo -eq 0 ] then scan_jump=600 fi if [ $demo -eq 1 ] then scan_jump=100 fi if [ $demo -eq 2 ] then scan_jump=600 fi fi # *********** Calibrated timebase end. ************ # # ************* Vertical components. ************** # ******** Pseudo-vertical shift control. ********* if [ "$kbinput" == "SHIFT" ] then while true do scanloops=1 status=1 hold=0 printf "\x1B[0;37;40m\x1B[20;14f" # This input method is something akin to BASIC's INKEY$... read -p "Vertical shift:- U for up 1, D for down 1, to RETURN:- " -n 1 -s vshift printf "\x1B[0;37;40m\x1B[20;14f \x1B[0;37;40m\x1B[20;14f" if [ "$vshift" == "" ] then break fi if [ "$vshift" == "D" ] then vert_shift=$[ ( $vert_shift + 1 ) ] fi if [ "$vshift" == "U" ] then vert_shift=$[ ( $vert_shift - 1 ) ] # Ensure the shift psoition is NOT out of bounds. fi if [ $vert_shift -ge 6 ] then vert_shift=6 fi if [ $vert_shift -le -2 ] then vert_shift=-2 fi printf "\x1B[23;3f Vertical shift is $[ ( 2 - $vert_shift ) ] from the mid-point position... " done fi # ****** Pseudo-vertical shift control end. ******* # ********** Connect all plotted points. ********** if [ "$kbinput" == "DRAW" ] then drawline=1 status=3 hold=0 scanloops=1 statusline sleep 1 fi # ************* Connected plots done. ************* # # **** PSEUDO synchronisation and triggering. **** if [ "$kbinput" == "TRIG" ] then synchronise=" and OFF" sync_point=128 status=0 hold=0 scan_start=$[ ( $scan_start + 1 ) ] scan_jump=1 scanloops=1 subscript=$scan_start grab=0 if [ $scan_start -ge $scan_end ] then scan_start=0 break fi printf "\x1B[0;37;40m\x1B[20;14f" read -p "Set trigger type, to disable:- " -e kbinput printf "\x1B[0;37;40m\x1B[20;14f \x1B[0;37;40m\x1B[20;14f" if [ "$kbinput" == "SYNCEQ" ] then synchronise=", ON and fixed" trigger for subscript in $( seq $scan_start $scan_end ) do grab=`hexdump -n1 -s$subscript -v -e '1/1 "%u"' /tmp/waveform.raw` if [ $grab -eq $sync_point ] then scan_start=$subscript break fi done fi if [ "$kbinput" == "SYNCGT" ] then synchronise=", ON and positive going" trigger : # NOP... Place holder only. fi if [ "$kbinput" == "SYNCLT" ] then synchronise=", ON and negative going" trigger : # NOP... Place holder only... fi if [ "$kbinput" == "EXT" ] then # Remember Corona688's code from the early stages of this thread... synchronise=", EXTERNAL and waiting" : # NOP... Place holder only, fi status=4 statusline sleep 1 fi # ** PSEUDO synchronisation and triggering end. *** # # ************* Auto-saving facility. ************* if [ "$kbinput" == "SAVEON" ] then status=5 save_string="ON" statusline sleep 2 fi if [ "$kbinput" == "SAVEOFF" ] then status=1 save_string="OFF" statusline fi # *********** Auto-saving facility end. *********** statusline } # ######################################################### # Help clears the screen to the startup defaults and prints command line help... commandhelp() { status=2 hold=0 printf "\x1B[0m" clear printf "CURRENT COMMANDS AVAILABLE:-\n\n" printf " ................................................. Reruns the scan(s) again.\n" printf "RUN ......................... Reruns the scan(s), always with real captures.\n" printf "QUIT .................................................... Quits the program.\n" printf "HELP ................................................ This help as required.\n" printf "HOLD ........................................ Switch to pseudo-storage mode.\n" printf "DEMO .......... Switch capture to default DEMO mode and 10 continuous scans.\n" printf "DSP ...................... Switch capture to Linux /dev/dsp mode and 1 scan.\n" printf "SOX ....... Switch capture to multi-platform SOund eXchange mode and 1 scan.\n" printf "ONE ......................................... Sets the number of scans to 1.\n" printf "TEN ........................................ Sets the number of scans to 10.\n" printf "HUNDRED ............. Sets the number of scans to 100, (not very practical).\n" printf "VER .................. Displays the version number inside the status window.\n" printf "TBVAR ............ Set up uncalibrated user timebase offset and jump points.\n" printf " SubCommands: ............................. Follow the on screen prompts.\n" printf "FASTEST .................. Set all modes to the fastest possible scan speed.\n" printf "1mS .......................................... Set scanning rate to 1mS/DIV.\n" printf "10mS ........................................ Set scanning rate to 10mS/DIV.\n" printf "100mS ...................................... Set scanning rate to 100mS/DIV.\n" printf "SHIFT ............ Set the vertical position from -4 to +4 to the mid-point.\n" printf " SubCommands: ............ Press U or D then when value is obtained.\n" printf "\n" read -p "Press to continue:- " -e kbinput clear printf "CURRENT COMMANDS AVAILABLE:-\n\n" printf "DRAW .......... Connect up each vertical plot to give a fully lined display.\n" printf "TRIG ........... Sets the synchronisation methods for storage mode retraces.\n" printf " SubCommand: SYNCEQ ........ Set the internal SYNC to a fixed value only.\n" printf " SubCommand: SYNCGT ......................................... Unfinished.\n" printf " SubCommand: SYNCLT ......................................... Unfinished.\n" printf " SubCommand: EXT ............................................ Unfinished.\n" printf "SAVEON .................... Auto-saves EVERY scan with a numerical filename.\n" printf "SAVEOFF ....................................... Disables auto-save facility.\n" printf "\n" printf "Manual here: < http://wisecracker.host22.com/public/AudioScope_Manual.readme >\n" printf "\n" read -p "Press to continue:- " -e kbinput display statusline } # ######################################################### # This is the active part of the pseudo-synchroisation section. trigger() { while true do printf "\x1B[0;37;40m\x1B[20;14f" # This input method is something akin to BASIC's INKEY$... read -p "Sync point:- U for up 1, D for down 1, to RETURN:- " -n 1 -s sync_input printf "\x1B[0;37;40m\x1B[20;14f \x1B[0;37;40m\x1B[20;14f" if [ "$sync_input" == "" ] then break fi if [ "$sync_input" == "U" ] then sync_point=$[ ( $sync_point + 1 ) ] fi if [ "$sync_input" == "D" ] then sync_point=$[ ( $sync_point - 1 ) ] # Ensure the synchronisation point is NOT out of bounds. fi if [ $sync_point -ge 240 ] then sync_point=240 fi if [ $sync_point -le 15 ] then sync_point=15 fi printf "\x1B[23;3f Synchronisation point set to $sync_point... " done } # ######################################################### # Do an initial screen set up... display statusline setup=$version # ######################################################### # This is the main loop... while true do for scan in $( seq 1 $scanloops ) do # "hold" determines a new captured scan or retrace of an existing scan... if [ $hold -eq 1 ] then waveform fi display statusline plot if [ $drawline -eq 1 ] then draw fi if [ "$save_string" == "ON" ] then savefile=`date +%s` cp /tmp/waveform.raw /tmp/$savefile fi done status=0 statusline kbcommands done # ######################################################### # Getout, autosave AudioScope.config, cleanup and quit... if [ $status -eq 255 ] then # Save the user configuration file. user_config # Remove "Shell AudioScope" from the title bar. printf "\x1B]0;\x07" sleep 0.1 # Reset back to normal... printf "\x1B[0m" clear reset fi printf "\nProgram terminated...\n\nTerminal reset back to startup defaults...\n\n" # ######################################################### # The FIRST extremely simple construction part. # This is a simple I/O board for testing for the Macbook Pro 13 inch... # It is just as easy to replace the 4 pole 3.5mm Jack Plug with 2 x 3.5mm Stereo Jack # Plugs for machines with separate I/O sockets. # Orange. White flylead. # Tip -----> O <------------------------------------+---------O <----------+--------+ # Ring 1 --> H <-------------------------+-----------)--------O <- Blue. | | # Ring 2 --> H <--------------+-----+-----)----------)--------O <- Yellow. | | # _Gnd_ ---> H <----+ | C1 | + | | O <- Green. | | # +===+ | \ ===== \ \ | \ | # | | | / --+-- / / | / | # P1 | | | \ | \ \ | \ | # | | | R1 / | R2 / R3 / | R4 / | # \ / | \ | \ \ | \ | # H | / | / / | / | # ~~~ | | | | | | | | # +---------+------)---+----------+---------+------------+ | # Pseudo-Ground. -> __|__ | | # ///// +-----------------------------------------------+ # P1 ......... 3.5mm, 4 pole jack plug. # R1 ......... 2K2, 1/8W, 5% tolerence resistor. # R2, R3 ..... 33R, 1/8W, 5% tolerence resistor. # R4 ......... 1M, 1/8W, 5% tolerence resistor. # C1 ......... 47uF, 16V electrolytic. # 4 way terminal block. # Stripboard, (Verobaord), as required. # Green, yellow, orange, blue and white wire as required. # Small cable ties, optional. # Stick on cable clip, optional. # Crimp terminal, 1 off, optional. # #########################################################