Ismir2012: Software Session Plan¶
Length and plan¶
- 90 min (75 + 15m interval)
Software Requirements¶
- Python
- Numpy
- Matplotlib
- Nose and Nosetests
- ipython (desirable, not mandatory)
Repository¶
https://code.soundsoftware.ac.uk/hg/python-tutorial-skeleton
Script¶
- Clone/Check if repository was successfully cloned
- Explore folder and files
- Launch python shell (ipyhon)
- import audiofile.py and plot samples
- Explain what the test files are and introduction to nose
- Create estimate_tempo.py (main programme)
import tempo_estimator as est import sys filename = sys.argv[1] tempo = est.estimate_tempo_of_file(filename)
- Easy Mercurial:
- ignore pyc and py~
- commit estimate_tempo.py
- commit .hgignore
- Create estimate_tempo.py
- Create test file test_estimate_tempo.py
import estimate_tempo as est def test_tempo_120bpm(): tempo = est.estimate_tempo_of_file("test files/120bpm.wav") # we consider the test to be passed if error is less than 1/4 of bpm error = abs(tempo - 120) < 0.25 assert
- Commit both files
- Start writing the code of tempo_estimator.py
- Slide: how to detect tempo?
- Slide: how our estimator will work
- Write the onset detection function and autocorrelation function calls in tempo_estimator.py
- Commit
- Python Shell:
- import the audiofile module
- load the audiofile
import audiofile as af (samples, samplerate) = af.read_all_read_all_mono_samples_from_file('test files/beatbox.wav')
- split the file into non overlapping blocks and calculate the RMS of each
- Hot to calculate the RMS?
- Create signal_processing.py and test_signal_processing.py
- Slide: how our estimator will work
- ipython: write rms function
import numpy as np def rms(array): return np.sqrt(np.mean(samples**2))
- write RMS tests
- paste RMS function to signal_processing.py
- nosetests signal_processing.py
- in ipython again
- how many frames (non overlapping) does the signal have?
np.ceil(samples/512)
- don't forget to mention tghat ceil returns a float
- what are the contents of the first frame?
samples[0:512]
- what are the contents of the second frame?
samples[512:1024]
- Generalising....
- how many frames (non overlapping) does the signal have?
- signal_processing.py
- def get_frame_count(n_samples, increment)
- def get_frame(samples, increment, n)
- write tests for both functions
- ipython: protoype both functions, write them, test them
- implement detection function on tempo_estimator.py
- implement tests
- Autocorrelation+ testing
- plot waveform and detection function
- time scales are wrong
- create plots.py just as a simple plotting script
- in tempo_estimator.py create bpm_to_lag and lag_to_bpm functions
- add to tempo estimator definition bpm_min and bpm_max arguments