行き当たりばったり式・電子工作
家のおもちゃ箱には、いつか何かを作ろうと思って買った部品やら、いつか役に立つだろうと揃えた工具やら計測器やらが転がっている。
最近、ヒマな時間を使い、おもちゃ箱から部品を引っ張り出しては、思いつきで何かを動かしてる。
「こんなもの作れるかなー?」「ええい、やっちゃえ!」
…と、上手くいくという目処もなく、行き当たりばったりで進めちゃうのだ。完成するかどうかは神のみぞ知る。
そんなことを繰り返していたら、いつの間にかMIDIクロックジェネレーター(MIDI Beat Clock Generator)ができてしまった。自分でも驚いた。こんなに簡単なのか!?って。いやホント、マジでカンタンなんだから。
まずは「Lチカ」から
「LEDをチカチカさせる」から「Lチカ」。いまや「電子工作といえばLチカ」と云われるほどの、初心者向け定番実験だ。
おもちゃ箱にLED10本入りの袋が転がっていたんで、4本を順番に点灯させることにした。プログラムを書くのも久しぶりなんで、肩慣らしだな。
ちなみに使っているマイコンは「Teensy」。Arduino IDEで開発できるけれど、Arduinoよりもコンパクトで速くてメモリも多くて使いやすいのだ。
なんとなく簡単な電子工作。LEDをチカらせてみた。 pic.twitter.com/X4Ki6LssMq
— Roppyaku Tsurumi (@tsurumy) July 23, 2022
抵抗を繋いでるけど、値とかはテキトー。特に計算もしてないし、ひょっとしたら要らないのかもしれないけど、抵抗がおもちゃ箱に転がってたから、なんとなく挿してあるだけだ。
この時点ですでに、上手くいったらクロックジェネレータ―にしようと考えていたんで、BeatPerMinutesという変数を持ち、そこからインターバルタイマー割り込みでLEDを順次点灯させている。
割り込みタイマーを、MsTimer2から、IntervalTimerに変更。ヘイヘイ、ウィーアー、タイマー。 pic.twitter.com/UPIRthv7Ed
— Roppyaku Tsurumi (@tsurumy) July 23, 2022
インターバルタイマーのライブラリを参考にしたら、あっという間にできてしまった。Arduino IDEってカンタンだなあ。
7セグでBPM表示
年寄りにとって、BPMを表示するのは7セグだと決まっているのですよ。そのために、秋月の「7セグメントLEDシリアルドライバキット」をブレッドボードに並べてみた。
お次は、7セグで数字を表示すべく配線。いずれここにBPMを表示させるという、遠大な計画があるのだ。 pic.twitter.com/yKqR8tT67v
— Roppyaku Tsurumi (@tsurumy) July 23, 2022
ちょうど参考になるような動画(よみやチャンネルさん)がYouTubeに上がっていたんで、そのまんま作っただけなんだけどね。
秋月のパーツは、YouTubeとかで検索すると制作例が見られることが多いんで、本当にありがたい。
とりあえず、数字の表示はできた。Teensyは3.3V動作なので、この7セグ表示器(4~6V動作)だと暗いんだけど、まあそれは後でどうにかしよう。
色々と見直したら、3.3ボルトでも動くようになった。でも微妙に暗いな。電圧降下してるのか、明るさが均一じゃないや。
— Roppyaku Tsurumi (@tsurumy) July 24, 2022
でもまあよし。 pic.twitter.com/V5IHKezCnI
プログラムも、よみやチャンネルさんのプログラムと、Arduino IDEにあったサンプルプログラムを参考にしたら、何も考えずにできてしまったよ。
Arduino IDEは、サンプルプログラムが豊富でホントにラクチンだわ。 pic.twitter.com/lIp5je3J9e
— Roppyaku Tsurumi (@tsurumy) July 24, 2022
ロータリーエンコーダでBPMを上げ下げ
仮にも「クロックジェネレータ―」を名乗るんなら、BPMの上げ下げぐらいはできなければイカンだろう。プッシュスイッチで上下することも考えたんだけど(カンタンだから)、たまたま秋月の「LED付ロータリーエンコーダ」が転がってたから、これを使うことにした。何のために使うつもりで買ってあったのかは覚えてないけど、これはラッキー。
ロータリーエンコーダのプログラムは、Teensyのサンプルプログラムから引っ張ってきた。念のため、割り込みがなくとも使えるものを選んだ。これをイチから作るとなったら、絶対に挫折してるだろうなあ。
というわけで、先の7セグ表示プログラムに、ロータリーエンコーダ読み取りのコア部分を移植して、エンコーダをくるくる回すとBPM(予定)の数字が上下するところまで完成。
とりあえず、ロータリーエンコーダで数値を上下させるとこまでは作った。 pic.twitter.com/GDLAYQdNN4
— Roppyaku Tsurumi (@tsurumy) July 24, 2022
ここに、いちばん最初のLチカを合体。ロータリーエンコーダのライブラリは割り込みを使っていないものを選んだのは、Lチカでタイマー割り込みを使っているからだ。なので、何も考えることなくコピペで完了。
全部合体させた。つまみでBPMを上下させると、4連LEDのテンポが上下する、てな感じ。 pic.twitter.com/Au6JcaQwaE
— Roppyaku Tsurumi (@tsurumy) July 24, 2022
クロックをMIDIで出力
ここまでくれば、後はカンタン。Teensyは古くからUSB MIDIが使いやすかったためか、MIDI関係のライブラリや作例が見つかりやすいんだよね。プログラムを作る能力よりも、検索する能力の方が役に立つ。今回も「uClock」という、まんまMIDIクロックジェネレーターを作るためのライブラリが見つかったんで、これを使うことにする。
今まで作ったプログラムと合体。というか、大抵は「ヘッダファイルをinclude」して、「サンプルプログラム通りに初期化」すれば動いちゃうんだよね。
ほーら動いちゃったよ。
MIDIビートクロックを出力するところまではできた。Windowsのモニター上でのBPMの値が、基板の数値にちゃんと追随しているぜ。
— Roppyaku Tsurumi (@tsurumy) July 27, 2022
スイッチでStart/Stop信号を出すのは、副反応の熱が下がってからだな。 pic.twitter.com/1GRaVR8dgd
ちなみに動作確認は、Windows用の「MIDI-OX」というアプリを使っている。これもまた、先人の礎のおかげで、本当にラクさせてもらっているなあ。
Lチカは、インターバルタイマーではなく、uClockの割り込みを使って点灯するように改造。あと、秋月のロータリーエンコーダにはスイッチとLEDが付いているので、これを使ってMIDIクロックの「START」「STOP」「CONTINUE」機能も付けておいた。これにて完成。
つまみスイッチの機能を実装したぜ。スタート/ストップ/コンティニュー。長押しするとソングポジションポインターを初期化。
— Roppyaku Tsurumi (@tsurumy) July 28, 2022
そういえば、Pro ToolsがMIDIクロックを受信できないってことを初めて知ったわ。 pic.twitter.com/sHwgHYlKUw
ジェネレーターに同期させて曲を流してみる
何年か前に買った、KORGの「nanoKEY Studio」という製品にバンドルで付いてきた「Reason Limited」というDAWソフトがある。もうバンドルしていないようだし、俺の持っているのもかなり古いバージョンではあるけれど、立ち上げたら問題なく動作した。
調べたところによると、このReasonはMIDIビートクロックに追従して、リアルタイムでオーディオファイルを伸び縮みさせる機能があるらしい。なんと。それができるのって、Ableton LIVEぐらいかと思ってた。
というわけで早速試してみた。クロックジェネレータ―をマスターに、Reasonをスレーブにして、サンプルソングを流してみたら…
家にあったDAW「Reason」(バンドル版)にMIDIクロックジェネレーターを繋いでみたら、なんか上手く同期できちゃったんだけど。MIDIだけじゃなくてオーディオも、ピッチそのままに同期してくれてる。こういうことをしたかったんだよ! pic.twitter.com/YvrfDumNG5
— Roppyaku Tsurumi (@tsurumy) July 31, 2022
動作するじゃん! 同期するじゃん! そうそう、こういうことをやりたくて、MIDIクロックジェネレータ―を作ったんだよ!
Reasonを使ってこんなことができるのなら、ライブとかでも使えそうな気もするね。ブレッドボード上の実験だけじゃもったいないんで、プリント基板も作って、ちゃんと形にしようと思う。
実は設計はもう済んでいるんで、次回はその辺りを書いていくことにしよう。
(次回に続く)