MIDIキーボードをPS4版のFF14に接続するためのアダプタ。このプログラムはPS4側のmbed用で、この他にMIDI側のmbedが必要です。
Fork of USBKeyboard_HelloWorld by
main.cpp@9:f676cfdd3577, 2018-08-25 (annotated)
- Committer:
- Lybfip
- Date:
- Sat Aug 25 08:00:20 2018 +0000
- Revision:
- 9:f676cfdd3577
- Parent:
- 8:370e4348433f
??????????????????????
Who changed what in which revision?
User | Revision | Line number | New 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 | } |