-
-
Save owengc/75068e105523d0773e33 to your computer and use it in GitHub Desktop.
Owen Campbell - MAT 240E Homework2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"metadata": { | |
"name": "" | |
}, | |
"nbformat": 3, | |
"nbformat_minor": 0, | |
"worksheets": [ | |
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"# Owen Campbell\n", | |
"# MAT 240E Homework 2\n", | |
"#\n", | |
"# For the purposes of this assignment, key modulations will be defined (rather naively) as follows: \n", | |
"# 'parallel minor' - The first chord and the last chord are of the same scale degree, but change from major to\n", | |
"# major to minor\n", | |
"# 'parallel major' - The first chord and the last chord are of the same scale degree, but change from major to\n", | |
"# minor to major\n", | |
"# 'relative minor' - The root of the last chord is 9 semitones above the root of the first chord and\n", | |
"# there is a shift from major to minor tonality\n", | |
"# 'relative major' - The root of the last chord is 3 semitones above the root of the first chord and\n", | |
"# there is a shift from minor to major tonality\n", | |
"# 'submediant' - The root of the last chord is 9 semitones above the root of the first chord but\n", | |
"# there is no shift in tonality\n", | |
"# 'mediant' - The root of the last chord is 3 semitones above the root of the first chord but\n", | |
"# there is no shift in tonality\n", | |
"# 'subdominant' - The root of the last chord is 5 semitones above the root of the first chord\n", | |
"# 'dominant' - The root of the last chord is 7 semitones above the root of the first chord\n", | |
"# 'unknown' - The first chord in the work differs from the last chord but the modulation does\n", | |
"# not fall into any of the above categories\n", | |
"# 'none' - The first chord in the work does not differ from the last chord\n", | |
"# Hypothesis: Since these are classical works, it is very likely that the majority of the pieces will \n", | |
"# involve a fairly predictable key modulation; specifically, one to a parallel, relative, \n", | |
"# dominant or subdominant key. I originally intended to process all the works in the corpus,\n", | |
"# but due to time constraints I am only using the Bach Chorales" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 131 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"from music21 import *\n", | |
"import ntpath\n", | |
"import string" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 89 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"# this function attempts to determine the interval, in semitones (+/-) between two pitches\n", | |
"def degree_dif(start, end):\n", | |
" if start == end:\n", | |
" return 0\n", | |
" if end - start < 0:\n", | |
" return end - start + 12\n", | |
" else:\n", | |
" return end - start" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 129 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"core = corpus.CoreCorpus()\n", | |
"modulations = {'parallel minor': 0, 'parallel major': 0, 'relative minor': 0, 'relative major': 0, \n", | |
" 'submediant': 0, 'mediant': 0, 'subdominant': 0, 'dominant': 0, 'unknown': 0, 'none': 0}\n", | |
"works = core.getBachChorales()\n", | |
"#print ntpath.basename(works[0])\n", | |
"for work in works:\n", | |
" #name = ntpath.basename(work)\n", | |
" work = corpus.parse(work)\n", | |
" excerpt = work.measures(0,5)\n", | |
" reduction = work.chordify().stripTies(retainContainers=True)\n", | |
" chords = reduction.flat.getElementsByClass('Chord')\n", | |
" nchords = len(chords)\n", | |
" try:\n", | |
" # attempt to get pitch class of first real chord\n", | |
" first = harmony.chordSymbolFigureFromChord(chords[0], True)\n", | |
" if first[0] == 'Chord Symbol Cannot Be Identified':\n", | |
" idx = 2\n", | |
" while first == 'Chord Symbol Cannot Be Identified':\n", | |
" first = harmony.chordSymbolFigureFromChord(chords[nchords + idx], True)\n", | |
" idx += 1\n", | |
" fc_name = first[0].split('/', 1)[0]\n", | |
" fc_color = first[1]\n", | |
" fc_num = pitch.Pitch(str(fc_name).translate(None, string.ascii_lowercase)).pitchClass\n", | |
" ft = first[1]\n", | |
"\n", | |
" # attempt to get pitch class of last chord\n", | |
" last = harmony.chordSymbolFigureFromChord(chords[nchords - 1], True)\n", | |
" if last[0] == 'Chord Symbol Cannot Be Identified':\n", | |
" idx = 2\n", | |
" while last[0] == 'Chord Symbol Cannot Be Identified':\n", | |
" last = harmony.chordSymbolFigureFromChord(chords[nchords - idx], True)\n", | |
" idx += 1\n", | |
" lc_name = last[0].split('/', 1)[0]\n", | |
" lc_color = last[1]\n", | |
" lc_num = pitch.Pitch(str(lc_name).translate(None, string.ascii_lowercase)).pitchClass\n", | |
" lt = last[1]\n", | |
" \n", | |
" distance = degree_dif(fc_num, lc_num)\n", | |
" \n", | |
" #print '~~~~~'\n", | |
" #print 'first: {} ({})'.format(fc_num, fc_name)\n", | |
" #print 'last: {} ({})'.format(lc_num, lc_name)\n", | |
" #print 'dist: {}'.format(distance)\n", | |
" \n", | |
" \n", | |
" if distance == 0:\n", | |
" if fc_color == lc_color:\n", | |
" modulations['none'] += 1\n", | |
" #print 'conclusion: none'\n", | |
" elif fc_color == 'minor' and lc_color == 'major':\n", | |
" modulations['parallel major'] += 1\n", | |
" #print 'conclusion: parallel major'\n", | |
" elif fc_color == 'major' and lc_color == 'minor':\n", | |
" modulations['parallel minor'] += 1\n", | |
" #print 'conclusion: parallel minor'\n", | |
" else: # this will happen with less common chord labels like 'Gpedal' or 'Gsus'\n", | |
" modulations['none'] += 1\n", | |
" #print 'conclusion: none'\n", | |
" elif distance == 9:\n", | |
" if fc_color == 'major' and lc_color == 'minor':\n", | |
" modulations['relative minor'] += 1\n", | |
" #print 'conclusion: relative minor'\n", | |
" else: # modulating to MAJOR 6\n", | |
" modulations['submediant'] += 1\n", | |
" #print 'conclusion: submediant'\n", | |
" elif distance == 3:\n", | |
" if fc_color == 'minor' and lc_color == 'major':\n", | |
" modulations['relative major'] += 1\n", | |
" #print 'conclusion: relative major'\n", | |
" else: # modulating to MINOR 3\n", | |
" modulations['mediant'] += 1\n", | |
" #print 'conclusion: mediant'\n", | |
" elif distance == 5:\n", | |
" modulations['subdominant'] += 1\n", | |
" #print 'conclusion: subdominant'\n", | |
" elif distance == 7:\n", | |
" modulations['dominant'] += 1\n", | |
" #print 'conclusion: dominant'\n", | |
" else:\n", | |
" modulations['unknown'] += 1\n", | |
" #print 'conclusion: unknown' \n", | |
" #print\n", | |
" except:\n", | |
" continue" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 144 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"import matplotlib as mpl\n", | |
"mpl.rcParams['figure.figsize'] = (16, 4)\n", | |
"\n", | |
"pyplot.bar(range(len(modulations)), modulations.values(), align='center')\n", | |
"pyplot.xticks(range(len(modulations)), modulations.keys(), rotation='vertical')\n", | |
"pyplot.title('Modulations in Bach Chorales')\n", | |
"pyplot.show()" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "display_data", | |
"png": "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\n06YqVqyY/P399e2332ZokJSVU6dOOTy2YRgqV66cvU5J9nAnSQULFlRaWpok6bXXXlOVKlXUvn17\nVa5cWZMmTXK65oCAgEzvMyu//vqrkpOTdfnyZTVv3lwdOnSwX/b555+rfv368vf3l7+/v/bt26dz\n585Jkk6ePKnKlStneb9ZPbd7FStWTKdOnbrv87r7/goVKmS/v8TExAyvhRs3btiP1EpyeD3cunVL\nY8aMUZUqVVSkSBH7Fwx3ntfdjh8/rsmTJ9ufv7+/v06ePKnExERVrlxZH374oSIiIhQQEKA+ffoo\nMTHxvs8DAOAaCKAAALs7R5NWrlyZYXpm8eLF5eXl5bD0yIkTJ1S2bFlJUunSpR265d7bOdfb21uX\nLl2y/52UlJRpDVevXlX37t31+uuv68yZM0pOTtZTTz1lD8P3mxIbGBio48eP2/+22WyKj493OJp7\nt7vvr3Dhwnr//fd19OhRLVu2TB988MFDP7+wQIECCg8P148//qjz58/r+PHj+tOf/qSPP/5Y58+f\nV3JysmrXrm1//uXKldORI0ecuu/s9lXbtm319ddf57jxT5kyZTK8Fjw9PR2C+N2PP3fuXC1btkzf\nf/+9Ll68qNjYWEmZH9EuX7683nrrLSUnJ9t/0tLS1KtXL0lSnz59tHHjRh0/flyGYeiNN97I0XMA\nAJiPAAoAcPDZZ59p3bp1KliwoMN2Dw8P9ezZU2+99ZbS0tJ0/PhxTZkyxX6eaM+ePTV16lQlJCQo\nOTlZEydOdLh9vXr1NH/+fN24cUM7duzQl19+mWlAunbtmq5du6bixYsrX758WrlypdasWWO/PCAg\nQL/++qu94c29evTooRUrVmjdunW6fv26Jk+erAIFCqh58+aZXv/uALR8+XIdOXJENptNvr6+8vDw\nkIeHx333WU5C3J3bXL16VXPmzFHp0qVVtGhRXbp0SYZhqHjx4rp165Zmzpypffv22W83ZMgQvf/+\n+9q5c6dsNpuOHDmS5TI52dU1atQopaSkKDw83H77hIQEjR492uHx7r2/O/fZp08fTZkyRXFxcUpL\nS9Nf//pX9e7dW/nyZT60SEtLU/78+e3P8a9//WuW9z106FD9+9//1rZt22Sz2XTp0iWtWLFCaWlp\nOnTokNatW6erV68qf/78KlCggFP/RgAA10AABQA4qFSpkho0aGD/++6QOG3aNHl7e6tSpUpq0aKF\n+vXrp0GDBkm6HRo6dOigunXrqmHDhurevbvDbf/+97/r6NGj8vf3V0RERIYGNHeu6+Pjo6lTp6pn\nz54qWrSo5s2bp86dO9uvV6NGDfXp00eVKlVS0aJFlZiY6NDgqHr16vriiy80cuRIlShRQitWrNA3\n33wjT0/PTJ/v3bc9cuSI2rVrJx8fHzVv3lwvvfSSWrVqleXtMruPzC7PjJ+fn30d0J9++knLli2T\nJAUHB2v06NFq1qyZSpUqpX379umJJ56w3+7ZZ5/VW2+9pb59+8rX11fdunVTcnLyfZ/bvfz9/bVl\nyxZ5eXmpSZMm8vX1Vdu2beXn56cqVapk+hzuvr/nn39eAwYMUMuWLVWpUiUVKlRI06ZNy/L5Dxw4\nUBUqVFBgYKBq166tZs2aZbkPQ0NDNWPGDI0YMUJFixZV1apV7R2ar169qjfffFMlSpRQ6dKlde7c\nOU2YMCHbfQ0AcB2GjUW3AAAAAAAmyPYIaHx8vFq3bq1atWqpdu3amjp1qqTbXe3Kli2r+vXrq379\n+lq5cqX9NhMmTFDVqlVVo0YNhylTAAAAAIBHW7ZHQJOSkpSUlKR69eopLS1NoaGhWrJkiRYuXCgf\nHx+NGjXK4foxMTHq27evtm/froSEBLVt21aHDh3K8nwQAAAAAMCjI9tkWKpUKdWrV0/S7c6ANWvW\ntLexzyy3Ll26VH369JGXl5eCgoJUpUoV+7plAAAAAIBHW+YdGTIRFxen6OhoNW3aVJs3b9a0adP0\n+eefq2HDhpo8ebL8/Px06tQpNW3a1H6bsmXLOqy7Jt2/KQMAAAAAwL1lNdHWqbmxaWlpevbZZ/XR\nRx+pcOHCGj58uGJjY7Vr1y6VLl1ao0ePzvK2mQXOO63W+eEnN37GjRtneQ3u8MN+Yj+xr9hPrv7D\nvmI/sZ/YV678w35y/ic79w2g169fV/fu3dW/f3916dJFklSyZEl7u/QhQ4bYp9kGBgYqPj7eftuT\nJ09mufA3AAAAAODRkm0AtdlsGjx4sIKDg/XKK6/YtycmJtp///rrrxUSEiJJ6tSpk+bPn69r164p\nNjZWhw8fVuPGjR9S6QAAAAAAd5LtOaCbN2/WF198oTp16qh+/fqSpPHjx2vevHnatWuXDMNQxYoV\n9cknn0i6vXh2z549FRwcLE9PT02fPp1zPvHQhYWFWV2CW2A/OYf95Dz2lXPYT85jXzmH/eQc9pPz\n2FfOYT/ljmyXYXkoD2gY950XDAAAAABwT9llPhboBAAAAACYggAKAAAAADAFARQAAAAAYAoCKAAA\nAADAFARQAAAAAIApCKAAAAAAAFMQQAEAAAAApiCAAgAAAABMQQAFAAAAAJiCAAoAAAAAMAUBFAAA\nAABgCgIoAAAAAMAUBFAAAAAAgCkIoAAAAAAAUxBAAQAAAACmIIACAAAAAExBAAUAAAAAmIIACgAA\nAAAwBQEUAAAAAGAKAigAAAAAwBQEUAAAAACAKQigAAAAAABTEEABAAAAAKYggAIAAAAATEEABQAA\nAACYggAKAAAAADCFp9UFAEBWfH2LKjU12eoyTOHj46+UlPNWlwEAAPBQGTabzWbqAxqGTH5IAG7K\nMAxJj8r7Be+NAAAgb8gu8zEFFwAAAABgCgIoAAAAAMAUBFAAAAAAgCkIoAAAAAAAUxBAAQAAAACm\nIIACAAAAAExBAAUAAAAAmCLbABofH6/WrVurVq1aql27tqZOnSpJOn/+vNq1a6dq1aqpffv2unDh\ngv02EyZMUNWqVVWjRg2tWbPm4VYPAAAAAHAbhi2blc+TkpKUlJSkevXqKS0tTaGhoVqyZIlmzpyp\n4sWL6/XXX9ekSZOUnJysiRMnKiYmRn379tX27duVkJCgtm3b6tChQ8qX77ecm92ipABwN8MwJD0q\n7xe8NwIAgLwhu8yX7RHQUqVKqV69epKkwoULq2bNmkpISNCyZcsUHh4uSQoPD9eSJUskSUuXLlWf\nPn3k5eWloKAgValSRdu2bcvN5wIAAAAAcFOezl4xLi5O0dHRatKkiU6fPq2AgABJUkBAgE6fPi1J\nOnXqlJo2bWq/TdmyZZWQkJDhviIiIuy/h4WFKSwsLIflAwAAAACsFBUVpaioKKeu61QATUtLU/fu\n3fXRRx/Jx8fH4TLDMP5vmlzmMrvs7gAKAAAAAHBf9x5UjIyMzPK69+2Ce/36dXXv3l0DBgxQly5d\nJN0+6pmUlCRJSkxMVMmSJSVJgYGBio+Pt9/25MmTCgwMzNGTAAAAAADkLdkGUJvNpsGDBys4OFiv\nvPKKfXunTp00e/ZsSdLs2bPtwbRTp06aP3++rl27ptjYWB0+fFiNGzd+iOUDAAAAANxFtl1wN23a\npJYtW6pOnTr2qbQTJkxQ48aN1bNnT504cUJBQUFauHCh/Pz8JEnjx4/Xf//7X3l6euqjjz5Shw4d\nHB+QLrgAnEQXXAAAAPeTXebLNoCaXQwA3I0ACgAA4H5yvAwLAAAAAAC5hQAKAAAAADAFARQAAAAA\nYAoCKAAAAADAFARQAAAAAIApCKAAAAAAAFMQQAEAAAAApiCAAgAAAABMQQAFAAAAAJiCAAoAAAAA\nMAUBFAAAAABgCgIoAAAAAMAUBFAAAAAAgCkIoAAAAAAAUxBAAQAAAACmIIACAAAAAExBAAUAAAAA\nmIIACgAAAAAwBQEUAAAAAGAKAigAAAAAwBQEUAAAAACAKQigAAAAAABTEEABAAAAAKYggAIAAAAA\nTEEABQAAAACYggAKAAAAADAFARQAAAAAYAoCKAAAAADAFARQAAAAAIApCKAAAAAAAFMQQAEAAAAA\npiCAAgAAAABMQQAFAAAAAJiCAAoAAAAAMAUBFAAAAABgCgIoAAAAAMAU2QbQ559/XgEBAQoJCbFv\ni4iIUNmyZVW/fn3Vr19fK1eutF82YcIEVa1aVTVq1NCaNWseXtUAAAAAALdj2Gw2W1YXbty4UYUL\nF9bAgQO1d+9eSVJkZKR8fHw0atQoh+vGxMSob9++2r59uxISEtS2bVsdOnRI+fI5ZlzDMJTNQwKA\nnWEYkh6V9wveGwEAQN6QXebL9ghoixYt5O/vn2F7Zne2dOlS9enTR15eXgoKClKVKlW0bdu2HJYM\nAAAAAMhrPHNyo2nTpunzzz9Xw4YNNXnyZPn5+enUqVNq2rSp/Tply5ZVQkJCprePiIiw/x4WFqaw\nsLCclAEAAAAAsFhUVJSioqKcuu4DB9Dhw4dr7NixkqR33nlHo0eP1meffZbpdW9Pn8vo7gAKAAAA\nAHBf9x5UjIyMzPK6D9wFt2TJkjIMQ4ZhaMiQIfZptoGBgYqPj7df7+TJkwoMDHzQuwcAAAAA5FEP\nHEATExPtv3/99df2DrmdOnXS/Pnzde3aNcXGxurw4cNq3Lhx7lUKAAAAAHBr2U7B7dOnj9avX69z\n586pXLlyioyMVFRUlHbt2iXDMFSxYkV98sknkqTg4GD17NlTwcHB8vT01PTp07OcggsAAAAAePRk\nuwzLQ3lAlmEB4CSWYQEAAHA/OV6GBQAAAACA3EIABQAAAACYggAKAAAAADAFARQAAAAAYAoCKAAA\nAADAFARQAAAAAIApCKAAAAAAAFMQQAEAAAAApiCAAgAAAABMQQAFAAAAAJiCAAoAAAAAMAUBFAAA\nAABgCgIoAAAAAMAUBFAAAAAAgCkIoAAAAAAAUxBAAQAAAACmIIACAAAAAExBAAUAAAAAmIIACgAA\nAAAwhafVBSDv8PUtqtTUZKvLMIWPj79SUs5bXQYAAADgVgybzWYz9QENQyY/JExiGIakR+Xfltex\nGXhNAQAAuJ/sMh9TcAEAAAAApiCAAgAAAABMQQAFAAAAAJiCAAoAAAAAMAUBFAAAAABgCgIoAAAA\nAMAUBFAAAAAAgCkIoAAAAAAAUxBAAQAAAACmIIACAAAAAExBAAUAAAAAmIIACgAAAAAwBQEUAAAA\nAGAKAigAAAAAwBQEUAAAAACAKbINoM8//7wCAgIUEhJi33b+/Hm1a9dO1apVU/v27XXhwgX7ZRMm\nTFDVqlVVo0YNrVmz5uFVDQAAAABwO9kG0EGDBmnVqlUO2yZOnKh27drp0KFDatOmjSZOnChJiomJ\n0YIFCxQTE6NVq1bpxRdf1K1btx5e5QAAAAAAt5JtAG3RooX8/f0dti1btkzh4eGSpPDwcC1ZskSS\ntHTpUvXp00deXl4KCgpSlSpVtG3btodUNgAAAADA3Xg+6A1Onz6tgIAASVJAQIBOnz4tSTp16pSa\nNm1qv17ZsmWVkJCQ6X1ERETYfw8LC1NYWNiDlgEAAAAAcAFRUVGKiopy6roPHEDvZhiGDMPI9vLM\n3B1AAQAAAADu696DipGRkVle94G74AYEBCgpKUmSlJiYqJIlS0qSAgMDFR8fb7/eyZMnFRgY+KB3\nDwAAAADIox44gHbq1EmzZ8+WJM2ePVtdunSxb58/f76uXbum2NhYHT58WI0bN87dagEAAAAAbivb\nKbh9+vTR+vXrde7cOZUrV05/+9vfNGbMGPXs2VOfffaZgoKCtHDhQklScHCwevbsqeDgYHl6emr6\n9OnZTs8FAAAAADxaDJvNZjP1AQ1DJj8kTHL7C4dH5d+W17EZeE0BAAC4n+wy3wNPwQUAAAAAICcI\noAAAAAAAUxBAAQAAAACmIIACAAAAAExBAAUAAAAAmIIACgAAAAAwBQEUAAAAAGAKAigAAAAAwBQE\nUAAAAACAKQigAAAAAABTEEABAAAAAKYggAIAAAAATEEABQAAAACYggAKAAAAADAFARQAAAAAYAoC\nKAAAAADAFARQAAAAAIApCKAAAAAAAFMQQAEAAAAApiCAAgAAAABMQQAFAAAAAJiCAAoAAAAAMAUB\nFAAAAABgCgIoAAAAAMAUBFAAAAAAgCkIoAAAAAAAUxBAAQAAAACmIIACAAAAAExBAAUAAAAAmIIA\nCgAAAAAwBQEUAAAAAGAKAigAAAAAwBQEUAAAAACAKQigAAAAAABTEEABAAAAAKbwzOkNg4KC5Ovr\nKw8PD3l5eWnbtm06f/68evXqpePHjysoKEgLFy6Un59fbtYLAAAAAHBTOT4CahiGoqKiFB0drW3b\ntkmSJk6cqHbt2unQoUNq06aNJk6cmGuFAgAAAADc2++agmuz2Rz+XrZsmcLDwyVJ4eHhWrJkye+5\newAAAABAHpLjKbiGYaht27by8PDQsGHDNHToUJ0+fVoBAQGSpICAAJ0+fTrT20ZERNh/DwsLU1hY\nWE7LAAAAAABYKCoqSlFRUU5d17DdexjTSYmJiSpdurTOnj2rdu3aadq0aerUqZOSk5Pt1ylatKjO\nnz/v+ICGkeHIKfIGwzAkPSr/tryOzcBrCgAAwP1kl/lyPAW3dOnSkqQSJUqoa9eu2rZtmwICApSU\nlCTpdkAtWbJkTu8eAAAAAJDH5CiAXr58WampqZKkS5cuac2aNQoJCVGnTp00e/ZsSdLs2bPVpUuX\n3KsUAAAAAODWcjQFNzY2Vl27dpUk3bhxQ/369dObb76p8+fPq2fPnjpx4kSWy7AwBTfvYrokchuv\nKQAAAPeTXebL8TmgD6MYuDfCAnIbrykAAAD381DOAQUAAAAA4EEQQAEAAAAApiCAAgAAAABMQQAF\nAAAAAJiCAAoAAAAAMAUBFAAAAABgCgIoAAAAAMAUBFAAAAAAgCkIoAAAAAAAUxBAAQAAAACmIIAC\nAAAAAExBAAUAAAAAmIIACgAAAAAwBQEUAAAAAGAKAigAAAAAwBQEUAAAAACAKQigAAAAAABTEEAB\nAAAAAKYggAIAAAAATEEABQAAAACYggAKAAAAADAFARQAAAAAYAoCKAAAAADAFARQAAAAAIApPK0u\nAADw+/j6FlVqarLVZZjGx8dfKSnnrS4DAADkgGGz2WymPqBhyOSHhEkMw5D0qPzb8jo2A68pJ2/5\nSO0nKaf7iqAOAIA5sst8BFDkmkdrEMzr2Ay8ppy85SO1n6Sc7iv2EwAA5sgu8zEFFwAAOHiUjhZz\npBgAzMURUOSaR+voAq9jM/CacvKWj9R+kjgC6ixeU87h/RwAclt2mY8uuAAAAAAAUxBAAQAAAACm\nIIACAAAAAExBEyLAZI9Scw+JBh8AAAD4DU2IkGtoWuHkLR+p/SSxr5zFfnIeTYicw2vKOYxLACC3\n0YQIAAAAAGA5AijygCirC3ATUVYX4CairC7AjURZXYCbiLK6ADcSZXUBbiEqKsrqEtwC+8l57Cvn\nsJ9yR64H0FWrVqlGjRqqWrWqJk2alNt3D2QiyuoC3ESU1QW4iSirC3AjUVYX4CairC7AjURZXYBb\nYBDsHPaT89hXzmE/5Y5cbUJ08+ZNjRgxQt99950CAwPVqFEjderUSTVr1szNhwEAAADwiLKyoWNk\nZKTpj5nXGjrm6hHQbdu2qUqVKgoKCpKXl5d69+6tpUuX5uZDAAAAuARf36IyDMP0n8jISEse19e3\nqNW7HJCk/wufNgt+xlnyuHlt9YRc7YK7ePFirV69WjNmzJAkffHFF/rpp580bdq03x7QMHLr4QAA\nAAAALiirmJmrU3CdCZe0OgcAAACAR1OuTsENDAxUfHy8/e/4+HiVLVs2Nx8CAAAAAOCmcjWANmzY\nUIcPH1ZcXJyuXbumBQsWqFOnTrn5EAAAAAAAN5WrU3A9PT31z3/+Ux06dNDNmzc1ePBgOuACAAAA\nACQ9hHVAn3zySR08eFBHjhzRm2++mdt3j0fcrVu3tGXLFqvLQB4UFxen7777TpJ0+fJlpaSkWFwR\nADhKT093atuj6ubNm5oyZYrVZSAPOnbsmFPb4JxcD6DAw5QvXz69+OKLVpfhFm7evKlXX33V6jLc\nwqeffqoePXpo2LBhkqSTJ0+qa9euFlflmhYtWuTUNkibNm3KsG3z5s0WVOLa0tPTNXfuXL377ruK\njIxUZGSk/va3v1ldlktq3ry5U9seVR4eHvrf//5ndRlu4caNG2rdurXVZbiN7t27Z9jWo0cPCyrJ\nG3J1Ci5ghrZt22rx4sXq3r07y/pkw8PDQ5s2bZLNZmM/3cfHH3+sbdu2qWnTppKkatWq6cyZMxZX\n5ZrGjx+f4UM3s22QRo4cqejoaIdtI0aMyLDtUde5c2f5+fkpNDRUBQoUsLocl5SYmKhTp07p8uXL\n2rlzp/19PSUlRZcvX7a6PJfyxBNPaMSIEerVq5e8vb3t2xs0aGBhVa7H09NT+fLl04ULF+Tn52d1\nOS7rl19+UUxMjC5evKivvvrK4f8esw9yjgAKt/Pvf/9bH3zwgTw8POyDlTtvBnBUr149de7cWT16\n9FChQoUk3d5X3bp1s7gy15I/f37lz5/f/veNGzcI7fdYuXKlvv32WyUkJOjll1+2L6mVmpoqLy8v\ni6tzLVtFcEzwAAAeuElEQVS3btWWLVt09uxZffDBBw776tatWxZX53oSEhK0evVqq8twaWvWrNGs\nWbOUkJCg0aNH27f7+Pho/PjxFlbmeqKjo2UYhsaOHeuw/YcffrCoItfl7e2tkJAQtWvXzh7WDcPQ\n1KlTLa7MdRw6dEjffPONLl68qG+++ca+3cfHRzNmzLCwMvdGAIXbSUtLs7oEt5Genq6iRYtq3bp1\nDtsJoI5atWqld999V5cvX9batWs1ffp0dezY0eqyXEqZMmUUGhqqpUuXKjQ01B6qfH19OefqHteu\nXVNqaqpu3ryp1NRU+3ZfX18tXrzYwspcU/PmzbVnzx7VqVPH6lJcVnh4uMLDw7V48WI9++yzVpfj\n0qKioqwuwW1069ZN3bp1s3/hyoypjDp37qzOnTtry5YtTHfPRYbtzigCcCNLly7Vhg0bZBiGWrVq\nRVjA73Lz5k199tlnWrNmjSSpQ4cOGjJkCB/Embh+/TpHPJ0UFxenoKAgq8tweTVr1tSRI0dUsWJF\n+0wEwzC0Z88eiytzPenp6fryyy8VFxenmzdv2gPDvUf7HmUXLlxQZGSkNmzYIEkKCwvT2LFjVaRI\nEYsrc01Xr17VoUOHJEk1atTg/T0LZ86c0YwZMxQXF6cbN25Iuv0+9d///tfiytwTARRuZ8yYMdq+\nfbv69esnm82m+fPnq2HDhpowYYLVpbmc+Ph4vfzyy/ZmKC1bttRHH32ksmXLWlwZ3NWmTZsUGRmZ\n4UOYboAZHTx4UO+//36GfXXvjIRH3fHjx5XZUITwnlGHDh3s58t6eHjYt989LfdR161bN4WEhCg8\nPFw2m01z5szRnj179NVXX1ldmsuJiopSeHi4KlSoIEk6ceKEZs+erVatWllcmetp1qyZWrZsqdDQ\nUOXLd7uHq2EYmTYnwv0RQOF2QkJCtGvXLvuH782bN1WvXj3t3bvX4spcT9u2bdWvXz/1799fkjR3\n7lzNnTtXa9eutbgy10Kocl716tX14YcfqkGDBg4D4OLFi1tYlWuqU6eOhg8f7rCvDMNQaGioxZW5\nlrffflutWrVS8+bNHZrGIKPatWtr3759Vpfh0urWravdu3ffdxtuN2aaN2+eqlevLun2+Y69e/fW\n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\nGu5dMiMqKoolM/C73P05l56eri+//FKenp567733LKzKtTBGuD/GCLAaTYjgdh577DFJUqlSpbR8\n+XKVKVNGycnJFlflWvr27asnn3xSY8aM0aRJk+znePj4+Njb9wN4uP7xj38oOjo6w5IZBFDk1L1H\n8p544gk1atTIompcE2OE+2OMAKsRQOF23n77bV24cEGTJ0/WyJEjlZKSoilTplhdlkspUqSIihQp\novnz50u6fU5Menq6Ll26pEuXLql8+fIWVwjkfSyZgdx2/vx5+++3bt3Sjh07lJKSYmFFrocxwv0x\nRoDVCKBwKzdv3tShQ4f0zDPPyM/PT1FRUVaX5NKWLVum0aNH69SpUypZsqSOHz+umjVrav/+/VaX\nBuRZLJmBhyU0NNT+u6enpypWrKjPPvvMwopcC2OEB8MYAVahCRHcioeHh+bNm2d1GW7j7bff1tat\nW1WtWjXFxsbq+++/V5MmTawuC8jTUlNTlZaWpsqVK6tLly4yDEOGYahz586qVKmS1eXBjU2aNEm7\nd+9WbGysBgwYIG9vbxUqVMjqslwGY4QHwxgBVqEJEdzOX/7yF12/fl29evWSt7e3fR20Bg0aWF2a\nywkNDdXPP/+sunXraufOnfLw8HBozAAAcB8hISHau3evNm3apLfffluvvvqq/v73v+unn36yujSX\nwRjBeYwRYBWm4MLtREdHyzAMjR071mH7Dz/8YFFFrsvf31+pqalq0aKF+vXrp5IlSzqckwbg4bnT\n/fZurEeI38PDw0OStHz5cg0dOlTPPPOM3nnnHYurci2MEZzHGAFW4QgokIelpaWpYMGCunXrlubO\nnauUlBT169ePLneACVgyA7nt6aefVmBgoNauXavo6GgVKFBATZo00e7du60uDW6IMQKsQgCFW1q+\nfLliYmKUnp5u33bvt50A4GoaNWqk7du3W10G3NSlS5e0atUq1alTR1WrVlViYqL27t2r9u3bW12a\nS2GMALg2puDC7QwbNkxXrlzRunXrNHToUC1atIiT5u9RuHBhGYaR6WWGYdC2HzABS2Ygt3l7e6t7\n9+72v0uXLq3SpUtbWJHrYYxwf4wRYDWOgMLt3GnCcOdE+bS0NP3xj3/Upk2brC4NAOwqVqxo//3O\nkhljx47VE088YWFVQN7GGAFwfSzDArdTsGBBSVKhQoWUkJAgT09PJSUlWVyV69q4caNmzpwpSTp7\n9qxiY2Mtrgh4NLBkBmA+xggPhjECrEAAhdvp2LGjkpOT9dprr6lBgwYKCgpSnz59rC7LJUVERGjS\npEmaMGGCJOnatWvq16+fxVUBj4a///3v8vX11aZNm7Ru3ToNHjxYw4cPt7osIE9jjOA8xgiwClNw\n4dauXr2q9PR0FSlSxOpSXFLdunUVHR2t0NBQRUdHSxJrfAEmqVevnnbt2qUxY8YoJCRE/fr1U/36\n9e3/FwE8XIwRsscYAVahCRHczpUrVzR9+nRt2rRJhmGoRYsWGj58uAoUKGB1aS4nf/78ypfvt4kO\nly5dsrAa4NESGBioP/3pT1q7dq3GjBmj9PR03bp1y+qygDyNMYLzGCPAKkzBhdsZOHCgYmJi9PLL\nL2vEiBHav3+/BgwYYHVZLqlHjx4aNmyYLly4oE8//VRt2rTRkCFDrC4LeCQsXLhQHTp00Jo1a+Tn\n56fk5GTWAAUeMsYIzmOMAKswBRduJzg4WDExMffd9qiz2WyKj4/XgQMHtGbNGklShw4d1K5dO4sr\nAwDg4WCM4BzGCLASU3Dhdho0aKCtW7eqWbNmkqQff/xRoaGhFlflmp566int27ePRcoBAI8ExgjO\nY4wAqxBA4XZ27Nihxx9/XOXKlZNhGDpx4oSqV6+ukJAQGYbByfP/xzAMhYaGatu2bWrcuLHV5QAA\n8NAxRnAOYwRYiSm4cDtxcXHZXh4UFGRKHe6gevXqOnLkiCpUqCBvb29J4gMYAJBnMUZwHmMEWIUA\nCuRhWX0Q8wEMAMCjjTECrEIABQAAAACYgmVYAAAAAACmIIACAAAAAExBAAUAAAAAmIIACgAAAAAw\nBQEUAAAAAGCK/w/0l4GIgfCEZAAAAABJRU5ErkJggg==\n", | |
"text": [ | |
"<matplotlib.figure.Figure at 0x10b923cd0>" | |
] | |
} | |
], | |
"prompt_number": 149 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"# Conclusion:\n", | |
"# Though modulation to the parallel major was very common, the vast majority of the Bach Chorales ended\n", | |
"# in the same key they began in, undermining my hypothesis that modulations would be most common. Perhaps\n", | |
"# if the same analysis was performed on other Bach works or works by another composer we would see \n", | |
"# different results. Furthermore, this analysis method has obvious limitations, and I would suspect that\n", | |
"# many of the pieces which returned to the original key included some sort of modulation part way through\n", | |
"# the work. " | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 148 | |
} | |
], | |
"metadata": {} | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment