2016年10月31日

open.theremin@3.6対応の互換ボード

結局、自分は「演算機はパワーが命」な価値観なので、Teensy3.6が搭載できないボードを作っても意味が無いと結論、大改造を行って3.2/3.6対応の互換ボードをデザインした。

ottsy361.png

例の如く、どこかの配線を失敗してそうなので暫く寝かせることにしたが、DACが3つ使えるのに2つしか対応できない設計は如何なものかと考慮中。

そのDACは配線の取り回しが不可能に近い状態で、オプション扱いで手配線することになったが、ジャンパー1本なのでまあ許してもらえるレベルだろう。 それぞれの出力端子を出してあるので、無理をすれば複数のDACのミックスが可能。

dac2.png

dacPort.png

Teensy3.6では、デジタルポート D31/32 がアナログ入力ピン A12/13 と重複するため、3.2の一連する端子 D31/32/33 をD37/38/39にズラして共有している。 これらの端子に関しては、ソフト側でなんとかしてチョーダイという姿勢だ。 この他、遊んでいたD27を引き出せたのと、

pin27.png

新たに D35/D36 を追加しておいた。 Teensy3.6の場合はA4〜A7を含めて、これらのポートでロータリーエンコーダーのLEDを制御できる。Teensy3.2ではA4〜A7に加えてD2/D8/D27で対応する構想だが、D2/D8は5V系なのでLEDをドライヴしているインバーターへのオーヴァーボルテージが心配になる。

port35.png

3.6は3.2とは仕様が違って全入力が5Vを受け付けないことから、LED系の扱いにまたもや迷いが生じている。

追記; 安全のため、3Vに戻すことにした。

replaceTo3V.png

DACの信号を非反転のOpAmpで受ける意味が殆ど無いので、反転入力でオーディをミックスするのもアリ。 その場合はアナログVRの使用も選択肢に入ることになるが、超小型のシングル・オペアンプを新たに3機投入するのがベストな気がしてきた。この方式だと16bitDACからの出力が想定されるDCの扱いを整理できるという利点がある。

アナログ回路の電源はデジタル系とは分離済みだが、LCフィルターを突っ込むことを失念していたので、あとで追加を考えよう。

OpenThereminのサンプリングクロックを排除する為のLPFは、非常にショボいのが実装されているが、この基盤に関してはCOFが15kHz位のマトモなものを追加すべきだと思う。

newBuffer.png

追記:  ということで、SOT5サイズのシングルOpAmpを3個追加したが、

CloseUp.png

そろそろスペースが限界っぽい。 グランドポイントを打ちまくって「島」が出来ないように頑張ってはいるものの、これはもう完全にパズル。

gndpads.png

オプション関係を今一度整理すると、、、

1)ベーシックモデルにはアナログ電圧・デジタル信号のレベルシフターを標準で装備する。  
2)RGB照明付きロータリーエンコーダーは一個ずつのオプションで、単価は1.5k位になるか。 
3)DACは、DAC0からDAC2までオプションがあって、DAC2は16bitのAD420を実装する。 
4)DAC用のOpAmpは稼働させるDAC毎に付け足していく。 DAC0/1はOpAmpを足すだけなので、0.5kステップくらいが妥当か。 
5)AD420は単価が高いので、2.5k位に設定する。
6)オーディオクロックが欲しい場合はPLLの信号ジェネレーターを選択できるが、これも2.5k位になるか。

ちなみに、RGM照明ナシのロータリーエンコーダーは、SW側の端子のピッチさえ気にしなければ装着が可能。スイッチ側は手配線となるが、直近にグランドポストが設置してあるので問題はないだろう。

基板の単価を考えなければならないが、4kでは完全に足が出る感じで、6k弱がギリギリの採算ラインとなりそう。

追記2:

終段のOpAmpにバイアス回路を追加した。

WS000881.JPG

これで、ゼロポイントが移動して見える奇妙な波形は出力されなくなるか。

vlcsnap-2016-10-21-05h29m15s020.png
posted by Yasuski at 00:39| open.Theremin

2016年10月28日

アウトレンジの恐怖

実際にテルミンを演奏する時に自分が一番気になるポイントがこれ。

テルミンはサブっぽい立ち位置の楽器なので、ダメなときは休場することになるのだが、それでも本番前のドタバタ状態で音が出ないことを経験するのはあまり気分の良いものではない。

アウトレンジとは、テルミンに搭載されたオシレーターの発振周波数が何らかの理由で影響を与え合う相対位置から外れてしまったことで、相互干渉出来る位置から周波数が離れてしまうと、当然ながら音が出なくなる。

温度や湿度だけではなく、現場の電界強度等のよく解らない理由でチューニングが狂うのがテルミンという楽器の特性なのだが、計測機器無しで勘でチューニングを行った場合にドツボに嵌まるパターンを何度も経験してきた。

トラブルに対する対応方法としては、なによりチューニングロッドの常時携帯、チューニングを行うためのアクセスポイントの確保(要は筐体にチューニング窓を開けてしまう)アースポイントの確保、リニアリティーに影響を与えない範囲で行う電磁シールドの徹底、そして、バッテリードライヴ化による電位差の排除といったところか。

なによりベストと思われる対処法は、調整コイル等の可動部分を極力無くす方向で設計を行うことなのだろうが、市販品ベースのものを使用する場合は、前述したような項目の改造を適宜行うことになる。 

今回、OpenThereminが採用しているVariCapによるトリマー機能は他のThereminにも応用できそうなアイデアなので、コイルの固定化+Varicapの使用でどこまで安定化を目指せるかとても興味が有るのだが、制御をマイコン経由で行わずに手動に頼る方法を確立する必要がある。
posted by Yasuski at 10:23| Theremin

open.theremin@オシレーター基板のデザインを変更する

Teensy3.6の回路図が公表されたので、得られた情報に合わせて基板のデザインを変更した。

WS000868.JPG

変更で注目していたポイントはFTM関連のポートのアサインで、Teensy3.6ではFTM3にアクセスできることが判った。

該当するピンはD2/D14ということで、ここに設定していた

#define buttonPin01 2 // Button Pin on D2
#define button_State1 (CORE_PIN2_PINREG & (1<<0))



#define SAMPCLK_STATE (CORE_PIN14_PINREG & (1<<1)) //sampling clock in
#define SAMPCLK_MASK (CORE_PIN14_CONFIG = PORT_PCR_IRQC(0)) //masking sampling clock in
#define SAMPCLK_ACTV (CORE_PIN14_CONFIG = PORT_PCR_IRQC(9)) //activate sampling clock in

は、ソフト上で別のポートに移設することになる。

このうち、サンプリングクロックの供給は物理なので、基板の配線をD14からD15に移設している。

WS000869.JPG

D14の接続は、基板表面に変更した。 このポートはオプション扱いなので、レイアウトに多少の不整合が生じても無視している。 両ポート共にランドにハンダを盛ってU-FLと通常端子の接続を選択することが出来る。

ついでにLatch02をD8からD10接続に変更、

#define LATCH02 10
#define LATCH02_ON (CORE_PIN10_PORTSET = (1<<4))
#define LATCH02_OFF (CORE_PIN10_PORTCLEAR = (1<<4))

LEDgrnは8番に変更、

#define LEDgrn 8 // LED on D8
#define LEDgrn_ON (CORE_PIN10_PORTSET = (1<<3))
#define LEDgrn_OFF (CORE_PIN10_PORTCLEAR = (1<<3))

D9には、LEDred を既にアサインしているので、buttonPin01のアサイン先はD20に仮設することにした。

FTM3は常に稼動状態に出来るように、予め設定を行っておくことにする。

現在、Teensy3.2と3.6を対象に開発を行っていて、基盤もそれぞれに対応した2種類を製作中だが、ここに来てハードウエアに由来する設定の違いが出てきた。 開発の同時進行は不可能ではないが、V3基盤は大きな仕様の変更がなされているので、対処に時間がかかりそうだ。 ということで、年内はV2基盤を実装した現行試験機をベースに、3.6をターゲットとして開発を行うことになりそうだ。

posted by Yasuski at 10:03| open.Theremin

open.Theremin@Teensy3.2専用拡張ボードの設計

オリジナルのopen.thereminShieldを装着できるTeensy3.2専用の拡張ボードを設計している。

WS000800.JPG

V3から基盤のサイズが大きくなったので、こちらも躊躇なく大型化した。 Teensy3.2の端子はその殆どを引出しているが、予備の2端子D26とD27は未接続となっている。

WS000803.JPG

V3は、従来の基盤裏面が「正面」に変更されたが、

otv3andarduino.jpg

この拡張基盤はその「正面」の上に乗せる設計。しかも、Teensyは裏側=基盤にサンドウィッチされる形で取り付けられるという、変則的なデザインとなった。専用のロープロファイルなコネクタを準備出来ない場合は、Teensyを直付けという恐ろしげな選択を迫られることになる。

理由は単純で、Teensyに引き出された端子の機能がArduinoとはほぼ逆になっているためで、2層基板ではこれが限界。 機能の呼び出しと設定には2個のプッシュ・スイッチ付きロータリーエンコーダーを使用するので、使用不能となるオリジナルのコントロールポットの代替は余裕で可能だ。

WS000798.JPG

ロータリーエンコーダーはオプション扱いで、裏面にはPhotoMosRelayをセットで取り付けられる。エンコーダーとスイッチの配線は予め行われていて、これはTeensy裏面にリザーブされている端子群に接続される。 LEDは接続端子を引き出したのみだが、各端子には抵抗を実装してある。 アノードコモンのスイッチにはPhotoMosRelayを接続してあるので、プッシュでグランド電位となる。 アノードコモン故に、LED点灯の極性は負論理。LEDのドライヴ電圧は5Vとした。

WS000799.JPG

PLL制御のオーディオクロック生成オプションも準備している。 サンプリング周波数は基板裏にあるランドをハンダ付けすることで選択が可能。

WS000796.JPG

そして、16bitDACもオプション扱いとした。

WS000797.JPG

実験段階では、フル装備で運用を行って稼動状態をテストするが、特に16bitのDACを使用した場合には、同時発音数が削られることになるかもしれない。

グランドの「島」が出来ないように、配線の取り回しを試行錯誤することになるが、

WS000804.JPG

とにかく白い部分を作らないのが目標。

WS000802.JPG

追記:


オシレーターの信号を細い配線で基板中を引き回すのは精神衛生に悪いので、信号ラインを割ってU-FL端子を追加した。 レベルシフト後の信号はシールド線でTeensyに直結される。

WS000805.JPG

高周波回路のセオリーを踏襲して、配線にラウンド加工を行って可能な限り鋭角な部分を排除した。

WS000806.JPG

追記2:

直結だった、A10〜A13の4入力に過電圧保護用の抵抗を追加した。 3.3Vに統一された電源では、抵抗と並列に配線したランドを短絡することで、保護回路をスキップできる。

WS000808.JPG

追記3:


ロータリーエンコーダーのアノードに供給する電圧を3.3Vに統一し、LEDドライヴ用のバッファー74XXX3G14を左右それぞれの回路に追加した。

WS000871.JPG

未配線だった右側のタクトスイッチに配線を行った結果、接続できない入力端子はD27のみとなった。

WS000870.JPG

ここで、接続端子の設定状況を整理しておくと、AD420はD28,D29,D30に、ディテクター入力のD2/D8pinはD22/23に、タクトスイッチ(左右)は、D33とD26に、ロータリーエンコーダー(左右)はD24,D25 / D32,D31に、接続している。

追記4:

ロータリーエンコーダーに搭載されたLEDの接続先は任意だが、引き出されているデジタルピンが5Vルールに変換されているので、この部分だけを3Vにすると混乱が発生することに気付いた。 実は、LEDの端子群をTeensyに直結することを想定していたのだが、この場合レベルシフターとの間で発生するであろう信号のコンフリクトを危惧した結果、ロータリーエンコーダーのアノードに供給する電圧を5Vに戻すことになった。 同時にLEDのドライバーとして追加したインバーターへの供給電圧も5Vに戻している。

AD入力に関しても変更があって、A10〜A13の4端子はADC直結なのを思い出したため、オペアンプ経由の入力をこちらに割くことにした。 具体的には、A0〜A3までは今までどおりオペアンプを経由した接続となるが、A4〜A7は保護抵抗を介した直結構造とする。このグループはデジタルピンとしても活用することができるが、その場合は抵抗と並列に配置されたランドを短絡すれば良い。 

WS000872.JPG

AD関連の変更をまとめると、A0〜A3、A10〜A13はアナログ端子専用、A4〜A7の4本はデジタル・アナログの併用が可能となった。

追記5:


回路図を清書している過程でチョロチョロと失敗を見つけたが、電源系のエラーには何故に出るのかよく判らんのがある。

WS000873.JPG

回路図を見ながらオプションの扱いについて考えたので、メモを残しておく。

1)スタンダードとして、基板オンリーの販売から行うべきか?

2)基本系は電圧変換IC4個とQuadオペアンプ×2個のセット。 これだけでも、かなりの贅沢。電源はジャンパで全電源を5V仕様とする。

3)まずは、ロータリーエンコーダーのオプションで、RGBロータリーエンコーダーとドライバICを2セット追加。アノードコモンのタクトスイッチと連動するPhotoMosRelayが付属する。

WS000875.JPG

4)次がオーディオ・オプションで、12V駆動が可能なオーディオ系OpeAmpが1個乗っかってくる。 この時点でTeensyのDAが使えるようになる。 12Vに拘るかどうかは微妙なところで、このレベルでは5Vに統一したほうが良さそう。 電源の供給は、12Vライン専用に使用するコンデンサーのランドと、基板左右にある5Vポストを結べば良い。

WS000874.JPG

5)高精度オプション其の壱。 AD420が乗っかって16bitオーディオもしくは高精度CVの出力が可能になる。電源は12Vが追加。 電源電圧の関係で、このオプションを選択した時点から外部電源が必須となる。

WS000876.JPG

6)高精度オプション其ノ貮。 専用のオーディオクロックを生成する。PLL-ICと分周器、それとクリスタルが搭載される。 U-FL端子で中継されるクロックは、基板裏のジャンパランドで周波数を選択できる。 TeensyのD3側では、OpenThereminShieldからのサンプリングクロックとオプションのオーディオクロックの何れかをこれまた基板裏のジャンパランドで選択できるが、こちらはOpenThereminのクロックがデフォルトで選択される仕様で、オプション装着時はジャンパランドを切り離してハンダによる再接続を行う。

WS000877.JPG

とまあ、こんな感じか。 U-FLが標準装備とは贅沢な気がするので、廉価版はジャンパ線直結というのもアリか。 
posted by Yasuski at 01:36| open.Theremin

2016年10月25日

機材発注の記録

ArduinoUno用のプロトタイピングボード5枚を発注した。

prototypingArduinoUnojpg.jpg
posted by Yasuski at 18:39| Diary

USBマウスの製作

昨日は、軍用ラップトップのジャンクを復活させるために、マウスとキーボードの仕様を解析していたので、OpenTheremin関連の作業はポリ音源化のコードを書くのみで、現物系の作業はお休みした。

そのマウスというかポインティングデバイスがクセモノで、ポインターによって平面の上下左右方向に掛かる圧力を感圧素子が検知して、抵抗値をアウトする仕組みだった。 配線は黒がコモンで、隣の緑から順に下・右・上・左に圧力が掛けられた場合の抵抗値(変化は減少方向)が出力される。 抵抗値の変化はかなり急峻で、数MΩから20kΩ前後に数値が急変する。 そのため、ソフト側の加速度設定は必要が無いかもしれない。

この素子からマウスを実現するためにArduino/LeonardoをUSB HIDデバイスに仕立てあげるスケッチを見つけたが、単純にVRポットを2つ組み合わせた構造のものを対象にしているため、件のポインティングデバイスに応用するためには改造が必要となる。

ポインティングデバイスの出力はそのままでは使えないので、Rail to RailのOpAmpで抵抗値の変化を電圧値に変換し、これを4つのアナログポートに出力する。 Arduino側は、入力を4chに増やしつつ、負の変化をカウントするために新たな関数を追加しなければならない。 XY変化量のフルスケールは1024段階ということなので、これを512ずつ正負の値に分離してオフセットを掛ければなんとかなるだろうか???
posted by Yasuski at 06:53| Arduino

2016年10月24日

open.theremin@和音化の誘惑

新しいプラットフォームに移行してラフに演奏を行ってみたが、ClickEncoder の”Acceleration”機能は、実用上常にオン状態で問題無さそうなので、タクトスイッチをダブルクリックした時に実装する他の機能を考えている。

Teensy版ではオシレーターを同時に6基駆動しているので、せっかくならそれぞれに音程関係をプリセットして、ポリフォニック化を行いたいところだ。

そこで、空いているモードに相対的な音程関係を調整する機能を持たせたいのだが、和音で演奏をを行っている最中にデフォルトの常態に戻りたい場合が多々あるわけで、そんな時にダブルクリックでプリセット⇔デフォルトの間を行き来できると便利だ。

デチューンに関しては数字を直接いじることになるのだが、どのような数値を加えるのが良いか、実際には実験を行わないと判らないが、とりあえず必要になりそうなのは -12、3、4、5、6、12 度の音程関係と、メジャー/マイナー3和音、それとダブルヴォイスっぽい使い方が考えられる。

音源それぞれにチューニングの微調整機構を持たすか、2〜3グループに分けたものを実装するかは、処理能力のリミット次第というところになるだろうか。

相対関係の数値設定はプリセットが正解で、マニュアル設定は無駄に制御系が難しくなるだけのような気がする。


追記:


ピッチの設定は、Wavetableを読むポインタのインクリメント値で調整しているので、これをいじれば音程が変わるはずだが、同様に全ての基音をSawToothにして、マスター側の飽和値を検知し、そのタイミングでスレーヴ側のポインタをゼロにクリアすると、まんまシンクロが掛けられそうに思えるのだが、、、。 その場合、スレーヴはVRpot等でリアルタイムにピッチをズラすことになるが、そのためもあってアナログポットを1つ基板上に温存してある。
posted by Yasuski at 06:44| open.Theremin

2016年10月23日

open.theremin@OnTeensy/倍音設定用ファイルの音質

倍音のファイルは、2048段階の限定されたキャパで繰り返しの回数が増えるので、高次倍音になるほど波形の肌理は荒くなる。 特に低域を再生する場合に、トーンのザラつきが無視できないレベルに増加する。

今回は、8次倍音を使って所謂「ピッコロチューン」の演奏を試みているが、ノイズを伴った独特の音質が面白い。 



倍音の構成を工夫して和音の演奏を試みているが、レベルの調整がシビアなので別途仕掛けを組む必要がある。

posted by Yasuski at 08:49| open.Theremin

2016年10月22日

RGB Rotary Encoderについて

3色イルミネーション付きのロータリーエンコーダーのLED部分の仕様はアノードコモンだった。

WS000778.JPG

故に、電流を吸い出す方向でLEDが光る、つまり負論理で駆動するデバイスなので、正論理出力を設定した側からはLEDをドライヴするために、インバーターかトランジスタが必要になる。 

LEDの消費電力を考えると、マイコン等の送信側は出力端子を保護するためにトランジスタを噛ませるのが安全だが、問題はタクトスイッチの仕様にあった。

このスイッチは、一端がアノードコモンに接続されていて「プッシュ・オン」で電圧を出力する「正論理動作」なので、普通のグランド接続のタクトスイッチっぽい使い方をする場合は、これまた出力に論理反転回路を接続する必要がある。

Arduinoユーザーをターゲットに考えると、スケッチのテンプレートが多いカソードコモンを選択しそうなものだが、何か別に想定している使用用途があるのだろう。
posted by Yasuski at 17:51| open.Theremin

open.theremin@サウンドチェック

本日のサウンドチェックは、SEっぽい雰囲気を目指した。



「やっと音が出た瞬間」から気付いてはいたのだが、演奏中に発生するポソポソしたノイズが気になって仕方がない。

波形を調べてみると、断崖絶壁っぽい鋭角的な変化があからさまなパッツン系ノイズのシェイプとは違って、1Cycleレベルで異質な波形が混入している。 人間の耳はこの程度の変化が気になるのかあ、、、と感心している場合ではない。

で、そのような問題が発生する原因を探っていくのだが、まず、OpenThereminでは32kHzのサンプリングクロックを採用している。このクロックのタイミングで、波形が記録された元データ=ウエーブテーブルにアクセスして値の変化を読み取っていく。 読み取るデータの仕様は、分解能=変化の量が、12bi / 4096 段階、変化の方向=時間軸に2048サンプルが存在する。 これを仮に一秒で一巡するタイミングで読み取った場合、1Hzの信号が出力される。 音程を上げる場合は、読み取るタイミングのスピードではなく、データを読出すポイントを間引きすることで、始点→終点の繰り返しの回数を増やす。 例えば、10Hzの信号を出力したい場合は、時間軸にそって展開された2048セットのデータを10倍端折って読み出せば良い。 

OpenThereminでは、オシレーターの差分を数値化して、コントロール信号に変換しているが、厳密に言うとこれは「信号」という物理現象ではなく「数値」という概念である。 この値をを元に、データを読みだすポイントを端折ることで、「音程」を表現する。

前置きが大変長くなってしまったが、この端折るタイミングを間違えることで、例の「異質な再生波形」が誕生するのだが、このようなイレギュラーが発生する原因は、差分を数値化する時点のエラーが原因と思われる。 つまり、オシレーターからのデータを読み込んだ瞬間にエラーが発生しているのだが、その原因はデータを測定するタイミングを測るための仕組み「カウンター」のオーバーフローにある。

カウンターが計数できる数量は当然ながら有限であるが、CorTex4に搭載されたそれは 16bit / 65536 カウントで、フルカウント後にはまたゼロからカウントを再開する。 このフルカウントした常態がオーバーフローで、係数を行う場合の始点から終点を跨ぐ間にこれが発生した場合にエラーが出力される。

イレギュラーなデータは不要なので当然ながら間引く必要があるのだが、OpenThereminには「データを間引く」ための機能が搭載されておらず、代わりに「数値を丸める」ことで異質な変化に対処している。 故に緩慢なサイクルの変動という形で、イレギュラーなデータが補完されたと思われるが、それでも異常を認識できてしまうのが、人間の耳の厄介なところだ。

フォーラムで指摘されていたポイントはこのエラー発生時の問題で、提案では更に高度な「オーバーフローの予見」に言及されていたが、残念ながら自分にはそこまでの制御を行うためのスキルが無いうえに、ハードウエア側の制限もあって、完璧な対処を行うことは難しい。 

出来る範囲内で最善を尽くすことを考えると、とりあえずエラーデータが検出された場合に、一発前のデータを繰返すことで補完を行う方式が有効と思われる。 以下にその参考例を示す。

// Interrupt Service Routine for FlexTimer0 Module
extern "C" void ftm0_isr(void) {
// Reset count value
FTM0_CNT = 0x0000;

// Save current captured count value
FTM0Count01 = FTM0_C0V;
FTM0Count02 = FTM0_C1V;
// Keep track of overflow condition
// Read the timer overflow flag (TOF) in the status and control register (FTM0_SC)
if ((FTM0_SC&FTM_SC_TOF) != 0) {
timerOverflow = 1;
// Clear overflow flag
FTM0_SC &= ~FTM_SC_TOF;
}
else
timerOverflow = 0;
}


追記

実験の結果、オーバーフローフラッグを使った波形の修正は失敗に終わった。 エラーがあまりに頻繁に発生するために、それを一々叩いていたら音が出なくなってしまった、というなんとも情けない結果に。
posted by Yasuski at 02:30| open.Theremin

2016年10月21日

資材発注の記録

イルミネーションロータリーエンコーダ(RGB) 4個をスイッチサイエンスに発注した。

index.jpg

OpenThereminのコントローラーに搭載する予定だが、Blueには従来から設定していた13pin出力を接続する。
posted by Yasuski at 09:03| Diary

資材受領の記録

諸々到着していた資材をまとめて記録する。

Teensy 3.2 Breakout (Revision A) 2枚が到着。 

早速Teensy3.2を装着するも、リセット端子の扱いに戸惑う。

0-40MHz AD9850 DDS Signal Generator Module 2 Sine Wave And 2 Square wave が到着した。

既にTeensyduinoの導入実験は実機をベースにしたものに移っているが、今後もクロックソースが必要な実験を行う可能性が高く、近日中にセットアップを完了しておく。

他に、High Precision 3296 Variable Resistors 10K ohm が既に到着している。
posted by Yasuski at 08:58| Diary

open.theremin@Teensy専用基板のレイアウトを変更する

御利益の有無はさておき、セオリー通りに電源から回り込んでくる高周波を阻止するための仕掛けを充実した。

WS000780.JPG

まず、グランドプレーンは、Teensy周りと各オシレーター周りを完全に分離している。 これらのグランドは一点アースで接続する。

電源ラインは、全てのセクションをLCフィルターを使って切り離した。

電源の橋渡しを表面実装コイルで行っているので、基板はグランドの境界部分で完全に切り離しが可能となった。

また、オシレーターにはリードタイプのコイルを実装できるようにランドを設けておいた。 これで、周波数調整用コンデンサーと同様にSMDとの共用が可能となった。
posted by Yasuski at 01:36| open.Theremin

open.theremin@2色LEDが仕込まれたロータリーエンコーダーを使って、視認性の向上を図る



緑のターンが、PitchのTuningで、赤がVolume。 ここで、誤差を追い込むので、オシレーターの周波数安定度さえ良ければ、キャリブレーションの必要は殆ど無くなる。 

余談になるが、open.ThereminはThereminという楽器全般とはチューニングに関する概念が少々異なる楽器で、それはオシレーターのステイブルさを評価するのとは違った視点、つまりはソフトウエア側から出力側の周波数が決定されるプロセスを眺めたときにその差異を理解できる。 もちろん、オシレーターのチューニングがレンジ外にすっ飛んでしまうような状況はお話にならないのだが、数100Hz程度のズレであれば容易にリカヴァーが効く。 これは、データ上の数値に概念化されたオシレーターの発振周波数に対して「数値によるオフセット」が掛けられる強みで、旧来のThereminでチューニングの修正=「オフセット電圧の印可」を行った場合に、オシレーター全体の挙動に影響が出てしまうのとは大きな違いがある。

open.Thereminの周波数オフセット調整機構は、大元のオシレーターとは物理的に切り離されているため、その挙動に影響を与えずに大規模な周波数の移動を行う事が可能だ。取り敢えず、オシレーターの発振周波数が大まかなレベルでインレンジしていれば多少の融通は利くという点でopen.Thereminにはアドヴァンテージが存在する。

話をロータリーエンコーダーによる機能追加に戻すと、赤緑が同時に点灯する黄色で、波形選択のモードに入る。 ここでは、エンコーダーを回転させる毎に読み出すWavetableが変化する。次のクリックはリザーブしたタームで機能は実装されておらず、LEDは素直に消灯する。 本当のところは、3色LEDで表示を行いたいのだが、端子の引き出し方を間違えると盛大にノイズが発生しそうだ。

以上がテンプレートにあった基本機能だが、ノブを長押しすると「その時点で記録されていた設定は全て初期化されてゼロになる」オプション機能を追加している。これは演奏中になんらかの原因で不具合が発生した場合にパラメーターをデフォルト値に戻すための安全策で、パニックスイッチの一種と思って貰えば良いだろう。

ダブルクリックを行うとエンコーダーの変化幅が緩やかになるが、これは数値の微調整を行う場面を想定している。 普段は加速度を検知する仕様が優先されている。

現状では黄色の変化幅が広過ぎて使い難いので、将来的にはアドレスをインデックス化して設定した数値内を循環するように改良を行う予定。

作業のついでに音源を仕込み直して記録を行い、波形を可視化した。



複数のサイン波が合成されていることが判る。 

これは演奏を行った時の出力波形で、弱音を掛けた時の波形の変化が面白い。

vlcsnap-2016-10-21-05h29m15s020.png

音響屋が抱く「音声波形のイメージ」はゼロポイントの上下に振動を描くものなのだが、これは「正の値のみを扱う」DACの典型的な動きといえる。

流石に出力にDCが出ては諸般の事情からマズいので、音の出口に当たるオペアンプにコンデンサーを噛まして無理矢理に静的電圧が漏れ出すのをキャンセルしている。

実は簡易なエフェクターやラジオ等も正側の電圧だけで動いているものが多いのだが、そこは電源電圧の1/2にあたるバイアス電圧をシステム全体に印加することで、見かけ上は正負両極の変化を表現している。

今扱っている仕掛けは、回路にバイアス電圧を印加していないために、このようなケッタイな波形を描くわけだが、上下非対称な波形の音は意外と面白いものが多いので、まあ、これはこれで良いのではないかと思っている。

今後の課題はノイズ源の追加とエンヴェロープのコントロールで、時間軸の機械制御が行えれば表現力に幅が出ると思う。
posted by Yasuski at 01:36| open.Theremin

Open.Theremin@「半分デジタル」なソフトウエア側の構成を今一度復習する

基本的には、オシレーター間に発生する差分をカウントする部分が重要で、そのカウンターはチップの内部に実装された物理的な存在だ。

ソフトウエアに記述されている処理を単純化すると、まず外部から入力されるトリガー信号のアップエッジのタイミングでカウンターの値がキャプチャーされる。 つまり、トリガーの間隔が周波数のズレとして計数されて、その数値を元に波形データの読み出し速度を「音程」に変換する仕組みだ。

UNOにおける主要な入力端子は、CLK0INT0INT1 の3つで、このうちオシレーター間で発生する差分の計測を担当するのが、ピッチ側がCLK0、ヴォリューム側がINT0。残るINT1にはオーディオのサンプルクロックが入力されている。 このうち、データを直接ハンドリング出来るのはCLK0のみで、残りはインターラプトを起動する機能だけを持つ。

ARDUINO_V2.png 

信号間の差分を計測するという点で、ピッチ/ヴォリュームの計測パートは共に同じ処理を行っているが、ヴォリューム側はこれを音量の制御に使っている。 このように、Open.ThereminではEtherwave等の共振周波数をピックアップする方式とは違って「純粋にピッチの差分を測っている」ので、2音ポリフォニック化も理屈の上で不可能ではない構造といえる。

問題は、328系のArduinoにおいて「物理カウンター」を制御できるポートがCLK0に限定されていることで、カウンターから直に数値を引っ張って来れない分、コードが無駄にトリッキーな構造になっているように見える。 

今回の復習によって得られた改装のヒントは、ズバリ「コードの単純化」だ。 端子の配置を自由に行えるM3/4系のチップは、物理カウンターと入力ピンの関係が固定されていないところが大きなアドバンテージといえる。 つまり、外部から制御できる物理カウンターの選択という制約が存在しないので、差分を検出する部分のプログラムには「ほぼ同じ構造のもの」を準備すれば良いことになる。 

同様に、制御レジスタの初期設定も単純化できるので、オリジナルのプログラムが持つ構造の忠実な再現を目指すよりも、出来るだけ「仕組みを単純化する方向」で考えていくべきなのだろう。

追記:

ちなみに、移植が成功しているMegaには、外部操作が可能なカウンタ"Timer4"が存在しているが、スケッチを作成した当時は「コードの再現性」に拘るあまり、それの持つ可能性を失念していた。

image.jpg

Teensy移植前のエクササイズとして、ICP4に入力端子を変更するVolume系の改変はハードウエアの準備を含めて最適だと思われるので、この部分のコーディングを最初の目標としていきたい。
posted by Yasuski at 01:36| open.Theremin

2016年10月20日

open.theremin@出力波形を合成する

適当に組み合わせた倍音で波形合成を行ってみた。

http://www.mbiraski.com/audio/openThereminOnTeensy.aiff

レベルはバラバラだが、プリセットを完璧に行なえば、ある程度は平均化出来るはず。

ラストの曲は矩形波に近い音色で演奏している。

画像は、30秒辺りの明るく特徴の強い音色の波形。

14641985_1264274836936305_238193741692729781_n.jpg

ノイズは思ったよりもマシな方だった。 アンプと電源の性能に左右されるのはまあ、楽器なので仕方がないような。 音色数は12だった(この辺も適当)が、使えそうな音色が揃っていた。(これも偶々)

「モスクワの夜は更けて」をバラックな設定故に手探りの状態で演奏しているが、左手の影響でピッチが揺らぐのは小型テルミンの持つ宿痾でもある。
posted by Yasuski at 17:50| open.Theremin

open.theremin@crickEncoderを実装するも、またもやノイズに悩まされる

なんとか crickEncoder とそれに伴う諸機能を実装したが、演奏を楽しむ余裕はなく、ロータリーエンコーダーが凄まじいノイズを発生させるアイテムだということが判明した。



オシレーター直近に関連する配線を引廻した途端に、オシレーターが発狂して演奏どころの騒ぎではなくなってしまったのだ。 プルアップした入力を、人力の速度でスイッチングしてグランドに落とすだけの作業が、何故こうなった!?

とりあえず、高周波系とはできるだけ離れた位置に配線を集中させたが、500kHz程度とはいえ高周波の扱いには細心の注意が必要だと再認識させられた。

ちなみに、エンコーダーにはクリック機能を持たせてあって、シングルクリックで各項目の間を巡回する。 

image.jpg

ホームポジションはPitchTunerで、次がVolumeTuner、3つ目が音色の選択で、4つ目はリザーブとなっている。 

問題はこれらの項目のうち、自分が今どのポジションに居るのか判らずに混乱してしまうことで、情況の悪化に輪をかけるのが「ダブルクリック機能」である。

image.jpg

ダブルクリックは、エンコーダーの加速度を切り替える機能を呼び出すが、大きな変化量が必要となるチューナーには特に便利な機能だ。 ただし、このダブルクリックの速度と、シングルクリックの速度をキッチリと体で覚えないと、項目を送ったはずがダブルクリックでした、、、という混乱した状況に陥ってしまう。

最悪の場合を考えて、全てをリセットするパニックスイッチを独自に追加している。 これは、スイッチを押したまま暫くホールドすることで発動する機能で、全てのパラメーターが初期値の「ゼロ」に書き換えられる。

高周波に関して、いろいろと勉強になっているが、下手をすると苦労してデザインした基板が全滅する可能性が出てきてしまった。

AdditiveSynthe式の音色チェンジはとても遣い手のある機能だと思うが、

image.jpg

データ上「相対化された位置」にパラメーターが拡散してしまっていて、これまた個々の音色のチューンが大変そうだ。

image.jpg
posted by Yasuski at 08:12| open.Theremin

2016年10月19日

open.theremin@波形の分解能を12bitに戻す

プラットフォーム乗り換えの実験と同時に「性能限界にチャレンジ」する姿勢の愚かさを悟り、今一度基本に立ち返って、音声の分解能を12bitに戻した。 そもそも、搭載されているDACは12bitだ。 ただし、倍音を積極的に扱いたいという狙いがあるので、倍加した波形1ループのステップ数「2048段階」はそのまま継続している。

処理に掛かる時間が相当短くなったので改めて同時発音数を確かめたところ、6音再生までが限界で、7音目から妙な事態が発生し始めるようだ。

メモリー的には、16波以上のストックは余裕なので、ひとまず14倍音までのサイン波と、Sawtooth/Triangle/Pulseを用意しておいた。 このラインアップから6音を選ぶわけだが、オリジナルでは1波をセレクトして呼び出すシステムが採用されていた。 

これを発展させて、例えば、

1) 基音+偶数波のみをセレクト
2) 基音+奇数波
3) Sine/Triangle/Sawtooth/Ramp/Squea/Noise
4) 任意の倍音構成 1
5) 任意の倍音構成 2

といったように、まず6種類のWavetableを選択する。

次に、この6種類の「音源」をミックスするレベル比の構成を決定するが、これには色々な組み合わせパターンが存在する。 例えば、、、
 
1) 基音1種類のみのユニゾン6波(意味があるかどうかは不明だが、音が分厚くなる?)
2) 基音+偶数波の合成で、倍音構成を1/2ずつ減衰させる
3) 基音+奇数波の合成で、倍音構成を1/2ずつ減衰させる
4) ノイズを除く基音のミックスパターンで、使えそうな取り合わせ数種類
5) それにノイズを加えたもの
6) 二倍波を主流に、基音をあっさりミックス

等など、シンセのプリセット音源的な使い方が可能だ。 従来の基音相当の波形を二倍波とみなすことで、オクターヴ下の音を扱えることになるが、これは従来の1024ステップで一巡するパターンと一緒。

ちなみに、後者のセレクションをプリセットすることのメリットは、オーヴァーレベルを事前に回避できる点にある。  

以上のコントロールをロータリーエンコーダーとプッシュスイッチによって行うが、同時に、アナログ読みのVRを追放して、ピッチ/ヴォリュームのチューニングにも同じロータリーエンコーダーを使用すると、AD変換をスキップできて処理速度の向上が望める。

問題は、こんがらがったコントロール系の整理だが、LCDを導入すれば全てが解決する。 視認性が取り入れられるのは大きな魅力ではあるが、現時点では端子が足りず、実現は難しい。

追記:

気になる「シャックリ」の発生は、Pitch側が原因の可能性もある。 一度、Volumeコントロールを殺して、実証すべきだろう。

追記2:


オシレーターのチューニングが温度の影響で狂ってしまう現象は以前から悩まされていた問題だが、Pitch調整幅を滅茶苦茶広く取れるようにしている現状ではあまり気にならなくなった。 もちろん、演奏中にピッチがズレていくのは大変困るのだが、以前に悩まされた「調整のレンジ外に音がズレて対処不能」というパターンが発生しないだけでも随分とマシになった。
posted by Yasuski at 07:33| open.Theremin

open.Theremin@WaveTableの同時再生可能数を減らす



やはりノイズは波形再生の過程で発生していた模様で、再生波形を1つに設定するとノイズの発生がかなり軽減された。

とはいえ、偶にスパイクが入ってしまうのは相変わらずで、この点を改良しないと楽器としては落第だと思う。

その後、WaveTableのサイズを12bit×2048sampleにダウンサイジングして実験を行ったところ、6波までの加算を確認できた。 これは、基音に対して高調波を5種選択できるということで、AdditiveSynthesizerの実現に一歩近付いたことを意味する。 希望を言えば、Envelopeに設定した閾値で発動するトリガー(これはLEDの点滅で実現している)から時間軸に沿って各波形データの音量をコントロールできればスマートなのだが、速いパッセージを演奏し難いThereminでそこまでやるの?という話になってしまう。 

これは、考え方を変えれば、不可能な「速いパッセージを機械的に実現すると面白い」という見方もあって、基音でそれをやらずに倍音構成のみを変化させれば、Thereminの個性を殺さずに音色の変化を楽しむことが出来ると考える。
posted by Yasuski at 03:16| open.Theremin

2016年10月18日

open.theremin@VolumeAnt側の改良を行う

VolumeAntの反応を改良すべく各種設定を改変したところ、なんとかノイズの軽減に成功した。

記録した映像では、13bit Resolution × 2048 step の再生環境で、基本波+2次倍音+3次倍音の3波を同時に再生している。



改変したファクターは、まずプリスケーラの分周比を1/2に変更し、FTMから取得するVolume関連のValueの制限値を9000以下のみとし、bitmaskなどの小細工を廃止した。 代わりに、7段階のレジスタを追加して数値の変化幅を圧縮している。 WaveTableに送られたデータは実質12bit幅なので、乗算後のデータは13bit右シフトしてオーヴァーレベルを抑えている。 乗算後に加えられていた従来設定されていた謎のオフセット値 "1748" は512に変更している。

今回はサイン波の3波同時再生にトライしているが、Teensy3.2の再生能力の限界値をほぼ超えているようだ。 出来れば他の処理を削ってでも4波以上の合成を行いたいところだが、処理能力が2倍はありそうなTeensy3.6でこれを試験するためには、ピン配置の詳細なデータが公表されてからとなる。

3.2の環境で処理能力を上げるのであれば、極力AD関連の処理ルーチンは避けるべきなのだが、現状では引き出せる端子が足りない。 本気で開発を行うには、ケチらずに専用機版を製作するしか無さそうだ。

openThereminTeensy1018testBed-161018a.zip
posted by Yasuski at 08:28| open.Theremin