My favorites | Sign in
Project Home Downloads Wiki Issues Source
Checkout   Browse   Changes    
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package com.pixelboob.synth
{
import com.pixelboob.synth.envelope.Envelope;
import com.pixelboob.synth.envelope.LinearEnvelope;
import com.pixelboob.synth.filter.Filter;
import com.pixelboob.synth.oscillator.LinearOscillator;
import com.pixelboob.synth.oscillator.Oscillator;

import flash.utils.ByteArray;

/**
* @author moj
*/
public class AudioEngine
{

public static const SAMPLE_RATE:int = 44100;
public function AudioEngine()
{
}

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.
var sampleL:Number = envelope.getAmplitude(timeSecs*1000, lengthSecs*1000) * carrierAmplitude * Math.cos(carrierSample + modulatorAmplitude*Math.cos(modulatorSample));

var sampleR:Number = sampleL;

var pair:Array = [sampleL, sampleR];

if(i == 0)
{
trace("at i=0: "+sampleL);
}

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;
}
}
}

Change log

r6 by mjewell on Dec 28, 2008   Diff
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.

Go to: 
Project members, sign in to write a code review

Older revisions

r4 by mjewell on Dec 27, 2008   Diff
More rearranging
r3 by mjewell on Dec 27, 2008   Diff
Shift audio
r2 by mjewell on Dec 27, 2008   Diff
Initial commit
All revisions of this file

File info

Size: 3591 bytes, 137 lines
Powered by Google Project Hosting