SX-150用に、リボンコントローラを組み立ててみた。
メロディの演奏のUIとしても面白いなあと思う。何より、指先の微妙な動きでピッチをコントロールできるところに、魅力を感じる。テルミンがうらやましいのはドレミに縛られない自由な音程の表現が可能な点。なんてな事を言って見たいと思ってたのだけど、やっぱり、アンサンブルの中でのハーモニーも大事な音楽の要素と考えると、他の楽器とのコミュニケーションを考えて、ドレミにはやっぱこだわらなきゃいけないのがジレンマではあるんだけど。
SX-150用に組み立てたリボンコントローラを手作りする難しさは、ひとえにリボン部分。抵抗体自体は導電ビニール袋だから、それ自体は高価じゃないんだけど、10枚セットで買わなきゃいけなかったり(って、タカが知れてるけど)他にも、テフロンテープやステンレスシート、それなりの量を手に入れないと買えない特殊な素材ばかり。ふと気が付くと、SX-150と同じぐらいのコストが掛かってしまった。それをアルミのチャンネルに、きれいに張り合わせて作るわけだけど、指紋が残ってしまい、そこだけ微妙になってたり色々面倒。
そんな時、Youtubeで、知り合いがリボンコントローラに挑戦されてるのを拝見した。
しかも、僕が最も苦労したリボン部分は、市販の製品を使われたとの事。早速メーカー名を伺って、ネットで検索して国内の販売代理店を見つけたが、欲しかったサイズはまとめないと買えないようで、その数も、友達集めたぐらいじゃ無理ゲ。挫折しかけたんだけど、同じ製品を扱う海外の通販サイトを知り合いにご紹介いただきそちらで手に入れた。
さて、SX-150用ではなく、汎用の1V/1Octのアナログシンセにつなげて鍵盤の代わりに演奏できるようなものにしたいな。と。どんな要件をクリアすればいいんだろう。
SX-150版は可能な限りシンプルに考えたけど、今度は、せっかくいいネタが入ったのだから、ちと、がんばってみようかな?!
SX-150に接続したリボコンで演奏していて思うのだけど、リリースの表現ができないのが残念。手を離したときに、今出していた音程がパっとなくなっちゃうのは、リボンを押さえていないと、抵抗値が出ないというリボンの特性によるものだ。
アナログ素子を使ってサンプルアンドホールドとか色々な手がありそうなのだけど、できれば、MIDI出力をつけてみたいという欲求もあるので、マイコンにつなげて、ソフトウエアでサンプルアンドホールドを実現してみようかと思う。
やってみなきゃわからないことだらけ。とりあえず、指の太さを10mmとして、指を並べるとちょうど半音になるというセッティングはどうだろう。リボン自体の長さは500mmを選んだから、50半音分。49鍵のキーボード相当。4オクターブ取れる。ギターの音域が2オクターブ弱。アルトサックスは、普通に吹いて2オクターブ強。メロトロンは、2.5オクターブ。とりあえず、3オクターブあれば、ソロを演奏する楽器としては十分そうだ。
さて、このリボンの情報は、位置情報を電圧の変化に変えてこれをADCで取り込む方向とすると、一体どれくらいの解像度が必要になるのかしら。
出力については、MIDI-CVのCVのアウトプットに、10BitのPWMを使っった経験があり、7bitで10オクターブ(128段階)の半音を表現して、のこり3bitが半音以下の音程を表現するようにすると経験的にイケるかな?もうチョイ(精度が)あっても良いかな、という感じになる。半音が49個だと、6ビット(64段階)無いとたりない。さらに、半音以下に3ビット取るなら、出力には最低9bit必要になる。
出力に9ビット必要なら、入力も9bit以上必要なのは容易に想像できる。
500mmを9ビット(512段階)で表現するのだから、1段当たり、1mm弱の解像度になりそうだ。これって一体どんなかんじなんだろう。指先の微妙な動きで微妙な音程のコントロールができるんだろうか。試してみなきゃわからないかな?
さて、次は、電源はどうしよう。とりあえず、SX-150版では、SX-150本体から大体5Vぐらいの供給を受けた。コレに使われていたロードロップ型の三端子レギュレーター、実はあまりインピーダンス低く無いらしく、結構変動する。とりあえCPU用の5Vを作る3端子レギュレーターをずローカルに別途のせることにして、006Pで動かしておこうかな。ただ、出力に4オクターブ、上下に半オクターブずつチューニングできるようにするのにすると合計5V。ぎりぎり。というか、5Vで動かすオペアンプから5V取り出すのはむり。とりあえず、どうするか考えつつ、予備実験を色々やってみようかなというかんじ。
SX-150版では、PNPトランジスタで定電流源を作り、抵抗体に出る電位差をFETでバッファして、反転する電圧をオペアンプで反転しつつ、SX-150に必要なオクターブ/電圧の直線に変換する方式だったけど、今回は、積極的に、今回はオペアンプを使ってみようかな。
オペアンプで反転アンプを作ると、その増幅率は、
a = - Rf / Rin
となる。Rfは、式の分子にあるので、この値がリニアに変化すると、増幅率をリニアに変化させることになる。たとえば、入力を1に固定して、Rfがn倍になれば、入力の-n倍の電圧が出る。ちなみに、Rfが0になれば、増幅率は0になり、出力も0倍になる。
さらに、Rfが無限大(たとえばオープン状態)にでかくなれば、増幅率も無限大になる。実際は電源圧を超えないので、単電源オペアンプであれば、0Vか、そのオペアンプが物理的に出せる最大の電圧(一般に電源圧までは出ない)に張り付くことになる。(単電源タイプではないオペアンプでは、0Vも出ない)
以上の前提条件で、Rinをリボンの出せる最大の抵抗値にして、帰還抵抗のリボンをRfとして、0Ωから20kΩ程度まで変化させれば、、倍率が、0から-1まで変化するアンプにすることができる。これに、オペアンプの+入力ピン相対で2.5Vをいれれば、2.5Vから、0Vまでの変化をリニアに取り出すことができそうだ。
リボンがオープンになったときは、回路としては破綻している状態になるので、リボンには、高抵抗をぱらる。手を離すと、1Mとか2Mとかになり、とんでもない増幅率がでているようにして、0Vが出るようにする。リボンを操作して、-1倍ぐらいが出てるときに、完全に0Vがでないように調整して、触ってるときと手を離しているときとの違いが出るように調整する。
ちなみに、Tiny45の仕様書によれば、内蔵のADCの基準電圧に2.56Vが選べるとの事で、最大で測定できる電圧が2.5V程度で、最小は0Vまでという数字。まるで、ピタっという音が聞こえるような気がする。
実は、実験用のソフトは、比較的早い段階で準備してあり、CPUも、この実験用のブレッドボードに載せて実験していたんだけど、このCPUが結構電流を食うようで、006Pが持たない。さっきまで思ったとおり動いてたのに、なぜか今は動いていない。何でだろう、とか考えている間に、実は、CPUががんがん電流食っていて、電源に5V来て無い状態で、どうやってもオペアンプがマトモに動けない状態になってたりして。
さらに、さすがに5Vでオペアンプを動かすのには、それなりに無理があって、LM358が理屈どおりに動かない領域に微妙に突っ込んじゃうらしく、オペアンプの性能をチェックしてるのか、回路の動作を検証してるのかわからなくなってきて、とりあえず、良いオペアンプということで、秋月で比較的安価に入手できる比較的精度の高いDC系に使うといい感じのCMOSプロセスで作られたオペアンプLMC662を投入してみた。ローノイズで単電源タイプ。
あれー?あれーとかいってたのがウソのように理屈どおりに動き出した。ただ、LM358のときはなくてもOKな発振止めのCがないと発振する。高性能だけど、その分ちゃんとフォローも要求するオペアンプらしい。
電源圧が変動しても、まあ、そこそこ思った動作をするようにと、動作の基準には、電源とは別の電圧を用意するとか工夫をしたんだけど、電源の制約がでかくて、安価な358が思ったように動かなかったり、高級なオペアンプを使ったら発振したりで、机上の理論と、実装の現実のギャップにはまった。オペアンプの基本回路なのに、ちゃんとうごかせないって、どーゆー事よ!ムキー状態。
どうやっても発振が取れない、もー頭来た!と電池切ったのに、まだ発振してる!え!オシロに(プローブ周辺から)飛び込んでるノイズだったりして。
結論としては、増幅率をダイナミックに変えるためにRfを変化させると、オペアンプの負荷(帰還抵抗も負荷の一部)がダイナミックに変わるので、発振止めのCの設定が微妙になってしまうらしい。今は、安定しているけど、接続する負荷を変える事で、また発振したり、OKだったりという、日和見動作になってしまった。
さらに、リボンの代わりに、半固定低抵抗に差し替えると発振が止まったりもして、実装のテクニックもそれなりに要求されるらしい。
またブレッドボードでのテストの分を割引しても、10mV程度のノイズが載るようで、ちょっとこのままでは厳しいかもしれない。
最初は、リボコン本体の中に何もかも突っ込んじゃうつもりだったので、ちいさなCPUを使おうという理由で、Tiny45で検討していた。
ADCもついてるし、PWMで、アナログ出力もできる。さらに、何時ものTiny2313とちがって、PWMに使うカウンターのクロックのスピードを内部のPPL機構を使うことで8倍にすることができる。これにより、PWMのキャリアをあげることができるので、必須の出力のフィルターに使うコンデンサも小さな値のものを使うことができる。ラッキー。(意図しないポルタメントがここで付くのも避けられる)
問題は、Tiny45には、Tiny2313と違って、16ビットタイマーが無いので、PWMによるアナログ出力も8ビットまで。事前の計算では出力には9ビット必要。困っていると、chuckさんが以下の記事をご紹介くださった。
「PWM出力とR-2Rを組み合わせた16ビットD-Aコンバータ」馬場清太郎, トランジスタ技術2005年7月号 p.175,CQ出版社
まさに、こんなときのために使う裏技。渡り船、またしても、スポっと言う音が聞こえた気がする。
DACは、コンピュータで計算された完全にノイズの無いデータが入るわけで、DACの出力は、そのチップのアナログ的な性能に支配され、成り行きでそれなりの精度が出るんじゃないかな...。
ベースの解像度が高ければ、たとえノイズ交じりであっても、トータルの解像度は上がるのでがんばってみようかなと。
ADコンバーターから1つデータを取り出す。で、間髪おかずもう一つデータを取り出す。これ、ほとんど同じ値が取れるつもりで取り出していて、もし、値がかわってなければ、値を出力するという動作を省略するのが狙い。モジュラシンセを鳴らすためにCVを垂れ流しにするのなら、問題ないけど、出力に、MIDIを想定した時、なんか、ベンドのデータが何時もダラダラ出てるとかだと、録音したMIDIデータをあとから、編集するのも大変になってしまう。できるなら、MIDIコントローラとしては、正規化されたデータをだしたいなと。
ところが、これ、ほとんど同じ値が取れるつもりで取り出してるにもかかわらず、ほとんどの場合がが同じデータは出てこない。
はっきり言って、得たデータがホワイトノイズ混ぜたも同然。ADCから取り出したこの状態のデータをクオンタイズ処理しようとすると、境界の部分で、短い間に、音程が上がったり下がったりが起きる。まるでチャタリング。たとえば、MIDIのノートナンバーの変化にクオンタイズしようとすると、微妙な境の部分で、ノートナンバーがバタバタいっちゃう。
実は、コレまでの少ない経験からなんとなく予想はついていたので、微妙なノートナンバーの変化に使う桁と、ベンドホイルの変化にだけ使う桁と分けることでコレを回避しようと思ってたのだけど、結局、ばたつくのが、ノートナンバーではなく、ベンド情報になるだけで、不要な情報が膨大に出ることになる。
どれぐらいの精度を見ようとしてるのかというと、たとえば、1bit当たり、-6dBになるから、10bitのADCの最小桁の値は、(-6dBX10Bit=)-60dB。5Vで考えるなら、5mV。16Bitだと、-98dBで、75uV、超高級アンプのノイズレベルになってきて、アマチュアが蛇の目基板でエイっと組み立てて実現できるレベルをこえちゃう。
12bitのADCのLSB(last significant bit)2つすてて、10bitのADCで使う御大尽ハードウエア、とか、若干自虐的な設計方針にもみえるけど、経験的に、下位2bit程度は、思ったとおりの数字は出なくて、それっぽいランダムな数字が出てくる。逆に言えば、ADCで得た数値には有効桁がありそうだということが分かってくる。
回路の動作の基礎実験や、ソフトのアルゴリズムのチェックとか楽しいんだけど、いつまでたっても最終的な出来上がりの姿が見えない。ダラダラと実験を続けているうちに、だんだん迷走状態になってそのまま失速墜落、放置すること半年。
ある日、ひょんなことから、blogSaharlin Hausでで僕のこの書き掛けのページが紹介されていたのをみて、一念発起。開発を再開する。
設計に当たって一番大事なコンセプトをもう一度確認すると、「バンヘイレンのライトハンド奏法がやれる!」である。演奏するとき、左手で低音をだしながら、右手でリボンをタップすれば高音が出る。この音程が、左手で抑えているときと抑えてないときとで変わらないというのが狙い。 手にいれたリボンは、普通のボリューム同様、分圧器としても抵抗器としても使えるのだけど、一定の電圧を取り出すのなら、分圧器として使うのが普通。ただ、これだと複数の場所を押すと、分圧比が崩れて思ったのと違う電圧がでちゃう。抑え方によって出る音程が変わっちゃうのだ。抵抗として使えば、マルチタップした時、一番小さな抵抗値がでる。コレを旨いこと電圧化するのが狙い。
コレまでのところは、マイコンを組み合わせて動作させるのを狙いで、デジタルドメインに渡す前に可能な限りアナログでの処理してデジタル処理が宿命的に持つDレンジの狭さをカバーしようという工夫の数々を試した。
再開に当たっては、演奏に使う、リボンセンサー部分と、そこから伸びた尻尾を突っ込むプロセッサを詰めた箱との2つの部分に分けてSX-150はもちろん、普通の1V/1オクターブのアナログシンセやMIDIコントロールと色々バージョンアップできるようなシカケを考えてみる
ネタのつもりが本当に前回までのあらすじになっちゃった。
いや、違うな、それ、ネコに、ワンと鳴け、といってるようなもんだな、という事に、ふと気が付いた。オペアンプにとって、0Vが出るって、やっぱ特殊な一発芸かなと。いつでもその技が出せる訳ではなく、それなりに回路を練らなきゃだめ。電源が、0Vから5Vなら、0Vが出る可能性もある回路が組めるぐらいに考えて、やっぱ、普通に、1Vから4Vの間で動作するように考えてやるのがネコとの正しい付き合い方かなと。
一番最初にSX-150専用バージョンで試した、定電流源を用意して、これをリボンに掛けてFETのバッファを介してオペアンプで反転する方式に先祖がえりしてみる。シンプルなのが結局安定度も高いのよ、きっと。オッカムの剃刀。今回は、20kと規格化されたリボンセンサを使うのだらか、ソレをちゃんと生かしてみる。
センサー部分からは1V~4Vがとりだせて、コレをオペアンプのバッファを通して、プロセッサに送る。一番シンプルはプロセッサは、1V/1オクターブのアナログシンセ接続用と、着地点をきちんと決める。デジタル化はこの後。まずはアナログ部分をじっくりと堪能してみようかと。
SX-150版では、トランジスタを使った定電流源を使ったけど、今回は、トリミングできちんと流れる電流を設定できる方式を試す。だって、20kって決まってるんだもん。これに2V出る電流を作ってみる。0V付近には可能な限り近づかないように、ちゃんとゲタを履かす。なんちて、偉そうな事考える割りに、やる事はせこくてFETに電流制限の抵抗をつけただけ。でも、ちゃんとトリミングはできるようにするぞ。
原理的には、FETは、ゲートとソースの電位差で、ドレイン・ソース間に流れる電流が変わる。ドレイン・ソース間を流れた電流に抵抗を入れて、この電位差をゲートに入れると、ゲートの電位が変位して、ドレイン・ソース間を流れた電流が変化する。自分が気持ちよくなる程度に自分の首を絞める式。真空管などの回路に良く出てくる、自己バイアス式と似ている。温度の変動にはそんなに強い回路じゃないけど、ネガティブフィードバックの効果は絶大。
このトリマーで、リボンからは1.5Vから、3.5Vまでの電位を取り出せるような定電流源を作る。で、2.5Vバイアスのオペアンプで反転する。ちとだけゲインつけて、電源圧に触らない程度に広げてやって、できれば、4Vでるようにできればピースという方針。 どちらにしても、リボンを触ってないときと、リボンからの最低電圧(反転アンプ通すから、実は最大電圧、これは電源圧にぶつかる可能性があるので本気で一番上にはできないはず)とにきちんとさがでてないと、触ってるときと触ってないときの変化がとれなくなるので、そこはそれ、それなりに、成り行きとする。
というわけで、復帰第1弾の回路。はこんな感じ。アナログシンセの演奏のためのUIを強く意識して、リボンでCVがだせるほか、ノブを付けてここから普通にCVが出せるようにもしてみた。とりあえず、プロセッサボックスのほうで、混ぜて、ピッチコントロールができるようにしてみようかと。3Vぐらい出ればOKとしておこうかな。センタークリックつきのVRが手に入れば、センターでジャストチューンとかするといいかも。
そういえば、mini moogのオーナーさんから聞いた話だけど、前期型のミニムーグのベンドホイル、バネでセンターに戻らないし、(後期方も戻らないし、プロフェット5などシーケンシャルサーキット社製のシンセも、一昔前の女子高生みたいなルーズソックス式で、ずれたらずれっぱなし)このクリックが固くて、微妙にベンドかけようとすると、ガックンとなってしまって、ピッチの変化が滑らかに出せなんだそうだ。後期方は、そこも改良されているんだそうだけど、ピッチがガックンになるのがいやで、クリックから外れない範囲でしか(多分ほんの数ミリ)使わないそうだ。そのかわり、ガックンしない範囲内であれば、擬似的にバネが入ってるも同然で、手を離せばいいところに戻るんだそうだ。そーゆーメカなら、メカとして演奏法でクリアできちゃったりする良い例だなあとか感心しながら拝聴した。
このコントローラーでのピッチはギミックでウガーとか叫びながら廻すつまみを想定してるので、ガックンOKかな?!どかな。ま、特注でもしなきゃ、素人にはそんなVRは手に入らないから心配するな。(ちぇ!)
もう、どんどん後ずさりしてんじゃないか?ムーンウオークのままフェードアウトしちゃうという荒業が頭をよぎる。
最初に「反転アンプがうごかネエ」と思ったのは電源圧付近は理想の動作ができないから。なら、理想の動作ができるところで動かそうというのが、この回路の意図だったのだけど、358って奴は、反転アンプにすると3.5Vぐらいに限界があるらしい。いくら増幅率上げても、それ以上あがってこない。
コレはもう、オペアンプの性能の問題、回路のせいじゃない。LMC622に差し替えれば、思った動作になる!と思ったら、今度はQ2の出力に、0.3V程度のオフセットが付いて、1.5V~3.5Vが、1.8V~3.8Vとなって出てきちゃう。
オペアンプのバイアスを、2.5Vじゃなくて、2.8Vにするか、FETのバッファで付いちゃうオフセット分、リボンからの出力をオフセット掛けなおすべく、R2を12kにすれば、見事、設計どおりの動作になる。
あと0.5Vをどうするか、とか四苦八苦してる回路で0.3Vもずれちゃうと、どうよ。しかもこれ、FETそれぞれで微妙に変わる電位。
これは、東芝のFETの仕様書。
問題の0.3Vは、上記1ページ目に出ている、FETの一番大事なパラメーター、IDSS(ドレイン電流)で決まるのだけど、0.3mAから6.5mAという仕様。20倍以上の誤差がある。これは、東芝のFETだけが抱える問題ではなく、一般的にFETとはそういう素子であるという見本
手元のFET、モノによっては、0.3mAしか流れないものもあれば、6.5mA流せる物もあるかもしれないということだ。R、O、Y、GRと4段階のランク分けがあるが、Yタイプなら、1.2mnAから3mA、2倍違う。増幅素子としては仕様書の数字は致命的に役立たず。狙いの動作をさせるにはトリミングが必須になる素子。アンプは組みにくいけど、スイッチや、増幅率は一切無しのフォロワならいけると思ってたのだけど、この0.3Vの誤差に愕然としつつ...
せっかく、FET入力の高級なオペアンプ使うのに、FETのバッファ通すのバカくない?!せっかく規格のリボンを使ってるのに、あちこちトリミングしなきゃって、アンポンタンだよねえ。
もう、キャラクタのスイッチ回路が壊れて、女子高生だったのか、昭和オヤジだったのか、分からなくなりつつ、白々と明けてきた空に向かって、誰にともなく語りかける。
可能な限りトリミングが必要な箇所を減らしたい。さらに、平行して、このセンサー部分に接続して電源を供給するプロセッサ部分の設計もやってみたら、リボンからのCVと、ノブからのCVを混ぜる部分に反転アンプを使いたい。ここに、反転アンプを2台並べて、反対の反対は賛成なのだアンプ(通称バカボンのパパアンプ)を構成することになる。まぬけー。
「思い切って、センサのリボンは、反転でだしちゃえば?!」とオッショさんが助言くださる。
プロセッサボックス側で後からオフセットを付け直したり、ADコンバーターに突っ込むDレンジを厳しく詰めたりすることを考えれば、増幅率が比較的自由に設定できる反転アンプが使いやすいように、センサー単体からの出力は反転で出てくるのは、合理的といえる。
センサー部分決定版の回路図。
オッショさんのアドバイスどおり、反転アンプをやめて、非反転アンプに転向した。
FETを使った定電流回路部分では、20kのリボンに2V程度の電位差が出るようにする。0.1mA程度。R1は最低の電圧が0Vにならないようにする下駄。リボン部分をショートすると、ここに、0.22V出れば、リボンの20kには2Vでるはず。Softpotの製品としての誤差はあるので、まあ、トリミングできるようにしておくべきだ。リボコンを触ってないときは、2.2Mの抵抗にでる電圧(多分、5V弱)が出る。アンプの増幅率は2倍に固定、突っ込む電圧のほうを操作して、いいところに収める方式。
コレを2倍の非反転アンプに突っ込む。リボンがオープンなときの5V弱の電位を2倍にしようとしても電源圧よりは高くならないので、オペアンプの出力の飽和電圧が出る。たぶん、4.8Vとか。
で、リボンで一番高い電位(後で反転するつもりなので、一番低い音が出る場所)は、2.22Vは4.44V。これは、オペアンプの出力が飽和する直前に設定して、一番低い音を出そうとしたのか、触ってないのか分かるような電位に設定する。
一番低い電位(音程的には一番高い音)は、成り行き。トリマーひとつオミットした副作用といえるけど、増幅率をトリミングすることで、最低電圧もどんどんずれちゃうことを考えると、別途トリミングが必要になる。ここは成り行きとして、とりあえず4オクターブ(4V)幅は確保。
センサーの電源はプロセッサ部分から供給する。動作させているうちに電池がなくなってきても、動作が変わらないように、センサー側で三端子レギュレーターで5Vを確保する。ロードロップのものを使えば、プロセッサ側から供給する電圧は6VでもOKかも。どちらにせよ、低電圧での勝負は、難しい。さらに、センサーで採用した定電流回路には温度変動にそんなに強くないFETをナマで使っているのだから、温度特性(温度による出力の変動)には強くないはず。これは、後日検証してみたい。
センサーからは
将来、デジタル化するにあたって、リボンの解像度を最大限に生かすために、2つのCVは別々に取り出し、別途処理する必要があるし、このまま、ADCに突っ込むにしても、リボンを触ってるときとそうでない時の差が出ないといけないので、ノブからのCVは、リボンが押されているときにだけ、加算されるような工夫してみた。
ゲート部分は、部品点数節約すべく、デジトラを使った。ロームのDTC144というもの。単純なスイッチングの動作なので、普通にNPNトランジスタに、ベース抵抗をつけて組み立てても同じ。
いつもお世話になっている阿部さんの掲示板にダラダラと投稿していたら、カツを入れるべく、知り合いが救援物資を届けてくださった。「Tiny45のもてる能力を全部引き出すぞ」とか聞こえはいいけど、実は貧乏なだけだったりして。
自分のためにこのノートは書いているつもりだけど、一方では、多くの方の参考にもなればと思い、追試可能なネタを、と常々思っている事もあり、可能な限り安価な部品で、しかも、部品点数を少なくするべく工夫を考えるんだけど、ふと気が付くと、なんか、貧乏臭い方向にばかり流れがち。
そんななかに、アキバでもなかなか手に入らないような、いつかは使ってみたいと思っていた高精度がまぶしい部品の数々をいただいた。
使いこなせるのか不安に思いつつも、せっかくいただいたのだから、なんか、使ってみない手はないかなと検討してみる。
電車の時刻表を見ながら、全国を旅して歩いている気分に浸るのにも似て、仕様書から、さまざまな情報を読み取ってみる。
CPUとDACのインターフェイスは SPI という仕様。このICには、LDと、クロック、データの3本のほか、クリア端子がある。これは起動時に0Vが出るのを保障するために使う。この機能がいらなければ、電源にプルアップでOK。
動作のタイミングは、仕様書5ページ目のTiming Diagramから読み取る。
上の図のTld1、Tld2はそれぞれ、15ns、20ns。クロックの立上がりからラッチさせるのに必要な時間。仕様書2ページ目から数字を読み取る。
この仕様は、クロックが変化するとき(立ち上がるとき)のポートの状態をシフトレジスタに突っこむので、チャートは、クロックの立ち上がりを基準に見る。
まず、クロックが立ち上がる前に、データビットの状態が確定していなければダメ。
Tdsが示す時間は、立ち上がる10nS前にデータが確定してなきゃダメという事で、かつ、クロックが立ち上がってから、Tds(15nS)の間は、データは変わっちゃダメということを示してる。
このほか、仕様書のタイミングチャートには色々な数字が出ている。
チャートの一番下tS(Settling Time)は、フルスケールで振ったとき、LD端子が、Lowにした(シフトレジスタの内容が確定)後、アナログ信号が思った値になるまでにかかる時間。60uS(16kHz程度)ただ、TLDW(20nS)だけローにすれば、次のデータをシフトレジスタに入れる処理を始めても良いことを示している。
シンプルに使う分には、単純にI/OをバタバタっとやるだけだでDAは出力できそう。ただ、20MHzのAVRで使うとして、1クロック1命令で、1発、50ns。さらに、データを持ってきて、シフトして格納して、12回やったか数えてとかやってると、時間が掛かりすぎて、DACの性能を全部出すことができなくなる。AVRなら、たいてい持っている、USIや、SPIのハードウエアを活用することで、性能も出るし、ソフトウエア的な煩雑さからも逃げることができそうだ。こちらの仕様もチェックが必要。USIや、SPIは、8ビット幅しかないけど、1回のデータ転送について、2回使えば、OK。データは、MSBから送るので、、余った分は読みトバされる。
時間はすべてVDDが5Vの時。特に、tSだけは、単位が1000倍なので、要注意。
どうも8Bitを超えると、色々な精度が要求されるようで、ADCや、DACの動作の規準となる電圧として可能な限りローノイズなモノが要求される。
もう一つのDAC、MAX5352は、電源は5V。温度特性は、1ppm/°Cと、AD7390の16ppm/°Cと比べて圧倒的なのだけど。周辺に使う部品の温度特性、100ppm/°Cとかの金属皮膜抵抗を使うことを考えると、どちらを使ってもオーバースペックぎみ。
ただ、DACのMAX5352のリファレンスは、電源からマイナス1.4V。MAX189のリファレンスは、VDD+50mV。S/Nを稼ぐのに可能な限りでかいリファレンスを入れたいので、DA/ADで共通のリファレンスを使いたいということで、MAX5352にはベンチを暖めてもらう方向。
とはいえ、MAX6341 / MAX6350 をリファレンス電源に使うには、最低で8Vが必要になるので昇圧チップが登場。
ターゲットのMAX6350は18mAまで流せて、消費電流は3mA。20mAあれば十分そう。MAX660からは20mAぐらい供給できればOKとすれば、5page目の「4.5Vから、-4Vを生成するグラフ」から、2.2uFぐらいにみえるけど、これ、内部発振 80KHz での値。効率やノイズを考えると、10kHzで動かすのが得策で、その場合、このグラフから読めるCの10倍程度の値が最適だそうだ。
さて、真打!ADC、MAX189。
CPUとの接続仕様は、DAC同様、PSI。ハードウエアは、DOUT、CS、SCLKの3本と、SHDN。AD変換のために、内部で高速のクロックが走ってるに違いなくて、コレをとめると、チップそのものの、消費電流が下げられるんだろうなあ。ま、今回はお大尽のイージー設計ということで、プルアップかな。
ミソは、CSをLowにすると、変換が始まる。このときクロックは、Lowにしておく。5.5~8.5usで変換が完了すると、データビットが立ち上がる。クロックにスタートビットを立ち上げる。これをたち下げるときに、MSBが出力されるので、次の立ち上げのときに、データを読み出す。これを12回繰りかえし、最後に、CSをHiに。次の変換までは、TCS(500nS)待ちが必要。
DAC同様、CPUについてる、USI/PSIインターフェイスを活用すると、楽ができそう。
Tiny45には、シリアルのハードウエアがついていないので、MIDIデータの送受信は、すべてソフトウエアでやることになる。パソコンのシリアルに接続するための、超簡易型のレベル変換回路を付けて、Windowsのターミナルソフトからデータを受信してループバックするソフトはできた。
Atmelで公開されているソフトをTiny45で動かせるように書き換えて、書き込めば試せるHEXファイルもつけた。
MIDIのクロックレートにしてやれば、MIDIの送受信ができそうだ。テストに使う、ハイパーターミナルの設定ファイルと回路図が同梱されている。ソースにはMIDI用のデファインもつけてある。
内蔵RC発振によるクロックについては、takedanote Vol12 「CPU周り、MIDI部分の検討」で考察している。
ちなみに受信のアルゴリズムは、最初に、ストップビットを見つけたら、キャリア1つ分+キャリアの半分の時間待って、そのときにビットが立っているかどうかを見る。以降、ストップビットまで9回、キャリア9つ分の時間に間に合えばOK。とりあえず、半分(50%)の10倍弱、5%ぐらいまでのずれなら、なんとか読めるかな。
ちなみに、アクティブセンシングはFFなので、なんとなく読めたふりをすることがあるみたい。あれ、うごいてたはずなのにとか、結構だまされるので要注意。
2009年冬のアナログシンセサイザビルダーズサミットにこのリボコンを出展して多くの方(20人ぐらい)に見ていただいた。
このプレゼンテーションの中の質疑応答の中で、沢山のアイディアをいただいた。現在実験段階のこのリボコンは、最終的には一体どんな形態になっていくのか。たとえば、現在の予備実験では40cmのセンサー、10bitでADCすると最小単位は1mm。これが、実際に指先の微妙な音程の変化を伝えるのに、果たして十分な解像度なのか?この段階ですでにレガシーなMIDIの基本データ構造をなす7bitを超えている。
すでに、MIDIは打ち捨てて、OSCなど、よりモダンなフォーマットへの移行や、ユーザーインターフェイス(UI)としてのリボコンと、楽器の接続は、EatherNetへ移行してみてはどうかなど、指の先っぽで音を決めるという野蛮なUIと未来的な仕掛けに目くるめく思いを感じた。
このサミットの会場には、いつもお世話になっているシンセ・アンプラグドのpcm1723さんもいらした。
僕の稚拙なプレゼンテーションに、興味を持っていただいたようで、後日、ご自身のブログにいくつかのエントリーをいただいた。
2009-11-24 リボンコントローラ回路 (1)では、SoftPodの実装法について検討いただき、2009-11-27 リボンコントローラ回路 (2)では、センサーの近くに置くセンシングの回路とそのバッファの機能を併せ持った回路をご紹介いただいている。丁寧な検証と分析には本当に頭が下がる思いだ。(いつもありがとうございます)
くだんの僕の稚拙なプレゼンテーションの中の、どうしてもとりきれない10mV以下のノイズに関しては、その後、僕の部屋の測定環境の限界ノイズかもしれないということに思い当たり、どこから手をつけていいのかわからないまま、申し訳なくも放置になってっていた。
いったん時間を置いてこれまでの設計を再検討してみると、ちょっと無理があったのに気が付く。
リボコンのセンサーの筐体のほかに、外部にCVプロセッサがなければ動かない(少なくとも電源がない)にもかかわらず、リボンを持つ筐体へ9Vの電源を送りつつ、ローカルで5Vをつくり、ここで無理して1V/1OCTにこだわって4V出そうとあがいてみたり。
オペアンプが3.5V程度しか出ないのだから、んーなもんは、ちゃんと割り切るべきだ。プロセッサ側で接続する音源にあわせて、MIDIにしたりOSCや、1V/1Octに変換すればいい。センサーでは、リボンに触っているかどうかがわかることと、可能な限りリニアなレスポンスがとれるまでに、押さえ、がんばるところはプロセッサに集中するべきなきがしてきた。
リボンの筐体につけたVRだが、つけたは良いけど、実際に演奏しているとき、コレを微妙に回している暇がない。演奏の前にちょっとチューニングする程度。だったら、音源か、プロセッサボックス側につければ十分だ。
むしろタッチする仕方で、音量や音色が変わるような、鍵盤で言えば、アフタータッチにも似た機構で別のCVを送れるような機構を検討するべきな気がしている。
ゆっくりと抑える強さをあげながら微妙なビブラートがすーっと掛かってきて..とか..演奏しているときの姿が見えるじゃないか。演奏が優雅に見える、楽器としては大事なポイントかもしれない。ガニマタのヒゲ親父が猫背になって楽器にかがみこんでなんかやると音がでるとかじゃなくて、黒いドレスのお姉さんが、体をゆらしながら、繊細な体の動きにあわせて情感豊かに歌う楽器。良いね、良いよね。
例えば、テルミンのクララ・ロックモアさん。いま見られる映像は、シワシワばっかりだけど、当時は、それはもうすげえ、アレだったに違いない。眉間にちょっとしわ寄せて苦悩の表情に、えもいわれぬ音色とその演奏。そりゃ、しびれるだろう?ゲテモノ呼ばわりされたテルミンも、彼女の演奏で、楽器の地位を得たに違いない。もう、妄想の暴走がとまらない。
んー、フルフル。馬鹿な事を考えてないでちと手を動かしてみるかというわけで、pcm1723さんの回路を作業用に、書き写してみる。こちらにも詳細がある。
比較的、高精度(温度変動が比較的少ない)の基準電源としてTL431で2.5V(ぐらい)を作り、27kでオペアンプの非反転入力へ。反転入力は、27kでグランドに落ちている。バーチャルショートが成立するようにオペアンプの出力が動き、R2とR6で分圧された電位が反転入力に印加されるような出力が出る。R4以降の経路が、リボンへのタッチにより、変化して、ここと、R3で、分圧された電位が非反転入力に入ることで、先ほど安定したはずの、反転入力の経路が変化して結果として、バッファを通ったも同然の出力が得られる。非反転入力へも、出力からフィードバックが掛かっているところがこの回路の不思議な(ちがうな、まだ僕がちゃんと理解できていない)点。
一度はアナログでのアプローチは一度終えてデジタル処理に移るつもりで準備してたのだけど、2009年のアナログシンセビルダーズサミット直後に、ホーランド・カレント・ポンプをご紹介いただいて試して以降、何度かテストの図面をひいては、放置が続いた。
図面は、シンセ・アンプラグドのpcm1723さんにご紹介いただいた回路を実用に組みなおしたもの。2点をタップすると、低いほうが、優先される。反転アンプを追加しなきゃナーとか思いながら、えーと、とか言ってるうちに1年経っちゃった。
1年ボーっとしてたかといえば...まあ、してたんだけど、リボンコントローラーを楽器っぽいなんかにするために、表現力というか、音程だけでなく、音量の変化を自由にできないだろうかと考えていた。メカ的にバネみたいなものを仕込んで、圧力センサを押すとか、リボン全体でいい感じで圧力をセンシングするにはどういう構造が良いかとか、自分だけの1台だけでなく、誰にでも追試できる簡単な構造、故障しにくくメンテし易いという構造を考えるのも大事だなとか、うだうだと。
そんな中で、2010年のアナログシンセビルダーズサミット直前に、追加のセンサーを仕込まなくても、ソフトポットをぎゅっと強く押すと、押している指先がつぶれて、押される範囲が広がる。この広がった範囲のサイズを音量の強さとして表現に使えないかというアイディアを思いついた
ホーランドカレントポンプをソフトポットの両端につけて、コレクタ(ボリュームなら動く部分にあたる部分)をグランドに落として右の端から、抑えたところまで、左の端から、抑えたところまでの電位をそれぞれ別に取り出す。片方を反転してから2つの電圧の差分を取ると、押される範囲が広がるのをCVとしてとりだせるというアイディア。
最初の版では、低音優先になってしまっていたので、反転して差分を取っている。オフセットを換えて、リボンを抑えた指の右端と左端の電位が微妙に重なりそうなところにして、押した感じが差分として出てくるように、トリムで微妙な調整をする。微妙な調整をしなければ、出ないか、出るのどちらか。出るにしておけば、ゲートの代わりにも使える。
ほーランドカレントポンプに使うオペアンプには、0Vがでて、3V程度だせれば、OK。LM358で十分なのだけど、差動アンプは1V以下と3V以上の差分で、マイナス数ボルトを0Vとして出せるもの、たとえば、LMC6482等が必要。(LM358だと、電源以下の出力を出そうとすると、なぜか、出力が電源圧に張り付いたり、異常な動作をする)
CVの反転アンプも出力の振幅の制限が気になるところなので、LMC6482を使いたい。ついでなので、全部LMC6482(LMC6484)でやっちゃえという流れ。(ケースの中にスペースがなくて、Dualオペアンプをを2つ乗せるのが厳しかったと言うのも大きな原因だったけど)
組み立てて、デバッグを済ませて、リボンコントローラーで演奏可能直前まで仕上げたのに、結局間にあわなくて、サミットでは、アイディアの披露だけにとどまった、その後、2011年のサミットでご披露するべく準備してたのに、直前になってすっかり忘れていて、闇に葬りされれそうになっていたことに気が付き、急遽、VCOととVCAだけのシンセをでっち上げてスピーカーと電池と一緒にケースに詰めて、Make:TokyoMeeting07に間に合わせた。
30mm以上のソフトポットは20k、それ以下は10kということで、それぞれソフトポットの抵抗値に合わせてホーランドカレントポンプの定数も変えなきゃいけない。
ソフトポッドの解像度の問題で短いソフトポットのほうが、エクスプレッションの幅が大きく取れる。色々な副作用がありそうだ。
100mm、300mm、500mmと数種類のソフトポットでリボンコントローラーを組み立ててみたが、メロディーの演奏用であれば、500mmが一番使いやすいかもしれない。指でリボン部分を押さえて演奏することから、指の太さの問題もあって、半音変化させるのに、指1本のサイズより狭いと、なかなか思うように演奏しずらい。指1本の幅を10mmとすると、1オクターブで120mm、4オクターブで480mmという計算。メロディーの演奏なら3オクターブで十分かもしれない。アルトサックスのようにオクターブの切り替えスイッチをつけて300mmの2オクターブというスタイルもありかなと思いつつ、実際に触ってみながらやっていこう。
この回路では、ピッチCVは、リボンを触っていないときには0V、一番下をタッチしたときに0.5V、一番上で2.8Vという電圧が出る。expは、トリムで、比較的、好きな電圧まで上げられる。このままでは普通にシンセには突っ込みにくいので、外部から電源をセンサーに供給したり、コネクタの形状をそろえたりするブレイクアウトボックスをつける。オフセットをはずしたり、下駄を履かせたりして、CV+Gateベースのシンセに接続しやすい電圧を出力できるように加工する。
蛇の目基板パターン例には、HT7750Aを使ったDC/DCコンバーターが載っていて(アプリケーションノートの回路そのまま)3Vから5Vを作って、センサーをドライブするような回路も載せてある。
続く