「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



ちょこっと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なんだよね)

弦の振動はそんなに簡単なセンシングはできない
もんなぁ。



コメント ( 2 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする




ウクレレMIDI化の妄想を相変わらず匍匐前進中。

例によってあの本を読み進めて、ようやくFFTの
ところまで読み終わり。

とりあえず全体像は見えてきたんだけど、まだ
プログラムのロジックに落とせるところまでは
届いてないなぁ。あとでまた読み直そう。
読書百回だな。

でもおぼろげながら見えてきた。読む前は
虚数にはアレルギーがあったし、FFTの
計算原理も良く解ってなかったし。だいぶ
わかってきた感があるもんな。


現状とりあえず、どんな観点で設計していけば
イイのかはおおよそ見えてきたので、それを
いいことに少し机上計算(たぬきのなんとやら)
をやってみる。


「周波数分解能」「サンプル数」「処理速度」
あたりが三つ巴っぽいかな。周波数分解能を
向上しようとすればサンプル数(≒メモリ容量)
が増えちゃうし、処理速度も遅くなっちゃう。

サンプル数(メモリ量)を減らそうとすれば
周波数分解能も悪くなる。そんな感じ。


サンプル数を減らしても周波数分解能は落とさない
って方法も無いことは無いんだけど。
各弦個別にナイキスト周波数を設定しちゃう。
各弦が許すギリギリの周波数まで下げちゃう。
もちろん各弦の一番上のフレットよりは高くして
おかないとダメ。
そうすることで、サンプル数が同じでもΔFが
相対的に小さくなるって寸法ですよ。ロジックは
グチャグチャになっちゃうけど。


で、表計算ソフトを使って、128点、256点
を採用した場合に、C、C#、D、D#、E…と
それぞれの音程付近をカバーするスペクトルの
ポイントが幾つ取れるかがをひたすら計算して
みちゃう。

そもそも各音程にジャストフィットする周波数
のスペクトルを都合よく拾えるような仕組み
(例えば261.6255hzと440hzを
両立するような計算方法)があれば問題なし
なんだけど、そういう便利な処理方法は出来ない
ので、周波数分解能を有る程度細かく設定する
ことによって、各音程に相当する成分があるか
どうかを近似的に判別してしまおうという作戦です。
(人間の耳の周波数分解能って、そう考えると
 すごいもんだねぇ…)

というわけで、周波数が近いところに
       「数打ちゃ当る」
作戦なのだ。一応あの本にもそういう拾い方は
可能っぽい事が書いてあったから、やるだけやって
みればいいジャン。


で、皮算用の結果。
128点でグチャグチャのロジックを組むか、
256点でスマートなロジックで済ますか、
どっちかの作戦っぽいなという感じ。

128点だとすると、弦が4本だから4倍して
128×4=512個の変数が必要。
音質に拘る必要は無いから、サンプリングを
8ビットで行うとすると512バイト。
もうちょっと贅沢して16ビット幅を確保
するとなると1KB。

これに加えてFFT計算のワーク用にある程度
纏まった容量が必要。それに加え、FFT以外の
ロジック処理用(いわゆるアプリ部分)にもある程度
必要。最低でも2KBのRAMが無いとお話にならず。

256点だとすると、おおよそ倍と見て4KB
が必要になるだろうなぁ。


2KBならmega328、4KBなら以前秋月
で買ったまま放置プレイのmega644か、
この間作ったmega128CPUボードに
白羽の矢だな。

個人的には、容量の少ないmega328に
ギチギチに詰め込んだ押し寿司状態にしたいな。
300milでちっちゃいし。


とはいえまだFFTの根本まで理解出来た訳じゃ
ないので、まだまだ妄想君状態から抜け出れてません。
まずはFFTの理解をもうちょっと進めてから、
PC上の何らかの言語使ってシミュレーション
してみよう。
それが一番の近道じゃないかという気がする。


話しかわって。

オイラの大好きな「elements~
メンデレーエフの奇妙な棚~」シリーズを
チェックしたら、どうやらシーズン4が既に
出来てたのか!
http://sc-smn.jst.go.jp/4/series.asp?i_series_name=elements%81%60%83%81%83%93%83f%83%8C%81%5B%83G%83t%82%CC%8A%EF%96%AD%82%C8%92I%81%60

27~32話の欄が増えてる!でもネットでは
見れるようになってないのねぇ。
そのうちネットでも公開されるのか、それとも
されないのか…
そもそもうちの近所のケーブルテレビでは放送される
のかなぁ?

それにしてもシーズン1からもう4年目なんだねぇ。
面白いからずっと続くといいな。



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする