ELECTRIC OPRPHEUS ACADEMY
SPILLING THE BEANS #16 TWIXEL
Additive Synthese von Klängen, die sich zeitlich weder in der Amplitude
noch im Spektrum verändern, ist im Zeitalter der Fouriertransfomtion
kein Thema mehr. Man muss nicht mehr, wie weiland Stockhausen, Dutzende
von Sinusgeneratoren bemühen und das Ergebnis zusammenmischen. Man
setzt die entsprechenden Samples im Spektrum und transformiert das Ganze
in die Zeitebene.
Jedes Sample im Spektrum repräsentiert eine konstante Sinusschwingung
in der Zeit. Die Position des Samples bestimmt die Frequenz; seine Amplitude
(complexer Radius) die Amplitude; seine Phase den Anfangszustand. Ist
der Wert des Samples rein reell (ohne imaginären Anteil), dann ist
es ein Cosinus; ist es imaginär (ohne reellen Anteil), dann ist es
ein Sinus.
Genaugenommen können wir die Fouriertransformation selber als additive
Synthese betrachten. Nur sind es sehr viele Samples, die in der Zeitebene,
als nah beieinanderliegende Sinusschwingungen, durch gegenseitige Verstärkung
und Auslöschung jeden zeitlichen Verlauf bilden können, der
in dem gewählten Ausschnitt möglich ist.
Die Anzahl aller möglichen Frequenzen ist dennoch begrenzt: es sind
genausoviele, wie der Transformationsbuffer Samples hat.
Bei einem Buffer von 16k wären es 2^16 = 65536 Frequenzen, davon
die Hälfte linksdrehend, die andere Hälfte rechtsdrehend ('positive'
und 'negative' Frequenzen). Bei einer Samplerate von 44.1k repräsentiert
das Sample Nr. 100 im Spektrum die Frequenz 100*sr/dim = 67.29126Hz; das
Sample Nr. 101 die Frequenz 67.96417Hz.
Das Intervall, das sie bilden, ist 1.01, ungefähr 1/6 Halbton.
Man kann darüber streiten, ob ein geschultes Ohr den Unterschied
wahrnimmt. (Bei so tiefen Frequenzen eher nicht, würde ich sagen).
Definitiv wahrnehmen kann das selbst ein nicht geschultes Ohr, wenn die
beiden Frequenzen zusammenwirken. Denn dann bilden sie eine Schwebung,
die von der Differenzfrequenz abhängt, in diesem Fall 0.67hz, als
ein Puls von 1/0.67 = 1.49 Sekunden (die Bufferlänge in Sekunden).
* * *
Wenn wir raffinierte Frequenzgemische auf diese Weise erzeugen wollen,
müssen wir Samplepositionen im Spektrum auf ganze Zahlen runden.
Dadurch handeln wir uns aber in vielen Fällen solch unerwünschte
Schwebungen ein.
Somit stellt sich die Frage: Kann man Schwingungen erzeugen, deren Frequenzen
zwischen der Rasterung liegen ? Und wie sieht so ein Sample aus, das zwischen
zwei Samples liegt, betwixt two samples - ein 'twixel' ?
Probieren wir es mit folgendem Ansatz:
Eine Sinusschwingung mit 67.29126Hz kann ich ja auch in der Zeitebene
generieren und erhalte im Spektrum richtig das Sample Nr. 100 gesetzt,
alle übrigen 0. Desgleichen das Sample Nr. 101 bei 67.96417Hz.
Also generiere ich mir eine Frequenz genau dazwischen, 67.62772Hz und
sehe mir ihre Repräsentation im Spektrum an. Das Ergebnis wirkt auf
den ersten Blick verblüffend:
Das Sample 100 hat den Wert +1, gleich daneben, das Sample 101 den Wert
-1; davor ein kurzer Anstieg, danach, schiefsymmetrisch, ein kurzer Abfall
- und zwar im Imaginärteil, nicht im Realteil ! (Die Amplitude, die
hier für die Grafik normiert ist, ist übrigens 2/π
=0.63662).
So also sieht ein Twixel aus !
Betrachtet man die Zahlenwerte der Nachbarsamples, denn erkennt man folgende
Reihe:
1/9 |
1/7 |
1/5 |
1/3 |
1 |
-1 |
-1/3 |
-1/5 |
-1/7 |
-1/9 |
(Filterprogrammierern müsste die Reihe bekannt vorkommen: Sie findet
sich, in anderer Form, auch in der Impulsantwort einer Hilbert-transformation).
Andere Zwischenpositionen zeigen sich unsymmetrisch, mehr oder weniger
in die reelle Ebene gedreht, wobei auch Anstieg und Abfall umso steiler
werden, je näher man einer ganzzahligen Sampleposition kommt, die
schliesslich wieder zu einem rein reellen, einfachen Sample führt.
Ein Algorithmus dafür ist nicht schwer zu finden. Da die Flanken
links und rechts anfangs sehr steil verlaufen (umso steiler, je näher
einer ganzzahligen Position), genügen meistens ein paar Samples im
Umfeld. Eine solcherart generierte Wellenform ist in der ersten Periode
etwas irritiert, stabilisiert sich aber bereits ab der zweiten Periode:
schwarz: Realteil (Cosinus), rot: Imaginärteil
(Sinus)
Somit betrachte ich das Twixel als erfunden. (Sorry, falls das schon jemand
vor mir entdeckt und anders benannt hat ! - Mir ist nichts dergleichen
bekannt).
In VASP ist es jedenfalls ab sofort implementiert als set.twix
* * *
Die Filterprogrammierer sehen es auf einen Blick: So ein Twixel sieht
aus wie die typische Impulsantwort eines nicht kausalen Filters (in beide
Zeitrichtungen). Was bewirkt es, wenn man es tatsächlich als Impulsantwort
eines Filter nimmt ? Ganz einfach: ein Delay in Bruchteilen von Samples,
ein Allpass. (Die Phasendrehung lässt sich leicht kompensieren).
Auch das kann nützlich sein, zum Beispiel zum Generieren von Impulsserien
mit nicht ganzzahligen Perioden.
prime harmonics
Ein Anwendungsbereich fuer twixel ist die Generierung von Frequenzgemischen,
in denen Feinabstufung unbedingt erforderlich ist, zum Beispiel subharmonische
Reihen (1 - 1/2 - 1/3 - 1/4 ...) oder logarithmische Frequenzreihen, oder
Reihen nach anderen, nichtganzzahligen Charakteristiken.
In VASP gibt es seit kurzem den Generator PH - prime
harmonics, mit dem sich Sinusgemische durch Primzahlreihen aufbauen lassen.
Bereits die triviale aufsteigende Primzahlreihe 1:2:3:5:7 ... ist interessant,
sowohl klanglich, als auch in der Mikrostruktur. Hier die Wellenform eines
Frequenzgemisches nach aufsteigenden Primzahlen:
schwarz Realteil, rot Imaginärteil
oder in x/y-Darstellung:
Es liegt auf der Hand, dass solche Wellenformen reizvoll für Parametersteuerungen
sein können - seien es Tonhöhenverläufe, oder Raumpositionierungen,
oder sonstwas.
Hier das Modell einer Biegeschwingung, dessen Spannung durch die obigen,
gegenläufigen Kurven variiert wird:
ph03_biegeschwingung.mp3
Klanglich interessant sind auch die subharmonischen Primzahlreihen selbst:
ph02a.mp3
oder logarithmisch:
ph02b.mp3
oder in einem vorgegebenen Frequenzband:
ph01b.mp3
Damit betreten wir bereits das höchst interessante Gebiet der geometrischen
Konstruktion von Klängen. Im Rahmen meiner Studien habe ich mich
Anfang der Achzigerjahre ausführlich damit beschäftigt und mit
Hilfe eines Messgenerator und Tonband, die verschiedensten Frequenzgemische
hergestellt. Es gibt noch Bänder voll Skizzen, Themen und Motiven,
aus denen ich gelegentlich etwas mitteilen werde.
Darüber mehr bei nächster Gelegenheit.
akueto
G.R.
--------------------------------------------------------------
Die folgenden scripts funktionieren ab VASP v2.2144 und und AMP v2.958
*----------- ph01
size=18
PH 100,0 (phi=sin); view.; sfstore ph01.wav
PH 100,0 (phi=frac180); view.
PH.sub 2000,0 (amp=lin,phi=sin); bevz 35ms; ovp
sfstore ph01a.wav
PH.range 600,2400,2000 (amp=flat,phi=rand); bevz 35ms; ovp
/vsp (o)
view.
sfstore ph01b.wav
view.
*----------- ph02
size=18
PH.sub 10000,0 (phi=cos,amp=flat); view.
bevz 35ms
ovp
sfstore *a.wav
PH.sub 10000,1 (phi=altcos,amp=flat,freq=log); view.
hk.track 10hz
bevz 35ms
ovp
sfstore *b.wav
PH 40,1 (phi=altcos,amp=sqrt,freq=log); view.
bevz 35ms
ovp
sfstore *c.wav
*------------------ ph03
i1=ph01.wav (s)
k1=colnoise.blue
k2=osc.bar (dim=128,*k1,ini=fix,cyc=2)
k3=osc.bar (dim=128,*k1,ini=fix,cyc=2)
k4=msum (*k2,*k3)
out=*.wav (2:2,*<k2,k3>,opt)
seg=1
dur: 10
k2.tens: 0.25 (c=i1.0,cm=lin,ca=0.1)
k2.elast: 0.001
k2.damp: 10 [damp]
k2.smooth: 3 [damp]
k2.inipos: 0
k2.iniamp: 1
k2.inidur: 0.001
k2.pu: 96
i1.vsp: 1/300
k3.tens: 0.25 (c=i1.1,cm=lin,ca=0.1)
k3.elast: 0.001
k3.damp: 10 [damp]
k3.smooth: 3 [damp]
k3.inipos: 0
k3.iniamp: 1
k3.inidur: 0.001
k3.pu: 96
fo: 0.1