process_music.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #include "process_music.h"
  2. #ifdef AUDIO_ENABLE
  3. #include "process_audio.h"
  4. #endif
  5. #if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
  6. #include "process_midi.h"
  7. #endif
  8. #if defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))
  9. bool music_activated = false;
  10. uint8_t music_starting_note = 0x0C;
  11. int music_offset = 7;
  12. // music sequencer
  13. static bool music_sequence_recording = false;
  14. static bool music_sequence_recorded = false;
  15. static bool music_sequence_playing = false;
  16. static uint8_t music_sequence[16] = {0};
  17. static uint8_t music_sequence_count = 0;
  18. static uint8_t music_sequence_position = 0;
  19. static uint16_t music_sequence_timer = 0;
  20. static uint16_t music_sequence_interval = 100;
  21. static void music_noteon(uint8_t note) {
  22. #ifdef AUDIO_ENABLE
  23. process_audio_noteon(note);
  24. #endif
  25. #if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
  26. process_midi_basic_noteon(note);
  27. #endif
  28. }
  29. static void music_noteoff(uint8_t note) {
  30. #ifdef AUDIO_ENABLE
  31. process_audio_noteoff(note);
  32. #endif
  33. #if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
  34. process_midi_basic_noteoff(note);
  35. #endif
  36. }
  37. void music_all_notes_off(void) {
  38. #ifdef AUDIO_ENABLE
  39. process_audio_all_notes_off();
  40. #endif
  41. #if defined(MIDI_ENABLE) && defined(MIDI_BASIC)
  42. process_midi_all_notes_off();
  43. #endif
  44. }
  45. bool process_music(uint16_t keycode, keyrecord_t *record) {
  46. if (keycode == MU_ON && record->event.pressed) {
  47. music_on();
  48. return false;
  49. }
  50. if (keycode == MU_OFF && record->event.pressed) {
  51. music_off();
  52. return false;
  53. }
  54. if (keycode == MU_TOG && record->event.pressed) {
  55. if (music_activated)
  56. {
  57. music_off();
  58. }
  59. else
  60. {
  61. music_on();
  62. }
  63. return false;
  64. }
  65. if (music_activated) {
  66. if (keycode == KC_LCTL && record->event.pressed) { // Start recording
  67. music_all_notes_off();
  68. music_sequence_recording = true;
  69. music_sequence_recorded = false;
  70. music_sequence_playing = false;
  71. music_sequence_count = 0;
  72. return false;
  73. }
  74. if (keycode == KC_LALT && record->event.pressed) { // Stop recording/playing
  75. music_all_notes_off();
  76. if (music_sequence_recording) { // was recording
  77. music_sequence_recorded = true;
  78. }
  79. music_sequence_recording = false;
  80. music_sequence_playing = false;
  81. return false;
  82. }
  83. if (keycode == KC_LGUI && record->event.pressed && music_sequence_recorded) { // Start playing
  84. music_all_notes_off();
  85. music_sequence_recording = false;
  86. music_sequence_playing = true;
  87. music_sequence_position = 0;
  88. music_sequence_timer = 0;
  89. return false;
  90. }
  91. if (keycode == KC_UP) {
  92. if (record->event.pressed)
  93. music_sequence_interval-=10;
  94. return false;
  95. }
  96. if (keycode == KC_DOWN) {
  97. if (record->event.pressed)
  98. music_sequence_interval+=10;
  99. return false;
  100. }
  101. #define MUSIC_MODE_GUITAR
  102. #ifdef MUSIC_MODE_CHROMATIC
  103. uint8_t note = (music_starting_note + record->event.key.col + music_offset - 3)+12*(MATRIX_ROWS - record->event.key.row);
  104. #elif defined(MUSIC_MODE_GUITAR)
  105. uint8_t note = (music_starting_note + record->event.key.col + music_offset + 32)+5*(MATRIX_ROWS - record->event.key.row);
  106. #elif defined(MUSIC_MODE_VIOLIN)
  107. uint8_t note = (music_starting_note + record->event.key.col + music_offset + 32)+7*(MATRIX_ROWS - record->event.key.row);
  108. #else
  109. uint8_t note = (music_starting_note + SCALE[record->event.key.col + music_offset] - 3)+12*(MATRIX_ROWS - record->event.key.row);
  110. #endif
  111. if (record->event.pressed) {
  112. music_noteon(note);
  113. if (music_sequence_recording) {
  114. music_sequence[music_sequence_count] = note;
  115. music_sequence_count++;
  116. }
  117. } else {
  118. music_noteoff(note);
  119. }
  120. if (keycode < 0xFF) // ignores all normal keycodes, but lets RAISE, LOWER, etc through
  121. return false;
  122. }
  123. return true;
  124. }
  125. bool is_music_on(void) {
  126. return (music_activated != 0);
  127. }
  128. void music_toggle(void) {
  129. if (!music_activated) {
  130. music_on();
  131. } else {
  132. music_off();
  133. }
  134. }
  135. void music_on(void) {
  136. music_activated = 1;
  137. music_on_user();
  138. }
  139. void music_off(void) {
  140. music_activated = 0;
  141. music_all_notes_off();
  142. }
  143. void matrix_scan_music(void) {
  144. if (music_sequence_playing) {
  145. if ((music_sequence_timer == 0) || (timer_elapsed(music_sequence_timer) > music_sequence_interval)) {
  146. music_sequence_timer = timer_read();
  147. uint8_t prev_note = music_sequence[(music_sequence_position - 1 < 0)?(music_sequence_position - 1 + music_sequence_count):(music_sequence_position - 1)];
  148. uint8_t next_note = music_sequence[music_sequence_position];
  149. music_noteoff(prev_note);
  150. music_noteon(next_note);
  151. music_sequence_position = (music_sequence_position + 1) % music_sequence_count;
  152. }
  153. }
  154. }
  155. __attribute__ ((weak))
  156. void music_on_user() {}
  157. __attribute__ ((weak))
  158. void music_scale_user() {}
  159. #endif // defined(AUDIO_ENABLE) || (defined(MIDI_ENABLE) && defined(MIDI_BASIC))