Signalanalyse und Music Information Retrieval (MIR) Seit ca. 2000 lassen sich dank Signalanalyse-Techniken klangliche Eigenschaften wie Helligkeit oder Rauhigkeit direkt aus Wavedateien auslesen. Gängige Toolboxen oder Libraries sind hier z.B.
Essentia (Python) Diese Libraries sind sehr nützlich, wenn es um die Suche nach klanglicher Ähnlichkeit von Musik, Klängen oder Stimmen geht, um Musik-Empfehlungssysteme, automatische Genre-Klassifikationen und um viele andere klang-/musikbezogene Aufgaben.
Typische Timbre Features / Deskriptoren:
Matlab mit MIR-Toolbox MatLab Matrizen-Labor, für Datenanalyse/Auswertung und Simulation, meist auf der Grundlage von Matrizen. Für Audio-Dateien
MIRtoolbox
Toolbox für Music Information Retrieval = Musikalische Merkmale aus Klangdateien extrahieren und miteinander vergleichen.
Dateien einladen via miraudio(): miraudio('klangdatei')
miraudio('klangdatei',
'Sampling', 11025) miraudio('klangdatei',
'Channel', 1) miraudio('klangdatei',
'Trim') miraudio('klangdatei',
'Extract', 2,3,'s','Start') miraudio('Folder') miraudio('Folders') klangvariable = miraudio('klangdatei')
Spektrum darstellen mit mirspectrum (): mirspectrum('klangdatei')
oder mirspectrum(klangvariable)
mirspectrum('klangdatei','Min',
50, 'Max', 5000)
mirspectrum('klangdatei','Frame','Min',
50, 'Max', 5000)
mirspectrum('klangdatei','Frame','Min',
50, 'Max', 5000, 'Normal') mirspectrum('klangdatei','Min',
50, 'Max', 5000, 'Normal', 'dB') mirspectrum('klangdatei','Min',
50, 'Max', 5000, 'Frame', 'Mel')
mirspectrum('klangdatei','Min',
50, 'Max', 5000, 'Frame', 'Cents')
Spitzen im Spektrum (oder in anderen Kurven) finden via Peak Picking Mit mirpeaks() lassen sich Spitzenwerte im Spektrum finden (im Spektrum als rote Kreise angezeigt und im Sonagramm als weisse oder schwarze Kreuze). Über 'Contrast' und 'Treshold' kann die Genauigkeit der Ergebnisse bestimmt werden: a=mirspectrum('klangdatei','Frame','Min', 50, 'Max', 5000) ; mirpeaks(a,'Contrast',0.5,'Threshold',0.2)
Über den Zusatz 'Only' werden nur die Peaks dargestellt. mit 'Track' (und einer Zeit (in ms) dahinter, z.B. 'Track', 25) lassen sich die Peaks in Sonagrammen tracken.
Hüllkurve darstellen mit mirenvelope Mit mirenvelope() kann die Amplitudenhüllkurve eines Klangsignals dargestellt werden: mirenvelope('klangdatei')
Bandpassfiltern mit mirfilterbank Mit mirfilterbank() kann man den Klang spektral in einzelne Frequenzabschnitte unterteilen. Dies kann zum einen in der Standardeinstellung als gammatone-Filterbank geschehen: mirfilterbank('klangdatei')
Zum anderen kann dies auch mit spezifischen Einstellungen geschehen, wie z.B. abgestimmt auf die im Klang vorkommenden Grundfrequenzen, z.B. auf harmonische Klänge mit einem Grundton von 75 Hz: mirfilterbank('klangdatei', 'Manual', [-Inf, 75, 150, 225, 300, 375, 450, 525, 600, 675, 750, 825, 900, Inf]) Mit 'Manual' wird gesagt, dass die Filterbänder manuell eingestellt werden und in den eckigen Klammern (Zeilenvektor) dahinter werden die einzelnen Mittenfrequenzen eingegeben (wobei -Inf am Anfang ein Tiefpassfilter und Inf am Ende ein Hochpassfilter bedeutet)
Von diesen einzelnen Kanälen lassen sich über mirenvelope() ebenfalls die Amplitudenhüllkurven ermitteln: a=mirfilterbank('klangdatei', 'Manual', [-Inf, 75, 150, 225, 300, 375, 450, 525, 600, 675, 750, 825, 900, Inf]);mirenvelope(a)
Diese Hüllkurven lassen sich (auch nach einer Bearbeitung/Veränderung) über mirsum() wieder zu einer Gesamthüllkurve zusammenfassen: a=mirfilterbank('klangdatei', 'Manual', [-Inf, 75, 150, 225, 300, 375, 450, 525, 600, 675, 750, 825, 900, Inf]);b=mirenvelope(a);mirsum(b)
Tonhöhe ermitteln mit mirpitch Über mirpitch() kann die Grundtonhöhe eines Klanges bestimmt werden: mirpitch('klangdatei') bei einer eindeutigen Tonhöhe erhält man eine Meldung wie The Pitch related to file bassklarinette is 75.364 Hz bei mehrdeutigen Tonhöhen bekommt man eine Grafik ausgegeben:
Wenn sich die Tonhöhen in der Zeit ändern sollte man deswegen am besten das Attribut 'Frame' hinzufügen: mirpitch('klangdatei', 'Frame')
Über a=mirpitch('klangdatei','Frame'); mirplay(a) kann man den Verlauf auch hörbar machen.
Dynamik ermitteln mit mirrms Über mirrms() lässt sich die Quadratwurzel der Gesamtenergie eines Signals angeben. mirrms('klangdatei') Man erhält als Antwort den Gesamtenergiewert (bezogen auf 1) The RMS energy related to file bassklarinette is 0.25645 Wenn man den Energieverlauf über die Zeit wissen will, kann man auch mit 'Frame' für alle 50 ms einen Quadratwurzelwert sich wiedergeben lassen: mirrms('klangdatei','Frame')
Spektralen Schwerpunkt ermitteln mit mircentroid Über mircentroid() kann der Spectral Centroid eines Klanges bestimmt werden: mircentroid('klangdatei') man erhält als Ergebnis eine Antwort wie: The Spectral centroid related to file bassklarinette is 1519.6112 Hz Wenn man den Verlauf des Spectral Centroids über die Zeit wissen will, kann man auch sich mit 'Frame' für alle 50 ms den dazugehörenden Wert wiedergeben lassen: mircentroid('klangdatei','Frame')
Über a=mircentroid('klangdatei','Frame'); mirplay(a) kann man den Verlauf auch hörbar machen.
Spektrale Schwankungen (Spectral Flux) ermitteln mit mirflux Über mirflux() kann der Spectral Flux eines Klanges bestimmt werden: mirflux('klangdatei') man erhält als Ergebnis den Fluktuationsverlauf des Klangbeispiels
Helligkeit ermitteln mit mirbrightness Über mirbrightness() kann die Helligkeit eines Klanges bestimmt werden: mirbrightness('klangdatei') man erhält als Ergebnis eine Antwort wie: The Brightness related to file bassklarinette is 0.36146 Wenn man den Verlauf der Helligkeit über die Zeit wissen will, kann man auch sich mit 'Frame' für alle 50 ms den dazugehörenden Wert wiedergeben lassen: mirbrightness('klangdatei','Frame')
Inharmonizität ermitteln mit mirinharmonicity Über mirinharmonicity() kann die Inharmonizität eines Klanges bestimmt werden: mirinharmonicity('klangdatei') man erhält als Ergebnis eine Antwort wie: The Inharmonicity related to file bassklarinette is 0.50307 Wenn man den Verlauf der Inharmonizität über die Zeit wissen will, kann man auch sich mit 'Frame' für alle 50 ms den dazugehörenden Wert wiedergeben lassen: mirinharmonicity('klangdatei','Frame')
Rauhigkeit ermitteln mit mirroughness Über mirroughness() kann die Rauhigkeit eines Klanges bestimmt werden: mirroughness('klangdatei') man erhält als Ergebnis den Rauhigkeitsverlauf des Klangs
Tempo ermitteln mit mirtempo Mit mirtempo() kann das Tempo eines Musikstücks bestimmt werden: mirtempo('klangdatei') man erhält als Ergebnis eine Antwort wie: The Tempo related to file bassklarinette is 57.8013 bpm Wenn man den Tempoverlauf über die Zeit wissen will, kann man auch sich mit 'Frame' für alle 50 ms den dazugehörenden Wert wiedergeben lassen: mirtempo('klangdatei','Frame')
Tonart ermitteln mit mirtkey Mit mirkey() kann die Tonart eines Musikstücks bestimmt werden: mirkey('klangdatei') man erhält als Ergebnis eine Antwort wie: The Key related to file bassklarinette is C min Da die Tonartbestimmung je nach Klangdatei ähnlich unsicher ist wie die Tempobestimmung kann mit mirkeystrength() die Wahrscheinlichkeit einer bestimmten Tonart für das Stück angezeigt werden: mirkeystrength('klangdatei')
Chromagramm ermitteln mit mirchromagram Über mirchromagram() kann die Verteilung der Tonhöhen über Pitch Classes ermittelt werden: mirchromagram('klangdatei') man erhält als Ergebnis eine Grafik mit allen Pitch Classes (bei einer Tonleiter ist es schwierig, da gleich alle Pitch Classes mehr oder weniger gleich abgedeckt werden):
Wenn man den Verlauf der Pitch Classes über die Zeit wissen will, kann man auch sich mit 'Frame' für alle 50 ms den dazugehörenden Wert wiedergeben lassen: mirchromagram('klangdatei','Frame')
mit dem Zusatz 'Wrap', 'no' kann man sich auch den Verlauf der Tonhöhen über die Zeit wiedergeben lassen: mirchromagram('klangdatei','Frame', 'Wrap', 'no')
Dur / Moll erkennen mit mirmode Über mirmode() kann ermittelt werden, ob das Stück eher in Dur oder Moll steht: mirmode('klangdatei') man erhält als Ergebnis eine Antwort wie: The Mode related to file bassklarinette is -0.015308 Je näher der Wert an +1 ist, desto eher entspricht es einer Durtonart und je mehr der Wert an -1 ist, desto mehr entspricht es einer Molltonart Wenn man den Verlauf der Dur-Moll-Wahrscheinlichkeit über die Zeit wissen will, kann man auch sich mit 'Frame' für alle 50 ms den dazugehörenden Wert wiedergeben lassen: mirmode('klangdatei','Frame')
Toneinsätze erkennen mit mironsets Über mironsets() können die Einsatzzeitpunkte der einzelnen Töne ermittelt werden, mit dem Zusatz 'Attacks' werden die Einschwingsteigungen gleich mit angegeben: mironsets('klangdatei','Attacks') man erhält als Ergebnis den Verlauf der Einsatzzeiten im Stück
Mit Hilfe von mirsegment() kann man entlang der Onset-Zeiten das Klangbeispiel in einzelne Segmente unterteilen: a = mironsets('bassklarinette',
'Attacks')
Audioausgabe nach bestimmten Kriterien Mit mirplay('klangdatei') lässt sich eine Klangdatei direkt abspielen (ebenfalls eine damit verbundene Variable mit mirplay('variable')). Mit dem Zusatz 'Extract', Anfangszeit (sek), Endzeit (sek) kann man auch einen beliebigen Ausschnitt (z.B. von der 3. bis zu 5. Sekunde) aus der Klangdatei spielen: mirplay('klangdatei', 'Extract', 3,5) Es gibt auch einen MIR-Toolbox-eigenen Player, den man über mirplayer(variable) starten kann, z.B.: a = mirbrightness('klangdatei',
'Frame') Wenn man das Abspielen von Klangdateien auf einen ganzen Ordner bezieht, so kann man die Reihenfolge des Abspielens auch nach klanglichen Aspekten ordnen, wie z.B. nach dem Kriterium von ansteigender Helligkeit: mirplay('Folder', 'Increasing', mirbrightness('Folder'))
Werte außerhalb der MIR-Toolbox weiterverwenden mit mirgetdata mit mirgetdata() kann man die Informationen aus MIR-Objekten (z.B. mirfilterbank(x)) als Array in Matlab ablegen und dort weiterverarbeiten (d.h., die Werte werden von ihren Einheiten/Bedeutungen gelöst und liegen als reine Zahlenwerte vor, mit denen man dann weiterrechnen kann): einzelne_filterbaender
= mirfilterbank('klangdatei');
Anwendungsbeispiele:
Vocoder-Script in der Datei "vocoder.m" folgendes Script schreiben: function output = vocoder(c, f) % Synthese-
(carrier) und Analyse-Signal (formant) als miraudio-Objekte
% Analysesignal
einlesen % dies
kann manuell geschehen oder auf der Grundlage der % manuell: % mit
Voreinstellungen der mirfilterbank: % Analysesignal
in Filterbereiche aufteilen % Anzahl
der Frequenzbänder zwischenspeichern % Bestimmen
der Hüllkurven der Bänder des Analysesignals % Gegebenenfalls
verlaengern des Traegersignals, falls es zu kurz ist %
Frequenzbänder des Synthesesignals (cBandsData) mit Kanalhüllkurven
und das Script über die Konsole in Matlab starten: output_signal = vocoder('carrier.wav', 'formant.wav') Wenn man als Synthesesignal (carrier) einen Sägezahn-Sweep nimmt und als Analysesignal (formant) ein Sprachbeispiel, dann zeigt sich insgesamt folgendes Ergebnis:
Überprüfung
der heute gängigen Timbre-Space-Modelle Versuchspersonen beurteilten die Ähnlichkeit von Instrumentalklangfarben (alle auf gleicher Tonhöhe, im Falle von Grey 1975: alle auf es' und resynthetisiert mit Line-Segment-Approximation) Eine mehrdimensionale Skalierung der Klangbeurteilungen im Vergleich mit den physikalischen Eigenschaften der Klänge resultierte in einem 3-dimensionalen timbre space mit 3 Achsen:
Je
nach Studie nehmen die gleichen „Instrumente” völlig
unterschiedliche
ab
2014: Siddiq, Saleh; Reuter, Christoph; Czedik-Eysenberg, Isabella: Kein
Raum für Klangfarben Timbre Spaces im Vergleich.
Ermittlung von Klangbeschreibungsmerkmalen (Timbre descriptors)
|