Als weiterer Beitrag zum Thema „Sound in AS3“ eine kommentierter Beispielcode, der den Befehl SoundMixer.computeSpectrum() nutzt. Mit ihm kann man in Echtzeit das Frequenzspektrum einer MP3-Datei abbilden, denn SoundMixer.computeSpectrum() liefert die aktuelle Wellenform.
Der Befehl lautet im konkreten Beispiel folgermaßen:
[as]
SoundMixer.computeSpectrum(byteArr,true,0);
[/as]
Die drei Parameter im Einzelnen:
- byteArr: Instanzname eines Objekt vom Typ ByteArray
- true: Die ermittelten Daten werden einer Fouriertransformation unterzogen. Dadurch erhält man ein Frequenzspektrum.
- 0: Dehnungsfaktor der Samplingrate (0=44.1KHz; 1=22.05KHz; 2=11.025KHZ; …)
Die Wellenform wird in einem Objekt vom Typ ByteArray abgelegt. Das abgespeicherte ByteArray-Objekt enthält immer genau 512 Gleitkommazahlen (=float). Die ersten 256 Werte gehören zum linken Kanal, die nächsten 256 zum rechten. Dabei repräsentieren jeweils die anfänglichen Werte die „Tiefen“, dann folgen die „Mitten“ und zuletzt die „Höhen“.
Man liest nun die einzelnen Float-Werte mit dem Befehl readFloat() aus dem ByteArray aus.
[as]
value = byteArr.readFloat();
[/as]
Schachtelt man den Befehl in eine Schleife, wird automatisch mit jedem erneuten Aufruf die nächste Position im Datenstrom zurückgegeben. So erhält man zuerst die 256 Werte für den linken Kanal, dann die 256 Werte für den rechten Kanal.
Zuletzt gilt es, die Werte grafisch darzustellen. In meinem Beispiel habe ich ein einfaches Diagramm gewählt, bei dem die Werte auf der y-Achse aufgetragen werden. Hier sind natürlich der Kreativität keine Grenzen gesetzt (vgl. Links).
[as]
var mySound:Sound = new Sound();
var mySC:SoundChannel;
mySound.load(new URLRequest(„demo.mp3“));
mySC = mySound.play(0,5);
// neues ByteArray zum Abspeichern des Spektrums
var byteArr:ByteArray = new ByteArray();
// jeweiliges aktueller Pegelwert des Spektrums
var value:Number = 0;
// Anfangsposition der Anzeige: y
var startPosY:Number = 300;
// diese Variable wird in x-Richtung durchlaufen
var posX:Number;
// Funktion soll jedes Frame aufgerufen werden
this.addEventListener(Event.ENTER_FRAME, showSpec);
function showSpec (evt:Event) {
// Grafik auf der Bühne löschen
this.graphics.clear();
// „Zeichen-Cursor“ an die Anfangsposition
this.graphics.moveTo (posX, startPosY);
// Fouriertransformiertes Spektrum mit 44.1 KHz samplen
// wird im ByteArray abgelegt
SoundMixer.computeSpectrum(byteArr,true,0);
// Linker Kanal (= die ersten 256 Float-Werte im ByteArray)
posX = 10;
for(var i=0; i < 256; i++) {
drawSingleLine();
}
// Rechter Kanal (= die zweiten 256 Float-Werte im ByteArray)
posX = 300;
for(var i=0; i < 256; i++) {
drawSingleLine();
}
}
function drawSingleLine() {
// einzelner Float-Wert auslesen
value = byteArr.readFloat();
// Linien-Stil festlegen (Zufallsfarbe)
this.graphics.lineStyle(2, 0xAA00FF*value);
// Zeichen-Cursor wieder auf die "y-Achse" setzen
this.graphics.moveTo (posX, startPosY);
// Linie zeichnen
this.graphics.lineTo (posX, -value*150+ startPosY+0.2);
// Zeichen-Cursor eins nach rechts
posX++;
}
[/as]
Link: computeSpectrum() (ActionScript 3 Reference)
Link: Sound Spectrum Contest (theflashblog.com)
Link: Quellcode .fla
Link: Revolt (Flash Spectrum Analyzer; Quellcode kann heruntergeladen werden)
Super Tutorial,
hat mir sehr geholfen. Allerdings meldet mir Flash eine doppelte Variablendefinition in Zeile 41, also in der showSpec Funktion bei der 2ten for-Schleife. Das Beispiel Funktioniert trozdem allerdings stört mich diese Fehlermeldung. Gibt es vielleicht eine Möglichkeit diese zu umgehen?
Machs doch einfach so:
var i:int;
for(i=0; i <256; i++) {
drawSingleLine();
}
// Rechter Kanal (= die zweiten 256 Float-Werte im ByteArray)
posX = 300;
for(i=0; i <256; i++) {
drawSingleLine();
}
Stimmt, i ist ja doppelt deklariert :-)
Also ich find das super aber nach dem ich eine swf draus gemacht habe läuft es bei mir nur local über den Adobe Flash Player 9 oder über Adobe Flash CS3. Sobald ich es in eine Webseite einbinde kommt nur die Musik, der weiße Hintergrund und kein Spectrum.
Was mache ich denn, wenn ich eine flv vom Flash Media Server abspiele? Obgleich ich meine Datei hören kann „malt“ er bei mir gar nix mehr.