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.ipynb @ 11:584b2318cae3

History | View | Annotate | Download (74 KB)

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