summaryrefslogtreecommitdiffstats
path: root/quantum/quantum.c
diff options
context:
space:
mode:
authorJack Humbert <jack.humb@gmail.com>2016-05-15 06:51:06 +0200
committerJack Humbert <jack.humb@gmail.com>2016-05-15 06:51:06 +0200
commitfde477a927edc6b4207a6968d44aeed021e8b300 (patch)
tree89a52f005d7d119af31b03261607792aa1f459ff /quantum/quantum.c
parentbf5c2ccee5497523c214dae7aacdc27fdbb0f235 (diff)
downloadqmk_firmware-fde477a927edc6b4207a6968d44aeed021e8b300.tar.gz
qmk_firmware-fde477a927edc6b4207a6968d44aeed021e8b300.tar.xz
updates midi functionality (#331)
* implements leader key for planck experimental * allows override of leader timeout * adds ability to use the leader key in seq * fixes leader keycode * adds chording prototype * fixes keycode detection * moves music mode to quantum.c * disables chording by default * adds music sequencer functionality * implements audio/music functions in quantum.c * splits up process_action to allow independent processing of actions * moves midi stuff to quantum.c * adds additional scales for midi
Diffstat (limited to 'quantum/quantum.c')
-rw-r--r--quantum/quantum.c88
1 files changed, 83 insertions, 5 deletions
diff --git a/quantum/quantum.c b/quantum/quantum.c
index dd5d84f82..5a978d332 100644
--- a/quantum/quantum.c
+++ b/quantum/quantum.c
@@ -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