Skip to content

Instantly share code, notes, and snippets.

@andrewsanchez
Last active October 24, 2019 00:16
Show Gist options
  • Save andrewsanchez/ba2a468af40fd6f3e39b1a3f452bdb31 to your computer and use it in GitHub Desktop.
Save andrewsanchez/ba2a468af40fd6f3e39b1a3f452bdb31 to your computer and use it in GitHub Desktop.
bach_analysis.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**The BACH motif**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On the motif:\n",
"\n",
">One of the most frequently occurring examples of a musical cryptogram, the motif has been used by countless composers, especially after the Bach Revival in the first half of the 19th century.\n",
"\n",
"\n",
"Use by other composers:\n",
"\n",
">In a comprehensive study published in the catalogue for the 1985 exhibition \"300 Jahre Johann Sebastian Bach\" (\"300 years of Johann Sebastian Bach\") in Stuttgart, Germany, Ulrich Prinz lists 409 works by 330 composers from the 17th to the 20th century using the BACH motif\n",
"\n",
"\n",
"https://en.wikipedia.org/wiki/BACH_motif"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from music21 import *\n",
"\n",
"bach_motif = ['B-', 'A', 'C', 'B']\n",
"bwv309 = corpus.parse('bach/bwv309')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Check if `obj` is a note.Note object.\n",
"\n",
"If so, check that note.Note.name == note_name\n",
"\n",
"Finally, return note.Note.name if both statements are True"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def check_note(obj, note_name):\n",
" \n",
" if type(obj) != note.Note:\n",
" return False\n",
" if obj.name != note_name:\n",
" return False\n",
" return obj.name"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Get successive notes from `stream_object`, inclusive of starting point `index`."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def get_successive_notes(stream_object, index, endpoint):\n",
" \n",
" successive_notes = stream_object[index-1:index+endpoint]\n",
" \n",
" return [n.name for n in successive_notes]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"It appears that this method is limited to finding only those motifs that don't cross a barline."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def find_BACH(score):\n",
" score_parts = score.getElementsByClass('Part')\n",
" for p in score_parts:\n",
" part_measures = p.getElementsByClass('Measure')\n",
" for m in part_measures:\n",
" measure_notes = m.getElementsByClass('Note')\n",
" for n in measure_notes:\n",
" if check_note(n, 'B-'):\n",
" ix = measure_notes.index\n",
" successiveNotes = get_successive_notes(measure_notes, ix, 4)\n",
" if successiveNotes == bach_motif:\n",
" return score.metadata.title, m, successiveNotes"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def find_motif_in_chorales():\n",
" motifs = []\n",
" for chorale in corpus.chorales.Iterator():\n",
" motif = find_BACH(chorale)\n",
" if motif:\n",
" motifs.append(motif)\n",
" \n",
" return motifs"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"motifs = find_motif_in_chorales()"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Found 2 BACH motifs in 406 chorales.\n",
"\n",
"\n",
"The BACH motif can be found in measure 19 of Es stehn vor Gottes Throne.\n",
"The BACH motif can be found in measure 17 of Nun lob, mein Seel, den Herren.\n"
]
}
],
"source": [
"print('Found {} BACH motifs in 406 chorales.'.format(len(motifs)))\n",
"print('\\n')\n",
"\n",
"for motif in motifs:\n",
" number = motif[1].measureNumber\n",
" print('The BACH motif can be found in measure {} of {}.'.format(number, motif[0]))"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Es stehn vor Gottes Throne\n"
]
},
{
"data": {
"image/png": "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\nrkJggg==\n",
"text/plain": [
"<music21.ipython21.objects.IPythonPNGObject at 0x1042f83c8>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(motifs[0][0])\n",
"motifs[0][1].show()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <div id='midiPlayerDiv147884'></div>\n",
" <link rel=\"stylesheet\" href=\"http://artusi.xyz/music21j/css/m21.css\" \n",
" type=\"text/css\" />\n",
" <script>\n",
" require.config({\n",
" paths: {'music21': 'http://artusi.xyz/music21j/src/music21'} \n",
" }); \n",
" require(['music21'], function() { \n",
" mp = new music21.miditools.MidiPlayer();\n",
" mp.addPlayer('#midiPlayerDiv147884'); \n",
" mp.base64Load('data:audio/midi;base64,TVRoZAAAAAYAAQABBABNVHJrAAAAMgD/AwAA4ABAiACQOlqIAIA6AACQOVqEAIA5AACQPFqEAIA8AACQO1qIAIA7AIgA/y8A'); \n",
" });\n",
" </script>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"motifs[0][1].show('midi')"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Nun lob, mein Seel, den Herren\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<music21.ipython21.objects.IPythonPNGObject at 0x10ebef7f0>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"print(motifs[1][0])\n",
"motifs[1][1].show()"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
" <div id='midiPlayerDiv148117'></div>\n",
" <link rel=\"stylesheet\" href=\"http://artusi.xyz/music21j/css/m21.css\" \n",
" type=\"text/css\" />\n",
" <script>\n",
" require.config({\n",
" paths: {'music21': 'http://artusi.xyz/music21j/src/music21'} \n",
" }); \n",
" require(['music21'], function() { \n",
" mp = new music21.miditools.MidiPlayer();\n",
" mp.addPlayer('#midiPlayerDiv148117'); \n",
" mp.base64Load('data:audio/midi;base64,TVRoZAAAAAYAAQABBABNVHJrAAAATQD/AwAA4ABAiACQQFqEAIBAAACQPlqEAIA+AACQPFqEAIA8AACQOlqEAIA6AACQOVqIAIA5AACQPFqEAIA8AACQO1qEAIA7AIgA/y8A'); \n",
" });\n",
" </script>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"motifs[1][1].show('midi')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Here is an attempt to rewrite the function to find motifs across barlines by utilizing `.flat`\n",
"\n",
"Instead, it finds nothing :("
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def find_all_motifs(chorale):\n",
" for part in chorale.parts:\n",
" for n in part.flat.notes:\n",
" if check_note(n, 'B-'):\n",
"# ix = part.flat.index(n)\n",
" ix = part.flat.notes.index\n",
" try:\n",
" successiveNotes = get_successive_notes(part.flat.notes, ix, 4)\n",
" if successiveNotes == bach_motif:\n",
" print(successiveNotes)\n",
" except AttributeError:\n",
" continue\n",
" \n",
"\n",
"find_all_motifs(bwv309)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [default]",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment