Commit 8dcfe377 authored by Steve Tjoa's avatar Steve Tjoa

first exercise is done

parent da2b4167
{
"metadata": {
"name": "",
"signature": "sha256:a069a763c147924d86cc5474e99b4a02cd882af276a571236d3569ba34892397"
"signature": "sha256:41f4a472d3da99aa14f01f67bcbd986a65fa3ebff6f2114dd6f3b585eb677d2a"
},
"nbformat": 3,
"nbformat_minor": 0,
......@@ -16,13 +16,420 @@
"Exercise: Understanding Audio Features through Sonification"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is an *exercise* notebook. It's a playground for your Python code. Feel free to write and execute your code without fear.\n",
"\n",
"When you see a cell that looks like this:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plot?"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 49
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"that is a cue to use a particular command, in this case, `plot`. Run the cell to see documentation for that command. (To quickly close the Help window, press `q`.) \n",
"\n",
"For more documentation, visit the links in the Help menu above. Also see the other notebooks; all the exercises here are covered somewhere else in separate notebooks."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This exercise is loosely based upon \"Lab 1\" from previous MIR workshops ([2010](https://ccrma.stanford.edu/workshops/mir2010/Lab1_2010.pdf))."
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Goals"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this lab, you will segment, feature extract, and analyze audio files."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"1. Detect onsets in an audio signal.\n",
"2. Segment the audio signal at each onset.\n",
"3. Compute features for each segment.\n",
"4. Gain intuition into the features by listening to each segment separately."
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Step 1: Retrieve Audio"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Download the file `simpleLoop.wav` onto your local machine."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import urllib\n",
"url = 'https://ccrma.stanford.edu/workshops/mir2014/audio/simpleLoop.wav'\n",
"urllib.urlretrieve?"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 50
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Save the audio signal into an array."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from essentia.standard import MonoLoader\n",
"fs = 44100\n",
"MonoLoader?"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 51
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Listen to the audio signal."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from IPython.display import Audio\n",
"Audio?"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 52
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Display the audio signal."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plot?"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 53
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Display the spectrogram."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"specgram?"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 54
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Step 2: Detect Onsets"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Find the times, in seconds, when onsets occur in the audio signal."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from essentia.standard import OnsetRate\n",
"OnsetRate?\n",
"onset_times = array([0]) # placeholder"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 60
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Convert the onset times into sample indices."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"onset_samples = int(fs*onset_times)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 61
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Play a \"beep\" at each onset."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from essentia.standard import AudioOnsetsMarker\n",
"AudioOnsetsMarker?"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 62
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Step 3: Segment the Audio"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Save into an array, `segments`, 100-ms segments beginning at each onset."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"frame_sz = int(0.1*fs)\n",
"segments = array([zeros(frame_sz), ones(frame_sz)]) # placeholder"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 68
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here is a function that adds 300 ms of silence onto the end of each segment and concatenates them into one signal.\n",
"\n",
"Later, we will use this function to listen to each segment, perhaps sorted in a different order."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def concatenate_segments(segments, fs=44100, pad_time=0.3):\n",
" padded_segments = [concatenate([segment, zeros(int(pad_time*fs))]) for segment in segments]\n",
" return concatenate(padded_segments)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 69
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Listen to the newly concatenated signal."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"concatenated_signal = concatenate_segments(segments, fs)\n",
"Audio?"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 70
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Step 4: Extract Features"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For each segment, compute the zero crossing rate."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"input": [
"from essentia.standard import ZeroCrossingRate\n",
"ZeroCrossingRate?\n",
"zcrs = []"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 71
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Use `argsort` to find an index array, `ind`, such that `segments[ind]` is sorted by zero crossing rate."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"argsort?\n",
"ind = arange(2) # placeholder"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 76
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Sort the segments by zero crossing rate, and concatenate the sorted segments."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"concatenated_signal = concatenate_segments(segments[ind], fs)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 77
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Step 5: Listen to Segments"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Listen to the sorted segments. What do you hear?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"Audio?"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 78
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Bonus"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Repeat the steps above for the following audio files:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"url = 'https://ccrma.stanford.edu/workshops/mir2014/audio/CongaGroove-mono.wav'\n",
"url = 'https://ccrma.stanford.edu/workshops/mir2014/audio/125BOUNC-mono.WAV'"
],
"language": "python",
"metadata": {},
"outputs": []
"outputs": [],
"prompt_number": 79
}
],
"metadata": {}
......
{
"metadata": {
"name": "",
"signature": "sha256:7c15cdd0c7ac4f93dc3bf54d6fa1d08e5b83d5f6fdf4ec667d54f53c8e557af0"
"signature": "sha256:ec5325b8887f433625d9d323c6c8cf860bd1a899ccb8df64b38f984442c1c859"
},
"nbformat": 3,
"nbformat_minor": 0,
......@@ -42,7 +42,7 @@
]
}
],
"prompt_number": 2
"prompt_number": 1
},
{
"cell_type": "markdown",
......@@ -65,9 +65,9 @@
{
"metadata": {},
"output_type": "pyout",
"prompt_number": 3,
"prompt_number": 2,
"text": [
"<matplotlib.text.Text at 0x3496b10>"
"<matplotlib.text.Text at 0x2a34410>"
]
},
{
......@@ -75,11 +75,11 @@
"output_type": "display_data",
"png": "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\ngg==\n",
"text": [
"<matplotlib.figure.Figure at 0x3493650>"
"<matplotlib.figure.Figure at 0x2a28f10>"
]
}
],
"prompt_number": 3
"prompt_number": 2
},
{
"cell_type": "markdown",
......@@ -109,13 +109,13 @@
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 4,
"prompt_number": 3,
"text": [
"<IPython.lib.display.Audio at 0x321b610>"
"<IPython.lib.display.Audio at 0x29376d0>"
]
}
],
"prompt_number": 4
"prompt_number": 3
},
{
"cell_type": "heading",
......@@ -154,7 +154,7 @@
]
}
],
"prompt_number": 5
"prompt_number": 4
},
{
"cell_type": "heading",
......@@ -194,13 +194,13 @@
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 6,
"prompt_number": 5,
"text": [
"<IPython.lib.display.Audio at 0x33223d0>"
"<IPython.lib.display.Audio at 0x2f2ded0>"
]
}
],
"prompt_number": 6
"prompt_number": 5
},
{
"cell_type": "markdown",
......@@ -214,95 +214,7 @@
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Lab 1 \n",
"=====\n",
"\n",
"**Basic Feature Extraction and Classification**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In this lab, you will segment, feature extract, and analyze audio files."
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Goals"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"1. Detect onsets in an audio signal.\n",
"2. Segment the audio signal at each onset.\n",
"3. Compute features for each segment.\n",
"4. Gain intuition into the features by listening to each segment separately."
]
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Segmentation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
" For debugging, we have function which generates mixes of the original audio file and onset times. This is demonstrated with `test_onsets.m`.\n",
"\n",
" One of Matlab's greatest features is its rich and easy visualization functions. Visualizing your data at every possible step in the algorithm development process not only builds a practical understanding of the variables, parameters and results, but it greatly aids debugging. \n",
" \n",
"8. Plot the audio file in a figure window. \n",
"\n",
" plot(x)\n",
"\n",
"9. Now, add a marker showing the position of each onset on top of the waveforms. \n",
"\n",
" plot(x); hold on; plot(onsets,0.2,'rx')\n",
"\n",
"10. Adding text markers to your plots can further aid in debugging or visualizing problems. Label each onset with it's respective onset number with the following simple loop:\n",
"\n",
" for i=1:numonsets\n",
" text(onsets(i),0.2,num2str(i)); % num2st converts an number to a string for display purposes\n",
" end\n",
"\n",
" Labeling the data is crucial. Add a title and axis to the figures. (ylabel, xlabel, title.)\n",
"\n",
" xlabel('seconds')\n",
" ylabel('magnitude')\n",
" title('my onset plot')\n",
"\n",
"11. Now that we can view the various onsets, try out the onset detector and visualization on a variety of other audio examples located in `/usr/ccrma/courses/mir2013/audio`. Continue to load the various audio files and run the onset detector - does it seem like it works well? If not, yell at Leigh.\n",
"\n",
" Segmenting audio in Frames\n",
" As we learned in lecture, it's common to chop up the audio into fixed-frames. These frames are then further analyzed, processed, or feature extracted. We're going to analyze the audio in 100 ms frames starting at each onset. \n",
"\n",
"12. Create a loop which carves up the audio in fixed-size frames (100ms), starting at the onsets.\n",
"\n",
"13. Inside of your loop, plot each frame, and play the audio for each frame. \n",
"\n",
" % Loop to carve up audio into onset-based frames\n",
" frameSize = 0.100 *fs; % sec\n",
" for i=1:numonsets\n",
" frames{i}= x(onsets(i):onsets(i)+frameSize);\n",
" figure(1);\n",
" plot(frames{i}); title(['frame ' num2str(i)]); \n",
" sound(frames{i} ,fs);\n",
" pause(0.5)\n",
" end\n",
" \n",
" Feature extract your frames"
]
"source": []
},
{
"cell_type": "code",
......@@ -314,7 +226,7 @@
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
"prompt_number": 6
},
{
"cell_type": "code",
......@@ -349,9 +261,9 @@
],
"metadata": {},
"output_type": "pyout",
"prompt_number": 8,
"prompt_number": 7,
"text": [
"<IPython.lib.display.Audio at 0x3322110>"
"<IPython.lib.display.Audio at 0x2937550>"
]
},
{
......@@ -359,60 +271,11 @@
"output_type": "display_data",
"png": "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\nYWAYhmFU/H+7hlv+IS1F9gAAAABJRU5ErkJggg==\n",
"text": [
"<matplotlib.figure.Figure at 0x33224d0>"
"<matplotlib.figure.Figure at 0x2a28e50>"
]
}
],
"prompt_number": 8
},
{
"cell_type": "heading",
"level": 2,
"metadata": {},
"source": [
"Feature Extraction"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"14. Create a loop which extracts the Zero Crossing Rate for each frame, and stores it in an array. Your loop will select 100ms (in samples, this value is = fs * 0.1) , starting at the onsets, and obtain the number of zero crossings in that frame. \n",
"\n",
" The command `[z] = zcr(x)` returns the number of zero crossings for a vector x.\n",
" Don't forget to store the value of z in a feature array for each frame.\n",
"\n",
" clear features\n",
" % Extract Zero Crossing Rate from all frames and store it in \"features(i,1)\"\n",
" for i=1:numonsets\n",
" features(i,1) = zcr(frames{i})\n",
" end\n",
" \n",
" For simpleLoop.wav, you should now have a feature array of 5 x 1 - which is the 5 frames (one at each detected onset) and 1 feature (zcr) for each frame. \n",
" \n",
" Sort the audio file by its feature array. \n",
" Let's test out how well our features characterize the underlying audio signal. \n",
" To build intuition, we're going to sort the feature vector by it's zero crossing rate, from low value to highest value. \n",
"\n",
"15. If we sort and re-play the audio that corresponds with these sorted frames, what do you think it will sound like? (e.g., same order as the loop, reverse order of the loop, snares followed by kicks, quiet notes followed by loud notes, or ??? ) Pause and think about this. \n",
"\n",
"16. Now, we're going to play these sorted audio frames, from lowest to highest. (The pause command will be quite useful here, too.) How does it sound? Does it sort them how you expect them to be sorted? \n",
"\n",
" [y,index] = sort(features);\n",
"\n",
" for i=1:numonsets\n",
" sound(frames{index(i)},fs)\n",
" figure(1); plot(frames{index(i)});title(i);\n",
" pause(0.5)\n",
" end\n",
"\n",
" You'll notice how trivial this drum loop is - always use familiar and predictable audio files when you're developing your algorithms. \n",
"\n",
"17. Now that you have this file loading, playing , and sorting working, try this with out files, such as:\n",
"\n",
" /usr/ccrma/courses/mir2013/audio/CongaGroove-mono.wav\n",
" /usr/ccrma/courses/mir2013/audio/125BOUNC-mono.WAV"
]
"prompt_number": 7
}
],
"metadata": {}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment