2019年03月15日

EnvelopeGeneratorのようなものを実装した

Chronoを使ったトリガーを切欠にAttack=立ち上がりのエンヴェロープをオシレーターのピッチ制御に印加する機能、Envelope Generatorのようなものを実装した。

Lyle Maysな雰囲気を実現するまでの道程は遠いが、まずは第一歩から。

Oberheim名物なLyleMaysの"あの音"を思い出してから脳内再生が鳴り止まず夢にまで出てくる始末で、この日の午後はその実現に向けてひたすらに試行錯誤を繰り返していた。

基本的な構想は、データの極端な変化をサプレッションするEMAアルゴリズムの係数をChronoを使って段階的に変化させる方式で、Chronoによって発生させるトリガーの間隔が長くなると、EMA係数の変化量が抑制され、結果としてGrideTimeが伸びるという仕掛けだ。

最初のこれはおもいっきりコーディングを間違えているのだが、

WS001765.JPG

実装した結果「何となくそれっぽい動き」が観測されてしまい、これが迷路の入り口に入る切欠となる。

次に、実験を繰り返して到達したこの段階では、実用性は乏しいもののPitchをGrideさせる機能の実装がほぼ実現しつつあった。 ただし、変化量が大きすぎたり、Grideさせた結果が超低音になるなど、新たにピッチ制御のために用意した係数、add_vall2 に出力されるデータは正常なものとは程遠い状態だ。

Screen Shot 2019-03-13 at 15.47.24.png

そのうえ、Chronoの調整のためにノブを回していると、突然作動不能となるケースが頻発した。 

このケースには相当悩まされたが、SequencerにStart/Stop機能を実装したコードからそのままの仕組みを再利用して、「トリガーゲートがオフられた時にchrono.stopを使ってChronoの計数をストップさせていた」のが原因だった。 

chrono.stop を排除した結果、トリガーによってEGを発生させる機構の動作を安定させることが出来たが、この段階ではピッチが不思議な挙動を示す原因をまだ特定出来ていない。

その後の数時間に渡る試行錯誤の末に探し当てた、正常に動作するほぼ最終的な案以下に示す。 

機能をまとめてEGとしてサブルーチン化し、それをPitchディテクターのサブルーチン内からコールしている。

Screen Shot 2019-03-14 at 2.32.48.png

結局、発生させていた「Pitchの差分」そのものを add_val2 に代入するPitchデータ出力として取り扱っていたのが間違いで、元データ add_val に「差分を足す」のが正解だった。 これで、Pitchの扱いに関する問題はほぼ解決した。 制御波形の分解能は200だが、これは今後調整を行う必要があるかもしれない。

多分、これもまた「車輪の再発明」に過ぎないのだろう。 が、ひとまずはそれっぽい動作をする仕掛けが組み上がりつつある。

負荷が多いためか出音が微妙に荒れ出したのが危険な徴候だが、出来ればこの機能を外したくはないものだ。

ついでに、操作性を向上させるためにパラメーターの配置を一部変更している。
posted by Yasuski at 11:14| LaVoixski