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.

81 lines
2.3KB

  1. #include "UI.hpp"
  2. namespace rack_plugin_AmalgamatedHarmonics {
  3. void UI::calculateKeyboard(int inKey, float spacing, float xOff, float yOff, float *x, float *y, int *scale) {
  4. // Sanitise input
  5. int key = inKey % 12;
  6. // White
  7. int whiteO [7] = {0, 1, 2, 3, 4, 5, 6}; // 'spaces' occupied by keys
  8. int whiteK [7] = {0, 2, 4, 5, 7, 9, 11}; // scale mapped to key
  9. // Black
  10. int blackO [5] = {0, 1, 3, 4, 5}; // 'spaces' occupied by keys
  11. int blackK [5] = {1, 3, 6, 8, 10}; // scale mapped to keys
  12. float bOffset = xOff + (spacing / 2);
  13. float bSpace = spacing;
  14. // Make an equilateral triangle pattern, tri height = base * (sqrt(3) / 2)
  15. float bDelta = bSpace * sqrt(3) * 0.5;
  16. // Are we black or white key?, check black keys
  17. for (int i = 0; i < 5; i++) {
  18. if (blackK[i] == key) {
  19. *x = bOffset + bSpace * blackO[i];
  20. *y = yOff - bDelta;
  21. *scale = blackK[i];
  22. return;
  23. }
  24. }
  25. int wOffset = xOff;
  26. int wSpace = spacing;
  27. for (int i = 0; i < 7; i++) {
  28. if (whiteK[i] == key) {
  29. *x = wOffset + wSpace * whiteO[i];
  30. *y = yOff;
  31. *scale = whiteK[i];
  32. return;
  33. }
  34. }
  35. }
  36. Vec UI::getPosition(int type, int xSlot, int ySlot, bool xDense, bool yDense) {
  37. float *xArray;
  38. float *yArray;
  39. switch(type) {
  40. case KNOB:
  41. if (xDense) { xArray = X_KNOB_COMPACT; } else { xArray = X_KNOB; }
  42. if (yDense) { yArray = Y_KNOB_COMPACT; } else { yArray = Y_KNOB; }
  43. break;
  44. case PORT:
  45. if (xDense) { xArray = X_PORT_COMPACT; } else { xArray = X_PORT; }
  46. if (yDense) { yArray = Y_PORT_COMPACT; } else { yArray = Y_PORT; }
  47. break;
  48. case BUTTON:
  49. if (xDense) { xArray = X_BUTTON_COMPACT; } else { xArray = X_BUTTON; }
  50. if (yDense) { yArray = Y_BUTTON_COMPACT; } else { yArray = Y_BUTTON; }
  51. break;
  52. case LIGHT:
  53. if (xDense) { xArray = X_LIGHT_COMPACT; } else { xArray = X_LIGHT; }
  54. if (yDense) { yArray = Y_LIGHT_COMPACT; } else { yArray = Y_LIGHT; }
  55. break;
  56. case TRIMPOT:
  57. if (xDense) { xArray = X_TRIMPOT_COMPACT; } else { xArray = X_TRIMPOT; }
  58. if (yDense) { yArray = Y_TRIMPOT_COMPACT; } else { yArray = Y_TRIMPOT; }
  59. break;
  60. default:
  61. if (xDense) { xArray = X_KNOB_COMPACT; } else { xArray = X_KNOB; }
  62. if (yDense) { yArray = Y_KNOB_COMPACT; } else { yArray = Y_KNOB; }
  63. }
  64. return Vec(xArray[0] + xArray[1] * xSlot, yArray[0] + yArray[1] * ySlot);
  65. }
  66. } // namespace rack_plugin_AmalgamatedHarmonics