Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save palonso/098004e7cd93f8f3ee29313637d6e559 to your computer and use it in GitHub Desktop.
Save palonso/098004e7cd93f8f3ee29313637d6e559 to your computer and use it in GitHub Desktop.
Real-time auto-tagging example using Essentia with Tensorflow and PyAudio to process the soundcard input using the MusiCNN model.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Real-time Deep Learning inference with Essentia, Tensorflow and PyAudio"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib nbagg\n",
"\n",
"import time\n",
"from struct import unpack\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pyaudio\n",
"from IPython import display\n",
"\n",
"from essentia.streaming import *\n",
"from essentia import Pool, run, array, reset"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# model parameters\n",
"modelName = 'msd_frozen_small.pb'\n",
"input_layer = 'model/Placeholder'\n",
"output_layer = 'model/Sigmoid'\n",
"msd_labels = ['rock','pop','alternative','indie','electronic','female vocalists','dance','00s','alternative rock','jazz','beautiful','metal','chillout','male vocalists','classic rock','soul','indie rock','Mellow','electronica','80s','folk','90s','chill','instrumental','punk','oldies','blues','hard rock','ambient','acoustic','experimental','female vocalist','guitar','Hip-Hop','70s','party','country','easy listening','sexy','catchy','funk','electro','heavy metal','Progressive rock','60s','rnb','indie pop','sad','House','happy']\n",
"\n",
"# analysis parameters\n",
"sampleRate = 16000\n",
"chuncksize = 2**13\n",
"frameSize=512 \n",
"hopSize=256\n",
"patchSize = 15\n",
"\n",
"# mel bands parameters\n",
"numberBands=96\n",
"weighting='linear'\n",
"warpingFormula='slaneyMel'\n",
"normalize='unit_tri'\n",
"\n",
"# PyAudio configuration\n",
"FORMAT = pyaudio.paFloat32\n",
"channels = 1\n",
"# in_sr = 44100"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Essentia algorithms "
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# resam = Resample(inputSampleRate=in_sr,\n",
"# outputSampleRate=sampleRate)\n",
"\n",
"fc = FrameCutter(frameSize=frameSize, hopSize=hopSize, \n",
" startFromZero=True,\n",
" lastFrameToEndOfFile=False)\n",
"\n",
"w = Windowing(normalized=False)\n",
"\n",
"spec = Spectrum()\n",
"\n",
"mel = MelBands(numberBands=numberBands, sampleRate=sampleRate,\n",
" highFrequencyBound=sampleRate // 2, inputSize=frameSize // 2 + 1,\n",
" weighting=weighting, normalize=normalize,\n",
" warpingFormula=warpingFormula)\n",
"\n",
"shift = UnaryOperator(shift=1, scale=10000)\n",
"\n",
"comp = UnaryOperator(type='log10')\n",
"\n",
"vtt = VectorRealToTensor(shape=[1, 1, patchSize, numberBands], lastPatchMode='discard')\n",
"\n",
"ttp = TensorToPool(namespace=input_layer)\n",
"\n",
"tfp = TensorflowPredict(graphFilename=modelName,\n",
" inputs=[input_layer],\n",
" outputs=[output_layer],\n",
" isTrainingName=\"model/Placeholder_1\")\n",
"\n",
"ptt = PoolToTensor(namespace=output_layer)\n",
"\n",
"ttv = TensorToVectorReal()\n",
"\n",
"pool = Pool()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"# resam.signal >> fc.signal\n",
"fc.frame >> w.frame\n",
"w.frame >> spec.frame\n",
"w.frame >> (pool, \"frames\")\n",
"spec.spectrum >> mel.spectrum\n",
"mel.bands >> shift.array\n",
"shift.array >> comp.array\n",
"comp.array >> vtt.frame\n",
"comp.array >> (pool, \"melbands\")\n",
"vtt.tensor >> ttp.tensor\n",
"ttp.pool >> tfp.poolIn\n",
"tfp.poolOut >> ptt.pool\n",
"ptt.tensor >> ttv.tensor\n",
"ttv.frame >> (pool, output_layer)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Real time processing with PyAudio\n",
"\n",
"Chunks of Audio are generated by PyAudio via this callback"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def callback(in_data, frame_count, time_info, status):\n",
" buffer = array(unpack('f' * (channels * chuncksize), in_data))\n",
" \n",
" if channels == 2:\n",
" buffer = np.mean([buffer[::2], buffer[1::2]], axis=0)\n",
"\n",
" vimp = VectorInput(buffer)\n",
" \n",
" vimp.data >> fc.signal\n",
" run(vimp)\n",
"\n",
" if pool.containsKey('melbands'):\n",
" if pool['melbands'].shape[0] > tokens['mel']:\n",
" tokens['mel'] = pool['melbands'].shape[0]\n",
" \n",
" if pool['melbands'].shape[0] > patchSize:\n",
" data_mel = pool['melbands'][-patchSize:,:].T\n",
" else:\n",
" data_mel = np.zeros([numberBands, patchSize])\n",
" data_mel[:, -pool['melbands'].shape[0]:] = pool['melbands'].T\n",
"\n",
" img_mel.set_data(data_mel)\n",
" img_mel.autoscale()\n",
" \n",
" if pool.containsKey('model/Sigmoid'):\n",
" if pool['model/Sigmoid'].shape[0] > tokens['activations']:\n",
" tokens['activations'] = pool['model/Sigmoid'].shape[0]\n",
" \n",
" if pool['model/Sigmoid'].shape[0] > 20:\n",
" data_acts = pool['model/Sigmoid'][-20:,:].T\n",
" else:\n",
" data_acts = np.zeros([50, 20])\n",
" data_acts[:, -pool['model/Sigmoid'].shape[0]:] = pool['model/Sigmoid'].T\n",
"\n",
" img_act.set_data(data_acts)\n",
" img_act.autoscale()\n",
"\n",
" f.canvas.draw()\n",
" f.canvas.flush_events()\n",
"\n",
" reset(vimp)\n",
" vimp.data.disconnect(fc.signal)\n",
" \n",
" return (in_data, pyaudio.paContinue)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support. ' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" if (mpl.ratio != 1) {\n",
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
" }\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var backingStore = this.context.backingStorePixelRatio ||\n",
"\tthis.context.webkitBackingStorePixelRatio ||\n",
"\tthis.context.mozBackingStorePixelRatio ||\n",
"\tthis.context.msBackingStorePixelRatio ||\n",
"\tthis.context.oBackingStorePixelRatio ||\n",
"\tthis.context.backingStorePixelRatio || 1;\n",
"\n",
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width * mpl.ratio);\n",
" canvas.attr('height', height * mpl.ratio);\n",
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option);\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA8AAAAK8CAYAAAAgQdaVAAAgAElEQVR4nOyde3QU5eG/R+tXUKRYBWyVVu2XHq0GNAkhgWx2NiRNuIQECNcgDd4ATQwGVH7Wy6KAYgkCIiiKRlBLKhSkeAVt1CraBuXit1URDBgFFIQEJCRhs5/fH5yMLEkkMBGY2ec55zmH3X13Zjeck5eHdy6GAAAAAAAAAMIA42R/AAAAAAAAAIATAQEMAAAAAAAAYQEBDAAAAAAAAGEBAQwAAAAAAABhAQEMAAAAAAAAYQEBDAAAAAAAAGEBAQwAAAAAAABhAQEMAAAAAAAAYQEBDAAAAAAAAGEBAQwAAAAAAABhAQEMAAAAAAAAYQEBDAAAAAAAAGEBAQwAAAAAAABhAQEMAAAAAAAAYQEBDAAAAAAAAGEBAQwAAAAAAABhAQEMAAAAAAAAYQEBDAAAAAAAAGEBAQwAAAAAAABhAQEMAAAAAAAAYQEBDAAAAAAAAGEBAQwAAAAAAABhAQEMAAAAAAAAYQEBDAAAAAAAAGEBAQwAAAAAAABhAQEMAAAAAAAAYQEBDAAAAAAAAGEBAQwAAAAAAABhAQEMAAAAAAAAYQEBDAAAAAAAAGEBAQwAAAAAAABhAQEMAAAAAAAAYQEBDAAAAAAAAGEBAQwAAAAAAABhAQEMAAAAAAAAYQEBDAAAAAAAAGEBAQwAAAAAAABhAQEMAAAAAAAAYQEBDAAAAAAAAGEBAQwAAAAAAABhAQEMAAAAAAAAYQEBDAAAAAAAAGEBAQwAAAAAAABhAQEMAAAAAAAAYQEBDAAAAAAAAGEBAQwAAAAAAABhAQEMAAAAAAAAYQEBDAAAAAAAAGEBAQwAAAAAAABhAQEMAAAAAAAAYQEBDAAAAAAAAGEBAQwAAAAAAABhAQEMAAAAAAAAYQEBDAAAAAAAAGEBAQwAAAAAAABhAQEMAAAAAAAAYQEBDAAAAAAAAGEBAQwAAAAAAABhAQEMAAAAAAAAYQEBDAAAAAAAAGEBAQwAAAAAAABhAQEMAMeNaZoyTfNkf4zjxjAM+f3+k/0xAADCnsLCQhmGodLS0hO+7+LiYhmGoeLi4hO+bwA48RDAAC6l7h8ThmHon//8Z73Xg8GgOnToIMMw1KdPn+PaR1MD+OKLL7Y+i2EYatGihTp27KjbbrtN33333XHtuzkggAEAms6cOXNkGIa6du163NuYMmWKli1bVu/5ExHAc+bMUWFhYb3nCWCA8IIABnApdf+YaNmypW666aZ6r9dN+C1atDghAXz11Vfr2Wef1bPPPqsnn3xSY8aM0RlnnKGYmJjj2ndzQAADADSd7t2765JLLpFhGPr888+PaxutWrVSdnZ2vecDgYAOHDigYDBo81M2zpVXXtngnFVbW6sDBw6otrb2J9s3AJw6EMAALqUugAcMGKC2bdvq4MGDIa/feOONio6O1sUXX3xCArihfdx2220yDEMbN248rv3bhQAGAGgaX3zxhQzD0NKlS9WuXTtNnDjxuLbTWACfCBoLYAAILwhgAJdSF8CLFy/WaaedpldeecV6rbq6Wr/4xS80ffr0BuO0trZWM2bM0BVXXKEWLVqoffv2GjVqlHbv3h0yzm4AFxQUyDAMffHFF9Zz69evV3Z2ti699FK1aNFCF1xwga699lrt2rUr5L1+v99ahcjOzlabNm3085//XCNHjtT+/ftDxlZVVenWW29V27Ztdc4556hv374qKyurF8B79+7V2LFjdfHFF+vMM89Uu3btlJycrA8//PCo3xEAwM1MmjRJv/jFL1RdXa2bbrpJv/vd7+qNqa2t1cyZMxUREaEWLVqobdu2Sk1NVUlJiSSFnApTZ10MH3kIdJ8+fXTppZc2+Fni4uIUHR1tPX766aeVmJiodu3a6cwzz9Tvf/97zZ07N+Q9R56KYxiGNX81dgj0Cy+8oKioKLVs2VLnn3++hg8frq+++ipkTHZ2tlq1aqWvvvpKGRkZatWqldq2bavx48crEAiEjF20aJGioqJ0zjnnqHXr1oqIiNDMmTN/9OcOAM0PAQzgUur+MVFSUqLu3btrxIgR1msvvviiTj/9dH399dcNxukNN9ygM844QzfeeKMef/xxTZgwQa1atVJMTIxqamqscccSwCkpKdq5c6d27typsrIy/f3vf9eFF14or9cbMragoEAJCQm6//779cQTT2js2LE666yz1LVr15BD4+oCODIyUgMGDNDcuXN1ww03yDAM3XHHHSHbvOaaa2QYhrKysvToo49qwIAB6ty5c70AzsrK0plnnqlx48Zp/vz5euihh9S3b18999xzTfmRAwC4lssvv1zXX3+9JOmdd96RYRj697//HTJm5MiRMgxDvXr10syZM1VQUKCMjAzNnj1bkvTss8+qRYsWSkhIsE6JWb16taT6Abxw4cIG97FlyxYZhqFp06ZZz8XExGjkyJGaMWOGZs+erZSUFBmGoUcffdQas2zZMnXo0EGXX365te+VK1dKajiA6z5PTEyMZsyYof/3//6fzjrrLF1yySXas2ePNS47O1stW7bUlVdeqeuuu06PPfaYMjMzZRhGSISvXLlShmEoKSlJc+bM0Zw5c5Sbm6tBgwYd718JABwnBDCASzk8gB999FG1bt1alZWVkqRBgwYpMTFRUv3V2X/+858yDEPPP/98yPZee+21es8f70Ww6oyPj6+3slv3GQ9n0aJFMgxD77zzjvVcXQBfd911IWP79++v888/33q8bt06GYahm2++OWRcVlZWvQBu06aNcnJyjvp9AADCiTVr1sgwDK1atUrSDxdRHDt2rDXmH//4hwzDUF5eXr33H/6fl40dAn1kAFdUVKhFixYaP358yLg///nPOu2007R161bruYbmjdTUVP32t78Nea6xQ6CPDOCamhq1b99eEREROnDggDXupZdekmEYuvfee63nsrOzZRiG7r///pBtRkZGhqxSjx07Vj//+c/rrQoDwImHAAZwKYcH8LfffqszzjhDL7zwgvbu3auzzjpLTz75pKT6AZyXl6c2bdro22+/tVZs6zznnHN0ww03WGOPJYBjY2O1atUqrVq1Si+99JKmTJmic889V927d2/wHy+SdODAAe3cuVOlpaUyDCPkULG6AD5ydeDhhx+WYRiqqKiQJD3wwAMyDEOffvppyLh///vf9QL44osvVpcuXfT1118f9TsBAIQL+fn5uuCCC0Libfz48SHP5eTk6LTTTjvqlf2bGsCS1K9fP/36178OCejo6Gh169at0e2Xl5dr586d1u/+8vJy67WmBvDq1avrreDWcfnll4eEbV0Af/vttyHj8vLy9Itf/MJ67Pf79bOf/Uyvvvpqo58dAE4MBDCASzk8gCWpZ8+e6tevn5555hmdeeaZ1iFcRwZwr169GlytrTM9Pd0aa/cc4CVLlsgwDD3yyCPWc999953y8vLUvn37evu+7777rHF1Abxjx44Gv/eWLVskSaNHj9bpp59e7yJgFRUV9QL4r3/9q1q2bKnTTz9dMTEx8vv92rx581G/HwCAWwkEAvrVr36loUOH6vPPP7d84YUXZBiGXn/9dUmH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0uDBgxvcZmNX3CSAERGPTwK4+SCAEdEtEsDOhgA+SSxatEgdOnTQokWLtGHDBi1cuFDnnXeennnmGUnHF8CsACMiNq/HE8ClpaXKzMyUJBUWFqq6uvo4Z4of38frr79uPR41alSz7+PH8Pv9WrFixTG9hwBGRLdIADsbAvgk0aFDBz366KMhz02aNEmXXXaZpOM7BPpIOAcYEdGedgPYNM1G75N7JLW1tU3eR3FxscaPH9/k8c29fwIYEcNZAtjZEMAnifPOO09z584Nee6BBx7Q7373O0k/XASroKDAer2iooKLYCEinkCPFsA7duyQz+eTx+NRZmamAoGAFcCrV69WmzZt5PF4NH36dO3cuVMZGRlKTExUVlaWAoGAiouLlZaWpn79+umpp56SaZrKz89XQkKCcnJyJEkbNmyQ1+tVXFyc9dzgwYPVoUMHmaap7777TtHR0aqpqVH37t2tz3bNNdfok08+0ebNm5WSkiLTNHXrrbfW+w6maer2229XcnKyAoGAhg8fLq/Xq969e2v37t2SpMmTJysuLk6maWrDhg1WAG/ZskUpKSnasmVLk+ckAhgRnS4B7GwI4JNEdna2LrroIus2SEuXLlXbtm11xx13WGOmTp2qc889V8uXL9eGDRuUkZHBbZAQEU+gRwvg6upqHTx4UJKUl5enlStXNroCPH78eL355pvW7/fFixeruLhYCQkJ1j3gTdPU22+/LUmKi4tTeXm5KisrrdfT09O1cePGeivA0dHRkqTrr79e69at04EDB5SQkCDp0KkzmzZtkiSNGTNGJSUlId/BNE298cYbkqTFixdrwoQJkqSFCxfqvvvu07p165Senm59htraWvn9fs2YMUMpKSmN3ge4sdNyCGBEdLoEsLMhgE8Se/fu1dixY/Wb3/xGLVu21G9/+1vdddddIeeKBYNB3XPPPbrgggvUokULJSUlWVeNbgoEMCKiPY8WwNu2bVNGRoa8Xq86duyoZ555ptEA7tWrlzwej0zTVNeuXTV79mwVFxcrPz/f2p5pmtq7d68kKTMzU1u2bNF//vMf9ezZU16vVx06dNBbb73VaACvWrVKd955p5YuXaoHH3xQktSpUyeZpinTNBUVFaVly5aFfAfTNK3v9+CDD2rJkiWSpE8++UTXXHONioqKQm7JJx06BPrCCy9UUVFRo3NQYxdmJIAR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a6+9hmVZdgAfP36cCy+8kNWrV9uPff/99/F4PLz99tttPr4CWETEmfM9gOfPn88TTzwBQHZ2Nrm5uaSnpwMNARwIBICGAG68mnvppZdy9OjRFq8A5+fn8/DDD9vHr62tBZreN9z457vuuovt27e3+bXqHmARMYUC2N1TAJ/DjRo1ismTJwM0CeD169fj8Xg4duxYk8d37tyZ3//+920+vgJYRMSZ8z2At23bRkREBP379+e2225rUwBff/31jBgxgsjISJ555hmg6T3AkyZNwu/3k5CQwLJly4CWA/gvf/kLfr+fmTNntum1KoBFxBQKYHdPAXyO9qc//YmIiAiqqqqApgG8cuVKvv/97zf7nu7duzNlypRWj9nar5spgEVEzs75HsBumgJYREyhAHb3FMDnYB9//DH//u//zo4dO+yvtUcAt/aGIwpgEZGzowBuvymARcQxwDGfAAAgAElEQVQUCmB3TwF8Dvbiiy/i8Xj47ne/a/N4PFxwwQV897vfZd26dWf1K9C6Aiwi0r4UwO03+7acCwaS/J0hIiKu5b9goM4NLp4C+BzsxIkTlJSUNBEVFcWIESMoKSmx3wQrLy/P/p6dO3fqTbBERL5lCuD2mwJYREyhAHb3FMDnyU79FWho+Bikzp078/rrr1NUVERMTAwxMTFndEwFsIiIMx09gF988UUOHjwIwJo1a3jhhRfO+lgKYBExhQLY3VMAnyc7PYCrqqoYP348P/zhD/nBD37AoEGD2L9//xkdUwEsIuJMRw/gr/us3zOZAlhETKEAdvcUwAZPASwi4sz5HsAHDhzA7/fj9XpJT0+nvr6emTNn0rNnTyzLori4mLKyMpKSkoiPj7c/Cik3N5fFixcDUFBQQDAY5MiRI1iWhd/vp3///nz00UdceeWVREVFcf/99zf5nqeeeoro6Ggsy+LVV19t8bW1+r4UCmARcTkFsLunADZ4CmAREWfO9wCuqamhrq4OgIkTJ7Jw4UL69+9POBwGIBQKkZWVxZo1awC444472LhxY4sBvG7dOu6//377+6DpFeDG7/n888/p2bMnNTU1TR57+lr9ZAIFsIi4nALY3VMAGzwFsIiIM+d7AH/22WcMGDAAn8/Htddey9NPP828efOaPKZ3794cPnwYgCVLlrBs2TKefvppO4BffvllgsEgdXV1zJgxg+HDh9vHaCmA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Lcd91nLcZy3HfQarYQADAAAAAGyBAQwAAAAAsAUGMAAAAADAFhjAAAAAAABbYAADAAAAAGyBAQxJ0vLlyxUZGamIiAg5nU7t3LnT6CM1atGiRRo8eLCuuOIK9ejRQ+np6frkk0+MPlaLLF68WA6HQw8++KDRR2nS4cOHNWnSJF111VXq2rWroqKitGvXLqOP1ahz585pwYIF6tevn7p27arrr79ejz/+uILBoNFHC9m2bZvS0tLUs2dPORwOrVu3rs7fDwaDevTRR3Xttdeqa9euSklJ0WeffWbQaf+nqXOfPXtWDz/8sKKionT55ZerZ8+euu+++3TkyBEDT3zx+/r7ZsyYIYfDoaVLl3bgCXGema5BRvN6vXI4HHW68cYbjT5WWDHr51kjXew+mzp1ar3/7lJTUw06LdA6DGBozZo16tKli1588UXt379fWVlZ6tatm44fP2700RqUmpoqn8+nDz/8UHv37tUdd9yhvn376rvvvjP6aM3y3nvvqV+/fhowYEBYD+ATJ04oMjJS06ZN086dO/XFF19o8+bNOnjwoNFHa9TChQv105/+VP/+97/l9/v1r3/9S1dccYWeffZZo48Wkp+fr0ceeURr165t8EHGU089pSuvvFLr16/XBx98oDFjxqh///46c+aMQSeu1dS5y8rKNGzYML3yyiv65JNPtH37djmdTg0aNMjAE1/8vj5v7dq1uv3229WrVy8GsAHMLEjr6wAACHtJREFUdg0ymtfr1a233qqjR4+G+uabb4w+Vlgx6+dZI13sPps6dapGjhxZ57+7EydOGHRaoHUYwJDT6VR2dnbo14FAQL169dLixYsNPFXzff3113I4HNq2bZvRR7moiooK3XDDDdqyZYvcbndYD+Dc3Fy5XC6jj9Eio0eP1v3331/nbXfddZcmTZpk0ImaduGDjGAwqGuvvVZLliwJva2srEwRERFavXq1EUds0MWeTZVq/6DH4XDo0KFDHXSqpjV25sOHD6t379768MMPFRkZyQA2gNmvQR3N6/Xq9ttvN/oYpmHWz7NGamwAp6enG3QioG0xgG2uurpanTt3rveJbsqUKRozZoxBp2qZAwcOyOFwqKioyOijXNSUKVM0Z84cSQr7AXzzzTdrzpw5uvvuu9WjRw/94he/0N/+9jejj9WkhQsXKjIyUp9++qkkae/evbr66qv1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\" width=\"960\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"* recording\n"
]
}
],
"source": [
"# initialize plots\n",
"f, ax = plt.subplots(1, 2, figsize=[9.6, 7])\n",
"f.canvas.draw()\n",
"\n",
"ax[0].set_title('Mel Bands')\n",
"img_mel = ax[0].imshow(np.zeros([numberBands, patchSize]),\n",
" aspect='auto', origin='lower')\n",
"\n",
"ax[1].set_title('Activations')\n",
"img_act = ax[1].matshow(np.zeros([50, 20]), aspect='0.7')\n",
"ax[1].xaxis.set_ticks_position('bottom')\n",
"_ = plt.yticks(np.arange(50), msd_labels, fontsize=6)\n",
"\n",
"# reset storage and counter\n",
"pool.clear()\n",
"frames = []\n",
"tokens = {'mel': 0, 'activations': 0}\n",
"\n",
"# stream from mic or file\n",
"p = pyaudio.PyAudio()\n",
"stream = p.open(format=FORMAT,\n",
" channels=channels,\n",
" rate=sampleRate,\n",
" input=True,\n",
" stream_callback=callback,\n",
" frames_per_buffer=chuncksize)\n",
"\n",
"print(\"* recording\")\n",
"stream.start_stream()\n",
"\n",
"time.sleep(10)\n",
"\n",
"stream.stop_stream()\n",
"stream.close()\n",
"p.terminate()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Prcess from a file"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"from essentia.standard import MonoLoader\n",
"\n",
"\n",
"audio = MonoLoader(sampleRate=16000, filename='barry_white-you_heart_and_soul.mp3')()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"application/javascript": [
"/* Put everything inside the global mpl namespace */\n",
"window.mpl = {};\n",
"\n",
"\n",
"mpl.get_websocket_type = function() {\n",
" if (typeof(WebSocket) !== 'undefined') {\n",
" return WebSocket;\n",
" } else if (typeof(MozWebSocket) !== 'undefined') {\n",
" return MozWebSocket;\n",
" } else {\n",
" alert('Your browser does not have WebSocket support. ' +\n",
" 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
" 'Firefox 4 and 5 are also supported but you ' +\n",
" 'have to enable WebSockets in about:config.');\n",
" };\n",
"}\n",
"\n",
"mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
" this.id = figure_id;\n",
"\n",
" this.ws = websocket;\n",
"\n",
" this.supports_binary = (this.ws.binaryType != undefined);\n",
"\n",
" if (!this.supports_binary) {\n",
" var warnings = document.getElementById(\"mpl-warnings\");\n",
" if (warnings) {\n",
" warnings.style.display = 'block';\n",
" warnings.textContent = (\n",
" \"This browser does not support binary websocket messages. \" +\n",
" \"Performance may be slow.\");\n",
" }\n",
" }\n",
"\n",
" this.imageObj = new Image();\n",
"\n",
" this.context = undefined;\n",
" this.message = undefined;\n",
" this.canvas = undefined;\n",
" this.rubberband_canvas = undefined;\n",
" this.rubberband_context = undefined;\n",
" this.format_dropdown = undefined;\n",
"\n",
" this.image_mode = 'full';\n",
"\n",
" this.root = $('<div/>');\n",
" this._root_extra_style(this.root)\n",
" this.root.attr('style', 'display: inline-block');\n",
"\n",
" $(parent_element).append(this.root);\n",
"\n",
" this._init_header(this);\n",
" this._init_canvas(this);\n",
" this._init_toolbar(this);\n",
"\n",
" var fig = this;\n",
"\n",
" this.waiting = false;\n",
"\n",
" this.ws.onopen = function () {\n",
" fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
" fig.send_message(\"send_image_mode\", {});\n",
" if (mpl.ratio != 1) {\n",
" fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
" }\n",
" fig.send_message(\"refresh\", {});\n",
" }\n",
"\n",
" this.imageObj.onload = function() {\n",
" if (fig.image_mode == 'full') {\n",
" // Full images could contain transparency (where diff images\n",
" // almost always do), so we need to clear the canvas so that\n",
" // there is no ghosting.\n",
" fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
" }\n",
" fig.context.drawImage(fig.imageObj, 0, 0);\n",
" };\n",
"\n",
" this.imageObj.onunload = function() {\n",
" fig.ws.close();\n",
" }\n",
"\n",
" this.ws.onmessage = this._make_on_message_function(this);\n",
"\n",
" this.ondownload = ondownload;\n",
"}\n",
"\n",
"mpl.figure.prototype._init_header = function() {\n",
" var titlebar = $(\n",
" '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
" 'ui-helper-clearfix\"/>');\n",
" var titletext = $(\n",
" '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
" 'text-align: center; padding: 3px;\"/>');\n",
" titlebar.append(titletext)\n",
" this.root.append(titlebar);\n",
" this.header = titletext[0];\n",
"}\n",
"\n",
"\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._init_canvas = function() {\n",
" var fig = this;\n",
"\n",
" var canvas_div = $('<div/>');\n",
"\n",
" canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
"\n",
" function canvas_keyboard_event(event) {\n",
" return fig.key_event(event, event['data']);\n",
" }\n",
"\n",
" canvas_div.keydown('key_press', canvas_keyboard_event);\n",
" canvas_div.keyup('key_release', canvas_keyboard_event);\n",
" this.canvas_div = canvas_div\n",
" this._canvas_extra_style(canvas_div)\n",
" this.root.append(canvas_div);\n",
"\n",
" var canvas = $('<canvas/>');\n",
" canvas.addClass('mpl-canvas');\n",
" canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
"\n",
" this.canvas = canvas[0];\n",
" this.context = canvas[0].getContext(\"2d\");\n",
"\n",
" var backingStore = this.context.backingStorePixelRatio ||\n",
"\tthis.context.webkitBackingStorePixelRatio ||\n",
"\tthis.context.mozBackingStorePixelRatio ||\n",
"\tthis.context.msBackingStorePixelRatio ||\n",
"\tthis.context.oBackingStorePixelRatio ||\n",
"\tthis.context.backingStorePixelRatio || 1;\n",
"\n",
" mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
"\n",
" var rubberband = $('<canvas/>');\n",
" rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
"\n",
" var pass_mouse_events = true;\n",
"\n",
" canvas_div.resizable({\n",
" start: function(event, ui) {\n",
" pass_mouse_events = false;\n",
" },\n",
" resize: function(event, ui) {\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" stop: function(event, ui) {\n",
" pass_mouse_events = true;\n",
" fig.request_resize(ui.size.width, ui.size.height);\n",
" },\n",
" });\n",
"\n",
" function mouse_event_fn(event) {\n",
" if (pass_mouse_events)\n",
" return fig.mouse_event(event, event['data']);\n",
" }\n",
"\n",
" rubberband.mousedown('button_press', mouse_event_fn);\n",
" rubberband.mouseup('button_release', mouse_event_fn);\n",
" // Throttle sequential mouse events to 1 every 20ms.\n",
" rubberband.mousemove('motion_notify', mouse_event_fn);\n",
"\n",
" rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
" rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
"\n",
" canvas_div.on(\"wheel\", function (event) {\n",
" event = event.originalEvent;\n",
" event['data'] = 'scroll'\n",
" if (event.deltaY < 0) {\n",
" event.step = 1;\n",
" } else {\n",
" event.step = -1;\n",
" }\n",
" mouse_event_fn(event);\n",
" });\n",
"\n",
" canvas_div.append(canvas);\n",
" canvas_div.append(rubberband);\n",
"\n",
" this.rubberband = rubberband;\n",
" this.rubberband_canvas = rubberband[0];\n",
" this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
" this.rubberband_context.strokeStyle = \"#000000\";\n",
"\n",
" this._resize_canvas = function(width, height) {\n",
" // Keep the size of the canvas, canvas container, and rubber band\n",
" // canvas in synch.\n",
" canvas_div.css('width', width)\n",
" canvas_div.css('height', height)\n",
"\n",
" canvas.attr('width', width * mpl.ratio);\n",
" canvas.attr('height', height * mpl.ratio);\n",
" canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
"\n",
" rubberband.attr('width', width);\n",
" rubberband.attr('height', height);\n",
" }\n",
"\n",
" // Set the figure to an initial 600x600px, this will subsequently be updated\n",
" // upon first draw.\n",
" this._resize_canvas(600, 600);\n",
"\n",
" // Disable right mouse context menu.\n",
" $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
" return false;\n",
" });\n",
"\n",
" function set_focus () {\n",
" canvas.focus();\n",
" canvas_div.focus();\n",
" }\n",
"\n",
" window.setTimeout(set_focus, 100);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items) {\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) {\n",
" // put a spacer in here.\n",
" continue;\n",
" }\n",
" var button = $('<button/>');\n",
" button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
" 'ui-button-icon-only');\n",
" button.attr('role', 'button');\n",
" button.attr('aria-disabled', 'false');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
"\n",
" var icon_img = $('<span/>');\n",
" icon_img.addClass('ui-button-icon-primary ui-icon');\n",
" icon_img.addClass(image);\n",
" icon_img.addClass('ui-corner-all');\n",
"\n",
" var tooltip_span = $('<span/>');\n",
" tooltip_span.addClass('ui-button-text');\n",
" tooltip_span.html(tooltip);\n",
"\n",
" button.append(icon_img);\n",
" button.append(tooltip_span);\n",
"\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" var fmt_picker_span = $('<span/>');\n",
"\n",
" var fmt_picker = $('<select/>');\n",
" fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
" fmt_picker_span.append(fmt_picker);\n",
" nav_element.append(fmt_picker_span);\n",
" this.format_dropdown = fmt_picker[0];\n",
"\n",
" for (var ind in mpl.extensions) {\n",
" var fmt = mpl.extensions[ind];\n",
" var option = $(\n",
" '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
" fmt_picker.append(option);\n",
" }\n",
"\n",
" // Add hover states to the ui-buttons\n",
" $( \".ui-button\" ).hover(\n",
" function() { $(this).addClass(\"ui-state-hover\");},\n",
" function() { $(this).removeClass(\"ui-state-hover\");}\n",
" );\n",
"\n",
" var status_bar = $('<span class=\"mpl-message\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"}\n",
"\n",
"mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
" // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
" // which will in turn request a refresh of the image.\n",
" this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
"}\n",
"\n",
"mpl.figure.prototype.send_message = function(type, properties) {\n",
" properties['type'] = type;\n",
" properties['figure_id'] = this.id;\n",
" this.ws.send(JSON.stringify(properties));\n",
"}\n",
"\n",
"mpl.figure.prototype.send_draw_message = function() {\n",
" if (!this.waiting) {\n",
" this.waiting = true;\n",
" this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
" }\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" var format_dropdown = fig.format_dropdown;\n",
" var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
" fig.ondownload(fig, format);\n",
"}\n",
"\n",
"\n",
"mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
" var size = msg['size'];\n",
" if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
" fig._resize_canvas(size[0], size[1]);\n",
" fig.send_message(\"refresh\", {});\n",
" };\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
" var x0 = msg['x0'] / mpl.ratio;\n",
" var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
" var x1 = msg['x1'] / mpl.ratio;\n",
" var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
" x0 = Math.floor(x0) + 0.5;\n",
" y0 = Math.floor(y0) + 0.5;\n",
" x1 = Math.floor(x1) + 0.5;\n",
" y1 = Math.floor(y1) + 0.5;\n",
" var min_x = Math.min(x0, x1);\n",
" var min_y = Math.min(y0, y1);\n",
" var width = Math.abs(x1 - x0);\n",
" var height = Math.abs(y1 - y0);\n",
"\n",
" fig.rubberband_context.clearRect(\n",
" 0, 0, fig.canvas.width, fig.canvas.height);\n",
"\n",
" fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
" // Updates the figure title.\n",
" fig.header.textContent = msg['label'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
" var cursor = msg['cursor'];\n",
" switch(cursor)\n",
" {\n",
" case 0:\n",
" cursor = 'pointer';\n",
" break;\n",
" case 1:\n",
" cursor = 'default';\n",
" break;\n",
" case 2:\n",
" cursor = 'crosshair';\n",
" break;\n",
" case 3:\n",
" cursor = 'move';\n",
" break;\n",
" }\n",
" fig.rubberband_canvas.style.cursor = cursor;\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_message = function(fig, msg) {\n",
" fig.message.textContent = msg['message'];\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
" // Request the server to send over a new figure.\n",
" fig.send_draw_message();\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
" fig.image_mode = msg['mode'];\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Called whenever the canvas gets updated.\n",
" this.send_message(\"ack\", {});\n",
"}\n",
"\n",
"// A function to construct a web socket function for onmessage handling.\n",
"// Called in the figure constructor.\n",
"mpl.figure.prototype._make_on_message_function = function(fig) {\n",
" return function socket_on_message(evt) {\n",
" if (evt.data instanceof Blob) {\n",
" /* FIXME: We get \"Resource interpreted as Image but\n",
" * transferred with MIME type text/plain:\" errors on\n",
" * Chrome. But how to set the MIME type? It doesn't seem\n",
" * to be part of the websocket stream */\n",
" evt.data.type = \"image/png\";\n",
"\n",
" /* Free the memory for the previous frames */\n",
" if (fig.imageObj.src) {\n",
" (window.URL || window.webkitURL).revokeObjectURL(\n",
" fig.imageObj.src);\n",
" }\n",
"\n",
" fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
" evt.data);\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
" else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
" fig.imageObj.src = evt.data;\n",
" fig.updated_canvas_event();\n",
" fig.waiting = false;\n",
" return;\n",
" }\n",
"\n",
" var msg = JSON.parse(evt.data);\n",
" var msg_type = msg['type'];\n",
"\n",
" // Call the \"handle_{type}\" callback, which takes\n",
" // the figure and JSON message as its only arguments.\n",
" try {\n",
" var callback = fig[\"handle_\" + msg_type];\n",
" } catch (e) {\n",
" console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
" return;\n",
" }\n",
"\n",
" if (callback) {\n",
" try {\n",
" // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
" callback(fig, msg);\n",
" } catch (e) {\n",
" console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
" }\n",
" }\n",
" };\n",
"}\n",
"\n",
"// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
"mpl.findpos = function(e) {\n",
" //this section is from http://www.quirksmode.org/js/events_properties.html\n",
" var targ;\n",
" if (!e)\n",
" e = window.event;\n",
" if (e.target)\n",
" targ = e.target;\n",
" else if (e.srcElement)\n",
" targ = e.srcElement;\n",
" if (targ.nodeType == 3) // defeat Safari bug\n",
" targ = targ.parentNode;\n",
"\n",
" // jQuery normalizes the pageX and pageY\n",
" // pageX,Y are the mouse positions relative to the document\n",
" // offset() returns the position of the element relative to the document\n",
" var x = e.pageX - $(targ).offset().left;\n",
" var y = e.pageY - $(targ).offset().top;\n",
"\n",
" return {\"x\": x, \"y\": y};\n",
"};\n",
"\n",
"/*\n",
" * return a copy of an object with only non-object keys\n",
" * we need this to avoid circular references\n",
" * http://stackoverflow.com/a/24161582/3208463\n",
" */\n",
"function simpleKeys (original) {\n",
" return Object.keys(original).reduce(function (obj, key) {\n",
" if (typeof original[key] !== 'object')\n",
" obj[key] = original[key]\n",
" return obj;\n",
" }, {});\n",
"}\n",
"\n",
"mpl.figure.prototype.mouse_event = function(event, name) {\n",
" var canvas_pos = mpl.findpos(event)\n",
"\n",
" if (name === 'button_press')\n",
" {\n",
" this.canvas.focus();\n",
" this.canvas_div.focus();\n",
" }\n",
"\n",
" var x = canvas_pos.x * mpl.ratio;\n",
" var y = canvas_pos.y * mpl.ratio;\n",
"\n",
" this.send_message(name, {x: x, y: y, button: event.button,\n",
" step: event.step,\n",
" guiEvent: simpleKeys(event)});\n",
"\n",
" /* This prevents the web browser from automatically changing to\n",
" * the text insertion cursor when the button is pressed. We want\n",
" * to control all of the cursor setting manually through the\n",
" * 'cursor' event from matplotlib */\n",
" event.preventDefault();\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" // Handle any extra behaviour associated with a key event\n",
"}\n",
"\n",
"mpl.figure.prototype.key_event = function(event, name) {\n",
"\n",
" // Prevent repeat events\n",
" if (name == 'key_press')\n",
" {\n",
" if (event.which === this._key)\n",
" return;\n",
" else\n",
" this._key = event.which;\n",
" }\n",
" if (name == 'key_release')\n",
" this._key = null;\n",
"\n",
" var value = '';\n",
" if (event.ctrlKey && event.which != 17)\n",
" value += \"ctrl+\";\n",
" if (event.altKey && event.which != 18)\n",
" value += \"alt+\";\n",
" if (event.shiftKey && event.which != 16)\n",
" value += \"shift+\";\n",
"\n",
" value += 'k';\n",
" value += event.which.toString();\n",
"\n",
" this._key_event_extra(event, name);\n",
"\n",
" this.send_message(name, {key: value,\n",
" guiEvent: simpleKeys(event)});\n",
" return false;\n",
"}\n",
"\n",
"mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
" if (name == 'download') {\n",
" this.handle_save(this, null);\n",
" } else {\n",
" this.send_message(\"toolbar_button\", {name: name});\n",
" }\n",
"};\n",
"\n",
"mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
" this.message.textContent = tooltip;\n",
"};\n",
"mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
"\n",
"mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
"\n",
"mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
" // Create a \"websocket\"-like object which calls the given IPython comm\n",
" // object with the appropriate methods. Currently this is a non binary\n",
" // socket, so there is still some room for performance tuning.\n",
" var ws = {};\n",
"\n",
" ws.close = function() {\n",
" comm.close()\n",
" };\n",
" ws.send = function(m) {\n",
" //console.log('sending', m);\n",
" comm.send(m);\n",
" };\n",
" // Register the callback with on_msg.\n",
" comm.on_msg(function(msg) {\n",
" //console.log('receiving', msg['content']['data'], msg);\n",
" // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
" ws.onmessage(msg['content']['data'])\n",
" });\n",
" return ws;\n",
"}\n",
"\n",
"mpl.mpl_figure_comm = function(comm, msg) {\n",
" // This is the function which gets called when the mpl process\n",
" // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
"\n",
" var id = msg.content.data.id;\n",
" // Get hold of the div created by the display call when the Comm\n",
" // socket was opened in Python.\n",
" var element = $(\"#\" + id);\n",
" var ws_proxy = comm_websocket_adapter(comm)\n",
"\n",
" function ondownload(figure, format) {\n",
" window.open(figure.imageObj.src);\n",
" }\n",
"\n",
" var fig = new mpl.figure(id, ws_proxy,\n",
" ondownload,\n",
" element.get(0));\n",
"\n",
" // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
" // web socket which is closed, not our websocket->open comm proxy.\n",
" ws_proxy.onopen();\n",
"\n",
" fig.parent_element = element.get(0);\n",
" fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
" if (!fig.cell_info) {\n",
" console.error(\"Failed to find cell for figure\", id, fig);\n",
" return;\n",
" }\n",
"\n",
" var output_index = fig.cell_info[2]\n",
" var cell = fig.cell_info[0];\n",
"\n",
"};\n",
"\n",
"mpl.figure.prototype.handle_close = function(fig, msg) {\n",
" var width = fig.canvas.width/mpl.ratio\n",
" fig.root.unbind('remove')\n",
"\n",
" // Update the output cell to use the data from the current canvas.\n",
" fig.push_to_output();\n",
" var dataURL = fig.canvas.toDataURL();\n",
" // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
" // the notebook keyboard shortcuts fail.\n",
" IPython.keyboard_manager.enable()\n",
" $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
" fig.close_ws(fig, msg);\n",
"}\n",
"\n",
"mpl.figure.prototype.close_ws = function(fig, msg){\n",
" fig.send_message('closing', msg);\n",
" // fig.ws.close()\n",
"}\n",
"\n",
"mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
" // Turn the data on the canvas into data in the output cell.\n",
" var width = this.canvas.width/mpl.ratio\n",
" var dataURL = this.canvas.toDataURL();\n",
" this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
"}\n",
"\n",
"mpl.figure.prototype.updated_canvas_event = function() {\n",
" // Tell IPython that the notebook contents must change.\n",
" IPython.notebook.set_dirty(true);\n",
" this.send_message(\"ack\", {});\n",
" var fig = this;\n",
" // Wait a second, then push the new image to the DOM so\n",
" // that it is saved nicely (might be nice to debounce this).\n",
" setTimeout(function () { fig.push_to_output() }, 1000);\n",
"}\n",
"\n",
"mpl.figure.prototype._init_toolbar = function() {\n",
" var fig = this;\n",
"\n",
" var nav_element = $('<div/>');\n",
" nav_element.attr('style', 'width: 100%');\n",
" this.root.append(nav_element);\n",
"\n",
" // Define a callback function for later on.\n",
" function toolbar_event(event) {\n",
" return fig.toolbar_button_onclick(event['data']);\n",
" }\n",
" function toolbar_mouse_event(event) {\n",
" return fig.toolbar_button_onmouseover(event['data']);\n",
" }\n",
"\n",
" for(var toolbar_ind in mpl.toolbar_items){\n",
" var name = mpl.toolbar_items[toolbar_ind][0];\n",
" var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
" var image = mpl.toolbar_items[toolbar_ind][2];\n",
" var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
"\n",
" if (!name) { continue; };\n",
"\n",
" var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
" button.click(method_name, toolbar_event);\n",
" button.mouseover(tooltip, toolbar_mouse_event);\n",
" nav_element.append(button);\n",
" }\n",
"\n",
" // Add the status bar.\n",
" var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
" nav_element.append(status_bar);\n",
" this.message = status_bar[0];\n",
"\n",
" // Add the close button to the window.\n",
" var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
" var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
" button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
" button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
" buttongrp.append(button);\n",
" var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
" titlebar.prepend(buttongrp);\n",
"}\n",
"\n",
"mpl.figure.prototype._root_extra_style = function(el){\n",
" var fig = this\n",
" el.on(\"remove\", function(){\n",
"\tfig.close_ws(fig, {});\n",
" });\n",
"}\n",
"\n",
"mpl.figure.prototype._canvas_extra_style = function(el){\n",
" // this is important to make the div 'focusable\n",
" el.attr('tabindex', 0)\n",
" // reach out to IPython and tell the keyboard manager to turn it's self\n",
" // off when our div gets focus\n",
"\n",
" // location in version 3\n",
" if (IPython.notebook.keyboard_manager) {\n",
" IPython.notebook.keyboard_manager.register_events(el);\n",
" }\n",
" else {\n",
" // location in version 2\n",
" IPython.keyboard_manager.register_events(el);\n",
" }\n",
"\n",
"}\n",
"\n",
"mpl.figure.prototype._key_event_extra = function(event, name) {\n",
" var manager = IPython.notebook.keyboard_manager;\n",
" if (!manager)\n",
" manager = IPython.keyboard_manager;\n",
"\n",
" // Check for shift+enter\n",
" if (event.shiftKey && event.which == 13) {\n",
" this.canvas_div.blur();\n",
" event.shiftKey = false;\n",
" // Send a \"J\" for go to next cell\n",
" event.which = 74;\n",
" event.keyCode = 74;\n",
" manager.command_mode();\n",
" manager.handle_keydown(event);\n",
" }\n",
"}\n",
"\n",
"mpl.figure.prototype.handle_save = function(fig, msg) {\n",
" fig.ondownload(fig, null);\n",
"}\n",
"\n",
"\n",
"mpl.find_output_cell = function(html_output) {\n",
" // Return the cell and output element which can be found *uniquely* in the notebook.\n",
" // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
" // IPython event is triggered only after the cells have been serialised, which for\n",
" // our purposes (turning an active figure into a static one), is too late.\n",
" var cells = IPython.notebook.get_cells();\n",
" var ncells = cells.length;\n",
" for (var i=0; i<ncells; i++) {\n",
" var cell = cells[i];\n",
" if (cell.cell_type === 'code'){\n",
" for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
" var data = cell.output_area.outputs[j];\n",
" if (data.data) {\n",
" // IPython >= 3 moved mimebundle to data attribute of output\n",
" data = data.data;\n",
" }\n",
" if (data['text/html'] == html_output) {\n",
" return [cell, data, j];\n",
" }\n",
" }\n",
" }\n",
" }\n",
"}\n",
"\n",
"// Register the function which deals with the matplotlib target/channel.\n",
"// The kernel may be null if the page has been refreshed.\n",
"if (IPython.notebook.kernel != null) {\n",
" IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
"}\n"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"<img src=\"data:image/png;base64,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x44duO+++5r9GT8/PyxduvSml3mzv25GABPABDABTACrE8DtKQKYACaACWACmCkhAtgNnT17Fr/73e9w/Phxx6+5AsA3e8ERApgAJoAJYAKYAHZ3BDABTAATwAQwU0IEsBt644034OHhgXvuuccxDw8P3HXXXbjnnnuwb98+p/4KNM8AE8AEMAFMABPASs0O4JB74xBxX0KbF353nLzJgKTc6464d7zTi+ww2emF3zNO3mR8zZz5HjeZnK/Zryc6Pblfs4gHEp2eqdcSWZP1cyr3Z8Vdc9P/F4weI3nf0I4jgN3QTz/9hNLS0ibTarWYOHEiSktLHS+CtXv3bsef+eKLL5x+ESzN9Ax4zbW6fEFjs4XM2UfjWrNQfbqQmfovEzbvGVZhC5iQI2RyHw3+peli1guZzzSruE0Xt57pYjZofq6wSRGZQuY71eryDU7M4EGOiyKACWACmAAmgJkSIoAV0vV/BRpofBskT09PvP/++yguLkZQUBCCgoLadJkEMAFMABPABDABLKc33ngD33//PQBgz549eP31152+LAKYACaACWACmCkhAlgh3Qjga9euYd68efjtb3+L35xRIfMAACAASURBVPzmNxg9ejTOnTvXpsskgAlgApgAJoAJYDnd6r1+2xIBTAATwAQwAcyUEAGs4ghgApgAJoAJYHUD+Pz58zAajdDpdIiNjUV9fT3S09MRGBgISZJQUlKC8vJyhIWFQa/XO94KKS8vD5s2bQIAFBYWwmKx4NKlS5AkCUajETExMfj666/x+9//HlqtFkuWLGnyZ1544QUEBARAkiS8++67Ld62m70uBQFMABPABDABzNwZAaziCGACmAAmgAlgdQO4pqYGdXV1AIAFCxZgw4YNiImJgc1mAwA0NDQgKSkJe/bsAQBMmzYNBw4caBHA+/btw5IlSxx/Dmh6Btj+Z3744QcEBgaipqamycfe2M3emYAAJoAJYAKYAGbujABWcQQwAUwAE8AEsLoB/N1332HkyJEwGAzo2bMnXnzxRWRnZzf5GJPJhIsXLwIAtmzZgq1bt+LFF190APitt96CxWJBXV0dVq1ahYSEBMdltATgjz/+2HEm+ZfiGWACmAAmgAlgpsQIYBVnB3CPJ9cKwWTf5WIm8i2FRG3wbKuwifo6912eK+xtkESCT9TXQjJlCVuvNKuw9XvDImTBo9YL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IiMjFRUVpTvuuEMHDhzw/v++ffvq5MmT5wRwWVmZSkpKvCsuLgbAABgAA2AATAEPAIdwABgAA2AADICDF8CV77m7YsUKjR07Vh6PR3FxcSovL9fJkycVFxenkydP6qeffpIklZaWql27dpKkxx57TK+//rokKS4uTidOnFB+fr5eeeUV7+VUVFRUuc6WLVtq7969Onr0qC666CJ98803Onz4sBwOhySpa9euOnTokCQpPT1dBw4cqPIMcHl5uU6cOCFJGjVqlN58881zAtjlcslms501AAyAATAABsAUyABwCAeAATAABsAAOHgBPG7cOElSYWGh7rzzTn3zzTe67LLL5HA45HA41KZNG+3fv19LliyRw+FQYmKifvOb30iSPv/8cw0cOFDvvfeehg0bJkk6cOCAevfurbfffrvaf17dvn37av+7c+fOkqSmTZt6r7tt27basmVLFQB//fXXysjIUGJiolq3bq0XX3yRZ4ABMAAGwACYLBcADuEqAdx87qOKeP6Jep+pV/k1+SrQ1y5+1MhMAjjymVnG1mpmvpG1f+MhY4tZPcHIItwzjM3U77trFz+qB9/vbWQzPko1tpYLpxnZ1Yseq/e1fOFh418DXFhYqKysLFVUVMhut3v/afPx48clncLqjz/+qJ9++kmXX3659zKcTqdGjRqlgoIC7/f16tVLffv21Y4dO866zg4dOlT735UATk5O1pEjRyRJJ0+elMfj0bRp07zPNOfl5ekvf/mLJCknJ0dut5uvAQbAABgAA2CyXAA4hAPAABgAA2AAbB0AS9KqVauUmJgop9Opfv36SZKmTZumdu3a6Z577tH111/vvYxZs2bpqquuqvJPnV999VVFRUVVe50/B+CtW7eqS5cucjqdSk1NVWlpqTZs2KCEhASNGjVK27dvV1RUlHr27KkBAwYAYAAMgAEwAAbAlgwAh3AAGAADYAAMgIMTwKZavHixZs2aFehjVBsABsAAGAADYAqGAHAIB4ABMAAGwAA4fAA8b9482e127wtZBVsAGAADYAAMgCkYAsAhHAAGwAAYAAPg8AFwsFd5n9T16tFKvXZC3XfdRL+W0u4Rn5d640N+rXvzUT7PL1hc84Bf8wdFqU2H+TV/brOU397l81J/N8Kv+XPd/s6fX+vuV9/v83xFpHe+/H3w/9e95Ti/lnr9H31a12vGct9g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adWqVcrJyanV+fkaYAAMgAEwAKZgCACHcAAYAANgAAyAwwfAe/bsUXx8vFJTU9WvX7+zALx161Z16dJFTqdTqampKi0trXL57dq103333afOnTtX+bripKQk2e12DR8+XNKprwHu16+fUlNTFR8fr71799bq/AAYAANgAAyAKRgCwCFc5YONXmvuVL8N99b7Bm78LyNruXCasUUtm2xkI9+73dgi/vKEsSWsud/IRmwdZGymPtEQ+cwsYzP5yuYRf37CyFrNyjc2U69qfq1rdr3v6j/mhs2DnNNRfa7cbrfmzp1b58sHwAAYAANgAEzBEAAO4QAwAAbAABgAA+DaBoABMAAGwAAYAIdDADiEA8AAGAADYAAMgIMlL4B/dbtPD3T9BnAAHiR7H+D7gTl/f96Bus38Raw/nzTw5+ccSLj7g+fUS+7x65M8gfpESfIv+vl37gB9Ysz5iz7cN1g4ABzCAWAADIABMAAGwMESAAbAABgAA2AKhgBwCAeAATAABsAAGACbrG/fvioqKqrVjwXAABgAA2AATMEQAA7hADAABsAAGAADYJMBYAAMgAEwACarBYBDuMoHG89si9b/7Iyr96WtH2lkf/7UbmzZ2wYamYlPMFTOJCZvfTvbyIZtHWxsd7+bZWSmPjkStWyyEteONzZTbykU+dLjxtZiwXQjM/HJi6tmPRZWD3I2btyo6OhoOZ1OuVwujR07VomJierUqZO2b98uSVqzZo3atWun3r17KyYmpkYAl5WVqaSkxLvi4mIADIABMAAGwBTwAHAIB4ABMAAGwAAYANelSZMm6Y033pAkVVRU6KeffpIkvffee8rMzJQkde7cWd9//73KysoUERFRI4BdLpdsNttZA8AAGAADYABMgQwAh3AAGAADYAAMgAFwXdq/f7+ys7OVmZmpN954Q1OmTJHdbpfdbpfT6ZQkdezY0fvj09PTeQYYAANgAAyAyVIB4BAOAANgAAyAATAArkulpaWSpPLyckVFRSk+Pl6StHXrVjkcDkmnngE+dOiQysrKFBkZydcAA2AADIABMFkqABzCAWAADIABMAAGwHVpzpw5SkhIUGxsrPLy8nTrrbfK4XBo4sSJXgCvXr3a+zXACQkJABgAA2AADIDJUgHgEA4AA2AADIABMAAOlgAwAAbAABgAUzAEgEO4ygcbz27rKPfOmHpfxHMzjezJj7saW+9/DTey9vfkG9u47f2M7erH842s9TRzG7BhqJG1WjjN2No8MNvYTL2lUMS8mcbW+tWpRnbNY/n1vlYPT+dBTj1VeZ+U9Mu+vsHEBzSfvu4RY3yePw/Qk88foJSLsnxe8nm3+T4/YRJIFPmFmkDeZoE6t5/z5xMOKb+9y6/59cklP/9e8PWTFV0u7M99g4UDwCEcAAbAABgAA2AAHCwBYABsCUha9dwAGABTrQPAIRwABsAAGAADYABcVFSkvn37er+9fPlyuVyuBj8HAAbAloCkVc8NgAEw1ToAHMIBYAAMgAEwAAbAABgAA2AADIABMP07ABzCAWAADIABMAAGwDUBeOHChYqOjlbnzp21atUqSZLD4dDRo0clSX379lVRUZFef/11derUSU6nU88++6wkye12y263KzY2VuvWravVOQAwALYEJK16bgAMgKnWAeAQrvLBxv+8d7MWft6h3mfqFZVnfJRqbP+762YjM/WK2GnrRxp5Be/KzfooxchMot3UK4TnfphmbM99mmhs+R8nG5nJ22P+Z52N7NXP29f7XnzvD5Z/kFNUVKTLLrtMDodDDodDUVFRmjRpktq2batjx46ppKREHTp0kFQ9gAcPHqyPPvpIklRRUaGDBw8qNTVVHo9HP/74o/ftkc6srKxMJSUl3hUXFwNgABz8kLTquQEwAKZaB4BDOAAMgAEwAAbAALi6Z4CHDRum9PR07/fFxMToxIkTcjqdXgD36dNHRUVF2rlzp4YOHarBgwdr48aN2rx5s5o3b+4FdZs2baq9XpfLJZvNdtYAMAAOakha9dwAGABTrQPAIRwABsAAGAADYABcHYAnTZqkm266yfsMcPv27SVJvXv31ieffKITJ07ouuuuU1FRkUpLSyVJ+/btU1JSkr777jvdcsst8ng8kqTjx49Xe708AwyALQlJq54bAANgqnUAOIQDwAAYAANgAAyAa/oa4AULFqhTp07q3LmzVqxYIUlas2aNoqKilJmZqcTERBUVFWnixIlKTExUTEyMFixYIEmaP3++EhIS5HQ6NXLkyFqdg68BBsCWgKRVzw2AATDVOgAcwgFgAAyAATAABsDBEgAGwJaApFXPDYABMNU6ABzCAWAADIABMAAGwMESAAbAloCkVc8NgAEw1ToAHMJVPthwLh+h5H+Mqfe9XdTKyEy+HY2p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XHONysrKAn10ojoHgEmSNHfuXEVERKhRo0aKjo7Wpk2bAn2kGjvzjdgr53a7A320OhXsAJak5cuXKyoqSo0bN9b1118f9K8C/cMPP2j06NGKiIjQhRdeqFatWunhhx8OKMLOrKCgoNrfv1lZWZJOPTsxefJkXX755WrcuLG6du3qfVXrQHaucxcVFdX457KgoCAoz1xdADhwWek+KNANGDBAV1xxhRo1aqQrr7xSAwYMCOr3Zw9EVv17NpCd6zYrLS1VSkqKmjZtqgsuuECRkZEaOnQon6QiywaAiYiIiIiIKCwCwERERERERBQWAWAiIiIiIiIKiwAwERERERERhUUAmIiIiIiIiMIiAExERERERERhEQAmIiIiIiKisAgAExERERERUVgEgImIiIiIiCgsAsBEREREREQUFgFgIiIiIiIiCosAMBEREREREYVFAJiIiIiIiIjCIgBMREREREREYREAJiIiIiIiorAIABMREREREVFYBICJiIiIiIgoLALAREREREREFBYBYCIiIiIiIgqLADARERERERGFRQCYiIiIiIiIwiIATERERERERGERACYiIiIiIqKwCAATERERERFRWASAiYiIiIiIKCwCwERERERERBQWAWAiIiIiIiIKiwAwERERERERhUUAmIiIiIiIiMIiAExERERERERhEQAmIiIiIiKisAgAExERERERUVgEgImIiIiIiCgsAsBEREREREQUFgFgIiIiIiIiCosAMBEREREREYVFAJiIiIiIiIjCIgBMREREREREYREAJiIiIiIiorAIABMREREREVFYBICJiIiIiIgoLALAREREREREFBYBYCIiIiIiIgqLADARERERERGFRQCYiIiIiIiIwiIATERERERERGERACYiIiIiIqKwCAATERERERFRWASAiYiIiIiIKCwCwERERERERBQWAWAiIiIiIiIKiwAwERERERERhUUAmIiIiIiIiMIiAExERERERERhEQAmIiIiIiKisAgAExERERERUVj0/wDlls3uGgbTIQAAAABJRU5ErkJggg==\" width=\"960\">"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"ename": "KeyboardInterrupt",
"evalue": "",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-8-99403ac89069>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mchunk\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mFrameGenerator\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maudio\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mframeSize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mchuncksize\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhopSize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mchuncksize\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 22\u001b[0;31m \u001b[0mcallback\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mchunk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'e'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;32m<ipython-input-5-920ac2cb8eba>\u001b[0m in \u001b[0;36mcallback\u001b[0;34m(in_data, frame_count, time_info, status)\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 9\u001b[0m \u001b[0mvimp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m \u001b[0;34m>>\u001b[0m \u001b[0mfc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msignal\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 10\u001b[0;31m \u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mvimp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 11\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mpool\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcontainsKey\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'melbands'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.local/lib/python3.7/site-packages/essentia/__init__.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(gen)\u001b[0m\n\u001b[1;32m 146\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mVectorInput\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconnections\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 147\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mEssentiaError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'VectorInput is not connected to anything...'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 148\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_essentia\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 149\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 150\u001b[0m \u001b[0mlog\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdebug\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mEPython\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Successfully imported essentia python module (log fully available and synchronized with the C++ one)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mKeyboardInterrupt\u001b[0m: "
]
}
],
"source": [
"# initialize plots\n",
"f, ax = plt.subplots(1, 2, figsize=[9.6, 7])\n",
"f.canvas.draw()\n",
"\n",
"ax[0].set_title('Mel Bands')\n",
"img_mel = ax[0].imshow(np.zeros([numberBands, patchSize]),\n",
" aspect='auto', origin='lower')\n",
"\n",
"ax[1].set_title('Activations')\n",
"img_act = ax[1].matshow(np.zeros([50, 20]), aspect='0.7')\n",
"ax[1].xaxis.set_ticks_position('bottom')\n",
"_ = plt.yticks(np.arange(50), msd_labels, fontsize=6)\n",
"\n",
"# reset storage and counter\n",
"pool.clear()\n",
"frames = []\n",
"tokens = {'mel': 0, 'activations': 0}\n",
"\n",
"from essentia.standard import FrameGenerator\n",
"\n",
"for chunk in FrameGenerator(audio, frameSize=chuncksize, hopSize=chuncksize):\n",
" callback(chunk, 0, 0, 'e')"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment