2018年07月02日

Open.Theremin@Wavetableの仕様変更を行う

出力波形を観る限り、無用に再生レートをイジった結果とはいえあまりにもガタガタな低域や、高い周波数帯で発生する不快なビート等、現状の音声出力のクオリティーはイマイチ感が否めない。

vlcsnap-2018-06-19-18h42m35s995.png

そこで思い付いたのはWavetableのデータ長を二倍に延伸することで、これならデータが疎になる状態を少しでもマシにすることが出来る。 現状2048段階のデータを4096段階にスケールアップするのだ。

また、Sin波とCos波を合成することで、より複雑な波形を生成できそうなので、この機会に2種類のサイン波を登録してみることにした。

で、実際に運用を行ってみたところ、何故かSin波の再生時に盛大なノイズが発生してしまう。 不思議な事にCos波の場合は妙なノイズは確認されない。 原因は定かではないがひとまずSin波を全廃してCos波を12種類、三角波と鋸波、それとExpなインパルスの3種類の合計15種類に登録波形をダイエットした。

実験の結果、低域/高域共に音質がスムーズに好変したので、データ長の12bit化は正解だった。 

同時に今回は出力の純ステレオ化を行ってみた。 現状でもデータ的には一定の時間を専有しつつ、出力が行われていなかっただけなので、信号を読みだすルーティンにDACへのラインを追加して実験を行った。

ここで発生する問題は、OverloadMode専用に誂えた外部DACのアッテネーターと、信号レベルのミスマッチで、同様に本来Overload出力を受け付けない方の回線にこれを入力した場合も同様に問題が発生する。 これを回避するには、アッテネーターのグランド側をPhotoMosRelayでコントロールして簡易なレベルシフトを行う回路を追加する方法がある。 この機能によって、レベルのミスマッチをある程度は回避できそうだ。 実際に回路を製作するには至っていないが、下準備として条件分岐で外部にフラグを出力する回線を確保してある。

image1.jpeg

実験の結果、なるほどステレオ化は面白いのだが、事前に効果的な出音を研究して仕込みを行う必要を感じさせられた。

posted by Yasuski at 03:37| open.Theremin

2018年06月30日

Open.Theremin@5voiceを選択する

今日は家人が留守だったので、一日中テルミンのプログラミングと演奏実験を繰り返していたのだが、ひとまず6voice版と5voice版のほぼマスター版を完成させることが出来た。

結論として、現在採用しているMCUの処理能力の限界から、adatを使用しない場合も、5voiceがバランス的に最良な選択とした。 

WS001336.JPG

また、処理能力とは関係なく、Overload出力時のバランスが6voiceでは崩れてしまうことも判った。

適当にでっち上げていた非線形増幅度可変システムは、

WS001337.JPG

Overloadモード時に欠かせない機能と判明したため、今後は絶対に保持すべき項目に昇格した。

今回省略したのはオシレーターの出力波形に噛ませていたLPFだが、

WS001339.JPG

これを外した場合に明白な音質の変化を認められなかった。

ご利益の度合いは不明だが、今回はプログラム全般にわたって可能な限り浮動小数点ユニットを導入している。

他に行った改良のポイントはインターフェイスの大幅な変更で、使用頻度が極端に少ない下側のRGBロータリーエンコーダーに上側にアサインしていた動的な機能を割振ることにした。

WS001334.JPG

変更の方針はライヴにおける運用性の向上で、上側に割り振っていた機能のうち、Pitch/Volumeの修正ポットと和声モードの切り替えを残し、他は下側に移行した。 これは、和音の構成を変更する際に発生するラグを排除するための選択でもある。 

WS001335.JPG

まず、波形選択を楽器の立ち上がりで表示されるページ1に割振った。 使わなくなった6voice目のオシレーターに関する項目は削除し、代わりにPitchのファインチューンとTransitionコントロールを項目の末尾に追加した。切り替える項目は17種類に増えたが、使用頻度の高い3項目は直近に配置している。

具体的には上が7項目

PitchVolume →2voice →3voice →4voice →5voice →ChordEdit 

を循環し、下方は

Waveselect →Pitch01 →Pitch02 →Pitch03  →Pitch04 →Osc1Vol →OSC1 waveform →OSC2 Vol →OSC2 waveform →OSC3Vol →OSC3 waveform →OSC4vol →OSC4 waveform →OSC5 vol →OSC5 waveform →Pitch Tune →Transition

を循環する。

初見なので未だ運用に混乱が生じているが、和音モード選択時にTransitionの調整と波形選択の直アサインが可能になったために、操作の自由度が上がったことが改良の成果といえるだろう。
posted by Yasuski at 00:53| open.Theremin

2018年06月28日

Open.Theremin@シールドスリーヴ付きアンテナ2作目

予備のピッチ・アンテナにシールド用のスリーヴを取り付けた。

IMG_8115.JPG

このアンテナは前作とはシェイプが違うために改造には大幅な加工が必要で、パイプを挿入するために一度アンテナを曲げ戻す必要があった。 

今回採用したシールドスリーヴ用のアルミパイプは径が大きく、前回試作したアンテナよりもクリアランスが稼げる筈だ。 また、パイプの内径が偶々GFRP製のパイプとマッチしていたお陰でスリーヴには保持材が不要で、基台の部分だけでパイプ全体を固定することが出来た。

アンテナ&スリーヴ間に発生する静電容量は実験してみないと判らないが、パイプの径が大きくなった分前回よりも影響を抑えられたかもしれない。

ローディングコイル入りのスリーヴは次回に製作する予定。 アンテナ・ロッドには取り扱いが容易な真鍮を使うことにする。 スリーヴの両端にはGFRPのガイシを配置し、そこにSMAコネクターとM2.6の接続ポートを取り付ける。 コイルを封入するアルマイト仕上げのパイプは絶縁できているので、あまり細かいことは気にせずに製作出来そうだ。 
posted by Yasuski at 21:14| open.Theremin

2018年06月27日

Open.Theremin@DACに供給するSCKのマージンをNOPで稼ぐ

新設したDACの動作試験を兼ねた記録映像。 左手の動きに連れて発生する音量のピークの配分を調整している。



SCKが立ち上がる前後にNOPを4セット×2噛ませることで、以前設定していたNOP2セット×2の時よりも動作を安定させることが出来た。 とはいえ、依然として出力に細かなノイズが乗っているのが残念。

そろそろ楽器の運用に慣れてきたおかげで、ロックの定石っぽい雰囲気の音作りが出来るようになった。 

が、癖の強い音なので予め使用する局面を練っておかないとダメだろう。
posted by Yasuski at 20:35| open.Theremin

Open.Theremin@また新たなバグが発覚する。

アンテナのセンシングが激遅くなるバグがコード編集モードにも波及してきたので、本格的に原因を探ることにした。

まず、5ヴォイスのモードでフリーズに近い状態にセンシングスピードが落ちる問題は、円環カウンタの数値を限定するだけでは上手くいかず、

WS001332.JPG

Wavetable読み出しポインターの制御を行っているコードをcli(); sei();で囲むことでようやく解決できた。

WS001328.JPG

が、コード編集モードでTransitionコントロールモードにアクセスした途端に速度が落ちる現象が発覚。 こちらは処理の遅れが重篤で、もはやエフェクトとはいえない状態になった。 

この問題に対処するために、割り込み禁止ポイントの増設やDACに送るSCKのタイミングを合わせるために挿入したNOPを減らす等いろいろと手を打ってみたものの

WS001331.JPG

情況は全く改善せず、これはMCUの処理能力の限界に達している感があった。 そこで、新たに追加したDACの処理を行わない方向に修正を行ったところ、問題は解決した。

ただ、せっかく搭載したDACを使わないのは惜しい。 動作が可能そうな移設場所を検討した結果、アンテナやロータリーエンコーダのセンシングを行っているループの先頭で処理を行うことにした。

WS001333.JPG

Loop内の処理が状況によって重複してしまう可能性を考慮して、DACのデータ処理ルーチンの終了後に読み出し完了のフラグを立ててタイミングを制御している。 フラグの解消は、サンプルクロックの立ち上がり後、メインのDACにデータが送信された後に行われる。

WS001330.JPG

DACへのデータ送信に要する時間は、NOPによるクロックの遅延によって左右されるが、実験の結果、安定した状態でデータを送るには3NOP以上のマージンが必要と判明している。

WS001327.JPG

残念ながら3rdDACの音質はイマイチで、実用に耐えうるかどうかギリギリの線のクオリティーだったが、ひとまずこれで3ch出力をバグ無しで実行できる体制を整えることが出来た。
posted by Yasuski at 15:12| open.Theremin

Open.Theremin@3個目のDAC&妙なバグが出た

サブCH出力用の3個目のDACを拡張基板に仕込んだ後、ケースに実装した。

IMG_8105.JPG

MAX5541のスピードが心配だったが、最低限のNOP命令でデータ取り込みのタイミングが合わせられているようだ。

IMG_8102.JPG

接続は5V電源とGND、アナログ出力、デジタル入力3線の計6本で行っている。

IMG_8103.JPG

配線はブレッドボード用のピンを使った。

IMG_8106.JPG

この状態は仮で、DACの接続を思い切り間違えている(写真)。 実験用とはいえ、このようなスパゲッティー状態は観るにしのびない。

配線の修正後にDACは難なく動いたが、5 Voice Modeのアドレス境界で妙なバグが出てきた。



アンテナのセンシングが遅れる気持ち悪くて面白い効果なのだけど、ライヴでいきなりこの状態にハマるのが怖い。 多分、原因はエンコーダーでドライヴするループカウンタの計数ミスで、妙なループにハマった結果と思われる。 幸いなことにアドレスを変更すればバギーな状態を脱出できる。 エンコーダーの循環数の管理をきちんと行えばバグを回避できる可能性が高いので、ひとまずは該当部周辺の手当を行ってみよう。

DACはMCU側のボトルネックが心配だったが、すんなりと音が出た。 現状は素直にOSC1のみのモノラル信号を再生しているが、これはadatに送信するデータの大元になるものを16bitにダウンサイジングした信号。 エンヴェロープにちゃんとピークが2つ出来ていることから、Transitionの個別制御が上手くいっている感触だ。
posted by Yasuski at 02:37| open.Theremin

2018年06月25日

Open.Theremin@操作マニュアルっぽい映像を製作する

IMG_8094.JPG













posted by Yasuski at 20:27| open.Theremin

2018年06月24日

死亡したTeensyを復活させる方法

USBによる接続が不可能となったTeensyを復活させる方法を見つけたので備忘録を書いておく。

原因は定かではないが、一種のシャックリのようなものと思えば良いらしく、接続が絶たれただけでMCU自体は死亡していないようだ。

対処法はMAC系のプラットフォームを使用する場合が簡単なようだ。 まずはArduinoを起動して、なんでも良いからスケッチのコンパイルを行い、Teensyの書き込みソフトを起動する。 次に、故障したMCUのリセットボタンを押しながらUSB端子を接続すると、あら不思議、何故かデバイスの認識が行われ始める。

これで、死んだと思って放置していたTeensy3.5と3.6の2個ずつ、計4つのデバイスを復活できた。 ここで断捨離をやらかしていたらこの発見はなかったわけで、とにかくゴミと思われるものであってもある程度は保持する必要があるのだな、、、と痛感させられた次第。
posted by Yasuski at 01:07| AudioElectronics

2018年06月23日

Open.Theremin@不安定な発音状態の原因を探る

テルミンのPitchが不安定なのだが、いきなり周波数が変動する現象は物理面の不具合を疑ったほうが良いかもしれない。 完成した楽器を修正のために分解しまくるのはこういった弊害を誘発する可能性がある。 試作機の構造はその辺を考えないとイカンなあと反省させられる。 

IMG_8092.JPG

低音域が安定しないのはその所為かもしれない。 電圧が変動する原因の可能性として電源コードを疑ったら、どうもこれが半分正解だったようだ。 Hiroseの6pin中継コネクタの接触が経年劣化で悪くなっていたのだろう。 不安定な状態を現出させる要因を取り除くために、試作テルミン専用のケーブルを造った方が良い。

あと、下の音域が暴れる問題は、Wavetableの読み出しレートを再検討すべきと感じているが、ハードウエアとソフトウエアの抱える問題を切離すために、一度アンテナによる制御を介しない固定ピッチで音源自体の素行を調査する必要がある。 要は、ノイズを誘発する「制御データの揺れ」が何処で発生しているかを見極めなければならない。 「読み出しレートの固定」は、既に和音を構成してプリセットを行うモードに導入済みだが、現在はフリーな状態のロータリーエンコーダー&doubleの定数でピッチを設定する3オシレーター分の周波数を固定化して評価を行うことになる。

アンテナへの電磁波の影響や、電源の多重供給が原因でMCUをぶっ飛ばす危険を防止するために、楽器の実証試験をPCと離れた場所で行うことにした。 プログラムをロードしたあと、楽器を抱えながらスタンドとアンプを置いた玄関とPCがある自室を行ったり来たりすることになるが、MCU一発4Kオーヴァーをご逝去させないためには安い苦労である。

で、クリーンな電磁環境下でテストを行ってみたところ、電源ケーブルの交換で多少マシにはなったものの、やはり低い方のピッチが安定しないことが判明。テスト時にアンテナのエクステンションは取り外してあったが、どうも物理要因で決定される方のレンジの狭さが原因な雰囲気ではない。

比較のためダイエット前のプログラムに戻してもこれといった変化はなし。 とにかく音が濁るのだ。 この感触はアンテナ経由でノイズが乗って来ている風なので、アンテナのノイズを消すためにデジタルLPFを復活させてみたが、こちらも効果はあがらず。

結局は消去法からデータのバタつきに起因するトラブルと判断してセンシング後のデータ幅を13bitに戻したが、コレが正解だった模様で、コード改修後の音源は低音域まで安定して動作している。 

定数の変更によるトレードオフは当然ながらアンテナの有感帯が狭まることで、これはチューニングがより難しくなることを意味するが、キャリブレーション時に安定した状態で可能な限り大きな変化幅を確保することで対処できるようだ。

この辺りのメソッドを確立しないかぎり製品化は難しいと思っているのだが、「こちらは土台を提供するだけなので、あとは勝手にやってくれ」というスタンスもアリだろう。

さて、どうしたものか。

この実験を行う前に見切り発車で次のヴァージョンの基板を発注してしまったが、これにはDACを3個まで載せることが出来る仕様とした。 実際に現用のハードウエア上でダミーのDACをカラ運用で駆動してみたが、システムは音が濁ることもなく安定して稼働している。
posted by Yasuski at 20:27| open.Theremin

Open.Theremin@処理システムのダイエットを行う

追加したOpen.Thereminの音響処理に関するタスクが増えすぎたので、あまり効果の無さそうなものからダイエットを始めることにした。

まずは、様子見でPitch/Volumeアンテナのセンシングを行っている部分のデジタルLPFを削除してみたが、これは機能を取り除いた後にあまり差が出ない感じだったので、そのまま削除を決定した。

次に、コンパイル時にアラートが出ていたVolumeCurbのWavetableを読み出すアドレスの閾値を設定する部分だが、事前にデータ型を符号無しから符号ありに変更してアラートを回避している。 この部分を仮に削除するとVolumeAntの遣い勝手が極端に悪くなることを確認できたので、残すことに決定。 

また、読み出したデータを丸めるLPF群は、削除後に音色が悪い方向に変化した雰囲気だったので、Wavetable系のデータを扱う部分の閾値設定&アウトプットに噛ますLPFは全て残すことにした。

ちなみに、これらの機能を除いても(ノイズが減る方向の)音質の改善は認められず、逆にOverloadモードのクリッピングが上手くいかなくなる弊害が発生していた。

今回は、本格的なダイエットを行う前の小手調べといった感触ではあったが、そろそろオシレーターの数を減らす、もしくは現時点で24bitに設定している音声系のデータ幅を16bitに縮小する等の大規模なタスクの削減にトライすべきフェイズになってきた。
posted by Yasuski at 05:58| open.Theremin