/src/tonfall/display/Spectrum.as

https://bitbucket.org/nidinthb/as3-vehicle-system
ActionScript | 177 lines | 128 code | 44 blank | 5 comment | 2 complexity | d3320c1ef40b3c522e8007787f040faa MD5 | raw file
  1. package tonfall.display
  2. {
  3. import tonfall.core.Driver;
  4. import flash.display.Bitmap;
  5. import flash.display.BitmapData;
  6. import flash.display.PixelSnapping;
  7. import flash.display.Sprite;
  8. import flash.events.Event;
  9. import flash.geom.Rectangle;
  10. import flash.media.SoundMixer;
  11. import flash.utils.ByteArray;
  12. /**
  13. * Spectrum is a fast and imprecise debug view of the audio data.
  14. *
  15. * @author Andre Michelle
  16. */
  17. public final class Spectrum extends Sprite
  18. {
  19. private const WIDTH: int = 352;
  20. private const HEIGHT: int = 304;
  21. private const driver: Driver = Driver.getInstance();
  22. private const bitmapWaveform: Bitmap = new Bitmap( new BitmapData( 0x100, 0x80, false, 0x333333 ), PixelSnapping.ALWAYS );
  23. private const bitmapSpectrum: Bitmap = new Bitmap( new BitmapData( 0x100, 0x80, false, 0x333333 ), PixelSnapping.ALWAYS );
  24. private const bitmapPeaksLeft: Bitmap = new Bitmap( new BitmapData( 16, 272, false, 0x333333 ), PixelSnapping.ALWAYS );
  25. private const bitmapPeaksRight: Bitmap = new Bitmap( new BitmapData( 16, 272, false, 0x333333 ), PixelSnapping.ALWAYS );
  26. private const BACKGROUND: uint = 0x333333;
  27. private const outputArray: ByteArray = new ByteArray();
  28. private const rectLine: Rectangle = new Rectangle( 0.0, 0.0, 1.0, 0.0 );
  29. private const rectPeak: Rectangle = new Rectangle( 0.0, 0.0, 16.0, 0.0 );
  30. public function Spectrum()
  31. {
  32. graphics.beginFill( 0x222222 );
  33. graphics.drawRoundRect( 0.0, 0.0, WIDTH, HEIGHT, 8.0, 8.0 );
  34. graphics.endFill();
  35. bitmapWaveform.x = 16.0;
  36. bitmapWaveform.y = 16.0;
  37. addChild( bitmapWaveform );
  38. bitmapSpectrum.x = 16.0;
  39. bitmapSpectrum.y = 160.0;
  40. addChild( bitmapSpectrum );
  41. bitmapPeaksLeft.x = 288.0;
  42. bitmapPeaksLeft.y = 16.0;
  43. addChild( bitmapPeaksLeft );
  44. bitmapPeaksRight.x = 320.0;
  45. bitmapPeaksRight.y = 16.0;
  46. addChild( bitmapPeaksRight );
  47. addEventListener( Event.ADDED_TO_STAGE, added );
  48. addEventListener( Event.REMOVED_FROM_STAGE, removed );
  49. }
  50. override public function get width(): Number
  51. {
  52. return WIDTH;
  53. }
  54. override public function get height(): Number
  55. {
  56. return HEIGHT;
  57. }
  58. public function dispose(): void
  59. {
  60. removeEventListener( Event.ADDED_TO_STAGE, added );
  61. removeEventListener( Event.REMOVED_FROM_STAGE, removed );
  62. }
  63. private function enterFrame( event: Event ): void
  64. {
  65. paintWaveform();
  66. paintSpectrum();
  67. paintPeak( bitmapPeaksLeft.bitmapData, driver.leftPeak );
  68. paintPeak( bitmapPeaksRight.bitmapData, driver.rightPeak );
  69. }
  70. private function paintWaveform() : void
  71. {
  72. const bitmapData: BitmapData = bitmapWaveform.bitmapData;
  73. bitmapData.lock();
  74. bitmapData.fillRect( bitmapData.rect, BACKGROUND );
  75. SoundMixer.computeSpectrum( outputArray, false );
  76. var l: Number;
  77. var r: Number;
  78. for( var x: int = 0 ; x < 0x100 ; ++x )
  79. {
  80. outputArray.position = x << 2;
  81. l = outputArray.readFloat();
  82. outputArray.position = ( x | 0x100 ) << 2;
  83. r = outputArray.readFloat();
  84. bitmapData.setPixel( x, 0x40 + l * 0x40, 0xAAAAAA );
  85. bitmapData.setPixel( x, 0x40 + r * 0x40, 0xCCCCCC );
  86. }
  87. bitmapData.unlock();
  88. }
  89. private function paintSpectrum() : void
  90. {
  91. const bitmapData: BitmapData = bitmapSpectrum.bitmapData;
  92. bitmapData.lock();
  93. bitmapData.fillRect( bitmapData.rect, BACKGROUND );
  94. SoundMixer.computeSpectrum( outputArray, true, 1 );
  95. var l: Number;
  96. var r: Number;
  97. var h: int;
  98. for( var x: int = 0 ; x < 0x100 ; ++x )
  99. {
  100. outputArray.position = x << 2;
  101. l = outputArray.readFloat();
  102. outputArray.position = ( x | 0x100 ) << 2;
  103. r = outputArray.readFloat();
  104. h = ( l > r ? l : r ) * 0x80;
  105. rectLine.x = x;
  106. rectLine.y = 0x80 - h;
  107. rectLine.height = h;
  108. bitmapData.fillRect( rectLine, 0xAAAAAA );
  109. }
  110. bitmapData.unlock();
  111. }
  112. private function paintPeak( bitmapData: BitmapData, peak: Number ) : void
  113. {
  114. bitmapData.lock();
  115. var yy: int = ( 1.0 - peak ) * 272.0;
  116. rectPeak.y = 0.0;
  117. rectPeak.height = yy;
  118. bitmapData.fillRect( rectPeak, BACKGROUND );
  119. rectPeak.y = yy;
  120. rectPeak.height = 272.0 - yy;
  121. bitmapData.fillRect( rectPeak, 0xAAAAAA );
  122. bitmapData.unlock();
  123. }
  124. private function added( event: Event ): void
  125. {
  126. addEventListener( Event.ENTER_FRAME, enterFrame );
  127. }
  128. private function removed( event: Event ): void
  129. {
  130. removeEventListener( Event.ENTER_FRAME, enterFrame );
  131. }
  132. }
  133. }