2018年7月3日火曜日

エンベロープ・ジェネレーターの構想

単体のLFOのArduino LFOが使い勝手がいいので、Envelope Generatorも単体で作ってみようと思います。

候補としては

  • 男らしくアナログ回路で組む
  • 少し男らしくArduino + MCP4922で組む
  • 使い慣れたNucleo+mbedで組む
  • 久しぶりにPSoC 5LPを使ってみる
  • 大人の世界(IoT)に対応するためにESP WROOM 32で組む

と考えてみましたが、Nucleoならmbedでサクッとプログラミングできるし、DACも内蔵されていて12bit精度なのでNucleoでやることにしました。

PSoc 5LP、ESP WROOM 32も内蔵DACがありますが8bit精度なので今回は候補から外しました。

理想とするエンベロープ・ジェネレーター



シーケンサーから出力される「Gate」信号はOn→Offに切り替わるだけで、いかにもデジタルっぽい波形です。

エンベロープ・ジェネレーターは「ADSR」の設定によって、Gate信号をなんとなく実際の楽器のようなでこぼこした振幅に加工する役目を果たします。

図の「ADSR Linear」は「ADSR」の設定に従って素直に線形補間したものです。理屈で考えると本来はこのような波形になるのですが、アナログ素子で実現すると「ADSR Analog」のようにぬるい波形になってしまうようです。

コンデンサの充放電を考えるとこんな感じかなと思える波形だし、自然現象を利用しているので「自然な」波形なんだと思います。


プログラムで書くとすれば「ADSR Linear」の波形が一番簡単ですが、できれば「ADSR Analog」のよう波形にしたい。

KIK01ではやむを得ない事情でプログラムで時定数カーブをつけましたが、単体のエンベロープ・ジェネレーターなら「ADSR Linear」の波形を出力して、後段にLPFを入れれば「ADSR Analog」のような波形になるのでは?と考えました。

Nucleo F446REでのプログラミング

配線図

ADSR設定用のPOTはBSM02で使っているPOTx8パネルを一時的に流用しました。

GATE信号はNucleoボード上のUSER_BUTTONで生成するようにしていて、同じPinに矩形波だけのファンクション・ジェネレーターをつないで一定間隔でGATE信号を出力するようにしました。

mbed repository
https://os.mbed.com/users/ryood/code/Nucleo_F446_EG/

出力波形

ch1:Gate信号(反転) ch2:NucleoからのADSR出力

USER_BUTTONの押し下げでGate Onにするために、Gate信号は反転論理にしています。

一次CR LPFを通す(R=10k C=1uF)fc≒15.9Hz

ch1:Gate信号(反転) ch2:CR LPFの出力


一次CR LPFを通す(R=100k C=1uF)fc≒1.59Hz

ch1:Gate信号(反転) ch2:CR LPFの出力

失敗です(^q^;

全体にダラッとなめらかになってはいますが、Attackの立ち上がり、AttackからDecay、SustainからReleaseに切り替わるとき、コンデンサの充放電開始のような尖った波形になっていません。

もう少し考えます。

Github
https://github.com/ryood/NucleoEG