root/as3/ASound/trunk/src/com/kappaLab/asound/instruments/Instrument.as

リビジョン 2401, 4.1 kB (コミッタ: gamiken, コミット時期: 4 年 前)

commit trunk

  • svn:executable 属性の設定値: *
Line 
1 package com.kappaLab.asound.instruments
2 {
3     import com.kappaLab.asound.envelops.Envelop;
4     import com.kappaLab.asound.filters.Filter;
5     import com.kappaLab.asound.effects.Effect;
6     import com.kappaLab.asound.generators.Master;
7     import com.kappaLab.asound.namespaces.asound_internal;
8     import com.kappaLab.asound.SignalProcessor;
9    
10     public class Instrument extends SignalProcessor
11     {
12        
13         protected var _envelop:Envelop;
14         protected var _filters:Vector.<Filter>;
15         protected var _effects:Vector.<Effect>;
16
17         protected var _volume:Number;
18        
19         public var signals:Vector.<SignalProcessor>
20         private var _master:Master;
21         private var _listen:Boolean;
22        
23         use namespace asound_internal;
24        
25         public function Instrument()
26         {
27            
28             signals  = new Vector.<SignalProcessor>()
29             _master  = Master.getInstance();
30             _sample  = new Vector.<Number>(LATENCY);
31             _filters = new Vector.<Filter>();
32             _effects = new Vector.<Effect>()
33             _envelop = new Envelop(this,1)
34             _volume  = .05;
35             listen   = true
36         }
37        
38         override public function process():void
39         {   
40             var n:uint = LATENCY
41             var i:int = 0
42             var sp:SignalProcessor;
43            
44             for each(sp in signals) { sp.process() };
45            
46             for (i = 0; i < n; i++)
47             {
48                 var s:Number = 0;
49                 for each(sp in signals) { s += sp._sample[i] };
50                 _sample[i] = s;
51             }
52             for each(var filter:Filter in _filters)
53             {
54                 filter.processInstrument()
55             }
56            
57             for each(var effect:Effect in _effects)
58             {
59                 effect.processInstrument()
60             }
61            
62             _envelop.processInstrument();
63            
64             for (i = 0; i < n; i++) { _sample[i] *= _volume };
65            
66         }
67         /**
68          * Max/MSP の line~ に似た記述方法。
69          * @param       init
70          * @param       envelops 発音時の音圧,[n番目の音圧,n番目のまでの経過時間]
71          *
72          * @example generateEnvelop(0,[1,1000,0,1000])
73          * 音圧0からスタートして、1000ミリ秒後に音圧1、1000ミリ秒後に音圧0と変化
74          **/
75         public function generateEnvelop(init:Number,envelops:Array = null):void
76         {
77             _envelop.generateEnvelop(init,envelops)
78         }
79        
80         public function play():void
81         {
82             for each(var sp:SignalProcessor in signals)
83             {
84                 if (sp is Instrument) Instrument(sp).play();
85                 else if (sp is Envelop) Envelop(sp).start();
86             }
87             //trace("play")
88             _envelop.start()
89         }
90        
91         public function get volume():Number { return _volume; }
92         public function set volume(value:Number):void
93         {
94             _volume = value;
95         }
96                
97         public function get filters():Vector.<Filter> { return _filters; }
98         public function set filters(value:Vector.<Filter>):void
99         {
100             _filters = value;
101         }
102        
103        
104         public function get listen():Boolean { return _listen; }
105         public function set listen(value:Boolean):void
106         {
107             if (_listen == value) return;
108            
109             _listen = value;
110             if (value)
111                 _master.asound_internal::addInstrument(this);
112             else
113                 _master.asound_internal::removeInstrument(this);
114         }
115         /*
116         public function get envelop():Envelop { return _envelop; }
117         public function set envelop(value:Envelop):void
118         {
119             _envelop = value;
120         }*/
121        
122         public function get master():Master { return _master; }
123        
124         public function get effects():Vector.<Effect> { return _effects; }
125         public function set effects(value:Vector.<Effect>):void
126         {
127             _effects = value;
128         }
129        
130        
131     }
132    
133 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。