もちろんリズムマシンでパターンをいろいろ用意して、それを繋げて1つの曲に仕立ててカラオケがわりにそのパターンを流せば気持ちよく練習ができるとは思うんですが、まず曲を準備するのが面倒臭い。
とりあえず Aメロの基本パターン1小節、Bメロの基本パターン1小節がスイッチ1つで切り替えられるなら、まぁいいんじゃない?ということで、あまりお金をかけずにこれを実現する MIDI OUT 機器を作ってみます。
1. 簡単仕様
- リズムマシンのターゲット Roland R-8MK II (手持ちがこれなので)
- MIDI OUT コントローラのマイコンは micro:bit (手持ちのパーツを流用)
- リズムマシンには A, B の2つのパターンを準備
- リズムマシンはパターンプレイモードでパターンをあらかじめ実行
- ボタンを押すと A, B のパターンを切り替える
もう少し機能をつけたいのですが、とりあえず最低限のやりたいことを実現します。
最初は Arduino で作ってたのですが、モーター回すのに micro:bit 使っていて、ボタンも備えられていることから micro:bit で実装してみました。
2. 実装イメージ
3.3V 電源の構成。本当に簡単簡単。4番ピンを 33ohm を通して 3.3V にプルアップ。5番ピンは 10ohm を通して UART の TX に。ここでは micro:bit の P2 を割り当てています。丁寧にやるなら 2番ピンとシールドの外側は GND に。ただし、それをやっていいのは MIDI OUT のみ。
ちなみに5V 系のマイコン例えば Arduino だったら 220ohm の抵抗を両方に使えばいいですね。
3. プログラム
シリアルの端子の送信を P2 に割り当てます。P1 はおまけ。
ボタンを押したらプログラムチェンジを送ります。プログラムチェンジは 2byte 構成。
最初の1バイトでプログラムチェンジのコード 0xC0 に CH 番号 - 1 を加えたもの。続いて、プログラム番号は 1バイトを送ります。
ブロックエディタだとバイナリーのデータを送るブロックがないので、この部分のみブロックエディタから JavaScript エディターに切り替えて入力します。ついでに関数にしてしまいます。
pins.createBuffer(2) で 2バイトの配列を準備。setNumber(変数, インデックス, 値) で配列の要素に値を設定。serial.writeBuffer() で準備した配列を送信します。
4. 実行
4.1 R-8MK II の設定
必要な設定は
MIDI -> TX CH -> 10CH
MIDI -> FUNCTION -> PGM CHANGE = ON
のみ。
パターンを二つ用意して、パターンプレイモードで START しておきます。
4.2 Play
A/B ボタンを押せばそれぞれにアサインされたパターンに切り替わります。
本当はフットスイッチを付けたいところ。デモなんで、お手軽に micro:bit のスイッチを使ってます。
CASIOPEA の Street Performer より
5. 次のステップ
- フィルイン機能1
A または B メロパターンを実行中にフィルインボタンを押すと、AまたはB用のフィルインパターンを1小節実行して、また元のパターンに戻る - フィルイン機能2
A/B 切り替えボタンを押した時に、A->B 切り替え時フィルインまたは B->A フィルインパターンを自動的に1小節挟む - スタート、ストップトグルボタンの追加
- テンポの自動取得
フィルイン機能を入れるのにはテンポがわからないと適切なタイミングで次のパターンが入れられないと予想されます - 筐体とボタンの強度を上げる
今のでは足で踏むとすぐ壊れます
というのをボチボチ実装していければいーなと思います。が、やるんだろうか。
6. 解説
ハマったところをメモがわりに解説しておきます。
6.1 MIDI 端子のピン配置
まずMIDI 規格書はこちら。CA-033 が電気的規格を理解するのに丁度いいです。
これがすごくハマりました。使う端子はたったの2つ。4番と5番。これがどちらかわからない!制作記事をみても多くが MIDI IN の回路だったりして。テスターのダイオードチェック機能を使えば MIDI IN 回路のフォトカプラの入力の極性から4番、5番端子が特定できそうなものだけれど、サージなどからの保護用のダイオードがパラレルに逆極性で入っているので、どちらもダイオードのアノード、カソードに見えてしまう。あと、MIDI IN - MIDI OUT はストレートケーブルで繋がるので、MIDI IN の 4 は MIDI OUT の 4 というように同じ番号同士がケーブルで接続されます。
結局こちらのブログの記事が助かりました。
CA-033 の規格書はどっちから見たんだ?オスコネクタ目線?? ちなみに IN 側も OUT 側も端子配置は同じ。正しくは OUT 側は 4番、5番の間に挟まれた 2番とシールドの外側は GND に落としますが、ここではサボっています。写真だと手前の空いている二つのピンがシールドで、奥の半田付けされたジャンパーピンの間のピンが2番です。ノイジーなステージでの使用を考えるならちゃんと GND に落とすべきですね。ただし IN 側はこれらのピンを GND に直接は落としません。浮かせるか、0.1uF のコンデンサを介して GND に落とします。折角フォトカプラで分離してるのに GND を直接ショートしたら意味ないということかなと思います。
6.2 MIDI OUT の回路と抵抗値
ここも最初は理解できませんでした。電流ループとか書かれてもねぇ。
結局、MIDI OUT 側の回路は、H 出力時、MIDI IN のフォトカプラ入力に 5mA 程度の電流を流し、L 出力時には電流を流さないという回路を考えればいいようです。電源電圧は 5V である必要はなく、3.3V でも良いのです。なぜならフォトカプラの入力に繋がる回路は発光ダイオードなので、そのダイオードが光る電流を流せばいいからですね。
ちなみに OUT 側の MIDI 端子 4番が電源電圧側(5V or 3.3V)と覚えれば良いです。フォトカプラのアノード側が繋がるので。
ところで抵抗はフォトカプラを動かす回路の電流制限という意味とショートした時の保護という意味で入れるようです。
VTX=5.5V RA=RC=220ohm
VTX=3.3V RA=33ohm, RC=10ohm
結局、MIDI OUT 側の回路は、H 出力時、MIDI IN のフォトカプラ入力に 5mA 程度の電流を流し、L 出力時には電流を流さないという回路を考えればいいようです。電源電圧は 5V である必要はなく、3.3V でも良いのです。なぜならフォトカプラの入力に繋がる回路は発光ダイオードなので、そのダイオードが光る電流を流せばいいからですね。
ちなみに OUT 側の MIDI 端子 4番が電源電圧側(5V or 3.3V)と覚えれば良いです。フォトカプラのアノード側が繋がるので。
ところで抵抗はフォトカプラを動かす回路の電流制限という意味とショートした時の保護という意味で入れるようです。
VTX=5.5V RA=RC=220ohm
VTX=3.3V RA=33ohm, RC=10ohm
6.3 MIDI データフォーマットと R-8MK II
もう少し研究する必要があります。とりあえずプログラムチェンジだけ使いました。
0xC0 + (CH - 1), Pattern No. の 2byte 構成。
電池切れました。おしまい。
0xC0 + (CH - 1), Pattern No. の 2byte 構成。
電池切れました。おしまい。