]> git.donarmstrong.com Git - qmk_firmware.git/blobdiff - quantum/quantum.c
updates midi functionality (#331)
[qmk_firmware.git] / quantum / quantum.c
index dd5d84f826a37562205710ec2105b6f9156e84ae..5a978d33209f724bd0164eb95a8587e67812fd37 100644 (file)
@@ -19,11 +19,15 @@ void leader_end(void) {}
 
 #ifdef AUDIO_ENABLE
   uint8_t starting_note = 0x0C;
-  int offset = 0;
+  int offset = 7;
   bool music_activated = false;
   float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
 #endif
 
+#ifdef MIDI_ENABLE
+  bool midi_activated = false;
+#endif
+
 // Leader key stuff
 bool leading = false;
 uint16_t leader_time = 0;
@@ -98,6 +102,82 @@ bool process_record_quantum(keyrecord_t *record) {
     //   return false;
     // }
 
+  #ifdef MIDI_ENABLE
+    if (keycode == MI_ON && record->event.pressed) {
+      midi_activated = true;
+      PLAY_NOTE_ARRAY(music_scale, false, 0);
+      return false;
+    }
+
+    if (keycode == MI_OFF && record->event.pressed) {
+      midi_activated = false;
+      midi_send_cc(&midi_device, 0, 0x7B, 0);
+      return false;
+    }
+
+    if (midi_activated) {
+      if (record->event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) {
+          if (record->event.pressed) {
+              starting_note++; // Change key
+              midi_send_cc(&midi_device, 0, 0x7B, 0);
+              // midi_send_cc(&midi_device, 1, 0x7B, 0);
+              // midi_send_cc(&midi_device, 2, 0x7B, 0);
+              // midi_send_cc(&midi_device, 3, 0x7B, 0);
+              // midi_send_cc(&midi_device, 4, 0x7B, 0);
+          }
+          return false;
+      }
+      if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) {
+          if (record->event.pressed) {
+              starting_note--; // Change key
+              midi_send_cc(&midi_device, 0, 0x7B, 0);
+              // midi_send_cc(&midi_device, 1, 0x7B, 0);
+              // midi_send_cc(&midi_device, 2, 0x7B, 0);
+              // midi_send_cc(&midi_device, 3, 0x7B, 0);
+              // midi_send_cc(&midi_device, 4, 0x7B, 0);
+          }
+          return false;
+      }
+      if (record->event.key.col == (MATRIX_COLS - 3) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) {
+          offset++; // Change scale
+          midi_send_cc(&midi_device, 0, 0x7B, 0);
+          // midi_send_cc(&midi_device, 1, 0x7B, 0);
+          // midi_send_cc(&midi_device, 2, 0x7B, 0);
+          // midi_send_cc(&midi_device, 3, 0x7B, 0);
+          // midi_send_cc(&midi_device, 4, 0x7B, 0);
+          return false;
+      }
+      if (record->event.key.col == (MATRIX_COLS - 4) && record->event.key.row == (MATRIX_ROWS - 1) && record->event.pressed) {
+          offset--; // Change scale
+          midi_send_cc(&midi_device, 0, 0x7B, 0);
+          // midi_send_cc(&midi_device, 1, 0x7B, 0);
+          // midi_send_cc(&midi_device, 2, 0x7B, 0);
+          // midi_send_cc(&midi_device, 3, 0x7B, 0);
+          // midi_send_cc(&midi_device, 4, 0x7B, 0);
+          return false;
+      }
+      // basic
+      // uint8_t note = (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row);
+      // advanced
+      // uint8_t note = (starting_note + record->event.key.col + offset)+12*(MATRIX_ROWS - record->event.key.row);
+      // guitar
+      uint8_t note = (starting_note + record->event.key.col + offset)+5*(MATRIX_ROWS - record->event.key.row);
+      // violin
+      // uint8_t note = (starting_note + record->event.key.col + offset)+7*(MATRIX_ROWS - record->event.key.row);
+
+      if (record->event.pressed) {
+        // midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
+        midi_send_noteon(&midi_device, 0, note, 127);
+      } else {
+        // midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
+        midi_send_noteoff(&midi_device, 0, note, 127);
+      }
+
+      if (keycode < 0xFF) // ignores all normal keycodes, but lets RAISE, LOWER, etc through
+        return false;
+    }
+  #endif
+
   #ifdef AUDIO_ENABLE
     if (keycode == AU_ON && record->event.pressed) {
       audio_on();
@@ -169,7 +249,7 @@ bool process_record_quantum(keyrecord_t *record) {
         return false;
       }
 
-      float freq = ((float)220.0)*pow(2.0, -4.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row));
+      float freq = ((float)220.0)*pow(2.0, -5.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row));
       if (record->event.pressed) {
         play_note(freq, 0xF);
         if (music_sequence_recording) {
@@ -185,8 +265,6 @@ bool process_record_quantum(keyrecord_t *record) {
     }
   #endif
 
-
-
 #ifndef DISABLE_LEADER
   // Leader key set-up
   if (record->event.pressed) {
@@ -267,6 +345,6 @@ void matrix_scan_quantum() {
   }
 
   #endif
-  
+
   matrix_scan_kb();
 }
\ No newline at end of file