본문 바로가기

Actionscript3.0

[AS3.0] Sound Spectrum


SoundMixer.computeSpectrum() 
SoundMixer.computeSpectrum() 를 이용하면 현재 재생하고 있는 사운드에 대한 원시 데이터를 불러올수 있습니다. 

다음 그림에서는 FFTMode 매개 변수가 true로 설정되었을 때와 false로 설정되었을 때 computeSpectrum() 메서드로부터 반환된 데이터를 비교합니다. 이 그림에 사용된 사운드 데이터는 왼쪽 채널은 큰 베이스 사운드, 오른쪽 채널은 드럼 사운드에 대한 것입니다.

 

 // 드로잉 API 를 이용한 간단한 사운드 스트리밍
  1. import flash.display.Graphics;
  2. import flash.events.Event;
  3. import flash.media.Sound;
  4. import flash.media.SoundChannel;
  5. import flash.media.SoundMixer;
  6. import flash.net.URLRequest;
  7.  
  8. const PLOT_HEIGHT:int = 200;
  9. const CHANNEL_LENGTH:int = 256;
  10.  
  11. var snd:Sound = new Sound();
  12. var req:URLRequest = new URLRequest("mystory.mp3");
  13. snd.load(req);
  14.  
  15. var channel:SoundChannel;
  16. channel = snd.play();
  17. addEventListener(Event.ENTER_FRAME, onEnterFrame);
  18. snd.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
  19.  
  20. var bytes:ByteArray = new ByteArray();
  21.  
  22. function onEnterFrame(event:Event):void
  23. {
  24.     SoundMixer.computeSpectrum(bytes, false, 0);
  25.    
  26.     var g:Graphics = this.graphics;
  27.    
  28.     g.clear();
  29.     g.lineStyle(0, 0x6600CC);
  30.     g.beginFill(0x6600CC);
  31.     g.moveTo(0, PLOT_HEIGHT);
  32.    
  33.     var n:Number = 0;
  34.        
  35.     // 왼쪽 채널
  36.     for (var i:int = 0; i < CHANNEL_LENGTH; i++)
  37.     {
  38.         n = (bytes.readFloat() * PLOT_HEIGHT);
  39.         g.lineTo(i * 2, PLOT_HEIGHT - n);
  40.     }
  41.     g.lineTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT);
  42.     g.endFill();
  43.    
  44.     // 오른쪽 채널
  45.     g.lineStyle(0, 0xCC0066);
  46.     g.beginFill(0xCC0066, 0.5);
  47.     g.moveTo(CHANNEL_LENGTH * 2, PLOT_HEIGHT);
  48.    
  49.     for (i = CHANNEL_LENGTH; i > 0; i--)
  50.     {
  51.         n = (bytes.readFloat() * PLOT_HEIGHT);
  52.         g.lineTo(i * 2, PLOT_HEIGHT - n);
  53.     }
  54.     g.lineTo(0, PLOT_HEIGHT);
  55.     g.endFill();
  56. }
  57.  
  58. function onPlaybackComplete(event:Event)
  59. {
  60.     removeEventListener(Event.ENTER_FRAME, onEnterFrame);
  61. }

 사운드 데이터는 512바이트의 데이터가 포함된 ByteArray 객체로 반환되며 각 개체는 -1과 1 사이의 부동 소수점 값을 포함합니다. 이러한 값은 재생 중인 사운드 파형의 위치 진폭을 나타냅니다. 값은 두 개의 256바이트 그룹으로 제공됩니다. 첫 번째 그룹은 왼쪽 스테레오 채널용이고 두 번째 그룹은 오른쪽 스테레오 채널용입니다.
FFTMode 매개 변수가 true로 설정된 경우, SoundMixer.computeSpectrum() 메서드는 파형 데이터가 아니라 주파수 스펙트럼 데이터를 반환합니다. 주파수 스펙트럼은 가장 낮은 주파수에서 가장 높은 주파수까지 사운드 주파수에 따라 배열된 진폭을 표시합니다. FFT(Fast Fourier Transform)는 파형 데이터를 주파수 스펙트럼 데이터로 변환하는 데 사용됩니다. 결과 주파수 스펙트럼 값은 0에서 약 1.414(2의 제곱근)까지입니다.