Ich will ein Tool programmieren, was per DMX MovingHeads in Abhängigkeit
vom aktuellen Umgebungs-Sound steuert - so eine Art moderne Lichtorgel.
Was ich bereits habe und was funktioniert sind Programm-Fragmente für:
- Soundgrabbing (liefert eine festgelegte Anzahl von Samples in einem
Array)
- DMX-Ausgabe
Zur Trennung der Spektralanteile (und deren Verteilung auf die
DMX-Kanäle) möchte ich FFT verwenden, dazu habe ich ein Beispielprogramm
mit einer entsprechenden Funktion. Leider blicke ich bei deren Nutzung
nicht ganz durch, zumal der Beispielcode nur mit einer Listenausgabe
daher kommt.
Als Übergabeparameter bekommt diese Funktion ein Array mit komplexen
Zahlen, die vorher aus meinem Array mit den Sampling-Daten erzeugt
werden (z.B. 1024 Werte). Zurück bekomme ich ein gleich großes Array
voller komplexer Zahlen ... und nun? Wie bekomme ich daraus die
spektralen Anteile? Ist so verdammt lang her ...
1 | dim N,k as integer //Anzahl der Eingangs-Werte
|
2 | dim x() as Double //Array für Eingangswerte real
|
3 | dim c() as Complex //Array für Eingangswerte komplex
|
4 |
|
5 | N=1023
|
6 |
|
7 | for k = 0 to N
|
8 | x.Append sin(k/10) + 0.5 * sin(k/3) 'Erzeugen von Beispiel-Eingangswerten mit zwei Sinus-Funktionen
|
9 | next
|
10 |
|
11 | for k = 0 to N
|
12 | c.append new Complex(x(k),0) // Complex with real part = x(k) and imaginary part = 0
|
13 | next
|
14 |
|
15 | // Calculate FFT
|
16 | dim C_() as Complex = fft(c)
|
17 |
|
18 | // Extract magnitudes
|
19 | dim m() as double
|
20 |
|
21 | for k = 0 to N
|
22 | m.Append C_(k).Abs
|
23 | next
|
24 |
|
25 | for k=0 to N //Ausgabe der Ergebnisse in eine Tabelle
|
26 | list.addrow str(k) //Zeilennummer
|
27 | list.cell(k,1)=str(sin(k/10) + 0.5 * sin(k/3)) //EIngangswerte
|
28 | list.cell(k,2)=str(c_(k)) //Resultat komplex
|
29 | list.cell(k,3)=str(m(k)) //Resultat real
|
30 | next
|
(ist RealBasic/Xojo)