2019年02月07日

出力のミュートを行う仕掛けを実装する。

先日行ったライヴでも感じていたことなのだが、テルミンのようなオープンハンドで音が出てしまう仕様の楽器にはミュート機構が必要だ。

出来ればスムーズにフェードイン・アウトが出来る機構を組み込みたいところだが、MCUの処理能力がそろそろ限界なので、とりあえずは単純に音をぶった切る仕掛けを考ることにした。

WS001639.JPG

用法としては、弱音環境でスイッチングを行えばよいのだが、

WS001637.JPG

左手の減衰値ゼロの場合にパラメーターの操作を受け付けない仕様が若干の問題となってくる。

インターフェイスのアサインは下段ロータリーエンコーダのCase 4:に行った。 通常は黄色のミュートスイッチとして機能するが、ピッチ編集モード下でのみ無点灯なピッチ設定ノブに切替わる。

消音の仕組みは単純で、Wavetableから読みだしたヴォリュームカーヴのレジスタに有無を言わせずゼロを代入する。 

これで出音は強制的に消滅するが、音声を出力している間に操作を行った場合は盛大にポップノイズが出てしまう野蛮な仕様だ。

しかも、現実に音量を制御するパラメーターにゼロをアサインすると、何故かフリーズが発生するという怪し気な挙動が見られるのが末期的で、そろそろMCUの処理限界が見えてきたようだ。

音響機器の視点で考え得る常識的なミュート機構の仕掛けとしては、FETに時定数をつけた簡易型のアナログスイッチをまず思いつくのだが、それっぽいものをコードで実現する手段として音声データにカウンタで増減を行う数値を掛け合わせればよさそうだ。 ただし、この用途には周りの動作が全て停止してしまうdelayは使えず、代わりにバックグラウンドで計数を行う仕様のMetroかChronoで組み上げた仕組みを検討する必要が出てくる。

ノイズレスなスイッチの実現に関しては後々考えるとして、とにかく最初に行わなければならないのはレジスタの設定で、この部分に関しては先日製作した出力選択スイッチの構造を流用することにした。

まずはパラメーターを一時的にストアするためのレジスタをArpeggiatorを配置した5チャンネル分とSequencerの8チャンネル分の合計13ch用意しなければならない。 が、スイッチの用法を考えた場合、他のパラメーターのようにレジスタに保持した制御データをSDカードに記録する必然性は低いと思われる。 

SDカード関連のコーディングが必要なくなったものの、出力にArpeggiatorが絡んでくる複雑な構造の箇所に、新規にレジスタを展開するのはそこそこ手間のかかる仕事であった。 

WS001638.JPG

悩まされたのは、Arpeggiatorの起動レベルを設定するセクションが絡むフリーズで、消音後にこのセクションにアクセス(上側ノブの case 9: に設定)した途端に消音状態のまま出力がロックされてしまう。 しかも、これが単なるフリーズではなく、発音やセンシングなど楽器としての機能が生きているにも関わらずMute状態からの回復が不可能になる点が面妖だ。

トラブル回避の対策としてスイッチをアサインしているインターフェイスのアドレスを変更したり、case 9: に関連する機構そのものを抹消したりと解決法をいろいろと試してみたが、最終的にはVolumeValueを処理しているルーチンの内部に、データ・セレクタを展開することでなんとかバグに対応することができた。

追記:

スイッチの内部にChronoを使ったフェードイン/アウト機構を仮導入してみたが、あまり御利益が無い割に謎のフリーズ案件が頻発しはじめたため、この件は失敗と結論した。 ロータリーエンコーダが絡む部分は頻繁にスキャンを行っているが、それによって生じた不具合と推測している。 

そろそろMCUの処理限界が近いと思われるので、これからは低難度の運用でなんとかなるレベルの不具合は無視してもよいだろう。



posted by Yasuski at 15:55| LaVoixski