以下の内容はhttps://yuchi51.hatenablog.com/entry/2024/12/13/011011より取得しました。


VJプレイ用のMIDIコントローラーを自作する

VJアドベントカレンダー2024 13日目の記事です。

昨日はMEMEMIYAさんの「VJを初めてやるが、ジャンルは何が良いのか?」という問いに対する個人的なおすすめでした。


最近自作のMIDIコントローラー(以下MIDIコン)を試作程度に作ったので、その経緯から基板/ケース設計、実際に現場で使用するに至るまでの記録です。

0から100まで作り方の解説した記事ではないことをご承知おきください。

この記事の前提事項

この記事では簡単な電気回路、基板設計、ファームウェア制作(プログラミング的要素)を含む多少専門性が高い記事となっています。

VJソフトの挙動についてはすべてVDMX上での話となります。

今のMIDIコントローラーに足りないところは何か

MIDIコンを作る話に興味がある場合はこの章を読み飛ばしてください

私はVJをする際はAKAI APC40 MKIIを使用しています。

市販されているMIDIコントローラーの中でボタンとノブ数が多く、お酒を飲みながらもしっかりと操作ができるフェーダー大きさが電車での持ち運びにギリギリ許容できるサイズの筐体に詰め込まれています。

akai-pro.jp

このコントローラーはAbleton Liveを用いたライブ演奏を行うために主軸を置かれて開発されたものであるため、VJ用として使用(マッピング)する時気になるところが出てきます。

  • 筐体右側にあるボタン類の挙動
  • 筐体右側にあるボタンの押しにくさ

筐体右側にあるボタン類の挙動

APC40 MKⅡボタン配置

出典: AKAI公式のユーザーガイドより引用

画像右側にあるボタン類の挙動がボタンによってすべて異なります。

14~16,19,23,25,28,32~34のボタンが1回押したらオン、再度押したらオフのトグル扱いをコントローラーのファームウェアレベルで行っています

18,17,21,22,24,26,30,31のボタンが押してる間はオン、話したらオフの挙動(以下プッシュ型)となります。

これがVJソフトで使用したときにどのような問題になるかの例として、”ストロボ系のエフェクトなどの押している間のみ効果を適用したい処理”で不便となります。

押している間のみ効果を適用させたい処理に対してトグル扱いのスイッチに割り当て(アサイン)を行うと、「1回押してオン→指を離してもオンのまま、再度押してオフ」となり、短時間で連続で押すようなものには使いにくくなります。

筐体右側にあるボタンの押しにくさ

前述している通り、このコントローラーはAbleton Liveを用いたライブ演奏を行うために作られているコントローラーで、VJのような激しいボタンの連打は想定されていません。

スイッチ機構部はタクトスイッチ(CDJのボタンのあの感じ)が採用され、ボタン自体も小さいために指先により力をかける必要があるため連打には向いていません。

(タクタイルスイッチの押下圧は少し調べた限り0.98Nのものが多く、約100g程度の力が必要ということになります。)

右上にあるPLAY,RECORD,SESSIONボタンはサイズが大きく、押しやすいのですが右上という場所とトグル扱いの挙動ということもあり、ボタンを連打したいストロボ系のエフェクトとの相性は良くないです。

そのため、右側のボタンアサインが少なくなり、実質以下画像のような状態となっていました。

自作MIDIコンを作る

作るに至る経緯

自分はLily58シリーズという自作キーボードを以前から設計しており、基板設計やケース設計、マイコンの知識は多少あります。

以前にもMIDIコン自作の構想はありましたが、「酔っ払いながらある程度の力が加わる筐体」「現場で使用中に壊れてはいけない」ということもあり、作るのは避けてきました。

ただ、以前よりもケース設計の知見が溜まったことや、キーボード以外の新たな設計に挑戦してみたいというところから実際に設計を行いました。

MIDIコントローラーを自作すると以下のような利点があります

  • 好きな筐体サイズ、ボタン数、フェーダー数
  • すべてカスタマイズな動作挙動とMIDIチャンネルのアサイ

ブレッドボードでモックを作る

ブレッドボードを用いてファームウェアの挙動などの確認として試作をします。

使用するマイコンファームウェアRaspberry Pi Pico(RP2040)とCircuitPythonを使用します。

使い方などに関しては今回は割愛します。

以下のような回路図をブレッドボード上に作成

MIDIバイスとして認識するコードを書き、Raspberry Pi Picoへ書き込みます。 adafruit_neopixelusb_midiのライブラリは別途CircuitPythonのライブラリからコピーする必要があるため注意してください。

import board
import digitalio
import adafruit_neopixel
import usb_midi
from adafruit_midi import MIDI
from adafruit_midi.control_change import ControlChange

# LED Pin
pixel_pin = board.GP2 

#LEDの数
num_pixels = 3 

pixels = adafruit_neopixel.NeoPixel(pixel_pin, num_pixels, brightness=0.2, auto_write=False)

midi = MIDI(midi_out=usb_midi.ports[1], out_channel=0)

#スイッチの設定
switch1 = digitalio.DigitalInOut(board.GP10)
switch2 = digitalio.DigitalInOut(board.GP11)
switch3 = digitalio.DigitalInOut(board.GP12)
switch1.switch_to_input(pull=digitalio.Pull.UP)
switch2.switch_to_input(pull=digitalio.Pull.UP)
switch3.switch_to_input(pull=digitalio.Pull.UP)
cc_numbers = [20, 21, 22]

#スイッチのステータス
toggle_state = [False, False, False]
last_switch_state = [True, True, True] 

def update_leds():
    for i in range(num_pixels):
        if toggle_state[i]:
            pixels[i] = (50, 50, 50)
        else:
            pixels[i] = (0, 0, 0)
    pixels.show()

# 処理部
while True:
    for i, switch in enumerate([switch1, switch2, switch3]):
        current_state = switch.value
        
        if current_state == False and last_switch_state[i] == True:
            toggle_state[i] = not toggle_state[i]
            midi_value = 127 if toggle_state[i] else 0
            midi.send(ControlChange(cc_numbers[i], midi_value))

            update_leds()

        last_switch_state[i] = current_state

トグル挙動で無事に動くことが確認できました

基板設計をする

ブレッドボード上のRasPi Picoからタクトスイッチを押すことによりMIDI信号出すことが確認できたので、いよいよ基板設計を行います。

今回の設計思想として以下のようなことを考えていました。

  • 試作設計のためサイズは小さめの筐体
  • ボタンはある程度押しやすい大きさ
  • ポテンショメーター(ノブ)有り
  • RP2040かつType-Cコネクタ
  • 3Dプリント製ケース
    • ある程度の堅牢性がある設計

基板CADはKiCADを使用します。

ブレッドボードで作ったときの延長で部品を増やして回路図を作ります。

部品を並べて配線を引き、基板を設計します

今回実際に使いたいと思っていたVJ現場に間に合わせるためと、家に在庫として持っている部品を使った設計となったため、改めてみると雑加減が目立ちますね...

製造用のデータを書き出して、基板は中国の基板製造業者(JLCPCB)へ発注すれば1週間程度で届きます

ケース設計

基板が到着するまでの1週間でケース設計を行います。

3DCADはFusion360を使用して設計を行います。

KiCADからは3Dモデルの.stepファイルを書き出しができるため、書き出し後にFusion360にインポートをして設計を開始します。

「堅牢性」を意識し、プラスチック製品によくあるリブを入れつつ、今回は試作設計ということもあったので、こだわったデザインはせずに箱型そのままで設計しています。

設計が終わるとこのようなものができました。

APC40 MKⅡの筐体底面にも六角形のリブが入っています(かっこいい)

データが出来上がればケースは3Dプリンターでプリントします。 実際は1回でうまく組み上がることはなく、3回程度設計の調整をしてプリントをし直すということをやっています。 高速造形ができるBambuLab P1Sを使用していますが、2時間でプリントが終わるので試作サイクルの効率がかなり良かったと感じています。 普通の3Dプリンターでは倍の時間かかっていたと思います...。

組み立て

ここが作っていて一番楽しい瞬間です。

3DCADで実寸台で設計していたものが、そのまま手元に出来上がる楽しさのためにモノを作っていると言っても過言ではないですね。

実はこの写真の段階でVJ出演(昼)がある日の午前4時を過ぎていたため、LEDの実装やShift機能など考えていた機能は一部実装せずに「ファームウェアはとりあえず動く」ものを書いて現場に持っていきました。 (とても公開できるようなコードではないので割愛)

実際にVJで使う

作ったその日にVJ現場(NEXTLIGHT FESTIVAL vol.4)があったため、実際にAPC40 MKⅡと共にに持ち込みました

アサインはプッシュ方式で、主にストロボエフェクトにアサインを行いました。

実際に現場で使った感想としては、まだまだ筐体設計で改善できる点があると感じました。

スイッチのボタン自体も3Dプリントで作成しましたが、クリアランスの問題や、斜めから押したときにちゃんと押されない問題などがあり、素直に既製品のキャップを使うべきですね。

押下圧の問題もタクトスイッチを使っている以上、ボタンサイズを大きくしても根本的な解決にはなりませんでした。

今後設計するMIDIコントローラーのボタンには薄型メカニカルキーボードで使われるKailh Choc V2(押下圧約50g)などにしようと思います。

それ以上に「自作MIDIコンが現場で動いている」という満足感はありました(重要)

懸念していた「動作しなくなる」「壊れる」などの問題は発生しなかったため、イベント終わったときにはかなり安心しました。

今後とまとめ

イベント出演駆動開発でMIDIコントローラーを自作しましたが、試作の割にはそこそこ使えるものができました。

今後、APC40 MKⅡを置き換える自分の理想とするMIDIコントローラーの作成にかなり近づくことができたと感じたので、時間があるタイミングで少しづつだと思いますが設計を進めてみます。


制作の部分を解説はかなり端折ってしまいましたが、0から100まで書くと技術同人誌1冊出来上がってしまう量となるため今回は設計の流れの解説程度に留めました。

MIDIコン制作についてはこの記事では語りきれないぐらい話すネタができたため、どこかのイベントなどで話したいですね。

この記事を見た方も是非(?)自分だけのオリジナルMIDIコントローラーを作るのに挑戦してみてください。




以上の内容はhttps://yuchi51.hatenablog.com/entry/2024/12/13/011011より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14