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 @ 13:5d1a74cc6f59

History | View | Annotate | Download (75.6 KB)

1
{
2
 "metadata": {
3
  "kernelspec": {
4
   "display_name": "Python 2",
5
   "language": "python",
6
   "name": "python2"
7
  },
8
  "language_info": {
9
   "codemirror_mode": {
10
    "name": "ipython",
11
    "version": 2
12
   },
13
   "file_extension": ".py",
14
   "mimetype": "text/x-python",
15
   "name": "python",
16
   "nbconvert_exporter": "python",
17
   "pygments_lexer": "ipython2",
18
   "version": "2.7.10"
19
  },
20
  "name": ""
21
 },
22
 "nbformat": 3,
23
 "nbformat_minor": 0,
24
 "worksheets": [
25
  {
26
   "cells": [
27
    {
28
     "cell_type": "markdown",
29
     "metadata": {},
30
     "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
    },
35
    {
36
     "cell_type": "markdown",
37
     "metadata": {},
38
     "source": [
39
      "### Setup\n",
40
      "\n",
41
      "First we import some necessary modules.\n",
42
      "\n",
43
      "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
     ]
45
    },
46
    {
47
     "cell_type": "code",
48
     "collapsed": false,
49
     "input": [
50
      "import vamp\n",
51
      "import librosa\n",
52
      "import matplotlib.pyplot as plt\n",
53
      "%matplotlib inline"
54
     ],
55
     "language": "python",
56
     "metadata": {},
57
     "outputs": [],
58
     "prompt_number": 1
59
    },
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
    },
71
    {
72
     "cell_type": "code",
73
     "collapsed": false,
74
     "input": [
75
      "vamp.list_plugins()"
76
     ],
77
     "language": "python",
78
     "metadata": {},
79
     "outputs": [
80
      {
81
       "metadata": {},
82
       "output_type": "pyout",
83
       "prompt_number": 2,
84
       "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
        " 'cepstral-pitchtracker:cepstral-pitchtracker',\n",
93
        " '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
     "prompt_number": 2
185
    },
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
    },
193
    {
194
     "cell_type": "code",
195
     "collapsed": true,
196
     "input": [
197
      "librosa.load?"
198
     ],
199
     "language": "python",
200
     "metadata": {},
201
     "outputs": [],
202
     "prompt_number": 3
203
    },
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
    },
211
    {
212
     "cell_type": "code",
213
     "collapsed": true,
214
     "input": [
215
      "vamp.collect?"
216
     ],
217
     "language": "python",
218
     "metadata": {},
219
     "outputs": [],
220
     "prompt_number": 4
221
    },
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
    },
231
    {
232
     "cell_type": "code",
233
     "collapsed": false,
234
     "input": [
235
      "data, rate = librosa.load(\"/home/dm/data/piano-scale.wav\")"
236
     ],
237
     "language": "python",
238
     "metadata": {},
239
     "outputs": [],
240
     "prompt_number": 5
241
    },
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
    },
249
    {
250
     "cell_type": "code",
251
     "collapsed": false,
252
     "input": [
253
      "rate"
254
     ],
255
     "language": "python",
256
     "metadata": {},
257
     "outputs": [
258
      {
259
       "metadata": {},
260
       "output_type": "pyout",
261
       "prompt_number": 6,
262
       "text": [
263
        "22050"
264
       ]
265
      }
266
     ],
267
     "prompt_number": 6
268
    },
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
    },
276
    {
277
     "cell_type": "code",
278
     "collapsed": true,
279
     "input": [
280
      "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
     ],
287
     "language": "python",
288
     "metadata": {},
289
     "outputs": [],
290
     "prompt_number": 7
291
    },
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
    },
299
    {
300
     "cell_type": "code",
301
     "collapsed": false,
302
     "input": [
303
      "out"
304
     ],
305
     "language": "python",
306
     "metadata": {},
307
     "outputs": [
308
      {
309
       "metadata": {},
310
       "output_type": "pyout",
311
       "prompt_number": 8,
312
       "text": [
313
        "{'matrix': ( 0.092879819,\n",
314
        "  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
        "            0.00000000e+00,   0.00000000e+00,   8.86209607e-01,\n",
352
        "            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
        "            0.00000000e+00,   9.90521610e-01,   0.00000000e+00,\n",
369
        "            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
        "            0.00000000e+00,   0.00000000e+00,   4.57016900e-02],\n",
374
        "         [  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
        "            0.00000000e+00,   0.00000000e+00,   0.00000000e+00],\n",
386
        "         [  1.54486820e-01,   7.73784667e-02,   1.31765660e-03,\n",
387
        "            1.13231450e-01,   2.59730266e-03,   0.00000000e+00,\n",
388
        "            1.56198768e-02,   1.29941836e-01,   9.69632685e-01,\n",
389
        "            0.00000000e+00,   0.00000000e+00,   0.00000000e+00],\n",
390
        "         [  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
        "            0.00000000e+00,   0.00000000e+00,   0.00000000e+00],\n",
394
        "         [  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
        "         [  7.76776791e-01,   0.00000000e+00,   0.00000000e+00,\n",
419
        "            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
        "         [  9.20188725e-01,   0.00000000e+00,   0.00000000e+00,\n",
423
        "            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
        "         [  5.32060623e-01,   0.00000000e+00,   8.38650227e-01,\n",
439
        "            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
        "         [  0.00000000e+00,   0.00000000e+00,   9.05534029e-01,\n",
603
        "            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
       ]
639
      }
640
     ],
641
     "prompt_number": 8
642
    },
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
    },
652
    {
653
     "cell_type": "code",
654
     "collapsed": false,
655
     "input": [
656
      "step, chroma = out[\"matrix\"]"
657
     ],
658
     "language": "python",
659
     "metadata": {},
660
     "outputs": [],
661
     "prompt_number": 9
662
    },
663
    {
664
     "cell_type": "code",
665
     "collapsed": false,
666
     "input": [
667
      "step"
668
     ],
669
     "language": "python",
670
     "metadata": {},
671
     "outputs": [
672
      {
673
       "metadata": {},
674
       "output_type": "pyout",
675
       "prompt_number": 10,
676
       "text": [
677
        " 0.092879819"
678
       ]
679
      }
680
     ],
681
     "prompt_number": 10
682
    },
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
    },
690
    {
691
     "cell_type": "code",
692
     "collapsed": false,
693
     "input": [
694
      "float(step) * rate"
695
     ],
696
     "language": "python",
697
     "metadata": {},
698
     "outputs": [
699
      {
700
       "metadata": {},
701
       "output_type": "pyout",
702
       "prompt_number": 11,
703
       "text": [
704
        "2048.00000895"
705
       ]
706
      }
707
     ],
708
     "prompt_number": 11
709
    },
710
    {
711
     "cell_type": "code",
712
     "collapsed": false,
713
     "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
       "prompt_number": 12,
723
       "text": [
724
        "2048"
725
       ]
726
      }
727
     ],
728
     "prompt_number": 12
729
    },
730
    {
731
     "cell_type": "markdown",
732
     "metadata": {},
733
     "source": [
734
      "Show the chroma plot."
735
     ]
736
    },
737
    {
738
     "cell_type": "code",
739
     "collapsed": false,
740
     "input": [
741
      "plt.imshow(chroma.transpose(), origin=\"lower\")"
742
     ],
743
     "language": "python",
744
     "metadata": {},
745
     "outputs": [
746
      {
747
       "metadata": {},
748
       "output_type": "pyout",
749
       "prompt_number": 13,
750
       "text": [
751
        "<matplotlib.image.AxesImage at 0x7f2d89c3af90>"
752
       ]
753
      },
754
      {
755
       "metadata": {},
756
       "output_type": "display_data",
757
       "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
       "text": [
759
        "<matplotlib.figure.Figure at 0x7f2d89e9d410>"
760
       ]
761
      }
762
     ],
763
     "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
     "prompt_number": 14
783
    },
784
    {
785
     "cell_type": "markdown",
786
     "metadata": {},
787
     "source": [
788
      "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
      "### Exporting the result to a CSV file\n",
940
      "This is a pretty standard use of Python's `csv` module."
941
     ]
942
    },
943
    {
944
     "cell_type": "code",
945
     "collapsed": true,
946
     "input": [
947
      "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
     ],
953
     "language": "python",
954
     "metadata": {},
955
     "outputs": [],
956
     "prompt_number": 18
957
    },
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
      "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
      "\n",
972
      "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
     ]
974
    },
975
    {
976
     "cell_type": "code",
977
     "collapsed": true,
978
     "input": [
979
      "import os, glob\n",
980
      "def extract_chroma(audiofile):\n",
981
      "    data, rate = librosa.load(audiofile, sr = None)\n",
982
      "    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
      "    print(\"File \" + audiofile +\n",
988
      "          \": sample rate = \" + str(rate) +\n",
989
      "          \", chroma step = \" + str(vamp.vampyhost.RealTime.to_frame(step, rate)))\n",
990
      "    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
     "prompt_number": 19
998
    },
999
    {
1000
     "cell_type": "code",
1001
     "collapsed": false,
1002
     "input": [
1003
      "for file in glob.glob(\"/home/dm/data/*.wav\"):\n",
1004
      "    extract_chroma(file)"
1005
     ],
1006
     "language": "python",
1007
     "metadata": {},
1008
     "outputs": [
1009
      {
1010
       "output_type": "stream",
1011
       "stream": "stdout",
1012
       "text": [
1013
        "File data/piano-scale.wav: sample rate = 44100, chroma step = 2048\n"
1014
       ]
1015
      }
1016
     ],
1017
     "prompt_number": 20
1018
    },
1019
    {
1020
     "cell_type": "markdown",
1021
     "metadata": {},
1022
     "source": [
1023
      "### Further exercises\n",
1024
      "\n",
1025
      "* 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
      "* Compare the results generated by two or more different chromagram plugins, or using different sets of parameters.\n",
1027
      "* 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
     ]
1029
    }
1030
   ],
1031
   "metadata": {}
1032
  }
1033
 ]
1034
}