root/as3/ASound/branches/gamiken/src/com/kappaLab/asound/envelops/Envelop.as

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

Envelop bugfix

  • svn:executable 属性の設定値: *
Line 
1 package com.kappaLab.asound.envelops
2 {
3     import com.kappaLab.asound.SignalProcessor;
4     import com.kappaLab.asound.utils.AudioConfig
5     public class Envelop extends SignalProcessor
6     {
7         protected const TIME_PER_BYTE:Number = 1000.0 / AudioConfig.SAMPLE_RATE;
8         protected var timePerByte:Number = 0
9        
10         protected var amplifiers:Vector.<Number>;
11         protected var intervals:Vector.<Number>;
12        
13         protected var _signal:SignalProcessor
14         protected var _amplifier:Number;
15         protected var initAmplifier:Number;
16         protected var lastAmplifier:Number;
17         protected var length:uint;
18         protected var time:Number;
19         private var started:Boolean = false;
20        
21         /**
22          * Max/MSP の line~ に似た記述方法。
23          * @param       init
24          * @param       envelops 発音時の音圧,[n番目の音圧,n番目のまでの経過時間]
25          *
26          * @example new Envelop(signal,0,[1,1000,0,1000])
27          * 音圧0からスタートして、1000ミリ秒後に音圧1、1000ミリ秒後に音圧0と変化
28          **/
29         public function Envelop(
30             signal:SignalProcessor,
31             initAmplifier:Number,
32             envelops:Array = null)
33         {
34             this.signal = signal
35             time = 0;
36             generateEnvelop(initAmplifier, envelops);
37         }
38        
39        
40         /**
41          * Max/MSP の line~ に似た記述方法。
42          * @param       init
43          * @param       envelops 発音時の音圧,[n番目の音圧,n番目のまでの経過時間]
44          *
45          * @example new Envelop(0,[1,1000,0,1000])
46          * 音圧0からスタートして、1000ミリ秒後に音圧1、1000ミリ秒後に音圧0と変化
47          **/
48         public function generateEnvelop(
49             initAmplifier:Number,
50             envelops:Array = null):void
51         {
52             this.initAmplifier = initAmplifier;
53             amplifiers    = new Vector.<Number>()
54             intervals     = new Vector.<Number>()
55            
56             var n:int = (envelops)?envelops.length >> 1:0;//int(arg.length / 2)
57             var previousValue:Number = initAmplifier
58             var prevInterval:Number  = 0;
59            
60             for (var i:int = 0; i < n; i++)
61             {
62                 var ii:int = i << 1 // i*2
63                 trace(ii,envelops[ii], previousValue, envelops[ii + 1]);
64                 intervals[i]  = envelops[ii + 1]+prevInterval;
65                 amplifiers[i] = 0+(envelops[ii] - previousValue)
66                               / ((envelops[ii + 1] * .001) * 44100.0);
67                 previousValue = envelops[ii]
68                 prevInterval  = intervals[i]
69             }
70            
71             lastAmplifier = previousValue;
72             length = n;
73             /**
74             trace("----------")
75             trace(_amplifier)
76             trace(initAmplifier)
77             trace(lastAmplifier)
78             trace(time)
79             trace(length)
80             trace(intervals)
81             trace(amplifiers)
82             /**/
83         }
84        
85         public function start():void
86         {
87             //trace("start")
88             time = 0
89             started = true
90             _amplifier = initAmplifier
91         }
92         override public function process():void
93         {
94             _signal.process()
95             _process()
96         }
97         public function processInstrument():void
98         {
99             _process()
100         }
101         protected function _process():void
102         {   
103             var n:int = LATENCY;
104             var i:int = 0;
105             var m:int = length - 1;
106             //trace(time,_amplifier)
107             if (!started)
108             {
109                 for (; i < n; i++)
110                 {
111                     _sample[i] = 0;
112                 }
113             }
114             else
115             {
116                 for (; i < n; i++)
117                 {
118                     time += TIME_PER_BYTE;
119                     for (var j:int = 0; j <= m; j++)
120                     {
121                         if (time <= intervals[j])
122                         {
123                             _amplifier += amplifiers[j];
124                             break;
125                         }
126                         else if (time > intervals[m])
127                         {
128                             _amplifier = lastAmplifier;
129                             break;
130                         }
131                     };
132                     _sample[i] *= (_amplifier)?_amplifier:0;
133                 }
134             }
135            
136         }
137        
138         public function get signal():SignalProcessor { return _signal; }
139         public function set signal(value:SignalProcessor):void
140         {
141             _signal = value;
142             _sample = value.sample
143         }
144        
145         public function get amplifier():Number { return _amplifier; }
146
147     }
148    
149 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。