Gate信号からADSRエンベロープを作り出すには、なんとかしてAttack Timeを決める必要があります。555タイマーを使ったエンベロープ・ジェネレーターはコンデンサの充放電でAttack Timeを決めています。
555タイマーのワン・ショットタイマー
555タイマーのブロック図
555の6ピンのTHRESに充電されるコンデンサをつなぎ、3本の抵抗で分圧された電位(2/3 * VCC)に達した時フリップ・フロップにリセットがかかり、7ピンのDISCHを通してコンデンサが放電されます。
Arduino Unoで実験
マイコン+Analog回路でこれと同じことができるかテストしました。
シミュレーション回路図
過渡解析
「Gate」にはGate信号を入力します。「GATE」からC1に充電され「OUT」の電圧が徐々に上がります。充電の速度は「Rattack」の抵抗値で決まります。
配線図
OUT(コンデンサの充電電圧)をArduinoのADC(A0)に接続して監視します。
Gate信号はプッシュスイッチで手動で発生させました。
10k/AのPOTを調節するとコンデンサの充電速度が変わり、Attack Timeを可変できます。
Arduinoのスケッチ <Arduino_EG_Charge_Test.ino>
/* * Arduino EG Charge Test * * 2018.07.05 * */ #define TITLE_STR1 ("Arduino EG Charge Test") #define TITLE_STR2 ("20180705") const int ThresholdPin = 0; const int GateInPin = 2; const int GateOutPin = 4; const int DischargePin = 5; const int CheckPin = 7; volatile bool isGateOn = false; void GateIn() { isGateOn = !digitalRead(GateInPin); //Serial.println(isGateOn); if (isGateOn) { // GateOutPin digitalWrite(GateOutPin, HIGH); // DischaregePin pinMode(DischargePin, INPUT); // Hi-Z } else { // GateOutPin digitalWrite(GateOutPin, LOW); // DischaregePin pinMode(DischargePin, OUTPUT); digitalWrite(DischargePin, LOW); // Sink } } void setup() { pinMode(GateOutPin, OUTPUT); pinMode(DischargePin, INPUT); // Hi-Z pinMode(GateInPin, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(GateInPin), GateIn, CHANGE); pinMode(CheckPin, OUTPUT); Serial.begin(115200); Serial.println(TITLE_STR1); Serial.println(TITLE_STR2); delay(1000); } void loop() { int th = analogRead(ThresholdPin); Serial.println(th); if (isGateOn && th < 683) { digitalWrite(CheckPin, HIGH); } else { digitalWrite(CheckPin, LOW); } }
AVRのI/Oピンのバッファは3-State Bufferで、ArduinoだとpinModeをINPUTにするとHi-Z(スイッチOFF)になります。
loop()内でanalogRead()でOUT(コンデンサの充電電圧)を監視して、(2 / 3) * 1024 = 683に達したことが識別できているかどうかをCheckPinのH/Lで測定できるようにしました。
オシロで測定
ch1:CheckPin(D7) ch2:OUT
Gate信号がHになった時にコンデンサへの充電が開始され、ch2の電圧が徐々に上がります。このときch1:CheckPin(D7)がHになります。
ch2が3.5V付近になったときにch1がLに切り替わり、Gate信号からAttack Timeを作ることができました。
この実験ではGate信号がLになった時に放電していますが、これを前回のシミュレーションのように、Attack Timeの終了時に放電を開始し、Sustain Levelに向かって放電してやればADSRエンベロープを作ることができそうです。
Arduino Pro Miniなどを使えば、555タイマーを使うよりも(自作する)回路規模は小さくて済みそうです。
0 件のコメント:
コメントを投稿