MIDIキーボードをPS4版のFF14に接続するためのアダプタ。このプログラムはPS4側のmbed用で、この他にMIDI側のmbedが必要です。

Dependencies:   USBDevice mbed

Fork of USBKeyboard_HelloWorld by Samuel Mokrani

Committer:
Lybfip
Date:
Sat Aug 25 08:00:20 2018 +0000
Revision:
9:f676cfdd3577
Parent:
8:370e4348433f
??????????????????????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
samux 1:291a88a2c151 1 #include "mbed.h"
samux 1:291a88a2c151 2 #include "USBKeyboard.h"
Lybfip 7:d29d9dfda5b9 3
samux 1:291a88a2c151 4 //LED1: NUM_LOCK
samux 1:291a88a2c151 5 //LED2: CAPS_LOCK
samux 1:291a88a2c151 6 //LED3: SCROLL_LOCK
Lybfip 7:d29d9dfda5b9 7 Serial pc(USBTX, USBRX); // PC モニタ
Lybfip 7:d29d9dfda5b9 8 Serial uart(p9, p10); // UART
Lybfip 7:d29d9dfda5b9 9 //BusOut leds(LED1, LED2, LED3);
Lybfip 7:d29d9dfda5b9 10 USBKeyboard keyboard; // USBキーボード
Lybfip 7:d29d9dfda5b9 11 DigitalOut led4(LED4);
Lybfip 7:d29d9dfda5b9 12
Lybfip 7:d29d9dfda5b9 13 char buffer[256]; // 受信バッファ
Lybfip 7:d29d9dfda5b9 14 unsigned char indexW = 0; // 書込インデックス
Lybfip 7:d29d9dfda5b9 15 unsigned char indexR = 0; // 読出インデックス
Lybfip 7:d29d9dfda5b9 16
Lybfip 7:d29d9dfda5b9 17 ///
Lybfip 7:d29d9dfda5b9 18 /// UART受信割込み
Lybfip 7:d29d9dfda5b9 19 ///
Lybfip 7:d29d9dfda5b9 20 void uartRxIrq()
Lybfip 7:d29d9dfda5b9 21 {
Lybfip 7:d29d9dfda5b9 22 while (uart.readable()) {
Lybfip 7:d29d9dfda5b9 23 buffer[indexW] = uart.getc();
Lybfip 7:d29d9dfda5b9 24 indexW++;
Lybfip 7:d29d9dfda5b9 25 }
Lybfip 7:d29d9dfda5b9 26
Lybfip 7:d29d9dfda5b9 27 /*
Lybfip 7:d29d9dfda5b9 28 keyboard.mediaControl(KEY_VOLUME_DOWN);
Lybfip 7:d29d9dfda5b9 29 keyboard.printf("Hello World from Mbed\r\n");
Lybfip 7:d29d9dfda5b9 30 keyboard.keyCode('s', KEY_CTRL);
Lybfip 7:d29d9dfda5b9 31 keyboard.keyCode(KEY_CAPS_LOCK);
Lybfip 7:d29d9dfda5b9 32 //leds = keyboard.lockStatus();
Lybfip 7:d29d9dfda5b9 33 */
Lybfip 7:d29d9dfda5b9 34 }
Lybfip 7:d29d9dfda5b9 35
Lybfip 7:d29d9dfda5b9 36 // FF14楽器演奏キー
Lybfip 7:d29d9dfda5b9 37 char ffKey[] = {
Lybfip 7:d29d9dfda5b9 38 'a', '1', // ド 48
Lybfip 7:d29d9dfda5b9 39 'b', '2', // レ
Lybfip 7:d29d9dfda5b9 40 'c', // ミ
Lybfip 8:370e4348433f 41 'd', '3', // ファ
Lybfip 7:d29d9dfda5b9 42 'e', '4', // ソ
Lybfip 7:d29d9dfda5b9 43 'f', '5', // ラ
Lybfip 7:d29d9dfda5b9 44 'g', // シ 59
Lybfip 7:d29d9dfda5b9 45 'h', '6', // ド 60
Lybfip 7:d29d9dfda5b9 46 'i', '7', // レ
Lybfip 8:370e4348433f 47 'j', // ミ
Lybfip 7:d29d9dfda5b9 48 'k', '8', // ファ
Lybfip 7:d29d9dfda5b9 49 'l', '9', // ソ
Lybfip 7:d29d9dfda5b9 50 'm', '0', // ラ
Lybfip 7:d29d9dfda5b9 51 'n', // シ 71
Lybfip 7:d29d9dfda5b9 52 'o', 'w', // ド 72
Lybfip 8:370e4348433f 53 'p', 'x', // レ
Lybfip 8:370e4348433f 54 'q', // ミ
Lybfip 8:370e4348433f 55 'r', 'y', // ファ
Lybfip 8:370e4348433f 56 's', 'z', // ソ
Lybfip 7:d29d9dfda5b9 57 't', '.', // ラ
Lybfip 8:370e4348433f 58 'u', // シ
Lybfip 7:d29d9dfda5b9 59 'v', // ド 84
Lybfip 7:d29d9dfda5b9 60 ',', '/', ';', '[', ']'
Lybfip 7:d29d9dfda5b9 61 };
Lybfip 7:d29d9dfda5b9 62
Lybfip 7:d29d9dfda5b9 63 ///
Lybfip 7:d29d9dfda5b9 64 /// メイン
Lybfip 7:d29d9dfda5b9 65 ///
Lybfip 7:d29d9dfda5b9 66 int main(void)
Lybfip 7:d29d9dfda5b9 67 {
Lybfip 7:d29d9dfda5b9 68 led4 = 1;
Lybfip 7:d29d9dfda5b9 69 uart.baud(115200); // UARTボーレート
Lybfip 7:d29d9dfda5b9 70 pc.baud(115200); // PCモニタ通信ボーレート
Lybfip 7:d29d9dfda5b9 71 uart.attach(uartRxIrq, Serial::RxIrq); // 受信割り込みの設定
Lybfip 7:d29d9dfda5b9 72
Lybfip 7:d29d9dfda5b9 73 pc.printf("MIDI Keyboard Converter for FF14 and PS4\r\n");
Lybfip 7:d29d9dfda5b9 74
Lybfip 7:d29d9dfda5b9 75 // 無限ループ
samux 1:291a88a2c151 76 while (1) {
Lybfip 7:d29d9dfda5b9 77 // 先頭が'O'でないなら読み飛ばす。
Lybfip 7:d29d9dfda5b9 78 while ((indexR != indexW) && (buffer[indexR] != 'O' )) {
Lybfip 7:d29d9dfda5b9 79 pc.printf("skip &c", buffer[indexR]);
Lybfip 7:d29d9dfda5b9 80 indexR++;
Lybfip 7:d29d9dfda5b9 81 }
Lybfip 7:d29d9dfda5b9 82 // 先頭が'O'で4文字以上受信済みかチェック
Lybfip 7:d29d9dfda5b9 83 if (((unsigned char)(indexW - indexR) >= 4) && (buffer[indexR] == 'O')) {
Lybfip 8:370e4348433f 84 int key = (buffer[indexR + 2] - '0') * 10 + (buffer[indexR + 3] - '0');
Lybfip 7:d29d9dfda5b9 85 switch(buffer[indexR + 1]) {
Lybfip 7:d29d9dfda5b9 86 case 'N':
Lybfip 8:370e4348433f 87 if (key < 48 || key > 84) {
Lybfip 7:d29d9dfda5b9 88 pc.printf("reject %d", key);
Lybfip 8:370e4348433f 89 break; // 48未満と84超過は対象外
Lybfip 7:d29d9dfda5b9 90 }
Lybfip 8:370e4348433f 91 key -= 48;
Lybfip 8:370e4348433f 92 keyboard.keyDown(ffKey[key]);
Lybfip 8:370e4348433f 93 //keyboard.printf("%c", ffKey[key]);
Lybfip 7:d29d9dfda5b9 94 break;
Lybfip 7:d29d9dfda5b9 95 case 'F':
Lybfip 8:370e4348433f 96 if (key < 48 || key > 84) {
Lybfip 8:370e4348433f 97 pc.printf("reject %d", key);
Lybfip 8:370e4348433f 98 break; // 48未満と84超過は対象外
Lybfip 8:370e4348433f 99 }
Lybfip 8:370e4348433f 100 key -= 48;
Lybfip 8:370e4348433f 101 keyboard.keyUp(ffKey[key]);
Lybfip 7:d29d9dfda5b9 102 break;
Lybfip 7:d29d9dfda5b9 103 default:
Lybfip 7:d29d9dfda5b9 104 pc.printf("不正なコードの受信 %c", buffer[indexR + 1]);
Lybfip 7:d29d9dfda5b9 105 break;
Lybfip 7:d29d9dfda5b9 106 }
Lybfip 7:d29d9dfda5b9 107 indexR += 4;
Lybfip 7:d29d9dfda5b9 108 led4 = !led4;
Lybfip 7:d29d9dfda5b9 109 }
samux 1:291a88a2c151 110 }
samux 4:f0df6aae7147 111 }