changeset 4:2b996e1d64da

Put numbers before file names
author Adam <adamstark.uk@gmail.com>
date Fri, 14 Sep 2012 17:11:22 +0100
parents 8af0cef242b8
children 2042d278a4e1
files 1-wavread.py 10-plotting.py 2-sndfile-read-and-play.py 3-sndfile-write.py 3a-sndfile-convert-wav-to-aiff-in-folder.py 4-lists-and-python-arrays-for-audio.py 5-basic-numpy.py 6-synthesize-mono-noise-with-numpy.py 7-synthesize-stereo-sines-with-numpy.py 8-dsp-delay.py 9-dsp-block-by-block.py
diffstat 11 files changed, 519 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/1-wavread.py	Fri Sep 14 17:11:22 2012 +0100
@@ -0,0 +1,12 @@
+from scikits.audiolab import wavread
+
+# specify a file name
+filename = "viola.wav"
+
+# extract audio from file
+x, fs, enc = wavread(filename)     
+
+# print out the first 50 samples
+print x[0:50]
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/10-plotting.py	Fri Sep 14 17:11:22 2012 +0100
@@ -0,0 +1,48 @@
+import numpy as np
+from scikits.audiolab import wavread
+from matplotlib import pylab as plt
+
+#################################################
+############ EXTRACT AUDIO FROM FILE ############
+#################################################
+
+x, fs, enc = wavread("drums_mono.wav")
+
+
+#################################################
+#### CALCULATE RMS OF EACH AUDIO BLOCK ####
+#################################################
+
+hop_size = 1024                              # set hop size
+frame_size = hop_size*2                     # set frame size
+frame = np.zeros(frame_size)                # initialise frame with zeros
+window = np.hanning(frame_size)             # create window of the same length as the hop size
+
+# create empty numpy array to hold our 
+rms = np.array([])
+
+# run through signal frame by frame 
+for n in range(0,x.size-hop_size,hop_size):
+    
+    # extract a segment of length hop_size
+    buffer = x[n:n+hop_size]                               
+    
+    # add new segment to frame, shifting back samples of frame
+    frame = np.append(frame[hop_size:frame_size],buffer)  
+    
+    # calculate RMS
+    rms_val = np.sqrt(np.power(frame,2).mean())
+    
+    # add amplitude to our numpy array
+    rms = np.append(rms,rms_val)
+
+print rms
+
+
+plt.plot(rms)
+plt.title("RMS")
+plt.xlabel("time")
+plt.ylabel("value")
+plt.show()
+    
+                                   
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/2-sndfile-read-and-play.py	Fri Sep 14 17:11:22 2012 +0100
@@ -0,0 +1,52 @@
+from scikits.audiolab import Sndfile
+from scikits.audiolab import Format
+from scikits.audiolab import play
+
+#################################################
+######## CREATING A SOUND FILE INSTANCE #########
+#################################################
+
+# create Sndfile instance with our example audio file
+f = Sndfile('viola.wav', 'r')
+
+
+#################################################
+######## EXTRACTING AUDIO FILE META-DATA ########
+#################################################
+
+# extract and print sample rate
+fs = f.samplerate
+print "sample rate: ",fs
+
+# extract and print the number of channels
+nc = f.channels
+print "number of channels: ",nc
+
+# extract and print the encoding format
+enc = f.encoding
+print "encoding format: ",enc
+
+# extract the number of frames - single samples for
+# mono and pairs of samples for stereo
+nsamples = f.nframes
+
+
+#################################################
+######## READ AUDIO SAMPLES FROM THE FILE #######
+#################################################
+
+# we can read audio samples using the read_frame method
+data = f.read_frames(nsamples)
+
+
+#################################################
+############# PLAYING AN AUDIO FILE #############
+#################################################
+
+# play the audio file data in 'data' at 44100Hz
+play(data,fs=44100)
+
+
+#################################################
+#################################################
+#################################################
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/3-sndfile-write.py	Fri Sep 14 17:11:22 2012 +0100
@@ -0,0 +1,64 @@
+from scikits.audiolab import Sndfile
+from scikits.audiolab import Format
+from scikits.audiolab import play
+
+#################################################
+######## CREATING A SOUND FILE INSTANCE #########
+#################################################
+
+# create Sndfile instance with our example audio file
+f = Sndfile('viola.wav', 'r')
+
+
+#################################################
+######## EXTRACTING AUDIO FILE META-DATA ########
+#################################################
+
+# extract and print sample rate
+fs = f.samplerate
+print "sample rate: ",fs
+
+# extract and print the number of channels
+nc = f.channels
+print "number of channels: ",nc
+
+# extract and print the encoding format
+enc = f.encoding
+print "encoding format: ",enc
+
+# extract the number of frames - single samples for
+# mono and pairs of samples for stereo
+nsamples = f.nframes
+
+
+#################################################
+######## READ AUDIO SAMPLES FROM THE FILE #######
+#################################################
+
+# we can read audio samples using the read_frame method
+data = f.read_frames(nsamples)
+
+
+#################################################
+########## WRITING TO A NEW AUDIO FILE ##########
+#################################################
+
+# create a name for the new file
+new_filename = 'output_file.wav'
+
+# create the output audio data, in this case a simple copy
+output_data = data
+
+# Create a Sndfile instance for writing wav files @ 44100 Hz
+format = Format('wav')
+f = Sndfile(new_filename, 'w', format, 1, 44100)
+
+# Write out the first 3 seconds worth of samples (fs*3)
+f.write_frames(output_data[:fs*3])
+
+# close the audio file
+f.close()
+
+#################################################
+#################################################
+#################################################
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/3a-sndfile-convert-wav-to-aiff-in-folder.py	Fri Sep 14 17:11:22 2012 +0100
@@ -0,0 +1,44 @@
+import os
+from scikits.audiolab import Sndfile
+from scikits.audiolab import Format
+
+# get the current working directory
+path = os.getcwd()
+
+# get all file names in the current directory
+files = os.listdir(path)
+
+# for each file name
+for filename in files:
+    
+    # if the file ends with a .wav extension
+    if filename.endswith('.wav'):
+        
+        # create a Sndfile instance for the file
+        f_in = Sndfile(filename, 'r')
+        
+        # extract the number of frames
+        numframes = f_in.nframes
+
+        # read all audio samples into 'data'
+        data = f_in.read_frames(numframes)
+
+        # extract the name (without extension from the file name)
+        name,extension = os.path.splitext(filename)
+
+        # create a new filename with a .aiff extension
+        new_filename = name + '.aiff'
+
+        # create the new format based on aiff
+        format = Format('aiff')
+        
+        # create a new Sndfile instance for the output file
+        f_out = Sndfile(new_filename, 'w', format, f_in.channels, f_in.samplerate)
+
+        # write out audio samples to the new file
+        f_out.write_frames(data[:numframes])
+
+        # close the audio file
+        f_out.close()
+
+        
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/4-lists-and-python-arrays-for-audio.py	Fri Sep 14 17:11:22 2012 +0100
@@ -0,0 +1,39 @@
+import array as array
+
+
+#################################################
+############# PYTHON LISTS FOR AUDIO? ###########
+#################################################
+
+# I am a list of audio samples
+myAudio = [-0.25,0.0,0.25,0.5]
+
+# turn it up!
+myAudio = myAudio*2
+
+# oh dear!
+print myAudio
+
+# also, look what got into our array 
+myAudio.append("hello!")
+
+# oh dear again! - Python stores type information for every entry? Do we want
+# to do that 44100 times a second?
+print myAudio
+
+
+#################################################
+############# PYTHON ARRAYS FOR AUDIO? ##########
+#################################################
+
+# I am an array of audio samples
+myAudio = array.array('d',[-0.25,0.0,0.25,0.5])
+
+# this doesn't work, that's good
+# myAudio.append("hello")
+
+# but what about this!
+myAudio = myAudio*2
+
+# oh dear oh dear oh dear
+print myAudio
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/5-basic-numpy.py	Fri Sep 14 17:11:22 2012 +0100
@@ -0,0 +1,53 @@
+import numpy as np
+
+
+#################################################
+############# NUMPY ARRAYS FOR AUDIO? ###########
+#################################################
+
+# I am a numpy array containing some audio
+myAudio = np.array([-0.25,0.0,0.25,0.5])
+
+# turn it up!
+myAudio = myAudio*2.
+
+# great!
+print myAudio
+
+
+# what can we find out about our numpy audio?
+
+
+print "Dimensions: ",myAudio.ndim
+
+print "Size of each dimension: ",myAudio.shape
+
+print "Total number of elements: ", myAudio.size # this is product of shape dimensions
+
+print "Data type: ",myAudio.dtype # ...or dtype.name
+
+print "Bytes per element: ",myAudio.itemsize 
+
+print "Second element: ",myAudio[1]
+
+print "All elements up to (but not including) 2: ",myAudio[:2]
+
+print "All elements from index 2 to end: ",myAudio[2:]
+
+print "Abs!: ",np.abs(myAudio)
+
+print "Min: ",np.min(myAudio)
+
+print "Max: ",np.max(myAudio)
+
+print "Sum: ",np.sum(myAudio)
+
+print "Sqrt: ",np.sqrt(9)
+
+print "FFT!: ",np.fft.fft(myAudio)
+
+print "Random!: ",np.random.random(4)
+
+print "Ones: ",np.ones(4)
+
+print "Zeros: ",np.zeros(4)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/6-synthesize-mono-noise-with-numpy.py	Fri Sep 14 17:11:22 2012 +0100
@@ -0,0 +1,38 @@
+import numpy as np
+from scikits.audiolab import Sndfile
+from scikits.audiolab import Format
+
+
+#################################################
+############ CREATE SOME RANDOM NOISE ###########
+#################################################
+
+# set our sampling frequency
+fs = 44100
+
+# create a numpy array that can hold 3 seconds of sound
+noise = np.empty(3*fs)
+
+# set each element to a random value (noise)
+for i in range(noise.size):
+    # generate random value and turn it down!
+    noise[i] = np.random.random()*0.2
+
+
+#################################################
+########## WRITING NOISE TO AUDIO FILE ##########
+#################################################
+
+# create a name for the new file
+new_filename = 'noise.wav'
+
+# Create a Sndfile instance for writing wav files @ 44100 Hz
+format = Format('wav')
+f = Sndfile(new_filename, 'w', format, 1, fs)
+
+# Write out the samples to the file
+f.write_frames(noise)
+
+# close the audio file
+f.close()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/7-synthesize-stereo-sines-with-numpy.py	Fri Sep 14 17:11:22 2012 +0100
@@ -0,0 +1,49 @@
+import numpy as np
+from scikits.audiolab import Sndfile
+from scikits.audiolab import Format
+
+
+#################################################
+############## CREATE A SINE TONE ###############
+#################################################
+
+# set our sampling frequency
+fs = 44100
+
+# create a numpy array that can hold 3 seconds of sound
+tone = np.zeros((3*fs,2))
+
+# set frequency to 440Hz
+freq = 440
+
+# set volume to 0.3
+amp = 0.3
+
+# set values of each channel
+for i in range(tone.shape[0]):
+    
+    # calculate phase value
+    phaseVal = np.float(i)/np.float(fs)
+    
+    # generate tone and set volume for left and right
+    tone[i][0] = np.sin(2*np.pi*freq*phaseVal)*amp
+    tone[i][1] = np.sin(2*np.pi*freq*phaseVal)*amp
+
+
+#################################################
+########## WRITING TONES TO AUDIO FILE ##########
+#################################################
+
+# create a name for the new file
+new_filename = 'tone.wav'
+
+# Create a Sndfile instance for writing wav files @ 44100 Hz
+format = Format('wav')
+f = Sndfile(new_filename, 'w', format, 2, fs)
+
+# Write out the samples to the file
+f.write_frames(tone)
+
+# close the audio file
+f.close()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/8-dsp-delay.py	Fri Sep 14 17:11:22 2012 +0100
@@ -0,0 +1,79 @@
+import numpy as np
+from scikits.audiolab import Sndfile
+from scikits.audiolab import Format
+
+#################################################
+######## CREATING A SOUND FILE INSTANCE #########
+#################################################
+
+# create Sndfile instance with our example audio file
+f = Sndfile('viola.wav', 'r')
+
+
+#################################################
+######## EXTRACTING AUDIO FILE META-DATA ########
+#################################################
+
+# extract and print sample rate
+fs = f.samplerate
+print "sample rate: ",fs
+
+# extract and print the number of channels
+nc = f.channels
+print "number of channels: ",nc
+
+# extract the number of samples
+nsamples = f.nframes
+
+
+#################################################
+######## READ AUDIO SAMPLES FROM THE FILE #######
+#################################################
+
+# we can read audio samples using the read_frame method
+data = f.read_frames(nsamples)
+
+
+#################################################
+########## APPLY A DELAY TO THE SAMPLES #########
+#################################################
+
+# delay in samples
+delay = fs/2
+
+# volume of delayed sound
+alpha = 0.75
+
+# create an empty array for the output
+out = np.zeros(data.size)
+
+# for every sample in the array
+for i in range(data.size):
+
+    # if we are safe to apply the delay without negative indexing
+    if (i >= delay):
+        out[i] = data[i] + data[i-delay]*alpha
+    else:
+        out[i] = data[i] # hacky
+
+
+#################################################
+########## WRITING TO A NEW AUDIO FILE ##########
+#################################################
+
+# create a name for the new file
+new_filename = 'delayed_audio.wav'
+
+# Create a Sndfile instance for writing wav files @ 44100 Hz
+format = Format('wav')
+f = Sndfile(new_filename, 'w', format, 1, 44100)
+
+# Write out the samples to an audio file
+f.write_frames(out)
+
+# close the audio file
+f.close()
+
+#################################################
+#################################################
+#################################################
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/9-dsp-block-by-block.py	Fri Sep 14 17:11:22 2012 +0100
@@ -0,0 +1,41 @@
+import numpy as np
+from scikits.audiolab import wavread
+
+#################################################
+############ EXTRACT AUDIO FROM FILE ############
+#################################################
+
+x, fs, enc = wavread("viola.wav")
+
+
+#################################################
+#### CALCULATE RMS OF EACH AUDIO BLOCK ####
+#################################################
+
+hop_size = 2048                             # set hop size
+frame_size = 4096                           # set frame size
+frame = np.zeros(frame_size)                # initialise frame with zeros
+window = np.hanning(frame_size)             # create window of the same length as the hop size
+
+# create empty numpy array to hold our 
+rms = np.array([])
+
+# run through signal frame by frame 
+for n in range(0,x.size-hop_size,hop_size):
+    
+    # extract a segment of length hop_size
+    buffer = x[n:n+hop_size]                               
+    
+    # add new segment to frame, shifting back samples of frame
+    frame = np.append(frame[hop_size:frame_size],buffer)  
+    
+    # calculate RMS
+    rms_val = np.sqrt(np.power(frame,2).mean())
+    
+    # add amplitude to our numpy array
+    rms = np.append(rms,rms_val)
+
+print rms
+    
+                                   
+ 
\ No newline at end of file