Section 1
//ADSR (de.popforge.audio.envelope.ADSR)
package de.popforge.audio.envelope {
public final class ADSR {
private var a:Number;
private var d:Number;
private var e:int;// = 0
private var f:int;// = 0
private var r:Number;
private var s:Number;
private static const ENV_RELEASE:int = 3;
private static const ENV_DECAY:int = 2;
private static const ENV_ATTACK:int = 1;
private static const ENV_SILENCE:int = 0;
public function ADSR(_arg1:Number, _arg2:Number, _arg3:Number, _arg4:Number){
e = ENV_SILENCE;
f = 0;
super();
a = _arg1;
d = _arg2;
s = _arg3;
r = _arg4;
}
public function set sustain(_arg1:Number):void{
this.s = _arg1;
}
public function get attack():Number{
return (a);
}
public function getNextFrameValue():Number{
var _local1:Number;
var _local2:Number;
_local1 = 0;
f++;
switch (e){
case ENV_ATTACK:
_local2 = ((a - f) - 1);
_local1 = (1 - ((_local2 * _local2) / (a * a)));
if (f >= a){
e = ENV_DECAY;
f = 0;
};
break;
case ENV_DECAY:
_local2 = ((d - f) - 1);
_local1 = (s + (((1 - s) * (_local2 * _local2)) / (d * d)));
if (f >= d){
e = ENV_RELEASE;
f = 0;
};
break;
case ENV_RELEASE:
_local2 = ((r - f) - 1);
_local1 = ((s * (_local2 * _local2)) / (r * r));
if (f >= r){
e = ENV_SILENCE;
f = 0;
};
break;
};
return (_local1);
}
public function set release(_arg1:Number):void{
this.r = _arg1;
}
public function set attack(_arg1:Number):void{
this.a = _arg1;
}
public function restart():void{
e = ENV_ATTACK;
f = 0;
}
public function get release():Number{
return (r);
}
public function get sustain():Number{
return (s);
}
public function set decay(_arg1:Number):void{
this.d = _arg1;
}
public function get decay():Number{
return (d);
}
}
}//package de.popforge.audio.envelope
Section 2
//Delay (de.popforge.audio.filters.Delay)
package de.popforge.audio.filters {
import de.popforge.audio.utils.*;
public final class Delay implements IFilter {
private const bufferLength:int = 176400;
public var feedback:Number;
private var stepL:int;// = 0
private var bufferR:Array;
private var bufferL:Array;
private var stepR:int;// = 0
public var offsetL:Number;
private var step:int;// = 0
public var mix:Number;
private var bpm:Number;
private var rate:uint;
public var offsetR:Number;
public function Delay(_arg1:uint):void{
step = 0;
stepL = 0;
stepR = 0;
super();
this.rate = _arg1;
bufferL = new Array();
bufferR = new Array();
mix = 0.5;
feedback = 1;
offsetL = 64;
offsetR = 32;
}
public function setBPM(_arg1:Number):void{
this.bpm = _arg1;
}
public function renderSample(_arg1:Sample):void{
var _local2:Number;
_local2 = ((rate * 45) / bpm);
if (step >= bufferLength){
step = 0;
};
stepL = ((step - _local2) + offsetL);
if (stepL < 0){
stepL = (stepL + bufferLength);
};
stepR = ((step - _local2) + offsetR);
if (stepR < 0){
stepR = (stepR + bufferLength);
};
if (bufferL[stepL] != undefined){
_arg1.l = (bufferL[step] = (_arg1.l + ((feedback * bufferL[stepL]) * mix)));
} else {
bufferL[step] = _arg1.l;
};
if (bufferR[stepR] != undefined){
_arg1.r = (bufferR[step] = (_arg1.r + ((feedback * bufferR[stepR]) * mix)));
} else {
bufferR[step] = _arg1.r;
};
step++;
}
}
}//package de.popforge.audio.filters
Section 3
//IFilter (de.popforge.audio.filters.IFilter)
package de.popforge.audio.filters {
import de.popforge.audio.utils.*;
public interface IFilter {
function renderSample(_arg1:Sample):void;
}
}//package de.popforge.audio.filters
Section 4
//Host (de.popforge.audio.output.Host)
package de.popforge.audio.output {
import flash.events.*;
import flash.utils.*;
import flash.media.*;
import de.popforge.audio.utils.*;
public final class Host extends EventDispatcher {
private var multiple:uint;
private var channels:uint;
private var buffer:Sound;
private var sync:Sound;
private var bits:uint;
private var bufferChannel:SoundChannel;
private var syncChannel:SoundChannel;
private var rate:Number;
private var autoStart:Boolean;
public static const EVENT_BUFFER_COMPLETE:String = "onBufferComplete";
public static const UNIT_SAMPLES_NUM:uint = 0x0800;
public function Host(_arg1:uint, _arg2:uint, _arg3:uint, _arg4:Number, _arg5:Boolean=true){
this.multiple = _arg1;
this.channels = _arg2;
this.bits = _arg3;
this.rate = _arg4;
this.autoStart = _arg5;
init();
}
public function stop():void{
syncChannel.stop();
syncChannel.removeEventListener(Event.SOUND_COMPLETE, play);
}
public function play(_arg1:Event=null):void{
if (syncChannel != null){
stop();
};
dispatchEvent(new Event(EVENT_BUFFER_COMPLETE));
if (buffer != null){
bufferChannel = buffer.play();
};
syncChannel = sync.play();
syncChannel.addEventListener(Event.SOUND_COMPLETE, play);
}
public function getSamplesNum():uint{
return ((UNIT_SAMPLES_NUM * multiple));
}
private function onSyncInit(_arg1:SoundFactory):void{
sync = _arg1.getSound();
if (autoStart){
play();
};
}
public function updateBuffer(_arg1:ByteArray):void{
SoundFactory.generate(_arg1, channels, bits, rate, onUpdateBuffer);
}
public function getBufferChannel():SoundChannel{
return (bufferChannel);
}
private function init():void{
var _local1:ByteArray;
_local1 = new ByteArray();
_local1.length = (((UNIT_SAMPLES_NUM * multiple) << 1) - 1);
SoundFactory.generate(_local1, Waveform.MONO, Waveform.BIT_16, Waveform.KHZ_44100, onSyncInit);
}
private function onUpdateBuffer(_arg1:SoundFactory):void{
buffer = _arg1.getSound();
}
}
}//package de.popforge.audio.output
Section 5
//RenderSplitter (de.popforge.audio.output.RenderSplitter)
package de.popforge.audio.output {
import flash.events.*;
import flash.utils.*;
import de.popforge.audio.source.*;
public final class RenderSplitter extends EventDispatcher {
private var renderTime:uint;
private var renderTimer:Timer;
private var samplesEachTick:uint;
private var host:Host;
private var remainingSamples:uint;
private var sources:Array;
public static const EVENT_RENDER_ERROR:String = "onRenderError";
public static const EVENT_RENDER_COMPLETE:String = "onRenderComplete";
public function RenderSplitter(_arg1:Host){
this.host = _arg1;
init();
}
private function init():void{
sources = new Array();
renderTimer = new Timer(1, 0);
renderTimer.addEventListener(TimerEvent.TIMER, render);
setRenderSteps();
}
public function addSource(_arg1:ISource):void{
sources.push(_arg1);
}
public function onHostSync(_arg1:Event):void{
var _local2:int;
if (remainingSamples > 0){
dispatchEvent(new Event(EVENT_RENDER_ERROR));
return;
};
_local2 = sources.length;
while (--_local2 > -1) {
ISource(sources[_local2]).clearBuffer();
};
remainingSamples = host.getSamplesNum();
renderTime = 0;
renderTimer.start();
}
private function render(_arg1:TimerEvent):void{
var _local2:int;
var _local3:int;
var _local4:int;
_local2 = getTimer();
if (remainingSamples < samplesEachTick){
_local3 = remainingSamples;
} else {
_local3 = samplesEachTick;
};
_local4 = sources.length;
while (--_local4 > -1) {
ISource(sources[_local4]).renderBuffer(_local3);
};
remainingSamples = (remainingSamples - _local3);
renderTime = (renderTime + (getTimer() - _local2));
if (remainingSamples == 0){
renderTimer.stop();
dispatchEvent(new Event(EVENT_RENDER_COMPLETE));
};
}
public function setRenderSteps(_arg1:uint=16):void{
samplesEachTick = int((host.getSamplesNum() / _arg1));
}
public function getLastRenderTime():uint{
return (renderTime);
}
}
}//package de.popforge.audio.output
Section 6
//Mixer (de.popforge.audio.source.mixer.Mixer)
package de.popforge.audio.source.mixer {
import flash.utils.*;
import de.popforge.audio.utils.*;
import de.popforge.audio.source.*;
import de.popforge.audio.filters.*;
public final class Mixer implements ISource {
private var position:uint;
private var channels:Array;
private var buffer:ByteArray;
public function Mixer(){
init();
}
public function addChannel(_arg1:MixerChannel):void{
channels.push(_arg1);
}
public function getBuffer():ByteArray{
return (buffer);
}
public function clearBuffer():void{
position = 0;
buffer.length = 0;
}
public function renderBuffer(_arg1:int):void{
var _local2:int;
var _local3:int;
var _local4:Sample;
var _local5:MixerChannel;
var _local6:IFilter;
var _local7:ByteArray;
var _local8:int;
var _local9:int;
var _local10:int;
_local4 = new Sample();
_local8 = channels.length;
_local10 = 0;
while (_local10 < _arg1) {
_local3 = 0;
_local2 = _local3;
_local9 = _local8;
while (--_local9 > -1) {
_local5 = MixerChannel(channels[_local9]);
_local7 = _local5.source.getBuffer();
_local7.position = position;
_local4.l = _local7.readShort();
_local4.r = _local7.readShort();
for each (_local6 in _local5.filters) {
_local6.renderSample(_local4);
};
_local3 = (_local3 + (_local4.l * _local5.volume));
_local2 = (_local2 + (_local4.r * _local5.volume));
};
if (_local3 > 32767){
_local3 = 32767;
} else {
if (_local3 < -32767){
_local3 = -32767;
};
};
if (_local2 > 32767){
_local2 = 32767;
} else {
if (_local2 < -32767){
_local2 = -32767;
};
};
position = (position + 4);
buffer.writeShort(_local3);
buffer.writeShort(_local2);
_local10++;
};
}
private function init():void{
buffer = new ByteArray();
buffer.endian = Endian.LITTLE_ENDIAN;
channels = new Array();
}
}
}//package de.popforge.audio.source.mixer
Section 7
//MixerChannel (de.popforge.audio.source.mixer.MixerChannel)
package de.popforge.audio.source.mixer {
import de.popforge.audio.source.*;
public final class MixerChannel {
public var filters:Array;
public var volume:Number;// = 1
public var source:ISource;
public function MixerChannel(_arg1:ISource){
volume = 1;
super();
this.source = _arg1;
filters = new Array();
}
}
}//package de.popforge.audio.source.mixer
Section 8
//ModPlayer (de.popforge.audio.source.modplayer.ModPlayer)
package de.popforge.audio.source.modplayer {
import flash.utils.*;
import de.popforge.format.mod.*;
import de.popforge.audio.source.*;
import de.popforge.format.mod.tags.*;
public final class ModPlayer implements ISource {
private var buffer:ByteArray;
private var channels:Array;
private var pattern:int;// = 0
private var modFormat:ModFormat;
private var row:int;// = 0
private var apeggio:int;// = 0
private var si:int;// = 0
private var bpm:Number;
private var rate:Number;
private var amigatick:Number;// = 0
public function ModPlayer(_arg1:Number){
si = 0;
apeggio = 0;
amigatick = 0;
row = 0;
pattern = 0;
super();
this.rate = _arg1;
buffer = new ByteArray();
buffer.endian = Endian.LITTLE_ENDIAN;
channels = [new ModPlayerTrigger(), new ModPlayerTrigger(), new ModPlayerTrigger(), new ModPlayerTrigger()];
}
public function getBuffer():ByteArray{
return (buffer);
}
public function setBPM(_arg1:Number):void{
this.bpm = _arg1;
}
public function clearBuffer():void{
buffer.length = 0;
}
public function renderBuffer(_arg1:int):void{
var _local2:ModPlayerTrigger;
var _local3:ModTrigger;
var _local4:int;
var _local5:Number;
var _local6:int;
var _local7:Number;
var _local8:int;
var _local9:Boolean;
var _local10:int;
var _local11:int;
var _local12:int;
var _local13:ByteArray;
_local5 = 0;
_local6 = -1;
_local7 = 4;
_local8 = 0;
while (_local8 < _arg1) {
if (--si < 0){
si = (si + ((rate * ((15 * _local7) / 6)) / bpm));
amigatick = 0;
apeggio = 0;
_local4 = 0;
while (_local4 < 4) {
_local3 = modFormat.patterns[modFormat.sequence[pattern]][row][_local4];
if (_local3 != null){
_local2 = channels[_local4];
_local2.draw(_local3);
if (_local2){
if (_local3.effect == ModPlayerTrigger.EXTENDED_EFFECTS){
if (_local3.effectParam == 192){
_local2.waveform = null;
};
} else {
if (_local3.effect == ModPlayerTrigger.VOLUME_SLIDE){
_local2.volumeSlide = (_local3.effectParam >> 4);
_local2.volumeSlide = (_local2.volumeSlide - (_local3.effectParam & 15));
} else {
if (_local3.effect == ModPlayerTrigger.SET_VOLUME){
_local2.volume = _local3.effectParam;
};
};
};
};
if (_local3.effect == ModPlayerTrigger.PATTERN_BREAK){
_local6 = _local3.effectParam;
};
};
_local4++;
};
if (_local6 > -1){
row = _local6;
if (++pattern >= modFormat.sequence.length){
pattern = 0;
};
} else {
row++;
};
if (row > 63){
row = 0;
if (++pattern >= modFormat.sequence.length){
pattern = 0;
};
};
};
_local9 = false;
if (--amigatick < 0){
amigatick = (amigatick + ((rate * 2.5) / bpm));
_local9 = true;
};
_local5 = 0;
_local4 = 0;
while (_local4 < 4) {
_local2 = channels[_local4];
if (_local9){
_local2.volume = (_local2.volume + _local2.volumeSlide);
if (_local2.volume < 0){
_local2.volume = 0;
} else {
if (_local2.volume > 64){
_local2.volume = 64;
};
};
};
if (_local2.effectParam > 0){
_local10 = _local2.effect;
if (_local9){
if (_local10 == ModPlayerTrigger.ARPEGGIO){
_local11 = (++apeggio % 3);
if (_local11 == 2){
_local2.period = _local2.recomputePeriodFromToneOffset((_local2.effectParam & 15));
} else {
if (_local11 == 1){
_local2.period = _local2.recomputePeriodFromToneOffset((_local2.effectParam >> 4));
} else {
if (_local11 == 0){
_local2.period = _local2.recomputePeriodFromToneOffset(0);
};
};
};
} else {
if (_local10 == ModPlayerTrigger.SLIDE_UP){
_local2.period = (_local2.period - _local2.effectParam);
} else {
if (_local10 == ModPlayerTrigger.SLIDE_DN){
_local2.period = (_local2.period + _local2.effectParam);
};
};
};
};
};
if (_local2.waveform){
_local12 = ((_local2.position * 80) / _local2.period);
if (_local12 >= _local2.waveform.length){
if (_local2.repeatEnd == 0){
trace("STOP");
_local2.waveform = null;
break;
} else {
if (_local2.repeatEnd > 0){
_local13 = new ByteArray();
_local13.writeBytes(_local2.waveform, _local2.repeatStart, _local2.repeatEnd);
_local2.waveform = _local13;
_local2.repeatEnd = -1;
_local2.waveform.position = (_local12 % _local2.waveform.length);
} else {
if (_local2.repeatEnd == -1){
_local2.waveform.position = (_local12 % _local2.waveform.length);
};
};
};
} else {
_local2.waveform.position = _local12;
};
_local5 = (_local5 + ((_local2.waveform.readByte() / 0xFF) * (_local2.volume / 64)));
_local2.position++;
};
_local4++;
};
if (_local5 > 1){
_local5 = 1;
} else {
if (_local5 < -1){
_local5 = -1;
};
};
buffer.writeShort((_local5 * 32767));
buffer.writeShort((_local5 * 32767));
_local8++;
};
}
public function loadMod(_arg1:ModFormat):void{
this.modFormat = _arg1;
}
}
}//package de.popforge.audio.source.modplayer
Section 9
//ModPlayerTrigger (de.popforge.audio.source.modplayer.ModPlayerTrigger)
package de.popforge.audio.source.modplayer {
import flash.utils.*;
import de.popforge.format.mod.tags.*;
public final class ModPlayerTrigger {
public var repeatEnd:int;
public var period:Number;
public var effect:int;
private var modTrigger:ModTrigger;
public var volume:int;
public var repeatStart:int;
public var position:int;
private var tone:Number;
public var volumeSlide:int;
public var effectParam:int;
public var waveform:ByteArray;
public static const POSITION_JUMP:int = 11;
public static const SLIDE_UP:int = 1;
public static const TONE_PORTAMENTO_VOLUME_SLIDE:int = 5;
private static const table:Array = [856, 808, 762, 720, 678, 640, 604, 570, 538, 508, 480, 453, 428, 404, 381, 360, 339, 320, 302, 285, 269, 254, 240, 226, 214, 202, 190, 180, 170, 160, 151, 143, 135, 127, 120, 113];
public static const SAMPLE_OFFSET:int = 9;
public static const VIBRATO_VOLUME_SLIDE:int = 6;
public static const PATTERN_BREAK:int = 13;
public static const VIBRATO:int = 4;
public static const EXTENDED_EFFECTS:int = 14;
public static const SET_SPEED:int = 15;
public static const ARPEGGIO:int = 0;
public static const TREMOLO:int = 7;
public static const SET_PANNING:int = 8;
public static const SET_VOLUME:int = 12;
public static const SLIDE_DN:int = 2;
public static const VOLUME_SLIDE:int = 10;
public static const TONE_PORTAMENTO:int = 3;
public function draw(_arg1:ModTrigger):void{
if (_arg1.modSample){
waveform = _arg1.modSample.waveform;
repeatStart = _arg1.modSample.repeatStart;
repeatEnd = _arg1.modSample.repeatEnd;
volume = _arg1.modSample.volume;
position = 0;
};
if (_arg1.period > 0){
period = _arg1.period;
computeTone();
};
effect = _arg1.effect;
effectParam = _arg1.effectParam;
volumeSlide = 0;
}
public function computeTone():void{
var _local1:int;
_local1 = 36;
while (--_local1 > -1) {
if (table[_local1] == period){
tone = _local1;
return;
};
};
}
public function recomputePeriodFromToneOffset(_arg1:int):Number{
return (table[(tone + _arg1)]);
}
}
}//package de.popforge.audio.source.modplayer
Section 10
//MonoSys (de.popforge.audio.source.monosys.MonoSys)
package de.popforge.audio.source.monosys {
import flash.utils.*;
import de.popforge.audio.envelope.*;
import de.popforge.audio.*;
import de.popforge.audio.source.*;
public final class MonoSys implements ISource {
private var buffer:ByteArray;
private var adsr:ADSR;
private var patternStep:int;// = 0
private var pattern:Array;
private var si:int;// = 0
private var ftl:FilterTransform;
private var bpm:Number;
private var rate:Number;
private var waveStep:Number;// = 0
private var slide:Number;
private var freq:Number;
private var waveform:int;// = 0
public static const WAVEFORM_SAWTOOTH:int = 0;
public static const WAVEFORM_SINUS:int = 2;
public static const WAVEFORM_SQUARE:int = 1;
public function MonoSys(_arg1:int){
waveform = WAVEFORM_SAWTOOTH;
waveStep = 0;
si = 0;
pattern = [new MonoSysTrigger(4, 0, false)];
patternStep = 0;
super();
this.rate = _arg1;
buffer = new ByteArray();
buffer.endian = Endian.LITTLE_ENDIAN;
adsr = new ADSR(32, 0x2000, 0.5, 0x4000);
ftl = new FilterTransform(0.2, 0.9);
}
public function getFilterTransform():FilterTransform{
return (ftl);
}
public function getADSR():ADSR{
return (adsr);
}
public function shufflePattern():void{
var _local1:MonoSysTrigger;
var _local2:Boolean;
var _local3:int;
_local2 = false;
pattern = new Array();
_local3 = 0;
while (_local3 < 8) {
if (Math.random() < 0.8){
_local1 = new MonoSysTrigger((2 + Math.floor((Math.random() * 4))), (1 + Math.floor((Math.random() * 12))), (Math.random() < 0.1));
if (_local1.portamento){
_local2 = true;
};
} else {
_local1 = null;
};
pattern.push(_local1);
_local3++;
};
if (!_local2){
shufflePattern();
};
}
public function setBPM(_arg1:Number):void{
this.bpm = _arg1;
}
public function getBuffer():ByteArray{
return (buffer);
}
public function clearBuffer():void{
buffer.length = 0;
}
public function renderBuffer(_arg1:int):void{
var _local2:Number;
var _local3:int;
var _local4:Number;
var _local5:MonoSysTrigger;
var _local6:int;
var _local7:Number;
_local3 = 0;
while (_local3 < _arg1) {
if (--si < 0){
si = (si + ((rate * 15) / bpm));
_local5 = pattern[patternStep];
if (_local5 != null){
freq = (440 * Math.pow(2, ((_local5.octave - 3) + ((_local5.tone - 9) / 12))));
adsr.restart();
ftl.envelope.restart();
waveStep = 0;
slide = 0;
if (_local5.portamento){
_local6 = 0;
while (pattern[(++_local6 + patternStep)] == null) {
if (_local6 > 7){
break;
};
};
if (_local6 < 8){
_local5 = pattern[(_local6 + patternStep)];
_local7 = (440 * Math.pow(2, ((_local5.octave - 4) + ((_local5.tone - 10) / 12))));
slide = (((_local7 - freq) / ((rate * 15) / bpm)) / _local6);
};
};
};
patternStep++;
patternStep = (patternStep % 8);
};
waveStep++;
freq = (freq + slide);
_local4 = (waveStep / ((rate * 2) / freq));
switch (waveform){
case WAVEFORM_SAWTOOTH:
_local2 = (int((_local4 + 0.5)) - _local4);
break;
case WAVEFORM_SQUARE:
_local2 = (_local4 - int(_local4));
if (_local2 < 0.5){
_local2 = -0.5;
} else {
if (_local2 > 0.5){
_local2 = 0.5;
};
};
break;
case WAVEFORM_SINUS:
_local2 = (Math.sin((_local4 * (Math.PI * 2))) / 2);
break;
};
_local2 = (ftl.lowPass(_local2) * adsr.getNextFrameValue());
if (_local2 > 1){
_local2 = 1;
} else {
if (_local2 < -1){
_local2 = -1;
};
};
buffer.writeShort((_local2 * 32767));
buffer.writeShort((_local2 * 32767));
_local3++;
};
}
}
}//package de.popforge.audio.source.monosys
Section 11
//MonoSysTrigger (de.popforge.audio.source.monosys.MonoSysTrigger)
package de.popforge.audio.source.monosys {
public final class MonoSysTrigger {
public var octave:uint;
public var tone:uint;
public var portamento:Boolean;
public function MonoSysTrigger(_arg1:uint=4, _arg2:uint=0, _arg3:Boolean=false){
this.octave = _arg1;
this.tone = _arg2;
this.portamento = _arg3;
}
}
}//package de.popforge.audio.source.monosys
Section 12
//Perlin (de.popforge.audio.source.perlin.Perlin)
package de.popforge.audio.source.perlin {
import flash.utils.*;
import de.popforge.audio.envelope.*;
import flash.display.*;
import de.popforge.audio.source.*;
public final class Perlin implements ISource {
private var buffer:ByteArray;
private var adsr:ADSR;
public var perlinBase:Number;// = 0x0200
private var bmp:BitmapData;
private var perlinStep:int;// = 0
private var pattern:Array;
private var si:int;// = 0
private var bpm:Number;
private var rate:Number;
public var perlinOctave:uint;// = 4
public var perlinSeed:uint;// = 1
private var slide:Number;
private var freq:Number;
private var patternStep:int;// = 0
public var perlinFractal:Boolean;// = false
public function Perlin(_arg1:Number){
perlinBase = 0x0200;
perlinSeed = 1;
perlinOctave = 4;
perlinFractal = false;
perlinStep = 0;
si = 0;
pattern = [new PerlinTrigger(4, 0, false), null, new PerlinTrigger(5, 7, false), new PerlinTrigger(5, 3, false), new PerlinTrigger(5, 0, false), null, new PerlinTrigger(4, 7, false), null];
patternStep = 0;
super();
this.rate = _arg1;
buffer = new ByteArray();
buffer.endian = Endian.LITTLE_ENDIAN;
adsr = new ADSR(32, 0x2000, 0.5, 0x4000);
adsr.attack = 64;
adsr.sustain = 1;
adsr.release = 0x1000;
bmp = new BitmapData(0x0800, 1, false, 0);
updatePerlin();
}
public function updatePerlin():void{
bmp.perlinNoise(perlinBase, perlinBase, perlinOctave, perlinSeed, true, perlinFractal, BitmapDataChannel.BLUE, false);
}
public function shufflePattern():void{
var _local1:PerlinTrigger;
var _local2:Boolean;
var _local3:int;
_local2 = false;
pattern = new Array();
_local3 = 0;
while (_local3 < 8) {
if (Math.random() < 0.8){
_local1 = new PerlinTrigger((2 + Math.floor((Math.random() * 4))), (1 + Math.floor((Math.random() * 12))), (Math.random() < 0.1));
if (_local1.portamento){
_local2 = true;
};
} else {
_local1 = null;
};
pattern.push(_local1);
_local3++;
};
if (!_local2){
shufflePattern();
};
}
public function clearBuffer():void{
buffer.length = 0;
}
public function getBuffer():ByteArray{
return (buffer);
}
public function setBPM(_arg1:Number):void{
this.bpm = _arg1;
}
public function renderBuffer(_arg1:int):void{
var _local2:PerlinTrigger;
var _local3:Number;
var _local4:int;
var _local5:Number;
var _local6:int;
var _local7:Number;
_local4 = 0;
while (_local4 < _arg1) {
if (--si < 0){
si = (si + ((rate * 15) / bpm));
_local2 = pattern[patternStep];
if (_local2 != null){
freq = (440 * Math.pow(2, ((_local2.octave - 3) + ((_local2.tone - 9) / 12))));
adsr.restart();
perlinStep = 0;
slide = 0;
if (_local2.portamento){
_local6 = 0;
while (pattern[(++_local6 + patternStep)] == null) {
if (_local6 > 7){
break;
};
};
if (_local6 < 8){
_local2 = pattern[(_local6 + patternStep)];
_local7 = (440 * Math.pow(2, ((_local2.octave - 4) + ((_local2.tone - 10) / 12))));
slide = (((_local7 - freq) / ((rate * 15) / bpm)) / _local6);
};
};
};
patternStep++;
patternStep = (patternStep % 8);
};
perlinStep++;
freq = (freq + slide);
_local5 = (perlinStep / ((rate * 2) / freq));
switch (perlinFractal){
case true:
_local3 = ((bmp.getPixel(((_local5 * 0x0400) & 2047), 0) / 64) - 2);
break;
case false:
_local3 = ((bmp.getPixel(((_local5 * 0x0400) & 2047), 0) / 63) - 0.5);
break;
};
_local3 = (_local3 * adsr.getNextFrameValue());
if (_local3 > 1){
_local3 = 1;
} else {
if (_local3 < -1){
_local3 = -1;
};
};
buffer.writeShort((_local3 * 32767));
buffer.writeShort((_local3 * 32767));
_local4++;
};
}
}
}//package de.popforge.audio.source.perlin
Section 13
//PerlinTrigger (de.popforge.audio.source.perlin.PerlinTrigger)
package de.popforge.audio.source.perlin {
public final class PerlinTrigger {
public var octave:uint;
public var tone:uint;
public var portamento:Boolean;
public function PerlinTrigger(_arg1:uint=4, _arg2:uint=0, _arg3:Boolean=false){
this.octave = _arg1;
this.tone = _arg2;
this.portamento = _arg3;
}
}
}//package de.popforge.audio.source.perlin
Section 14
//Sampler (de.popforge.audio.source.sampler.Sampler)
package de.popforge.audio.source.sampler {
import flash.utils.*;
import de.popforge.audio.utils.*;
import de.popforge.audio.source.*;
public final class Sampler implements ISource {
private var buffer:ByteArray;
private var channelNum:int;// = 0
private var channels:Array;
private var waveforms:Array;
private var pattern:Array;
private var si:int;// = 0
private var bpm:Number;
private var rate:int;
private var patternStep:int;// = 0
public function Sampler(_arg1:int){
channelNum = 0;
si = 0;
pattern = [[new SamplerTrigger(0)], [], [new SamplerTrigger(2)], [new SamplerTrigger(1)], [new SamplerTrigger(0), new SamplerTrigger(4)], [], [new SamplerTrigger(2)], [new SamplerTrigger(1)], [new SamplerTrigger(0)], [], [new SamplerTrigger(2)], [new SamplerTrigger(1)], [new SamplerTrigger(0), new SamplerTrigger(4)], [], [new SamplerTrigger(2)], [new SamplerTrigger(1)], [new SamplerTrigger(0)], [], [new SamplerTrigger(2)], [new SamplerTrigger(1)], [new SamplerTrigger(0), new SamplerTrigger(4)], [], [new SamplerTrigger(2)], [new SamplerTrigger(1)], [new SamplerTrigger(0)], [], [new SamplerTrigger(2)], [new SamplerTrigger(1)], [new SamplerTrigger(0), new SamplerTrigger(4)], [], [new SamplerTrigger(0), new SamplerTrigger(2)], [new SamplerTrigger(1)]];
patternStep = 0;
super();
this.rate = _arg1;
buffer = new ByteArray();
buffer.endian = Endian.LITTLE_ENDIAN;
channels = new Array();
waveforms = new Array();
}
public function getBuffer():ByteArray{
return (buffer);
}
public function setBPM(_arg1:Number):void{
this.bpm = _arg1;
}
public function loadSample(_arg1:Waveform, _arg2:int):void{
waveforms[_arg2] = _arg1;
}
public function clearBuffer():void{
buffer.length = 0;
}
public function renderBuffer(_arg1:int):void{
var _local2:SamplerTrigger;
var _local3:Array;
var _local4:Number;
var _local5:Number;
var _local6:Number;
var _local7:Number;
var _local8:ByteArray;
var _local9:SamplerChannel;
var _local10:int;
_local10 = 0;
while (_local10 < _arg1) {
if (--si < 0){
si = (si + ((rate * 15) / bpm));
_local3 = pattern[patternStep];
for each (_local2 in _local3) {
if (waveforms[_local2.index]){
_local9 = new SamplerChannel(waveforms[_local2.index], Math.pow(2, ((_local2.octave - 4) + (_local2.tone / 12))), _local2.backwards);
channels[_local9.id] = _local9;
channelNum++;
};
};
patternStep++;
patternStep = (patternStep & 31);
};
_local6 = 0;
_local5 = _local6;
for each (_local9 in channels) {
_local7 = _local9.pitch;
_local8 = _local9.waveform.data;
if (_local9.position < (_local9.length / _local7)){
if (_local9.backwards){
_local8.position = (((_local9.length << _local9.waveform.channels) - int(((_local9.position * _local7) << _local9.waveform.channels))) - (2 * _local9.waveform.channels));
} else {
_local8.position = ((_local9.position * _local7) << _local9.waveform.channels);
};
if (_local9.waveform.channels == 1){
_local4 = _local8.readShort();
_local6 = (_local6 + _local4);
_local5 = (_local5 + _local4);
} else {
_local6 = (_local6 + _local8.readShort());
_local5 = (_local5 + _local8.readShort());
};
} else {
delete channels[_local9.id];
channelNum--;
};
_local9.position++;
};
if (_local6 > 32767){
_local6 = 32767;
} else {
if (_local6 < -32767){
_local6 = -32767;
};
};
if (_local5 > 32767){
_local5 = 32767;
} else {
if (_local5 < -32767){
_local5 = -32767;
};
};
buffer.writeShort(_local6);
buffer.writeShort(_local5);
_local10++;
};
}
}
}//package de.popforge.audio.source.sampler
Section 15
//SamplerChannel (de.popforge.audio.source.sampler.SamplerChannel)
package de.popforge.audio.source.sampler {
import de.popforge.audio.utils.*;
final class SamplerChannel {
public var pitch:Number;
public var length:int;
public var position:int;
public var backwards:Boolean;
public var id:int;
public var waveform:Waveform;
private static var uniqueId:int = 0;
function SamplerChannel(_arg1:Waveform, _arg2:Number, _arg3:Boolean){
this.waveform = _arg1;
this.pitch = _arg2;
this.backwards = _arg3;
length = (_arg1.data.length >> _arg1.channels);
position = 0;
id = uniqueId++;
}
}
}//package de.popforge.audio.source.sampler
Section 16
//SamplerTrigger (de.popforge.audio.source.sampler.SamplerTrigger)
package de.popforge.audio.source.sampler {
public final class SamplerTrigger {
public var octave:int;
public var index:int;
public var backwards:Boolean;
public var tone:int;
public var volume:Number;// = 1
public var pan:Number;// = 0
public function SamplerTrigger(_arg1:int, _arg2:int=4, _arg3:int=0, _arg4:Boolean=false){
volume = 1;
pan = 0;
super();
this.index = _arg1;
this.octave = _arg2;
this.tone = _arg3;
this.backwards = _arg4;
}
}
}//package de.popforge.audio.source.sampler
Section 17
//ISource (de.popforge.audio.source.ISource)
package de.popforge.audio.source {
import flash.utils.*;
public interface ISource {
function clearBuffer():void;
function renderBuffer(_arg1:int):void;
function getBuffer():ByteArray;
}
}//package de.popforge.audio.source
Section 18
//Sample (de.popforge.audio.utils.Sample)
package de.popforge.audio.utils {
public class Sample {
public var r:Number;
public var l:Number;
public function Sample(_arg1:Number=0, _arg2:Number=0){
this.l = _arg1;
this.r = _arg2;
}
}
}//package de.popforge.audio.utils
Section 19
//SoundFactory (de.popforge.audio.utils.SoundFactory)
package de.popforge.audio.utils {
import flash.events.*;
import flash.utils.*;
import flash.media.*;
import flash.display.*;
import de.popforge.format.swf.*;
import de.popforge.format.swf.tags.*;
public class SoundFactory {
private const ModSWF:Class;
private var swf:SWFFormat;
private var swfDefSnd:DefineSound;
private var loader:Loader;
private var sound:Sound;
private var onComplete:Function;
public function SoundFactory(){
ModSWF = SoundFactory_ModSWF;
super();
swf = new SWFFormat(ByteArray(new ModSWF()));
swfDefSnd = DefineSound(swf.assets[1]);
loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSWFLoaded);
}
private function onSWFLoaded(_arg1:Event):void{
var clazz:Class;
var event = _arg1;
try {
clazz = (loader.contentLoaderInfo.applicationDomain.getDefinition("SoundItem") as Class);
} catch(e:Error) {
};
if (clazz){
sound = Sound(new (clazz));
} else {
sound = null;
};
onComplete(this);
}
public function getSound():Sound{
return (sound);
}
public static function generate(_arg1:ByteArray, _arg2:uint, _arg3:uint, _arg4:uint, _arg5:Function):void{
var _local6:SoundFactory;
_local6 = new (SoundFactory);
_local6.swfDefSnd.setChannels(_arg2);
_local6.swfDefSnd.setBits(_arg3);
_local6.swfDefSnd.setRate(_arg4);
_local6.swfDefSnd.overrideSamples(_arg1);
_local6.loader.loadBytes(_local6.swf.save());
_local6.onComplete = _arg5;
}
}
}//package de.popforge.audio.utils
Section 20
//SoundFactory_ModSWF (de.popforge.audio.utils.SoundFactory_ModSWF)
package de.popforge.audio.utils {
import mx.core.*;
public class SoundFactory_ModSWF extends ByteArrayAsset {
}
}//package de.popforge.audio.utils
Section 21
//Waveform (de.popforge.audio.utils.Waveform)
package de.popforge.audio.utils {
import flash.utils.*;
public class Waveform {
public var bits:uint;
public var data:ByteArray;
public var rate:uint;
public var channels:uint;
public static const MONO:uint = 1;
public static const BIT_8:uint = 8;
public static const KHZ_22050:uint = 22050;
public static const KHZ_5512:uint = 5512;
public static const KHZ_44100:uint = 44100;
public static const KHZ_11025:uint = 11025;
public static const BIT_16:uint = 16;
public static const STEREO:uint = 2;
public function Waveform(_arg1:uint, _arg2:uint, _arg3:uint, _arg4:ByteArray){
this.channels = _arg1;
this.bits = _arg2;
this.rate = _arg3;
this.data = _arg4;
}
}
}//package de.popforge.audio.utils
Section 22
//FilterTransform (de.popforge.audio.FilterTransform)
package de.popforge.audio {
import de.popforge.audio.envelope.*;
public final class FilterTransform {
public var cutoff:Number;// = 0
public var out:Number;// = 0
public var envelope:ADSR;
public var resonance:Number;// = 0
private var vel:Number;// = 0
public function FilterTransform(_arg1:Number=1, _arg2:Number=0){
cutoff = 0;
resonance = 0;
out = 0;
vel = 0;
super();
this.cutoff = _arg1;
this.resonance = _arg2;
envelope = new ADSR(32, 0x0800, 0.25, 5096);
}
public function lowPass(_arg1:Number):Number{
vel = (vel * resonance);
vel = (vel + ((_arg1 - out) * (cutoff * envelope.getNextFrameValue())));
out = (out + vel);
if (out > 1){
out = 1;
} else {
if (out < -1){
out = -1;
};
};
return (out);
}
}
}//package de.popforge.audio
Section 23
//ModSample (de.popforge.format.mod.tags.ModSample)
package de.popforge.format.mod.tags {
import flash.utils.*;
public final class ModSample {
public var repeatEnd:int;
public var length:int;
public var repeatStart:int;
public var tone:int;
public var title:String;
public var volume:int;
public var waveform:ByteArray;
public function ModSample(_arg1:ByteArray){
parse(_arg1);
}
public function loadWaveform(_arg1:ByteArray):void{
if (length == 0){
return;
};
waveform = new ByteArray();
_arg1.readBytes(waveform, 0, length);
}
private function parse(_arg1:ByteArray):void{
var _local2:int;
var _local3:uint;
_arg1.position = 0;
title = "";
_local2 = 0;
while (_local2 < 22) {
_local3 = uint(_arg1.readByte());
if (_local3 != 0){
title = (title + String.fromCharCode(_local3));
};
_local2++;
};
length = _arg1.readUnsignedShort();
tone = _arg1.readUnsignedByte();
volume = _arg1.readUnsignedByte();
repeatStart = _arg1.readUnsignedShort();
repeatEnd = _arg1.readUnsignedShort();
length = (length << 1);
repeatStart = (repeatStart << 1);
repeatEnd = (repeatEnd << 1);
}
public function toString():String{
return (((((((((((((("[MOD Sample" + " title: ") + title) + ", length: ") + length) + ", tone: ") + tone) + ", volume: ") + volume) + ", repeatStart: ") + repeatStart) + ", repeatEnd: ") + repeatEnd) + "]"));
}
}
}//package de.popforge.format.mod.tags
Section 24
//ModTrigger (de.popforge.format.mod.tags.ModTrigger)
package de.popforge.format.mod.tags {
import flash.utils.*;
public final class ModTrigger {
public var period:uint;
public var modSample:ModSample;
public var effect:uint;
public var effectParam:uint;
public function ModTrigger(_arg1:ByteArray, _arg2:Array){
parse(_arg1, _arg2);
}
private function parse(_arg1:ByteArray, _arg2:Array):void{
var _local3:int;
var _local4:int;
var _local5:int;
var _local6:int;
_local3 = _arg1.readUnsignedByte();
_local4 = _arg1.readUnsignedByte();
_local5 = _arg1.readUnsignedByte();
_local6 = _arg1.readUnsignedByte();
modSample = _arg2[Math.abs(((_local3 & 240) | (_local5 >> 4)))];
period = Math.abs((((_local3 & 15) << 8) + _local4));
effect = Math.abs((_local5 & 15));
effectParam = _local6;
}
public function toString():String{
return (((((((((("[MOD Trigger" + " modSample: ") + modSample) + ", period: ") + period) + ", effect: ") + effect) + ", effectParam: ") + effectParam) + "]"));
}
}
}//package de.popforge.format.mod.tags
Section 25
//ModFormat (de.popforge.format.mod.ModFormat)
package de.popforge.format.mod {
import flash.utils.*;
import de.popforge.format.mod.tags.*;
public final class ModFormat {
private const P_FORMAT:uint = 1080;
private const P_SEQUENCE:uint = 952;
private const P_PATTERNS:uint = 1084;
private const P_LENGTH:uint = 950;
public var sequence:Array;
public var title:String;
public var patterns:Array;
public var modSamples:Array;
public var length:uint;
public var format:String;
public function ModFormat(_arg1:ByteArray=null){
patterns = new Array();
sequence = new Array();
modSamples = new Array(32);
format = "";
title = "";
if (_arg1 != null){
load(_arg1);
};
}
public function load(_arg1:ByteArray):void{
parse(_arg1);
}
private function parse(_arg1:ByteArray):void{
var _local2:int;
var _local3:int;
var _local4:ByteArray;
var _local5:ModSample;
var _local6:uint;
var _local7:int;
var _local8:int;
_arg1.endian = Endian.LITTLE_ENDIAN;
_arg1.position = P_FORMAT;
_local2 = 0;
format = (((String.fromCharCode(_arg1.readByte()) + String.fromCharCode(_arg1.readByte())) + String.fromCharCode(_arg1.readByte())) + String.fromCharCode(_arg1.readByte()));
if (format.toLocaleLowerCase() != "m.k."){
throw (new Error("Unsupported MOD format"));
};
title = "";
_arg1.position = 0;
_local3 = 0;
while (_local3 < 20) {
_local6 = _arg1.readUnsignedByte();
if (_local6 == 0){
break;
};
title = (title + String.fromCharCode(_local6));
_local3++;
};
_arg1.position = P_LENGTH;
length = _arg1.readUnsignedByte();
_local4 = new ByteArray();
_local3 = 1;
while (_local3 <= 31) {
_arg1.position = (((_local3 - 1) * 30) + 20);
_local4.position = 0;
_arg1.readBytes(_local4, 0, 30);
modSamples[_local3] = new ModSample(_local4);
_local3++;
};
_arg1.position = P_SEQUENCE;
sequence = new Array(length);
_local3 = 0;
while (_local3 < length) {
sequence[_local3] = _arg1.readUnsignedByte();
if (sequence[_local3] > _local2){
_local2 = sequence[_local3];
};
_local3++;
};
_local3 = 0;
while (_local3 < (_local2 + 1)) {
_arg1.position = (P_PATTERNS + (_local3 * 0x0400));
patterns[_local3] = new Array(64);
_local7 = 0;
while (_local7 < 64) {
patterns[_local3][_local7] = new Array(4);
_local8 = 0;
while (_local8 < 4) {
patterns[_local3][_local7][_local8] = new ModTrigger(_arg1, modSamples);
_local8++;
};
_local7++;
};
_local3++;
};
_local3 = 1;
while (_local3 <= 31) {
_local5 = ModSample(modSamples[_local3]);
_local5.loadWaveform(_arg1);
_local3++;
};
}
}
}//package de.popforge.format.mod
Section 26
//DefineSound (de.popforge.format.swf.tags.DefineSound)
package de.popforge.format.swf.tags {
import flash.utils.*;
public class DefineSound extends Tag {
public var sampleCount:uint;
public var samples:ByteArray;
public var sampleBits:uint;
public var sampleChannels:uint;
public var sampleRate:uint;
public var assetId:uint;
public var formatId:uint;
public static const SAMPLERATES:Array = ["5.5 kHz", "11 kHz", "22 kHz", "44 kHz"];
public static const TYPES:Array = ["sndMono", "sndStereo"];
public static const FORMATS:Array = ["uncompressed", "ADPCM", "MP3", "uncompressed little endian", null, null, "Nellymoser"];
public static const SAMPLESIZES:Array = ["snd8Bit", "snd16Bit"];
public function DefineSound(_arg1:uint, _arg2:ByteArray, _arg3:uint, _arg4:uint){
super(_arg1, _arg2, _arg3, _arg4);
parse();
}
private function parse():void{
var _local1:int;
var _local2:uint;
var _local3:int;
assetId = bytes.readUnsignedShort();
resetBits();
formatId = getBits(bytes, 4);
sampleRate = getBits(bytes, 2);
sampleBits = getBits(bytes, 1);
sampleChannels = getBits(bytes, 1);
sampleCount = bytes.readUnsignedInt();
_local1 = sampleCount;
if (sampleBits == 16){
_local1 = (_local1 << 1);
};
if (sampleChannels == 2){
_local1 = (_local1 << 1);
};
samples = new ByteArray();
_local2 = bytes.position;
_local3 = 0;
while (_local3 < _local1) {
samples[_local3] = bytes[(_local2 + _local3)];
_local3++;
};
resetBits();
}
public function setBits(_arg1:uint):void{
switch (_arg1){
case 8:
bytes[2] = (bytes[2] - (bytes[2] & 2));
break;
case 16:
bytes[2] = (bytes[2] | 2);
break;
default:
trace("[Error] SWF only supports 8BIT and 16BIT.");
};
sampleBits = _arg1;
}
public function setChannels(_arg1:uint):void{
switch (_arg1){
case 1:
bytes[2] = (bytes[2] - (bytes[2] & 1));
break;
case 2:
bytes[2] = (bytes[2] | 1);
break;
default:
trace("[Error] SWF only supports MONO and STEREO.");
};
sampleChannels = _arg1;
}
public function setRate(_arg1:uint):void{
switch (_arg1){
case 44100:
bytes[2] = (bytes[2] & 243);
bytes[2] = (bytes[2] | 12);
break;
case 22050:
bytes[2] = (bytes[2] & 243);
bytes[2] = (bytes[2] | 8);
break;
case 11025:
bytes[2] = (bytes[2] & 243);
bytes[2] = (bytes[2] | 4);
break;
case 5512:
bytes[2] = (bytes[2] & 243);
break;
default:
trace("[Error] Samplingrate not supported by SWF.");
};
sampleRate = _arg1;
}
public function overrideSamples(_arg1:ByteArray):void{
_arg1.position = 0;
sampleCount = _arg1.length;
if (sampleBits == 16){
sampleCount = (sampleCount >> 1);
};
if (sampleChannels == 2){
sampleCount = (sampleCount >> 1);
};
bytes.position = 3;
bytes.writeUnsignedInt(sampleCount);
bytes.length = 7;
bytes.writeBytes(_arg1);
bytes.position = 0;
}
public function toString():String{
return (((((((((((((("[DefineSound" + " assetId: ") + assetId) + ", format: ") + FORMATS[formatId]) + ", sampleRate: ") + SAMPLERATES[sampleRate]) + ", sampleBits: ") + SAMPLESIZES[sampleBits]) + ", sampleChannels: ") + TYPES[sampleChannels]) + ", sampleCount: ") + sampleCount) + "]"));
}
}
}//package de.popforge.format.swf.tags
Section 27
//ExportAsset (de.popforge.format.swf.tags.ExportAsset)
package de.popforge.format.swf.tags {
import flash.utils.*;
public class ExportAsset extends Tag {
public function ExportAsset(_arg1:uint, _arg2:ByteArray, _arg3:uint, _arg4:uint){
super(_arg1, _arg2, _arg3, _arg4);
parse();
}
private function parse():void{
var _local1:uint;
var _local2:uint;
var _local3:String;
var _local4:uint;
var _local5:uint;
_local1 = bytes.readUnsignedShort();
_local3 = new String("");
_local5 = 0;
while (_local5 < _local1) {
_local3 = "";
_local2 = bytes.readUnsignedShort();
while (true) {
_local4 = bytes.readByte();
if (_local4){
_local3 = (_local3 + String.fromCharCode(_local4));
} else {
break;
};
};
_local5++;
};
bytes.position = 0;
resetBits();
}
}
}//package de.popforge.format.swf.tags
Section 28
//Header (de.popforge.format.swf.tags.Header)
package de.popforge.format.swf.tags {
import flash.utils.*;
import flash.geom.*;
public class Header extends Tag {
public var compressed:Boolean;
public var fileLength:uint;
public var frameRate:Number;
public var frameSize:Rectangle;
public var frameCount:uint;
public var version:uint;
public function Header(_arg1:uint, _arg2:ByteArray, _arg3:uint, _arg4:uint){
super(_arg1, _arg2, _arg3, _arg4);
parse();
}
private function parse():void{
bytes.position = 0;
compressed = (bytes.readUTFBytes(1) == "C");
if (compressed){
trace("compressed SWF are not supported yet.");
return;
};
bytes.position = (bytes.position + 2);
version = bytes.readByte();
fileLength = bytes.readUnsignedInt();
frameSize = readRectangle(bytes);
frameRate = (bytes.readUnsignedShort() / 0x0100);
frameCount = bytes.readUnsignedShort();
}
public function toString():String{
return (((((((((((((("[SWF Header" + " compressed: ") + compressed) + ", version: ") + version) + ", fileLength: ") + fileLength) + ", frameSize: ") + frameSize) + ", frameRate: ") + frameRate) + ", frameCount: ") + frameCount) + "]"));
}
public function changeFileLength(_arg1:uint):void{
bytes.position = 4;
bytes.writeUnsignedInt(_arg1);
bytes.position = 0;
}
}
}//package de.popforge.format.swf.tags
Section 29
//Tag (de.popforge.format.swf.tags.Tag)
package de.popforge.format.swf.tags {
import flash.utils.*;
import flash.geom.*;
public class Tag {
public var id:uint;
public var bytes:ByteArray;
public static const BGCOLOR:int = 9;
public static const SOUND:int = 14;
public static const EXPORT_ASSETS:int = 56;
public static const END:int = 0;
public static var bitPos:uint;
public static var bitBuffer:uint;
public function Tag(_arg1:uint, _arg2:ByteArray, _arg3:uint, _arg4:uint){
this.id = _arg1;
bytes = new ByteArray();
bytes.endian = Endian.LITTLE_ENDIAN;
_arg2.readBytes(bytes, 0, _arg4);
bytes.position = 0;
}
public function writeBack(_arg1:ByteArray):void{
var _local2:uint;
var _local3:uint;
bytes.position = 0;
if (!(this is Header)){
_local2 = (id << 6);
_local3 = bytes.length;
if (_local3 < 63){
_local2 = (_local2 | _local3);
_arg1.writeShort(_local2);
} else {
_local2 = (_local2 | 63);
_arg1.writeShort(_local2);
_arg1.writeUnsignedInt(_local3);
};
};
_arg1.writeBytes(bytes, 0, bytes.length);
}
public static function resetBits():void{
bitPos = 8;
}
public static function getBits(_arg1:ByteArray, _arg2:int):int{
var _local3:int;
var _local4:int;
_local3 = 0;
while (_arg2 >= 1) {
if (bitPos == 8){
bitPos = 0;
bitBuffer = _arg1.readByte();
};
_local3 = (_local3 << 1);
_local4 = (128 >> bitPos);
_local3 = (_local3 | (((bitBuffer & _local4) == _local4)) ? 1 : 0);
_arg2--;
bitPos = (bitPos + 1);
};
return (_local3);
}
public static function readRectangle(_arg1:ByteArray):Rectangle{
var _local2:int;
var _local3:Number;
var _local4:Number;
var _local5:Number;
var _local6:Number;
resetBits();
_local2 = getBits(_arg1, 5);
_local3 = getBits(_arg1, _local2);
_local4 = (getBits(_arg1, _local2) / 20);
_local5 = getBits(_arg1, _local2);
_local6 = (getBits(_arg1, _local2) / 20);
resetBits();
return (new Rectangle(_local3, _local5, (_local4 - _local3), (_local6 - _local5)));
}
}
}//package de.popforge.format.swf.tags
Section 30
//UnknownTag (de.popforge.format.swf.tags.UnknownTag)
package de.popforge.format.swf.tags {
import flash.utils.*;
public class UnknownTag extends Tag {
public function UnknownTag(_arg1:uint, _arg2:ByteArray, _arg3:uint, _arg4:uint){
super(_arg1, _arg2, _arg3, _arg4);
}
}
}//package de.popforge.format.swf.tags
Section 31
//SWFFormat (de.popforge.format.swf.SWFFormat)
package de.popforge.format.swf {
import flash.utils.*;
import de.popforge.format.swf.tags.*;
public class SWFFormat {
public var assets:Array;
public var header:Header;
public var tags:Array;
public var bgColor:uint;
public function SWFFormat(_arg1:ByteArray=null){
tags = new Array();
assets = new Array();
if (_arg1 != null){
load(_arg1);
};
}
private function parse(_arg1:ByteArray):void{
var _local2:uint;
var _local3:uint;
var _local4:uint;
var _local5:uint;
var _local6:Boolean;
var _local7:Tag;
_arg1.endian = Endian.LITTLE_ENDIAN;
_arg1.position = 0;
header = new Header(0, _arg1, 0, 21);
tags.push(header);
_local6 = false;
while (!(_local6)) {
_local2 = _arg1.readUnsignedShort();
_local3 = (_local2 >> 6);
_local4 = (_local2 & 63);
if (_local4 == 63){
_local4 = _arg1.readUnsignedInt();
};
_local5 = _arg1.position;
switch (_local3){
case 9:
case 41:
case 43:
case 56:
case 65:
break;
case Tag.END:
_local6 = true;
_local7 = new Tag(_local3, _arg1, _local5, _local4);
tags.push(_local7);
break;
case Tag.SOUND:
_local7 = new DefineSound(_local3, _arg1, _local5, _local4);
tags.push(_local7);
assets[DefineSound(_local7).assetId] = DefineSound(_local7);
break;
case Tag.EXPORT_ASSETS:
_local7 = new ExportAsset(_local3, _arg1, _local5, _local4);
tags.push(_local7);
break;
default:
_local7 = new UnknownTag(_local3, _arg1, _local5, _local4);
tags.push(_local7);
break;
};
if (_arg1.position == _arg1.length){
trace("EOF", _arg1.position);
return;
};
_arg1.position = (_local5 + _local4);
};
}
public function traceTags():void{
var _local1:Tag;
trace("<<< SWF >>>");
for each (_local1 in tags) {
trace(_local1);
};
}
public function load(_arg1:ByteArray):void{
parse(_arg1);
}
private function readRGB(_arg1:ByteArray):uint{
return ((((_arg1.readUnsignedByte() << 16) | (_arg1.readUnsignedByte() << 8)) | _arg1.readUnsignedByte()));
}
public function save():ByteArray{
var _local1:ByteArray;
var _local2:Tag;
_local1 = new ByteArray();
_local1.endian = Endian.LITTLE_ENDIAN;
for each (_local2 in tags) {
_local2.writeBack(_local1);
};
_local1.position = 4;
_local1.writeUnsignedInt(_local1.length);
_local1.position = 0;
return (_local1);
}
}
}//package de.popforge.format.swf
Section 32
//ByteArrayAsset (mx.core.ByteArrayAsset)
package mx.core {
import flash.utils.*;
public class ByteArrayAsset extends ByteArray implements IFlexAsset {
mx_internal static const VERSION:String = "2.0.0.0";
}
}//package mx.core
Section 33
//IFlexAsset (mx.core.IFlexAsset)
package mx.core {
public interface IFlexAsset {
}
}//package mx.core
Section 34
//mx_internal (mx.core.mx_internal)
package mx.core {
public namespace mx_internal = "http://www.adobe.com/2006/flex/mx/internal";
}//package mx.core
Section 35
//DefaultTextFormat (DefaultTextFormat)
package {
import flash.text.*;
public class DefaultTextFormat extends TextFormat {
public function DefaultTextFormat(){
color = 0x666666;
size = 10;
bold = true;
font = "Verdana";
}
}
}//package
Section 36
//Main (Main)
package {
import flash.events.*;
import flash.utils.*;
import de.popforge.audio.source.mixer.*;
import de.popforge.audio.utils.*;
import de.popforge.format.mod.*;
import flash.display.*;
import de.popforge.audio.output.*;
import de.popforge.audio.source.sampler.*;
import de.popforge.audio.source.monosys.*;
import de.popforge.audio.source.perlin.*;
import flash.text.*;
import de.popforge.audio.source.modplayer.*;
import de.popforge.audio.filters.*;
public class Main extends Sprite {
private const mod:Class;
private var sampler:Sampler;
private var mixer:Mixer;
private var monosys:MonoSys;
private var perlin:Perlin;
private var debug:TextField;
private var modPlayer:ModPlayer;
private var delay:Delay;
private var host:Host;
private var splitter:RenderSplitter;
private var bpm:Number;// = 125
public function Main(){
bpm = 125;
mod = Main_mod;
super();
buildAudio();
buildGUI();
}
private function onPotiChanged(_arg1:Event):void{
var _local2:Potentiometer;
var _local3:Number;
_local2 = Potentiometer(_arg1.target);
_local3 = _local2.getValue();
switch (_local2.type){
case "BPM":
bpm = _local3;
monosys.setBPM(bpm);
sampler.setBPM(bpm);
delay.setBPM(bpm);
perlin.setBPM(bpm);
modPlayer.setBPM(bpm);
break;
case "cutoff":
monosys.getFilterTransform().cutoff = _local3;
break;
case "res":
monosys.getFilterTransform().resonance = _local3;
break;
case "fattack":
monosys.getFilterTransform().envelope.attack = _local3;
break;
case "sattack":
monosys.getADSR().attack = _local3;
break;
case "fdecay":
monosys.getFilterTransform().envelope.decay = _local3;
break;
case "sdecay":
monosys.getADSR().decay = _local3;
break;
case "fsustain":
monosys.getFilterTransform().envelope.sustain = _local3;
break;
case "ssustain":
monosys.getADSR().sustain = _local3;
break;
case "frelease":
monosys.getFilterTransform().envelope.release = _local3;
break;
case "srelease":
monosys.getADSR().release = _local3;
break;
};
}
private function buildAudio():void{
var _local1:ModFormat;
var _local2:MixerChannel;
var _local3:MixerChannel;
host = new Host(8, Waveform.STEREO, Waveform.BIT_16, Waveform.KHZ_44100);
sampler = new Sampler(Waveform.KHZ_44100);
sampler.setBPM(bpm);
_local1 = new ModFormat(ByteArray(new mod()));
modPlayer = new ModPlayer(Waveform.KHZ_44100);
modPlayer.setBPM(bpm);
modPlayer.loadMod(_local1);
monosys = new MonoSys(Waveform.KHZ_44100);
monosys.setBPM(bpm);
perlin = new Perlin(Waveform.KHZ_44100);
perlin.setBPM(bpm);
_local2 = new MixerChannel(modPlayer);
_local3 = new MixerChannel(sampler);
delay = new Delay(Waveform.KHZ_44100);
delay.offsetL = 16;
delay.offsetR = 8;
delay.feedback = 0.25;
delay.mix = 0.5;
delay.setBPM(bpm);
_local2.volume = 0.75;
_local2.filters = [delay];
mixer = new Mixer();
mixer.addChannel(_local2);
splitter = new RenderSplitter(host);
splitter.setRenderSteps(8);
splitter.addSource(mixer);
splitter.addSource(modPlayer);
splitter.addEventListener(RenderSplitter.EVENT_RENDER_COMPLETE, onRenderComplete);
host.addEventListener(Host.EVENT_BUFFER_COMPLETE, splitter.onHostSync);
}
private function onRenderComplete(_arg1:Event):void{
debug.text = ("SuperMario.mod " + splitter.getLastRenderTime());
host.updateBuffer(mixer.getBuffer());
}
private function onKeyDown(_arg1:KeyboardEvent):void{
perlin.shufflePattern();
monosys.shufflePattern();
}
private function buildGUI():void{
var _local1:int;
var _local2:int;
var _local3:Potentiometer;
stage.scaleMode = StageScaleMode.NO_SCALE;
debug = new TextField();
debug.y = 4;
debug.defaultTextFormat = new DefaultTextFormat();
debug.selectable = false;
debug.autoSize = TextFieldAutoSize.LEFT;
addChild(debug);
_local1 = 0;
_local2 = 64;
_local3 = new Potentiometer(60, 300, bpm);
_local3.x = 0x0100;
_local3.y = 32;
_local3.type = "BPM";
_local3.setLabelText("BPM");
_local3.addEventListener(Potentiometer.EVENT_CHANGED, onPotiChanged);
addChild(_local3);
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
}
}
}//package
Section 37
//Main_mod (Main_mod)
package {
import mx.core.*;
public class Main_mod extends ByteArrayAsset {
}
}//package
Section 38
//Potentiometer (Potentiometer)
package {
import flash.events.*;
import flash.utils.*;
import flash.display.*;
import flash.text.*;
import flash.filters.*;
public class Potentiometer extends Sprite {
private var valueCurve:Shape;
private var angleRange:Number;
public var type:String;
private var val:Number;
private var timer:Timer;
private var min:Number;
private var labelField:TextField;
private var max:Number;
private var angleMin:Number;
private var angleMax:Number;
private var defaultValue:Number;
private var staticShape:Shape;
private var dragOffset:Number;
private var angleRatio:Number;
public static const ANGLE_MIN:Number = 2.35619449019234;
public static const ANGLE_MAX:Number = 0.785398163397448;
public static const EVENT_CHANGED:String = "onValueChanged";
public function Potentiometer(_arg1:Number=0, _arg2:Number=1, _arg3:Number=0, _arg4:Number=2.35619449019234, _arg5:Number=0.785398163397448){
this.min = _arg1;
this.max = _arg2;
defaultValue = (this.val = _arg3);
this.angleMin = _arg4;
this.angleMax = _arg5;
angleRange = (_arg5 - _arg4);
while (angleRange < 0) {
angleRange = (angleRange + (Math.PI * 2));
};
angleRatio = 0;
createBody();
setValue(_arg3);
addEventListener(Event.ADDED, onAdded);
addEventListener(Event.REMOVED, onRemoved);
timer = new Timer(5, 0);
timer.addEventListener(TimerEvent.TIMER, moveKnob);
doubleClickEnabled = true;
}
public function setLabelText(_arg1:String):void{
labelField.text = _arg1;
labelField.x = (-(labelField.textWidth) >> 1);
}
private function moveKnob(_arg1:Event):void{
angleRatio = (angleRatio + ((dragOffset - mouseY) / 0x2000));
updateValue();
}
public function setValue(_arg1:Number):void{
if (_arg1 < min){
_arg1 = min;
} else {
if (_arg1 > max){
_arg1 = max;
};
};
angleRatio = (((val = _arg1) - min) / (max - min));
drawValue(angleRatio);
}
private function updateValue():void{
if (angleRatio < 0){
angleRatio = 0;
} else {
if (angleRatio > 1){
angleRatio = 1;
};
};
val = (min + ((max - min) * angleRatio));
drawValue(angleRatio);
dispatchEvent(new Event(EVENT_CHANGED));
}
private function onMouseUp(_arg1:MouseEvent):void{
timer.stop();
}
private function drawCircleSegment(_arg1:Graphics, _arg2:Number, _arg3:Number, _arg4:Number, _arg5:Number, _arg6:Number):void{
var _local7:Number;
var _local8:Number;
var _local9:Number;
var _local10:Number;
var _local11:Number;
var _local12:Number;
var _local13:Number;
var _local14:Number;
var _local15:Number;
var _local16:Number;
var _local17:Number;
var _local18:Number;
var _local19:Number;
var _local20:int;
_local7 = _arg5;
_local9 = (_arg6 - _local7);
while (_local9 < 0) {
_local9 = (_local9 + (Math.PI * 2));
};
_local10 = Math.ceil((_local9 / (Math.PI / 4)));
_local11 = (-(_local9) / _local10);
_local12 = (-(_local11) / 2);
_local13 = Math.cos(_local12);
_local14 = (Math.cos(_local7) * _arg4);
_local15 = (Math.sin(_local7) * _arg4);
_arg1.moveTo((_local14 + _arg2), (_local15 + _arg3));
_local20 = 0;
while (_local20 < _local10) {
_local7 = (_local7 + (_local12 * 2));
_local8 = (_local7 - _local12);
_local16 = (_arg2 + (Math.cos(_local7) * _arg4));
_local17 = (_arg3 + (Math.sin(_local7) * _arg4));
_local18 = (_arg2 + (Math.cos(_local8) * (_arg4 / _local13)));
_local19 = (_arg3 + (Math.sin(_local8) * (_arg4 / _local13)));
_arg1.curveTo(_local18, _local19, _local16, _local17);
_local20++;
};
}
private function onMouseDoubleClick(_arg1:MouseEvent):void{
if (_arg1.target == this){
setValue(defaultValue);
dispatchEvent(new Event(EVENT_CHANGED));
};
}
private function onAdded(_arg1:Event):void{
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
stage.addEventListener(MouseEvent.DOUBLE_CLICK, onMouseDoubleClick);
}
private function onRemoved(_arg1:Event):void{
stage.removeEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
stage.removeEventListener(MouseEvent.DOUBLE_CLICK, onMouseDoubleClick);
}
private function drawValue(_arg1:Number):void{
var _local2:Graphics;
_local2 = valueCurve.graphics;
_local2.clear();
_local2.lineStyle(2, 0xAAAAAA, 1, false, LineScaleMode.NORMAL, CapsStyle.SQUARE);
drawCircleSegment(_local2, 0, 0, 11, angleMin, (angleMin + (angleRange * _arg1)));
}
public function getValue():Number{
return (val);
}
private function createBody():void{
var _local1:Graphics;
staticShape = new Shape();
staticShape.cacheAsBitmap = true;
addChild(staticShape);
valueCurve = new Shape();
addChild(valueCurve);
valueCurve.filters = [new GlowFilter(0xFFFFFF, 1, 4, 4, 0.5, 3)];
_local1 = staticShape.graphics;
_local1.beginFill(0x3A3A3A);
_local1.drawCircle(0, 0, 15);
_local1.endFill();
_local1.beginFill(0x565656);
_local1.lineStyle(1, 0x202020);
_local1.drawCircle(0, 0, 6);
_local1.endFill();
_local1.lineStyle(4, 1776413, 1, false, LineScaleMode.NORMAL, CapsStyle.SQUARE);
drawCircleSegment(_local1, 0, 0, 11, angleMin, (angleMin + angleRange));
labelField = new TextField();
labelField.selectable = false;
labelField.autoSize = TextFieldAutoSize.LEFT;
labelField.defaultTextFormat = new DefaultTextFormat();
labelField.y = 14;
addChild(labelField);
}
private function onMouseDown(_arg1:MouseEvent):void{
if (_arg1.target == this){
dragOffset = mouseY;
timer.start();
};
}
}
}//package