To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

Statistics Download as Zip
| Branch: | Revision:

root / Vamp.v3.ipynb

History | View | Annotate | Download (75.6 KB)

1 4:198d466df53e Chris
{
2
 "metadata": {
3
  "kernelspec": {
4 5:c5482b2a4bdd Chris
   "display_name": "Python 2",
5 4:198d466df53e Chris
   "language": "python",
6 5:c5482b2a4bdd Chris
   "name": "python2"
7 4:198d466df53e Chris
  },
8
  "language_info": {
9
   "codemirror_mode": {
10
    "name": "ipython",
11 5:c5482b2a4bdd Chris
    "version": 2
12 4:198d466df53e Chris
   },
13
   "file_extension": ".py",
14
   "mimetype": "text/x-python",
15
   "name": "python",
16
   "nbconvert_exporter": "python",
17 5:c5482b2a4bdd Chris
   "pygments_lexer": "ipython2",
18
   "version": "2.7.10"
19 4:198d466df53e Chris
  },
20
  "name": ""
21
 },
22
 "nbformat": 3,
23
 "nbformat_minor": 0,
24
 "worksheets": [
25
  {
26
   "cells": [
27
    {
28 6:c4eb7acfb989 Chris
     "cell_type": "markdown",
29 4:198d466df53e Chris
     "metadata": {},
30 6:c4eb7acfb989 Chris
     "source": [
31
      "# Using Vamp plugins from Python\n",
32
      "This notebook illustrates processing an audio file using a Vamp plugin, showing the results in a simple plot, and saving to a .csv file. This could be useful when integrating with analysis software written in Python, or for a batch process. (Note that it is also possible to run Vamp plugins in batch using the [Sonic Annotator](http://vamp-plugins.org/sonic-annotator) command-line program.)"
33
     ]
34 4:198d466df53e Chris
    },
35
    {
36 6:c4eb7acfb989 Chris
     "cell_type": "markdown",
37 4:198d466df53e Chris
     "metadata": {},
38 6:c4eb7acfb989 Chris
     "source": [
39
      "### Setup\n",
40
      "\n",
41 9:1171de1838d7 Chris
      "First we import some necessary modules.\n",
42 6:c4eb7acfb989 Chris
      "\n",
43 7:295ba236f53c Chris
      "The `vamp` module loads and runs Vamp plugins. `librosa` is an audio analysis module from LabROSA at Columbia University. We are using it here only to load audio files, though it can also carry out some analysis functions. `matplotlib` is the usual plotting library."
44 6:c4eb7acfb989 Chris
     ]
45 4:198d466df53e Chris
    },
46
    {
47
     "cell_type": "code",
48 9:1171de1838d7 Chris
     "collapsed": false,
49 4:198d466df53e Chris
     "input": [
50 6:c4eb7acfb989 Chris
      "import vamp\n",
51
      "import librosa\n",
52 9:1171de1838d7 Chris
      "import matplotlib.pyplot as plt\n",
53
      "%matplotlib inline"
54 4:198d466df53e Chris
     ],
55
     "language": "python",
56
     "metadata": {},
57 10:966247e41556 Chris
     "outputs": [],
58 7:295ba236f53c Chris
     "prompt_number": 1
59 6:c4eb7acfb989 Chris
    },
60
    {
61
     "cell_type": "markdown",
62
     "metadata": {},
63
     "source": [
64
      "### Getting started with the Vamp module\n",
65
      "\n",
66
      "List the plugins that are installed. The strings that are returned here are referred to in the module documentation as _plugin keys_ -- each one consists of the name of the library file that contains the plugin, then a colon, then the identifier for the plugin itself. So a set of plugins with the same text before the colon (such as `qm-vamp-plugins:`) were all distributed in the same plugin library file.\n",
67
      "\n",
68
      "You can find plugin descriptions and downloads at http://vamp-plugins.org/download.html."
69
     ]
70 4:198d466df53e Chris
    },
71
    {
72
     "cell_type": "code",
73 9:1171de1838d7 Chris
     "collapsed": false,
74 4:198d466df53e Chris
     "input": [
75
      "vamp.list_plugins()"
76
     ],
77
     "language": "python",
78 7:295ba236f53c Chris
     "metadata": {},
79 4:198d466df53e Chris
     "outputs": [
80
      {
81
       "metadata": {},
82
       "output_type": "pyout",
83 9:1171de1838d7 Chris
       "prompt_number": 2,
84 4:198d466df53e Chris
       "text": [
85
        "['bbc-vamp-plugins:bbc-energy',\n",
86
        " 'bbc-vamp-plugins:bbc-intensity',\n",
87
        " 'bbc-vamp-plugins:bbc-peaks',\n",
88
        " 'bbc-vamp-plugins:bbc-rhythm',\n",
89
        " 'bbc-vamp-plugins:bbc-spectral-contrast',\n",
90
        " 'bbc-vamp-plugins:bbc-spectral-flux',\n",
91
        " 'bbc-vamp-plugins:bbc-speechmusic-segmenter',\n",
92 5:c5482b2a4bdd Chris
        " 'cepstral-pitchtracker:cepstral-pitchtracker',\n",
93 4:198d466df53e Chris
        " 'chp:constrainedharmonicpeak',\n",
94
        " 'cqvamp:cqchromavamp',\n",
95
        " 'cqvamp:cqvamp',\n",
96
        " 'cqvamp:cqvampmidi',\n",
97
        " 'match-vamp-plugin:match',\n",
98
        " 'nnls-chroma:chordino',\n",
99
        " 'nnls-chroma:nnls-chroma',\n",
100
        " 'nnls-chroma:tuning',\n",
101
        " 'pyin:localcandidatepyin',\n",
102
        " 'pyin:pyin',\n",
103
        " 'pyin:yin',\n",
104
        " 'pyin:yinfc',\n",
105
        " 'qm-vamp-plugins:qm-adaptivespectrogram',\n",
106
        " 'qm-vamp-plugins:qm-barbeattracker',\n",
107
        " 'qm-vamp-plugins:qm-chromagram',\n",
108
        " 'qm-vamp-plugins:qm-constantq',\n",
109
        " 'qm-vamp-plugins:qm-dwt',\n",
110
        " 'qm-vamp-plugins:qm-keydetector',\n",
111
        " 'qm-vamp-plugins:qm-mfcc',\n",
112
        " 'qm-vamp-plugins:qm-onsetdetector',\n",
113
        " 'qm-vamp-plugins:qm-segmenter',\n",
114
        " 'qm-vamp-plugins:qm-similarity',\n",
115
        " 'qm-vamp-plugins:qm-tempotracker',\n",
116
        " 'qm-vamp-plugins:qm-tonalchange',\n",
117
        " 'qm-vamp-plugins:qm-transcription',\n",
118
        " 'segmentino:segmentino',\n",
119
        " 'silvet:silvet',\n",
120
        " 'simple-cepstrum:simple-cepstrum',\n",
121
        " 'tempogram:tempogram',\n",
122
        " 'vamp-aubio:aubionotes',\n",
123
        " 'vamp-aubio:aubioonset',\n",
124
        " 'vamp-aubio:aubiopitch',\n",
125
        " 'vamp-aubio:aubiosilence',\n",
126
        " 'vamp-aubio:aubiotempo',\n",
127
        " 'vamp-example-plugins:amplitudefollower',\n",
128
        " 'vamp-example-plugins:fixedtempo',\n",
129
        " 'vamp-example-plugins:percussiononsets',\n",
130
        " 'vamp-example-plugins:powerspectrum',\n",
131
        " 'vamp-example-plugins:spectralcentroid',\n",
132
        " 'vamp-example-plugins:zerocrossing',\n",
133
        " 'vamp-libxtract:amdf',\n",
134
        " 'vamp-libxtract:asdf',\n",
135
        " 'vamp-libxtract:autocorrelation',\n",
136
        " 'vamp-libxtract:average_deviation',\n",
137
        " 'vamp-libxtract:bark_coefficients',\n",
138
        " 'vamp-libxtract:crest',\n",
139
        " 'vamp-libxtract:dct',\n",
140
        " 'vamp-libxtract:f0',\n",
141
        " 'vamp-libxtract:failsafe_f0',\n",
142
        " 'vamp-libxtract:flatness',\n",
143
        " 'vamp-libxtract:harmonic_spectrum',\n",
144
        " 'vamp-libxtract:highest_value',\n",
145
        " 'vamp-libxtract:irregularity_j',\n",
146
        " 'vamp-libxtract:irregularity_k',\n",
147
        " 'vamp-libxtract:kurtosis',\n",
148
        " 'vamp-libxtract:loudness',\n",
149
        " 'vamp-libxtract:lowest_value',\n",
150
        " 'vamp-libxtract:mean',\n",
151
        " 'vamp-libxtract:mfcc',\n",
152
        " 'vamp-libxtract:noisiness',\n",
153
        " 'vamp-libxtract:nonzero_count',\n",
154
        " 'vamp-libxtract:odd_even_ratio',\n",
155
        " 'vamp-libxtract:peak_spectrum',\n",
156
        " 'vamp-libxtract:rms_amplitude',\n",
157
        " 'vamp-libxtract:rolloff',\n",
158
        " 'vamp-libxtract:sharpness',\n",
159
        " 'vamp-libxtract:skewness',\n",
160
        " 'vamp-libxtract:smoothness',\n",
161
        " 'vamp-libxtract:spectral_centroid',\n",
162
        " 'vamp-libxtract:spectral_inharmonicity',\n",
163
        " 'vamp-libxtract:spectral_kurtosis',\n",
164
        " 'vamp-libxtract:spectral_skewness',\n",
165
        " 'vamp-libxtract:spectral_slope',\n",
166
        " 'vamp-libxtract:spectral_standard_deviation',\n",
167
        " 'vamp-libxtract:spectral_variance',\n",
168
        " 'vamp-libxtract:spectrum',\n",
169
        " 'vamp-libxtract:spread',\n",
170
        " 'vamp-libxtract:standard_deviation',\n",
171
        " 'vamp-libxtract:sum',\n",
172
        " 'vamp-libxtract:tonality',\n",
173
        " 'vamp-libxtract:tristimulus_1',\n",
174
        " 'vamp-libxtract:tristimulus_2',\n",
175
        " 'vamp-libxtract:tristimulus_3',\n",
176
        " 'vamp-libxtract:variance',\n",
177
        " 'vamp-libxtract:zcr',\n",
178
        " 'vamp-rubberband:rubberband',\n",
179
        " 'vamp-test-plugin:vamp-test-plugin',\n",
180
        " 'vamp-test-plugin:vamp-test-plugin-freq']"
181
       ]
182
      }
183
     ],
184 9:1171de1838d7 Chris
     "prompt_number": 2
185 6:c4eb7acfb989 Chris
    },
186
    {
187
     "cell_type": "markdown",
188
     "metadata": {},
189
     "source": [
190
      "We'll be using the `librosa` module's `load` function to load the audio file. IPython will show documentation about a function if you just give its name with a \"?\" at the end."
191
     ]
192 4:198d466df53e Chris
    },
193
    {
194
     "cell_type": "code",
195
     "collapsed": true,
196
     "input": [
197
      "librosa.load?"
198
     ],
199
     "language": "python",
200
     "metadata": {},
201
     "outputs": [],
202 9:1171de1838d7 Chris
     "prompt_number": 3
203 6:c4eb7acfb989 Chris
    },
204
    {
205
     "cell_type": "markdown",
206
     "metadata": {},
207
     "source": [
208
      "And the main high-level Vamp module function to apply a plugin is called `collect`, because it runs a plugin and collects the results into a suitable structure rather than returning them individually."
209
     ]
210 4:198d466df53e Chris
    },
211
    {
212
     "cell_type": "code",
213
     "collapsed": true,
214
     "input": [
215
      "vamp.collect?"
216
     ],
217
     "language": "python",
218
     "metadata": {},
219
     "outputs": [],
220 9:1171de1838d7 Chris
     "prompt_number": 4
221 7:295ba236f53c Chris
    },
222
    {
223
     "cell_type": "markdown",
224
     "metadata": {},
225
     "source": [
226
      "### Extracting some chroma features\n",
227
      "\n",
228
      "Load our simplest test audio file and assign the sample data to `data` and the sampling rate to `rate`."
229
     ]
230 4:198d466df53e Chris
    },
231
    {
232
     "cell_type": "code",
233
     "collapsed": false,
234
     "input": [
235 12:7940160a3452 Chris
      "data, rate = librosa.load(\"/home/dm/data/piano-scale.wav\")"
236 4:198d466df53e Chris
     ],
237
     "language": "python",
238
     "metadata": {},
239
     "outputs": [],
240 9:1171de1838d7 Chris
     "prompt_number": 5
241 7:295ba236f53c Chris
    },
242
    {
243
     "cell_type": "markdown",
244
     "metadata": {},
245
     "source": [
246
      "`librosa` defaults to mixing audio down to mono and resampling it to 22050 Hz. (The original file here was 44.1kHz.)"
247
     ]
248 4:198d466df53e Chris
    },
249
    {
250
     "cell_type": "code",
251 9:1171de1838d7 Chris
     "collapsed": false,
252 4:198d466df53e Chris
     "input": [
253
      "rate"
254
     ],
255
     "language": "python",
256
     "metadata": {},
257
     "outputs": [
258
      {
259
       "metadata": {},
260
       "output_type": "pyout",
261 9:1171de1838d7 Chris
       "prompt_number": 6,
262 4:198d466df53e Chris
       "text": [
263
        "22050"
264
       ]
265
      }
266
     ],
267 9:1171de1838d7 Chris
     "prompt_number": 6
268 7:295ba236f53c Chris
    },
269
    {
270
     "cell_type": "markdown",
271
     "metadata": {},
272
     "source": [
273
      "Run the `nnls-chroma` Chromagram plugin with some predefined parameters that make the output better suited to this type of sung performance."
274
     ]
275 4:198d466df53e Chris
    },
276
    {
277
     "cell_type": "code",
278
     "collapsed": true,
279
     "input": [
280 7:295ba236f53c Chris
      "plugin_params = { \"tuningmode\": 1, \"s\": 0.9, \"chromanormalize\": 3 }\n",
281
      "out = vamp.collect(data, rate,\n",
282
      "                   \"nnls-chroma:nnls-chroma\",\n",
283
      "                   output = \"chroma\",\n",
284
      "                   parameters = plugin_params,\n",
285
      "                   process_timestamp_method = vamp.vampyhost.SHIFT_DATA)"
286 4:198d466df53e Chris
     ],
287
     "language": "python",
288
     "metadata": {},
289
     "outputs": [],
290 9:1171de1838d7 Chris
     "prompt_number": 7
291 7:295ba236f53c Chris
    },
292
    {
293
     "cell_type": "markdown",
294
     "metadata": {},
295
     "source": [
296
      "Because the output is grid-like, it comes back in a dictionary element labelled `matrix`. (Other types of features might appear in elements keyed `list` or `vector`.)"
297
     ]
298 4:198d466df53e Chris
    },
299
    {
300
     "cell_type": "code",
301 9:1171de1838d7 Chris
     "collapsed": false,
302 4:198d466df53e Chris
     "input": [
303
      "out"
304
     ],
305
     "language": "python",
306
     "metadata": {},
307
     "outputs": [
308
      {
309
       "metadata": {},
310
       "output_type": "pyout",
311 9:1171de1838d7 Chris
       "prompt_number": 8,
312 4:198d466df53e Chris
       "text": [
313
        "{'matrix': ( 0.092879819,\n",
314 11:584b2318cae3 Chris
        "  array([[  0.00000000e+00,   3.96183506e-02,   5.59634191e-06,\n",
315
        "            9.80212271e-01,   9.50951222e-03,   0.00000000e+00,\n",
316
        "            0.00000000e+00,   1.64221078e-01,   9.96671245e-02,\n",
317
        "            0.00000000e+00,   2.49366909e-02,   0.00000000e+00],\n",
318
        "         [  0.00000000e+00,   3.14768031e-02,   1.75984693e-04,\n",
319
        "            9.78159189e-01,   3.25909108e-02,   0.00000000e+00,\n",
320
        "            2.30609346e-03,   1.62029296e-01,   1.21404052e-01,\n",
321
        "            0.00000000e+00,   1.24034006e-02,   0.00000000e+00],\n",
322
        "         [  0.00000000e+00,   3.00293174e-02,   1.04208666e-04,\n",
323
        "            9.80654418e-01,   1.40835987e-02,   0.00000000e+00,\n",
324
        "            9.72091779e-03,   1.61765605e-01,   1.04315229e-01,\n",
325
        "            0.00000000e+00,   8.51495471e-03,   0.00000000e+00],\n",
326
        "         [  5.58172017e-02,   2.38443669e-02,   2.34000312e-04,\n",
327
        "            9.85957861e-01,   0.00000000e+00,   8.80018866e-04,\n",
328
        "            1.73837524e-02,   1.46617860e-01,   2.19772030e-02,\n",
329
        "            4.21470292e-02,   1.19824708e-02,   0.00000000e+00],\n",
330
        "         [  1.04891717e-01,   0.00000000e+00,   0.00000000e+00,\n",
331
        "            8.22632074e-01,   0.00000000e+00,   5.40932655e-01,\n",
332
        "            2.50055622e-02,   9.16119367e-02,   1.97595134e-02,\n",
333
        "            1.00487642e-01,   3.59625043e-03,   1.21216252e-02],\n",
334
        "         [  4.19154391e-02,   0.00000000e+00,   0.00000000e+00,\n",
335
        "            5.32641768e-01,   0.00000000e+00,   8.34550500e-01,\n",
336
        "            1.78163499e-02,   4.51262072e-02,   3.18071060e-02,\n",
337
        "            1.09734185e-01,   5.05775325e-02,   9.80067346e-03],\n",
338
        "         [  8.45817477e-03,   0.00000000e+00,   0.00000000e+00,\n",
339
        "            3.46328199e-01,   1.50652148e-03,   9.27628160e-01,\n",
340
        "            7.37145077e-03,   2.01034341e-02,   2.88060121e-02,\n",
341
        "            1.09431930e-01,   7.88083300e-02,   3.81295639e-03],\n",
342
        "         [  7.57061178e-04,   0.00000000e+00,   0.00000000e+00,\n",
343
        "            1.79450929e-01,   7.06918363e-04,   9.73997951e-01,\n",
344
        "            1.11817075e-02,   1.11173289e-02,   1.42024746e-02,\n",
345
        "            1.05667278e-01,   8.66511092e-02,   0.00000000e+00],\n",
346
        "         [  1.66557424e-04,   0.00000000e+00,   0.00000000e+00,\n",
347
        "            5.85122555e-02,   0.00000000e+00,   9.89142478e-01,\n",
348
        "            0.00000000e+00,   1.83677338e-02,   1.94070749e-02,\n",
349
        "            1.07398190e-01,   7.69757330e-02,   0.00000000e+00],\n",
350
        "         [  1.33603302e-04,   7.56049762e-03,   9.44653377e-02,\n",
351 4:198d466df53e Chris
        "            0.00000000e+00,   0.00000000e+00,   8.86209607e-01,\n",
352 11:584b2318cae3 Chris
        "            0.00000000e+00,   4.42017853e-01,   3.05217896e-02,\n",
353
        "            6.33440912e-02,   0.00000000e+00,   7.29915053e-02],\n",
354
        "         [  1.31344637e-02,   6.74641272e-03,   6.19773604e-02,\n",
355
        "            0.00000000e+00,   0.00000000e+00,   5.67795098e-01,\n",
356
        "            0.00000000e+00,   8.15740764e-01,   2.10058820e-02,\n",
357
        "            8.59908853e-03,   2.03802586e-02,   8.47699121e-02],\n",
358
        "         [  4.31742333e-02,   6.34776312e-04,   4.03779112e-02,\n",
359
        "            0.00000000e+00,   0.00000000e+00,   3.56203526e-01,\n",
360
        "            0.00000000e+00,   9.28523540e-01,   1.56202829e-02,\n",
361
        "            0.00000000e+00,   2.54803859e-02,   8.10868144e-02],\n",
362
        "         [  7.33416453e-02,   6.10207790e-04,   3.63620482e-02,\n",
363
        "            0.00000000e+00,   0.00000000e+00,   1.90394685e-01,\n",
364
        "            0.00000000e+00,   9.74134862e-01,   0.00000000e+00,\n",
365
        "            0.00000000e+00,   3.36330868e-02,   8.35358649e-02],\n",
366
        "         [  8.68175179e-02,   4.59923962e-04,   4.55667712e-02,\n",
367
        "            0.00000000e+00,   0.00000000e+00,   5.53725436e-02,\n",
368 4:198d466df53e Chris
        "            0.00000000e+00,   9.90521610e-01,   0.00000000e+00,\n",
369 11:584b2318cae3 Chris
        "            0.00000000e+00,   2.28140820e-02,   7.52759054e-02],\n",
370
        "         [  7.16657341e-02,   4.01280413e-04,   3.66930221e-03,\n",
371
        "            1.17143869e-01,   0.00000000e+00,   5.73449535e-04,\n",
372
        "            1.10340128e-02,   9.86149371e-01,   8.01642612e-02,\n",
373 4:198d466df53e Chris
        "            0.00000000e+00,   0.00000000e+00,   4.57016900e-02],\n",
374 11:584b2318cae3 Chris
        "         [  1.75292313e-01,   2.99866367e-02,   2.26163003e-03,\n",
375
        "            2.27569297e-01,   1.22355169e-03,   5.50738396e-03,\n",
376
        "            1.99322440e-02,   7.56762922e-01,   5.85586488e-01,\n",
377
        "            0.00000000e+00,   0.00000000e+00,   2.34449375e-02],\n",
378
        "         [  2.28524700e-01,   3.58712561e-02,   1.71243155e-03,\n",
379
        "            1.92382932e-01,   2.56251148e-03,   1.83521770e-03,\n",
380
        "            1.90234929e-02,   4.48429823e-01,   8.41432989e-01,\n",
381
        "            0.00000000e+00,   0.00000000e+00,   2.25366023e-03],\n",
382
        "         [  2.01807901e-01,   3.38590480e-02,   1.47551834e-03,\n",
383
        "            1.39505953e-01,   2.78139487e-03,   0.00000000e+00,\n",
384
        "            1.72728095e-02,   2.58494407e-01,   9.33561742e-01,\n",
385 4:198d466df53e Chris
        "            0.00000000e+00,   0.00000000e+00,   0.00000000e+00],\n",
386 11:584b2318cae3 Chris
        "         [  1.54486820e-01,   7.73784667e-02,   1.31765660e-03,\n",
387
        "            1.13231450e-01,   2.59730266e-03,   0.00000000e+00,\n",
388 4:198d466df53e Chris
        "            1.56198768e-02,   1.29941836e-01,   9.69632685e-01,\n",
389
        "            0.00000000e+00,   0.00000000e+00,   0.00000000e+00],\n",
390 11:584b2318cae3 Chris
        "         [  1.27307251e-01,   1.46335721e-01,   7.25545781e-03,\n",
391
        "            7.30696917e-02,   1.78271742e-03,   1.15589984e-02,\n",
392
        "            1.46873388e-02,   4.01094109e-02,   9.77254152e-01,\n",
393 4:198d466df53e Chris
        "            0.00000000e+00,   0.00000000e+00,   0.00000000e+00],\n",
394 11:584b2318cae3 Chris
        "         [  0.00000000e+00,   6.90020472e-02,   1.04619361e-01,\n",
395
        "            2.25574453e-03,   1.59145258e-02,   8.51854533e-02,\n",
396
        "            1.19112572e-02,   3.24970409e-02,   8.37207317e-01,\n",
397
        "            2.33193655e-02,   5.23565531e-01,   0.00000000e+00],\n",
398
        "         [  0.00000000e+00,   1.16285585e-01,   8.28386694e-02,\n",
399
        "            4.62941173e-03,   4.11567613e-02,   5.65895252e-02,\n",
400
        "            8.86769406e-03,   3.56909982e-03,   4.53278363e-01,\n",
401
        "            5.48035838e-03,   8.76992047e-01,   0.00000000e+00],\n",
402
        "         [  0.00000000e+00,   9.20005813e-02,   8.02344233e-02,\n",
403
        "            8.05000402e-03,   3.36742140e-02,   5.60967438e-02,\n",
404
        "            7.82551430e-03,   0.00000000e+00,   2.42856011e-01,\n",
405
        "            6.69737998e-03,   9.60035205e-01,   0.00000000e+00],\n",
406
        "         [  0.00000000e+00,   7.55143240e-02,   8.95385593e-02,\n",
407
        "            3.87140960e-02,   3.20630148e-02,   5.86400889e-02,\n",
408
        "            6.61307480e-03,   0.00000000e+00,   1.47289321e-01,\n",
409
        "            4.46504587e-03,   9.79059339e-01,   0.00000000e+00],\n",
410
        "         [  0.00000000e+00,   4.65284958e-02,   9.54503566e-02,\n",
411
        "            7.55636320e-02,   2.02768482e-02,   6.72976896e-02,\n",
412
        "            6.64060842e-03,   0.00000000e+00,   7.32875690e-02,\n",
413
        "            2.12864988e-02,   9.86005127e-01,   0.00000000e+00],\n",
414
        "         [  2.27480695e-01,   1.48061270e-04,   4.33240458e-02,\n",
415
        "            4.05451693e-02,   5.41272797e-02,   3.53963836e-03,\n",
416
        "            1.43123539e-02,   2.27174252e-01,   1.35128703e-02,\n",
417
        "            4.26806398e-02,   9.42322731e-01,   0.00000000e+00],\n",
418 4:198d466df53e Chris
        "         [  7.76776791e-01,   0.00000000e+00,   0.00000000e+00,\n",
419 11:584b2318cae3 Chris
        "            1.39830112e-01,   5.90621345e-02,   1.34550305e-02,\n",
420
        "            3.04677673e-02,   1.83764696e-01,   1.57451490e-03,\n",
421
        "            1.49140116e-02,   5.81655204e-01,   1.22662485e-02],\n",
422 4:198d466df53e Chris
        "         [  9.20188725e-01,   0.00000000e+00,   0.00000000e+00,\n",
423 11:584b2318cae3 Chris
        "            1.31064311e-01,   5.43981604e-02,   1.02829840e-02,\n",
424
        "            3.28366272e-02,   1.60479397e-01,   5.82210999e-03,\n",
425
        "            0.00000000e+00,   3.25354755e-01,   1.69819649e-02],\n",
426
        "         [  9.54826117e-01,   0.00000000e+00,   0.00000000e+00,\n",
427
        "            9.08428431e-02,   5.47444709e-02,   6.06108643e-02,\n",
428
        "            3.60331088e-02,   1.57885537e-01,   8.70868936e-03,\n",
429
        "            0.00000000e+00,   2.16832116e-01,   8.11457261e-03],\n",
430
        "         [  9.67904508e-01,   0.00000000e+00,   0.00000000e+00,\n",
431
        "            5.66124916e-02,   5.64976968e-02,   1.21210851e-01,\n",
432
        "            2.68668532e-02,   1.64355755e-01,   8.75005964e-03,\n",
433
        "            0.00000000e+00,   1.18906729e-01,   1.10401204e-02],\n",
434
        "         [  9.10301447e-01,   0.00000000e+00,   3.58769596e-01,\n",
435
        "            1.06141847e-02,   4.18055579e-02,   1.46602526e-01,\n",
436
        "            3.75781283e-02,   9.09660384e-02,   4.86972043e-03,\n",
437
        "            9.57466140e-02,   1.99975297e-02,   2.24707602e-03],\n",
438 4:198d466df53e Chris
        "         [  5.32060623e-01,   0.00000000e+00,   8.38650227e-01,\n",
439 11:584b2318cae3 Chris
        "            9.16880462e-03,   2.60610454e-04,   3.36099528e-02,\n",
440
        "            3.72139849e-02,   2.78077163e-02,   5.88112846e-02,\n",
441
        "            8.20663422e-02,   3.43211927e-03,   0.00000000e+00],\n",
442
        "         [  2.87455589e-01,   4.98069823e-03,   9.52399135e-01,\n",
443
        "            6.48918562e-03,   1.46152833e-02,   1.27552811e-03,\n",
444
        "            3.50150615e-02,   3.32775675e-02,   6.14331104e-02,\n",
445
        "            6.25745878e-02,   0.00000000e+00,   0.00000000e+00],\n",
446
        "         [  1.61070168e-01,   2.89101936e-02,   9.81492460e-01,\n",
447
        "            6.82534417e-03,   3.21710929e-02,   0.00000000e+00,\n",
448
        "            3.05393245e-02,   2.94240247e-02,   2.76064500e-02,\n",
449
        "            7.77955577e-02,   1.41078653e-02,   0.00000000e+00],\n",
450
        "         [  8.16927180e-02,   1.41722690e-02,   9.86824512e-01,\n",
451
        "            5.50024817e-03,   4.24346775e-02,   0.00000000e+00,\n",
452
        "            3.15050706e-02,   3.23357843e-02,   0.00000000e+00,\n",
453
        "            1.10492811e-01,   5.67878336e-02,   0.00000000e+00],\n",
454
        "         [  3.24949324e-02,   7.84328091e-04,   9.87073660e-01,\n",
455
        "            2.14368682e-02,   8.19184780e-02,   0.00000000e+00,\n",
456
        "            4.47094291e-02,   4.51754816e-02,   0.00000000e+00,\n",
457
        "            7.68497959e-02,   8.66795331e-02,   0.00000000e+00],\n",
458
        "         [  4.58200509e-03,   5.83841407e-04,   7.21634507e-01,\n",
459
        "            6.54176593e-01,   6.88196672e-03,   1.98839861e-03,\n",
460
        "            3.12678553e-02,   4.32215557e-02,   2.30717957e-02,\n",
461
        "            0.00000000e+00,   2.02596277e-01,   8.24657977e-02],\n",
462
        "         [  0.00000000e+00,   1.26990424e-02,   2.43063316e-01,\n",
463
        "            9.57038879e-01,   3.64563279e-02,   4.62112296e-03,\n",
464
        "            0.00000000e+00,   2.28635445e-02,   2.43536122e-02,\n",
465
        "            0.00000000e+00,   1.47804081e-01,   2.28762515e-02],\n",
466
        "         [  0.00000000e+00,   3.60645875e-02,   9.64465961e-02,\n",
467
        "            9.83903885e-01,   7.15166628e-02,   2.05014925e-03,\n",
468
        "            0.00000000e+00,   1.82101205e-02,   3.92812900e-02,\n",
469
        "            1.10990333e-03,   1.14122525e-01,   3.62179205e-02],\n",
470
        "         [  0.00000000e+00,   3.63094509e-02,   4.21215966e-02,\n",
471
        "            9.86869931e-01,   2.13348027e-02,   1.17978109e-02,\n",
472
        "            0.00000000e+00,   1.84751991e-02,   3.91156673e-02,\n",
473
        "            0.00000000e+00,   1.19885072e-01,   7.84665942e-02],\n",
474
        "         [  0.00000000e+00,   3.17818783e-02,   1.20549006e-02,\n",
475
        "            9.88725364e-01,   1.00220414e-02,   4.33315858e-02,\n",
476
        "            0.00000000e+00,   1.82445552e-02,   3.88606004e-02,\n",
477
        "            0.00000000e+00,   9.95126814e-02,   8.68491977e-02],\n",
478
        "         [  1.20896704e-01,   4.24718186e-02,   3.63281672e-03,\n",
479
        "            8.90641093e-01,   2.25664433e-02,   4.28506017e-01,\n",
480
        "            1.07771484e-02,   3.10042445e-02,   3.72267328e-02,\n",
481
        "            7.50589883e-03,   6.06563725e-02,   0.00000000e+00],\n",
482
        "         [  1.61590222e-02,   0.00000000e+00,   2.05814978e-03,\n",
483
        "            5.34187198e-01,   5.10552106e-03,   8.44328046e-01,\n",
484
        "            2.61573717e-02,   0.00000000e+00,   0.00000000e+00,\n",
485
        "            5.78178652e-03,   2.39303317e-02,   1.31362742e-02],\n",
486
        "         [  0.00000000e+00,   2.69280677e-03,   9.71267349e-04,\n",
487
        "            3.30787838e-01,   6.21950626e-03,   9.42233860e-01,\n",
488
        "            2.94584837e-02,   0.00000000e+00,   0.00000000e+00,\n",
489
        "            5.73373958e-03,   4.27455790e-02,   0.00000000e+00],\n",
490
        "         [  2.47827265e-02,   4.29235697e-02,   0.00000000e+00,\n",
491
        "            1.78738698e-01,   6.27625175e-03,   9.80933607e-01,\n",
492
        "            2.33737398e-02,   0.00000000e+00,   0.00000000e+00,\n",
493
        "            7.23603554e-03,   5.22218607e-02,   0.00000000e+00],\n",
494
        "         [  5.14810756e-02,   8.37553069e-02,   0.00000000e+00,\n",
495
        "            8.09028000e-02,   8.36077239e-03,   9.89670217e-01,\n",
496
        "            1.91887841e-02,   0.00000000e+00,   0.00000000e+00,\n",
497
        "            7.49138417e-03,   6.20334558e-02,   0.00000000e+00],\n",
498
        "         [  3.32304335e-05,   8.98099914e-02,   7.88206533e-02,\n",
499
        "            6.78931251e-02,   1.03781298e-02,   9.46214318e-01,\n",
500
        "            1.99007969e-02,   2.77829915e-01,   0.00000000e+00,\n",
501
        "            5.27050020e-03,   8.98295045e-02,   1.37303912e-04],\n",
502
        "         [  4.44915704e-02,   1.76926292e-02,   8.55403841e-02,\n",
503
        "            3.43058892e-02,   1.02791144e-02,   6.12779975e-01,\n",
504
        "            1.08479457e-02,   7.82902062e-01,   2.35577766e-02,\n",
505
        "            0.00000000e+00,   0.00000000e+00,   4.15841700e-04],\n",
506
        "         [  8.49420503e-02,   1.20950106e-03,   1.09671965e-01,\n",
507
        "            1.21202255e-02,   9.66064818e-03,   3.11395019e-01,\n",
508
        "            1.18757458e-02,   9.39238966e-01,   3.51763181e-02,\n",
509
        "            0.00000000e+00,   0.00000000e+00,   4.83506039e-04],\n",
510
        "         [  9.73264277e-02,   8.18367931e-04,   1.63448021e-01,\n",
511
        "            3.29328179e-02,   0.00000000e+00,   1.07415609e-01,\n",
512
        "            1.59726646e-02,   9.74627972e-01,   3.21203955e-02,\n",
513
        "            0.00000000e+00,   0.00000000e+00,   1.54338439e-03],\n",
514
        "         [  1.01416081e-01,   1.04169745e-03,   1.80728585e-01,\n",
515
        "            6.06901608e-02,   0.00000000e+00,   6.61161765e-02,\n",
516
        "            2.47565862e-02,   9.73594368e-01,   2.22180095e-02,\n",
517
        "            0.00000000e+00,   0.00000000e+00,   1.90866250e-03],\n",
518
        "         [  1.10513300e-01,   1.16068078e-03,   1.73819974e-01,\n",
519
        "            1.02042183e-01,   0.00000000e+00,   2.92203538e-02,\n",
520
        "            2.34891493e-02,   9.72198844e-01,   1.90163590e-02,\n",
521
        "            1.48798684e-02,   0.00000000e+00,   4.90254431e-04],\n",
522
        "         [  3.55626754e-02,   1.81426816e-02,   4.17623669e-03,\n",
523
        "            2.48134360e-01,   6.25082850e-02,   0.00000000e+00,\n",
524
        "            1.42965894e-02,   7.92297721e-01,   5.51682472e-01,\n",
525
        "            2.48422362e-02,   0.00000000e+00,   0.00000000e+00],\n",
526
        "         [  5.95077313e-03,   5.97716793e-02,   3.42533062e-03,\n",
527
        "            2.44145960e-01,   6.32876679e-02,   0.00000000e+00,\n",
528
        "            5.36255576e-02,   2.65350431e-01,   9.26052511e-01,\n",
529
        "            4.36775088e-02,   0.00000000e+00,   0.00000000e+00],\n",
530
        "         [  0.00000000e+00,   9.64460447e-02,   4.26063733e-03,\n",
531
        "            2.43948489e-01,   1.03570789e-01,   0.00000000e+00,\n",
532
        "            5.81621416e-02,   8.93462449e-02,   9.52694476e-01,\n",
533
        "            3.80766392e-02,   0.00000000e+00,   0.00000000e+00],\n",
534
        "         [  0.00000000e+00,   1.12178452e-01,   3.88786523e-03,\n",
535
        "            2.46121064e-01,   1.31447822e-01,   0.00000000e+00,\n",
536
        "            5.56226075e-02,   4.11828123e-02,   9.50674653e-01,\n",
537
        "            3.12177017e-02,   0.00000000e+00,   0.00000000e+00],\n",
538
        "         [  0.00000000e+00,   1.28379911e-01,   4.15798556e-03,\n",
539
        "            2.42848203e-01,   1.54101804e-01,   0.00000000e+00,\n",
540
        "            5.40408976e-02,   2.66808923e-02,   9.47005808e-01,\n",
541
        "            1.80636365e-02,   0.00000000e+00,   0.00000000e+00],\n",
542
        "         [  2.53859581e-03,   1.91127565e-02,   2.02243519e-03,\n",
543
        "            1.12405896e-01,   2.00758949e-02,   1.71211705e-01,\n",
544
        "            1.11278214e-01,   2.78214198e-02,   8.43058825e-01,\n",
545
        "            3.59242298e-02,   4.81743693e-01,   0.00000000e+00],\n",
546
        "         [  3.64924222e-03,   4.81747527e-04,   1.33294973e-03,\n",
547
        "            1.66589431e-02,   8.12750682e-02,   5.23332097e-02,\n",
548
        "            1.93933602e-02,   7.19394675e-03,   4.53242511e-01,\n",
549
        "            2.10740436e-02,   8.83748949e-01,   5.52243181e-02],\n",
550
        "         [  3.93253341e-02,   1.05347857e-02,   5.73152967e-04,\n",
551
        "            9.43983346e-02,   1.47001455e-02,   9.49144140e-02,\n",
552
        "            1.09301947e-01,   0.00000000e+00,   1.52132437e-01,\n",
553
        "            3.77451628e-02,   9.71437275e-01,   0.00000000e+00],\n",
554
        "         [  5.13472892e-02,   3.31028481e-03,   3.92163085e-04,\n",
555
        "            1.16105102e-01,   1.48322433e-02,   1.23555176e-01,\n",
556
        "            1.31526113e-01,   0.00000000e+00,   6.29846603e-02,\n",
557
        "            3.36713530e-02,   9.72449303e-01,   1.81256123e-02],\n",
558
        "         [  4.89316843e-02,   0.00000000e+00,   2.96047510e-04,\n",
559
        "            1.21519662e-01,   1.54880993e-02,   1.36466905e-01,\n",
560
        "            1.60353199e-01,   0.00000000e+00,   5.08025885e-02,\n",
561
        "            3.07972487e-02,   9.66688573e-01,   1.56879909e-02],\n",
562
        "         [  1.98805124e-01,   0.00000000e+00,   5.65947848e-04,\n",
563
        "            1.64412722e-01,   1.19373361e-02,   4.63520400e-02,\n",
564
        "            1.70583233e-01,   4.07661591e-03,   4.17407714e-02,\n",
565
        "            8.87882337e-02,   9.44411933e-01,   2.23336406e-02],\n",
566
        "         [  6.47660613e-01,   1.09090796e-02,   1.12898223e-01,\n",
567
        "            3.67569685e-01,   2.99616763e-03,   6.21701628e-02,\n",
568
        "            1.54504344e-01,   4.67437543e-02,   1.10933237e-01,\n",
569
        "            7.35431835e-02,   6.20417416e-01,   0.00000000e+00],\n",
570
        "         [  8.65435839e-01,   1.29717980e-02,   1.31817192e-01,\n",
571
        "            4.10883784e-01,   2.92400294e-03,   3.68153527e-02,\n",
572
        "            1.44890219e-01,   4.59817015e-02,   6.56576604e-02,\n",
573
        "            7.75377080e-02,   1.72791421e-01,   0.00000000e+00],\n",
574
        "         [  8.88323963e-01,   6.67962246e-03,   1.39935657e-01,\n",
575
        "            4.00489062e-01,   4.18465305e-03,   2.89279912e-02,\n",
576
        "            1.33017227e-01,   3.70216556e-02,   4.46693525e-02,\n",
577
        "            9.21769366e-02,   2.12603044e-02,   0.00000000e+00],\n",
578
        "         [  9.02807653e-01,   2.10433849e-04,   1.41207963e-01,\n",
579
        "            3.53729963e-01,   3.70743079e-03,   2.84912884e-02,\n",
580
        "            1.24700509e-01,   3.85590978e-02,   7.32384622e-02,\n",
581
        "            1.29023761e-01,   0.00000000e+00,   0.00000000e+00],\n",
582
        "         [  9.03710425e-01,   7.44168065e-04,   1.43547818e-01,\n",
583
        "            3.72946173e-01,   2.09493260e-03,   0.00000000e+00,\n",
584
        "            8.42518359e-02,   3.97068299e-02,   2.67485473e-02,\n",
585
        "            1.19236089e-01,   0.00000000e+00,   0.00000000e+00],\n",
586
        "         [  6.47389829e-01,   9.62956285e-04,   6.64771914e-01,\n",
587
        "            2.39137770e-03,   4.67590243e-02,   3.20941269e-01,\n",
588
        "            0.00000000e+00,   4.35641073e-02,   7.85760283e-02,\n",
589
        "            8.59863684e-03,   0.00000000e+00,   1.60069749e-01],\n",
590
        "         [  3.28709453e-01,   1.69940933e-03,   8.70308340e-01,\n",
591
        "            4.05057939e-03,   1.12228319e-01,   3.07389736e-01,\n",
592
        "            0.00000000e+00,   9.21809580e-03,   4.08464968e-02,\n",
593
        "            2.30031163e-02,   7.12021589e-02,   1.41627774e-01],\n",
594
        "         [  5.96007854e-02,   4.15985473e-04,   9.20822144e-01,\n",
595
        "            4.98715928e-03,   1.42810509e-01,   2.99190402e-01,\n",
596
        "            0.00000000e+00,   2.82169972e-03,   9.67504457e-02,\n",
597
        "            2.13448256e-02,   6.86787590e-02,   1.55108452e-01],\n",
598
        "         [  1.00565166e-03,   4.87675949e-04,   9.16018307e-01,\n",
599
        "            4.97340504e-03,   1.85770854e-01,   3.13747793e-01,\n",
600
        "            9.54985619e-04,   5.11525373e-04,   9.01459679e-02,\n",
601
        "            1.34017821e-02,   4.05925550e-02,   1.34093463e-01],\n",
602 4:198d466df53e Chris
        "         [  0.00000000e+00,   0.00000000e+00,   9.05534029e-01,\n",
603 11:584b2318cae3 Chris
        "            5.09170908e-03,   1.82564959e-01,   3.44701439e-01,\n",
604
        "            8.97256099e-03,   2.26825313e-03,   1.00266904e-01,\n",
605
        "            1.87462401e-02,   2.89424695e-02,   1.28471598e-01],\n",
606
        "         [  2.77297765e-01,   6.03793422e-03,   8.73157084e-01,\n",
607
        "            1.08850099e-01,   1.63998276e-01,   1.86085209e-01,\n",
608
        "            1.12378806e-01,   3.68778035e-03,   1.07245870e-01,\n",
609
        "            3.08599137e-02,   2.12714337e-02,   2.48486981e-01],\n",
610
        "         [  1.69244394e-01,   4.37403657e-02,   3.03970158e-01,\n",
611
        "            8.75151396e-01,   7.77170435e-03,   2.06875071e-01,\n",
612
        "            2.50958979e-01,   0.00000000e+00,   8.39736313e-03,\n",
613
        "            7.22063184e-02,   8.75576749e-04,   5.66990860e-03],\n",
614
        "         [  1.40741199e-01,   2.77895834e-02,   1.73567683e-02,\n",
615
        "            9.07734573e-01,   7.42863258e-03,   2.24477857e-01,\n",
616
        "            3.04127991e-01,   5.42868767e-03,   5.90751180e-03,\n",
617
        "            1.04962833e-01,   1.62259694e-02,   2.91900840e-02],\n",
618
        "         [  1.27348587e-01,   1.07598929e-02,   1.18423183e-03,\n",
619
        "            8.94889891e-01,   7.23825488e-03,   2.36309126e-01,\n",
620
        "            3.41708869e-01,   1.28864795e-02,   0.00000000e+00,\n",
621
        "            9.47448835e-02,   9.87823866e-03,   3.06219663e-02],\n",
622
        "         [  1.17775850e-01,   0.00000000e+00,   1.24028174e-03,\n",
623
        "            8.85621428e-01,   7.06017762e-03,   2.27440313e-01,\n",
624
        "            3.75161767e-01,   1.33218868e-02,   0.00000000e+00,\n",
625
        "            8.89340267e-02,   1.81909241e-02,   2.93070376e-02],\n",
626
        "         [  1.02504231e-01,   0.00000000e+00,   1.17313946e-02,\n",
627
        "            8.52970004e-01,   7.52911018e-03,   2.57936388e-01,\n",
628
        "            4.22498077e-01,   1.49978139e-02,   0.00000000e+00,\n",
629
        "            1.20507725e-01,   2.86296960e-02,   3.37380432e-02],\n",
630
        "         [  2.23521233e-01,   6.97063208e-02,   2.91122291e-02,\n",
631
        "            8.11486423e-01,   1.22398529e-02,   1.76643550e-01,\n",
632
        "            4.93218750e-01,   7.14359526e-03,   0.00000000e+00,\n",
633
        "            8.32359493e-02,   2.67229248e-02,   5.92517145e-02],\n",
634
        "         [  2.90636867e-01,   0.00000000e+00,   4.96018380e-02,\n",
635
        "            8.07283044e-01,   1.48371840e-02,   9.19546261e-02,\n",
636
        "            4.98431951e-01,   3.59821995e-03,   1.67102162e-02,\n",
637
        "            0.00000000e+00,   3.46249305e-02,   5.25626317e-02]], dtype=float32))}"
638 4:198d466df53e Chris
       ]
639
      }
640
     ],
641 9:1171de1838d7 Chris
     "prompt_number": 8
642 7:295ba236f53c Chris
    },
643
    {
644
     "cell_type": "markdown",
645
     "metadata": {},
646
     "source": [
647
      "### Plotting the results\n",
648
      "\n",
649
      "The `matrix` dictionary element contains a tuple of step time (the time in seconds from one chroma feature to the next), and the chroma features themselves as a 2d NumPy array."
650
     ]
651 4:198d466df53e Chris
    },
652
    {
653
     "cell_type": "code",
654
     "collapsed": false,
655
     "input": [
656
      "step, chroma = out[\"matrix\"]"
657
     ],
658
     "language": "python",
659
     "metadata": {},
660
     "outputs": [],
661 9:1171de1838d7 Chris
     "prompt_number": 9
662 5:c5482b2a4bdd Chris
    },
663
    {
664
     "cell_type": "code",
665 9:1171de1838d7 Chris
     "collapsed": false,
666 5:c5482b2a4bdd Chris
     "input": [
667
      "step"
668
     ],
669
     "language": "python",
670
     "metadata": {},
671
     "outputs": [
672
      {
673
       "metadata": {},
674
       "output_type": "pyout",
675 9:1171de1838d7 Chris
       "prompt_number": 10,
676 5:c5482b2a4bdd Chris
       "text": [
677
        " 0.092879819"
678
       ]
679
      }
680
     ],
681 9:1171de1838d7 Chris
     "prompt_number": 10
682 7:295ba236f53c Chris
    },
683
    {
684
     "cell_type": "markdown",
685
     "metadata": {},
686
     "source": [
687
      "As an aside, we may find it useful later to have the step time in samples rather than seconds. Multiplying by the sample rate gets this, with some rounding error, but the module also contains a dedicated function to get the result exactly."
688
     ]
689 5:c5482b2a4bdd Chris
    },
690
    {
691
     "cell_type": "code",
692 9:1171de1838d7 Chris
     "collapsed": false,
693 5:c5482b2a4bdd Chris
     "input": [
694
      "float(step) * rate"
695
     ],
696
     "language": "python",
697
     "metadata": {},
698
     "outputs": [
699
      {
700
       "metadata": {},
701
       "output_type": "pyout",
702 9:1171de1838d7 Chris
       "prompt_number": 11,
703 5:c5482b2a4bdd Chris
       "text": [
704
        "2048.00000895"
705
       ]
706
      }
707
     ],
708 9:1171de1838d7 Chris
     "prompt_number": 11
709 5:c5482b2a4bdd Chris
    },
710
    {
711
     "cell_type": "code",
712 9:1171de1838d7 Chris
     "collapsed": false,
713 5:c5482b2a4bdd Chris
     "input": [
714
      "vamp.vampyhost.RealTime.to_frame(step, rate)"
715
     ],
716
     "language": "python",
717
     "metadata": {},
718
     "outputs": [
719
      {
720
       "metadata": {},
721
       "output_type": "pyout",
722 9:1171de1838d7 Chris
       "prompt_number": 12,
723 5:c5482b2a4bdd Chris
       "text": [
724
        "2048"
725
       ]
726
      }
727
     ],
728 9:1171de1838d7 Chris
     "prompt_number": 12
729 7:295ba236f53c Chris
    },
730
    {
731
     "cell_type": "markdown",
732
     "metadata": {},
733
     "source": [
734
      "Show the chroma plot."
735
     ]
736 4:198d466df53e Chris
    },
737
    {
738
     "cell_type": "code",
739 9:1171de1838d7 Chris
     "collapsed": false,
740 4:198d466df53e Chris
     "input": [
741
      "plt.imshow(chroma.transpose(), origin=\"lower\")"
742
     ],
743
     "language": "python",
744
     "metadata": {},
745
     "outputs": [
746
      {
747
       "metadata": {},
748
       "output_type": "pyout",
749 9:1171de1838d7 Chris
       "prompt_number": 13,
750 4:198d466df53e Chris
       "text": [
751 11:584b2318cae3 Chris
        "<matplotlib.image.AxesImage at 0x7f2d89c3af90>"
752 4:198d466df53e Chris
       ]
753
      },
754
      {
755
       "metadata": {},
756
       "output_type": "display_data",
757 11:584b2318cae3 Chris
       "png": "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\nokz+bzEmWmKCk7xKBGS8daOittcuuNqdWcICHdw3nQPB9bhwoSXtZ/XFwbHyvW58Qc6xi8LyeeTy\npO5tjrCfEeXCbXgT4XV63j18tqCVHKpwn2cV1CJdUOp6L837WsOgXzDorxn0Z/R6l9RZjzrrU296\n1FkPywBDH8sAu9343+3RYbeLV5pJTNcQbyLiLCJGoyNNPbDUfagPoer1KE3qdMwklCZtZ+wVOGQ3\nQd2dxCtvVW12gXC+4z3b6b+uX64h3nMl2Yd43/VdSyQoKyVtQFtFzsJssU01rNcut7nsuSDlNmhe\n7ehH+b2ufgl44ixw2f9GW4gsqldBr/J1jXsYhEEpt0TcBvdt0T5TUG0NNJT/NWVRykIZYzcRdlNh\n12tnxW7b3jiKIwTuiMYRkyBZqGrgsqSCkuYlg3xJvzxnUD4hri6x1rqCxdp2C2yvkSa8IExV06Xe\nC4q02+ETxbr+nE39xbYHL18HfnhD8LbW/i3gb7mLVH8W+Le6wA3wTe4j07xbOvN9hDaRDVZtYA1Z\nX49iGPdglMKoB8V+j81hn/XBgM1hn0U0YV73mJs95vUexabXDgKsjFsGXhaurrq84Wu2zktFpnKf\nWxD121l08ui9XYsCw72UWkZId9l/dw+XkLuVUGx38Iezx65MkxAUjB9kMS7lz6dIiSVgcROdkskv\ntODDPGtx9yXyIFGH0KIKLLJWjGCHC74lJVxgNI7h6PAFd2494/atJ5wcPmfzIiE7S9icpWR5Qm1T\nalJqehhSLAXWu/n22kPmalIUQ6UZKs0ITdSLyG+lZO8kZLcTNod95lWPeTVkVh1Qlnsu2CQPu5jj\n+BRZ8VhK+9jOfXZpj66n1DXNupNriLSxy7IYj10ZjSHy3O7W2gupJE9J+R3vtj8RqohSMPUZTaXE\nEuSaZKaS/hJLnh36RPA9f5rYu7t9gzquUMcl6rhCH1bEqnIbNamKSDnq1K3IcLBem4jKRNRWU5nI\ng6D1mz5ZWFnMqcU8t5jnbuFe46Gugf51dQsTw8Is222XDXDPE3BlUJXcrhbctufciR4z5AW1gdpY\nahOs61aB9irv3Aho+zkTv4Zty7FLWq18mXe3zfdrP+a15Ktmm4S3f03e53Nk4ya37qxh9W1QQB4B\n5bJmj2I46sPRCI5HsL4zZnZ/wuz+HrP7lrNkxIuqh60OWFe3KaZDeKrgmW8UVUPm+bk63BtQrNg/\n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\n",
758 4:198d466df53e Chris
       "text": [
759 11:584b2318cae3 Chris
        "<matplotlib.figure.Figure at 0x7f2d89e9d410>"
760 4:198d466df53e Chris
       ]
761
      }
762
     ],
763 9:1171de1838d7 Chris
     "prompt_number": 13
764
    },
765
    {
766
     "cell_type": "markdown",
767
     "metadata": {},
768
     "source": [
769
      "### How did we know which parameters were available?\n",
770
      "A bit further back, we set up some plugin parameters in a Python dictionary:"
771
     ]
772
    },
773
    {
774
     "cell_type": "code",
775
     "collapsed": true,
776
     "input": [
777
      "plugin_params = { \"tuningmode\": 1, \"s\": 0.9, \"chromanormalize\": 3 }"
778
     ],
779
     "language": "python",
780
     "metadata": {},
781
     "outputs": [],
782 7:295ba236f53c Chris
     "prompt_number": 14
783
    },
784
    {
785
     "cell_type": "markdown",
786
     "metadata": {},
787
     "source": [
788 9:1171de1838d7 Chris
      "We also included `output = chroma` in the `vamp.collect` call to make sure we got the right output from the plugin. How did we know which parameters and outputs were available?\n",
789
      "\n",
790
      "Outputs are pretty simple, there's a `vamp.get_outputs_of` call that returns them directly."
791
     ]
792
    },
793
    {
794
     "cell_type": "code",
795
     "collapsed": false,
796
     "input": [
797
      "vamp.get_outputs_of(\"nnls-chroma:nnls-chroma\")"
798
     ],
799
     "language": "python",
800
     "metadata": {},
801
     "outputs": [
802
      {
803
       "metadata": {},
804
       "output_type": "pyout",
805
       "prompt_number": 15,
806
       "text": [
807
        "['logfreqspec',\n",
808
        " 'tunedlogfreqspec',\n",
809
        " 'semitonespectrum',\n",
810
        " 'chroma',\n",
811
        " 'basschroma',\n",
812
        " 'bothchroma']"
813
       ]
814
      }
815
     ],
816
     "prompt_number": 15
817
    },
818
    {
819
     "cell_type": "markdown",
820
     "metadata": {},
821
     "source": [
822
      "Querying details of a plugin's parameters is a bit more tricky with the current version of the module. You have to use a lower-level interface for this. It looks like the following."
823
     ]
824
    },
825
    {
826
     "cell_type": "code",
827
     "collapsed": false,
828
     "input": [
829
      "plug = vamp.vampyhost.load_plugin(\"nnls-chroma:nnls-chroma\", 44100, vamp.vampyhost.ADAPT_NONE)\n",
830
      "plug.parameters"
831
     ],
832
     "language": "python",
833
     "metadata": {},
834
     "outputs": [
835
      {
836
       "metadata": {},
837
       "output_type": "pyout",
838
       "prompt_number": 16,
839
       "text": [
840
        "[{'defaultValue': 1.0,\n",
841
        "  'description': 'Toggles approximate transcription (NNLS).',\n",
842
        "  'identifier': 'useNNLS',\n",
843
        "  'isQuantized': True,\n",
844
        "  'maxValue': 1.0,\n",
845
        "  'minValue': 0.0,\n",
846
        "  'name': 'use approximate transcription (NNLS)',\n",
847
        "  'quantizeStep': 1.0,\n",
848
        "  'unit': ''},\n",
849
        " {'defaultValue': 0.0,\n",
850
        "  'description': 'Consider the cumulative energy spectrum (from low to high frequencies). All bins below the first bin whose cumulative energy exceeds the quantile [bass noise threshold] x [total energy] will be set to 0. A threshold value of 0 means that no bins will be changed.',\n",
851
        "  'identifier': 'rollon',\n",
852
        "  'isQuantized': True,\n",
853
        "  'maxValue': 5.0,\n",
854
        "  'minValue': 0.0,\n",
855
        "  'name': 'bass noise threshold',\n",
856
        "  'quantizeStep': 0.5,\n",
857
        "  'unit': '%'},\n",
858
        " {'defaultValue': 0.0,\n",
859
        "  'description': 'Tuning can be performed locally or on the whole extraction segment. Local tuning is only advisable when the tuning is likely to change over the audio, for example in podcasts, or in a cappella singing.',\n",
860
        "  'identifier': 'tuningmode',\n",
861
        "  'isQuantized': True,\n",
862
        "  'maxValue': 1.0,\n",
863
        "  'minValue': 0.0,\n",
864
        "  'name': 'tuning mode',\n",
865
        "  'quantizeStep': 1.0,\n",
866
        "  'unit': '',\n",
867
        "  'valueNames': ['global tuning', 'local tuning']},\n",
868
        " {'defaultValue': 1.0,\n",
869
        "  'description': 'Spectral whitening: no whitening - 0; whitening - 1.',\n",
870
        "  'identifier': 'whitening',\n",
871
        "  'isQuantized': False,\n",
872
        "  'maxValue': 1.0,\n",
873
        "  'minValue': 0.0,\n",
874
        "  'name': 'spectral whitening',\n",
875
        "  'unit': ''},\n",
876
        " {'defaultValue': 0.699999988079071,\n",
877
        "  'description': 'Determines how individual notes in the note dictionary look: higher values mean more dominant higher harmonics.',\n",
878
        "  'identifier': 's',\n",
879
        "  'isQuantized': False,\n",
880
        "  'maxValue': 0.8999999761581421,\n",
881
        "  'minValue': 0.5,\n",
882
        "  'name': 'spectral shape',\n",
883
        "  'unit': ''},\n",
884
        " {'defaultValue': 0.0,\n",
885
        "  'description': 'How shall the chroma vector be normalized?',\n",
886
        "  'identifier': 'chromanormalize',\n",
887
        "  'isQuantized': True,\n",
888
        "  'maxValue': 3.0,\n",
889
        "  'minValue': 0.0,\n",
890
        "  'name': 'chroma normalization',\n",
891
        "  'quantizeStep': 1.0,\n",
892
        "  'unit': '',\n",
893
        "  'valueNames': ['none', 'maximum norm', 'L1 norm', 'L2 norm']}]"
894
       ]
895
      }
896
     ],
897
     "prompt_number": 16
898
    },
899
    {
900
     "cell_type": "markdown",
901
     "metadata": {},
902
     "source": [
903
      "From this we can work out that (for example) to set the chroma vector normalisation to \"L2 norm\" we should supply something like `parameters = { \"chromanormalize\" : 3 }` in the call to `vamp.collect`.\n",
904
      "\n",
905
      "(Strictly speaking we're supposed to call"
906
     ]
907
    },
908
    {
909
     "cell_type": "code",
910
     "collapsed": false,
911
     "input": [
912
      "plug.unload()"
913
     ],
914
     "language": "python",
915
     "metadata": {},
916
     "outputs": [
917
      {
918
       "metadata": {},
919
       "output_type": "pyout",
920
       "prompt_number": 17,
921
       "text": [
922
        "True"
923
       ]
924
      }
925
     ],
926
     "prompt_number": 17
927
    },
928
    {
929
     "cell_type": "markdown",
930
     "metadata": {},
931
     "source": [
932
      "after doing the above, as well; otherwise a bit of memory is wasted.)"
933
     ]
934
    },
935
    {
936
     "cell_type": "markdown",
937
     "metadata": {},
938
     "source": [
939 7:295ba236f53c Chris
      "### Exporting the result to a CSV file\n",
940
      "This is a pretty standard use of Python's `csv` module."
941
     ]
942 4:198d466df53e Chris
    },
943
    {
944
     "cell_type": "code",
945
     "collapsed": true,
946
     "input": [
947 7:295ba236f53c Chris
      "import csv\n",
948
      "out_file = open('features.csv', 'w')\n",
949
      "writer = csv.writer(out_file)\n",
950
      "writer.writerows(chroma)\n",
951
      "out_file.close()"
952 4:198d466df53e Chris
     ],
953
     "language": "python",
954
     "metadata": {},
955
     "outputs": [],
956 9:1171de1838d7 Chris
     "prompt_number": 18
957 7:295ba236f53c Chris
    },
958
    {
959
     "cell_type": "markdown",
960
     "metadata": {},
961
     "source": [
962
      "(Might be a good moment to find the `features.csv` file in the filesystem and check that it looks OK.)"
963
     ]
964
    },
965
    {
966
     "cell_type": "markdown",
967
     "metadata": {},
968
     "source": [
969
      "### Processing many files\n",
970 10:966247e41556 Chris
      "We define a function that exports chroma features, with the parameters used above, from an audio file given the filename. Then we can call that for a set of files. The body of the function is basically just the same code we already showed, to extract and then save the chroma features.\n",
971 7:295ba236f53c Chris
      "\n",
972 10:966247e41556 Chris
      "This time we are overriding the `sr` parameter of `librosa.load` to tell it to always use the file's own sample rate (that's what `sr = None` does). We're also printing out the filename, its sample rate, and the resulting step size in audio samples between chroma features."
973 7:295ba236f53c Chris
     ]
974 4:198d466df53e Chris
    },
975
    {
976
     "cell_type": "code",
977
     "collapsed": true,
978
     "input": [
979 7:295ba236f53c Chris
      "import os, glob\n",
980 4:198d466df53e Chris
      "def extract_chroma(audiofile):\n",
981 5:c5482b2a4bdd Chris
      "    data, rate = librosa.load(audiofile, sr = None)\n",
982 4:198d466df53e Chris
      "    out = vamp.collect(data, rate,\n",
983
      "                       plugin_key = \"nnls-chroma:nnls-chroma\",\n",
984
      "                       output = \"chroma\",\n",
985
      "                       process_timestamp_method = vamp.vampyhost.SHIFT_DATA)\n",
986
      "    step, chroma = out[\"matrix\"]\n",
987 5:c5482b2a4bdd Chris
      "    print(\"File \" + audiofile +\n",
988
      "          \": sample rate = \" + str(rate) +\n",
989
      "          \", chroma step = \" + str(vamp.vampyhost.RealTime.to_frame(step, rate)))\n",
990 4:198d466df53e Chris
      "    out_file = open(os.path.splitext(audiofile)[0] + \"_chroma.csv\", \"w\")\n",
991
      "    csv.writer(out_file).writerows(chroma)\n",
992
      "    out_file.close()"
993
     ],
994
     "language": "python",
995
     "metadata": {},
996
     "outputs": [],
997 9:1171de1838d7 Chris
     "prompt_number": 19
998 4:198d466df53e Chris
    },
999
    {
1000
     "cell_type": "code",
1001 9:1171de1838d7 Chris
     "collapsed": false,
1002 4:198d466df53e Chris
     "input": [
1003 12:7940160a3452 Chris
      "for file in glob.glob(\"/home/dm/data/*.wav\"):\n",
1004 4:198d466df53e Chris
      "    extract_chroma(file)"
1005
     ],
1006
     "language": "python",
1007
     "metadata": {},
1008 5:c5482b2a4bdd Chris
     "outputs": [
1009
      {
1010
       "output_type": "stream",
1011
       "stream": "stdout",
1012
       "text": [
1013 11:584b2318cae3 Chris
        "File data/piano-scale.wav: sample rate = 44100, chroma step = 2048\n"
1014 5:c5482b2a4bdd Chris
       ]
1015
      }
1016
     ],
1017 9:1171de1838d7 Chris
     "prompt_number": 20
1018 4:198d466df53e Chris
    },
1019
    {
1020 7:295ba236f53c Chris
     "cell_type": "markdown",
1021 4:198d466df53e Chris
     "metadata": {},
1022 7:295ba236f53c Chris
     "source": [
1023
      "### Further exercises\n",
1024
      "\n",
1025 11:584b2318cae3 Chris
      "* Load the audio data and chroma .csv file generated in the last step into Sonic Visualiser, and verify that the chroma data are similar to those generated by running the plugin within Sonic Visualiser.\n",
1026 13:5d1a74cc6f59 Chris
      "* Compare the results generated by two or more different chromagram plugins, or using different sets of parameters.\n",
1027 11:584b2318cae3 Chris
      "* Adapt this notebook so as to extract \"smoothed pitch curve\" features using the pYIN plugin, and figure out how to display the results using in a Matplotlib plot."
1028 7:295ba236f53c Chris
     ]
1029 4:198d466df53e Chris
    }
1030
   ],
1031
   "metadata": {}
1032
  }
1033
 ]
1034
}