root/as3/SiOPM/trunk/src/org/si/sound/MMLPlayer.as

リビジョン 3825, 7.3 kB (コミッタ: keim, コミット時期: 2 年 前)

SiON ver0.60 updated

Line 
1 //----------------------------------------------------------------------------------------------------
2 // Class for sound object playing MML
3 //  Copyright (c) 2009 keim All rights reserved.
4 //  Distributed under BSD-style license (see org.si.license.txt).
5 //----------------------------------------------------------------------------------------------------
6
7
8 package org.si.sound {
9     import org.si.sion.*;
10     import org.si.sion.sequencer.SiMMLTrack;
11     import org.si.sion.sequencer.SiMMLSequencer;
12     import org.si.sion.sequencer.base.MMLSequence;
13     import org.si.sound.synthesizers._synthesizer_internal;
14    
15    
16     /** MML Player provides sequence sound written by MML, and you can control all tracks during playing sequence. */
17     public class MMLPlayer extends SoundObject
18     {
19     // variables
20     //----------------------------------------
21         /** @private [protected] mml text. */
22         protected var _mml:String;
23        
24         /** @private [protected] sequence data. */
25         protected var _data:SiONData;
26
27         /** @private [protected] flag that mml text is compiled to data */
28         protected var _compiled:Boolean
29        
30         /** @private [protected] current controling track number */
31         protected var _controlTrackNumber:int;
32        
33         /** @private [protected] track muting status */
34         protected var _trackMute:Vector.<Boolean>;
35        
36         /** @private [protected] solo track number */
37         protected var _soloTrackNumber:int;
38        
39        
40        
41        
42     // properties
43     //----------------------------------------
44         /** MML text */
45         public function get mml() : String { return _mml; }
46         public function set mml(str:String) : void {
47             _mml = str || "";
48             _compiled = false;
49             _compile();
50         }
51        
52        
53         /** sequence data to play */
54         public function get data() : SiONData { return _data; }
55        
56        
57         /** current controling track number */
58         public function get controlTrackNumber() : int { return _controlTrackNumber; }
59         public function set controlTrackNumber(n:int) : void {
60             _controlTrackNumber = n;
61             if (_tracks) {
62                 var trackNumber:int = _controlTrackNumber;
63                 if (trackNumber < 0) trackNumber = 0;
64                 else if (trackNumber >= _tracks.length) trackNumber = _tracks.length - 1;
65                 _track = _tracks[trackNumber];
66             }
67         }
68        
69        
70         /** number of MML playing tracks */
71         public function get trackCount() : int { return (_tracks) ? _tracks.length : 0; }
72        
73        
74         /** Solo track number, this value reset when call start() method. -1 sets no solo tracks. @default -1 */
75         public function get soloTrackNumber() : int { return _soloTrackNumber; }
76         public function set soloTrackNumber(n:int) : void {
77             var i:int;
78             if (_soloTrackNumber != n && _tracks) {
79                 _soloTrackNumber = n;
80                 if (_soloTrackNumber < 0) {
81                     for (i=0; i<_tracks.length; i++) _track.channel.mute = _trackMute[i];
82                 } else {
83                     for (i=0; i<_tracks.length; i++) {
84                         _trackMute[i] = _track.channel.mute;
85                         _track.channel.mute = (i != _soloTrackNumber);
86                     }
87                 }
88             }
89         }
90        
91        
92         /** @private */
93         override public function get coarseTune() : int { return (_track) ? _track.noteShift : _noteShift; }
94         /** @private */
95         override public function get fineTune() : Number { return (_track) ? (_track.pitchShift * 0.015625) : _pitchShift; }
96         /** @private */
97         override public function get gateTime() : Number { return (_track) ? _track.quantRatio : _gateTime; }
98         /** @private */
99         override public function get eventMask() : int { return (_track) ? _track.eventMask : _eventMask; }
100        
101         /** @private */
102         override public function get mute() : Boolean { return (_track) ? _track.channel.mute : _thisMute; }
103         /** @private */
104         override public function get volume() : Number { return (_track) ? _track.channel.masterVolume : _thisVolume; }
105         /** @private */
106         override public function get pan() : Number { return (_track) ? _track.channel.pan : _thisPan; }
107         /** @private */
108         override public function get effectSend1() : Number { return (_track) ? _track.channel.getStreamSend(1) : (_volumes[1] * 0.0078125); }
109         /** @private */
110         override public function get effectSend2() : Number { return (_track) ? _track.channel.getStreamSend(2) : (_volumes[2] * 0.0078125); }
111         /** @private */
112         override public function get effectSend3() : Number { return (_track) ? _track.channel.getStreamSend(3) : (_volumes[3] * 0.0078125); }
113         /** @private */
114         override public function get effectSend4() : Number { return (_track) ? _track.channel.getStreamSend(4) : (_volumes[4] * 0.0078125); }
115         /** @private */
116         override public function get pitchBend() : Number { return (_track) ? (_track.pitchBend * 0.015625) : _pitchBend; }
117        
118        
119        
120        
121     // constructor
122     //----------------------------------------
123         /** constructor */
124         function MMLPlayer(mml:String=null) {
125             _data = new SiONData();
126             this.mml = mml;
127             super(_data.title);
128             _controlTrackNumber = 0;
129             _trackMute = new Vector.<Boolean>();
130         }
131        
132        
133        
134        
135     // operations
136     //----------------------------------------
137         /** Play mml data. */
138         override public function play() : void {
139             _compile();
140             stop();
141             _soloTrackNumber = -1;
142             _tracks = _sequenceOn(_data, false);
143             if (_tracks) {
144                 _trackMute.length = _tracks.length;
145                 for (var i:int=0; i<_tracks.length; i++) _trackMute[i] = false;
146                 _synthesizer._registerTracks(_tracks);
147                 var trackNumber:int = _controlTrackNumber;
148                 if (trackNumber < 0) trackNumber = 0;
149                 else if (trackNumber >= _tracks.length) trackNumber = _tracks.length - 1;
150                 _track = _tracks[trackNumber];
151             }
152         }
153        
154        
155         /** Stop mml data. */
156         override public function stop() : void {
157             if (_tracks) {
158                 _synthesizer._unregisterTracks(_tracks[0], _tracks.length);
159                 for each (var t:SiMMLTrack in _tracks) t.setDisposable();
160                 _tracks = null;
161                 _sequenceOff(false);
162             }
163             _stopEffect();
164         }
165        
166        
167        
168        
169     // internal
170     //----------------------------------------
171         /** @private [protected] call this after the update mml */
172         protected function _compile() : void {
173             if (!driver || _compiled) return;
174             if (_mml != "") {
175                 driver.compile(_mml, _data);
176                 name = _data.title;
177             } else {
178                 _data.clear();
179                 name = "";
180             }
181             _compiled = true;
182         }
183     }
184 }
185
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。