package com.kevingoldsmith.effects { public class Leslie { import flash.utils.ByteArray; import flash.display.Shader; import flash.display.ShaderJob; [Embed(source="../pbj/leslie.pbj", mimeType="application/octet-stream")] private var LesliePBJ:Class; private var effectShader:Shader = new Shader( new LesliePBJ() as ByteArray ); private var m_mix:Number = 0.7; private var m_phase:uint = 0; private var m_baseFrequency:Number = 220; private var m_detune:Vector. = new Vector.(2,true); public function Leslie() { m_detune[0] = 0.0; m_detune[1] = 0.0; } public function SetDetunes( detuneL:Number, detuneR:Number ):void { m_detune[0] = detuneL; m_detune[1] = detuneR; } public function get detune():Vector. { return m_detune; } public function get frequency():Number { return m_baseFrequency; } public function set frequency(freq:Number):void { m_baseFrequency = freq; } public function get effectMix():Number { return m_mix; } public function set effectMix( mix:Number ):void { m_mix = mix; } public function GenerateBytes( sourceBuffer:ByteArray, bufferSize:uint ):ByteArray { var returnBuffer:ByteArray = new ByteArray(); effectShader.data["src"].width = bufferSize / 1024; effectShader.data["src"].height = 512; effectShader.data["src"].input = sourceBuffer; effectShader.data["mixAmount"].value = [ m_mix ]; effectShader.data["bufferwidth"].value = [ bufferSize/1024.0 ]; effectShader.data["bufferoffset"] .value = [ m_phase ]; effectShader.data["baseFreq"].value = [ m_baseFrequency ]; effectShader.data["freqOffset"].value = [ m_detune[0], m_detune[1] ]; var effectJob:ShaderJob = new ShaderJob( effectShader, returnBuffer, bufferSize / 1024, 512 ); effectJob.start(true); m_phase += bufferSize; return returnBuffer; } } }