MIDI

Following Section 1.2.1 of [Müller, FMP, Springer 2015], we look in this notebook at a symbolic music representation called MIDI.

In [1]:
import os

import matplotlib
from matplotlib import pyplot as plt
import pretty_midi
import pandas as pd
import IPython.display as ipd
In [2]:
fn = 'FMP_C1_F10_Beethoven_Fifth-MM1-20_MIDI-Orchestra.mid'

Processing and Visualization with pretty_midi

In [3]:
# generating a table of all notes

midi_data = pretty_midi.PrettyMIDI(fn)
midi_list = []

for instrument in midi_data.instruments:
    instrument_name = instrument.name
    for note in instrument.notes:
        start = note.start
        end = note.end
        pitch = note.pitch
        velocity = note.velocity
        midi_list.append([start, end, pitch, velocity, instrument_name])
        
midi_list = sorted(midi_list, key=lambda x: x[0])

df = pd.DataFrame(midi_list, columns=['Start', 'End', 'Pitch', 'Velocity', 'Instrument'])
html = df.to_html(index=False, float_format='%.2f')
ipd.HTML(html)
Out[3]:
Start End Pitch Velocity Instrument
0.17 0.33 67 113 Klarinette in B
0.17 0.33 67 113 Violine I
0.17 0.33 67 113 Violine II
0.17 0.33 55 113 Viola
0.17 0.33 43 113 Violoncello
0.17 0.33 43 113 Kontrabass
0.33 0.50 67 113 Klarinette in B
0.33 0.50 67 113 Violine I
0.33 0.50 67 113 Violine II
0.33 0.50 55 113 Viola
0.33 0.50 43 113 Violoncello
0.33 0.50 43 113 Kontrabass
0.50 0.67 67 113 Klarinette in B
0.50 0.67 67 113 Violine I
0.50 0.67 67 113 Violine II
0.50 0.67 55 113 Viola
0.50 0.67 43 113 Violoncello
0.50 0.67 43 113 Kontrabass
0.67 1.67 63 110 Klarinette in B
0.67 1.67 63 110 Violine I
0.67 1.67 63 110 Violine II
0.67 1.67 51 111 Viola
0.67 1.67 39 115 Violoncello
0.67 1.67 39 115 Kontrabass
1.83 2.00 65 112 Klarinette in B
1.83 2.00 65 112 Violine I
1.83 2.00 65 112 Violine II
1.83 2.00 53 112 Viola
1.83 2.00 41 113 Violoncello
1.83 2.00 41 113 Kontrabass
2.00 2.17 65 112 Klarinette in B
2.00 2.17 65 112 Violine I
2.00 2.17 65 112 Violine II
2.00 2.17 53 112 Viola
2.00 2.17 41 113 Violoncello
2.00 2.17 41 113 Kontrabass
2.17 2.33 65 113 Klarinette in B
2.17 2.33 65 113 Violine I
2.17 2.33 65 113 Violine II
2.17 2.33 53 113 Viola
2.17 2.33 41 113 Violoncello
2.17 2.33 41 113 Kontrabass
2.33 4.00 62 110 Klarinette in B
2.33 4.00 62 110 Violine I
2.33 4.00 62 110 Violine II
2.33 4.00 50 112 Viola
2.33 4.00 38 115 Violoncello
2.33 4.00 38 115 Kontrabass
4.17 4.33 67 62 Violine II
4.33 4.50 67 61 Violine II
4.50 4.67 67 61 Violine II
4.67 7.33 60 65 Fagott
4.67 6.83 63 59 Violine II
4.67 7.33 60 65 Violoncello
4.83 5.00 68 61 Viola
5.00 5.17 68 61 Viola
5.17 5.33 68 61 Viola
5.33 7.00 67 63 Viola
5.50 5.67 75 61 Violine I
5.67 5.83 75 61 Violine I
5.83 6.00 75 61 Violine I
6.00 7.00 72 60 Violine I
6.83 7.00 67 61 Violine II
7.00 7.17 67 61 Violine II
7.17 7.33 67 61 Violine II
7.33 10.00 59 65 Fagott
7.33 8.67 62 58 Violine II
7.33 10.00 59 65 Violoncello
7.50 7.67 68 61 Viola
7.67 7.83 68 61 Viola
7.83 8.00 68 61 Viola
8.00 8.67 67 63 Viola
8.17 8.33 77 61 Violine I
8.33 8.50 77 61 Violine I
8.50 8.67 77 61 Violine I
8.67 9.50 74 60 Violine I
8.67 10.17 67 66 Violine II
8.67 10.00 62 58 Viola
9.50 9.67 79 64 Violine I
9.67 9.83 79 63 Violine I
9.83 10.00 77 60 Violine I
10.00 10.67 60 65 Fagott
10.00 10.68 75 60 Violine I
10.00 10.17 63 64 Viola
10.00 10.67 60 65 Violoncello
10.17 10.33 63 60 Violine II
10.17 10.33 63 61 Viola
10.33 10.50 63 61 Violine II
10.33 10.50 63 61 Viola
10.50 10.67 65 63 Violine II
10.50 10.67 65 64 Viola
10.67 11.33 59 64 Fagott
10.67 10.82 74 61 Violine I
10.67 11.50 67 69 Violine II
10.67 11.50 67 71 Viola
10.67 11.33 59 64 Violoncello
10.83 11.00 79 65 Violine I
11.00 11.17 79 65 Violine I
11.17 11.33 77 60 Violine I
11.33 12.00 60 65 Fagott
11.33 12.01 75 59 Violine I
11.33 12.00 60 65 Violoncello
11.50 11.67 63 59 Violine II
11.50 11.67 63 59 Viola
11.67 11.83 63 60 Violine II
11.67 11.83 63 60 Viola
11.83 12.00 65 63 Violine II
11.83 12.00 65 63 Viola
12.00 12.17 59 64 Fagott
12.00 12.16 74 61 Violine I
12.00 12.17 67 70 Violine II
12.00 12.50 67 70 Viola
12.00 12.17 59 64 Violoncello
12.17 12.33 86 61 Flöte
12.17 12.33 91 61 Flöte
12.17 12.33 74 61 Oboe
12.17 12.33 79 61 Oboe
12.17 12.33 55 113 Klarinette in B
12.17 12.33 59 113 Klarinette in B
12.17 12.33 59 61 Fagott
12.17 12.33 67 61 Horn in Es
12.17 12.33 55 61 Trompete in C
12.17 12.33 67 61 Trompete in C
12.17 12.33 43 61 Pauken
12.17 12.33 79 66 Violine I
12.17 12.33 74 70 Violine II
12.17 12.33 59 61 Violoncello
12.17 12.33 35 61 Kontrabass
12.33 12.50 86 61 Flöte
12.33 12.50 91 61 Flöte
12.33 12.50 74 61 Oboe
12.33 12.50 79 61 Oboe
12.33 12.50 59 116 Klarinette in B
12.33 12.50 62 116 Klarinette in B
12.33 12.50 59 61 Fagott
12.33 12.50 67 61 Horn in Es
12.33 12.50 55 61 Trompete in C
12.33 12.50 67 61 Trompete in C
12.33 12.50 43 61 Pauken
12.33 12.50 79 65 Violine I
12.33 12.50 74 70 Violine II
12.33 12.50 59 61 Violoncello
12.33 12.50 35 61 Kontrabass
12.50 12.67 86 59 Flöte
12.50 12.67 89 59 Flöte
12.50 12.67 74 59 Oboe
12.50 12.67 77 59 Oboe
12.50 12.67 62 124 Klarinette in B
12.50 12.67 67 124 Klarinette in B
12.50 12.67 59 61 Fagott
12.50 12.67 67 61 Horn in Es
12.50 12.67 55 61 Trompete in C
12.50 12.67 67 61 Trompete in C
12.50 12.67 43 61 Pauken
12.50 12.67 77 60 Violine I
12.50 12.67 67 58 Violine II
12.50 12.67 62 61 Viola
12.50 12.67 59 61 Violoncello
12.50 12.67 35 61 Kontrabass
12.67 13.00 84 96 Flöte
12.67 13.00 87 96 Flöte
12.67 13.00 72 96 Oboe
12.67 13.00 75 96 Oboe
12.67 13.00 63 113 Klarinette in B
12.67 13.00 67 113 Klarinette in B
12.67 13.00 60 107 Fagott
12.67 13.00 67 104 Horn in Es
12.67 13.00 60 114 Trompete in C
12.67 13.00 72 114 Trompete in C
12.67 13.00 48 112 Pauken
12.67 13.00 75 95 Violine I
12.67 13.00 60 119 Violine II
12.67 13.00 67 119 Violine II
12.67 13.00 75 119 Violine II
12.67 13.00 63 104 Viola
12.67 13.00 60 107 Violoncello
12.67 13.00 36 105 Kontrabass
13.33 13.67 84 94 Flöte
13.33 13.67 72 105 Oboe
13.33 13.67 78 105 Oboe
13.33 13.67 60 107 Klarinette in B
13.33 13.67 66 107 Klarinette in B
13.33 13.67 44 91 Fagott
13.33 13.67 51 96 Horn in Es
13.33 13.67 63 96 Horn in Es
13.33 13.67 60 110 Trompete in C
13.33 13.67 72 110 Trompete in C
13.33 13.67 48 108 Pauken
13.33 13.67 56 93 Violine I
13.33 13.67 66 93 Violine I
13.33 13.67 72 93 Violine I
13.33 13.67 56 109 Violine II
13.33 13.67 66 109 Violine II
13.33 13.67 72 109 Violine II
13.33 13.67 56 91 Viola
13.33 13.67 44 91 Violoncello
13.33 13.67 32 101 Kontrabass
14.00 14.33 83 109 Flöte
14.00 14.33 91 109 Flöte
14.00 14.33 71 106 Oboe
14.00 14.33 79 106 Oboe
14.00 14.33 59 99 Klarinette in B
14.00 14.33 62 99 Klarinette in B
14.00 14.33 43 98 Fagott
14.00 14.33 55 106 Horn in Es
14.00 14.33 67 106 Horn in Es
14.00 14.33 55 99 Trompete in C
14.00 14.33 67 99 Trompete in C
14.00 14.33 43 102 Pauken
14.00 14.33 55 104 Violine I
14.00 14.33 62 104 Violine I
14.00 14.33 71 104 Violine I
14.00 14.83 79 110 Violine I
14.00 14.33 55 103 Violine II
14.00 14.33 62 103 Violine II
14.00 14.33 71 103 Violine II
14.00 14.33 55 97 Viola
14.00 14.33 43 98 Violoncello
14.00 14.33 31 102 Kontrabass
In [4]:
#synthesizing the MIDI data

fs = 22050
audio_data = midi_data.synthesize(fs=fs)
ipd.Audio(audio_data, rate=fs)
Out[4]:
In [5]:
# plotting with velocity as "color"

plt.figure(figsize=(15, 10))
ax = plt.gca()

starts = []
ends = []
pitches = []

for instrument in midi_data.instruments:
    instrument_name = instrument.name
    for note in instrument.notes:
        start = note.start
        end = note.end
        pitch = note.pitch
        velocity = note.velocity

        rect = matplotlib.patches.Rectangle((start, pitch - 0.5), end-start, 1, linewidth=1,
                                            edgecolor='k', facecolor=str(velocity / 128), alpha=0.5)
        ax.add_patch(rect)
        
        starts.append(start)
        ends.append(end)
        pitches.append(pitch)
        
plt.ylim([min(pitches)-0.5, max(pitches) + 0.5])
plt.xlim([min(min(starts), 0), max(ends)])
plt.xlabel('Time (seconds)')
plt.ylabel('Frequency (pitch)')
plt.grid()
ax.set_axisbelow(True)
In [6]:
# plotting with instrument as "color"

instruments = sorted(set(instrument.name for instrument in midi_data.instruments))

cm = plt.get_cmap('gist_rainbow')
instrument_colors = [cm(i/len(instruments)) for i in range(len(instruments))]

plt.figure(figsize=(15, 10))
ax = plt.gca()

starts = []
ends = []
pitches = []

for instrument in midi_data.instruments:
    instrument_name = instrument.name
    instrument_color = instrument_colors[instruments.index(instrument_name)]
    for note in instrument.notes:
        start = note.start
        end = note.end
        pitch = note.pitch
        velocity = note.velocity

        rect = matplotlib.patches.Rectangle((start, pitch - 0.5), end-start, 1, linewidth=1,
                                            edgecolor='k', facecolor=instrument_color, alpha=0.5)
        ax.add_patch(rect)
        
        starts.append(start)
        ends.append(end)
        pitches.append(pitch)
        
plt.ylim([min(pitches)-0.5, max(pitches) + 0.5])
plt.xlim([min(min(starts), 0), max(ends)])
plt.xlabel('Time (seconds)')
plt.ylabel('Frequency (pitch)')
plt.grid()
ax.set_axisbelow(True)

ax.legend([matplotlib.patches.Patch(linewidth=1, edgecolor='k', facecolor=c, alpha=0.5) for c in instrument_colors],
          instruments)
Out[6]:
<matplotlib.legend.Legend at 0x7f85ad61d6a0>

Acknowledgment: This notebook was created by Frank Zalkow and Meinard Müller.