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.mp3

und 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.