You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
2.6KB

  1. #include "keyboard.hpp"
  2. #include <GLFW/glfw3.h>
  3. namespace rack {
  4. void KeyboardInputDevice::processKey(int key, bool released) {
  5. int note = -1;
  6. switch (key) {
  7. case GLFW_KEY_Z: note = 0; break;
  8. case GLFW_KEY_S: note = 1; break;
  9. case GLFW_KEY_X: note = 2; break;
  10. case GLFW_KEY_D: note = 3; break;
  11. case GLFW_KEY_C: note = 4; break;
  12. case GLFW_KEY_V: note = 5; break;
  13. case GLFW_KEY_G: note = 6; break;
  14. case GLFW_KEY_B: note = 7; break;
  15. case GLFW_KEY_H: note = 8; break;
  16. case GLFW_KEY_N: note = 9; break;
  17. case GLFW_KEY_J: note = 10; break;
  18. case GLFW_KEY_M: note = 11; break;
  19. case GLFW_KEY_COMMA: note = 12; break;
  20. case GLFW_KEY_L: note = 13; break;
  21. case GLFW_KEY_PERIOD: note = 14; break;
  22. case GLFW_KEY_SEMICOLON: note = 15; break;
  23. case GLFW_KEY_SLASH: note = 16; break;
  24. case GLFW_KEY_Q: note = 12; break;
  25. case GLFW_KEY_2: note = 13; break;
  26. case GLFW_KEY_W: note = 14; break;
  27. case GLFW_KEY_3: note = 15; break;
  28. case GLFW_KEY_E: note = 16; break;
  29. case GLFW_KEY_R: note = 17; break;
  30. case GLFW_KEY_5: note = 18; break;
  31. case GLFW_KEY_T: note = 19; break;
  32. case GLFW_KEY_6: note = 20; break;
  33. case GLFW_KEY_Y: note = 21; break;
  34. case GLFW_KEY_7: note = 22; break;
  35. case GLFW_KEY_U: note = 23; break;
  36. case GLFW_KEY_I: note = 24; break;
  37. case GLFW_KEY_9: note = 25; break;
  38. case GLFW_KEY_O: note = 26; break;
  39. case GLFW_KEY_0: note = 27; break;
  40. case GLFW_KEY_P: note = 28; break;
  41. case GLFW_KEY_LEFT_BRACKET: note = 29; break;
  42. case GLFW_KEY_EQUAL: note = 30; break;
  43. case GLFW_KEY_RIGHT_BRACKET: note = 31; break;
  44. case GLFW_KEY_GRAVE_ACCENT: {
  45. if (!released)
  46. octave--;
  47. } break;
  48. case GLFW_KEY_1: {
  49. if (!released)
  50. octave++;
  51. } break;
  52. default: break;
  53. }
  54. octave = clamp(octave, 0, 9);
  55. if (note < 0)
  56. return;
  57. note += 12 * octave;
  58. if (note > 127)
  59. return;
  60. MidiMessage msg;
  61. msg.cmd = ((!released ? 0x9 : 0x8) << 4);
  62. msg.data1 = note;
  63. msg.data2 = 127;
  64. onMessage(msg);
  65. }
  66. std::vector<int> KeyboardInputDriver::getDeviceIds() {
  67. return {0};
  68. }
  69. std::string KeyboardInputDriver::getDeviceName(int deviceId) {
  70. if (deviceId == 0)
  71. return "QWERTY keyboard (US)";
  72. return "";
  73. }
  74. MidiInputDevice *KeyboardInputDriver::getDevice(int deviceId) {
  75. return &device;
  76. }
  77. static KeyboardInputDriver *driver = NULL;
  78. void keyboardPress(int key) {
  79. if (!driver)
  80. return;
  81. driver->device.processKey(key, false);
  82. }
  83. void keyboardRelease(int key) {
  84. if (!driver)
  85. return;
  86. driver->device.processKey(key, true);
  87. }
  88. KeyboardInputDriver *keyboardGetInputDriver() {
  89. // Lazily create driver
  90. if (!driver) {
  91. driver = new KeyboardInputDriver();
  92. }
  93. return driver;
  94. }
  95. } // namespace rack