饅頭が怖い!

nanoKey
nanoKey。薄くても大丈夫!

KorgのNanokeyが発売されたとき、大喜びでお店に行った。手に入れて家に戻って....あれ?これUSB?今まで作り貯めめてきた手作りシンセを鳴らすには、一度パソコンにUSBで入れて、MIDIで出さなきゃいけない?
年に何度か、デモンストレーションで楽器を外に持ち出すのだけど、一番大変なのは鍵盤を運ぶこと。べつにすげえ演奏ができる訳じゃないのだから、押せばなんか音が出る、で十分なんだけど、一応楽器っぽく鍵盤があったほうがデモ効果も高い。「Nanokey」で手作りシンセを鳴らすには、「USB-MIDI->レガシーMIDIコンバータ」が必要らしい。
「Nanokey」は、ホストに、USBのデバイスとして接続される。デジカメなど、パソコンなしで直接プリンタに接続するような機能を持ったものがあるけど、それにもにた、USBのホストの機能がひつようになるらしい。さすがに、USBのネゴシエーション周りのソフトをAVRでちょろっと書くには僕の技量には余る。正直言ってまだ、無理。

10年近く手作りシンセ、趣味で楽しんでいるからね、怖いもんなんか無いね、あ、でもひとつだけ、怖いもんがあるな。「USBホスト」。ああ、怖い怖い...

饅頭怖いのパクリだ。どなたか僕にはまだ書けないソフトを書いてくれないか、と、言うつもりで、アナログ震世界のBBSや、知り合いの掲示板に行って「USBホストが怖い」を書きまくってみた。そうこうするうちに2009年の終りに、RJBさんが、「USB-MIDIホストの実験」というエントリーをご自身のブログに投稿された。

MIDI-OUTのDIN-5Pinのコネクタを抵抗1本でつなげただけ。
MIDI-OUTのDIN-5Pinのコネクタを抵抗1本でつなげただけ。

自分一人では実現できないコンセプトやアイディアを掲示板などで共有し、お互いが時間のあるときにアイディアをだしあって、実現に結びつける事ができた。怖くてしょうがなかった、「USB-MIDI->レガシーMIDIコンバーター」を手に入れることができた。感激の瞬間だ。
雑誌の付録基板に既成のオープンソースのソフトをうまく組み合わせて実現されたとの事。早速、バックナンバーを買い求めて....安心して、放置モード。お、おい!感激はどうしたんだっ!自問自答の日々をすごす。

さすがに、これで、「本当に怖いのは濃いお茶だ」なんてな事言ってちゃいけない(いや、ちっと言ったかもしれないけど)。もともとは、手作りシンセのデモのための小さなMIDI鍵盤として使うのが狙いだったのだから、レガシーMIDIの出力は必須。おや、ちとまてよ、同じコルグ同士だな、と。NanokeyでMonotron鳴らすってのは、絵として面白いかも。というわけで、monotronにMIDI入力を付ける、は僕にやらせてください、というオチを思いつく。

ほんとうにMIDIって必要なの

「あえて、MIDIなしで登場したMonotronにわざわざMIDIつけちゃうって、どういう事よ」、には、そんな事情と言うか、渡りに船と言うか。いろいろ前提条件が揃っていた。ただ、昨今、楽器店に行っても、MIDIがついたラックマウントタイプの楽器はほとんど姿を消し、鍵盤形の楽器は、過去のしがらみでMIDIも付けてる状態。主流はUSB-MIDIに移りつつある。そんな今、楽器畑から時間をかけてMIDIにたどり着いた古いDIY世代(まあ、僕なんか典型だけど)とは違って、フィジカルコンピューティング畑から、音楽/楽器へのアプローチを試みられてる方がいらっしゃる。
morecat_labさんだ。「USB-MIDIホストの実験」の際も、熱心に情報収集下さって、多くの情報を寄せていただいた。(その節はお世話になりましたー、改めて御礼申し上げますー)

pepperの基板
スイッチサイエンス版、赤いpepper。2倍早いらしい(シャー専用かっ!)
パソコンを、外部に付けたセンサーで動作させるために、gainerというパソコンに一番近いところにUSBで接続するUIのポートを持つハードがオープンソースで展開されていて、これの互換機シリーズの第二弾として開発されたのが、Pepper。8PINのAVRを使い、4PINがgainerの入出力に利用可能。SX-150の発表にあわせて、これのバリエーションとして、USBでCV+Gateコントロールの信号を出すUSB-MIDIデバイスとしてSX-150を動かすための「Pepper-MIDI」が公開された。

氏は、Make:Meeting Tokyo や、さまざまなイベントに参加されて、鍵盤だけに頼らない新しい音楽の演奏UIの研究をされていて、大変興味深い。
そんな氏が「Pepper-MIDI」を公開されたとき、オールドタイプの僕は、よく流れがわかってなくて、それって、パソコンがないと演奏できないって事だよね?普通に小さなMIDI-IFがあってもいいよねと、「Pepper-MIDI」のトリビュートとして、「sesa-MIDI」を開発した。SX-150をレガシーMIDIで鳴らすインターフェイスだ。ソースと回路図、簡単なドキュメントを収めたZipファイルのURLをアナログ震世界のBBSに投稿するという、ひっそりとした形で公開した。(今回の改修でバグが見つかったんで、暗闇に葬っちゃいました)
ソフトウエアのみでシリアル通信をするというのが、ポイントだったのだけど、この手のライブラリは大体、AVR社のアプリケーションノートのページを漁れば、サンプルがでてくる。コレも、例に漏れない。

AVR304: Half Duplex Interrupt Driven Software UART on tinyAVR and megaAVR devices

ボーレートや、Tiny45にあわせて若干の手直しをしてブレボにいくつか部品を乗せただけで、簡単にデバッグを済ませ、ソフトウエアのみの公開で、実際に蛇の目基板に回路を乗せたりする前に「sesa-MIDI」プロジェクトはクローズしたのだけど、Monotron専用に改修する形で復活。

morecat_labさんの「Pepper」はスイッチサイエンス社が、キット化して販売している。Pepperと、Pepper-MIDIは、ファームウエアが違うだけ。外にCV+GATEを出力する専用の回路は必要になるがいたってシンプル。僕のようにしがらみがなくて、Monotronをパソコンから鳴らしたいのなら、USBが簡単で、このキットを利用するのが一番早いかもしれない。
上の写真は、morecat_labさんにご提供いただきました。

時計あわせ(ソフトウエア)

SX-150発表当時、RJBさんが一番最初に、レガシーMIDI用のインターフェイスを公開されて、それの追試と拡張をやってみた。(詳細は、シンセサイザークロニクル 簡易MIDI-IF)
ソフトウエアでLFOを追加し、モジュレーションホイルでリブラートが掛かり、ベンドホイルが使える。20PinのAVR、ATTiny2313ベース。当時の開発で「sesa-MIDI」で使った8PinAVRをつかわなかなかった理由は、小さくしすぎて作りにくくしないようにと、組み立てれば調整なしで誰でも使えるようにするために、クロックの発振に水晶を使いたかった点。
クロックのスピードにシビアなのは、システムクロックから、MIDIのクロックレートを作っており、これがずれると、MIDIが読めなくなってしまう。 ATtiny45でもクロックに、水晶を使うこともできるのだけど、それでなくても足りないピンを最大限に生かすべく、内蔵のRC発振によるクロックの発生を使ってみる。この場合チップ1発づつで、RCの値がずれているので組み立てただけでは動かない。チップ一つ一つそれぞれに、キャリブレーションが必要。プログラムの中で、OSCCALというレジスタに、補正値を入れる
ひとたび、こに正しい値が入って正しい数字で発振を始めれば、それが変化する要因は温度変化と電源圧の変化。電源の変化はそんなに大きくないはずだけど、周囲の温度は冬と夏とではかなり違う。これで、クロックのスピードがずれる可能性がある。
MIDIの通信スピードの規格は、31.25k bpsで、その許容誤差は+/-1%と規定されている。一方、tiny45の仕様書でクロックの温度特性のグラフから、120℃の温度差で、370KHzずれるのが分かる。グラフは、ほぼ直線なので、8Mの1%、80KHzの変化を得るには26℃程度。気温20度でぴったり8MHzに校正できれば、-6℃から、46℃までは周波数のずれは1%内におさまる。 送信はともかくだけど、受信に関しては、マージンはそれなりに広いはずなので、ちゃんと、初期の校正さえできていれば、室内で使う前提、受信だけなら、内蔵RC発振のクロックで問題なさそうだ。
実際にブレッドボードにのせて、実際に動かしながらヘアドライヤで加熱すると60度ぐらいになっても動いた。

フューズを切り替えると、内部で発振しているクロックをATTiny45なら3pinから取り出すことができる。プログラムソースの冒頭に通常走らせるときに使うヒューズの設定と、3pinから、8Mが出てるかどうかを確かめる設定があるので、書き換えながら、OSCCALに代入する値を変更する。 この調整には8Mが読める周波数カウンタが必要。誰にでもお勧めできるテクニックではない。

ハードウエア

Monotron専用MIDI-IF試作バージョン
Monotron専用MIDI-IF試作バージョン(クリックで大きくなる)

ブレボで動作確認して、蛇の目基板に組み立ててみて、接続してみたら動かない!えーっと。回路図を見直したりして、しばらく呆然としてたのだけどオペアンプがソケットに刺さってなかった。
オペアンプは本体に使われているLM324が1つのボディに4つ入ったクアドタイプなのに対してこちらは2発のLM358を使う。このオペアンプはほかのものに差し替えて音が良くなるとかそういうことはない。ここで求めている性能はDC領域だし、たったの5Vでも動いて、0Vも出るというこのオペアンプの特殊能力を使っている。基本的にこのオペアンプ以外ではアウト。というか、6つ買って100円。ヘタな(ってのも変だけど)トランジスタより安い!
試作版では頻繁に本体に付けたりはずしたりしたいのでコネクタを使いたいところだけど、試作にコネクタを使うのはもったいなら、切って使うインラインのICソケットを使う。ヘッダは、ハンダ付けしたときに切った抵抗の足。ぴっとくっつけておくだけ。テストには有効。

ビブラートのLFO(今回は実装してないけど)や、ピッチベンドには、グライド(ポルタメント)は掛かって欲しくない。あくまでピッチだけがグニーっと動くようにしたいので、2つのCVは別で出して、後で混ぜてやらなきゃいけない。相互に影響しあって欲しくないので、入力インピーダンスの高い反転アンプで混ぜたいという理由で、マイコンからは+/-を反転したCVがでるようにPWMするようにしてある。最終的に一番低い電圧が出るとき、PWMのオンの比率は100%になる。最高音が出るときは0%。
software は、init( void )関数内のpwmの波形設定部分でコメントアウトしてあるだけ。簡単に切り替えられる。

	:
	GTCCR |= (1 << PWM1B) | (1 << COM1B1) | (1 << COM1B0 );	//反転出力
	TCCR1 |= (1 << PWM1A) | (1 << COM1A1) | (1 << COM1A0 );	//反転出力
//	GTCCR |= (1 << PWM1B) | (1 << COM1B1) |;				//非反転出力
//	TCCR1 |= (1 << PWM1A) | (1 << COM1A1) |;				//非反転出力
	:
CPUひとつづつにそれぞれ修正が必要な、RC発振のキャリブレーションは、init( void )関数の頭部分の値を変更する。
static void init( void )
{
	OSCCAL = 136;
	:
超簡易コネクタ
インラインのICソケットに、抵抗の足のきれっぱしを突っ込んだ超簡易コネクタ

単電源の回路を組むときのポイントで、出力は電源圧付近までは出ない。LM356は3V程度。出ないのだから、反転アンプで5V出そうと思って0V突っ込んでも思った動作をしない。0Vから2Vぐらまでの間、出ない電圧を無理に出そうとしてるときのオペアンプの動作はまるでカオス。なんで、こんな動作になるんだろう。わかんねーな時は、要チェック。
PWMで出力される矩形波をLFPに入れてDC化する時、この振幅を3V以内に収めて、バイアスを1.5Vとすることで、0V付近から3V付近までの反転したリニアな変化を取り出すようにする。R4とR8がマイコンの出力の5VをR3,R7との組み合わせで分圧して2.5Vになっている
アナログの回路の微妙なところをうまく使いこなしてソフトをシンプルにして、ソフトのちょっとした工夫で、アナログ回路側をシンプルにできたり。両者の利点をうまく組み合わせた、思いがけなくトリッキーな回路かもしれない。
LFPは単純なRCタイプ。フィルタ設計アシスタントを使ってみる。

PWMのキャリア成分は8MHzのクロックを256で割った周波数だから31.25kHz。フィルタなしなら2.5Vのリップルが出ているわけだ。コレをフィルターに通して、キャリア成分を落として、DC化したいわけだ。(電源回路のリップルフィルターと一緒)
タブをLPFにして、R1に10k、C1に0.0047を入れてみる。30k周辺の減衰率は、-20dB強。これが2段なのだから、倍の-45dB程度。

  • TubeCalc (真空管回路の設計アシスタント的ソフトだけど、様々なシーンで使える計算器)
の一番下に、0.006ぐらいの数字を入れると大体-45dB弱(-44.44dB)であることが分かる。2.5(V)X0.006 = 15mV程度のリップルになることが分かる。この数字でいけるかどうかは、ほかの回路との兼ね合いなのでやって見なければ分からない。30k程度のリップルが乗ったCVで2kとか3kとかの周波数を発振させる発振器を動かすと、リップルが欲しい周波数の1波形の中で収束してしまうので、音程の変化ではなく、波形の濁り(音程ではなく音色の変化)として聞こえるはず。コレを聞き分けられるようなら、フィルターの再設計が必要になる。
LPFがなかったり、PWMのキャリアが低くて、耳で聞こえるような周波数だと、これをCVにして突っ込んだVCOは、ギロギロのかっこいい音になってしまう。