#!/usr/bin/python
#
# AudioScope.py
#
# DEMO LF Audio Oscilloscope using /dev/dsp inside Linux.
# Original copyright, (C)2011, B.Walker, G0LCU.
# Initially issued to LXF under the MIT licence.
#
# The timebase runs vertically and the waveform amplitude horizontally.
# It grabs a sample for about 1 second and displays the results AFTER
# the sample; technically a basic LF Storage Audio Oscilloscope.
#
# The display only uses standard ASCII characters.
#
# To run just type from the prompt ">>>"...
# >>> execfile("/full/path/to/AudioScope.py")<RETURN/ENTER>
#
# Tested on Python 2.6.x only but should work on other versions of 2.x.x.
# Ensure /dev/dsp exists; if not install oss-compat from your distro`s
# repository. Also ensure the sound card is not already in use.
#
# Enjoy finding simple solutions to often very difficult problems... ;o)
#
# If you are just trying this out and have an internal mic, just talk
# loudly into the microphone and see your vocal wavefrom on screen...
# Needless to say using the external microphone input as an input this
# becomes a single channel uncalibrated LF Audio Oscilloscope.
#
# Press Ctrl-C to STOP.
# Import any necessary modules.
import os
# Do a basic screen clear.
os.system("clear")
# Turn the cursor off to look prettier... ;o)
os.system("setterm -cursor off")
def main():
# Set special variables global.
global audioscope
global chardisplay
global offset
global timebase
global record
# Known variables.
audioscope = 0
chardisplay = "(C)2011, B.Walker, G0LCU."
offset = 0
timebase = 1
record = "Initial issue to LXF under the MIT licence"
# Throw away local variables.
n = 0
while 1:
# Sample the microphone/external_microphone_input for approximately 1 second.
audio = file('/dev/dsp', 'rb')
record = audio.read(8192)
audio.close()
# This value points to a character in the 8192 byte string.
# "offset" can be any value from 0 to 191.
offset = 0
# Start the loop from character at position 0.
while offset <= 8191:
# Convert the character to a decimal number.
audioscope = ord(record[offset])
# Now convert to 6 bit depth to fit one terminal line.
audioscope = int(audioscope/4)
# This should never occur but don`t allow an error.
if audioscope >= 63: audioscope = 63
if audioscope <= 0: audioscope = 0
# Invert to correct the trace shown.
audioscope = 63 - audioscope
# Loop count to get the correct position to print the plot.
n = 0
# Set the trace position for each line and......
chardisplay = " "
while n <= audioscope:
# ......add the required spaces until completed then......
chardisplay = chardisplay + " "
n = n + 1
# ......print the plot point using *.
print chardisplay + "*"
# Point to the next character to character in the 8192 string.
# "timebase" can be any value from 1 to 360.
offset = offset + timebase
# Assuming a Ctrl-C arrives here enable the cursor again.
os.system("setterm -cursor off")
main()
# End of DEMO.
# Enjoy finding simple solutions to often very difficult problems.