public static function generateAudio(oscillator:Oscillator, envelope:Envelope, length:Number=10, filters:Array = null):ByteArray
{
if(envelope == null)
{
envelope = new LinearEnvelope();
}
var sound:ByteArray = new ByteArray();
var lengthInSamples:int = (SAMPLE_RATE*length);
var lengthSecs:Number = lengthInSamples/SAMPLE_RATE;
for(var i:int=0; i<lengthInSamples; i++)
{
var timeSecs:Number = (i/SAMPLE_RATE);
var sample:Number = envelope.getAmplitude(timeSecs*1000, lengthSecs*1000) * oscillator.getSampleAtTime(timeSecs);
var pair:Array = [sample, sample];
if(filters != null)
{
for(var j:int=0; j<filters.length; j++)
{
pair = (filters[j] as Filter).filter(sound, pair);
}
}
sound.writeFloat(pair[0]);
sound.writeFloat(pair[1]);
}
return sound;
}
/* Creates the ByteArray to produce the required sound, which is then
* played in 4096-sized chunks by the entity.
*/
public static function generateFM(carrier:Oscillator, modulator:Oscillator, carAmpOscillation:Object=1.0, modAmpOscillation:Object=1.0, envelope:Envelope=null, length:Number=10, filters:Array=null):ByteArray
{
var modAmpOsc:Oscillator;
var carAmpOsc:Oscillator;
if(modAmpOscillation is Oscillator)
{
modAmpOsc = modAmpOscillation as Oscillator;
}
else if(modAmpOscillation is Number)
{
modAmpOsc = new LinearOscillator(modAmpOscillation as Number);
}
else
{
modAmpOsc = new LinearOscillator(1.0);
}
if(carAmpOscillation is Oscillator)
{
carAmpOsc = carAmpOscillation as Oscillator;
}
else if(carAmpOscillation is Number)
{
carAmpOsc = new LinearOscillator(carAmpOscillation as Number);
}
else
{
carAmpOsc = new LinearOscillator(1.0);
}
if(envelope == null)
{
envelope = new LinearEnvelope();
}
var sound:ByteArray = new ByteArray();
var lengthInSamples:int = (SAMPLE_RATE*length);
var lengthSecs:Number = lengthInSamples/SAMPLE_RATE;
for(var i:int=0; i<lengthInSamples; i++)
{
var timeSecs:Number = (i/SAMPLE_RATE);
var carrierSample:Number = carrier.getSampleAtTime(timeSecs);
var modulatorSample:Number = modulator.getSampleAtTime(timeSecs);
var modulatorAmplitude:Number = (modAmpOsc.getSampleAtTime(timeSecs)+1)/2; // Shift to 0->2 then halve.
var carrierAmplitude:Number = (carAmpOsc.getSampleAtTime(timeSecs)+1)/2; // Shift to 0->2 then halve.
More code! Now with a simple generateAudio
(takes an oscillator, envelope, and filter
chain), 3 band EQ, proper Gaussian white
noise generator, and some simple collision
bits.