pitch_transcription_answer.ipynb 52.2 KB
Newer Older
1 2 3
{
 "metadata": {
  "name": "",
4
  "signature": "sha256:85fde792b05ac648ed401c3eb1e4238e2b4deb02a3646fa3fe25dd9ef60fe87c"
5 6 7 8 9 10 11 12 13 14 15 16 17 18
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "heading",
     "level": 1,
     "metadata": {},
     "source": [
      "Pitch Transcription Exercise"
     ]
    },
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Goal: Given an input signal, \n",
      "\n",
      "1. identify each note (including pitch, start time, and duration), and \n",
      "2. render the transcription to be played back as audio."
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Imports:"
     ]
    },
36 37 38 39
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
Steve Tjoa's avatar
Steve Tjoa committed
40
      "import essentia\n",
41
      "import essentia.standard as ess\n",
Steve Tjoa's avatar
Steve Tjoa committed
42 43 44 45
      "import librosa\n",
      "import pandas\n",
      "import warnings\n",
      "warnings.filterwarnings(\"ignore\")"
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 1
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Set figure size:"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": true,
     "input": [
      "rcParams['figure.figsize'] = (15, 6)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 2
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Read an input signal:"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
Steve Tjoa's avatar
Steve Tjoa committed
81
      "fs = 44100\n",
82
      "loader = ess.MonoLoader(filename='../test/bizet_in.wav', sampleRate=fs)\n",
83 84 85 86 87
      "signal_in = loader()"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
88 89 90 91 92 93 94 95
     "prompt_number": 3
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Play the signal:"
     ]
96 97 98 99 100 101
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from IPython.display import Audio\n",
102
      "#Audio(data=signal_in, rate=44100) # may take a while to load"
103 104 105
     ],
     "language": "python",
     "metadata": {},
Steve Tjoa's avatar
Steve Tjoa committed
106
     "outputs": [],
107 108 109 110 111 112 113 114
     "prompt_number": 4
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Given a signal, return onset times:"
     ]
115 116 117 118 119 120 121 122 123 124 125 126
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def get_onsets(signal_in):\n",
      "    onset_times, onset_rate = ess.OnsetRate()(signal_in)\n",
      "    return onset_times"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
127 128 129 130 131 132 133 134
     "prompt_number": 5
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Given an audio segment, return pitch:"
     ]
135 136 137 138 139 140 141 142 143
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "yin = ess.PitchYinFFT()\n",
      "spectrum = ess.Spectrum()\n",
      "\n",
      "def get_pitch(segment):\n",
144
      "    if len(segment) < 4096: # hack to get around Essentia error\n",
Steve Tjoa's avatar
Steve Tjoa committed
145 146 147 148
      "        N = len(segment) if len(segment) % 2 == 0 else len(segment) - 1\n",
      "    else:\n",
      "        N = 4096\n",
      "    pitch, pitch_conf = yin(spectrum(segment[:N]))\n",
149 150 151 152 153
      "    return pitch"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
154 155 156 157 158 159 160 161
     "prompt_number": 6
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Given a pitch, return a sine wave:"
     ]
162 163 164 165 166 167 168
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def generate_sine(pitch, n_duration):\n",
      "    n = arange(n_duration)\n",
169
      "    return 0.2*sin(2*pi*pitch*n/fs)"
170 171 172 173
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
174 175 176 177 178 179 180 181
     "prompt_number": 7
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Given an input signal, transcribe it, and render the transcription using sine waves:"
     ]
182 183 184 185 186 187 188 189
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def transcribe_pitch(signal_in):\n",
      "    \n",
      "    # initialize output signal\n",
Steve Tjoa's avatar
Steve Tjoa committed
190
      "    signal_out = essentia.array(zeros(len(signal_in)))\n",
191 192 193 194 195
      "    \n",
      "    # onset detection\n",
      "    onsets = get_onsets(signal_in)\n",
      "    \n",
      "    # for each onset\n",
196
      "    onsets = append(onsets, len(signal_in)/fs)\n",
197 198 199 200 201 202 203 204 205 206 207 208 209 210
      "    for i in range(len(onsets)-1):\n",
      "        # pitch detect each segment\n",
      "        n0 = int(onsets[i]*44100)\n",
      "        n1 = int(onsets[i+1]*44100)\n",
      "        pitch = get_pitch(signal_in[n0:n1])\n",
      "        \n",
      "        # generate sine wave; add to output signal\n",
      "        signal_out[n0:n1] = generate_sine(pitch, n1-n0)\n",
      "        \n",
      "    return signal_out"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
211 212 213 214 215 216 217 218
     "prompt_number": 8
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Transcribe:"
     ]
219 220 221 222 223 224 225 226 227 228
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "signal_out = transcribe_pitch(signal_in)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
229 230 231 232 233 234 235 236
     "prompt_number": 9
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Write output to file:"
     ]
237 238 239 240 241
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
242 243
      "#Audio(data=signal_out, rate=fs)\n",
      "#Audio(data=sum([signal_out, signal_in], axis=0), rate=fs)\n",
Steve Tjoa's avatar
Steve Tjoa committed
244
      "ess.MonoWriter(filename='../test/out.wav')(signal_out)"
245 246 247
     ],
     "language": "python",
     "metadata": {},
Steve Tjoa's avatar
Steve Tjoa committed
248
     "outputs": [],
249 250 251 252 253 254 255 256 257 258 259 260 261
     "prompt_number": 10
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Plot the onsets:"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
Steve Tjoa's avatar
Steve Tjoa committed
262 263 264 265
      "t = arange(len(signal_in))/float(fs)\n",
      "x = pandas.Series(signal_in, index=t)\n",
      "x.plot()\n",
      "xlabel('Time (seconds)')\n",
266
      "for onset in get_onsets(signal_in):\n",
Steve Tjoa's avatar
Steve Tjoa committed
267
      "    axvline(onset, color='r')"
268 269 270 271 272 273 274
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
Steve Tjoa's avatar
Steve Tjoa committed
275
       "png": "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\nX0bl7vNV4T8ZGRkrevbs2XzPPfd8qLqX7u7cuXNXr1y58t+fe+65Z1yP8fdu12ltbQ1ubGzsd+DA\ngXGrVq1aNnv27I2qewp0SjdtgwcPPllVVTXEdb+qqmpIREREtcqejKSlpcU8a9asT+bNm/dBZx/Z\nAO3t37//puzs7GlRUVEVc+bM2bB79+7b58+f/57qvowiIiKiOiIiovrGG2/8UkTkrrvu+riwsDBB\ndV9GUFBQkHjTTTftv/766+uDg4NbZ86cuWn//v03qe7LSFyfryoiciWfrwptvfvuu/dt3bp1Cv9Y\n0TVOnDgx3OFwRI4ZM+ZwVFRURXV1dcTYsWMPnT59eoDq3owgIiKieubMmZtERG688cYvg4KC2uvr\n669X3VcgU7ppS0xMLDh+/PhIh8MR2dzc3PN3v/vdz6ZNm5atsiejcDqdpgULFrwdGxt77JFHHnlF\ndT9GsXLlyn+vqqoaUlFREfXRRx/dffvtt+9+77335qvuyyjCw8NrhwwZUlVeXh4tIrJz584JcXFx\nR1X3ZQQxMTF/OnDgwLjz589f5XQ6TTt37pwQGxt7THVfRnIln68K/9i+ffvkVatWLduyZctPQkJC\nLqjuxwhGjx5dWldXF1ZRURFVUVERFRERUV1YWJjAP1Z0jenTp2/evXv37SIi5eXl0c3NzT2vv/76\netV9BTTVb1+5devWO6Kjo78aPnz4n1euXLlcdT9Gue3du/dmk8nUPmbMmGKr1VpktVqLtm3bNll1\nX0a65efn33rnnXdmq+7DaLfi4uIxiYmJX/LW211/e/HFF59wveX//Pnzs5qbm82qe+qut7vvvnvD\nwIEDa8xmc3NERETVunXr0urr60NTUlJ28pb/XTv7t99++/4RI0YcHzp06Neuv28XLVr0X6r77G43\n19x79uz5net3/tLvR0VF/R9v+d91s29ubjbPmzfv/fj4+NKEhIRDeXl5yar7DPSb1x+uDQAAAADw\nP6WXRwIAAAAA3GPTBgAAAAA6xqYNAAAAAHSMTRsAAAAA6BibNgBAl6qvr7/eZrMV2Wy2ooEDB56K\niIiottlsRddee+3fFi9e/Ko/ar766quL33333fv8sbY3IiMjHQ0NDaGX+/7s2bM3VlRURHVlTwAA\n/eLdIwEAyjz33HPPXHvttX977LHHfu2vGk6n05SQkFD45Zdf3hgcHNzqrzqeiIqKqjh06NDY0NDQ\nhs6+n5uba//ss8/uXLt27cNd3RsAQH94pQ0AoJTT6TSJiOTn5yffeeedn4mIPPvss8+mpqZmjR8/\nfk9kZKRj06ZNM5cuXbraYrGU3HHHHdtaW1uDRUQOHTo0Njk5OT8xMbFg8uTJ22tra8M7rv/555//\nKCYm5k+uDdvatWsfjouLOzpmzJjDc+bM2SAi8u23315z//33r0tKSjqYkJBQmJ2dPU1EpK2trcfS\npUtXjx49unTMmDGHX3311cUiIrt27UpJSEgotFgsJQsWLHi7ubm5p8jFV9CeffbZZ8eOHXvIYrGU\nfPXVVzeIXHx1ceLEiTvi4+OPLFy48E3Xz/ztt99eM3Xq1Byr1Vo8evTo0o0bN84WEUlOTs7funXr\nFP9OHgAQKNi0AQB0qaKiIiovL++27OzsafPmzfvAbrfnlpSUWK666qrzOTk5U1taWsy/+tWvfvPJ\nJ5/MKigoSExLS3tnxYoVGR3X2bdv382JiYkFrvsvvvjik8XFxdbDhw+PeeONNx4SEcnIyFiRkpKy\n6+DBg0m7d+++fdmyZavOnTt39W9/+9sHKysrhx4+fHjM4cOHx8ydO3f9hQsXQtLS0t7ZuHHj7JKS\nEktra2vw66+/vkhExGQyOfv37//NoUOHxi5atOj11atXLxW5+Iri+PHj9xw5ciR+xowZn1ZWVg4V\nEdm+ffvkwYMHnywuLraWlpaOnjx58nYREbPZ3DJ48OCTZWVlo7pi1gAAfWPTBgDQHZPJ5Lzjjju2\n9ejRoy0+Pv5Ie3t70KRJk/4gIjJ69OhSh8MRWV5eHn306NG4CRMm7LTZbEUZGRkrTp48ObjjWpWV\nlUMHDhx4ynXfYrGU3HPPPR+uX79+bo8ePdpERHbs2DExMzMz3WazFd1222153333Xa/Kysqhu3bt\nSnnooYfeCAoKahcR6devX+NXX311Q1RUVMWIESP+LCKSmpqatWfPnvGu9WfOnLlJRCQhIaHQ4XBE\niojs3bv3lnnz5n0gIjJlypSt/fr1a3T1kpuba09PT8/ct2/fzdddd91fXesMGjSoxnU8AMDYglU3\nAABAZ3r27NksIhIUFNRuNptbXI8HBQW1t7a2BjudTlNcXNzR/fv33/RDa7kuRxQRycnJmbpnz57x\nn3322Z0ZGRkrSktLR4uIbNq0aebIkSOPuztW5OKGsuP3L32sV69e34mI9OjRo811GWdn64iIjBw5\n8nhRUZEtJydn6lNPPfUfKSkpu55++unnXc93bRYBAMbGK20AAN3pbIPT0Q033PDVN99gH4OUAAAC\nF0lEQVR80//AgQPjRERaWlrMx44di+34vGHDhn3tyro5nU5TZWXl0OTk5PzMzMz0M2fO9Dl79mzv\nSZMm/eHSN/0oKiqyiYjY7fbcN95446G2trYeIiKNjY39oqOjyx0OR+SJEyeGi4i8//779956663/\n667X8ePH7/nwww/vERHZtm3bHY2Njf1ERE6dOjUwJCTkwty5c9cvXbp0dWFhYYLrmFOnTg0cNmzY\n1z88LQBAd8emDQCglOtVKpPJ5Ozs60ufc+l9s9nc8vHHH9/15JNPvmi1WottNlvRF1988W8d17/5\n5pv3FRQUJIqItLa2Bt97773vWyyWkoSEhMIlS5as6dOnz5mnn376+ZaWFrPFYimJj48/8swzzzwn\nIvLAAw+8NXTo0EqLxVJitVqLN2zYMCckJOTCO++8k/bTn/70fywWS0lwcHDrz3/+8//u2OelP8Mz\nzzzz3J49e8bHx8cf+fTTT2e4NmOlpaWjk5KSDtpstqLnn3/+aderbC0tLebq6uqImJiYP2k7bQBA\nIOIt/wEA3ZrrLf8PHjyY5LrkUu927NgxMScnZ+qaNWuWqO4FAKAer7QBALo1k8nkXLhw4Zvr16+f\nq7qXK/XWW2898Oijj76sug8AgD7wShsAAAAA6BivtAEAAACAjrFpAwAAAAAdY9MGAAAAADrGpg0A\nAAAAdIxNGwAAAADoGJs2AAAAANCx/wchqXdNkLxYGQAAAABJRU5ErkJggg==\n",
276
       "text": [
277
        "<matplotlib.figure.Figure at 0x4cd3510>"
278 279
       ]
      }
280
     ]
281 282 283 284 285
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
Steve Tjoa's avatar
Steve Tjoa committed
286
      "Plot the input signal:"
287 288 289 290 291 292
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
Steve Tjoa's avatar
Steve Tjoa committed
293 294 295 296
      "fmin = librosa.midi_to_hz(60)\n",
      "fmax = librosa.midi_to_hz(120)\n",
      "CQT = librosa.cqt(signal_in[fs:], fs, hop_length=2048, fmin=fmin, fmax=fmax)\n",
      "librosa.display.specshow(librosa.logamplitude(CQT), sr=fs, y_axis='cqt_note', fmin=fmin, fmax=fmax)"
297 298 299
     ],
     "language": "python",
     "metadata": {},
300
     "outputs": []
301 302
    },
    {
Steve Tjoa's avatar
Steve Tjoa committed
303
     "cell_type": "markdown",
304
     "metadata": {},
Steve Tjoa's avatar
Steve Tjoa committed
305 306 307
     "source": [
      "Plot the output signal:"
     ]
Steve Tjoa's avatar
Steve Tjoa committed
308 309 310 311
    },
    {
     "cell_type": "code",
     "collapsed": false,
Steve Tjoa's avatar
Steve Tjoa committed
312 313 314 315 316 317
     "input": [
      "fmin = librosa.midi_to_hz(60)\n",
      "fmax = librosa.midi_to_hz(120)\n",
      "CQT = librosa.cqt(signal_out[fs:], fs, hop_length=2048, fmin=fmin, fmax=fmax)\n",
      "librosa.display.specshow(librosa.logamplitude(CQT), sr=fs, y_axis='cqt_note', fmin=fmin, fmax=fmax)"
     ],
Steve Tjoa's avatar
Steve Tjoa committed
318 319
     "language": "python",
     "metadata": {},
320
     "outputs": []
321 322 323 324 325 326
    }
   ],
   "metadata": {}
  }
 ]
}