ちょこっとMIDIの実験をしてみたいと思い、
構想を練ってみました。
verocityに関する実験です。
FFTを掛けて周波数を取り出せばnoteの番号を
取り出すことは可能だと思うんですが、
verocityをどんな風に設定すればいいかという
事でずーーーーーーーっと悩んでいるわけ。
キーボードの場合、キーを押し込む速さを拾って
verocity信号を作り出しているわけですが、
弦楽器の場合どうすりゃいいのよ…という
ところが悩ましいところ。単純にいえば
「弦の振幅」を拾えばいいだけなんだけど…
微少時間で眺めれば、弦の振幅はやや緩やかに
立ち上がってピークに向い、その後ゆーーーーくり
と減衰していくわけですが、この時間軸上曲線に
なっているものをどのように拾って、どのように
評価して、どのようにverocity情報に変換すれば
いいのかというお話。
まず交流波形の振幅を取り出すにはダイオード
とか使って片波形だけ取り出して平滑するとか、
デジタル的にピーク&ホールド処理を行うとか、
色々逃げ道は有るでしょう。ここはとりあえず
OK。
次。取り出した振幅情報をどうやって評価するのか。
ここが重大問題。
長時間掛ければ確実にピークを拾うこと簡単
だろうと思うけど、弾いてからMIDI信号に変換
出来るまでの時間が長くなっちゃう。
一方、あまり短時間で処理すると本当にピーク
なのか判断が難しくなっちゃう。微小のピークが
本当に全体のピークになるのかっていう話。
しかもこの辺の話と早弾きの時の1音1音分離する
話なんかを絡めると、かなりやっかい。
というわけで、なんとなくMIDIマスターキーボード
からはどんなふうに信号が出ているのかをモニター
してみたいな…とか思って、シリアル信号を
取り出して見てみたい思いが沸いてきました。
思いついたらとりあえず実行。しまっておいた
MIDIマスターキーボードを引っ張り出してきて、
一応音源に繋いでみて壊れてないことを確認。
OK。
さてどうしようかな…
USARTを2個登載しているAVRなら、
MIDIは31250bpsだから、それより少し速い
速度で別のUSARTから吐き出せば
PCでも普通に拾えちゃう。38400bpsとか。
mega128ならokだな。
でも面倒なのでarduinoで片付けてしまいたい。
たしかソフトウェアUARTのライブラリが
公開されていたはず。
入力側はハードウェアUSARTを使うとして、
出力側にソフトウェアUARTを使ってみれば
いけるかと。
で、公式サイトのソフトウェアUARTの
ライブラリを眺めてみる…
うーん、9600bpsが最高速なのか…
これだとMIDIの1/4程度の速度だから、1バイト
出力している間に3バイト以上のデータが届いたら
ハードウェアUSARTのダブルバッファも
一瞬で溢れちゃうんじゃないかなぁ?
いや待てよ。arduinoの標準シリアルは128バイトの
バッファが登載されてたなぁ。これが活きていれば
よほど鍵盤をバシバシ叩かない限りは入力バッファ
が溜め込んでおいてくれるだろう…。
ちょっとモニターするだけならこれでもいいかも。
スケッチはすぐ出来そうだから…
さて、じゃぁサクッと回路でも組んでみようかと
思ったんだけど、よく考えてみたらソフトウェア
UARTの出力がいつものUSBケーブル経由
で接続できるわけじゃないからMIDIだけじゃ無くて
RS232Cの配線も考えないといけないんだな…。
うーん、めんどくさい。マイコン同士を繋ぐなら
便利なんだろうけど、PCと繋ぐとしたら
電圧変換とか論理反転とかコネクタとかケーブル
とか色々面倒だ…
うーん、ちょっと眺めてみたいだけなんだけどな。
そのために大掛かりな回路組むっていうのは
本末転倒な気がするしなぁ…
そもそもMIDI信号がPCの通信速度と比べて
中途半端な通信速度を採用しているっていう
ことが問題なんだよな。
キーボード→MIDI音源→シリアル出力っていう
ルートは無いのかな?音源側には一応THRU
端子が登載されているから、PC接続用端子にも
信号がバイパスされているんじゃないかって
気がするんだけどな。
でもそもそもこのPC接続用端子とPC
(いわゆる9ピンシリアル)を繋ぐ
ケーブルを持ってないんだよな…
うーん…
これまでにもあれこれブレッドボードアクセサリを
作ってきたけど、いざっていう時にちっとだけ
足りなくって、でまた作って、でまた足らなくって…
みたいな。ドンドン増えちゃう。
mega128が一番いいのかな?
まぁ、ケーブルとかコネクタとかはアレだし
プログラム組むのもarduinoほど簡単には
行かないけど。でも入力と出力のフロー計算
でいうとソフトウェアバッファを組む必要は
ないから確実だもんな。
verocityがどうなっているのか見たいだけなんだ
けどなぁ。
そういえばピアノっぽいMIDI鍵盤って、仕組み
的には結構簡単に実現できるモンなぁ。
鍵盤を指で押し込んでいくとき、ある一定角(仮に
A°とする)まで押し込まれたときにタイマーを
スタートし、次にもう少し押し込んだ時の角度
(仮にB°とする)まで押し込まれたら、
A~Bに要した時間でA~Bの距離なり角度なり
を割れば速度とか角速度が求まる…と。
(だからvolumeじゃなくてverocityなんだよね)
弦の振動はそんなに簡単なセンシングはできない
もんなぁ。
![](/images/clear.gif)
![](/images/clear.gif)
![](/images/clear.gif)
|
PCにMIDI in を用意できるなら、MIDIモニタ アプリケーションソフトウェアを動かして観察できます。
今後もMIDI関係の自作をされるのであれば、1)PCに1-in/1-out 程度のMIDI I/F、2)MIDI分配器 と 3)MIDIモニタ を作られておくと役立ちます。2)はロジックICだけで、3)はATtiny2313クラスのワンチップマイコンとキャラクタ液晶表示モジュール で実現できます。
酔っ払って書いて酔っ払って読み直してので…
USB-MIDIインターフェースケーブルの購入も考えたりしてたんですが、もともとDTMに主眼を置いているわけでもないので希にしか使わないだろうなぁ…って思って、USB接続のインターフェースは断念。
いっそマイコンでなんとかしてしまいたいなぁという虫がうずきだしました。
キャラクターLCDと少ピンマイコンで何とかしちゃうっていうのもアリだと思ったのですが、表示できる文字数が少なく、またログを取るにもメモリが限られちゃうので、PCで受け取れる38400bpsにしてしまおうかという作戦を検討中です。
→MIDIの31250bpsを38400bpsに変換するだけという変換コネクタを作れば、PC上のターミナルソフトでデカいログも取り放題と…
ってことで目下、買い置きのマイコンを使って簡単に変換できないかなぁと画策しています。入力側はハードウェアUSART、出力側はソフトウェアシリアルってことなら、小さい買い置きマイコンでも可能では変換くらい朝飯前かなと。