Skip to content

Instantly share code, notes, and snippets.

@owengc
Created January 25, 2014 04:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save owengc/75068e105523d0773e33 to your computer and use it in GitHub Desktop.
Save owengc/75068e105523d0773e33 to your computer and use it in GitHub Desktop.
Owen Campbell - MAT 240E Homework2
{
"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+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\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