ELECTRIC OPRPHEUS ACADEMY
SPILLING THE BEANS #15 PEAKS
Eine der einfachsten Methoden Wellenformen zu analysieren, ist die Peak-Analyse.
Als 'peak' gilt jeder Punkt im Verlauf der Welle, dessen Amplitude grösser
ist, als die Amplituden seiner Nachbarpunkte. (Die Mathematiker würden
so ein peak als 'lokales Maximum' bezeichnen).
Digital stellt sich die Aufgabe noch einfacher: Jedes sample, dessen Amplitude
(Absolutwert, egal ob positiv oder negativ) grösser ist, als die
Amplituden seiner benachbarten samples.
Bei 'normaler' Musik sind das relativ viele. Ungefähr 1-5% aller
samples sind peaks in diesem
(50 samples pro Gitterstrich, lineare Amplitude)
Die so gewonnenen peaks können nun weiter ausgedünnt werden.
sozusagen peaks von peaks. Mit jedem Durchgang werden es weniger. Nach
9 bis 10 Durchgängen ist üblicherweise ein Zustand erreicht,
in dem nur mehr ein einziges peak übrigbleibt: das eine sample mit
der grössten Amplitude.
An einem kurzen Beispiel. Hier das Original (Kapelle Frank, aufgenommen
1978):
frank_peaks0.mp3
Dieser Ausschnitt von 8.1 Sekunden besteht aus 358090 samples.
Davon sind ungefähr 4% peaks, nämlich 13881:
frank_peaks1.mp3
Obwohl hier durchschnittlich 24 von 25 samples nullgesetzt sind, erkennt
man noch deutlich den Duktus des Originals. Diese peaks kann man jetzt,
wie oben beschrieben, weiter ausdünnen. Hier die Ergebnisse nach
5 und nach 7 Durchgängen
(man muss vielleicht etwas lauter drehen um die Nadelimpulse zu hören):
frank_peaks5.mp3
(120 peaks)
frank_peaks7.mp3
(15 verbleibende peaks)
Das Verfahren ist alles andere als raffiniert. Dennoch sind solche Daten
bereits wertvoll für automatisierte Bearbeitung und Sequenzersteuerung.
Ein einfaches rhythmisches Muster, aus dem Wellenverlauf abgeleitet und
auf jedes beliebige Material anwendbar. In VASP können die peaks-Daten
auch in Listen (structures) geschrieben werden und als Parameter im AMP-Sequencer
eingesetzt werden. Sie stehen auch für granulare Prozesse zur Verfügung.
Das hat den Vorteil, das die unvermeidliche granulare Zerstückelung
sozusagen anatomisch angelegt ist. (Die grains in VASP können verschieden
gross sein und müssen nicht symmetrisch sein). Hier eine einfache
Operation, die mit der Struktur von peaks5 arbeitet:
frank_grainstretch.mp3
Die grains bleiben auf ihrem Platz, werden gedehnt, 12.5% länger
und entsprechend langsamer. Die einfachste Form eines downpitchings um
einen Ganzton. (VASP-script dazu siehe unten).
Bevor wir uns nun Gedanken darüber machen, wie wir die Methode verbessern
können, sollten wir uns allerdings überlegen, was wir davon
erwarten. Es hängt auch sehr von dem vorgegebenen stilistischen Rahmen
ab. Wäre unsere Testaufnahme nicht eine Blasmusik aus dem ländlichen
mitteleuropäischen Raum, sondern beispielsweise eine Jazzband, dann
sollten wir die Punkte, die wir als rhythmisch markant empfinden, nicht
dort suchen, wo Amplitudenspitzen sind, sondern eher dort, wo die Amplituden
am schnellsten ansteigen.
peaks 7 (aspect=rvel+) "radius velocity, aber nur positiv
Etwas natürlichen Swing hatte die, aus Laien (Handwerkern und Bauern)
zusammengewürfelte, Musikkapelle zweifellos doch:
frank_peaks7_rvel.mp3
Selbstvertändlich ist das keine 'musikalische' Analyse. Es ist bloss
eine Methode, wie man aus einer vorgegebenen Wellenform einigermassen
sinnvolle strukturelle Daten gewinnen kann - oder auch seltsame, die mit
dem, was wir darin musikalisch hören, auf den ersten Blick gar nicht
viel zu tun haben.
Mir geht es hier um Materialanalyse, und das ist grundsätzlich etwas
anderes als musikalische Analyse. Dennoch werden wir bei Gelegenheit darauf
zu sprechen kommen.
* * *
Auch im Spektrum lässt sich peaks-Analyse durchführen. Und auch
hier ist das keine musikalische Analyse: Die peaks repräsentieren
nicht Tonhöhen, sondern Frequenzen. Es kann sein, dass ein leiser
Grundton eines Instrumentes nicht aufscheint, während markante Obertöne
in der Struktur enthalten sind. Wir wissen vorerst auch nicht: handelt
es sich um nur kurzeitig auftretende Frequenzen (Transienten), oder um
dauerhafte, die Tonhöhe und Klangfarbe bestimmen.
Zuvor sollte man jedoch etwas anderes beachten: Statistisch gesehen, sind
solche peaks auch im Spektrum linear verteilt. Das heisst, fast die Hälfte
davon wird über 10kHz liegen. Hier die spektrale peak-Analyse des
vorigen Beispiels:
117 peaks, linear verteilt. Die tiefste Frequenz ist 105.8Hz, die nächste
bereits 617.4Hz, dann 1248.9Hz - und ab da werden die Intervalle immer
enger.
Ganz klar, dass das keine zufriedenstellende Lösung ist, denn die
tongebenden Frequenzen sind da gar nicht drinnen. (Die 105.8hz stammen
offensichtlich von der grossen Trommel).
Hier die peaks zurücktransformiert:
FFT; xpeaks 5; FFT-
frank_specpeaks_lin.mp3und das Umfeld um die 105.8hz durch ein steiles Bandpassfilter isoliert:
BP12 95hz,115hz
frank_105hz_isol.mp3
Es empfiehlt sich eine andere Methode: Man analysiert nicht die peaks
der Wellenform (im Spektrum) selber, sondern ihrer Hüllkurve. In
VASP kann man Hüllkurven erstellen, die die Spitzen der Wellenformen
exakt tangieren. So eine Hüllkurve basiert auf einem speziellen bidirektionalen
Lowpassfilter, das noch dazu den Vorteil hat, dass seine cutoff-Frequenz
kontinuierlich variiert werden kann.
[Damit kein Knopf im Hirn entsteht bei die Vorstellung, wie man eine
Routine, die 'Filtern' heisst in einer Ebene anwendet, die 'Spektrum'
heisst (>> Spilling the Beans #9 'Dellenhammer und Beulenhammer'),
nenne ich solche Filterungen im Spektrum nicht 'filter', sondern 'mollify'
(weichmachen, abrunden, glätten).]
Diese Glättung lässt sich der logarithmischen Charakteristik
des Spektrums anpassen:
$xmpeaks.log 2,50hz "die 50hz gelten als cutoff Mittelwert für das mollify-Filter - nicht verwirren lassen !"
Jetzt haben wir hundert peaks, logarithmisch verteilt. Zwischen den ersten zwei Frequenzen der vorigen Analyse liegen 14 weitere!
Die peaks wiederum rücktransformiert:
frank_specpeaks_log.mp3
Bei grossen Buffern, so über 512k samples, ist diese Verteilung ideal. Bei kleineren buffern (vor allem auch granular) werden die Frequenzbänder in den Tiefen - linear gesehen - zu eng. Da empfehlt sich eine mittlere Charakteristik (medium) zwischen linear und logarithmisch:
$xmpeaks.med 2,30hz
Dabei sind auch tiefe Frequenzen ganz gut repräsentiert, aber die
Unterschiede der linearen Abstände sind nicht so krass. Insgesamt
105 peaks, hier wieder in der Zeitebene:
frank_specpeaks_med.mp3
Anmerkung:
Die Rücktransformation von isolierten spektralen samples ergibt in
der Zeitebene einen Sinusakkord, einen 'Strahlklang', wie das Stockhausen
so schön nannte. (Jedes isolierte sample in einer Ebene ergibt einen
Sinuston in der anderen, und umgekehrt).
* * *
Wie überall, ist eine complexe Aufbereitung des Materials auch für
die peak-Analyse von Vorteil. Die folgenden zwei Grafiken zeigen den Radiusverlauf
eines reellen Signals und den des complex aufbereiteten desselben Ausschnittes:
reell:
complex:
Während im reellen Signal die Phase nur 0° oder 180° (plus
oder minus) haben kann und der Radius somit bei jedem Wechsel eine Nullstelle
haben muss, zeigt der Radius des complexen Signales an diesen Stellen
durchaus passable Amplituden. Zum Beispiel an der durch den roten Pfeil
markierten Nullstelle, die in der complexen Aufbereitung sogar als peak
erscheint. (Der Radiusvektor zeigt an dieser Stelle in irgendeine andere
Richtung als 0° oder 180°).
Wie man zu so einem complexen ('analytischen') Signal kommt, darf ich
als bekannt voraussetzen (>> complex audio): entweder durch eine
Hilbert-Transformation HILB, oder durch ein Allpassfilter
hilb.
Wie macht man das aber im Spektrum ? - Ganz einfach:
Da die Hilbert-Transformation bekanntlich die negativen Frequenzen im
Spektrum, gleichbedeutend mit der zweiten Bufferhälfte, löscht,
erhält man ein 'analytisches' Spektrum (denn complex ist es in jedem
Fall) automatisch, wenn man in der Zeitebene nur den halben Buffer verwendet,
die zweite Bufferhälfte leer lässt.
Dadurch wird erstens die peak-Analyse genauer. Zweitens erschliesst sich
auch eine Fülle von Aspekten, die man zur Analyse heranziehen kann.
Allen voran die mysteriöse, sagenumwobene 'instantaneous frequency'
- die momentane Frequenz oder Phasengeschwindigkeit sowie Ableitungen
davon (Radius- und Phasenbeschleunigung) und Kombinationen verschiedener
Aspekte.
Im Spektrum kann man auch an der Art der Spitzen erkennen, ob eine Frequenz
über einen längeren Zeitbereich wirksam (stationär) ist,
oder nur für einen Moment auftritt (transient). Steile Spitzen repräsentieren
eher stationäre Frequenzen, flache Buckel eher transiente. Selektieren
kann man, wenn man nicht die Amplitudenspitzen analysiert (r),
auch nicht die Geschwindigkeit der Amplitudenänderung (rvel),
sondern deren Beschleunigung (racc). Steile Spitzen haben
einen grossen negativen Wert, flache einen geringen.
Die blauen peaks srepräsentieren stationäre Frequenzen, die
roten transiente:
Ein weites Feld, das noch längst nicht genügend erforscht ist
!
Viel Platz zum Experimentieren - Spekulieren - Komponieren ...
* * *
Bevor wir uns nun in einem unüberschaubaren Meer von Möglichkeiten
verlieren (die Aspekte und Derivate sind tatsächlich uferlos), ein
paar praktische Methoden, die uns hier auch weiterhelfen können:
Formanten und Transienten
Was Formanten und Transienten sind, scheint zumindest in einem abgegrenzten
Bereich (Analyse von Instrumentalklängen und Sprachanalyse) klar.
Ausserhalb dieser Sphären, bei der Beschäftigung mit Klangmaterial,
von dem wir unter Umständen gar nicht wissen, wie es entsteht (oder
vielleicht auch gar nicht wissen wollen!), reduziert sich die Polarisierung
auf den trivialen Unterschied zwischen Frequenzen, die nur kurzzeitig
in Erscheinung treten ('Transienten') und solchen, die über einen
längeren Zeitraum wirksam sind ('Formanten').
Diese zu trennen, gibt es eine altbewährte Methode: Autokorrelation.
Das Verfahren beruht darauf, dass man einen Klang daraufhin untersucht,
ob sich seine Eigenschaften in seinem zeitlichen Verlauf wiederholen.
Wie so oft, ist das im Spektrum sehr einfach zu lösen. In VASP gibt
es dementsprechend vier Routinen, die diese Methode verwenden:
FORMANT.boost - Anhebung der Formanten
FORMANT.reduce - Absenkung der Formanten
TRANSIENT.boost - Anhebung der Transienten
TRANSIENT.reduce - Absenkung der Transienten
(Es sind vier Möglichkeiten, weil Formanten und Transienten zwar
gegensätzlich, aber nicht exakt komplementär sind).
Als Beispiel verwende ich einen kurzen Ausschnitt einer Aufnahme von
Chieko Mori an der Koto (ein Klangtypus, mit dem wir uns dann auch beschäftigen
werden). Hier das Original:
ch05_orig.mp3
nach FORMANT.boost:
ch05_form_boost.mp3
nach FORMANT.reduce:
ch05_form_reduce.mp3
In der einschlägigen Literatur kann man gelegentlich lesen, dass
zur Gewinnung der Formanten ein Tiefpassfilter einzusetzen ist. Das reicht
bei weitem nicht ! Das Formantfilter hat eine eigene Charakteristik, die
jeweils vomm Klang selber abgeleitet ist.
Die schwarze Linie ist das Spektrum des Originals, die rote, das daraus
abgeleitete Formantfiltert:
(Alles andere als ein einfacher Lowpass ! - eher eine bestimmte Art Huellkurve).
In den letzten Jahren ist ein anderes Verfahren zur Gewinnung von Formanten
Mode geworden: Cepstrum (der Name ist eine Aliteration von 'Spectrum').
Sie wird, soviel ich weiss, vor allem bei der Spracherkennung eingesetzt,
ist aber nicht unproblematisch. Sie hat einige Tücken und ihr Effekt
ist extrem pegelabhängig. (In der Regel wird sie auch granular eingesetzt).
Dennoch sei sie hier empfohlen, weil sie einen eigenen klanglichen Reiz
hat. Ihre Stärke zeigt sie vor allem, wenn man die Einstellungen
so wählt, dass die Klänge zeitlich verschliffen werden.
FORMANT.ceps - Formanten durch cepstrum
FORMANT.cepsinv - invers, Transienten durch cepstrum
Hier am selben Beispiel:
ch05_ceps.mp3
ch05_cepsinv.mp3
Abgesehen davon, dass solche Transformationen auch klanglich interessant
sind, liegt es auf der Hand, dass man für rhythmische Analysen die
Transienten gut verwenden kann, für spektrale Analysen die Formanten.
Oder umgekehrt ??
Rhythmus, beispielsweise, hat viele Facetten. Damit berühren wir
die oben bereits angedeutete Problematik einer musikalischen Analyse:
Der Einsatzzeitpunkt von 'Tönen' (das 'note on' des partituriellen
Denkens) ist nur ein Aspekt von vielen, vielleicht nicht einmal der wichtigste.
Auch der Puls der Formanten trägt zur rhythmischen Gestalt bei -
die Stellen grösster Amplitude, die Stellen wo die Amplitude am raschesten
steigt, oder abfällt.
Keiner dieser Zeitpunkte ist der 'richtige'. Sie alle wirken zusammen.
akueto !
G.R
--------------------------------------------------
A: "switch to buffer A
sfload frank.wav "load soundfile
$peaks 5 "write peaks into structure list
B: "switch to buffer B
$copy "copy structure
GRT.stretch 9/8 "granular stretch 9/8 (=1.125)
----------------------------------------------------------------
Anhang: Listen
Die Analysedaten in VASP lassen sich auch in einen textfile schreiben
($lstore - speichere als Liste ab). Das Beispiel vom
vorigen Newsletter ($peaks 7) sieht dann so aus:
In der ersten Zeile steht ein header, der die Spalten beschreibt.
1.Spalte: Laufindex
2.Spalte: Zeit (time - Position in Sekunden)
3.Spalte: x (Amplitudenwerte des linken Kanales)
Alle, in der Formatierung auswaehlbare Optionen:
I ... Laufindex
S ... Position in samples
T ... Position in Sekunden
F ... Position als Frequenz in hz
X ... Amplitude linker Kanal
Y ... Amplitude rechter Kanal
R ... Absolutwert (Radius)
P ... Phase
B ... Position in % (Bufferteilung)
G .... Position in %, halbe Bufferteilung (relative Frequenz)
In maxmsp kann man auch Listen einbringen, sie muessen aber anders formatiert
sein. Der header in der ersten Zeile stört, nach dem Index muss ein
Beistrich stehen und die Zeile muss mit einem Strichpunkt abgeschlossen
werden. Kein Problem, drei weitere Formatierungs-Id's:
\ ... Formatangabe wird nicht in den Textfile geschrieben
, ... ein Beistrich wird eingefügt
: ... ein Strichpunkt wird eingefügt
(Letzteres geht nur mit Doppelpunkt, weil der Strichpunkt in VASP eine
übergeordnete Bedeutung hat. Die Formatangabe (\I,TX;) würde
vom VASP compiler als zwei getrennte commands aufgefasst werden, nämlich
(\I,TX und ) - ein error ...)
Mit dieser Formatierung aber sieht die Liste im textfile dann so aus:
Wie diese Zahlenwerte interpretiert werden, ist dann Sache von maxmsp. Bereits in VASP lassen sich aber die Werte in den Spalten beliebig umformen, berechnen oder konvertieren. Zum Beispiel könnte man die Amplitudenwerte in der dritten Spalte (x) in Frequenzen zwischen 0 und 1000hz umwandeln:
Das VASP script zu den Beispielen:
size=19
$size=15
sfload frank.wav (b=3.6,d=8.12)
$peaks 7 "peaks analyse in structure geschrieben
$lstore list1.txt (ITX) "speichert structure daten
in textfile
$lstore list1_max.txt (\I,TX:) "dasselbe in maxmsp
formatierung
$calc.x [abs,*1000,+20] "scaling 1000hz, minimum 20hz
$lstore list2_max.txt (\I,TX:)
Eine andere Möglichkeit der Kommunikation wäre, die VASP structure-Daten als soundfile abzuspeicher. Mit einem $mount werden die structure-Daten im buffer als einzelne Impulse gesetzt:
So ein soundfile enthält dann nur Nullstellen und hin und wieder, zu den entsprechenden Zeitpunkten, ein sample bestimmter Amplitude, das als cue interpretiert werden könnte.
* * *
Der AMP sequencer kann dagegen Parameterlisten beliebiger Grösse verarbeiten - beliebig viele Zeilen, beliebig viele Spalten, beliebig interpretierbar ...
Zum Beispiel die zweite Spalte als Zeitpunkt und die dritte Spalte (die Amplituden) als Frequenz (Spannung) für ein Saitenmodell:
saite01.mp3
(Klingt mehr wie ein Draht, wegen der nichtlinearen Spannung 'qten').
Jede andere Art der Interpretation solcher Daten ist ebenfalls möglich. Der Phantasie sind keine Grenzen gesetzt (jedenfalls nicht durch uns).
akueto
G.R.