Hi folks, preamble...
My 3rd upload to this site, hope you enjoy...
This is proof of concept and so far looking good...
For Python-heads, MacBook Pro 13 inch, OSX 10.7.5, Python 2.6.x minimum and an instllation of pyaudio...
You might have to run:-
python2.6<CR>
From a standard Terminal as that is _where_ pyaudio will install by default.
(This might work on new Retina Macbooks too, but I hold no resposibility for the outcome.)
I am attempting to build a kids level project using the external mono microphone input
as an input for a calibrated DC-20KHz Audio Oscilloscope using Python, Tkinter and pyaudio.
(This DEMO test code is being released here first before it is uploaded to the Python section of:-
http://code.activestate.com/ )
The DEMO test code...
Watch for word wrapping etc...
A preliminary Tkinter image of the Scope front end is here, much more needs to be added:-
http://wisecracker.host22.com/public/Scope1.tiff
And a GIF anim of an AMIGA project I did years ago is here:-
http://wisecracker.host22.com/public/SCOPE.GIF
There is no need to make the cable shown in the code as the internal microphone will work for this DEMO...
The DEMO uses ONLY text mode inside a Python Terminal as a proof test.
Read the code for more information...
If you guys like what you see then either reply on here or pass me an email on wisecraker_at_tesco.net...
I am assuming that those who try this out know how to set up the microphone levels, etc, etc...
Assuming this lot works......
The AC component will be 8 bit depth but I don't think I can get the DC component better than 6 bits.
The code is GPL2 but the home made cable modifications are Public Domain...
Enjoy finding simple solutions to often very difficult problems... ;o)
Bazza, G0LCU...
Team AMIGA...
My 3rd upload to this site, hope you enjoy...
This is proof of concept and so far looking good...
For Python-heads, MacBook Pro 13 inch, OSX 10.7.5, Python 2.6.x minimum and an instllation of pyaudio...
You might have to run:-
python2.6<CR>
From a standard Terminal as that is _where_ pyaudio will install by default.
(This might work on new Retina Macbooks too, but I hold no resposibility for the outcome.)
I am attempting to build a kids level project using the external mono microphone input
as an input for a calibrated DC-20KHz Audio Oscilloscope using Python, Tkinter and pyaudio.
(This DEMO test code is being released here first before it is uploaded to the Python section of:-
http://code.activestate.com/ )
The DEMO test code...
Watch for word wrapping etc...
Code:
# SimpleScope_OSX.py
# A standard text mode Python Audio LF Oscilloscope DEMO for a MacBook Pro 13 inch.
# This is the basis for a sound card AF Oscilloscope in development.
#
# Disclaimer:-
#
# You take this information and use it ENTIRELY at your own risk.
# I hold no responsibility for any errors either in this text or with your electronics capabilities...
#
# The reason I have given this away is/was because I needed an audio input for a simple MacBook Pro
# Python Audio-Oscilloscope I am developing for the MacBook Pro 13 inch model.
#
# BEST VIEWED IN PLAIN TEXT!
#
# Input adaptor for the Apple MacBook Pro 13 inch only.
# (This MAY be good for the MBP Retina Versions too!)
#
# Mac_OS Version, OSX 10.7.5...
#
# Machine vintage:- August 2012.
#
# Common 3.5mm Mic/Ear socket cable for external MONO audio input, (and stereo audio output)...
#
# Plug required, (or similar)...
#
# http://www.ebay.co.uk/itm/3-5mm-Mini-Jack-Right-Angle-90-Degree-Solder-4-Pole-Male-Plug-Connector-/320770305756
#
# Resistor, 2K2, 1/8 W, 10% tolerance...
#
# This is the wiring for the auto-switching of the Mic input to external...
#
# Pins. Wiring.
# ----- TIP -------
# 1 ----> O <----- Left Audio Output +ve.
# 2 ----> H <----- Right Audio Output +ve.
# 3 ----> H <----- Mono (Mic) Input, Active.
# 4 ----> H <----- Common To All Inputs And Outputs.
# ---
# | |
# | |______
# |__________|=========
#
# For the auto-switching capability a 2K2 resistor must be connected across Pins 3 and 4. [Mono (Mic) Input, Active and Common]...
#
# Test by plugging into the socket and check that the "System Preferences > Sound" switches over to external input and output.
# Be aware that it takes a few seconds to switch over, it is NOT instantaneous...
#
# You now have two audio outputs at low impedance and an analogue audio input at around 2K2 _impedance_.
#
# Do NOT drive the input with more than 100mV AC and do NOT connect to a DC _supply_ either.
#
# Do NOT load the audio outputs with less than 33 Ohm resistors.
#
# Do NOT assume that Common is connected to GND, Ground, of the computer, although it may well be.
#
# I am assuming that if you are capable of doing this that you are also capable of doing the subtle level tests etc...
#
# (C)2012, B.Walker, G0LCU. The Cable assembly modifictaions are Public Domain, but the code is GPL2...
#
# Enjoy finding simple solutions to often very difficult problems... ;o)
#
# Tested on Python Versions 2.5.6, 2.6.7 and 2.7.1 with pyaudio installed.
#
# $VER: SimpleScope_OSX.py_Version_0.00.10_(C)2012_B.Walker_G0LCU.
# The imports required...
import os
import sys
import pyaudio
def main():
# Set everything as global just for this DEMO; my choice... ;o)
global ScopeScreen
global ScopeWindow
global plot
global position
global horiz
global record
global data
global grab
global n
global dec_val
# Allocate values.
ScopeScreen="(C)2011, B.Walker, G0LCU."
ScopeWindow="Simple LF Audio Oscilloscope."
plot=0
position=67
horiz=0
record=" "
data=" "
grab=255
n=0
dec_val=0
while 1:
# This is the basic Osilloscope graticule window for this DEMO.
ScopeScreen="+-------+-------+-------+-------+-------+-------+-------+--------+\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"+-------+-------+-------+-------+-------+-------+-------+--------+\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"+-------+-------+-------+-------+-------+-------+-------+--------+\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"| | | | + | | | |\n"
ScopeScreen=ScopeScreen+"+-------+-------+-------+-------+-------+-------+-------+--------+\n"
# Save the this graticule window for further writing to.
ScopeWindow=open("ScopeScreen.txt","wb+")
ScopeWindow.write(ScopeScreen)
ScopeWindow.close()
# Access the sound system...
stream=pyaudio.PyAudio().open(format=pyaudio.paInt8,channels=1,rate=48000, input=True,frames_per_buffer=1024)
all=[]
for n in range(0,48000/1024*1,1):
record=stream.read(1024)
all.append(record)
stream.close()
pyaudio.PyAudio().terminate()
record="".join(all)
# Convert to unsigned data because paUInt8 does NOT work on a MocBook Pro...
# "struct.unpack" did not work as predicted so done longhand......
data=""
for n in range(0,len(record),1):
dec_val=ord(record[n])
if dec_val>=0 and dec_val<=127:
dec_val=dec_val+128
data=data+chr(dec_val)
dec_val=ord(record[n])
if dec_val>=128 and dec_val<=255:
dec_val=dec_val-128
data=data+chr(dec_val)
# Now plot the graph...
horiz=0
ScopeWindow=open("ScopeScreen.txt","rb+")
while horiz<=63:
# Convert each part of the record string into decimal.
grab=ord(data[horiz])
# Now convert to 4 bit depth for text mode display.
plot=int(grab/16)
# Invert to suit the text display window.
plot=15-plot
# Don't allow an error.
if plot<=0: plot=0
if plot>=15: plot=15
# Set up the horizontal position and plot.
position=68+horiz+plot*67
ScopeWindow.seek(position)
ScopeWindow.write("o")
horiz=horiz+1
# Now get the whole ScopeWindow with the plotted points......
ScopeWindow.seek(0)
ScopeScreen=ScopeWindow.read(1206)
ScopeWindow.close()
# ......and print it to the terminal window.
print os.system("clear"), chr(13), " ", chr(13)
print ScopeScreen
print "Simple Audio Oscilloscope DEMO using pyaudio for OSX 10.7.5."
print "Ctrl-C to quit..."
main()
# SimpleScope.py program end.
# Enjoy finding simple solutions to often very difficult problems.
http://wisecracker.host22.com/public/Scope1.tiff
And a GIF anim of an AMIGA project I did years ago is here:-
http://wisecracker.host22.com/public/SCOPE.GIF
There is no need to make the cable shown in the code as the internal microphone will work for this DEMO...
The DEMO uses ONLY text mode inside a Python Terminal as a proof test.
Read the code for more information...
If you guys like what you see then either reply on here or pass me an email on wisecraker_at_tesco.net...
I am assuming that those who try this out know how to set up the microphone levels, etc, etc...
Assuming this lot works......
The AC component will be 8 bit depth but I don't think I can get the DC component better than 6 bits.
The code is GPL2 but the home made cable modifications are Public Domain...
Enjoy finding simple solutions to often very difficult problems... ;o)
Bazza, G0LCU...
Team AMIGA...