linclip が 2021年02月18日17時34分21秒 に編集
コメント無し
本文の変更
懐かしのゲームコンソール用ジョイスティックで、ちょっとしたブームになっているフィンガードラムを演奏できるUSB接続のMIDIデバイスを作ります。 使ったのはセガサターン用ジョイスティック「HORI ファイティングスティックSS」です。ハードオフで500円で買いました。あとはArduino互換ボードがあれば合計1000円くらいでなんとかなります。 @[youtube](https://www.youtube.com/watch?v=AW8wzTwpeno) # はじめに
「フィンガードラム」、「指ドラム」、あるいは「フィンガードラミング」などと呼ばれる、ドラムサウンドをパッドを使った演奏。興味を持って始めようと思い調べると、専用のデバイスはけっこう値が張ります。AKAI Professional MPCやMPDシリーズ、IK MultimediaのiRig Pads、Native Instruments MASCHINEシリーズ、Novation Launchpadシリーズなど、音源内蔵にしろ、PCでの使用前提のコントローラータイプにせよ、少なくとも1万円以上はします。
「フィンガードラム」、「指ドラム」、あるいは「フィンガードラミング」などと呼ばれる、パッドを使ったドラム演奏。興味を持って始めようと思い調べると、専用のデバイスはけっこう値が張ります。AKAI Professional MPCやMPDシリーズ、IK MultimediaのiRig Pads、Native Instruments MASCHINEシリーズ、Novation Launchpadシリーズなど、音源内蔵にしろ、PCでの使用前提のコントローラータイプにせよ、少なくとも1万円以上はします。
もっと安く、手軽に始められないものか? と思っていたところ、思いついたのがこれ。 - ドラムキットのパーツ分のボタンがあればいいんだから、ボタンが8個くらいあるゲームコンソール用ジョイスティックでいいのでは? - ヒット時の強弱の検出はなくてもよさそう。ベロシティ固定でプレイしてる人もいるくらいだし。 - ATmega32U4搭載のArduino互換マイコンボードなら簡単にUSB-MIDIデバイスが作れる。 - ゲームコンソール用ジョイスティックは、ハードオフなどで数百円から手に入る。セガサターンとかプレイステーションとか古いやつでOK。 そんなこんなで、中古商品が安価で購入できるハードオフでたまたま見つけたサターン用ジョイスティック「ファイティングスティックSS」を使用します。 ![キャプションを入力できます](https://camo.elchika.com/98c6ef68a3614683b38057890a0bf31a79d40106/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34303631396238372d373831332d346334382d613433632d6439653963323937393766612f37336565353333652d363036392d343736612d396438332d636566353964356564333031/) # 用意したもの 1. ファイティングスティックSS(ほかの機種でもOK) 2. ATmega32U4搭載マイコンボード(Leonardo、ProMicro互換機など) 3. ブレッドボード 4. 配線用ケーブル、ピンヘッダ、Micro USBケーブルなど ![キャプションを入力できます](https://camo.elchika.com/882744b887882ad8e6da28203481a64117de81e3/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34303631396238372d373831332d346334382d613433632d6439653963323937393766612f38343034653738362d373266662d343534302d393130342d613339646233363538376366/) 2のマイコンボードは、簡単にMIDIデバイスが作成できるArduino LeonardoやAdafruit ProMicroおよびその互換機を使用します。 ATmega32U4を搭載しているのがポイント。Arduino UNOは搭載チップが異なり、ここまで簡単にはできません。 今回使用したのはAmazonで購入した「HiLetgo Leonardo Pro Micro ATmega32U4 5V/16MHz ブートローダ マイクロ USB Pro mini Arduinoに対応 」という小さいボード。付属のピンヘッダをはんだ付け。Arduino IDEではボードマネージャーで「Arduino Leonardo」を指定しました。製品によってはこの指定だとプログラム転送後にUSBポートが消えるものがあるので、販売会社の説明をチェックしてください(同じチップを搭載した他社製品では、この指定ではだめで、「Adafruit ProMicro」を指定しなくてはなりませんでした)。 あと、今回はなるべくはんだ付けを減らしたいということからブレッドボードを使用しています。動作確認が終わったらはんだ付けしたほうがよさそうです。 # ジョイスティックの中身を開ける まずはジョイスティックの中身を見てみます。底面のゴム足をはがして、ねじを6本外せばOK。 ![キャプションを入力できます](https://camo.elchika.com/f639da858be62d6c372b4c9e2a725bac12eff5de/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34303631396238372d373831332d346334382d613433632d6439653963323937393766612f38366631306535642d363964302d346439622d613035392d623764366438306237623366/) まずは緑色のメインボードと思われる基板からカラフルなケーブルを外します。 ![キャプションを入力できます](https://camo.elchika.com/aab8df00474215349f5de455fce12287a5dba324/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34303631396238372d373831332d346334382d613433632d6439653963323937393766612f35643333393661302d316130382d343637372d393833382d646633666633613465343435/) 外すのはここです。 ![キャプションを入力できます](https://camo.elchika.com/14dd6d069725906b77683878330c78188f0dc0c9/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34303631396238372d373831332d346334382d613433632d6439653963323937393766612f30323762343964622d353539392d343961312d613763312d633635633066633264396637/) まずはここにArduinoを使った電子工作で使っているジャンパワイヤをつないでみます。 ![キャプションを入力できます](https://camo.elchika.com/49cda1c658178c3f5c830fc6c18b2ce621e9f428/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34303631396238372d373831332d346334382d613433632d6439653963323937393766612f65613332376331332d656165642d343931372d626136642d326464346538653536346363/) でもって、マイコンボードに接続。ピンアサインはネット検索で調べました。電源とグランド、数本の信号線があります。これでボタンを押した時の動作を見ます。 で、Arduino IDEで各ピンをDigitalReadして返ってくる値を見たのですが、よくわかりません。というか、理解できなかったので、この方法はあきらめます。 路線変更。 テスターを使って基板上をいろいろあたったところ、各ボタンの位置にある2つのポイントをつなげればいいということがわかったので、はんだ付けを開始します。 # 配線 ![キャプションを入力できます](https://camo.elchika.com/fe925a918c45b4a8f96d1c7b62db1e94d6217cf2/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34303631396238372d373831332d346334382d613433632d6439653963323937393766612f34363838343230372d656465312d346162362d613364312d613462646163336566623335/) こんな感じで配線しました。赤いのが信号線で、マイコンボードのD2からD9へ接続(赤いケーブル)。グランドは共通なので1本をマイコンボードのGNDに接続(緑のケーブル)。8個のボタンは8+1の9本でOK。マイコンボードの内部プルアップを使用するため、抵抗は不要です。 今回のプロジェクトでは使用していませんが、ジョイスティック部は別配線で、これも4本+1本(GND)でOK。 もともと付いていたケーブルは使用しません。最終的に使用するのは、マイコンボードにつないだUSBケーブル。これをPCにつないでプログラム。さらにUSB-MIDIデバイスとして使用することになります。 # プログラミング Arduino IDEでプログラミング。前述のとおり、ボードには「Arduino Leonardo」を指定(使用ボードに合わせてください)。シリアルポートはデバイスマネージャーでチェックします(つないで増えたポートがそれ)。 ## ライブラリ 使用するライブラリは「USBMIDI」。ATmega32U4で簡単にMIDIデバイスが作れるいかしたやつ。あらかじめ設定しておいてください。 https://github.com/arduino-libraries/MIDIUSB ## コード ``` #include "MIDIUSB.h" // https://github.com/arduino-libraries/MIDIUSB int switchPins[] = {2, 3, 4, 5, 6, 7, 8, 9}; //ボタンのピン int btNote[] = { 48, 50, 38, 42, 49, 43, 46, 36}; //ボタンに割り当てるノートナンバー //上段:ミドルタム47 or 48、ハイタム50、スネア38、HHクローズ42 //下段:クラッシュシンバル49、フロアタム43、HHオープン46、キック36 int switchPreVal[8]; int switchStatus[8] = {HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH}; void noteOn(byte channel, byte pitch, byte velocity) { midiEventPacket_t noteOn = {0x09, 0x90 | channel, pitch, velocity}; MidiUSB.sendMIDI(noteOn); } void noteOff(byte channel, byte pitch, byte velocity) { midiEventPacket_t noteOff = {0x08, 0x80 | channel, pitch, velocity}; MidiUSB.sendMIDI(noteOff); } void setup() { Serial.begin(115200); for(int i=0; i<8; i++){ pinMode(switchPins[i], INPUT_PULLUP); } } void loop() { for(int i=0; i<8; i++){ int val = digitalRead(switchPins[i]); if(val != switchPreVal[i]) { switchPreVal[i] = val; switchStatus[i] = !switchStatus[i]; if(switchStatus[i] == true){ noteOn(9, btNote[i], 127); // channel, pitch, velocity MidiUSB.flush(); delay(10); } else { noteOff(9, btNote[i], 127); // channel, pitch, velocity MidiUSB.flush(); delay(10); } } } } ``` チャタリングにより意図しない連打が発生するので、delayで雑に回避しています。反応が気になる場合はこの値を調節してみてください。 ## ノートナンバーについて マイコンボードの各ピンにボタンを割り当てており、それぞれにノートナンバー(音階を番号で表したもの)を割り振ります。ノートーナンバーについては、最も一般的なGM音源の配列を使用しています。 ノートナンバーについては下記リンクの島村楽器のデジタル楽器情報サイト「DigiLand」の記事が参考になります。 https://info.shimamura.co.jp/digital/special/2018/03/122617 プログラム内のコメントを見ながら、使用するドラムパーツを使いやすいように割り振ってください。 余談ですが、音を鳴らす関数はnoteOn、音を止める関数がnoteOffです。ドラム音色では自動で音が止まりますが、その他の音色(ストリングスや管楽器など)では、止めるまで音がなり続けます。音源の設定を間違った際にこうした状況を防ぐために、ドラム用でもnoteOffはしっかり入れておいたほうがいいです。 # 動作テスト 上記プログラムを転送すると、そのままUSB-MIDIデバイスとして認識されます。ドライバーソフトウェアは不要です(Windows 10で確認)。 割り当てたノートナンバーで意図した音が出るかどうかを確認するには、Microsoft Storeで無料でダウンロードできる「MIDIberry」というアプリが便利です。 https://www.microsoft.com/ja-jp/p/midiberry/9n39720h2m05 ![](https://camo.elchika.com/562e0d4df63cc273fd53c820be3ebf46672c328c/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f34303631396238372d373831332d346334382d613433632d6439653963323937393766612f63626335316138372d343562302d343465302d616265382d313334653466333032663365/) 入力に「Arduino Leonardo」、出力に「Microsoft GS Wavetable Synth」を指定。 あとは、ジョイスティックのボタンを押せば、ドラムサウンドが鳴るはずです。 ここでは、Windows 10が標準で持っているソフトウェア・シンセサイザーを鳴らしています。 違う音が鳴るようでしたら、再度プログラムをチェックしてください。なお、その際はプログラムを転送する前にMIDIberryを閉じて、転送が終わったら再度起動したほうが面倒がないはず(MIDIberryはMIDIポートを自動で検出して、デバイスがなくなった場合は割当を解除するため)。 # もっといい音で演奏したい Windows内蔵のシンセの音はしょぼい! という人は、DAWと呼ばれる音楽制作ソフトなどを使用してみてください。今回作成したデバイスはMIDIデバイスとしてDAWで問題なく認識され、演奏が可能です。 DAWソフトは持ってないという方には、Cakewalk by Bandlabという無料のDAWがオススメ。このソフトウェアは以前は有料で販売されていたもので、機能も搭載音源のクオリティもなかなかです。 https://www.bandlab.com/products/cakewalk ちなみに、冒頭の動画ではCantabileというパフォーマンス用アプリ(曲作りの機能はなく、リアルタイム演奏に特化)で、Addictive Drums 2というドラム専用ソフトウェア音源(有料)を演奏しています。初期状態ではGM配列ではないのですが、設定で簡単に切替可能です。 # 中古ジョイスティックの落とし穴 ここまで順調に来たのですが、ちょっとした落とし穴が。プレイしているうちに、ジョイスティックのボタンの反応がにぶくなってしまいました。押しても反応しないことがたびたびあります。残念! こうなると、ボタンの交換を考えなくてはなりません。今回のジョイスティックでははんだを取り除く作業が必要になるので、ちょっと作業は面倒。とりあえず、反応のにぶいボタンの使用をあきらめ、使える7個だけで済ませられるよう割り当てました(冒頭の動画では、下段右から2つのめのBボタンを使ってないのがわかるはず)。 # Let's Play! 以上でフィンガードラム用MIDIデバイスの作成は終了です。 あとは練習するのみ!