root/lang/javascript/jsmml/trunk/vendor/flmml/com/txt_nifty/sketch/flmml/MSequencer.as @ 447

Revision 447, 3.6 kB (checked in by secondlife, 6 years ago)

lang/javascript/jsmml: release 1.0.0, include flmml source.

Line 
1package com.txt_nifty.sketch.flmml {
2        import de.popforge.audio.output.*;
3        import flash.events.Event;
4        import flash.events.EventDispatcher;
5       
6        public class MSequencer extends EventDispatcher {
7                public var onSignal:Function;
8               
9                protected static const STATUS_STOP:int          = 0;
10                protected static const STATUS_BUFFERING:int = 1;
11                protected static const STATUS_PLAY:int          = 2;
12                protected var m_audioBuffer:AudioBuffer;
13                protected var m_trackArr:Array;
14                protected var m_volume:int;                              // master volume (max:127)
15                protected var m_signalArr:Array;
16                protected var m_signalPtr:int;
17                protected var m_globalTick:uint;
18                protected var m_status:int;
19                protected var m_signalInterval:int;
20
21                public function MSequencer(multiple:uint = 16) {
22                        MOscillator.boot();
23                        m_trackArr = new Array();
24                        m_volume = 100;
25                        m_signalArr = new Array(4);
26                        for(var i:int = 0; i < m_signalArr.length; i++) {
27                                m_signalArr[i] = new MSignal(i);
28                                m_signalArr[i].setFunction(onSignalHandler);
29                        }
30                        m_signalPtr = 0;
31                        m_audioBuffer = new AudioBuffer(multiple, Audio.STEREO, Audio.BIT16, Audio.RATE44100);
32                        m_audioBuffer.onInit     = onAudioBufferInit;
33                        m_audioBuffer.onComplete = onAudioBufferComplete;
34                        m_status = STATUS_STOP;
35                        m_signalInterval = 96/4;
36                }
37
38                public function play():void {
39                        stop();
40                        m_globalTick = 0;
41                        m_audioBuffer.start();
42                }
43
44                public function pause():void {
45                        m_audioBuffer.stop();
46                        m_status = STATUS_PLAY;
47                }
48
49                public function stop():void {
50                        m_audioBuffer.stop();
51                        m_status = STATUS_STOP;
52                }
53
54                public function isPlaying():Boolean {
55                        return (m_status == STATUS_PLAY);
56                }
57
58                public function disconnectAll():void {
59                        while(m_trackArr.pop());
60                }
61
62                public function connect(track:MTrack):void {
63                        track.m_signalInterval = m_signalInterval;
64                        m_trackArr.push(track);
65                }
66
67                public function getGlobalTick():uint {
68                        return m_globalTick;
69                }
70
71                public function setSignalInterval(interval:int):void {
72                        m_signalInterval = interval;
73                }
74
75                protected function onSignalHandler(globalTick:uint, event:int):void {
76                        m_globalTick = globalTick;
77                        if (onSignal != null) onSignal(globalTick, event);
78                }
79
80                private function onAudioBufferInit(buffer:AudioBuffer):void {
81                        buffer.start();
82                }
83
84                private function onAudioBufferComplete(buffer:AudioBuffer):void {
85                        //var starttime:Date = new Date();
86                        var samples:Array = buffer.getSamples();
87                        var amplitude:Number;
88                        var sample:Sample;
89                        var i:int;
90                        var sLen:int = samples.length;
91                        for(i = 0; i < sLen; i++) {
92                                sample = samples[i];
93                                sample.left = sample.right = 0.0 ;
94                        }
95                        var signal:MSignal = m_signalArr[m_signalPtr];
96                        var nt:int = m_trackArr.length;
97                        if (nt > 0) {
98                                var track:MTrack = m_trackArr[0];
99                                track.onAudioBufferComplete(samples, signal);
100                                for(i = 1; i < nt; i++) {
101                                        track = m_trackArr[i];
102                                        track.onAudioBufferComplete(samples);
103                                }
104                        }
105                        var mvol:Number = m_volume * (0.5 / 127.0);
106                        for(i = 0; i < sLen; i++) {
107                sample = samples[i];
108                                sample.left      *= mvol;
109                                sample.right *= mvol;
110                        }
111                        buffer.update();
112
113                        // end of sequence
114                        var n:int = 0;
115                        for (i = 0; i < m_trackArr.length; i++) {
116                                if (m_trackArr[i].isEnd()) n++;
117                        }
118                        if (n >= m_trackArr.length) {
119                                buffer.stop();
120                                dispatchEvent(new Event(Event.COMPLETE));
121                        }
122
123                        m_signalArr[(m_signalPtr + m_signalArr.length-1) % m_signalArr.length].start();
124                        if (m_status < STATUS_PLAY) {
125                                m_status++;
126                        }
127                        m_signalPtr = (++m_signalPtr) % m_signalArr.length;
128
129                        //var endtime:Date = new Date();
130                        //trace((endtime.getTime() - starttime.getTime()) + "msec.");
131                }
132        }
133}
Note: See TracBrowser for help on using the browser.