| 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 |
} |
|---|