├── README.md ├── AI_Tunes_GPT_3_Training.ipynb ├── License.txt └── AI_Tunes_Generate_Music.ipynb /README.md: -------------------------------------------------------------------------------- 1 | # **AI-Tunes: Creating New Songs with Artificial Intelligence** 2 | ### **How I fine-tuned OpenAI's GPT-3 to generate music with a global structure** 3 | By Robert. A Gonsalves 4 | 5 | You can read my article about this project on [Medium](https://towardsdatascience.com/ai-tunes-creating-new-songs-with-artificial-intelligence-4fb383218146). 6 | 7 | The source code is released under the CC BY-SA license. 8 | 9 | ![CC BY-NC-SA](https://licensebuttons.net/l/by-sa/4.0/88x31.png) 10 | -------------------------------------------------------------------------------- /AI_Tunes_GPT_3_Training.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "AI-Tunes GPT-3 Training ", 7 | "provenance": [], 8 | "collapsed_sections": [], 9 | "toc_visible": true, 10 | "authorship_tag": "ABX9TyOMwUdHMvYuITMzehHUcLVz", 11 | "include_colab_link": true 12 | }, 13 | "kernelspec": { 14 | "name": "python3", 15 | "display_name": "Python 3" 16 | }, 17 | "language_info": { 18 | "name": "python" 19 | } 20 | }, 21 | "cells": [ 22 | { 23 | "cell_type": "markdown", 24 | "metadata": { 25 | "id": "view-in-github", 26 | "colab_type": "text" 27 | }, 28 | "source": [ 29 | "\"Open" 30 | ] 31 | }, 32 | { 33 | "cell_type": "markdown", 34 | "metadata": { 35 | "id": "EVelIY2TaRy9" 36 | }, 37 | "source": [ 38 | "# **AI-Tunes: Creating New Songs with Artificial Intelligence**\n", 39 | "### **How I fine-tuned OpenAI's GPT-3 to generate music with a global structure**\n", 40 | "By Robert. A Gonsalves\n", 41 | "\n", 42 | "You can read my article about this project on [Medium](https://towardsdatascience.com/ai-tunes-creating-new-songs-with-artificial-intelligence-4fb383218146).\n", 43 | "\n", 44 | "The source code is released under the CC BY-SA license.\n", 45 | "\n", 46 | "![CC BY-NC-SA](https://licensebuttons.net/l/by-sa/4.0/88x31.png)\n" 47 | ] 48 | }, 49 | { 50 | "cell_type": "markdown", 51 | "metadata": { 52 | "id": "bAP6FaK9hzTu" 53 | }, 54 | "source": [ 55 | "##**Initialize the System**" 56 | ] 57 | }, 58 | { 59 | "cell_type": "code", 60 | "metadata": { 61 | "id": "5Qe6fbeWTc3J" 62 | }, 63 | "source": [ 64 | "!git clone https://github.com/robgon-art/music-geometry-eval\n", 65 | "!git clone https://github.com/00sapo/OpenEWLD\n", 66 | "!gsutil -q -m cp -r gs://magentadata/models/music_transformer/primers/* /content/\n", 67 | "!gsutil -q -m cp gs://magentadata/soundfonts/Yamaha-C5-Salamander-JNv5.1.sf2 /content/\n", 68 | "!apt-get update -qq && apt-get install -qq libfluidsynth1 build-essential libasound2-dev libjack-dev\n", 69 | "!pip install magenta\n", 70 | "!pip install pyfluidsynth\n", 71 | "!pip install openai\n", 72 | "import note_seq\n", 73 | "SF2_PATH = '/content/Yamaha-C5-Salamander-JNv5.1.sf2'\n", 74 | "SAMPLE_RATE = 16000\n", 75 | "\n", 76 | "!wget https://wim.vree.org/svgParse/xml2abc.py-143.zip\n", 77 | "!unzip xml2abc.py-143.zip\n", 78 | "import sys\n", 79 | "sys.path.append('/content/music-geometry-eval/music_geometry_eval')\n", 80 | "import music_geometry_eval\n", 81 | "import glob\n", 82 | "import random\n", 83 | "import music21\n", 84 | "import music_geometry_eval\n", 85 | "from collections.abc import Iterable\n", 86 | "import numpy as np\n", 87 | "random.seed(42)\n", 88 | "song_files = glob.glob(\"OpenEWLD/dataset/*/*/*.mxl\")\n", 89 | "random.shuffle(song_files)\n", 90 | "num_files = len(song_files)\n", 91 | "print(song_files)\n", 92 | "print(\"number of song files is\", num_files)\n", 93 | "\n", 94 | "transpose_dict = {\"G major\": 5, \"A- major\": 4, \"A major\": 3, \"B- major\": 2, \"B major\": 1, \"C major\": 0, \"D- major\": -1, \"D major\": -2, \"E- major\": -3, \"E major\": -4, \"F major\": -5, \"F# major\": -6}" 95 | ], 96 | "execution_count": null, 97 | "outputs": [] 98 | }, 99 | { 100 | "cell_type": "markdown", 101 | "metadata": { 102 | "id": "Y8k890KUiCe9" 103 | }, 104 | "source": [ 105 | "##**Evaluate the Song Files**" 106 | ] 107 | }, 108 | { 109 | "cell_type": "code", 110 | "metadata": { 111 | "id": "gxPQe3mEi5_E" 112 | }, 113 | "source": [ 114 | "keys = {}\n", 115 | "metres = {}\n", 116 | "\n", 117 | "cmm_arr = np.empty((0), np.float32)\n", 118 | "lm_arr = np.empty((0), np.float32)\n", 119 | "cent_arr = np.empty((0), np.float32)\n", 120 | "\n", 121 | "for s in song_files:\n", 122 | " print(\"\\n\" + s)\n", 123 | " score = music21.converter.parse(s)\n", 124 | "\n", 125 | " key = None\n", 126 | " metre = None\n", 127 | " part = score.parts[0]\n", 128 | " for p in part:\n", 129 | " if isinstance(p, Iterable):\n", 130 | " for n in p:\n", 131 | " if type(n) == music21.key.Key:\n", 132 | " key = n.name\n", 133 | " if type(n) == music21.meter.TimeSignature:\n", 134 | " metre = n.ratioString\n", 135 | "\n", 136 | " if metre in metres.keys():\n", 137 | " metres[metre] += 1\n", 138 | " else:\n", 139 | " metres[metre] = 1\n", 140 | "\n", 141 | " if key in keys.keys():\n", 142 | " keys[key] += 1\n", 143 | " else:\n", 144 | " keys[key] = 1\n", 145 | "\n", 146 | " if not (metre == \"4/4\" or metre == \"2/2\"):\n", 147 | " continue\n", 148 | "\n", 149 | " if not \"major\" in key:\n", 150 | " continue\n", 151 | "\n", 152 | " print(key, metre)\n", 153 | "\n", 154 | " if key in keys.keys():\n", 155 | " keys[key] += 1\n", 156 | " else:\n", 157 | " keys[key] = 1\n", 158 | "\n", 159 | " if key in transpose_dict.keys():\n", 160 | " interval = transpose_dict[key]\n", 161 | " print(\"transposing from key\", key, \"to C major using interval\", interval)\n", 162 | " score = score.transpose(interval)\n", 163 | "\n", 164 | " note_array = []\n", 165 | "\n", 166 | " for p in part:\n", 167 | " if isinstance(p, Iterable):\n", 168 | " for n in p:\n", 169 | " if type(n) == music21.note.Note:\n", 170 | " note_array.append([int(n.pitch.ps), int(n.quarterLength*4+0.5)])\n", 171 | "\n", 172 | " # print(note_array)\n", 173 | "\n", 174 | " CMM = music_geometry_eval.calculate_time_supported_conjunct_melodic_motion(note_array)\n", 175 | " LM = music_geometry_eval.calculate_time_supported_limited_macroharmony(note_array, span_size=32)\n", 176 | " CENT = music_geometry_eval.calculate_time_supported_centricity(note_array, span_size=32)\n", 177 | "\n", 178 | " print(\"CMM :\", round(CMM, 4))\n", 179 | " print(\"LM :\", round(LM, 4))\n", 180 | " print(\"CENT:\", round(CENT, 4))\n", 181 | " \n", 182 | " cmm_arr = np.append(cmm_arr, CMM)\n", 183 | " lm_arr = np.append(lm_arr, LM)\n", 184 | " cent_arr = np.append(cent_arr, CENT)\n", 185 | "\n", 186 | "print(metres)\n", 187 | "print(keys)" 188 | ], 189 | "execution_count": null, 190 | "outputs": [] 191 | }, 192 | { 193 | "cell_type": "markdown", 194 | "metadata": { 195 | "id": "1jid4deViGv8" 196 | }, 197 | "source": [ 198 | "## **Show the Statistics**" 199 | ] 200 | }, 201 | { 202 | "cell_type": "code", 203 | "metadata": { 204 | "id": "YxWpBVrOZKpq" 205 | }, 206 | "source": [ 207 | "CMM_mean = cmm_arr.mean()\n", 208 | "CMM_std = cmm_arr.std()\n", 209 | "\n", 210 | "LM_mean = lm_arr.mean()\n", 211 | "LM_std = lm_arr.std()\n", 212 | "\n", 213 | "CENT_mean = cent_arr.mean()\n", 214 | "CENT_std = cent_arr.std()\n", 215 | "\n", 216 | "print(\"Conjunct Melodic Motion (CMM) :\", round(CMM_mean, 4), \"±\", round(CMM_std, 4))\n", 217 | "print(\"Limited Macroharmony (LM) :\", round(LM_mean, 4), \"±\", round(LM_std, 4))\n", 218 | "print(\"Centricity (CENT):\", round(CENT_mean, 4), \"±\", round(CENT_std, 4))" 219 | ], 220 | "execution_count": null, 221 | "outputs": [] 222 | }, 223 | { 224 | "cell_type": "markdown", 225 | "metadata": { 226 | "id": "HXx2UXq7iXyN" 227 | }, 228 | "source": [ 229 | "## **Prepare the Training Data**" 230 | ] 231 | }, 232 | { 233 | "cell_type": "code", 234 | "metadata": { 235 | "id": "bR5eeHio92KI" 236 | }, 237 | "source": [ 238 | "import subprocess\n", 239 | "from collections.abc import Iterable\n", 240 | "\n", 241 | "num_prompts = 0\n", 242 | "prompt_file = open(\"songs.jsonl\", \"w\")\n", 243 | "prompts = []\n", 244 | "original_songs = []\n", 245 | "for s in song_files:\n", 246 | " print(s)\n", 247 | " score = music21.converter.parse(s)\n", 248 | "\n", 249 | " key = None\n", 250 | " metre = None\n", 251 | " part = score.parts[0]\n", 252 | " for p in part:\n", 253 | " if isinstance(p, Iterable):\n", 254 | " for n in p:\n", 255 | " if type(n) == music21.key.Key:\n", 256 | " key = n.name\n", 257 | " if type(n) == music21.meter.TimeSignature:\n", 258 | " metre = n.ratioString\n", 259 | " print(key, metre)\n", 260 | "\n", 261 | " if not (metre == \"4/4\" or metre == \"2/2\"):\n", 262 | " continue\n", 263 | "\n", 264 | " if not \"major\" in key:\n", 265 | " continue\n", 266 | "\n", 267 | " if key in transpose_dict.keys():\n", 268 | " interval = transpose_dict[key]\n", 269 | " print(\"transposing from key\", key, \"to C major using interval\", interval)\n", 270 | " score = score.transpose(interval)\n", 271 | "\n", 272 | " score.write('xml', fp='song.xml')\n", 273 | "\n", 274 | " try:\n", 275 | " output_bytes = subprocess.check_output([\"python\", \"/content/xml2abc_143/xml2abc.py\", \"song.xml\", \"-u\", \"-d\", \"4\"], timeout=5)\n", 276 | " output = output_bytes.decode(\"utf-8\").strip()\n", 277 | " with open(\"song.txt\", \"w\") as abc_file:\n", 278 | " abc_file.write(output)\n", 279 | " except:\n", 280 | " print(\"Unexpected error:\", sys.exc_info()[0])\n", 281 | " continue\n", 282 | "\n", 283 | " showed_title = False\n", 284 | " prompt_string = \"\"\n", 285 | " completion_string = \"\"\n", 286 | " is_header = True\n", 287 | " with open(\"song.txt\") as song_file:\n", 288 | " lines = song_file.readlines()\n", 289 | " for line in lines:\n", 290 | " line = line.replace(\"$\", \"\")\n", 291 | " line = line.replace(\"dc=\", \"\")\n", 292 | " line = line.strip()\n", 293 | "\n", 294 | " if line.startswith(\"V:\"):\n", 295 | " is_header = False\n", 296 | "\n", 297 | " if is_header:\n", 298 | " if line.startswith(\"X:\") or line.startswith(\"C:\"):\n", 299 | " prompt_string += line+\"\\n\"\n", 300 | "\n", 301 | " if line.startswith(\"T:\") and not showed_title:\n", 302 | " prompt_string += line+\"\\n\"\n", 303 | " showed_title = True\n", 304 | " else:\n", 305 | " if not line.startswith(\"w:\") and not line.startswith(\"V:\"):\n", 306 | "\n", 307 | " # remove end of line comments\n", 308 | " index = line.rfind('%')\n", 309 | " if index > 0:\n", 310 | " line = line[:index].strip()\n", 311 | "\n", 312 | " # remove inline comments\n", 313 | " parts = line.split('\"')\n", 314 | " newline = \"\"\n", 315 | " for i, p in enumerate(parts):\n", 316 | " if i%2 == 0:\n", 317 | " newline += p\n", 318 | " elif not p.startswith(\"^\"):\n", 319 | " newline += '\"' + p + '\"'\n", 320 | " line = ' '.join(newline.split())\n", 321 | "\n", 322 | " completion_string += line+\"\\n\"\n", 323 | "\n", 324 | " if line.startswith(\"V:\"):\n", 325 | " is_header = False\n", 326 | "\n", 327 | " prompt_string = prompt_string.replace(\":\",\": \")\n", 328 | " prompt_string = prompt_string.replace('\"', \"`\")\n", 329 | " prompt_string = prompt_string.replace(\"\\n\",\" $ \")\n", 330 | "\n", 331 | " completion_string = completion_string.replace('\"', \"`\")\n", 332 | " completion_string = completion_string.strip().replace(\"\\n\",\" $ \")\n", 333 | "\n", 334 | " prompt = '{\"prompt\": \"' + prompt_string + '\", '\n", 335 | " prompt += '\"completion\": \" ' + completion_string + ' $ \"}\\n'\n", 336 | "\n", 337 | " if prompt not in prompts:\n", 338 | " original_songs.append(s)\n", 339 | " prompt_file.write(prompt)\n", 340 | " prompts.append(prompt)\n", 341 | " num_prompts += 1\n", 342 | "\n", 343 | "prompt_file.close()\n", 344 | "print(\"num prompts is\", num_prompts)" 345 | ], 346 | "execution_count": null, 347 | "outputs": [] 348 | }, 349 | { 350 | "cell_type": "markdown", 351 | "metadata": { 352 | "id": "o4_76slDij7U" 353 | }, 354 | "source": [ 355 | "# **Check the Training File**" 356 | ] 357 | }, 358 | { 359 | "cell_type": "code", 360 | "metadata": { 361 | "id": "RZ5gLbUaEkYR" 362 | }, 363 | "source": [ 364 | "!openai tools fine_tunes.prepare_data -f /content/songs.jsonl" 365 | ], 366 | "execution_count": null, 367 | "outputs": [] 368 | }, 369 | { 370 | "cell_type": "markdown", 371 | "metadata": { 372 | "id": "fh8MPqvump8m" 373 | }, 374 | "source": [ 375 | "# **Train GPT-3**" 376 | ] 377 | }, 378 | { 379 | "cell_type": "code", 380 | "metadata": { 381 | "id": "-5lvuiZLd5Hj" 382 | }, 383 | "source": [ 384 | "!export OPENAI_API_KEY=\"\"; openai api fine_tunes.create -t songs.jsonl --model curie --n_epochs 5" 385 | ], 386 | "execution_count": null, 387 | "outputs": [] 388 | }, 389 | { 390 | "cell_type": "markdown", 391 | "metadata": { 392 | "id": "ho0Xy7cEmw0t" 393 | }, 394 | "source": [ 395 | "# **Generate Five Songs**" 396 | ] 397 | }, 398 | { 399 | "cell_type": "code", 400 | "metadata": { 401 | "id": "hol2mChWjzrr" 402 | }, 403 | "source": [ 404 | "import openai\n", 405 | "import music21\n", 406 | "import numpy as np\n", 407 | "from collections.abc import Iterable\n", 408 | "import numpy as np\n", 409 | "\n", 410 | "CMM_mean = 2.2715\n", 411 | "CMM_std = 0.4831\n", 412 | "\n", 413 | "LM_mean = 2.0305\n", 414 | "LM_std = 0.5386\n", 415 | "\n", 416 | "CENT_mean = 0.3042\n", 417 | "CENT_std = 0.0891\n", 418 | "\n", 419 | "band_name = \"I Lost My Voice\"\n", 420 | "song_name = \"The Rare Pearls\"\n", 421 | "prompt = \"X: 1 $ T: \" + song_name + \" $ C: \" + band_name + \" $ \"\n", 422 | "print(prompt)\n", 423 | "print()\n", 424 | "\n", 425 | "openai.api_key = \"\"\n", 426 | "\n", 427 | "songs_with_scores = []\n", 428 | "score_arr = np.empty((0), np.float32)\n", 429 | "\n", 430 | "for i in range(5):\n", 431 | " print(\"\\n Generating Song\", i)\n", 432 | " response = openai.Completion.create(\n", 433 | " model=\"curie:ft-user-j0julqovorjakyuyt3kv3zci-2021-08-24-11-42-59\",\n", 434 | " prompt=prompt,\n", 435 | " stop = \" $ \",\n", 436 | " temperature=0.75,\n", 437 | " top_p=1.0,\n", 438 | " frequency_penalty=0.0,\n", 439 | " presence_penalty=0.0,\n", 440 | " max_tokens = 1000)\n", 441 | "\n", 442 | " print(response)\n", 443 | " print()\n", 444 | "\n", 445 | " formatted_prompt = \"X: 1 $ T: \" + song_name + \" $ C: \" + band_name + \" $ L: 1/4 $ M: 4/4 $ K: C $ V: 1 treble\"\n", 446 | " formatted_prompt = formatted_prompt.replace(\" $ \", \"\\n\")\n", 447 | " formatted_prompt = formatted_prompt.replace(\"\", \"\").strip()\n", 448 | "\n", 449 | " formatted_song = response[\"choices\"][0][\"text\"].strip()\n", 450 | " formatted_song = formatted_song.replace('`', '\"')\n", 451 | " formatted_song = formatted_song.replace(\" $ \", \"\\n\")\n", 452 | " new_song = formatted_prompt+ \"\\n\" + formatted_song\n", 453 | " print(new_song)\n", 454 | " with open(\"new_song.abc\", \"w\") as new_song_file:\n", 455 | " new_song_file.write(new_song)\n", 456 | "\n", 457 | " song = music21.converter.parse(\"new_song.abc\")\n", 458 | "\n", 459 | " part = song.parts[0]\n", 460 | " chord_end = song.highestTime\n", 461 | " for pi in reversed(range(len(part))):\n", 462 | " p = part[pi]\n", 463 | " for ni in reversed(range(len(p))):\n", 464 | " n = p[ni]\n", 465 | " if type(n) == music21.harmony.ChordSymbol:\n", 466 | " chord_start = p.offset + n.offset\n", 467 | " n.duration.quarterLength = chord_end - chord_start\n", 468 | " n.volume = music21.volume.Volume(velocity=48)\n", 469 | " chord_end = chord_start\n", 470 | " elif type(n) == music21.note.Note:\n", 471 | " n.volume = music21.volume.Volume(velocity=64)\n", 472 | " file_name = \"song\" + str(i).zfill(2) + \".mid\"\n", 473 | " song.write('midi', fp=file_name)\n", 474 | "\n", 475 | " part = song.parts[0]\n", 476 | " note_array = []\n", 477 | "\n", 478 | " for p in part:\n", 479 | " if isinstance(p, Iterable):\n", 480 | " for n in p:\n", 481 | " if type(n) == music21.note.Note:\n", 482 | " note_array.append([int(n.pitch.ps), int(n.quarterLength*4+0.5)])\n", 483 | "\n", 484 | " CMM = music_geometry_eval.calculate_time_supported_conjunct_melodic_motion(note_array)\n", 485 | " LM = music_geometry_eval.calculate_time_supported_limited_macroharmony(note_array, span_size=32)\n", 486 | " CENT = music_geometry_eval.calculate_time_supported_centricity(note_array, span_size=32)\n", 487 | "\n", 488 | " print(\" CMM :\", round(CMM, 4))\n", 489 | " print(\" LM :\", round(LM, 4))\n", 490 | " print(\" CENT:\", round(CENT, 4))\n", 491 | "\n", 492 | " norm_cmm = (CMM - CMM_mean) / CMM_std\n", 493 | " norm_lm = (LM - LM_mean) / LM_std\n", 494 | " norm_cent = (CENT - CENT_mean) / CMM_std\n", 495 | "\n", 496 | " norm_score_squared = norm_cmm * norm_cmm + norm_lm * norm_lm + norm_cent * norm_cent\n", 497 | " print(\" NDM:\", round(norm_score_squared, 4))\n", 498 | " score_arr = np.append(score_arr, norm_score_squared)\n", 499 | "\n", 500 | " songs_with_scores.append([norm_score_squared, file_name])\n", 501 | "\n", 502 | "songs_with_scores.sort()\n", 503 | "for pair in songs_with_scores:\n", 504 | " print(round(pair[0], 4), pair[1])" 505 | ], 506 | "execution_count": null, 507 | "outputs": [] 508 | }, 509 | { 510 | "cell_type": "markdown", 511 | "metadata": { 512 | "id": "8uKW0IhneCGl" 513 | }, 514 | "source": [ 515 | "# **Choose a Song and Play It**\n" 516 | ] 517 | }, 518 | { 519 | "cell_type": "code", 520 | "metadata": { 521 | "id": "9e4wRsJQfDmk" 522 | }, 523 | "source": [ 524 | "song_number = 0\n", 525 | "\n", 526 | "melody_ns = note_seq.midi_file_to_sequence_proto(songs_with_scores[song_number][1])\n", 527 | "print(round(songs_with_scores[song_number][0], 4), songs_with_scores[song_number][1])\n", 528 | "\n", 529 | "note_seq.play_sequence( \n", 530 | " melody_ns,\n", 531 | " synth=note_seq.fluidsynth, sample_rate=SAMPLE_RATE, sf2_path=SF2_PATH)\n", 532 | "note_seq.plot_sequence(melody_ns)" 533 | ], 534 | "execution_count": null, 535 | "outputs": [] 536 | } 537 | ] 538 | } -------------------------------------------------------------------------------- /License.txt: -------------------------------------------------------------------------------- 1 | Attribution-ShareAlike 4.0 International 2 | 3 | ======================================================================= 4 | 5 | Creative Commons Corporation ("Creative Commons") is not a law firm and 6 | does not provide legal services or legal advice. Distribution of 7 | Creative Commons public licenses does not create a lawyer-client or 8 | other relationship. Creative Commons makes its licenses and related 9 | information available on an "as-is" basis. Creative Commons gives no 10 | warranties regarding its licenses, any material licensed under their 11 | terms and conditions, or any related information. Creative Commons 12 | disclaims all liability for damages resulting from their use to the 13 | fullest extent possible. 14 | 15 | Using Creative Commons Public Licenses 16 | 17 | Creative Commons public licenses provide a standard set of terms and 18 | conditions that creators and other rights holders may use to share 19 | original works of authorship and other material subject to copyright 20 | and certain other rights specified in the public license below. The 21 | following considerations are for informational purposes only, are not 22 | exhaustive, and do not form part of our licenses. 23 | 24 | Considerations for licensors: Our public licenses are 25 | intended for use by those authorized to give the public 26 | permission to use material in ways otherwise restricted by 27 | copyright and certain other rights. Our licenses are 28 | irrevocable. Licensors should read and understand the terms 29 | and conditions of the license they choose before applying it. 30 | Licensors should also secure all rights necessary before 31 | applying our licenses so that the public can reuse the 32 | material as expected. Licensors should clearly mark any 33 | material not subject to the license. This includes other CC- 34 | licensed material, or material used under an exception or 35 | limitation to copyright. More considerations for licensors: 36 | wiki.creativecommons.org/Considerations_for_licensors 37 | 38 | Considerations for the public: By using one of our public 39 | licenses, a licensor grants the public permission to use the 40 | licensed material under specified terms and conditions. If 41 | the licensor's permission is not necessary for any reason--for 42 | example, because of any applicable exception or limitation to 43 | copyright--then that use is not regulated by the license. Our 44 | licenses grant only permissions under copyright and certain 45 | other rights that a licensor has authority to grant. Use of 46 | the licensed material may still be restricted for other 47 | reasons, including because others have copyright or other 48 | rights in the material. A licensor may make special requests, 49 | such as asking that all changes be marked or described. 50 | Although not required by our licenses, you are encouraged to 51 | respect those requests where reasonable. More considerations 52 | for the public: 53 | wiki.creativecommons.org/Considerations_for_licensees 54 | 55 | ======================================================================= 56 | 57 | Creative Commons Attribution-ShareAlike 4.0 International Public 58 | License 59 | 60 | By exercising the Licensed Rights (defined below), You accept and agree 61 | to be bound by the terms and conditions of this Creative Commons 62 | Attribution-ShareAlike 4.0 International Public License ("Public 63 | License"). To the extent this Public License may be interpreted as a 64 | contract, You are granted the Licensed Rights in consideration of Your 65 | acceptance of these terms and conditions, and the Licensor grants You 66 | such rights in consideration of benefits the Licensor receives from 67 | making the Licensed Material available under these terms and 68 | conditions. 69 | 70 | 71 | Section 1 -- Definitions. 72 | 73 | a. Adapted Material means material subject to Copyright and Similar 74 | Rights that is derived from or based upon the Licensed Material 75 | and in which the Licensed Material is translated, altered, 76 | arranged, transformed, or otherwise modified in a manner requiring 77 | permission under the Copyright and Similar Rights held by the 78 | Licensor. For purposes of this Public License, where the Licensed 79 | Material is a musical work, performance, or sound recording, 80 | Adapted Material is always produced where the Licensed Material is 81 | synched in timed relation with a moving image. 82 | 83 | b. Adapter's License means the license You apply to Your Copyright 84 | and Similar Rights in Your contributions to Adapted Material in 85 | accordance with the terms and conditions of this Public License. 86 | 87 | c. BY-SA Compatible License means a license listed at 88 | creativecommons.org/compatiblelicenses, approved by Creative 89 | Commons as essentially the equivalent of this Public License. 90 | 91 | d. Copyright and Similar Rights means copyright and/or similar rights 92 | closely related to copyright including, without limitation, 93 | performance, broadcast, sound recording, and Sui Generis Database 94 | Rights, without regard to how the rights are labeled or 95 | categorized. For purposes of this Public License, the rights 96 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 97 | Rights. 98 | 99 | e. Effective Technological Measures means those measures that, in the 100 | absence of proper authority, may not be circumvented under laws 101 | fulfilling obligations under Article 11 of the WIPO Copyright 102 | Treaty adopted on December 20, 1996, and/or similar international 103 | agreements. 104 | 105 | f. Exceptions and Limitations means fair use, fair dealing, and/or 106 | any other exception or limitation to Copyright and Similar Rights 107 | that applies to Your use of the Licensed Material. 108 | 109 | g. License Elements means the license attributes listed in the name 110 | of a Creative Commons Public License. The License Elements of this 111 | Public License are Attribution and ShareAlike. 112 | 113 | h. Licensed Material means the artistic or literary work, database, 114 | or other material to which the Licensor applied this Public 115 | License. 116 | 117 | i. Licensed Rights means the rights granted to You subject to the 118 | terms and conditions of this Public License, which are limited to 119 | all Copyright and Similar Rights that apply to Your use of the 120 | Licensed Material and that the Licensor has authority to license. 121 | 122 | j. Licensor means the individual(s) or entity(ies) granting rights 123 | under this Public License. 124 | 125 | k. Share means to provide material to the public by any means or 126 | process that requires permission under the Licensed Rights, such 127 | as reproduction, public display, public performance, distribution, 128 | dissemination, communication, or importation, and to make material 129 | available to the public including in ways that members of the 130 | public may access the material from a place and at a time 131 | individually chosen by them. 132 | 133 | l. Sui Generis Database Rights means rights other than copyright 134 | resulting from Directive 96/9/EC of the European Parliament and of 135 | the Council of 11 March 1996 on the legal protection of databases, 136 | as amended and/or succeeded, as well as other essentially 137 | equivalent rights anywhere in the world. 138 | 139 | m. You means the individual or entity exercising the Licensed Rights 140 | under this Public License. Your has a corresponding meaning. 141 | 142 | 143 | Section 2 -- Scope. 144 | 145 | a. License grant. 146 | 147 | 1. Subject to the terms and conditions of this Public License, 148 | the Licensor hereby grants You a worldwide, royalty-free, 149 | non-sublicensable, non-exclusive, irrevocable license to 150 | exercise the Licensed Rights in the Licensed Material to: 151 | 152 | a. reproduce and Share the Licensed Material, in whole or 153 | in part; and 154 | 155 | b. produce, reproduce, and Share Adapted Material. 156 | 157 | 2. Exceptions and Limitations. For the avoidance of doubt, where 158 | Exceptions and Limitations apply to Your use, this Public 159 | License does not apply, and You do not need to comply with 160 | its terms and conditions. 161 | 162 | 3. Term. The term of this Public License is specified in Section 163 | 6(a). 164 | 165 | 4. Media and formats; technical modifications allowed. The 166 | Licensor authorizes You to exercise the Licensed Rights in 167 | all media and formats whether now known or hereafter created, 168 | and to make technical modifications necessary to do so. The 169 | Licensor waives and/or agrees not to assert any right or 170 | authority to forbid You from making technical modifications 171 | necessary to exercise the Licensed Rights, including 172 | technical modifications necessary to circumvent Effective 173 | Technological Measures. For purposes of this Public License, 174 | simply making modifications authorized by this Section 2(a) 175 | (4) never produces Adapted Material. 176 | 177 | 5. Downstream recipients. 178 | 179 | a. Offer from the Licensor -- Licensed Material. Every 180 | recipient of the Licensed Material automatically 181 | receives an offer from the Licensor to exercise the 182 | Licensed Rights under the terms and conditions of this 183 | Public License. 184 | 185 | b. Additional offer from the Licensor -- Adapted Material. 186 | Every recipient of Adapted Material from You 187 | automatically receives an offer from the Licensor to 188 | exercise the Licensed Rights in the Adapted Material 189 | under the conditions of the Adapter's License You apply. 190 | 191 | c. No downstream restrictions. You may not offer or impose 192 | any additional or different terms or conditions on, or 193 | apply any Effective Technological Measures to, the 194 | Licensed Material if doing so restricts exercise of the 195 | Licensed Rights by any recipient of the Licensed 196 | Material. 197 | 198 | 6. No endorsement. Nothing in this Public License constitutes or 199 | may be construed as permission to assert or imply that You 200 | are, or that Your use of the Licensed Material is, connected 201 | with, or sponsored, endorsed, or granted official status by, 202 | the Licensor or others designated to receive attribution as 203 | provided in Section 3(a)(1)(A)(i). 204 | 205 | b. Other rights. 206 | 207 | 1. Moral rights, such as the right of integrity, are not 208 | licensed under this Public License, nor are publicity, 209 | privacy, and/or other similar personality rights; however, to 210 | the extent possible, the Licensor waives and/or agrees not to 211 | assert any such rights held by the Licensor to the limited 212 | extent necessary to allow You to exercise the Licensed 213 | Rights, but not otherwise. 214 | 215 | 2. Patent and trademark rights are not licensed under this 216 | Public License. 217 | 218 | 3. To the extent possible, the Licensor waives any right to 219 | collect royalties from You for the exercise of the Licensed 220 | Rights, whether directly or through a collecting society 221 | under any voluntary or waivable statutory or compulsory 222 | licensing scheme. In all other cases the Licensor expressly 223 | reserves any right to collect such royalties. 224 | 225 | 226 | Section 3 -- License Conditions. 227 | 228 | Your exercise of the Licensed Rights is expressly made subject to the 229 | following conditions. 230 | 231 | a. Attribution. 232 | 233 | 1. If You Share the Licensed Material (including in modified 234 | form), You must: 235 | 236 | a. retain the following if it is supplied by the Licensor 237 | with the Licensed Material: 238 | 239 | i. identification of the creator(s) of the Licensed 240 | Material and any others designated to receive 241 | attribution, in any reasonable manner requested by 242 | the Licensor (including by pseudonym if 243 | designated); 244 | 245 | ii. a copyright notice; 246 | 247 | iii. a notice that refers to this Public License; 248 | 249 | iv. a notice that refers to the disclaimer of 250 | warranties; 251 | 252 | v. a URI or hyperlink to the Licensed Material to the 253 | extent reasonably practicable; 254 | 255 | b. indicate if You modified the Licensed Material and 256 | retain an indication of any previous modifications; and 257 | 258 | c. indicate the Licensed Material is licensed under this 259 | Public License, and include the text of, or the URI or 260 | hyperlink to, this Public License. 261 | 262 | 2. You may satisfy the conditions in Section 3(a)(1) in any 263 | reasonable manner based on the medium, means, and context in 264 | which You Share the Licensed Material. For example, it may be 265 | reasonable to satisfy the conditions by providing a URI or 266 | hyperlink to a resource that includes the required 267 | information. 268 | 269 | 3. If requested by the Licensor, You must remove any of the 270 | information required by Section 3(a)(1)(A) to the extent 271 | reasonably practicable. 272 | 273 | b. ShareAlike. 274 | 275 | In addition to the conditions in Section 3(a), if You Share 276 | Adapted Material You produce, the following conditions also apply. 277 | 278 | 1. The Adapter's License You apply must be a Creative Commons 279 | license with the same License Elements, this version or 280 | later, or a BY-SA Compatible License. 281 | 282 | 2. You must include the text of, or the URI or hyperlink to, the 283 | Adapter's License You apply. You may satisfy this condition 284 | in any reasonable manner based on the medium, means, and 285 | context in which You Share Adapted Material. 286 | 287 | 3. You may not offer or impose any additional or different terms 288 | or conditions on, or apply any Effective Technological 289 | Measures to, Adapted Material that restrict exercise of the 290 | rights granted under the Adapter's License You apply. 291 | 292 | 293 | Section 4 -- Sui Generis Database Rights. 294 | 295 | Where the Licensed Rights include Sui Generis Database Rights that 296 | apply to Your use of the Licensed Material: 297 | 298 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 299 | to extract, reuse, reproduce, and Share all or a substantial 300 | portion of the contents of the database; 301 | 302 | b. if You include all or a substantial portion of the database 303 | contents in a database in which You have Sui Generis Database 304 | Rights, then the database in which You have Sui Generis Database 305 | Rights (but not its individual contents) is Adapted Material, 306 | 307 | including for purposes of Section 3(b); and 308 | c. You must comply with the conditions in Section 3(a) if You Share 309 | all or a substantial portion of the contents of the database. 310 | 311 | For the avoidance of doubt, this Section 4 supplements and does not 312 | replace Your obligations under this Public License where the Licensed 313 | Rights include other Copyright and Similar Rights. 314 | 315 | 316 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 317 | 318 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 319 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 320 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 321 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 322 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 323 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 324 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 325 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 326 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 327 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 328 | 329 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 330 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 331 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 332 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 333 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 334 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 335 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 336 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 337 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 338 | 339 | c. The disclaimer of warranties and limitation of liability provided 340 | above shall be interpreted in a manner that, to the extent 341 | possible, most closely approximates an absolute disclaimer and 342 | waiver of all liability. 343 | 344 | 345 | Section 6 -- Term and Termination. 346 | 347 | a. This Public License applies for the term of the Copyright and 348 | Similar Rights licensed here. However, if You fail to comply with 349 | this Public License, then Your rights under this Public License 350 | terminate automatically. 351 | 352 | b. Where Your right to use the Licensed Material has terminated under 353 | Section 6(a), it reinstates: 354 | 355 | 1. automatically as of the date the violation is cured, provided 356 | it is cured within 30 days of Your discovery of the 357 | violation; or 358 | 359 | 2. upon express reinstatement by the Licensor. 360 | 361 | For the avoidance of doubt, this Section 6(b) does not affect any 362 | right the Licensor may have to seek remedies for Your violations 363 | of this Public License. 364 | 365 | c. For the avoidance of doubt, the Licensor may also offer the 366 | Licensed Material under separate terms or conditions or stop 367 | distributing the Licensed Material at any time; however, doing so 368 | will not terminate this Public License. 369 | 370 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 371 | License. 372 | 373 | 374 | Section 7 -- Other Terms and Conditions. 375 | 376 | a. The Licensor shall not be bound by any additional or different 377 | terms or conditions communicated by You unless expressly agreed. 378 | 379 | b. Any arrangements, understandings, or agreements regarding the 380 | Licensed Material not stated herein are separate from and 381 | independent of the terms and conditions of this Public License. 382 | 383 | 384 | Section 8 -- Interpretation. 385 | 386 | a. For the avoidance of doubt, this Public License does not, and 387 | shall not be interpreted to, reduce, limit, restrict, or impose 388 | conditions on any use of the Licensed Material that could lawfully 389 | be made without permission under this Public License. 390 | 391 | b. To the extent possible, if any provision of this Public License is 392 | deemed unenforceable, it shall be automatically reformed to the 393 | minimum extent necessary to make it enforceable. If the provision 394 | cannot be reformed, it shall be severed from this Public License 395 | without affecting the enforceability of the remaining terms and 396 | conditions. 397 | 398 | c. No term or condition of this Public License will be waived and no 399 | failure to comply consented to unless expressly agreed to by the 400 | Licensor. 401 | 402 | d. Nothing in this Public License constitutes or may be interpreted 403 | as a limitation upon, or waiver of, any privileges and immunities 404 | that apply to the Licensor or You, including from the legal 405 | processes of any jurisdiction or authority. 406 | 407 | 408 | ======================================================================= 409 | 410 | Creative Commons is not a party to its public 411 | licenses. Notwithstanding, Creative Commons may elect to apply one of 412 | its public licenses to material it publishes and in those instances 413 | will be considered the “Licensor.” The text of the Creative Commons 414 | public licenses is dedicated to the public domain under the CC0 Public 415 | Domain Dedication. Except for the limited purpose of indicating that 416 | material is shared under a Creative Commons public license or as 417 | otherwise permitted by the Creative Commons policies published at 418 | creativecommons.org/policies, Creative Commons does not authorize the 419 | use of the trademark "Creative Commons" or any other trademark or logo 420 | of Creative Commons without its prior written consent including, 421 | without limitation, in connection with any unauthorized modifications 422 | to any of its public licenses or any other arrangements, 423 | understandings, or agreements concerning use of licensed material. For 424 | the avoidance of doubt, this paragraph does not form part of the 425 | public licenses. 426 | 427 | Creative Commons may be contacted at creativecommons.org. 428 | -------------------------------------------------------------------------------- /AI_Tunes_Generate_Music.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "AI-Tunes Generate Music", 7 | "provenance": [], 8 | "collapsed_sections": [], 9 | "toc_visible": true, 10 | "authorship_tag": "ABX9TyN+mAB1js6uOPdBh/D5x+4b", 11 | "include_colab_link": true 12 | }, 13 | "kernelspec": { 14 | "name": "python3", 15 | "display_name": "Python 3" 16 | }, 17 | "language_info": { 18 | "name": "python" 19 | } 20 | }, 21 | "cells": [ 22 | { 23 | "cell_type": "markdown", 24 | "metadata": { 25 | "id": "view-in-github", 26 | "colab_type": "text" 27 | }, 28 | "source": [ 29 | "\"Open" 30 | ] 31 | }, 32 | { 33 | "cell_type": "markdown", 34 | "metadata": { 35 | "id": "PGD-rwhuWOOx" 36 | }, 37 | "source": [ 38 | "# **AI-Tunes: Creating New Songs with Artificial Intelligence**\n", 39 | "### **How I fine-tuned OpenAI's GPT-3 to generate music with a global structure**\n", 40 | "By Robert. A Gonsalves\n", 41 | "\n", 42 | "You can read my article about this project on [Medium](https://towardsdatascience.com/ai-tunes-creating-new-songs-with-artificial-intelligence-4fb383218146).\n", 43 | "\n", 44 | "The source code is released under the CC BY-SA license.\n", 45 | "\n", 46 | "![CC BY-NC-SA](https://licensebuttons.net/l/by-sa/4.0/88x31.png)\n" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "metadata": { 52 | "id": "5Qe6fbeWTc3J", 53 | "cellView": "form" 54 | }, 55 | "source": [ 56 | "#@title **Initalize the System**\n", 57 | "#@markdown Hover over play button and hit the Run cell.
\n", 58 | "#@markdown HIt takes about 3 minutes to complete the setup.\n", 59 | "!git clone https://github.com/robgon-art/music-geometry-eval\n", 60 | "!pip install openai\n", 61 | "\n", 62 | "import sys\n", 63 | "sys.path.append('/content/music-geometry-eval/music_geometry_eval')\n", 64 | "\n", 65 | "import music_geometry_eval\n", 66 | "import openai\n", 67 | "import music21\n", 68 | "import numpy as np\n", 69 | "from collections.abc import Iterable\n", 70 | "\n", 71 | "!gsutil -q -m cp -r gs://magentadata/models/music_transformer/primers/* /content/\n", 72 | "!gsutil -q -m cp gs://magentadata/soundfonts/Yamaha-C5-Salamander-JNv5.1.sf2 /content/\n", 73 | "!apt-get update -qq && apt-get install -qq libfluidsynth1 build-essential libasound2-dev libjack-dev\n", 74 | "!pip install magenta\n", 75 | "!pip install pyfluidsynth\n", 76 | "import note_seq\n", 77 | "SF2_PATH = '/content/Yamaha-C5-Salamander-JNv5.1.sf2'\n", 78 | "SAMPLE_RATE = 16000\n", 79 | "CMM_mean = 2.2715\n", 80 | "CMM_std = 0.4831\n", 81 | "LM_mean = 2.0305\n", 82 | "LM_std = 0.5386\n", 83 | "CENT_mean = 0.3042\n", 84 | "CENT_std = 0.0891" 85 | ], 86 | "execution_count": null, 87 | "outputs": [] 88 | }, 89 | { 90 | "cell_type": "markdown", 91 | "metadata": { 92 | "id": "DXqi6YhFXpCn" 93 | }, 94 | "source": [ 95 | "**Specify Your OpenAI API Key**
\n", 96 | "This Colab only works if you have an account with OpenAI.
\n", 97 | "If you don't have an account you can sign up here https://openai.com/blog/openai-api/" 98 | ] 99 | }, 100 | { 101 | "cell_type": "code", 102 | "metadata": { 103 | "id": "0StHpYWdXnfQ" 104 | }, 105 | "source": [ 106 | "openai.api_key = \"\"" 107 | ], 108 | "execution_count": 2, 109 | "outputs": [] 110 | }, 111 | { 112 | "cell_type": "code", 113 | "metadata": { 114 | "id": "VdU5Q6CCFK6E", 115 | "colab": { 116 | "base_uri": "https://localhost:8080/" 117 | }, 118 | "cellView": "form", 119 | "outputId": "fd0de5cb-3da8-49d6-8fb7-8e186110b8b5" 120 | }, 121 | "source": [ 122 | "#@title **Generate a new Song Title and Band Name**\n", 123 | "#@markdown This data will be used to prompt the AI-Tunes system to create the song.\n", 124 | "response = openai.Completion.create(\n", 125 | " engine=\"davinci-instruct-beta\",\n", 126 | " prompt=\"Create a new song title a new band name. Be creative!\\n\\nBand name: The Execs\\nSong title: Company Meeting\\n###\\n\\nBand name: The One Chords\\nSong title: Moving Down to Burlington\\n###\",\n", 127 | " temperature=0.7,\n", 128 | " max_tokens=64,\n", 129 | " top_p=1,\n", 130 | " frequency_penalty=0.5,\n", 131 | " presence_penalty=0.5,\n", 132 | " stop=[\"###\"]\n", 133 | ")\n", 134 | "\n", 135 | "# print(response)\n", 136 | "\n", 137 | "song_metadata = response[\"choices\"][0][\"text\"].strip()\n", 138 | "lines = song_metadata.split(\"\\n\")\n", 139 | "generated_metadata = {}\n", 140 | "song_title = \"Our Random Song\"\n", 141 | "band_name = \"Some Random Band\"\n", 142 | "for line in lines:\n", 143 | " parts = line.split(\":\")\n", 144 | " if len(parts) == 2:\n", 145 | " if \"song title\" in parts[0].lower() and len(parts[1]) > 0:\n", 146 | " song_title = parts[1].strip()\n", 147 | " if \"band name\" in parts[0].lower() and len(parts[1]) > 0:\n", 148 | " band_name = parts[1].strip()\n", 149 | "\n", 150 | "print(\"Song Title:\", song_title)\n", 151 | "print(\"Band Name :\", band_name)" 152 | ], 153 | "execution_count": 3, 154 | "outputs": [ 155 | { 156 | "output_type": "stream", 157 | "name": "stdout", 158 | "text": [ 159 | "Song Title: I'm in Love with My Best Friend\n", 160 | "Band Name : The Last Chance\n" 161 | ] 162 | } 163 | ] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "metadata": { 168 | "id": "hol2mChWjzrr", 169 | "colab": { 170 | "base_uri": "https://localhost:8080/" 171 | }, 172 | "cellView": "form", 173 | "outputId": "b0982ef4-8ca5-4378-ef87-5912894d9f82" 174 | }, 175 | "source": [ 176 | "#@title **Generate Songs**\n", 177 | "#@markdown The sysystem will generate five versions of the song and show the statistics for tonal quality.
\n", 178 | "#@markdown Lower temperature values will create more repetive melodies.
\n", 179 | "#@markdown Higher values will create more random melodies (and occasional ABC parsing errors.)\n", 180 | "temperature = 0.95 #@param {type:\"slider\", min:0.0, max:1.2, step:0.01}\n", 181 | "\n", 182 | "prompt = \"X: 1 $ T: \" + song_title + \" $ C: \" + band_name + \" $ \"\n", 183 | "print(\"prompt\", prompt)\n", 184 | "print()\n", 185 | "\n", 186 | "songs_with_scores = []\n", 187 | "score_arr = np.empty((0), np.float32)\n", 188 | "\n", 189 | "for i in range(5):\n", 190 | " print(\"\\nGenerating Song Version\", i)\n", 191 | " response = openai.Completion.create(\n", 192 | " model=\"curie:ft-user-j0julqovorjakyuyt3kv3zci-2021-08-24-11-42-59\",\n", 193 | " prompt=prompt,\n", 194 | " stop = \" $ \",\n", 195 | " temperature=temperature,\n", 196 | " top_p=1.0,\n", 197 | " frequency_penalty=0.0,\n", 198 | " presence_penalty=0.0,\n", 199 | " max_tokens = 1000)\n", 200 | "\n", 201 | " # print(response)\n", 202 | " # print()\n", 203 | "\n", 204 | " formatted_prompt = \"X: 1 $ T: \" + song_title + \" $ C: \" + band_name + \" $ L: 1/4 $ M: 4/4 $ K: C $ V: 1 treble\"\n", 205 | " formatted_prompt = formatted_prompt.replace(\" $ \", \"\\n\")\n", 206 | " formatted_prompt = formatted_prompt.replace(\"\", \"\").strip()\n", 207 | "\n", 208 | " formatted_song = response[\"choices\"][0][\"text\"].strip()\n", 209 | " formatted_song = formatted_song.replace('`', '\"')\n", 210 | " formatted_song = formatted_song.replace(\" $ \", \"\\n\")\n", 211 | " new_song = formatted_prompt + \"\\n\" + formatted_song\n", 212 | " # print(new_song)\n", 213 | " with open(\"new_song.abc\", \"w\") as new_song_file:\n", 214 | " new_song_file.write(new_song)\n", 215 | "\n", 216 | " song = music21.converter.parse(\"new_song.abc\")\n", 217 | "\n", 218 | " part = song.parts[0]\n", 219 | " chord_end = song.highestTime\n", 220 | " for pi in reversed(range(len(part))):\n", 221 | " p = part[pi]\n", 222 | " for ni in reversed(range(len(p))):\n", 223 | " n = p[ni]\n", 224 | " if type(n) == music21.harmony.ChordSymbol:\n", 225 | " chord_start = p.offset + n.offset\n", 226 | " n.duration.quarterLength = chord_end - chord_start\n", 227 | " n.volume = music21.volume.Volume(velocity=48)\n", 228 | " chord_end = chord_start\n", 229 | " elif type(n) == music21.note.Note:\n", 230 | " n.volume = music21.volume.Volume(velocity=64)\n", 231 | " file_name = \"song\" + str(i).zfill(2) + \".mid\"\n", 232 | " song.write('midi', fp=file_name)\n", 233 | "\n", 234 | " part = song.parts[0]\n", 235 | " note_array = []\n", 236 | "\n", 237 | " for p in part:\n", 238 | " if isinstance(p, Iterable):\n", 239 | " for n in p:\n", 240 | " if type(n) == music21.note.Note:\n", 241 | " note_array.append([int(n.pitch.ps), int(n.quarterLength*4+0.5)])\n", 242 | "\n", 243 | " CMM = music_geometry_eval.calculate_time_supported_conjunct_melodic_motion(note_array)\n", 244 | " LM = music_geometry_eval.calculate_time_supported_limited_macroharmony(note_array, span_size=32)\n", 245 | " CENT = music_geometry_eval.calculate_time_supported_centricity(note_array, span_size=32)\n", 246 | "\n", 247 | " print(\" CMM :\", round(CMM, 4))\n", 248 | " print(\" LM :\", round(LM, 4))\n", 249 | " print(\" CENT:\", round(CENT, 4))\n", 250 | "\n", 251 | " norm_cmm = (CMM - CMM_mean) / CMM_std\n", 252 | " norm_lm = (LM - LM_mean) / LM_std\n", 253 | " norm_cent = (CENT - CENT_mean) / CMM_std\n", 254 | " norm_score_squared = norm_cmm * norm_cmm + norm_lm * norm_lm + norm_cent * norm_cent\n", 255 | " print(\" NDM :\", round(norm_score_squared, 4))\n", 256 | " score_arr = np.append(score_arr, norm_score_squared)\n", 257 | " songs_with_scores.append([norm_score_squared, file_name])\n", 258 | "\n", 259 | "print(\"\\nResults:\")\n", 260 | "songs_with_scores.sort()\n", 261 | "for i, pair in enumerate(songs_with_scores):\n", 262 | " print(\"Version: \" + str(i) + \", Score: \" + str(round(pair[0], 4)) + \", File: \", pair[1])" 263 | ], 264 | "execution_count": 5, 265 | "outputs": [ 266 | { 267 | "output_type": "stream", 268 | "name": "stdout", 269 | "text": [ 270 | "prompt X: 1 $ T: I'm in Love with My Best Friend $ C: The Last Chance $ \n", 271 | "\n", 272 | "\n", 273 | "Generating Song Version 0\n", 274 | " CMM : 1.4471\n", 275 | " LM : 2.8857\n", 276 | " CENT: 0.5428\n", 277 | " NDM : 5.6776\n", 278 | "\n", 279 | "Generating Song Version 1\n", 280 | " CMM : 2.6371\n", 281 | " LM : 2.5648\n", 282 | " CENT: 0.3101\n", 283 | " NDM : 1.557\n", 284 | "\n", 285 | "Generating Song Version 2\n", 286 | " CMM : 2.2919\n", 287 | " LM : 2.2661\n", 288 | " CENT: 0.3403\n", 289 | " NDM : 0.1986\n", 290 | "\n", 291 | "Generating Song Version 3\n", 292 | " CMM : 2.1721\n", 293 | " LM : 2.3629\n", 294 | " CENT: 0.432\n", 295 | " NDM : 0.4931\n", 296 | "\n", 297 | "Generating Song Version 4\n", 298 | " CMM : 2.631\n", 299 | " LM : 1.9726\n", 300 | " CENT: 0.3174\n", 301 | " NDM : 0.5659\n", 302 | "\n", 303 | "Results:\n", 304 | "Version: 0, Score: 0.1986, File: song02.mid\n", 305 | "Version: 1, Score: 0.4931, File: song03.mid\n", 306 | "Version: 2, Score: 0.5659, File: song04.mid\n", 307 | "Version: 3, Score: 1.557, File: song01.mid\n", 308 | "Version: 4, Score: 5.6776, File: song00.mid\n" 309 | ] 310 | } 311 | ] 312 | }, 313 | { 314 | "cell_type": "code", 315 | "metadata": { 316 | "id": "paPkHWNIIWE1", 317 | "colab": { 318 | "base_uri": "https://localhost:8080/", 319 | "height": 394 320 | }, 321 | "cellView": "form", 322 | "outputId": "b7fdc1cd-9d84-4ae4-874e-015ad7a41fcb" 323 | }, 324 | "source": [ 325 | "#@title **Choose a Song**\n", 326 | "#@markdown Choose a version of the song to play.\n", 327 | "import copy\n", 328 | "\n", 329 | "version_number = 0 #@param {type:\"slider\", min:0, max:5, step:1}\n", 330 | "tempo_bpm = 120 #@param {type:\"slider\", min:60, max:240, step:1}\n", 331 | "tempo_scale = 120.0/tempo_bpm\n", 332 | "\n", 333 | "melody_ns = note_seq.midi_file_to_sequence_proto(songs_with_scores[version_number][1])\n", 334 | "\n", 335 | "melody2_ns = copy.deepcopy(melody_ns)\n", 336 | "melody2_ns.tempos[0].qpm = tempo_bpm\n", 337 | "\n", 338 | "for n in melody2_ns.notes:\n", 339 | " n.start_time *= tempo_scale\n", 340 | " n.end_time *= tempo_scale\n", 341 | "\n", 342 | "print(\"\\nSong Title: \" + song_title)\n", 343 | "print(\"Version: \", version_number)\n", 344 | "print(\"Band Name: \", band_name)\n", 345 | "print(\"NDM Score: \", round(songs_with_scores[version_number][0], 4))\n", 346 | "print(\"MIDI File: \", songs_with_scores[version_number][1], \"\\n\")\n", 347 | "\n", 348 | "note_seq.play_sequence( \n", 349 | " melody2_ns,\n", 350 | " synth=note_seq.fluidsynth, sample_rate=SAMPLE_RATE, sf2_path=SF2_PATH)\n", 351 | "note_seq.plot_sequence(melody2_ns)\n", 352 | "\n", 353 | "# from bokeh.plotting import show\n", 354 | "# fig = note_seq.plot_sequence(melody2_ns, show_figure = False)\n", 355 | "# fig.width = 500\n", 356 | "# fig.height = 500\n", 357 | "# fig.toolbar.logo = None\n", 358 | "# show(fig)" 359 | ], 360 | "execution_count": 7, 361 | "outputs": [ 362 | { 363 | "output_type": "stream", 364 | "name": "stdout", 365 | "text": [ 366 | "\n", 367 | "Song Title: I'm in Love with My Best Friend\n", 368 | "Version: 0\n", 369 | "Band Name: The Last Chance\n", 370 | "NDM Score: 0.1986\n", 371 | "MIDI File: song02.mid \n", 372 | "\n" 373 | ] 374 | }, 375 | { 376 | "output_type": "display_data", 377 | "data": { 378 | "text/html": [ 379 | "
" 380 | ], 381 | "text/plain": [ 382 | "" 383 | ] 384 | }, 385 | "metadata": {} 386 | }, 387 | { 388 | "output_type": "display_data", 389 | "data": { 390 | "application/javascript": [ 391 | "\n", 392 | "(function(root) {\n", 393 | " function now() {\n", 394 | " return new Date();\n", 395 | " }\n", 396 | "\n", 397 | " var force = true;\n", 398 | "\n", 399 | " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n", 400 | " root._bokeh_onload_callbacks = [];\n", 401 | " root._bokeh_is_loading = undefined;\n", 402 | " }\n", 403 | "\n", 404 | " var JS_MIME_TYPE = 'application/javascript';\n", 405 | " var HTML_MIME_TYPE = 'text/html';\n", 406 | " var EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", 407 | " var CLASS_NAME = 'output_bokeh rendered_html';\n", 408 | "\n", 409 | " /**\n", 410 | " * Render data to the DOM node\n", 411 | " */\n", 412 | " function render(props, node) {\n", 413 | " var script = document.createElement(\"script\");\n", 414 | " node.appendChild(script);\n", 415 | " }\n", 416 | "\n", 417 | " /**\n", 418 | " * Handle when an output is cleared or removed\n", 419 | " */\n", 420 | " function handleClearOutput(event, handle) {\n", 421 | " var cell = handle.cell;\n", 422 | "\n", 423 | " var id = cell.output_area._bokeh_element_id;\n", 424 | " var server_id = cell.output_area._bokeh_server_id;\n", 425 | " // Clean up Bokeh references\n", 426 | " if (id != null && id in Bokeh.index) {\n", 427 | " Bokeh.index[id].model.document.clear();\n", 428 | " delete Bokeh.index[id];\n", 429 | " }\n", 430 | "\n", 431 | " if (server_id !== undefined) {\n", 432 | " // Clean up Bokeh references\n", 433 | " var cmd = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", 434 | " cell.notebook.kernel.execute(cmd, {\n", 435 | " iopub: {\n", 436 | " output: function(msg) {\n", 437 | " var id = msg.content.text.trim();\n", 438 | " if (id in Bokeh.index) {\n", 439 | " Bokeh.index[id].model.document.clear();\n", 440 | " delete Bokeh.index[id];\n", 441 | " }\n", 442 | " }\n", 443 | " }\n", 444 | " });\n", 445 | " // Destroy server and session\n", 446 | " var cmd = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", 447 | " cell.notebook.kernel.execute(cmd);\n", 448 | " }\n", 449 | " }\n", 450 | "\n", 451 | " /**\n", 452 | " * Handle when a new output is added\n", 453 | " */\n", 454 | " function handleAddOutput(event, handle) {\n", 455 | " var output_area = handle.output_area;\n", 456 | " var output = handle.output;\n", 457 | "\n", 458 | " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", 459 | " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n", 460 | " return\n", 461 | " }\n", 462 | "\n", 463 | " var toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", 464 | "\n", 465 | " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", 466 | " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", 467 | " // store reference to embed id on output_area\n", 468 | " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", 469 | " }\n", 470 | " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", 471 | " var bk_div = document.createElement(\"div\");\n", 472 | " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", 473 | " var script_attrs = bk_div.children[0].attributes;\n", 474 | " for (var i = 0; i < script_attrs.length; i++) {\n", 475 | " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", 476 | " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n", 477 | " }\n", 478 | " // store reference to server id on output_area\n", 479 | " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", 480 | " }\n", 481 | " }\n", 482 | "\n", 483 | " function register_renderer(events, OutputArea) {\n", 484 | "\n", 485 | " function append_mime(data, metadata, element) {\n", 486 | " // create a DOM node to render to\n", 487 | " var toinsert = this.create_output_subarea(\n", 488 | " metadata,\n", 489 | " CLASS_NAME,\n", 490 | " EXEC_MIME_TYPE\n", 491 | " );\n", 492 | " this.keyboard_manager.register_events(toinsert);\n", 493 | " // Render to node\n", 494 | " var props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", 495 | " render(props, toinsert[toinsert.length - 1]);\n", 496 | " element.append(toinsert);\n", 497 | " return toinsert\n", 498 | " }\n", 499 | "\n", 500 | " /* Handle when an output is cleared or removed */\n", 501 | " events.on('clear_output.CodeCell', handleClearOutput);\n", 502 | " events.on('delete.Cell', handleClearOutput);\n", 503 | "\n", 504 | " /* Handle when a new output is added */\n", 505 | " events.on('output_added.OutputArea', handleAddOutput);\n", 506 | "\n", 507 | " /**\n", 508 | " * Register the mime type and append_mime function with output_area\n", 509 | " */\n", 510 | " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", 511 | " /* Is output safe? */\n", 512 | " safe: true,\n", 513 | " /* Index of renderer in `output_area.display_order` */\n", 514 | " index: 0\n", 515 | " });\n", 516 | " }\n", 517 | "\n", 518 | " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", 519 | " if (root.Jupyter !== undefined) {\n", 520 | " var events = require('base/js/events');\n", 521 | " var OutputArea = require('notebook/js/outputarea').OutputArea;\n", 522 | "\n", 523 | " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", 524 | " register_renderer(events, OutputArea);\n", 525 | " }\n", 526 | " }\n", 527 | "\n", 528 | " \n", 529 | " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", 530 | " root._bokeh_timeout = Date.now() + 5000;\n", 531 | " root._bokeh_failed_load = false;\n", 532 | " }\n", 533 | "\n", 534 | " var NB_LOAD_WARNING = {'data': {'text/html':\n", 535 | " \"
\\n\"+\n", 536 | " \"

\\n\"+\n", 537 | " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", 538 | " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", 539 | " \"

\\n\"+\n", 540 | " \"
    \\n\"+\n", 541 | " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", 542 | " \"
  • use INLINE resources instead, as so:
  • \\n\"+\n", 543 | " \"
\\n\"+\n", 544 | " \"\\n\"+\n", 545 | " \"from bokeh.resources import INLINE\\n\"+\n", 546 | " \"output_notebook(resources=INLINE)\\n\"+\n", 547 | " \"\\n\"+\n", 548 | " \"
\"}};\n", 549 | "\n", 550 | " function display_loaded() {\n", 551 | " var el = document.getElementById(null);\n", 552 | " if (el != null) {\n", 553 | " el.textContent = \"BokehJS is loading...\";\n", 554 | " }\n", 555 | " if (root.Bokeh !== undefined) {\n", 556 | " if (el != null) {\n", 557 | " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n", 558 | " }\n", 559 | " } else if (Date.now() < root._bokeh_timeout) {\n", 560 | " setTimeout(display_loaded, 100)\n", 561 | " }\n", 562 | " }\n", 563 | "\n", 564 | "\n", 565 | " function run_callbacks() {\n", 566 | " try {\n", 567 | " root._bokeh_onload_callbacks.forEach(function(callback) {\n", 568 | " if (callback != null)\n", 569 | " callback();\n", 570 | " });\n", 571 | " } finally {\n", 572 | " delete root._bokeh_onload_callbacks\n", 573 | " }\n", 574 | " console.debug(\"Bokeh: all callbacks have finished\");\n", 575 | " }\n", 576 | "\n", 577 | " function load_libs(css_urls, js_urls, callback) {\n", 578 | " if (css_urls == null) css_urls = [];\n", 579 | " if (js_urls == null) js_urls = [];\n", 580 | "\n", 581 | " root._bokeh_onload_callbacks.push(callback);\n", 582 | " if (root._bokeh_is_loading > 0) {\n", 583 | " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", 584 | " return null;\n", 585 | " }\n", 586 | " if (js_urls == null || js_urls.length === 0) {\n", 587 | " run_callbacks();\n", 588 | " return null;\n", 589 | " }\n", 590 | " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", 591 | " root._bokeh_is_loading = css_urls.length + js_urls.length;\n", 592 | "\n", 593 | " function on_load() {\n", 594 | " root._bokeh_is_loading--;\n", 595 | " if (root._bokeh_is_loading === 0) {\n", 596 | " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", 597 | " run_callbacks()\n", 598 | " }\n", 599 | " }\n", 600 | "\n", 601 | " function on_error(url) {\n", 602 | " console.error(\"failed to load \" + url);\n", 603 | " }\n", 604 | "\n", 605 | " for (let i = 0; i < css_urls.length; i++) {\n", 606 | " const url = css_urls[i];\n", 607 | " const element = document.createElement(\"link\");\n", 608 | " element.onload = on_load;\n", 609 | " element.onerror = on_error.bind(null, url);\n", 610 | " element.rel = \"stylesheet\";\n", 611 | " element.type = \"text/css\";\n", 612 | " element.href = url;\n", 613 | " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", 614 | " document.body.appendChild(element);\n", 615 | " }\n", 616 | "\n", 617 | " const hashes = {\"https://cdn.bokeh.org/bokeh/release/bokeh-2.3.3.min.js\": \"dM3QQsP+wXdHg42wTqW85BjZQdLNNIXqlPw/BgKoExPmTG7ZLML4EGqLMfqHT6ON\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.3.min.js\": \"8x57I4YuIfu8XyZfFo0XVr2WAT8EK4rh/uDe3wF7YuW2FNUSNEpJbsPaB1nJ2fz2\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.3.min.js\": \"3QTqdz9LyAm2i0sG5XTePsHec3UHWwVsrOL68SYRoAXsafvfAyqtQ+h440+qIBhS\"};\n", 618 | "\n", 619 | " for (let i = 0; i < js_urls.length; i++) {\n", 620 | " const url = js_urls[i];\n", 621 | " const element = document.createElement('script');\n", 622 | " element.onload = on_load;\n", 623 | " element.onerror = on_error.bind(null, url);\n", 624 | " element.async = false;\n", 625 | " element.src = url;\n", 626 | " if (url in hashes) {\n", 627 | " element.crossOrigin = \"anonymous\";\n", 628 | " element.integrity = \"sha384-\" + hashes[url];\n", 629 | " }\n", 630 | " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", 631 | " document.head.appendChild(element);\n", 632 | " }\n", 633 | " };\n", 634 | "\n", 635 | " function inject_raw_css(css) {\n", 636 | " const element = document.createElement(\"style\");\n", 637 | " element.appendChild(document.createTextNode(css));\n", 638 | " document.body.appendChild(element);\n", 639 | " }\n", 640 | "\n", 641 | " \n", 642 | " var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.3.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.3.min.js\"];\n", 643 | " var css_urls = [];\n", 644 | " \n", 645 | "\n", 646 | " var inline_js = [\n", 647 | " function(Bokeh) {\n", 648 | " Bokeh.set_log_level(\"info\");\n", 649 | " },\n", 650 | " function(Bokeh) {\n", 651 | " \n", 652 | " \n", 653 | " }\n", 654 | " ];\n", 655 | "\n", 656 | " function run_inline_js() {\n", 657 | " \n", 658 | " if (root.Bokeh !== undefined || force === true) {\n", 659 | " \n", 660 | " for (var i = 0; i < inline_js.length; i++) {\n", 661 | " inline_js[i].call(root, root.Bokeh);\n", 662 | " }\n", 663 | " } else if (Date.now() < root._bokeh_timeout) {\n", 664 | " setTimeout(run_inline_js, 100);\n", 665 | " } else if (!root._bokeh_failed_load) {\n", 666 | " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", 667 | " root._bokeh_failed_load = true;\n", 668 | " } else if (force !== true) {\n", 669 | " var cell = $(document.getElementById(null)).parents('.cell').data().cell;\n", 670 | " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", 671 | " }\n", 672 | "\n", 673 | " }\n", 674 | "\n", 675 | " if (root._bokeh_is_loading === 0) {\n", 676 | " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", 677 | " run_inline_js();\n", 678 | " } else {\n", 679 | " load_libs(css_urls, js_urls, function() {\n", 680 | " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", 681 | " run_inline_js();\n", 682 | " });\n", 683 | " }\n", 684 | "}(window));" 685 | ], 686 | "application/vnd.bokehjs_load.v0+json": "\n(function(root) {\n function now() {\n return new Date();\n }\n\n var force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n \n\n \n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n var NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n var el = document.getElementById(null);\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n const hashes = {\"https://cdn.bokeh.org/bokeh/release/bokeh-2.3.3.min.js\": \"dM3QQsP+wXdHg42wTqW85BjZQdLNNIXqlPw/BgKoExPmTG7ZLML4EGqLMfqHT6ON\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.3.min.js\": \"8x57I4YuIfu8XyZfFo0XVr2WAT8EK4rh/uDe3wF7YuW2FNUSNEpJbsPaB1nJ2fz2\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.3.min.js\": \"3QTqdz9LyAm2i0sG5XTePsHec3UHWwVsrOL68SYRoAXsafvfAyqtQ+h440+qIBhS\"};\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n if (url in hashes) {\n element.crossOrigin = \"anonymous\";\n element.integrity = \"sha384-\" + hashes[url];\n }\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n \n var js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.3.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.3.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.3.3.min.js\"];\n var css_urls = [];\n \n\n var inline_js = [\n function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\n function(Bokeh) {\n \n \n }\n ];\n\n function run_inline_js() {\n \n if (root.Bokeh !== undefined || force === true) {\n \n for (var i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n var cell = $(document.getElementById(null)).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" 687 | }, 688 | "metadata": {} 689 | }, 690 | { 691 | "output_type": "display_data", 692 | "data": { 693 | "text/html": [ 694 | "\n", 695 | "\n", 696 | "\n", 697 | "\n", 698 | "\n", 699 | "\n", 700 | "
\n" 701 | ] 702 | }, 703 | "metadata": {} 704 | }, 705 | { 706 | "output_type": "display_data", 707 | "data": { 708 | "application/javascript": [ 709 | "(function(root) {\n", 710 | " function embed_document(root) {\n", 711 | " \n", 712 | " var docs_json = {\"97214897-aac1-47cf-b7dd-f27613b4fd97\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1011\"}],\"center\":[{\"id\":\"1014\"},{\"id\":\"1018\"}],\"height\":200,\"left\":[{\"id\":\"1015\"}],\"renderers\":[{\"id\":\"1038\"}],\"title\":{\"id\":\"1040\"},\"toolbar\":{\"id\":\"1025\"},\"width\":500,\"x_range\":{\"id\":\"1003\"},\"x_scale\":{\"id\":\"1007\"},\"y_range\":{\"id\":\"1005\"},\"y_scale\":{\"id\":\"1009\"}},\"id\":\"1002\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"bottom\":{\"field\":\"bottom\"},\"fill_alpha\":{\"field\":\"fill_alpha\"},\"fill_color\":{\"value\":\"#d53e4f\"},\"left\":{\"field\":\"start_time\"},\"right\":{\"field\":\"end_time\"},\"top\":{\"field\":\"top\"}},\"id\":\"1036\",\"type\":\"Quad\"},{\"attributes\":{\"axis_label\":\"time (sec)\",\"formatter\":{\"id\":\"1042\"},\"major_label_policy\":{\"id\":\"1043\"},\"ticker\":{\"id\":\"1012\"}},\"id\":\"1011\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1012\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1048\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1020\",\"type\":\"PanTool\"},{\"attributes\":{\"axis_label\":\"pitch (MIDI)\",\"formatter\":{\"id\":\"1045\"},\"major_label_policy\":{\"id\":\"1046\"},\"ticker\":{\"id\":\"1031\"}},\"id\":\"1015\",\"type\":\"LinearAxis\"},{\"attributes\":{\"data_source\":{\"id\":\"1034\"},\"glyph\":{\"id\":\"1036\"},\"hover_glyph\":null,\"muted_glyph\":null,\"nonselection_glyph\":{\"id\":\"1037\"},\"view\":{\"id\":\"1039\"}},\"id\":\"1038\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"bottom_units\":\"screen\",\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"right_units\":\"screen\",\"syncable\":false,\"top_units\":\"screen\"},\"id\":\"1024\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1022\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1043\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1042\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1005\",\"type\":\"DataRange1d\"},{\"attributes\":{\"interval\":12},\"id\":\"1031\",\"type\":\"SingleIntervalTicker\"},{\"attributes\":{\"source\":{\"id\":\"1034\"}},\"id\":\"1039\",\"type\":\"CDSView\"},{\"attributes\":{\"overlay\":{\"id\":\"1024\"}},\"id\":\"1021\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"1023\",\"type\":\"SaveTool\"},{\"attributes\":{},\"id\":\"1007\",\"type\":\"LinearScale\"},{\"attributes\":{\"active_multi\":null,\"tools\":[{\"id\":\"1019\"},{\"id\":\"1020\"},{\"id\":\"1021\"},{\"id\":\"1022\"},{\"id\":\"1023\"}]},\"id\":\"1025\",\"type\":\"Toolbar\"},{\"attributes\":{\"bottom\":{\"field\":\"bottom\"},\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#d53e4f\"},\"left\":{\"field\":\"start_time\"},\"line_alpha\":{\"value\":0.1},\"right\":{\"field\":\"end_time\"},\"top\":{\"field\":\"top\"}},\"id\":\"1037\",\"type\":\"Quad\"},{\"attributes\":{\"interval\":12},\"id\":\"1033\",\"type\":\"SingleIntervalTicker\"},{\"attributes\":{\"axis\":{\"id\":\"1015\"},\"dimension\":1,\"ticker\":{\"id\":\"1033\"}},\"id\":\"1018\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1049\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1045\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1003\",\"type\":\"DataRange1d\"},{\"attributes\":{\"callback\":null,\"tooltips\":[[\"pitch\",\"@pitch\"],[\"program\",\"@program\"],[\"velo\",\"@velocity\"],[\"duration\",\"@duration\"],[\"start_time\",\"@start_time\"],[\"end_time\",\"@end_time\"],[\"velocity\",\"@velocity\"],[\"fill_alpha\",\"@fill_alpha\"]]},\"id\":\"1019\",\"type\":\"HoverTool\"},{\"attributes\":{\"axis\":{\"id\":\"1011\"},\"ticker\":null},\"id\":\"1014\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1046\",\"type\":\"AllLabels\"},{\"attributes\":{\"data\":{\"bottom\":{\"__ndarray__\":\"ZmZmZmamUEBmZmZmZuZRQGZmZmZm5lFAZmZmZmamUEDNzMzMzMxHQM3MzMzMzElAzczMzMxMS0DNzMzMzExMQGZmZmZm5lFAzczMzMzMREDNzMzMzExGQM3MzMzMTEhAzczMzMzMSUBmZmZmZqZRQGZmZmZmplFAzczMzMxMR0DNzMzMzExJQM3MzMzMzEpAzczMzMxMTEBmZmZmZqZRQGZmZmZmplBAZmZmZmamUEDNzMzMzMxJQM3MzMzMTEtAzczMzMxMTUDNzMzMzMxOQGZmZmZmplBAZmZmZmYmUUBmZmZmZiZRQM3MzMzMTEZAzczMzMzMR0DNzMzMzMxJQM3MzMzMTEtAZmZmZmYmUUBmZmZmZuZRQM3MzMzMzEhAzczMzMxMSkDNzMzMzExMQM3MzMzMzE1AZmZmZmamUUBmZmZmZiZRQM3MzMzMTEVAzczMzMxMR0DNzMzMzMxIQM3MzMzMTEpAZmZmZmamUUDNzMzMzMxHQM3MzMzMzElAzczMzMxMS0DNzMzMzExNQM3MzMzMzE9AzczMzMzMSEDNzMzMzExKQM3MzMzMTExAzczMzMzMTUBmZmZmZiZQQGZmZmZmplBAzczMzMzMR0DNzMzMzMxJQM3MzMzMTEtAzczMzMxMTUBmZmZmZuZRQM3MzMzMzE1AzczMzMxMSUDNzMzMzExLQM3MzMzMzExAzczMzMzMTkDNzMzMzMxOQM3MzMzMTEVAzczMzMzMRkDNzMzMzMxIQM3MzMzMTEpAzczMzMzMT0BmZmZmZqZQQGZmZmZm5lFAZmZmZmbmUUBmZmZmZqZQQM3MzMzMzEdAzczMzMzMSUDNzMzMzExLQM3MzMzMTExAZmZmZmbmUUDNzMzMzMxEQM3MzMzMTEZAzczMzMxMSEDNzMzMzMxJQGZmZmZmplFAZmZmZmamUUDNzMzMzExHQM3MzMzMTElAzczMzMzMSkDNzMzMzExMQGZmZmZmplFAZmZmZmamUEBmZmZmZqZQQM3MzMzMzElAzczMzMxMS0DNzMzMzExNQM3MzMzMzE5AZmZmZmamUEBmZmZmZiZRQGZmZmZmJlFAzczMzMxMRkDNzMzMzMxHQM3MzMzMzElAzczMzMxMS0BmZmZmZiZRQGZmZmZm5lFAzczMzMzMSEDNzMzMzExKQM3MzMzMTExAzczMzMzMTUBmZmZmZqZRQGZmZmZmJlFAzczMzMxMRUDNzMzMzExHQM3MzMzMzEhAzczMzMxMSkBmZmZmZqZRQM3MzMzMzEdAzczMzMzMSUDNzMzMzExLQM3MzMzMTE1AzczMzMzMT0DNzMzMzMxIQM3MzMzMTEpAzczMzMxMTEDNzMzMzMxNQGZmZmZmJlBAZmZmZmamUEDNzMzMzMxHQM3MzMzMzElAzczMzMxMS0DNzMzMzExNQGZmZmZm5lFAzczMzMzMTUDNzMzMzExJQM3MzMzMTEtAzczMzMzMTEDNzMzMzMxOQM3MzMzMzE5AzczMzMxMRUDNzMzMzMxGQM3MzMzMzEhAzczMzMxMSkDNzMzMzMxPQM3MzMzMzE9AZmZmZmamUEBmZmZmZuZRQM3MzMzMzEdAzczMzMzMSUDNzMzMzExLQM3MzMzMzExAzczMzMzMTkBmZmZmZqZRQM3MzMzMzERAzczMzMxMRkDNzMzMzExIQM3MzMzMzElAZmZmZmYmUUBmZmZmZqZRQGZmZmZmJlFAzczMzMxMR0DNzMzMzExJQM3MzMzMzEpAzczMzMxMTEBmZmZmZuZRQGZmZmZmplFAZmZmZmamUUDNzMzMzMxJQM3MzMzMTEtAzczMzMxMTUDNzMzMzMxOQGZmZmZmplFAZmZmZmYmUUBmZmZmZiZRQM3MzMzMTEZAzczMzMzMR0DNzMzMzMxJQM3MzMzMTEtAZmZmZmYmUUBmZmZmZuZRQGZmZmZmplFAZmZmZmYmUUDNzMzMzMxCQM3MzMzMzERAzczMzMxMRkDNzMzMzMxHQM3MzMzMzElAZmZmZmamUEDNzMzMzMxIQM3MzMzMTEpAzczMzMxMTEDNzMzMzMxNQM3MzMzMzE5AzczMzMzMT0DNzMzMzMxBQM3MzMzMzENAzczMzMxMRUDNzMzMzMxGQM3MzMzMzEhAzczMzMxMSkDNzMzMzExMQM3MzMzMzE9AZmZmZmYmUEDNzMzMzMxIQM3MzMzMTEpAzczMzMxMTEDNzMzMzMxNQM3MzMzMzE5AzczMzMzMT0DNzMzMzMxHQM3MzMzMzElAzczMzMxMS0DNzMzMzExMQGZmZmZmplBAZmZmZmYmUUDNzMzMzExGQM3MzMzMTEhAzczMzMzMSUDNzMzMzExLQGZmZmZmplBAzczMzMzMSEDNzMzMzExKQM3MzMzMTExAzczMzMzMTUDNzMzMzMxPQM3MzMzMTEVAzczMzMxMR0DNzMzMzMxIQM3MzMzMTEpAzczMzMzMTkDNzMzMzMxHQM3MzMzMzElAzczMzMxMS0DNzMzMzMxNQGZmZmZmplBAZmZmZmbmUUBmZmZmZuZRQGZmZmZmplBAzczMzMzMR0DNzMzMzMxJQM3MzMzMTEtAzczMzMxMTEBmZmZmZuZRQM3MzMzMzERAzczMzMxMRkDNzMzMzExIQM3MzMzMzElAZmZmZmamUUBmZmZmZqZRQM3MzMzMTEdAzczMzMxMSUDNzMzMzMxKQM3MzMzMTExAZmZmZmamUUBmZmZmZqZQQGZmZmZmplBAzczMzMzMSUDNzMzMzExLQM3MzMzMTE1AzczMzMzMTkBmZmZmZqZQQGZmZmZmJlFAZmZmZmYmUUDNzMzMzExGQM3MzMzMzEdAzczMzMzMSUDNzMzMzExLQGZmZmZmJlFAZmZmZmbmUUDNzMzMzMxIQM3MzMzMTEpAzczMzMxMTEDNzMzMzMxNQGZmZmZmplFAZmZmZmYmUUDNzMzMzExFQM3MzMzMTEdAzczMzMzMSEDNzMzMzExKQGZmZmZmplFAzczMzMzMR0DNzMzMzMxJQM3MzMzMTEtAzczMzMxMTUDNzMzMzMxPQM3MzMzMzEhAzczMzMxMSkDNzMzMzExMQM3MzMzMzE1AZmZmZmYmUEBmZmZmZqZQQM3MzMzMzEdAzczMzMzMSUDNzMzMzExLQM3MzMzMTE1AZmZmZmbmUUDNzMzMzMxNQM3MzMzMTElAzczMzMxMS0DNzMzMzMxMQM3MzMzMzE5AzczMzMzMTkDNzMzMzExFQM3MzMzMzEZAzczMzMzMSEDNzMzMzExKQM3MzMzMzE9AZmZmZmamUEBmZmZmZuZRQGZmZmZm5lFAZmZmZmamUEDNzMzMzMxHQM3MzMzMzElAzczMzMxMS0DNzMzMzExMQGZmZmZm5lFAzczMzMzMREDNzMzMzExGQM3MzMzMTEhAzczMzMzMSUBmZmZmZqZRQGZmZmZmplFAzczMzMxMR0DNzMzMzExJQM3MzMzMzEpAzczMzMxMTEBmZmZmZqZRQGZmZmZmplBAZmZmZmamUEDNzMzMzMxJQM3MzMzMTEtAzczMzMxMTUDNzMzMzMxOQGZmZmZmplBAZmZmZmYmUUBmZmZmZiZRQM3MzMzMTEZAzczMzMzMR0DNzMzMzMxJQM3MzMzMTEtAZmZmZmYmUUBmZmZmZuZRQM3MzMzMzEhAzczMzMxMSkDNzMzMzExMQM3MzMzMzE1AZmZmZmamUUBmZmZmZiZRQM3MzMzMTEVAzczMzMxMR0DNzMzMzMxIQM3MzMzMTEpAZmZmZmamUUDNzMzMzMxHQM3MzMzMzElAzczMzMxMS0DNzMzMzExNQM3MzMzMzE9AzczMzMzMSEDNzMzMzExKQM3MzMzMTExAzczMzMzMTUBmZmZmZiZQQGZmZmZmplBAzczMzMzMR0DNzMzMzMxJQM3MzMzMTEtAzczMzMxMTUBmZmZmZuZRQM3MzMzMzE1AzczMzMxMSUDNzMzMzExLQM3MzMzMzExAzczMzMzMTkDNzMzMzMxOQM3MzMzMTEVAzczMzMzMRkDNzMzMzMxIQM3MzMzMTEpAzczMzMzMT0DNzMzMzMxPQGZmZmZmplBAZmZmZmbmUUDNzMzMzMxHQM3MzMzMzElAzczMzMxMS0DNzMzMzMxMQM3MzMzMzE5AZmZmZmamUUDNzMzMzMxEQM3MzMzMTEZAzczMzMxMSEDNzMzMzMxJQGZmZmZmJlFAZmZmZmamUUBmZmZmZiZRQM3MzMzMTEdAzczMzMxMSUDNzMzMzMxKQM3MzMzMTExAZmZmZmbmUUBmZmZmZqZRQGZmZmZmplFAzczMzMzMSUDNzMzMzExLQM3MzMzMTE1AzczMzMzMTkBmZmZmZqZRQGZmZmZmJlFAZmZmZmYmUUDNzMzMzExGQM3MzMzMzEdAzczMzMzMSUDNzMzMzExLQGZmZmZmJlFAZmZmZmbmUUBmZmZmZqZRQGZmZmZmJlFAzczMzMzMQkDNzMzMzMxEQM3MzMzMTEZAzczMzMzMR0DNzMzMzMxJQGZmZmZmplBAzczMzMzMSEDNzMzMzExKQM3MzMzMTExAzczMzMzMTUDNzMzMzMxOQM3MzMzMzE9AzczMzMzMQUDNzMzMzMxDQM3MzMzMTEVAzczMzMzMRkDNzMzMzMxIQM3MzMzMTEpAzczMzMxMTEDNzMzMzMxPQGZmZmZmJlBAzczMzMzMSEDNzMzMzExKQM3MzMzMTExAzczMzMzMTUDNzMzMzMxOQM3MzMzMzE9AzczMzMzMR0DNzMzMzMxJQM3MzMzMTEtAzczMzMxMTEBmZmZmZqZQQGZmZmZmJlFAzczMzMxMRkDNzMzMzExIQM3MzMzMzElAzczMzMxMS0BmZmZmZqZQQM3MzMzMzEhAzczMzMxMSkDNzMzMzExMQM3MzMzMzE1AzczMzMzMT0DNzMzMzExFQM3MzMzMTEdAzczMzMzMSEDNzMzMzExKQM3MzMzMzE5AzczMzMzMR0DNzMzMzMxJQM3MzMzMTEtAzczMzMzMTUDNzMzMzMxNQM3MzMzMzEdAzczMzMzMSUDNzMzMzExLQM3MzMzMTExA\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[477]},\"duration\":{\"__ndarray__\":\"AAAAAAAA4D8AAAAAAAD4PwAAAAAAAOA/AAAAAAAA4D8AAAAAAAAMQAAAAAAAAAxAAAAAAAAADEAAAAAAAAAMQAAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAPA/AAAAAAAA+D8AAAAAAAD4PwAAAAAAAPg/AAAAAAAA+D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAPA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAA8D8AAAAAAADgPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA4D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAOA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADgPwAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAADgPwAAAAAAAPg/AAAAAAAA4D8AAAAAAADgPwAAAAAAAAxAAAAAAAAADEAAAAAAAAAMQAAAAAAAAAxAAAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA8D8AAAAAAAD4PwAAAAAAAPg/AAAAAAAA+D8AAAAAAAD4PwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAA8D8AAAAAAADgPwAAAAAAAOA/AAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAADwPwAAAAAAAOA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADgPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA4D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAOA/AAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA+D8AAAAAAAD4PwAAAAAAAPg/AAAAAAAA+D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAPA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAA8D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAA4D8AAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAA4D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAOA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAOA/AAAAAAAA+D8AAAAAAADgPwAAAAAAAOA/AAAAAAAADEAAAAAAAAAMQAAAAAAAAAxAAAAAAAAADEAAAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADwPwAAAAAAAPg/AAAAAAAA+D8AAAAAAAD4PwAAAAAAAPg/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAADwPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAPA/AAAAAAAA4D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAOA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADgPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA4D8AAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAA4D8AAAAAAAD4PwAAAAAAAOA/AAAAAAAA4D8AAAAAAAAMQAAAAAAAAAxAAAAAAAAADEAAAAAAAAAMQAAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAPA/AAAAAAAA+D8AAAAAAAD4PwAAAAAAAPg/AAAAAAAA+D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAPA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAA8D8AAAAAAADgPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA4D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAOA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADgPwAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAPg/AAAAAAAA+D8AAAAAAAD4PwAAAAAAAPg/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAADwPwAAAAAAAOA/AAAAAAAA4D8AAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAPA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAOA/AAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAOA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADgPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAA8D8AAAAAAADwPwAAAAAAAPA/AAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAEQAAAAAAAABBAAAAAAAAAEEAAAAAAAAAQQAAAAAAAABBA\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[477]},\"end_time\":{\"__ndarray__\":\"AAAAAAAA4D8AAAAAAAAAQAAAAAAAAARAAAAAAAAACEAAAAAAAAAMQAAAAAAAAAxAAAAAAAAADEAAAAAAAAAMQAAAAAAAAAxAAAAAAAAAEEAAAAAAAAAQQAAAAAAAABBAAAAAAAAAEEAAAAAAAAAQQAAAAAAAABRAAAAAAAAAFkAAAAAAAAAWQAAAAAAAABZAAAAAAAAAFkAAAAAAAAAWQAAAAAAAABhAAAAAAAAAGkAAAAAAAAAeQAAAAAAAAB5AAAAAAAAAHkAAAAAAAAAeQAAAAAAAAB5AAAAAAAAAIEAAAAAAAAAhQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAkQAAAAAAAACVAAAAAAAAAJUAAAAAAAAAlQAAAAAAAACVAAAAAAAAAJUAAAAAAAAAmQAAAAAAAACdAAAAAAAAAJ0AAAAAAAAAnQAAAAAAAACdAAAAAAAAAJ0AAAAAAAAApQAAAAAAAAClAAAAAAAAAKUAAAAAAAAApQAAAAAAAAClAAAAAAAAAK0AAAAAAAAArQAAAAAAAACtAAAAAAAAAK0AAAAAAAAArQAAAAAAAACxAAAAAAAAALUAAAAAAAAAtQAAAAAAAAC1AAAAAAAAALUAAAAAAAAAtQAAAAAAAAC5AAAAAAAAAL0AAAAAAAAAvQAAAAAAAAC9AAAAAAAAAL0AAAAAAAAAvQAAAAAAAgDFAAAAAAACAMUAAAAAAAIAxQAAAAAAAgDFAAAAAAACAMUAAAAAAAAAyQAAAAAAAgDNAAAAAAAAANEAAAAAAAIA0QAAAAAAAADVAAAAAAAAANUAAAAAAAAA1QAAAAAAAADVAAAAAAAAANUAAAAAAAIA1QAAAAAAAgDVAAAAAAACANUAAAAAAAIA1QAAAAAAAgDVAAAAAAACANkAAAAAAAAA3QAAAAAAAADdAAAAAAAAAN0AAAAAAAAA3QAAAAAAAADdAAAAAAACAN0AAAAAAAAA4QAAAAAAAADlAAAAAAAAAOUAAAAAAAAA5QAAAAAAAADlAAAAAAAAAOUAAAAAAAIA5QAAAAAAAADpAAAAAAAAAO0AAAAAAAAA7QAAAAAAAADtAAAAAAAAAO0AAAAAAAAA7QAAAAAAAgDtAAAAAAAAAPEAAAAAAAAA8QAAAAAAAADxAAAAAAAAAPEAAAAAAAAA8QAAAAAAAgDxAAAAAAAAAPUAAAAAAAAA9QAAAAAAAAD1AAAAAAAAAPUAAAAAAAAA9QAAAAAAAAD5AAAAAAAAAPkAAAAAAAAA+QAAAAAAAAD5AAAAAAAAAPkAAAAAAAAA/QAAAAAAAAD9AAAAAAAAAP0AAAAAAAAA/QAAAAAAAAD9AAAAAAACAP0AAAAAAAABAQAAAAAAAAEBAAAAAAAAAQEAAAAAAAABAQAAAAAAAAEBAAAAAAABAQEAAAAAAAIBAQAAAAAAAgEBAAAAAAACAQEAAAAAAAIBAQAAAAAAAgEBAAAAAAACAQUAAAAAAAIBBQAAAAAAAgEFAAAAAAACAQUAAAAAAAIBBQAAAAAAAwEFAAAAAAAAAQkAAAAAAAEBCQAAAAAAAgEJAAAAAAACAQkAAAAAAAIBCQAAAAAAAgEJAAAAAAACAQkAAAAAAAIBCQAAAAAAAwEJAAAAAAADAQkAAAAAAAMBCQAAAAAAAwEJAAAAAAADAQkAAAAAAAABDQAAAAAAAQENAAAAAAACAQ0AAAAAAAIBDQAAAAAAAgENAAAAAAACAQ0AAAAAAAIBDQAAAAAAAwENAAAAAAAAAREAAAAAAAIBEQAAAAAAAgERAAAAAAACAREAAAAAAAIBEQAAAAAAAgERAAAAAAADAREAAAAAAAABFQAAAAAAAgEVAAAAAAACARUAAAAAAAIBFQAAAAAAAgEVAAAAAAACARUAAAAAAAMBFQAAAAAAAAEZAAAAAAABARkAAAAAAAIBGQAAAAAAAgEZAAAAAAACARkAAAAAAAIBGQAAAAAAAgEZAAAAAAACARkAAAAAAAIBHQAAAAAAAgEdAAAAAAACAR0AAAAAAAIBHQAAAAAAAgEdAAAAAAADAR0AAAAAAAABIQAAAAAAAAEhAAAAAAAAASEAAAAAAAABIQAAAAAAAAEhAAAAAAAAASEAAAAAAAABIQAAAAAAAAEhAAAAAAABASEAAAAAAAIBIQAAAAAAAgEhAAAAAAACASEAAAAAAAIBIQAAAAAAAgEhAAAAAAADASEAAAAAAAABJQAAAAAAAAElAAAAAAAAASUAAAAAAAABJQAAAAAAAAElAAAAAAABASUAAAAAAAIBJQAAAAAAAgElAAAAAAACASUAAAAAAAIBJQAAAAAAAgElAAAAAAAAASkAAAAAAAABKQAAAAAAAAEpAAAAAAAAASkAAAAAAAABKQAAAAAAAgEpAAAAAAACASkAAAAAAAIBKQAAAAAAAgEpAAAAAAACASkAAAAAAAIBLQAAAAAAAgEtAAAAAAACAS0AAAAAAAIBLQAAAAAAAwEtAAAAAAACATEAAAAAAAMBMQAAAAAAAAE1AAAAAAABATUAAAAAAAEBNQAAAAAAAQE1AAAAAAABATUAAAAAAAEBNQAAAAAAAgE1AAAAAAACATUAAAAAAAIBNQAAAAAAAgE1AAAAAAACATUAAAAAAAABOQAAAAAAAQE5AAAAAAABATkAAAAAAAEBOQAAAAAAAQE5AAAAAAABATkAAAAAAAIBOQAAAAAAAwE5AAAAAAABAT0AAAAAAAEBPQAAAAAAAQE9AAAAAAABAT0AAAAAAAEBPQAAAAAAAgE9AAAAAAADAT0AAAAAAACBQQAAAAAAAIFBAAAAAAAAgUEAAAAAAACBQQAAAAAAAIFBAAAAAAABAUEAAAAAAAGBQQAAAAAAAYFBAAAAAAABgUEAAAAAAAGBQQAAAAAAAYFBAAAAAAACAUEAAAAAAAKBQQAAAAAAAoFBAAAAAAACgUEAAAAAAAKBQQAAAAAAAoFBAAAAAAADgUEAAAAAAAOBQQAAAAAAA4FBAAAAAAADgUEAAAAAAAOBQQAAAAAAAIFFAAAAAAAAgUUAAAAAAACBRQAAAAAAAIFFAAAAAAAAgUUAAAAAAAEBRQAAAAAAAYFFAAAAAAABgUUAAAAAAAGBRQAAAAAAAYFFAAAAAAABgUUAAAAAAAIBRQAAAAAAAoFFAAAAAAACgUUAAAAAAAKBRQAAAAAAAoFFAAAAAAACgUUAAAAAAACBSQAAAAAAAIFJAAAAAAAAgUkAAAAAAACBSQAAAAAAAIFJAAAAAAABAUkAAAAAAAKBSQAAAAAAAwFJAAAAAAADgUkAAAAAAAABTQAAAAAAAAFNAAAAAAAAAU0AAAAAAAABTQAAAAAAAAFNAAAAAAAAgU0AAAAAAACBTQAAAAAAAIFNAAAAAAAAgU0AAAAAAACBTQAAAAAAAYFNAAAAAAACAU0AAAAAAAIBTQAAAAAAAgFNAAAAAAACAU0AAAAAAAIBTQAAAAAAAoFNAAAAAAADAU0AAAAAAAABUQAAAAAAAAFRAAAAAAAAAVEAAAAAAAABUQAAAAAAAAFRAAAAAAAAgVEAAAAAAAEBUQAAAAAAAgFRAAAAAAACAVEAAAAAAAIBUQAAAAAAAgFRAAAAAAACAVEAAAAAAAKBUQAAAAAAAwFRAAAAAAADAVEAAAAAAAMBUQAAAAAAAwFRAAAAAAADAVEAAAAAAAOBUQAAAAAAAAFVAAAAAAAAAVUAAAAAAAABVQAAAAAAAAFVAAAAAAAAAVUAAAAAAAEBVQAAAAAAAQFVAAAAAAABAVUAAAAAAAEBVQAAAAAAAQFVAAAAAAACAVUAAAAAAAIBVQAAAAAAAgFVAAAAAAACAVUAAAAAAAIBVQAAAAAAAoFVAAAAAAADAVUAAAAAAAMBVQAAAAAAAwFVAAAAAAADAVUAAAAAAAMBVQAAAAAAA4FVAAAAAAAAAVkAAAAAAAABWQAAAAAAAAFZAAAAAAAAAVkAAAAAAAABWQAAAAAAAgFZAAAAAAACAVkAAAAAAAIBWQAAAAAAAgFZAAAAAAACAVkAAAAAAAKBWQAAAAAAAwFZAAAAAAADgVkAAAAAAAABXQAAAAAAAAFdAAAAAAAAAV0AAAAAAAABXQAAAAAAAAFdAAAAAAAAAV0AAAAAAACBXQAAAAAAAIFdAAAAAAAAgV0AAAAAAACBXQAAAAAAAIFdAAAAAAABAV0AAAAAAAGBXQAAAAAAAgFdAAAAAAACAV0AAAAAAAIBXQAAAAAAAgFdAAAAAAACAV0AAAAAAAKBXQAAAAAAAwFdAAAAAAAAAWEAAAAAAAABYQAAAAAAAAFhAAAAAAAAAWEAAAAAAAABYQAAAAAAAIFhAAAAAAABAWEAAAAAAAIBYQAAAAAAAgFhAAAAAAACAWEAAAAAAAIBYQAAAAAAAgFhAAAAAAACgWEAAAAAAAMBYQAAAAAAA4FhAAAAAAAAAWUAAAAAAAABZQAAAAAAAAFlAAAAAAAAAWUAAAAAAAABZQAAAAAAAAFlAAAAAAACAWUAAAAAAAIBZQAAAAAAAgFlAAAAAAACAWUAAAAAAAIBZQAAAAAAAoFlAAAAAAADAWUAAAAAAAMBZQAAAAAAAwFlAAAAAAADAWUAAAAAAAMBZQAAAAAAAwFlAAAAAAADAWUAAAAAAAMBZQAAAAAAA4FlAAAAAAAAAWkAAAAAAAABaQAAAAAAAAFpAAAAAAAAAWkAAAAAAAABaQAAAAAAAIFpAAAAAAABAWkAAAAAAAEBaQAAAAAAAQFpAAAAAAABAWkAAAAAAAEBaQAAAAAAAYFpAAAAAAACAWkAAAAAAAIBaQAAAAAAAgFpAAAAAAACAWkAAAAAAAIBaQAAAAAAAwFpAAAAAAADAWkAAAAAAAMBaQAAAAAAAwFpAAAAAAADAWkAAAAAAAABbQAAAAAAAAFtAAAAAAAAAW0AAAAAAAABbQAAAAAAAAFtAAAAAAACAW0AAAAAAAIBbQAAAAAAAgFtAAAAAAACAW0AAAAAAACBcQAAAAAAAgFxAAAAAAACAXEAAAAAAAIBcQAAAAAAAgFxA\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[477]},\"fill_alpha\":{\"__ndarray__\":\"AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA4D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADYPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAAOA/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/AAAAAAAA4D8AAAAAAADgPwAAAAAAANg/AAAAAAAA2D8AAAAAAADYPwAAAAAAANg/\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[477]},\"index\":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,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,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476],\"instrument\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"pitch\":[67,72,72,67,48,52,55,57,72,42,45,49,52,71,71,47,51,54,57,71,67,67,52,55,59,62,67,69,69,45,48,52,55,69,72,50,53,57,60,71,69,43,47,50,53,71,48,52,55,59,64,50,53,57,60,65,67,48,52,55,59,72,60,51,55,58,62,62,43,46,50,53,64,67,72,72,67,48,52,55,57,72,42,45,49,52,71,71,47,51,54,57,71,67,67,52,55,59,62,67,69,69,45,48,52,55,69,72,50,53,57,60,71,69,43,47,50,53,71,48,52,55,59,64,50,53,57,60,65,67,48,52,55,59,72,60,51,55,58,62,62,43,46,50,53,64,64,67,72,48,52,55,58,62,71,42,45,49,52,69,71,69,47,51,54,57,72,71,71,52,55,59,62,71,69,69,45,48,52,55,69,72,71,69,38,42,45,48,52,67,50,53,57,60,62,64,36,40,43,46,50,53,57,64,65,50,53,57,60,62,64,48,52,55,57,67,69,45,49,52,55,67,50,53,57,60,64,43,47,50,53,62,48,52,55,60,67,72,72,67,48,52,55,57,72,42,45,49,52,71,71,47,51,54,57,71,67,67,52,55,59,62,67,69,69,45,48,52,55,69,72,50,53,57,60,71,69,43,47,50,53,71,48,52,55,59,64,50,53,57,60,65,67,48,52,55,59,72,60,51,55,58,62,62,43,46,50,53,64,67,72,72,67,48,52,55,57,72,42,45,49,52,71,71,47,51,54,57,71,67,67,52,55,59,62,67,69,69,45,48,52,55,69,72,50,53,57,60,71,69,43,47,50,53,71,48,52,55,59,64,50,53,57,60,65,67,48,52,55,59,72,60,51,55,58,62,62,43,46,50,53,64,64,67,72,48,52,55,58,62,71,42,45,49,52,69,71,69,47,51,54,57,72,71,71,52,55,59,62,71,69,69,45,48,52,55,69,72,71,69,38,42,45,48,52,67,50,53,57,60,62,64,36,40,43,46,50,53,57,64,65,50,53,57,60,62,64,48,52,55,57,67,69,45,49,52,55,67,50,53,57,60,64,43,47,50,53,62,48,52,55,60,60,48,52,55,57],\"program\":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],\"start_time\":{\"__ndarray__\":\"AAAAAAAAAAAAAAAAAADgPwAAAAAAAABAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAAAAAADEAAAAAAAAAMQAAAAAAAAAxAAAAAAAAADEAAAAAAAAAMQAAAAAAAABBAAAAAAAAAEEAAAAAAAAAQQAAAAAAAABBAAAAAAAAAEEAAAAAAAAAUQAAAAAAAABZAAAAAAAAAGEAAAAAAAAAWQAAAAAAAABZAAAAAAAAAFkAAAAAAAAAWQAAAAAAAABpAAAAAAAAAHkAAAAAAAAAgQAAAAAAAAB5AAAAAAAAAHkAAAAAAAAAeQAAAAAAAAB5AAAAAAAAAIUAAAAAAAAAjQAAAAAAAACNAAAAAAAAAI0AAAAAAAAAjQAAAAAAAACNAAAAAAAAAJEAAAAAAAAAlQAAAAAAAACVAAAAAAAAAJUAAAAAAAAAlQAAAAAAAACVAAAAAAAAAJkAAAAAAAAAnQAAAAAAAACdAAAAAAAAAJ0AAAAAAAAAnQAAAAAAAACdAAAAAAAAAKUAAAAAAAAApQAAAAAAAAClAAAAAAAAAKUAAAAAAAAApQAAAAAAAACtAAAAAAAAAK0AAAAAAAAArQAAAAAAAACtAAAAAAAAAK0AAAAAAAAAsQAAAAAAAAC1AAAAAAAAALUAAAAAAAAAtQAAAAAAAAC1AAAAAAAAALUAAAAAAAAAuQAAAAAAAAC9AAAAAAAAAL0AAAAAAAAAvQAAAAAAAAC9AAAAAAAAAL0AAAAAAAIAxQAAAAAAAADJAAAAAAACAM0AAAAAAAAA0QAAAAAAAgDFAAAAAAACAMUAAAAAAAIAxQAAAAAAAgDFAAAAAAACANEAAAAAAAAA1QAAAAAAAADVAAAAAAAAANUAAAAAAAAA1QAAAAAAAADVAAAAAAACANUAAAAAAAIA1QAAAAAAAgDVAAAAAAACANUAAAAAAAIA1QAAAAAAAgDZAAAAAAAAAN0AAAAAAAIA3QAAAAAAAADdAAAAAAAAAN0AAAAAAAAA3QAAAAAAAADdAAAAAAAAAOEAAAAAAAAA5QAAAAAAAgDlAAAAAAAAAOUAAAAAAAAA5QAAAAAAAADlAAAAAAAAAOUAAAAAAAAA6QAAAAAAAADtAAAAAAAAAO0AAAAAAAAA7QAAAAAAAADtAAAAAAAAAO0AAAAAAAIA7QAAAAAAAADxAAAAAAAAAPEAAAAAAAAA8QAAAAAAAADxAAAAAAAAAPEAAAAAAAIA8QAAAAAAAAD1AAAAAAAAAPUAAAAAAAAA9QAAAAAAAAD1AAAAAAAAAPUAAAAAAAAA+QAAAAAAAAD5AAAAAAAAAPkAAAAAAAAA+QAAAAAAAAD5AAAAAAAAAP0AAAAAAAAA/QAAAAAAAAD9AAAAAAAAAP0AAAAAAAAA/QAAAAAAAgD9AAAAAAAAAQEAAAAAAAABAQAAAAAAAAEBAAAAAAAAAQEAAAAAAAABAQAAAAAAAQEBAAAAAAACAQEAAAAAAAIBAQAAAAAAAgEBAAAAAAACAQEAAAAAAAIBAQAAAAAAAgEFAAAAAAADAQUAAAAAAAABCQAAAAAAAgEFAAAAAAACAQUAAAAAAAIBBQAAAAAAAgEFAAAAAAACAQUAAAAAAAEBCQAAAAAAAgEJAAAAAAACAQkAAAAAAAIBCQAAAAAAAgEJAAAAAAACAQkAAAAAAAMBCQAAAAAAAAENAAAAAAADAQkAAAAAAAMBCQAAAAAAAwEJAAAAAAADAQkAAAAAAAEBDQAAAAAAAgENAAAAAAADAQ0AAAAAAAIBDQAAAAAAAgENAAAAAAACAQ0AAAAAAAIBDQAAAAAAAAERAAAAAAACAREAAAAAAAMBEQAAAAAAAgERAAAAAAACAREAAAAAAAIBEQAAAAAAAgERAAAAAAAAARUAAAAAAAIBFQAAAAAAAwEVAAAAAAAAARkAAAAAAAIBFQAAAAAAAgEVAAAAAAACARUAAAAAAAIBFQAAAAAAAgEVAAAAAAABARkAAAAAAAIBGQAAAAAAAgEZAAAAAAACARkAAAAAAAIBGQAAAAAAAgEZAAAAAAACAR0AAAAAAAIBHQAAAAAAAgEdAAAAAAACAR0AAAAAAAIBHQAAAAAAAgEdAAAAAAACAR0AAAAAAAIBHQAAAAAAAwEdAAAAAAAAASEAAAAAAAABIQAAAAAAAAEhAAAAAAAAASEAAAAAAAABIQAAAAAAAQEhAAAAAAACASEAAAAAAAIBIQAAAAAAAgEhAAAAAAACASEAAAAAAAIBIQAAAAAAAwEhAAAAAAAAASUAAAAAAAABJQAAAAAAAAElAAAAAAAAASUAAAAAAAABJQAAAAAAAQElAAAAAAACASUAAAAAAAIBJQAAAAAAAgElAAAAAAACASUAAAAAAAIBJQAAAAAAAAEpAAAAAAAAASkAAAAAAAABKQAAAAAAAAEpAAAAAAAAASkAAAAAAAIBKQAAAAAAAgEpAAAAAAACASkAAAAAAAIBKQAAAAAAAgEtAAAAAAADAS0AAAAAAAIBMQAAAAAAAwExAAAAAAACAS0AAAAAAAIBLQAAAAAAAgEtAAAAAAACAS0AAAAAAAABNQAAAAAAAQE1AAAAAAABATUAAAAAAAEBNQAAAAAAAQE1AAAAAAABATUAAAAAAAIBNQAAAAAAAgE1AAAAAAACATUAAAAAAAIBNQAAAAAAAgE1AAAAAAAAATkAAAAAAAEBOQAAAAAAAgE5AAAAAAABATkAAAAAAAEBOQAAAAAAAQE5AAAAAAABATkAAAAAAAMBOQAAAAAAAQE9AAAAAAACAT0AAAAAAAEBPQAAAAAAAQE9AAAAAAABAT0AAAAAAAEBPQAAAAAAAwE9AAAAAAAAgUEAAAAAAACBQQAAAAAAAIFBAAAAAAAAgUEAAAAAAACBQQAAAAAAAQFBAAAAAAABgUEAAAAAAAGBQQAAAAAAAYFBAAAAAAABgUEAAAAAAAGBQQAAAAAAAgFBAAAAAAACgUEAAAAAAAKBQQAAAAAAAoFBAAAAAAACgUEAAAAAAAKBQQAAAAAAA4FBAAAAAAADgUEAAAAAAAOBQQAAAAAAA4FBAAAAAAADgUEAAAAAAACBRQAAAAAAAIFFAAAAAAAAgUUAAAAAAACBRQAAAAAAAIFFAAAAAAABAUUAAAAAAAGBRQAAAAAAAYFFAAAAAAABgUUAAAAAAAGBRQAAAAAAAYFFAAAAAAACAUUAAAAAAAKBRQAAAAAAAoFFAAAAAAACgUUAAAAAAAKBRQAAAAAAAoFFAAAAAAAAgUkAAAAAAAEBSQAAAAAAAoFJAAAAAAADAUkAAAAAAACBSQAAAAAAAIFJAAAAAAAAgUkAAAAAAACBSQAAAAAAA4FJAAAAAAAAAU0AAAAAAAABTQAAAAAAAAFNAAAAAAAAAU0AAAAAAAABTQAAAAAAAIFNAAAAAAAAgU0AAAAAAACBTQAAAAAAAIFNAAAAAAAAgU0AAAAAAAGBTQAAAAAAAgFNAAAAAAACgU0AAAAAAAIBTQAAAAAAAgFNAAAAAAACAU0AAAAAAAIBTQAAAAAAAwFNAAAAAAAAAVEAAAAAAACBUQAAAAAAAAFRAAAAAAAAAVEAAAAAAAABUQAAAAAAAAFRAAAAAAABAVEAAAAAAAIBUQAAAAAAAgFRAAAAAAACAVEAAAAAAAIBUQAAAAAAAgFRAAAAAAACgVEAAAAAAAMBUQAAAAAAAwFRAAAAAAADAVEAAAAAAAMBUQAAAAAAAwFRAAAAAAADgVEAAAAAAAABVQAAAAAAAAFVAAAAAAAAAVUAAAAAAAABVQAAAAAAAAFVAAAAAAABAVUAAAAAAAEBVQAAAAAAAQFVAAAAAAABAVUAAAAAAAEBVQAAAAAAAgFVAAAAAAACAVUAAAAAAAIBVQAAAAAAAgFVAAAAAAACAVUAAAAAAAKBVQAAAAAAAwFVAAAAAAADAVUAAAAAAAMBVQAAAAAAAwFVAAAAAAADAVUAAAAAAAOBVQAAAAAAAAFZAAAAAAAAAVkAAAAAAAABWQAAAAAAAAFZAAAAAAAAAVkAAAAAAAIBWQAAAAAAAoFZAAAAAAADAVkAAAAAAAIBWQAAAAAAAgFZAAAAAAACAVkAAAAAAAIBWQAAAAAAAgFZAAAAAAADgVkAAAAAAAABXQAAAAAAAAFdAAAAAAAAAV0AAAAAAAABXQAAAAAAAAFdAAAAAAAAgV0AAAAAAAEBXQAAAAAAAIFdAAAAAAAAgV0AAAAAAACBXQAAAAAAAIFdAAAAAAABgV0AAAAAAAIBXQAAAAAAAoFdAAAAAAACAV0AAAAAAAIBXQAAAAAAAgFdAAAAAAACAV0AAAAAAAMBXQAAAAAAAAFhAAAAAAAAgWEAAAAAAAABYQAAAAAAAAFhAAAAAAAAAWEAAAAAAAABYQAAAAAAAQFhAAAAAAACAWEAAAAAAAKBYQAAAAAAAwFhAAAAAAACAWEAAAAAAAIBYQAAAAAAAgFhAAAAAAACAWEAAAAAAAIBYQAAAAAAA4FhAAAAAAAAAWUAAAAAAAABZQAAAAAAAAFlAAAAAAAAAWUAAAAAAAABZQAAAAAAAgFlAAAAAAACAWUAAAAAAAIBZQAAAAAAAgFlAAAAAAACAWUAAAAAAAIBZQAAAAAAAgFlAAAAAAACAWUAAAAAAAKBZQAAAAAAAwFlAAAAAAADAWUAAAAAAAMBZQAAAAAAAwFlAAAAAAADAWUAAAAAAAOBZQAAAAAAAAFpAAAAAAAAAWkAAAAAAAABaQAAAAAAAAFpAAAAAAAAAWkAAAAAAACBaQAAAAAAAQFpAAAAAAABAWkAAAAAAAEBaQAAAAAAAQFpAAAAAAABAWkAAAAAAAGBaQAAAAAAAgFpAAAAAAACAWkAAAAAAAIBaQAAAAAAAgFpAAAAAAACAWkAAAAAAAMBaQAAAAAAAwFpAAAAAAADAWkAAAAAAAMBaQAAAAAAAwFpAAAAAAAAAW0AAAAAAAABbQAAAAAAAAFtAAAAAAAAAW0AAAAAAAIBbQAAAAAAAgFtAAAAAAACAW0AAAAAAAIBbQAAAAAAAgFtA\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[477]},\"top\":{\"__ndarray__\":\"mpmZmZnZUECamZmZmRlSQJqZmZmZGVJAmpmZmZnZUEAzMzMzMzNIQDMzMzMzM0pAMzMzMzOzS0AzMzMzM7NMQJqZmZmZGVJAMzMzMzMzRUAzMzMzM7NGQDMzMzMzs0hAMzMzMzMzSkCamZmZmdlRQJqZmZmZ2VFAMzMzMzOzR0AzMzMzM7NJQDMzMzMzM0tAMzMzMzOzTECamZmZmdlRQJqZmZmZ2VBAmpmZmZnZUEAzMzMzMzNKQDMzMzMzs0tAMzMzMzOzTUAzMzMzMzNPQJqZmZmZ2VBAmpmZmZlZUUCamZmZmVlRQDMzMzMzs0ZAMzMzMzMzSEAzMzMzMzNKQDMzMzMzs0tAmpmZmZlZUUCamZmZmRlSQDMzMzMzM0lAMzMzMzOzSkAzMzMzM7NMQDMzMzMzM05AmpmZmZnZUUCamZmZmVlRQDMzMzMzs0VAMzMzMzOzR0AzMzMzMzNJQDMzMzMzs0pAmpmZmZnZUUAzMzMzMzNIQDMzMzMzM0pAMzMzMzOzS0AzMzMzM7NNQJqZmZmZGVBAMzMzMzMzSUAzMzMzM7NKQDMzMzMzs0xAMzMzMzMzTkCamZmZmVlQQJqZmZmZ2VBAMzMzMzMzSEAzMzMzMzNKQDMzMzMzs0tAMzMzMzOzTUCamZmZmRlSQDMzMzMzM05AMzMzMzOzSUAzMzMzM7NLQDMzMzMzM01AMzMzMzMzT0AzMzMzMzNPQDMzMzMzs0VAMzMzMzMzR0AzMzMzMzNJQDMzMzMzs0pAmpmZmZkZUECamZmZmdlQQJqZmZmZGVJAmpmZmZkZUkCamZmZmdlQQDMzMzMzM0hAMzMzMzMzSkAzMzMzM7NLQDMzMzMzs0xAmpmZmZkZUkAzMzMzMzNFQDMzMzMzs0ZAMzMzMzOzSEAzMzMzMzNKQJqZmZmZ2VFAmpmZmZnZUUAzMzMzM7NHQDMzMzMzs0lAMzMzMzMzS0AzMzMzM7NMQJqZmZmZ2VFAmpmZmZnZUECamZmZmdlQQDMzMzMzM0pAMzMzMzOzS0AzMzMzM7NNQDMzMzMzM09AmpmZmZnZUECamZmZmVlRQJqZmZmZWVFAMzMzMzOzRkAzMzMzMzNIQDMzMzMzM0pAMzMzMzOzS0CamZmZmVlRQJqZmZmZGVJAMzMzMzMzSUAzMzMzM7NKQDMzMzMzs0xAMzMzMzMzTkCamZmZmdlRQJqZmZmZWVFAMzMzMzOzRUAzMzMzM7NHQDMzMzMzM0lAMzMzMzOzSkCamZmZmdlRQDMzMzMzM0hAMzMzMzMzSkAzMzMzM7NLQDMzMzMzs01AmpmZmZkZUEAzMzMzMzNJQDMzMzMzs0pAMzMzMzOzTEAzMzMzMzNOQJqZmZmZWVBAmpmZmZnZUEAzMzMzMzNIQDMzMzMzM0pAMzMzMzOzS0AzMzMzM7NNQJqZmZmZGVJAMzMzMzMzTkAzMzMzM7NJQDMzMzMzs0tAMzMzMzMzTUAzMzMzMzNPQDMzMzMzM09AMzMzMzOzRUAzMzMzMzNHQDMzMzMzM0lAMzMzMzOzSkCamZmZmRlQQJqZmZmZGVBAmpmZmZnZUECamZmZmRlSQDMzMzMzM0hAMzMzMzMzSkAzMzMzM7NLQDMzMzMzM01AMzMzMzMzT0CamZmZmdlRQDMzMzMzM0VAMzMzMzOzRkAzMzMzM7NIQDMzMzMzM0pAmpmZmZlZUUCamZmZmdlRQJqZmZmZWVFAMzMzMzOzR0AzMzMzM7NJQDMzMzMzM0tAMzMzMzOzTECamZmZmRlSQJqZmZmZ2VFAmpmZmZnZUUAzMzMzMzNKQDMzMzMzs0tAMzMzMzOzTUAzMzMzMzNPQJqZmZmZ2VFAmpmZmZlZUUCamZmZmVlRQDMzMzMzs0ZAMzMzMzMzSEAzMzMzMzNKQDMzMzMzs0tAmpmZmZlZUUCamZmZmRlSQJqZmZmZ2VFAmpmZmZlZUUAzMzMzMzNDQDMzMzMzM0VAMzMzMzOzRkAzMzMzMzNIQDMzMzMzM0pAmpmZmZnZUEAzMzMzMzNJQDMzMzMzs0pAMzMzMzOzTEAzMzMzMzNOQDMzMzMzM09AmpmZmZkZUEAzMzMzMzNCQDMzMzMzM0RAMzMzMzOzRUAzMzMzMzNHQDMzMzMzM0lAMzMzMzOzSkAzMzMzM7NMQJqZmZmZGVBAmpmZmZlZUEAzMzMzMzNJQDMzMzMzs0pAMzMzMzOzTEAzMzMzMzNOQDMzMzMzM09AmpmZmZkZUEAzMzMzMzNIQDMzMzMzM0pAMzMzMzOzS0AzMzMzM7NMQJqZmZmZ2VBAmpmZmZlZUUAzMzMzM7NGQDMzMzMzs0hAMzMzMzMzSkAzMzMzM7NLQJqZmZmZ2VBAMzMzMzMzSUAzMzMzM7NKQDMzMzMzs0xAMzMzMzMzTkCamZmZmRlQQDMzMzMzs0VAMzMzMzOzR0AzMzMzMzNJQDMzMzMzs0pAMzMzMzMzT0AzMzMzMzNIQDMzMzMzM0pAMzMzMzOzS0AzMzMzMzNOQJqZmZmZ2VBAmpmZmZkZUkCamZmZmRlSQJqZmZmZ2VBAMzMzMzMzSEAzMzMzMzNKQDMzMzMzs0tAMzMzMzOzTECamZmZmRlSQDMzMzMzM0VAMzMzMzOzRkAzMzMzM7NIQDMzMzMzM0pAmpmZmZnZUUCamZmZmdlRQDMzMzMzs0dAMzMzMzOzSUAzMzMzMzNLQDMzMzMzs0xAmpmZmZnZUUCamZmZmdlQQJqZmZmZ2VBAMzMzMzMzSkAzMzMzM7NLQDMzMzMzs01AMzMzMzMzT0CamZmZmdlQQJqZmZmZWVFAmpmZmZlZUUAzMzMzM7NGQDMzMzMzM0hAMzMzMzMzSkAzMzMzM7NLQJqZmZmZWVFAmpmZmZkZUkAzMzMzMzNJQDMzMzMzs0pAMzMzMzOzTEAzMzMzMzNOQJqZmZmZ2VFAmpmZmZlZUUAzMzMzM7NFQDMzMzMzs0dAMzMzMzMzSUAzMzMzM7NKQJqZmZmZ2VFAMzMzMzMzSEAzMzMzMzNKQDMzMzMzs0tAMzMzMzOzTUCamZmZmRlQQDMzMzMzM0lAMzMzMzOzSkAzMzMzM7NMQDMzMzMzM05AmpmZmZlZUECamZmZmdlQQDMzMzMzM0hAMzMzMzMzSkAzMzMzM7NLQDMzMzMzs01AmpmZmZkZUkAzMzMzMzNOQDMzMzMzs0lAMzMzMzOzS0AzMzMzMzNNQDMzMzMzM09AMzMzMzMzT0AzMzMzM7NFQDMzMzMzM0dAMzMzMzMzSUAzMzMzM7NKQJqZmZmZGVBAmpmZmZnZUECamZmZmRlSQJqZmZmZGVJAmpmZmZnZUEAzMzMzMzNIQDMzMzMzM0pAMzMzMzOzS0AzMzMzM7NMQJqZmZmZGVJAMzMzMzMzRUAzMzMzM7NGQDMzMzMzs0hAMzMzMzMzSkCamZmZmdlRQJqZmZmZ2VFAMzMzMzOzR0AzMzMzM7NJQDMzMzMzM0tAMzMzMzOzTECamZmZmdlRQJqZmZmZ2VBAmpmZmZnZUEAzMzMzMzNKQDMzMzMzs0tAMzMzMzOzTUAzMzMzMzNPQJqZmZmZ2VBAmpmZmZlZUUCamZmZmVlRQDMzMzMzs0ZAMzMzMzMzSEAzMzMzMzNKQDMzMzMzs0tAmpmZmZlZUUCamZmZmRlSQDMzMzMzM0lAMzMzMzOzSkAzMzMzM7NMQDMzMzMzM05AmpmZmZnZUUCamZmZmVlRQDMzMzMzs0VAMzMzMzOzR0AzMzMzMzNJQDMzMzMzs0pAmpmZmZnZUUAzMzMzMzNIQDMzMzMzM0pAMzMzMzOzS0AzMzMzM7NNQJqZmZmZGVBAMzMzMzMzSUAzMzMzM7NKQDMzMzMzs0xAMzMzMzMzTkCamZmZmVlQQJqZmZmZ2VBAMzMzMzMzSEAzMzMzMzNKQDMzMzMzs0tAMzMzMzOzTUCamZmZmRlSQDMzMzMzM05AMzMzMzOzSUAzMzMzM7NLQDMzMzMzM01AMzMzMzMzT0AzMzMzMzNPQDMzMzMzs0VAMzMzMzMzR0AzMzMzMzNJQDMzMzMzs0pAmpmZmZkZUECamZmZmRlQQJqZmZmZ2VBAmpmZmZkZUkAzMzMzMzNIQDMzMzMzM0pAMzMzMzOzS0AzMzMzMzNNQDMzMzMzM09AmpmZmZnZUUAzMzMzMzNFQDMzMzMzs0ZAMzMzMzOzSEAzMzMzMzNKQJqZmZmZWVFAmpmZmZnZUUCamZmZmVlRQDMzMzMzs0dAMzMzMzOzSUAzMzMzMzNLQDMzMzMzs0xAmpmZmZkZUkCamZmZmdlRQJqZmZmZ2VFAMzMzMzMzSkAzMzMzM7NLQDMzMzMzs01AMzMzMzMzT0CamZmZmdlRQJqZmZmZWVFAmpmZmZlZUUAzMzMzM7NGQDMzMzMzM0hAMzMzMzMzSkAzMzMzM7NLQJqZmZmZWVFAmpmZmZkZUkCamZmZmdlRQJqZmZmZWVFAMzMzMzMzQ0AzMzMzMzNFQDMzMzMzs0ZAMzMzMzMzSEAzMzMzMzNKQJqZmZmZ2VBAMzMzMzMzSUAzMzMzM7NKQDMzMzMzs0xAMzMzMzMzTkAzMzMzMzNPQJqZmZmZGVBAMzMzMzMzQkAzMzMzMzNEQDMzMzMzs0VAMzMzMzMzR0AzMzMzMzNJQDMzMzMzs0pAMzMzMzOzTECamZmZmRlQQJqZmZmZWVBAMzMzMzMzSUAzMzMzM7NKQDMzMzMzs0xAMzMzMzMzTkAzMzMzMzNPQJqZmZmZGVBAMzMzMzMzSEAzMzMzMzNKQDMzMzMzs0tAMzMzMzOzTECamZmZmdlQQJqZmZmZWVFAMzMzMzOzRkAzMzMzM7NIQDMzMzMzM0pAMzMzMzOzS0CamZmZmdlQQDMzMzMzM0lAMzMzMzOzSkAzMzMzM7NMQDMzMzMzM05AmpmZmZkZUEAzMzMzM7NFQDMzMzMzs0dAMzMzMzMzSUAzMzMzM7NKQDMzMzMzM09AMzMzMzMzSEAzMzMzMzNKQDMzMzMzs0tAMzMzMzMzTkAzMzMzMzNOQDMzMzMzM0hAMzMzMzMzSkAzMzMzM7NLQDMzMzMzs0xA\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[477]},\"velocity\":[64,64,64,64,48,48,48,48,64,48,48,48,48,64,64,48,48,48,48,64,64,64,48,48,48,48,64,64,64,48,48,48,48,64,64,48,48,48,48,64,64,48,48,48,48,64,48,48,48,48,64,48,48,48,48,64,64,48,48,48,48,64,64,48,48,48,48,64,48,48,48,48,64,64,64,64,64,48,48,48,48,64,48,48,48,48,64,64,48,48,48,48,64,64,64,48,48,48,48,64,64,64,48,48,48,48,64,64,48,48,48,48,64,64,48,48,48,48,64,48,48,48,48,64,48,48,48,48,64,64,48,48,48,48,64,64,48,48,48,48,64,48,48,48,48,64,64,64,64,48,48,48,48,48,64,48,48,48,48,64,64,64,48,48,48,48,64,64,64,48,48,48,48,64,64,64,48,48,48,48,64,64,64,64,48,48,48,48,48,64,48,48,48,48,64,64,48,48,48,48,48,48,48,64,64,48,48,48,48,64,64,48,48,48,48,64,64,48,48,48,48,64,48,48,48,48,64,48,48,48,48,64,48,48,48,64,64,64,64,64,48,48,48,48,64,48,48,48,48,64,64,48,48,48,48,64,64,64,48,48,48,48,64,64,64,48,48,48,48,64,64,48,48,48,48,64,64,48,48,48,48,64,48,48,48,48,64,48,48,48,48,64,64,48,48,48,48,64,64,48,48,48,48,64,48,48,48,48,64,64,64,64,64,48,48,48,48,64,48,48,48,48,64,64,48,48,48,48,64,64,64,48,48,48,48,64,64,64,48,48,48,48,64,64,48,48,48,48,64,64,48,48,48,48,64,48,48,48,48,64,48,48,48,48,64,64,48,48,48,48,64,64,48,48,48,48,64,48,48,48,48,64,64,64,64,48,48,48,48,48,64,48,48,48,48,64,64,64,48,48,48,48,64,64,64,48,48,48,48,64,64,64,48,48,48,48,64,64,64,64,48,48,48,48,48,64,48,48,48,48,64,64,48,48,48,48,48,48,48,64,64,48,48,48,48,64,64,48,48,48,48,64,64,48,48,48,48,64,48,48,48,48,64,48,48,48,48,64,48,48,48,64,64,48,48,48,48]},\"selected\":{\"id\":\"1048\"},\"selection_policy\":{\"id\":\"1049\"}},\"id\":\"1034\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1040\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1009\",\"type\":\"LinearScale\"}],\"root_ids\":[\"1002\"]},\"title\":\"Bokeh Application\",\"version\":\"2.3.3\"}};\n", 713 | " var render_items = [{\"docid\":\"97214897-aac1-47cf-b7dd-f27613b4fd97\",\"root_ids\":[\"1002\"],\"roots\":{\"1002\":\"81fce8f5-a203-425d-8fb9-70c5152d7114\"}}];\n", 714 | " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", 715 | "\n", 716 | " }\n", 717 | " if (root.Bokeh !== undefined) {\n", 718 | " embed_document(root);\n", 719 | " } else {\n", 720 | " var attempts = 0;\n", 721 | " var timer = setInterval(function(root) {\n", 722 | " if (root.Bokeh !== undefined) {\n", 723 | " clearInterval(timer);\n", 724 | " embed_document(root);\n", 725 | " } else {\n", 726 | " attempts++;\n", 727 | " if (attempts > 100) {\n", 728 | " clearInterval(timer);\n", 729 | " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", 730 | " }\n", 731 | " }\n", 732 | " }, 10, root)\n", 733 | " }\n", 734 | "})(window);" 735 | ], 736 | "application/vnd.bokehjs_exec.v0+json": "" 737 | }, 738 | "metadata": { 739 | "application/vnd.bokehjs_exec.v0+json": { 740 | "id": "1002" 741 | } 742 | } 743 | } 744 | ] 745 | } 746 | ] 747 | } --------------------------------------------------------------------------------