{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "In one of the last posts, we extracted the chords from a MusicXML formatted file. In this post, we're going to do two things:\n", "\n", "- extract notes from the melody\n", "- check on which chord they happen\n", "\n", "First of all, let's concentrate on the first item\n", "\n", "# Extracting the melodic line of a MusicXML file" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The first question to ask is: how is a note coded? In our case, we're going to work with Autumn Leaves as our sample file. After analyzing the tune, I've noticed that the whole lead sheet is a sequence of measures. Let's look at the first measure to see how the first note in the melody, a B, is embedded with its chord." ] }, { "cell_type": "raw", "metadata": {}, "source": [ "\n", " \n", " \n", " \n", " 69.92\n", " 0.00\n", " \n", " 201.04\n", " \n", " \n", " \n", " 4\n", " \n", " 1\n", " major\n", " \n", " \n", " \n", " G\n", " 2\n", " \n", " \n", " \n", " \n", " E\n", " \n", " minor\n", " \n", " \n", " \n", " 2\n", " 1\n", " eighth\n", " \n", " \n", " \n", " B\n", " 4\n", " \n", " 2\n", " 1\n", " eighth\n", " down\n", " begin\n", " \n", " \n", " \n", " C\n", " 1\n", " 5\n", " \n", " 2\n", " 1\n", " eighth\n", " sharp\n", " down\n", " end\n", " \n", " \n", " \n", " D\n", " 1\n", " 5\n", " \n", " 2\n", " 1\n", " eighth\n", " sharp\n", " down\n", " begin\n", " \n", " \n", " \n", " F\n", " 1\n", " 5\n", " \n", " 2\n", " 1\n", " eighth\n", " down\n", " continue\n", " \n", " \n", " \n", " E\n", " 5\n", " \n", " 2\n", " 1\n", " eighth\n", " down\n", " end\n", " \n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So what we need to do is to parse each measure by finding all blocks containing an harmonic part, the chords that's followed by notes." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import xml.etree.cElementTree as ET" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "xml = file(\"files/autumn_leaves.xml\", 'r').readlines()\n", "tree = ET.fromstringlist(xml)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "first_measure = tree.find(\".//measure\")\n", "first_measure" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 10, "text": [ "" ] } ], "prompt_number": 10 }, { "cell_type": "code", "collapsed": false, "input": [ "chords = first_measure.findall(\"harmony/root/root-step\")\n", "chords" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 16, "text": [ "[]" ] } ], "prompt_number": 16 }, { "cell_type": "code", "collapsed": false, "input": [ "chords[0].text" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ "'E'" ] } ], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "for note in first_measure.findall(\"note/pitch/step\"):\n", " print note.text" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "B\n", "C\n", "D\n", "F\n", "E\n" ] } ], "prompt_number": 19 }, { "cell_type": "markdown", "metadata": {}, "source": [ "This allows us to easily get the notes. However, there are two sorts of alterations that need to be taken into account:\n", "\n", "- the key alterations (here we're in the key of E minor / G major, therefore F is sharp)\n", "- the accidental alterations\n", "\n", "First, let's see if we can take into account the accidental alterations." ] }, { "cell_type": "code", "collapsed": false, "input": [ "for note in first_measure.findall(\"note/pitch\"):\n", " if note.find(\"alter\") != None:\n", " alter = note.find(\"alter\").text\n", " print note.find(\"step\").text, alter\n", " else:\n", " print note.find(\"step\").text\n", " " ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "B\n", "C 1\n", "D 1\n", "F 1\n", "E\n" ] } ], "prompt_number": 21 }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can easily take into account this sort of alteration by using a function already coded in a previous notebook that shifts a note by a required number of semitones." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def increment_note(note, half_tones):\n", " notes = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B']\n", " ind = notes.index(note)\n", " return notes[(ind + half_tones) % 12]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 22 }, { "cell_type": "code", "collapsed": false, "input": [ "for note in first_measure.findall(\"note/pitch\"):\n", " if note.find(\"alter\") != None:\n", " alter = note.find(\"alter\").text\n", " print increment_note(note.find(\"step\").text, int(alter))\n", " else:\n", " print note.find(\"step\").text\n", " " ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "B\n", "C#\n", "D#\n", "F#\n", "E\n" ] } ], "prompt_number": 23 }, { "cell_type": "markdown", "metadata": {}, "source": [ "After seing the output of this function, it turns out that the key alteration is in fact already coded within the note. That's a good point for us because then we don't need to take into account a behaviour of the style: \"if this note is in the key accidentals then make it sharp or flat\". We can just use the notes right away." ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Parsing harmony and melody at the same time" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From what we've seen before, it seems logical to parse the song on a per-measure way. Using what we learnt before, we can loop over each child of each measure. If the child is a harmony element, we can set the active chord to be the one extracted from there. If it is a note element, we can increment the note count over a given chord." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def get_chord_from_harmony_tag(harmony_tag):\n", " root = harmony_tag.find('root/root-step').text\n", " alter_elem = harmony_tag.find('root/root-alter')\n", " if alter_elem != None:\n", " root = increment_note(root, int(alter_elem.text))\n", " kind_attrib = harmony_tag.find('kind').attrib['text']\n", " return \" \".join([root, kind_attrib])\n", " " ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 26 }, { "cell_type": "code", "collapsed": false, "input": [ "get_chord_from_harmony_tag(first_measure.find(\"harmony\"))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 27, "text": [ "'E m'" ] } ], "prompt_number": 27 }, { "cell_type": "code", "collapsed": false, "input": [ "def get_note_from_note_tag(note_tag):\n", " pitch = note_tag.find(\"pitch\")\n", " if pitch != None: #in case the note is a rest\n", " note = pitch.find(\"step\").text\n", " if pitch.find(\"alter\") != None:\n", " note = increment_note(note, int(pitch.find(\"alter\").text))\n", " return note\n", " else:\n", " return None" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 45 }, { "cell_type": "code", "collapsed": false, "input": [ "note_tag = first_measure.findall(\"note\")[1]\n", "get_note_from_note_tag(note_tag)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 46, "text": [ "'B'" ] } ], "prompt_number": 46 }, { "cell_type": "markdown", "metadata": {}, "source": [ "we now have the needed helper functions and can turn to the main loop." ] }, { "cell_type": "code", "collapsed": false, "input": [ "def write_note_to_dict(note, current_chord, note_chord_dict):\n", " if not current_chord in note_chord_dict:\n", " note_chord_dict[current_chord] = [0] * 12\n", " ind = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'].index(note)\n", " note_chord_dict[current_chord][ind] += 1" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 52 }, { "cell_type": "code", "collapsed": false, "input": [ "current_chord = None\n", "note_chord_dict = {}\n", "for measure in tree.findall(\".//measure\"):\n", " for child in measure:\n", " if child.tag == 'harmony':\n", " current_chord = get_chord_from_harmony_tag(child)\n", " if child.tag == 'note':\n", " note = get_note_from_note_tag(child)\n", " if current_chord != None and note != None:\n", " write_note_to_dict(note, current_chord, note_chord_dict)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 54 }, { "cell_type": "code", "collapsed": false, "input": [ "note_chord_dict" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 55, "text": [ "{'A ': [0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0],\n", " 'A 7': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],\n", " 'A m': [1, 0, 1, 0, 3, 0, 8, 9, 0, 7, 0, 0],\n", " 'A m7': [2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],\n", " 'B 7': [1, 1, 0, 1, 2, 0, 20, 8, 0, 8, 0, 4],\n", " 'B 7#5': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],\n", " 'C 7': [0, 0, 0, 0, 5, 0, 1, 4, 0, 0, 1, 0],\n", " 'C Maj7': [2, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 2],\n", " 'D 7': [4, 0, 5, 0, 3, 0, 2, 0, 0, 1, 0, 0],\n", " 'E 7': [4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 4],\n", " 'E 7b9': [2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2],\n", " 'E m': [0, 1, 0, 1, 5, 0, 5, 4, 0, 0, 0, 6],\n", " 'E m7': [0, 0, 0, 1, 8, 0, 6, 10, 0, 0, 0, 2],\n", " 'F# 7': [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],\n", " 'F# m7b5': [4, 0, 1, 0, 2, 0, 3, 1, 0, 5, 0, 1],\n", " 'G ': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3],\n", " 'G 7': [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],\n", " 'G Maj7': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 6]}" ] } ], "prompt_number": 55 }, { "cell_type": "code", "collapsed": false, "input": [ "figure(figsize=(10, 10))\n", "note_arr = array([note_chord_dict[key] for key in note_chord_dict])\n", "matshow(note_arr, fignum=False, cmap=cm.gray)\n", "xticks(arange(0, 12), ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B']);\n", "yticks(arange(0, len(note_chord_dict.keys())), note_chord_dict.keys());\n", "colorbar(shrink=0.75)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 79, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n7XbL7XYrKSlJbdq00cGDB5v3gAAACHLN2plblqWMjAxNnjxZXq9XkrR161bt3r1b3//+92ut26FD\nB23btk3Hjh1Tu3bt9Oabb6pHjx5yuVznHCM1NVWpqamSpPvuu0/33XefJGnVqlV64okn1KlTp+Y8\nJABAK9YqO/OCggKFhYVp6tSpvmXJyckaNmxYvevfcMMNeu211yRJHo9HWVlZvm/c5s2bNXToUA0a\nNEhXXXWVtm/fLklat25dvd37Sy+9pKysrOY8HABAK2dZVrO+/KVZw7ykpMTXNZ+P2267TV6vV8eP\nH9dHH32kIUOG+D5LSEjQxo0bVVRUpP/4j//QrFmzbPdz9OhR/eMf/9DEiRMvqH4AAEzUrNPsDU2R\nny0pKUllZWXyeDy68cYba3128OBB5eTk6F//+pdcLpdOnDhhu5+VK1dq2LBhtlPsZz4WMywsTOHh\n4Y2qEwAQeMePH1d1dbWjNbTKafYBAwaosLCwUduMGzdOM2bMqDXFLkkPPvigrr76an300UdauXKl\njh07ZrsPr9d7zin2jh07+l4EOQCYITw8vNbvb9hr1jAfNWqUjh8/rsWLF/uWbd26VW+//bbtNlOm\nTNFDDz2kAQMG1Fp+6NAhdevWTZL0/PPP227/7bffasOGDbr55psvsHoAAGprlefMJenVV19Vfn6+\n+vbtq8TERP32t79VTExMnfVOT8l3795d06ZN8y07vXzmzJl64IEHNGjQINXU1NSawj/z67y8PF17\n7bWKiIho7kMBALRypoR5s980JiYmRrm5uQ2ud+jQoTrL0tPTlZ6eLkm68sorVVpa6vvskUcekSTt\n27dPXbt29S2/4447dMcdd1xo2QAAGMuoO8CtWLFCv/vd78457Q4AQHMx5QI4o8J83LhxGjdunNNl\nAABaCVPCnAetAABgOKM6cwAAAonOHAAABASdOQAANkzpzAlzAABsmBLmTLMDAOCQKVOmKDo6WklJ\nSb5l+/fv1+jRoxUfH68xY8bo4MGDDe6HMAcAwIa/7wA3efJkrVmzptayOXPmaPTo0dq+fbuuvvpq\nzZkzp8E6CXMAABwyfPhwde7cudayFStW+O5sescddygvL6/B/XDOHAAAG06cM9+9e7eio6MlSdHR\n0dq9e3eD27SKMK+oqHC6hIBz8pgjIyMdG3vs2LGOjb1o0SLHxr7pppscG1uS0tLSHBv7oYcecmxs\ntHwXGuZlZWUqKytr8vZnPoDsXFpFmAMA4IRevXqpV69evvfr169vcJvo6Gh9/fXXuvTSS1VRUaFL\nLrmkwW0vOaufAAAc2klEQVQ4Zw4AgA0nHoE6btw4vfDCC5KkF154QePHj29wG8IcAACHZGVlaejQ\noSotLVVsbKyef/553X///XrzzTcVHx+vtWvX6v77729wP0yzAwBgw98XwHk8nnqX5+fnN2o/hDkA\nADa4AxwAAAgIOnMAAGyY0pkT5gAA2DAlzJlmBwDAcHTmAADYoDMHAAAB4UiYh4aGyu12+17z5s1r\n0n5KS0tr7efiiy/WggULmrlaAEBr5cQd4JrCkWn29u3bq7i4+IL3069fP99+Tp06pe7duysjI+OC\n9wsAgMQ0+wUbMWKE7r33Xg0ePFgJCQnasmWLMjIyFB8frwcffLDO+vn5+YqLi1NsbKwD1QIA4BxH\nOvOqqiq53W7f+1mzZikzM7PWOi6XS+Hh4dqyZYsWLFigm2++WcXFxercubPi4uJ077331nqgu9fr\nVXZ2dsCOAQDgX8ePH1d1dbWjNZjSmTsS5hEREec1zT5u3DhJUmJiohITE30Pa+/Tp4/Ky8t9YV5d\nXa2VK1dq7ty5/isaABBQ4eHhCg8P972vrKx0sJrgFtR/mnb6P2JISEit/6AhISGqqanxvV+9erVS\nU1MVFRUV8BoBAC0XnXkAeTweZWVlOV0GAKCFIczP4exz5tdff71mz55tu77L5ZLL5ar3syNHjig/\nP1+LFy9u9joBADCBI2F+8uTJBtcpKCjwfZ2enq709PR6P+vQoYP27t3bvAUCACBzOvOg/dM0AABw\nflrEOXMAAPzBlM6cMAcAwIYpYc40OwAAhqMzBwDAhimdOWEOAIANU8KcaXYAAAxHZw4AgA06cwAA\nEBB05gAA2DClM3dZplTaRHb3dAcANE1kZKQj41ZWVgY0XF0ul6ZNm9as+1y4cKFfjoFpdgAADMc0\nOwAANkyZvKYzBwDAcHTmAADYMKUzJ8wBALBhSpgzzQ4AgOEIcwAAbFiW1ayv+vzhD3/QgAEDlJSU\npOzsbB0/frzRdRLmAAA4pKysTIsXL1ZRUZE++ugj1dTUyOv1Nno/nDMHAMCGv8+ZX3TRRWrbtq2O\nHj2q0NBQHT16VN27d2/0fujMAQCw4e9p9i5duujXv/61evbsqW7duqlTp0665pprGl0nYQ4AgJ98\n9dVXKiws9L3O9umnn+qJJ55QWVmZvvrqK1VWVupvf/tbo8fxa5iHhobK7XYrJSVFqampeu+99+qs\nU1paKrfb7XtdfPHFWrBgQZ117rzzTlmWpaFDh/qWl5WVKSIiwrftL37xC38eDgCglbnQTjwmJkaD\nBg3yvc72wQcfaOjQoeratavatGmjCRMm6N133210nX49Z96+fXsVFxdLkt544w098MADWrduXa11\n+vXr51vn1KlT6t69uzIyMmqts3HjRv3whz/U1q1blZiYWOuzvn37+rYHAKA5+fuc+eWXX65HHnlE\nVVVVateunfLz83XFFVc0ej8BuwDu22+/VZcuXc65Tn5+vuLi4hQbGyvpuxD/5S9/qfLyckVHR+vw\n4cMKCQnRFVdcoc2bNweibAAA/GbgwIHKyclRWlqaQkJCNGjQIE2dOrXR+/FrmFdVVcntduvYsWOq\nqKjQ2rVrz7m+1+tVdna27/3w4cNVXFysoUOH6t1339WUKVN03333KSEhwbfO559/7pue/8///E8N\nGzbMb8cDAAicmpoa1dTUOFpDIO4AN3PmTM2cOfOC9uHXMI+IiPBNgb///vvKyclRSUlJvetWV1dr\n5cqVmjt3bq3lR48eVXh4uCRpx44dio+P933WrVs37dy5U507d1ZRUZHGjx+vbdu2qWPHjn46IgBA\noISGhio0NNT3vrq62sFqglvArma/8sortXfvXu3du7fez1evXq3U1FRFRUX5lt18881yu9365z//\nqYEDB2rr1q1KS0vT0qVLJUlhYWHq3LmzJGnQoEGKi4vTjh07/H8wAIBWIRB3gGsOATtn/sknn6im\npkZdu3at93OPx6OsrKxay5YvX6758+crLi5OXbp00erVqzVnzhzf53v37lXnzp0VGhqqzz77TDt2\n7FCfPn38ehwAgNbDlAetBOScufTdN+TFF1+Uy+Wqs96RI0eUn5+vxYsX1/lsw4YNysnJ0aJFi5Se\nnl7ns3//939X27ZtFRISomeffVadOnXyz8EAABCkXJYp/+xoovr+8QAAaLrIyEhHxq2srAxop+xy\nuXTnnXc26z6XLFnil2PgDnAAABiOB60AAGDDlMlrwhwAABumhDnT7AAAGI7OHAAAG3TmAAAgIOjM\nAQCwYUpnTpgDAGDDlDBnmh0AAMPRmQMAYMOUzpwwBwA0Srdu3RwZd/v27QEf05QwZ5odAADD0ZkD\nAGCDzhwAAAQEnTkAADZM6cwJcwAAbJgS5kyzAwBgODpzAABs0JkDAICAoDMHAMCGKZ05YQ4AgA1T\nwpxpdgAADGdsmO/evVvZ2dmKi4tTWlqahg4dqry8PKfLAgC0IJZlNevLX4wMc8uyNH78eI0YMUKf\nfvqpPvjgA3m9Xu3atcvp0gAALQhh7kdr165VeHi4pk6d6lvWs2dPTZs2zcGqAABwhpEXwG3btk2D\nBg1yugwAgB8dPXpUVVVVjtZgygVwRoa5y+Wq9X7atGl6++23FRYWps2bNztUFQCgObVv317t27f3\nvd+3b5+D1QQ3I8N8wIABeuWVV3zvFy5cqH379iktLc3BqgAALY0pnbmR58xHjRqlY8eO6ZlnnvEt\nO3LkiIMVAQBaokBcAHfw4EHdcsstSkhIUP/+/fX+++83uk4jO3NJysvL0z333KN58+YpKipKHTp0\n0Lx585wuCwCARvnVr36lG264QcuWLdPJkyeb1JwaG+aXXnqpPB6P02UAAFowf0+zf/vtt9q4caNe\neOEFSVKbNm108cUXN3o/Rk6zAwDQEnz++eeKiorS5MmTNWjQIP30pz/V0aNHG70fwhwAABsXeo58\n7969Ki0t9b3OdvLkSRUVFekXv/iFioqK1KFDB82ZM6fRdRLmAADYuNAw79Kli77//e/7Xmfr0aOH\nevToocGDB0uSbrnlFhUVFTW6TsIcAACHXHrppYqNjdX27dslSfn5+RowYECj92PsBXAAAPhbIP7O\n/KmnntKPfvQjVVdXKy4uTs8//3yj90GYAwDgoIEDB2rLli0XtA/CHAAAG6bcAY4wBwDAhilhzgVw\nAAAYjs4cAAAbpnTmrSLMY2JiHBm3oqLCkXEl545Zcva4Afjf4cOHnS4hYEwJc6bZAQAwXKvozAEA\naAo6cwAAEBB05gAA2DClMyfMAQCwYUqYM80OAIDh6MwBALBBZw4AAAKCzhwAABumdOaEOQAANkwJ\nc6bZAQAwXMDCPDQ0VG632/eaN29enXUmTZrk+7x3795yu92SpCVLlujuu++ud79PPvmkkpKSlJiY\nqCeffNKvxwAAaF0sy2rWl78EbJq9ffv2Ki4uPuc6Xq/X9/WMGTPUqVMnSZLL5ap3/ZKSEv3pT3/S\nli1b1LZtW1133XW66aabFBcX13yFAwAQ5IJymt2yLC1dulRZWVm+ZTt37tTIkSMVHx+vhx9+WJL0\n8ccfa8iQIWrXrp1CQ0OVnp6uv//9706VDQBoYejMz1JVVeWbNpekWbNmKTMzs951N27cqOjoaF+H\nbVmWNm/erG3btikiIkKDBw/WjTfeqKSkJP3ud7/T/v371a5dO7322mu64oor6uzvzMf1hYWFKTw8\nvJmPDgDQ3I4fP67q6mpHazDlAriAhXlERESD0+yneTweZWdn11o2ZswYde7cWZI0YcIEvf322/rV\nr36l3/zmNxozZow6dOggt9utkJC6kw0dO3a88AMAAARUeHh4rearsrLSwWqCW9BNs588eVKvvvqq\nbrvtNt+ys8+ZW5blC+0pU6bogw8+0Pr169WpUyf169cvoPUCAFouU6bZgy7M8/PzlZCQoG7duvmW\nWZalN998UwcOHFBVVZWWL1+uq666SpL0zTffSJLKy8v16quv1unoAQBoKlPC3LFz5tdff71mz55d\nZ73c3NxaF75J33XmV1xxhSZOnKhdu3bp9ttv16BBgyRJt9xyi/bt26e2bdvqf/7nf3TRRRf590AA\nAAgyLsuUs/tN5HK5FBMT48jYFRUVjowrybFjlpw9bgD+5+Tv1EBGlsvl0tChQ5t1n++++65fjiHo\nptkBAEDjcG92AABsmDJ5TZgDAGDDlDBnmh0AAMPRmQMAYIPOHAAABASdOQAANkzpzAlzAABsmBLm\nTLMDAOCwmpoaud1ujR07tknb05kDAGAjUJ35k08+qf79+9d6ZHdjtIowP/OhLYHk5G1NnTpmidu5\nAi1da/yd6k+7du3S66+/rt/+9rd67LHHmrSPVhHmAAA0xYV25ocPH26w277nnnv06KOP6tChQ00e\nh3PmAADYuNBHnkZGRiomJsb3OtuqVat0ySWXyO12X9A/HAhzAAAc8u6772rFihXq3bu3srKytHbt\nWuXk5DR6P4Q5AAA2LrQzP/t1ttmzZ2vnzp36/PPP5fV6NWrUKL344ouNrpNz5gAA2Aj035m7XK4m\nbUeYAwAQBNLT05Went6kbQlzAABscAc4AAAQEHTmAADYMKUzJ8wBALBhSpgzzQ4AgOGCtjMPDQ1V\ncnKy731WVpZmzpxZa51JkyaptLRUknTw4EF16tRJxcXFAa0TANBymdKZB22Yt2/fvsFg9nq9vq9n\nzJihTp06+bssAACCTtCGeWNYlqWlS5eqoKDA6VIAAC0InfkFqqqqktvt9r2fNWuWMjMz611348aN\n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\nAElFTkSuQmCC\n", "text": [ "" ] } ], "prompt_number": 79 }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }