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.

ActionScript 3 Beispiel: Soundmixer.computeSpectrum()

Der Befehl lautet im konkreten Beispiel folgermaßen:

Actionscript:
  1. SoundMixer.computeSpectrum(byteArr,true,0);

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.

Actionscript:
  1. value = byteArr.readFloat();

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

Actionscript:
  1. var mySound:Sound = new Sound();
  2. var mySC:SoundChannel;
  3. mySound.load(new URLRequest("demo.mp3"));
  4. mySC = mySound.play(0,5);
  5.  
  6. // neues ByteArray zum Abspeichern des Spektrums
  7. var byteArr:ByteArray = new ByteArray();
  8.  
  9. // jeweiliges aktueller Pegelwert des Spektrums
  10. var value:Number = 0;
  11.  
  12. // Anfangsposition der Anzeige: y
  13. var startPosY:Number = 300;
  14.  
  15. // diese Variable wird in x-Richtung durchlaufen
  16. var posX:Number;
  17.  
  18. // Funktion soll jedes Frame aufgerufen werden
  19. this.addEventListener(Event.ENTER_FRAME, showSpec);
  20.  
  21. function showSpec (evt:Event) {
  22.    
  23.     // Grafik auf der Bühne löschen
  24.     this.graphics.clear();
  25.    
  26.     // "Zeichen-Cursor" an die Anfangsposition
  27.     this.graphics.moveTo (posX, startPosY);
  28.    
  29.     // Fouriertransformiertes Spektrum mit 44.1 KHz samplen
  30.     // wird im ByteArray abgelegt
  31.     SoundMixer.computeSpectrum(byteArr,true,0);
  32.  
  33.     // Linker Kanal (= die ersten 256 Float-Werte im ByteArray)
  34.     posX = 10;
  35.     for(var i=0; i <256; i++) {
  36.         drawSingleLine();
  37.     }
  38.  
  39.     // Rechter Kanal (= die zweiten 256 Float-Werte im ByteArray)
  40.     posX = 300;
  41.     for(var i=0; i <256; i++) {
  42.         drawSingleLine();
  43.     }
  44.    
  45. }
  46.  
  47. function drawSingleLine() {
  48.           // einzelner Float-Wert auslesen
  49.           value = byteArr.readFloat();
  50.           
  51.           // Linien-Stil festlegen (Zufallsfarbe)
  52.           this.graphics.lineStyle(2, 0xAA00FF*value);
  53.           
  54.           // Zeichen-Cursor wieder auf die "y-Achse" setzen
  55.           this.graphics.moveTo (posX, startPosY);
  56.           
  57.           // Linie zeichnen
  58.           this.graphics.lineTo (posX, -value*150+ startPosY+0.2);
  59.           
  60.           // Zeichen-Cursor eins nach rechts
  61.           posX++;
  62. }

Link: computeSpectrum() (ActionScript 3 Reference)
Link: Sound Spectrum Contest (theflashblog.com)
Link: Quellcode .fla
Link: Revolt (Flash Spectrum Analyzer; Quellcode kann heruntergeladen werden)