目次
1.どうして作ろうと思ったか
2.ハードウェア
3.ソフトウェア
4.気づき
5.まとめ
1. どうして作ろうと思ったか
もともと太鼓の達人はiPad版が電子ドラムをサポートしており、ずっとそれで遊んでいた。
特に難易度を下げると幼児から遊べ、小学生などの音楽で必要になるリズム感を養うのに役立っていた。
もちろん初期は個別に全曲購入していたし、サブスクが始まってからも契約してできる限りゲーム開発や維持に貢献していたつもり。
しかし残念ながらMIDIのサポートは採算が合わなかったようで、2022年3月17日に連携サービスが終了している。
https://www.roland.com/jp/promos/taiko_v-drums/#:~:text=%E3%82%A2%E3%83%97%E3%83%AA%E3%81%A8%E3%81%AE%E9%80%A3%E5%8B%95%E7%B5%82%E4%BA%86,%E3%81%BE%E3%81%99%E3%82%88%E3%81%86%E3%80%81%E3%81%8A%E9%A1%98%E3%81%84%E7%94%B3%E3%81%97%E4%B8%8A%E3%81%92%E3%81%BE%E3%81%99%E3%80%82
もちろん、Sitich等の別ハードウェアで太鼓コントローラーを使えば良いと考えたが、公式を試したところ反応が良くない。
互換品もあるようだが、すごい値段だったりイマイチだったり玉石混淆。
レビューでわかりやすいのはこちら。
https://note.com/kirumi_shibu/n/nb71f1bb35829
結論としては以下。
- 電子ドラムを持っていたし、電子ドラムの打撃感が好きだったのでなんとか使いたい
- タタコン使うなら、実際に筐体で遊んだ方がいい
- 筐体で遊ぶときまでの練習で、電子ドラムを使えるようにしよう!
- MIDI入力を受けてキーを返せば遊べるんじゃない?
なお、カッは諸事情でタム1に割り当てている。
最初はスネアのエッジに割り当てていたのだが、子どもたちのリクエストでカッはタム1、ドンはスネアに落ち着いた。
2. ハードウェア
以下のハードを用いて、MIDI入力を受けて、USB接続でキーボードを出力する。
- Arduino Leonardo https://amzn.to/3B8eOsb
- MIDIシールド https://amzn.to/4g2cy4B
余談だが、最初はソフトウェアだけで実現しようと検討してみた。
しかし、太鼓の達人のPC版はソフトウェアキーシミュレーションを受け付けない仕様だった。
具体的には特定のIDを持ったUSBデバイスからしか受け付けない。
そのため、ハードウェアが必要なった。
3. ソフトウェア
3.1 ソフトウェア仕様
以下の様な感じになっている。
- MIDIから入力を受け取る
- キーボードマップに応じて、MIDI番号をキーボードに変換する
ただ、これだけだと動かないので後述のVID/PID偽装が必要。
#define HID_CUSTOM_LAYOUT
#define LAYOUT_JAPANESE
#include <HID-Project.h>
#include <MIDI.h>
MIDI_CREATE_DEFAULT_INSTANCE();
// ノートとキーのマッピング
struct KeyMap {
byte note;
KeyboardKeycode keyA;
KeyboardKeycode keyB;
bool useA; // 次に使うキー
};
KeyMap noteKeyMap[] = {
{48, KEY_D, KEY_J, true},
{38, KEY_F, KEY_K, true},
{46, KEY_ENTER, KEY_ENTER, true},
{45, KEY_UP_ARROW, KEY_UP_ARROW, true},
{43, KEY_DOWN_ARROW, KEY_DOWN_ARROW, true},
{49, KEY_LEFT_ARROW, KEY_LEFT_ARROW, true},
{57, KEY_RIGHT_ARROW, KEY_RIGHT_ARROW, true},
{51, KEY_ESC, KEY_ESC, true},
{36, KEY_BACKSPACE, KEY_BACKSPACE, true}
};
const uint8_t PRESS_DURATION = 30; // 押下後リリースまでの時間(ms)
const uint8_t CHATTER_BLOCK = 15; // チャタリング防止時間(ms)
// 各ノートに対する状態管理
struct KeyPressState {
KeyboardKeycode currentKey;
bool isPressed;
unsigned long pressedAt;
unsigned long lastNoteOn;
};
KeyPressState keyStates[sizeof(noteKeyMap) / sizeof(noteKeyMap[0])];
void setup() {
MIDI.begin(MIDI_CHANNEL_OMNI);
MIDI.turnThruOff();
Keyboard.begin();
}
void loop() {
unsigned long now = millis();
// MIDI読み取り処理
if (MIDI.read() && MIDI.getType() == midi::NoteOn && MIDI.getData2() > 0) {
byte note = MIDI.getData1();
for (int i = 0; i < sizeof(noteKeyMap) / sizeof(noteKeyMap[0]); i++) {
if (noteKeyMap[i].note == note) {
if (!keyStates[i].isPressed && (now - keyStates[i].lastNoteOn > CHATTER_BLOCK)) {
KeyboardKeycode keyToPress = noteKeyMap[i].useA ? noteKeyMap[i].keyA : noteKeyMap[i].keyB;
Keyboard.press(keyToPress);
keyStates[i].currentKey = keyToPress;
keyStates[i].isPressed = true;
keyStates[i].pressedAt = now;
keyStates[i].lastNoteOn = now;
noteKeyMap[i].useA = !noteKeyMap[i].useA;
}
break;
}
}
}
// リリース処理
for (int i = 0; i < sizeof(noteKeyMap) / sizeof(noteKeyMap[0]); i++) {
if (keyStates[i].isPressed && (now - keyStates[i].pressedAt >= PRESS_DURATION)) {
Keyboard.release(keyStates[i].currentKey);
keyStates[i].isPressed = false;
}
}
}
3.2 VID/PID偽装
以下、ChatGPTの説明コピペ。
✅ おすすめの次の一手
使用中のボードパッケージにある boards.txt に以下を追加:
leonardo.build.vid=0x046D
leonardo.build.pid=0xC31C
Arduino IDE のメニューで 「ボードマネージャ」→「Arduino AVR Boards」 を開き、インストールパスを確認
例: C:\Users{ユーザー名}\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\boards.txt
変更後に Arduino IDE を再起動する。
✅ 補足:ターゲットゲームに効く実績のあるVID/PIDの例
メーカー VID PID 備考
Logitech 0x046D 0xC31C 一般的なキーボード
Microsoft 0x045E 0x07F8 Natural Keyboard
Dell 0x413C 0x2107 Dell USB Keyboard
Apple 0x05AC 0x0220 Apple Keyboard
4. 気づき
- MIDIはMIDI OnとOffがある。MIDI Onだけを受信するようにしないと、OFFでもキー出力がされてしまう。
- 太鼓の達人PC版では、キー長さが1フレーム以上入力状態を維持する必要という制約があるみたい。30fpsだと16.7ms。ギリギリだと入力を取りこぼすことがあったので、30msで設定。
- 電子ドラム側でも対策(除去)出来るが、チャタリングでMIDI出力が非常に未時間時間で連発する。今の電子ドラムなら高精度に除去できるかもしれないが、自分の電子ドラムは古くトリルの取りこぼしがあったためソフトウェアでチャタリングをフィルタリングしている。今の設定は15ms
- USBのPIDとVIDの設定しないと太鼓の達人が受け入れてくれないというのが分かるまではまった。
- 実は最初のバージョンだと早い連打がうまく入らなかった。入力状態を維持する必要があり、入力状態を維持している間に受け付けたMIDI信号は破棄していた。そこで、2つのキーを交互に入力することで高速連打しても取りこぼすことなく入力できるようになった。
5. まとめ
反応もめっちゃいいし、子どもたちも喜んでいるし、安価に作れて勉強にもなった!最高!