Forked from: kazu_E09's mp3 可変速再生 diff:1 forked from: mp3 可変速再生 hacker_d_wfy.. forked:0favorite:0lines:115license : All rights reserved modified : 2009-07-17 04:17:36 Embed Tweet // forked from kazu_E09's mp3 可変速再生 // forked from TheCoolMuseum's mp3 可変速再生 package { import flash.display.*; import flash.events.*; import flash.geom.Matrix; import flash.media.*; import flash.net.*; import flash.utils.*; import funnel.*; [SWF(frameRate="24", backgroundColor="#000000")] public class SoundSample extends Sprite { private var loadData:String = "http://www.iamas.ac.jp/wxp/files/sounds/G_sound.mp3"; private var source:Sound = new Sound(); private var sound:Sound = new Sound(); private var sampleTable:ByteArray = new ByteArray(); private var delayBuffer:ByteArray = new ByteArray(); private var bufferLength:int = 2048; private var delayTime:int = 100; private var gio:Gainer; private var shp:Shape; private var m:Matrix; private var vx:Number = stage.stageWidth/2; private var vy:Number = stage.stageHeight/2; private var spring:Number = 0.0075; private var friction:Number = 0.95; public function SoundSample() { gio = new Gainer(); //ゲイナー var smoother:Convolution = new Convolution(Convolution.MOVING_AVERAGE); //スムース var scaler:Scaler = new Scaler(0.1, 0.65, 0, stage.stageWidth/1.5, Scaler.LINEAR, true); //スケール var smoother2:Convolution = new Convolution(Convolution.MOVING_AVERAGE); //スムース var scaler2:Scaler = new Scaler(0.1, 0.65, 0, stage.stageWidth/3.5, Scaler.LINEAR, true); //スケール gio.analogInput(0).filters = [smoother, scaler]; gio.analogInput(1).filters = [smoother2, scaler2]; source.addEventListener(Event.COMPLETE, loadComplete); source.load(new URLRequest(loadData)); shp = new Shape(); draw(shp); addChild(shp); m = new Matrix(); m.tx = stage.stageWidth / 2; m.ty = stage.stageHeight / 2; addEventListener(Event.ENTER_FRAME, enterFrameHandler); } private function player(event:SampleDataEvent):void { var speed:Number = (gio.analogInput(1).value*5 - stage.stageWidth/2) / stage.stageWidth*4; var level:Number = (gio.analogInput(0).value*2 - stage.stageHeight/2) / stage.stageHeight; var pos:Number = sampleTable.position / 8; var length:Number = sampleTable.length / 8; for (var i:int = 0; i < bufferLength; i++ ) { pos += speed; if (pos > length-1 && speed>0) { pos += 2; pos %= length; } if (pos <= 0 && speed<0) { pos %= length; pos += length - 1; } sampleTable.position = Math.round(pos) * 8; var left:Number = sampleTable.readFloat() + delayBuffer.readFloat() * level; var right:Number = sampleTable.readFloat() + delayBuffer.readFloat() * level; delayBuffer.position -= 8; delayBuffer.writeFloat(left); delayBuffer.writeFloat(right); if (delayBuffer.position >= delayBuffer.length - 8) { delayBuffer.position = 0; } event.data.writeFloat(left*0.25); event.data.writeFloat(right * 0.25); } } private function draw(target:Shape):void { var size:uint = 60; target.graphics.beginFill(Math.random()*0xffffff); target.graphics.drawRect(-size/2, -size/2, size, size); target.graphics.endFill(); } private function enterFrameHandler(e:Event):void { vx += (gio.analogInput(1).value*5 - shp.x) * spring; vx *= friction; vy += (gio.analogInput(0).value - shp.y) * spring; vy *= friction; m.tx += vx; m.ty += vy; m.c = -vx * 0.1; m.b = -vy * 0.1; shp.transform.matrix = m; } private function loadComplete(event:Event):void { graphics.lineStyle(1, 0xFFFFFF); graphics.moveTo(0, stage.stageHeight / 2); graphics.lineTo(stage.stageWidth, stage.stageHeight / 2); graphics.moveTo(stage.stageWidth/2, 0); graphics.lineTo(stage.stageWidth/2, stage.stageHeight); graphics.drawRect(stage.stageWidth/4,stage.stageHeight/4,stage.stageWidth/2,stage.stageHeight/2) for (var i:int = 0; i < delayTime / 1000 * 44100; i++ ){ delayBuffer.writeFloat(0); delayBuffer.writeFloat(0); } delayBuffer.position = 0; sampleTable.position = 0; source.extract(sampleTable, source.length / 1000 * 44100, 0); sampleTable.position = 0; sound.addEventListener("sampleData", player); trace("play"); sound.play(); } } } Code Fullscreen Preview Fullscreen