Es können zahlreiche Informationen zum Intervallverlauf eines Musikbeispiels durch //music21// bereitgestellt werden. Dazu gehören vor allem der Tonumfang sowie Verlauf der Intervallschritte.
Als Beispiel nehmen wir die Sopran-Stimme aus einem Choral von J.S.Bach:
from music21 import *
b = corpus.parse('bach/bwv66.6')
beispiel = b.parts[0]
beispiel.show()
{{:wiki:interval-histogram-bsp1.png?680|}}
Den Tonumfang oder Ambitus einer Stimme kann mit [[http://web.mit.edu/music21/doc/moduleReference/moduleStream.html#music21.stream.Stream.analyze|music21.stream.analyze]] Modul ermittelt werden:
beispiel.analyze('range')
{{:wiki:interval-histogram-bsp2.png?270|}}
Die Ausgabe erfolgt dabei direkt als die Angabe des Intervalls (Kurzbezeichnung). Optional kann der Tonumfang ebenfalls in Halbtonschritten oder als eine ausgeschriebene Intervallbezeichnung ausgegeben werden:
beispiel.analyze('range').semitones
beispiel.analyze('range').niceName
{{:wiki:interval-histogram-bsp3.png?285|}}
Um den Intervallverlauf anzuzeigen verwendet man das Modul [[http://web.mit.edu/music21/doc/moduleReference/moduleAnalysisDiscrete.html?highlight=melodic#music21.analysis.discrete.MelodicIntervalDiversity|music21.analysis.discrete.MelodicIntervalDiversity]]
intverlauf = analysis.discrete.MelodicIntervalDiversity().countMelodicIntervals(beispiel)
for interval in intverlauf:
print(interval + ":", intverlauf[interval][1])
{{:wiki:interval-histogram-bsp4.png?650|}}
Wie man sieht, werden bei den Ergebnissen nicht die jeweiligen Notenwiederholungen (Unison fehlt komplett als ein Wert) berücksichtigt (sehe T.5, T. 6, T.9 in Notenbeispiel) . Will man die Tonwiederholungen in die Analyse aufnehmen, muss man [[http://web.mit.edu/music21/doc/moduleReference/moduleAnalysisSegmentByRests.html#music21.analysis.segmentByRests.Segmenter.getIntervalList|music21.analysis.segmentByRests.Segmenter.getIntervalList]] Modul verwenden:
intList = analysis.segmentByRests.Segmenter.getIntervalList(beispiel)
[x.name for x in intList]
{{:wiki:interval-histogram-bsp5.png?500|}}
Als Ergebnis bekommen wir die Auflistung aller Intervalle entsprechend ihrer Reihenfolge im untersuchten Beispiel. Diese Liste kann nun mit Python Modul [[https://docs.python.org/3/library/collections.html#collections.Counter|collections.Counter]] geordnet werden:
import collections
values = ['M2', 'M2', 'M2', 'M2', 'm3', 'm3', 'M2', 'M2', 'M3', 'M3', 'M2', 'm3', 'M2', 'm3', 'M2', 'P1', 'P4', 'M2', 'P4', 'M2', 'M2', 'P1', 'M3', 'M2', 'M2', 'M3', 'm2', 'M2', 'M2', 'M2', 'P1', 'P1', 'P1', 'P1', 'm2', 'm2']
counter=collections.Counter(values)
print(counter.most_common())
{{:wiki:interval-histogram-bsp6.png?550|}}
Diese Daten können nun durch ein Histogramm in Matplotlib und NumPy visualisiert werden:
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots()
note = ('P1', 'm2', 'M2', 'm3', 'M3', 'P4', 'd5', 'P5', 'm6', 'M6', 'm7', 'M7')
x_pos = np.arange(len(note))
values = (6, 3, 17, 4, 4, 2, 0, 0, 0, 0, 0, 0)
ax.bar(x_pos, values, align='center',
color='salmon', ecolor='black')
ax.set_xticks(x_pos)
ax.set_xticklabels(note)
ax.set_title('Interval Histogram')
plt.show()
{{:wiki:interval-histogram-bsp7.png?600|}}