例のウクレレをMIDIマスターにしたいという妄想
のお話。
とりあえずウクレレっぽい形はできて、圧電素子で
音を拾うことも出来たし、1弦1弦分離してピックアップ
するのも実験済みってことで、そのあたりは一旦休息し
MIDIインターフェース周りを少しだけ考えてみる。
マイコンからMIDI音源に信号を送って、MIDI
音源から音を鳴らしてみます。まぁ、USART登載
のマイコンなら31250bpsの8n1でデータを送れば
イイわけで、どっちかって言うと回路周りの確認と、
オイラの音源がまだ壊れず動いてくれているのかの
確認といったことが主眼かな…。
DIN5ピンメス端子は幾つか買い置きがある(注1)
ので、そのうち1個をブレッドボードアクセサリに
加工。ハンダ3箇所なのであっという間。
(注1:ハムスター並みの記憶力のオイラが
家に買い置きがあるのを忘れて追加購入
されてきた哀れなDIN5ピンさんたち
計3個)
次、arduinoでスケッチを適当にでっち上げる。
内容的には、ノートオン/ノートオフの信号を送る
だけなので元々大した話ではないんだけど、間抜けな
失敗が…
スケッチをコンパイル→アップロード…動きません。
serial.print文で16進コードを吐き出さないと
いけないのに、BYTE指定をしてなかったので
キャラクターコードの数字文字を吐き出してた。
→ BYTE指定に修正
修正後のスケッチをコンパイル→アップロード
…やっぱり動かない。
serial.printだと思ってたらserial.printlnだった。
→ serial.printに修正
これでようやく動くようになりました。
出来たスケッチがこれ。
void midi_out(int channel,int note,int velocity) {
Serial.print(channel,BYTE);
Serial.print(note,BYTE);
Serial.print(velocity,BYTE);
}
void setup() {
Serial.begin(31250);
delay(1000);
}
void loop() {
midi_out(0x90,60,64);
midi_out(0x90,64,64);
midi_out(0x90,67,64);
delay(1000);
midi_out(0x80,60,0);
midi_out(0x80,64,0);
midi_out(0x80,67,0);
midi_out(0x90,60,64);
midi_out(0x90,65,64);
midi_out(0x90,69,64);
delay(1000);
midi_out(0x80,60,0);
midi_out(0x80,65,0);
midi_out(0x80,69,0);
midi_out(0x90,59,64);
midi_out(0x90,62,64);
midi_out(0x90,67,64);
delay(1000);
midi_out(0x80,59,0);
midi_out(0x80,62,0);
midi_out(0x80,67,0);
delay(1000);
}
C、F、Gの3つのコードを順に出力しては消音
を繰り返しているだけの単純なもの。チャンネルは
0に固定してるので、ノートオンは0x90、
ノートオフは0x80となってます。
まぁ、音が簡単に出るのは判ったし、音源ユニット
が壊れてないことも判ったし、配線が正しいことも
判明。めでたし、めでたし。
さらにこのスケッチを元に幾つかバリエーションを
設けて幾つか実験をしてみたんだけど、そしたら
またちょっと悩ましい話が…エンベロープのこと
ですが。まぁ、それは先送り。
さて、こうなるとあと厄介なのはウクレレの
弦1本1本から信号を拾い、FFTに掛けて
ノートオン、ノートオフの信号に変換する
ロジックを考えるだけって感じかな。
まぁ、頭脳面でいうと、オイラの一番のネックは
まさにそこなんだけどね。
あの本、さらに読み進めています。
DFTの章に入ったところでやっぱり出てきた虚数。
このあたりからジンマシンが痒くてかーなわんなわけ
ですが、じっくり読んでなんとかモノにして行きたいな。
ギターシンセの処理方式をウィキペディアなんかで
調べてみると、アナログ的な処理で周波数→電圧変換
(FVC)を行って、その電圧を音程と評価する
みたい。
基音のSIN波のゼロクロス点でパルスを出力して、
そのパルスをLPFに掛けると、パルスの間隔が
電圧値に変換できるという仕組み。
まぁ処理内容としてはよく理解できるんだけど、
やっぱオイラはFFT掛けて「デジタルだけ」で
処理するのに挑戦してみたいんだよな。
マイコンだけであれこれやりたい。
どうなることやら。
|
|
|
|
|
|