Arduinoで電子オーボエを作る
はじめに
3月の終わりに、響け!ユーフォニアム1期〜2期, リズと青い鳥, 誓いのフィナーレを一気見して「特別になりたい」気持ちを再確認し、オーボエを始めようと思い立ちました。
「昨今みんな在宅環境に投資してるし、いいイス買うようなものだし」と謎の論理を免罪符にしてMarigaux Lemaireの中古美品を買ったはいいものの、自宅は防音では無いので気軽に音は出せず、スタジオに練習に行くわけにもいきません。
自分はトランペットを長いことやっていますが木管楽器はリコーダーを除けば初めてで、オーボエの複雑な運指は問題でした。(トランペットはボタンが3つのみで音程の規則性も明確なので運指は簡単です。対してオーボエ(Lemaire)は22個キーがあり、音域によってはほぼ運指に規則性が無く丸暗記を必要とする上、左手人差し指ではハーフオープンを含め3つの状態を管理しなくてはなりません。)
今の練習状況では「第三楽章『愛ゆえの決断』」のオーボエソロを吹けるようになるまで何年かかるかわかりません。
そこで、家で手軽に運指を練習できるソリューションとしての電子オーボエの検討を始めました。
既存製品
ざっと調べた感じでは「電子オーボエ」そのものズバリな製品は見当たりませんでした。
AKAI EWIではオーボエに似た運指に切り替えられますが、そもそもキーの数も配置も異なるため再現度には限界がありそうです。
PCキーボードにオーボエのキーをマッピングする手も考えましたが、やってもかなり無理矢理な配置になるし、N-Key Roll Overに対応したキーボードを持っていませんでした。
DIY
したがって自前で製作することにしました。
おおまかに考えて、以下のような構成で電子オーボエが作れるはずです。
- マイコンボード
- 筐体
- 3Dプリント
- 自作キーボード用キースイッチ
- Kailhロープロファイルスイッチがちょうどよさそう
- ブレスコントローラー
以下、製作の過程を紹介していきます。
作った3DモデルやArduinoスケッチはこちらで公開しています。
ブレスコントローラー
ArduinoでUSB MIDIブレスコントローラーを作る、まさに求めていたことをやっている先例がありました。
同型番のセンサー(MPVZ4006GW7U)をDigiKeyで注文し、Melodion 唄口も入手してブレッドボードで動作確認します。
以下のように直でArduinoとセンサーをつなぎ、
MPVZ4006GW7U | Arduino Uno R3 |
---|---|
Vs | 5V |
Gnd | GND |
Vout | A0 |
スケッチを書き込んでシリアルモニターで確認します。
int intensity; int reading; int sensorIni; void setup() { delay(200); Serial.begin(9600); sensorIni = analogRead(A0); } void loop() { reading = constrain(analogRead(A0) - sensorIni, 0, 1014 - sensorIni); intensity = map(reading, 0, 1014 - sensorIni, 0, 127); Serial.println(intensity); }
記事でOptionalとして言及されていたdecoupling circuitは確かに省略しても動作に問題なさそうだったので、今回は無しで行きます。
筐体設計
電子オーボエの筐体をどんな形にするか、実際のオーボエを参考に穴の位置を決めつつ、ざっくり考えていきます。
もっと本物のオーボエのような見た目にできればかっこいいでしょうが、造形が難しそうなのでこのへんを落とし所とします。
完全に直方体だとキーを押さえるのに邪魔になるため、若干流線型にしています。
3Dモデル作成
Blenderで作っていきます。。
ブレスコントローラーやArduinoの取り付け位置まで緻密に設計していると無限に時間がかかりそうだったので、ある程度の配置だけイメージしつつ、残りは後で糸ノコで調整する前提で出力してしまいます。
3Dモデル出力
DMM.makeを利用しました。
素材は、キャンペーンで安くなっていたのでPA12(MJF)を選択。
上部と底部の2モデル合わせて15,000円でした。サイズ大きいので結構かかりますね。。
もっと小さくパーツ分けてあとでつなぎ合わせるほうがいいのかな。そうすれば家庭用プリンターでも出力できそうです。(持ってないけど)
筐体加工
無事出力できたはいいのですが、なんと第二オクターブキーをはめる穴を開け忘れていました。。ここは糸ノコで開けます。
また、以下はモデル出力時点ではTBDにしていたので、寸法を図りつつ加工していきます。
- 上部と底部をナットで止めるための穴
- Arduinoを固定するための穴
- ブレスセンサーを配置したユニバーサル基板を固定するための穴
- 唄口を露出させるための穴
キースイッチとPCB配置
キースイッチをはめ込んで、そこに無限の可能性 アルタナを載っけていきます。
寸法通りに出力したので当たり前といえばそうですが、きれいにハマってちょっと感動。
キーマトリックス設計
Arduino Uno R3のGPIOは14本で、オーボエのキーは23個(今回、左手人差し指ハーフオープンを別個のキーとして実装します)あるためダイレクト配線ではピンが足りません。 したがってキーマトリックスを組みます。
23個のキーに番号を振ったのち、
キーマトリックスへ割り当てます。data[0-4]がINPUT_PULLUP、sel[0-4]がOUTPUTモードです。
任意キーの同時押しは必須要件なのですべてのキーにダイオードも入れます。
実装
表面実装ダイオード1N4148Wを各無限の可能性にはんだ付けして、キーマトリックスを配線していきます。。
次に、ブレスコントローラーを取り付けます。
中身は最終的にこうなります。
上部と底部を閉じてナットを締めればハードウェアの完成です。
スケッチ実装
ロジック的に難しいことは無いですが、運指表を見ながら音との対応づけを根気よくコードに落としていきます。。
https://github.com/ocadaruma/roboe/blob/v0.1/oboe.cpp#L645
Pitch OboeKeys::toPitch() const { switch (this->bitFlags()) { case B_FLAT_3_0: return { 3, PitchName::B, Accidental::FLAT }; case B_3_0: return { 3, PitchName::B, Accidental::NATURAL }; case C_4_0: return PITCH_MIDDLE_C; case C_SHARP_4_0: case C_SHARP_4_TRILL_0: ....
C++11準拠でスケッチを書けて便利です。
ArduinoをUSB MIDI controller化
Serial.printデバッグである程度動作確認できたら、ArduinoをMoco LUFAでUSB MIDI controller化していきます。
手順はこちらに詳しいです: Arduino Moco LUFA
Putting together
一通り出来上がったので手持ちのDAWで鳴らしてみます。
。。。おおむね問題ないのですが、タンギングが効きません。(タンギングとは、舌を歯やリードに当てて息の流れを遮断し、音を止めることです)
それはそうで、ブレスコントローラーは下記のように実装していました。
- センサーはホース内の圧力に応じて値が変化する
- 息を吹き込むとホース内の圧力が上がる
- 唄口 -> ホース -> センサーは密閉されており、息の通り道は無い
舌をどこに当てたところで圧力が変化しないためタンギングができないのです。
そこで、唄口に小さな穴を開けます。
これにより、継続的に息を吹き込んでいる限り圧力がかかってセンサーが反応するが、息を遮断すると穴から息が逃げて圧力が下がるようになり、タンギングが効くようになります。
というわけで最終的にできたものを演奏した動画がこちらです。(ビブラートは音源が勝手にかけてくれている。。)
まとめ
これで実際オーボエの運指の練習になるのかはさておき、ほぼ想定通りのハードウェアが出来上がりました。(なおこの記事ではすべてがスムーズにいったかのように書いていますが、実際は試行錯誤やパーツ到着のリードタイムなどもあり、着手から完成まで1ヶ月くらいかかってます)
ただし改善したい点もいくつか出てきました。
- キーの配置を実際のオーボエにもっと近づけたい
- 特に小指キーがかなり苦しい
- 穴の配置を斜めにしたりすればマシになりそう
- キーキャップを取り付けたい
- キースイッチ同士をかなりタイトに配置したので普通のキーキャップがハマらない
- そもそも、キーボード用キースイッチよりもっと適したスイッチがあるのでは?
- 3Dモデルの完成度を上げて、印刷後の追加工作を不要にしたい
- 糸ノコとかドリルは極力使いたくない
- 専用PCBで配線の手間を減らしたい
- 唄口は、衛生面から交換を容易にしたい
- 手軽にはずして水で洗えるとうれしい。現状は唄口とホースがきつめに噛んでるので筐体のネジ外してホースを引っ張り出して押さえながらグリグリ抜く必要がある
次に作るとしたらこのあたりが課題です。