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

リビジョン 4421, 14.5 kB (コミッタ: keim, コミット時期: 1 年 前)

sion asdocSiON ver0.612 updated

Line 
1 //----------------------------------------------------------------------------------------------------
2 // Class for play drum tracks
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.SiONData;
10     import org.si.sion.sequencer.SiMMLTrack;
11     import org.si.sound.namespaces._sound_object_internal;
12     import org.si.sound.synthesizers.DrumMachinePresetVoice;
13     import org.si.sound.patterns.DrumMachinePresetPattern;
14     import org.si.sound.patterns.Sequencer;
15     import org.si.sound.patterns.Note;
16     import org.si.sound.events.SoundObjectEvent;
17    
18     /** @eventType org.si.sound.events.SoundObjectEvent.ENTER_FRAME */
19     [Event(name="enterFrame",   type="org.si.sound.events.SoundObjectEvent")]
20     /** @eventType org.si.sound.events.SoundObjectEvent.ENTER_SEGMENT */
21     [Event(name="enterSegment", type="org.si.sound.events.SoundObjectEvent")]
22    
23     /** Drum machinie provides independent bass drum, snare drum and hihat symbals tracks. */
24     public class DrumMachine extends MultiTrackSoundObject
25     {
26     // namespace
27     //----------------------------------------
28         use namespace _sound_object_internal;
29        
30        
31        
32        
33     // static variables
34     //----------------------------------------
35         static private var _presetVoice:DrumMachinePresetVoice = null;
36         static private var _presetPattern:DrumMachinePresetPattern = null;
37        
38        
39        
40        
41     // variables
42     //----------------------------------------
43         /** @private [protected] bass drum pattern sequencer */
44         protected var _bass:Sequencer;
45         /** @private [protected] snare drum pattern sequencer */
46         protected var _snare:Sequencer;
47         /** @private [protected] hi-hat cymbal pattern sequencer */
48         protected var _hihat:Sequencer;
49        
50         /** @private [protected] Sequence data */
51         protected var _data:SiONData;
52
53         /** @private [protected] bass drum pattern number */
54         protected var _bassPatternNumber:int;
55         /** @private [protected] snare drum pattern number */
56         protected var _snarePatternNumber:int;
57         /** @private [protected] hi-hat cymbal pattern number */
58         protected var _hihatPatternNumber:int;
59         /** @private [protected] bass drum voice number */
60         protected var _bassVoiceNumber:int;
61         /** @private [protected] snare drum voice number */
62         protected var _snareVoiceNumber:int;
63         /** @private [protected] hi-hat cymbal voice number */
64         protected var _hihatVoiceNumber:int;
65         /** @private [protected] Change bass line pattern at the head of segment. */
66         protected var _changePatternOnSegment:Boolean;
67        
68         // preset pattern list
69         static private var bassPatternList:Array;
70         static private var snarePatternList:Array;
71         static private var hihatPatternList:Array;
72         static private var percusPatternList:Array;
73         static private var bassVoiceList:Array;
74         static private var snareVoiceList:Array;
75         static private var hihatVoiceList:Array;
76         static private var percusVoiceList:Array;
77        
78        
79        
80     // properties
81     //----------------------------------------
82         /** Preset voices */
83         public function get presetVoice() : DrumMachinePresetVoice { return _presetVoice; }
84        
85         /** Preset patterns */
86         public function get presetPattern() : DrumMachinePresetPattern { return _presetPattern; }
87        
88         /** maximum value of basePatternNumber */  public function get bassPatternNumberMax()  : int { return bassPatternList.length; }
89         /** maximum value of snarePatternNumber */ public function get snarePatternNumberMax() : int { return snarePatternList.length; }
90         /** maximum value of hihatPatternNumber */ public function get hihatPatternNumberMax() : int { return hihatPatternList.length; }
91         /** maximum value of baseVoiceNumber */    public function get bassVoiceNumberMax()  : int { return bassVoiceList.length>>1; }
92         /** maximum value of snareVoiceNumber */   public function get snareVoiceNumberMax() : int { return snareVoiceList.length>>1; }
93         /** maximum value of hihatVoiceNumber */   public function get hihatVoiceNumberMax() : int { return hihatVoiceList.length>>1; }
94        
95        
96         /** Sequencer object of bass drum */
97         public function get bass()  : Sequencer { return _bass; }
98         /** Sequencer object of snare drum */
99         public function get snare() : Sequencer { return _snare; }
100         /** Sequencer object of hihat symbal */
101         public function get hihat() : Sequencer { return _hihat; }
102        
103         /** Sequence pattern of bass drum */
104         public function get bassPattern()  : Vector.<Note> { return _bass.pattern || _bass.nextPattern; }
105         public function set bassPattern(pat:Vector.<Note>)  : void {
106             if (isPlaying && _changePatternOnSegment) _bass.nextPattern = pat;
107             else _bass.pattern = pat;
108         }
109         /** Sequence pattern of snare drum */
110         public function get snarePattern() : Vector.<Note> { return _snare.pattern || _snare.nextPattern; }
111         public function set snarePattern(pat:Vector.<Note>) : void {
112             if (isPlaying && _changePatternOnSegment) _snare.nextPattern = pat;
113             else _snare.pattern = pat;
114         }
115         /** Sequence pattern of hihat symbal */
116         public function get hihatPattern() : Vector.<Note> { return _hihat.pattern || _hihat.nextPattern; }
117         public function set hihatPattern(pat:Vector.<Note>) : void {
118             if (isPlaying && _changePatternOnSegment) _hihat.nextPattern = pat;
119             else _hihat.pattern = pat;
120         }
121        
122         /** bass drum pattern number. */
123         public function get bassPatternNumber() : int { return _bassPatternNumber; }
124         public function set bassPatternNumber(index:int) : void {
125             if (index < 0 || index >= bassPatternList.length) return;
126             _bassPatternNumber = index;
127             bassPattern = bassPatternList[index];
128         }
129        
130        
131         /** snare drum pattern number. */
132         public function get snarePatternNumber() : int { return _snarePatternNumber; }
133         public function set snarePatternNumber(index:int) : void {
134             if (index < 0 || index >= snarePatternList.length) return;
135             _snarePatternNumber = index;
136             if (_changePatternOnSegment) snare.nextPattern = snarePatternList[index];
137             else snare.pattern = snarePatternList[index];
138         }
139        
140        
141         /** hi-hat cymbal pattern number. */
142         public function get hihatPatternNumber() : int { return _hihatPatternNumber; }
143         public function set hihatPatternNumber(index:int) : void {
144             if (index < 0 || index >= hihatPatternList.length) return;
145             _hihatPatternNumber = index;
146             if (_changePatternOnSegment) hihat.nextPattern = hihatPatternList[index];
147             else hihat.pattern = hihatPatternList[index];
148         }
149        
150        
151         /** bass drum pattern number. */
152         public function get bassVoiceNumber() : int { return _bassVoiceNumber>>1; }
153         public function set bassVoiceNumber(index:int) : void {
154             index <<= 1;
155             if (index < 0 || index >= bassVoiceList.length) return;
156             _bassVoiceNumber = index;
157             bass.voiceList = [bassVoiceList[index], bassVoiceList[index+1]];
158         }
159        
160        
161         /** snare drum pattern number. */
162         public function get snareVoiceNumber() : int { return _snareVoiceNumber>>1; }
163         public function set snareVoiceNumber(index:int) : void {
164             index <<= 1;
165             if (index < 0 || index >= snareVoiceList.length) return;
166             _snareVoiceNumber = index;
167             snare.voiceList = [snareVoiceList[index], snareVoiceList[index+1]];
168         }
169        
170        
171         /** hi-hat cymbal pattern number. */
172         public function get hihatVoiceNumber() : int { return _hihatVoiceNumber>>1; }
173         public function set hihatVoiceNumber(index:int) : void {
174             index <<= 1;
175             if (index < 0 || index >= hihatVoiceList.length) return;
176             _hihatVoiceNumber = index;
177             hihat.voiceList = [hihatVoiceList[index], hihatVoiceList[index+1]];
178         }
179        
180         /** bass drum volume (0-1) */
181         public function get bassVolume() : Number { return _bass.defaultVelocity * 0.00392156862745098; }
182         public function set bassVolume(n:Number) : void {
183             if (n < 0) n = 0;
184             else if (n > 1) n = 1;
185             _bass.defaultVelocity = n * 255;
186         }
187        
188         /** snare drum volume (0-1) */
189         public function get snareVolume() : Number { return _snare.defaultVelocity * 0.00392156862745098; }
190         public function set snareVolume(n:Number) : void {
191             if (n < 0) n = 0;
192             else if (n > 1) n = 1;
193             _snare.defaultVelocity = n * 255;
194         }
195        
196         /** hihat symbal volume (0-1) */
197         public function get hihatVolume() : Number { return _hihat.defaultVelocity * 0.00392156862745098; }
198         public function set hihatVolume(n:Number) : void {
199             if (n < 0) n = 0;
200             else if (n > 1) n = 1;
201             _hihat.defaultVelocity = n * 255;
202         }
203        
204        
205         /** True to change bass line pattern at the head of segment. @default true */
206         public function get changePatternOnNextSegment() : Boolean { return _changePatternOnSegment; }
207         public function set changePatternOnNextSegment(b:Boolean) : void {
208             _changePatternOnSegment = b;
209         }
210        
211        
212        
213        
214     // constructor
215     //----------------------------------------
216         /** constructor
217          *  @param bassPatternNumber bass drum pattern number
218          *  @param snarePatternNumber snare drum pattern number
219          *  @param hihatPatternNumber hihat symbal pattern number
220          *  @param bassVoiceNumber bass drum voice number
221          *  @param snareVoiceNumber snare drum voice number
222          *  @param hihatVoiceNumber hihat symbal voice number
223          */
224         function DrumMachine(bassPatternNumber:int=0, snarePatternNumber:int=8, hihatPatternNumber:int=0, bassVoiceNumber:int=0, snareVoiceNumber:int=0, hihatVoiceNumber:int=0)
225         {
226             if (_presetVoice == null) {
227                 _presetVoice = new DrumMachinePresetVoice();
228                 _presetPattern = new DrumMachinePresetPattern();
229                 bassPatternList   = _presetPattern["bass"];
230                 snarePatternList  = _presetPattern["snare"];
231                 hihatPatternList  = _presetPattern["hihat"];
232                 percusPatternList = _presetPattern["percus"];
233                 bassVoiceList   = _presetVoice["bass"];
234                 snareVoiceList  = _presetVoice["snare"];
235                 hihatVoiceList  = _presetVoice["hihat"];
236                 percusVoiceList = _presetVoice["percus"];
237             }
238            
239             super("DrumMachine");
240            
241             _data = new SiONData();
242             _bass   = new Sequencer(this, _data, 36, 255, 1);
243             _snare  = new Sequencer(this, _data, 68, 160, 1);
244             _hihat  = new Sequencer(this, _data, 68, 128, 1);
245             this.bassVoiceNumber = bassVoiceNumber;
246             this.snareVoiceNumber = snareVoiceNumber;
247             this.hihatVoiceNumber = hihatVoiceNumber;
248             _changePatternOnSegment = true;
249            
250             setPatternNumbers(bassPatternNumber, snarePatternNumber, hihatPatternNumber);
251         }
252        
253        
254        
255        
256     // operation
257     //----------------------------------------
258         /** play drum sequence */
259         override public function play() : void
260         {
261             var tn:int, seq:Sequencer;
262            
263             stop();
264             _tracks = _sequenceOn(_data, false, false);
265             if (_tracks && _tracks.length == 3) {
266                 _synthesizer._registerTracks(_tracks);
267                 _bass.play(_tracks[0]);
268                 _snare.play(_tracks[1]);
269                 _hihat.play(_tracks[2]);
270                 if (_tracks[0].trackNumber < _tracks[1].trackNumber) {
271                     tn = (_tracks[0].trackNumber < _tracks[2].trackNumber) ? 0 : 2;
272                 } else {
273                     tn = (_tracks[1].trackNumber < _tracks[2].trackNumber) ? 1 : 2;
274                 }
275                 switch (tn) {
276                 case 0:  seq = _bass;  break;
277                 case 1:  seq = _snare; break;
278                 default: seq = _hihat; break;
279                 }
280                 seq.onEnterFrame   = _onEnterFrame;
281                 seq.onEnterSegment = _onEnterSegment;
282             } else {
283                 throw new Error("unknown error");
284             }
285         }
286        
287        
288         /** stop sequence */
289         override public function stop() : void
290         {
291             if (_tracks) {
292                 _bass.stop();
293                 _snare.stop();
294                 _hihat.stop();
295                 _synthesizer._unregisterTracks(_tracks[0], _tracks.length);
296                 for each (var t:SiMMLTrack in _tracks) t.setDisposable();
297                 _tracks = null;
298                 _sequenceOff(false);
299                 _bass.onEnterFrame  = null;
300                 _snare.onEnterFrame = null;
301                 _hihat.onEnterFrame = null;
302                 _bass.onEnterSegment  = null;
303                 _snare.onEnterSegment = null;
304                 _hihat.onEnterSegment = null;
305             }
306             _stopEffect();
307         }
308        
309        
310        
311        
312     // configure
313     //----------------------------------------
314         /** Set all pattern indeces
315          *  @param bassPatternNumber bass drum pattern index
316          *  @param snarePatternNumber snare drum pattern index
317          *  @param hihatPatternNumber hihat symbal pattern index
318          */
319         public function setPatternNumbers(bassPatternNumber:int, snarePatternNumber:int, hihatPatternNumber:int) : DrumMachine
320         {
321             this.bassPatternNumber  = bassPatternNumber;
322             this.snarePatternNumber = snarePatternNumber;
323             this.hihatPatternNumber = hihatPatternNumber;
324             return this;
325         }
326     }
327 }
328
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。