2018年01月24日

OpenTheremin@DACの選定に関して

オーディオ専用DACは基本形態がステレオ運用/データ型が2’sコンプリで右詰めなために、マイコンと接続を行うにはタイミングの制御が難しい。

IMG_7853.JPG 

ならば、FPGAで専用のデータレジスタを組んでもよいのだが、より直接的な方法として高分解能な工業用のDACを使う手もある。

去年はMAX5541という16bit分解能でコスパが良いチップを発見しているが、何故かこれの製作例を見つけらない。まあ、シンプルに運用できるものなので問題はないのだが、自作界隈ではマイナーな扱いなのだろうか。

オーディオ専用DACのデータ入力のタイミングチャートは最も単純なものでもこんな感じで、

WS001222.JPG

これにヴォリューム設定やらなんやらの付加機能がくっついてかなり難解なことになっているのが最近のトレンド。多分、カーステ用途を意識していると思われるも、単純な楽器に組み込むには無理がありすぎる。 オーディオ専用のチップは単機能なタイプであっても、WSが固定周期でDINが右詰めなのが使い難い。

一方、これがMAX5541のタイミングチャートで、CSの立ち上がりでデータが確定するという物凄くシンプルなルール。

WS001221.JPG

MAX5719は20bitなのが魅力的ではあるが、データ確定パルスを受けるLDACが追加されて通信に4線必要なのと、何故かBCKに24クロック要求されるのがややこしい。

WS001223.JPG

ちなみに、16bit版のMAX5717はLDACが必要であるもののBCKは16発でOKなので、使い勝手は良い。
posted by Yasuski at 10:52| open.Theremin

2018年01月23日

OpenTheremin@DAC動作不良の原因を発見か?

音楽を聞きながら、プレーン状態の基板を何気に見つめていたところ、DACに接続するリファレンス電圧を生成している回路周りの配線が怪しそうだと思いつく。

試しに、Eagleの回路図を調べたところ、"R16"の電源電圧側の端子が断線していることが判明した。 

WS001218.JPG

画像は修正済の回路パターンで、端子の直近に電源ラインが通っているために修正を行うのは容易だが、なんとも情けない話ではある。

WS001219.JPG

これで、問題が完全にフィックスされるという保証は無いが、ひとまず修正を行ってみよう。

複数チャンネルのDACが稼働すればOverLoadMode時に発生するレベル差の問題を物理的に解決出来るので、ここが頑張りどころだ。

追記:

無事、16bitDAC、MAX5541/2系統の動作を確認した。 

IMG_7851.JPG

OverLoad系の出力は新たに専用の出力系統を追加して、16bit精度でアウトすることになった。 

IMG_7852.JPG

次の改良ヴァージョンでは、基板上にレベル調整用のトリマを追加する予定。



posted by Yasuski at 11:01| open.Theremin

2018年01月22日

OpenTheremin@倍音構成のプリセットに関して

OverLoadModeを2音構成で実験しているが、多彩なパターンで倍音のコントロールを行えることが判ってきた。



例えば、2音で出力を構成した場合、

case 2: pointer = pointer + (add_val);
pointer2 = pointer + (add_val);
pointer3 = pointer + (add_val);
pointer4 = pointer4 + (add_val * pitch1);
pointer5 = pointer5 + (add_val * pitch1);
pointer6 = pointer6 + (add_val * pitch1);
break;


のように、前後半にバンクがハッキリと分かれているために、判り易い形で倍音構成の変化を体感できる。

これが3音になると、

case 18: pointer = pointer + (add_val);
pointer2 = pointer + (add_val);
pointer3 = pointer3 + (add_val * pitch5);
pointer4 = pointer4 + (add_val * pitch5);
pointer5 = pointer5 + (add_val * pitch9);
pointer6 = pointer6 + (add_val * pitch9);
break;


構成が複雑になった分、左手のオペレーションの難易度が上がってくる。 

4和音の場合は更にリエゾンが細かくなるが、

case 27: pointer = pointer + (add_val);
pointer2 = pointer + (add_val);
pointer3 = pointer3 + (add_val * pitch4);
pointer4 = pointer4 + (add_val * pitch4);
pointer5 = pointer5 + (add_val * pitch7);
pointer6 = pointer6 + (add_val * (2 + pitch2));
break;


実用性を考えて、自然な感覚の倍音構成を意識したチューンに変更を行うべきだろう。

つまりは、プリセット音階を用いて最適化するのが一番賢い方法と思われるので、今後は専用のアレンジを考えていくことにする。
posted by Yasuski at 21:16| open.Theremin

OpenTheremin@新たに認識されたバグを修正する

まず、Wavetableの選択時にフリーズが発生する深刻なバグは、potXが負の値にならないように対策を行うことで解決できた。

case 16: pot9 += encoder2->getValue();
if (pot9 != lastV ) {
lastV = pot9;}
if (pot9 < 0){
pot9 = 0;}

pot9b = ((pot9 >> 2) % 21);
if (pot9b > 21){
pot9b = 21;}
if (pot9b < 1){
pot9b = 1;}
else{
pot9b = pot9b; }; break;


次に、TransitionControl時に発生していたリエゾンでピッチに段が付く現象は、ヴォリューム設定値に+1のオフセットを加える事で解決。

temp_Volume_a = (((uint16_t)pgm_read_word_near (volumeCurb[0] + vol_mod)));
temp_Volume_a = ((temp_Volume_a * vol_16)>>11) + 1;


ついでに、Wavetableを読みだすパートにもオフセットを追加しておいた。

temp2_val_a2 = ((temp_val_a * temp_Volume_a) >> 9)+ 1;
temp2_val_a = (temp_val_a * vol_16) + 1;
temp2_val_a = (temp2_val_a >> 9) + 1;


トランジションモードにおいて音色メモリー時のアドレス告知音が聞こえなくなる現象は、Wavetableの音量設定を行うパラメーターを並列化したために発生していた。 これをフィックスするため、該当部分に音量設定用の関数、 temp_Volume_a = 1024; を加える修正を行った。

以上で、新たに認識されたバグは全て潰すことができたが、起動時にオシレーターの周波数を設定するDACに値が読み込まれない現象は未だ解決の目処が立っていない。

posted by Yasuski at 15:34| open.Theremin

2018年01月21日

OpenTheremin@OverLoad機能専用のメモリーCHを設定する

利便性を向上させるために、新設したOverLoadModeの記録を行うためのアドレスを3ch分追加することにした。

改修後のアドレス設定は、TransitionControlModeが10ch、FixedAdditiveWaveformModeが3ch、OverLoadModeが3chといった布陣となっている。

OverLoadModeは追試を行った時の再現性が問題となっているが、メモリー機能の追加が助けになることを期待している。

実験の結果、基本波×6のセッティングが使い易い感触で、これを3和音モードによって倍音構成を決定し、トランジション=左手の振り幅をVolumeノブで調整する用法が的確と思われる。 各波形の選択に関しては、非対称波の扱い方次第で表現の可能性が広がることを感じているが、試行錯誤を行う前に予め左手の物理的な挙動と出音との相関関係を理解しておく必要がある。



また、波形選択時にアドレスの最小値以下(左回り)にノブを回転させた場合に発生するハングアップが問題となっていて、これの予防を行うべくコードの精査が必要だ。
posted by Yasuski at 12:33| open.Theremin

2018年01月20日

OpenTheremin@左手でディストーションをコントロールする

ヴォリューム機能を実装する過程で、アドレス#15の出力値固定で波形のみを選択できるモードが過負荷による機能不全に陥ってしまった。

が、これは使い方次第で面白い表現が出来そうなので、改善を行わずにこのままの状態を温存することにした。



ディストーションのコントロールは左手で行うが、操作できる位置はかなりクリティカルなので演奏にはある程度の熟練が必要。 この時点で選択した波形は全て基本サイン波。 同一波形を選択することで、より容易に歪を得ることが出来る。 和音モードを利用することで、波形を選ばず恣意的にそれっぽい倍音を構成できる。

また、波形の選択によって、より複雑な倍音を得ることが出来そうだ。

有感帯が狭いのが欠点だが、今後はそれを含めてセッティングを研究していきたい。
posted by Yasuski at 19:12| open.Theremin

Open.Theremin@VolumeControl系の改装案

夢のなかで、テルミンのヴォリューム回路の大改装を思いついたので、備忘録を書いておく。

現状は、全体の音量を決定するグローバルコントローラー vol_16 と、音源毎に過渡的な音量カーヴ=トランジションコントロールを持たせたローカルコントローラー temp_Volume_x が6系統の計7種類のデータをハンドリングしていて、前者はWaveTableの波形選択直後のデータ読み出しの段階で、後者は音源のミックスを行う段階で出力値を決定させている。

一方、トランジションコントローラーの各出力値は、グローバルコントローラーから出力される数値

vol_16 = (((uint16_t)pgm_read_word_near (volumeCurb[6] + vol_vd)));
if ((vol_16> 0)&&(vol_16<4096)) {vol_mod = (((vol_16 + 2047 ) % 2047));} // volume value as the controller if value in range


によって波形読み出し用に登録されたオフセットが掛けられたデータカーヴ群を呼び出して

vol_mod = constrain(vol_mod, 1, 2047);
temp_Volume_a = (((uint16_t)pgm_read_word_near (volumeCurb[0] + vol_mod)));


生成されているが、この結果に対して何ら処理を行わず、波形を合成する段階で各音源バンクの出力に掛けあわせて

temp2_val_a = (temp_val_a * vol_16);

最終的に出力される音量を調整していた。

以上に示したように、現状のコードでは音量コントロール関連の計算工程が分散していて、余りスマートな処理とはいえない。 これを、予め各ローカル出力にグローバルコントローラーの数値を掛け合わせる形に改装することで、

temp_Volume_a = (((uint16_t)pgm_read_word_near (volumeCurb[0] + vol_mod)));
temp_Volume_a = (temp_Volume_a * vol_16);
temp_Volume_a = (temp_Volume_a >> 11);


よりスムーズに処理を行える可能性がある。

例えば、トランジションコントロールを行う為に煩雑な構成の波形合成を行うコード

case 17: temp2_val= ((temp2_val_a * (pot4a17 * volumeInc)) * (temp_Volume_a)) + ((temp2_val_b * (pot5a17 * volumeInc)) * (temp_Volume_b)) + ((temp2_val_c * (pot6a17 * volumeInc)) * (temp_Volume_c)) + ((temp2_val_d * (pot7a17 * volumeInc)) * (temp_Volume_d)) + ((temp2_val_e * (pot8a17 * volumeInc)) * (temp_Volume_e)) + ((temp2_val_f * (pot9a17 * volumeInc)) * (temp_Volume_f)); break;

上にある、WavwTableからの出力 temp2_val_a を、新たに製作したトランジションコントロール専用の出力

temp2_val_a2 = ((temp_val_a * temp_Volume_a) >> 9);

と置換することで、以下のように構成が簡略化された。

case 17: temp2_val= ((temp2_val_a2 * pot4a17) + (temp2_val_b2 * pot5a17) + (temp2_val_c2 * pot6a17 ) + (temp2_val_d2 * pot7a17) + (temp2_val_e2 * pot8a17) + (temp2_val_f2 * pot9a17)); break;

実験の結果、計算の処理が重くなる doubleな係数 volumeIncを排除出来たお蔭で、TransitionControl時に発生していた妙な歪みが解消している。
posted by Yasuski at 02:01| open.Theremin

2018年01月19日

chords

addr01.png
addr02.png
addr03.png
addr04.png
addr05.png
addr06.png
addr07.png
addr08.png
addr09.png
addr10.png
addr11.png
addr12.png
addr13.png
addr14.png
addr15.png
addr16.png
addr17.png
addr18.png
addr19.png
addr20.png
addr21.png
addr22.png
addr23.png
addr24.png
addr25.png
addr26.png
addr27.png
addr28.png
addr29.png
addr30.png
addr31.png
addr32.png
addr33.png
addr34.png
addr35.png
addr37.png
addr38.png
addr39.png
addr40.png
addr41.png
addr42.png
posted by Yasuski at 10:47| open.Theremin

2018年01月16日

Open.Theremin@VolumeControlModeの拡張を行う

ほぼ1年間/2モデルのハードウエアの運用でOpenThereminのプログラム可能な音源16アドレス分の使用頻度を吟味した結果、最後尾にアサインしていた音色固定モード8CHは殆ど使われることがなかった。

一方、直前にアサインしていた出力値を可変できるVolumeControlモードは使用頻度が高く、遊んでいるCHが勿体無い。 ということで、後半の4アドレスをVolumeControlモードに変更することにした。

やはり、動的制御の魅力は抗い難く、ノイズっぽい低品質な出力とトレードオフ出来る機能と判断している。

スケッチを改変してアップロードを行って確認したところ、処理アドレスの変更は問題なく行えた。

次に、沈黙している16bitDACのテストを行っが、オシロスコープでロジック出力の波形を観る限り破綻はなさそうだ。 これで、ハードウエア側に問題(電圧レベル等の)が発生している可能性が大きくなってきた。

試しにDACの出力を検証するためのスケッチを走らせて出力電圧を測ってみたが、何故か電圧が出ない。 この結果は後に回路図をチェックした結果、測定ポイントを勘違いしていたためと判明しているが、他にもコンデンサの実装を間違えたりとミスが散見されている。 機械的な失敗は測定以前の問題なので、一度修正と確認を行った後、再度試験を行うことにする。
posted by Yasuski at 03:42| open.Theremin

2018年01月15日

またもや機材車のエンジンにトラブルが発生する

夕方になって買い物に出かけるつもりがVWの6気筒エンジンにトラブルが発生、エンジン関連の警告灯が点灯してパワーが上がらない。エグゾーストパイプから異臭がするのは生ガスを吹き出している証拠。

出立を諦めてクルマに診断用のデバイスを接続して故障箇所を探るってみると、1気筒目がミスファイアを起こしている模様。フードを開けてイグニションコイルユニットを引き抜くと恒例のイグニッションコイル折損事故(3回目)な事が判明する。

とりあえず、工具を持っていそうなJAFを呼んで、折れた部分の引き抜きを依頼するも、サービスカーは狭い部分に届くプライヤーを持ちあわせておらず、当てが外れる。 結果、自力修理、もしくはディーラーまでクルマを牽引というアレな状況に。

折損するVWのイグニションコイルは明らかに欠陥品だが、何故か日本のディーラーはそれを認めず有償修理扱いという鬼畜な対応なので、出来れば自力で修理を行いたい。

こんなこともあろうかと1年半前に輸入していたスペアを活用する絶好の機会が到来したのだが、プラグホール奥に鎮座する折損部を引き抜かないことにはスペアパーツは役に立たない。

で、JAFのおっちゃんと協議した結果、歯医者が持っていそうな返しの付いた工具で対応できるのでは?との示唆を貰う。

ナルホドその手があったかと、ひとまずJAFにはお帰り頂いて、在庫している自転車用チタンスポークの折れ曲がった部分をダイヤモンドルーターで研磨、折損部のクリアランスにねじ込んで折れたパーツを引き抜くための工具を自作した。

チタンスポークは激硬いので強度的には問題なさそうだったが、押し込んだ工具を回転させるのが難しい。トルクを加えられるように、スポークのストレート側を折り曲げて持ち手に加工した後、折損部の一番奥に至るまでスポークを押し込み、これを回転させて詰まった折損部を引きぬくことが出来た。

心配だった代替パーツの互換性は問題なさそうな感触だったので、町内を一周してエンジンの動作を確認しておいた。

まだヤバそうな死亡が確定しているパーツがあと3本残っているので、保険のために改めて代替用のパーツを発注しておいた。製作した治具は使い易いように再加工して、故障判断デバイスのケースに入れておく。

今回は、合計で20K程の節約ができた計算だが、そもそもリコール扱いのパーツをなんで自腹で揃えにゃならんのかと微妙に納得いかないのがトホホ。
posted by Yasuski at 04:20| AudioElectronics