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
master
Jack Humbert 2016-05-15 00:51:06 -04:00
parent bf5c2ccee5
commit fde477a927
8 changed files with 103 additions and 17 deletions

View File

@ -162,7 +162,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[_ADJUST] = { [_ADJUST] = {
{_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL}, {_______, RESET, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL},
{_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______}, {_______, _______, _______, AU_ON, AU_OFF, AG_NORM, AG_SWAP, QWERTY, COLEMAK, DVORAK, PLOVER, _______},
{_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, _______, _______, _______, _______, _______, _______, _______}, {_______, MUV_DE, MUV_IN, MU_ON, MU_OFF, MI_ON, MI_OFF, _______, _______, _______, _______, _______},
{_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______} {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
} }
@ -227,8 +227,10 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
case _LOWER: case _LOWER:
if (record->event.pressed) { if (record->event.pressed) {
layer_on(_LOWER); layer_on(_LOWER);
#ifdef BACKLIGHT_ENABLE
breathing_speed_set(2); breathing_speed_set(2);
breathing_pulse(); breathing_pulse();
#endif
update_tri_layer(_LOWER, _RAISE, _ADJUST); update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else { } else {
layer_off(_LOWER); layer_off(_LOWER);
@ -238,8 +240,10 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
case _RAISE: case _RAISE:
if (record->event.pressed) { if (record->event.pressed) {
layer_on(_RAISE); layer_on(_RAISE);
#ifdef BACKLIGHT_ENABLE
breathing_speed_set(2); breathing_speed_set(2);
breathing_pulse(); breathing_pulse();
#endif
update_tri_layer(_LOWER, _RAISE, _ADJUST); update_tri_layer(_LOWER, _RAISE, _ADJUST);
} else { } else {
layer_off(_RAISE); layer_off(_RAISE);

View File

@ -1,2 +1,5 @@
AUDIO_ENABLE = yes AUDIO_ENABLE = yes
NKRO_ENABLE = yes NKRO_ENABLE = yes
MIDI_ENABLE = yes
BACKLIGHT_ENABLE = no
COMMAND_ENABLE = no

View File

@ -282,11 +282,6 @@ static action_t keycode_to_action(uint16_t keycode)
action.code = ACTION_MODS_ONESHOT(mod); action.code = ACTION_MODS_ONESHOT(mod);
} }
break; break;
#ifdef MIDI_ENABLE
case 0x6000 ... 0x6FFF:
action.code = ACTION_FUNCTION_OPT(keycode & 0xFF, (keycode & 0x0F00) >> 8);
break;
#endif
case 0x7000 ... 0x7FFF: case 0x7000 ... 0x7FFF:
action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF); action.code = ACTION_MODS_TAP_KEY((keycode >> 0x8) & 0xF, keycode & 0xFF);
break; break;

View File

@ -195,6 +195,7 @@ extern const uint16_t fn_actions[];
// MAGIC keycodes // MAGIC keycodes
#define MAGIC_SWAP_CONTROL_CAPSLOCK 0x5002 #define MAGIC_SWAP_CONTROL_CAPSLOCK 0x5002
#define MAGIC_UNSWAP_CONTROL_CAPSLOCK 0x5003 #define MAGIC_UNSWAP_CONTROL_CAPSLOCK 0x5003
@ -232,6 +233,10 @@ extern const uint16_t fn_actions[];
#define MUV_IN 0x5024 #define MUV_IN 0x5024
#define MUV_DE 0x5025 #define MUV_DE 0x5025
// Midi mode on/off
#define MI_ON 0x5026
#define MI_OFF 0x5027
// GOTO layer - 16 layers max // GOTO layer - 16 layers max
// when: // when:
// ON_PRESS = 1 // ON_PRESS = 1

View File

@ -19,11 +19,15 @@ void leader_end(void) {}
#ifdef AUDIO_ENABLE #ifdef AUDIO_ENABLE
uint8_t starting_note = 0x0C; uint8_t starting_note = 0x0C;
int offset = 0; int offset = 7;
bool music_activated = false; bool music_activated = false;
float music_scale[][2] = SONG(MUSIC_SCALE_SOUND); float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
#endif #endif
#ifdef MIDI_ENABLE
bool midi_activated = false;
#endif
// Leader key stuff // Leader key stuff
bool leading = false; bool leading = false;
uint16_t leader_time = 0; uint16_t leader_time = 0;
@ -98,6 +102,82 @@ bool process_record_quantum(keyrecord_t *record) {
// return false; // 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 #ifdef AUDIO_ENABLE
if (keycode == AU_ON && record->event.pressed) { if (keycode == AU_ON && record->event.pressed) {
audio_on(); audio_on();
@ -169,7 +249,7 @@ bool process_record_quantum(keyrecord_t *record) {
return false; 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) { if (record->event.pressed) {
play_note(freq, 0xF); play_note(freq, 0xF);
if (music_sequence_recording) { if (music_sequence_recording) {
@ -185,8 +265,6 @@ bool process_record_quantum(keyrecord_t *record) {
} }
#endif #endif
#ifndef DISABLE_LEADER #ifndef DISABLE_LEADER
// Leader key set-up // Leader key set-up
if (record->event.pressed) { if (record->event.pressed) {
@ -267,6 +345,6 @@ void matrix_scan_quantum() {
} }
#endif #endif
matrix_scan_kb(); matrix_scan_kb();
} }

View File

@ -13,7 +13,8 @@
#include "audio.h" #include "audio.h"
#endif #endif
#ifdef MIDI_ENABLE #ifdef MIDI_ENABLE
#include <keymap_midi.h> // #include <keymap_midi.h>
#include <lufa.h>
#endif #endif
#include "action_layer.h" #include "action_layer.h"
#include "eeconfig.h" #include "eeconfig.h"

View File

@ -24,9 +24,9 @@ ifndef CUSTOM_MATRIX
SRC += $(QUANTUM_DIR)/matrix.c SRC += $(QUANTUM_DIR)/matrix.c
endif endif
ifeq ($(strip $(MIDI_ENABLE)), yes) #ifeq ($(strip $(MIDI_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/keymap_midi.c # SRC += $(QUANTUM_DIR)/keymap_midi.c
endif #endif
ifeq ($(strip $(AUDIO_ENABLE)), yes) ifeq ($(strip $(AUDIO_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/audio/audio.c SRC += $(QUANTUM_DIR)/audio/audio.c

View File

@ -883,7 +883,7 @@ int main(void)
midi_register_cc_callback(&midi_device, cc_callback); midi_register_cc_callback(&midi_device, cc_callback);
midi_register_sysex_callback(&midi_device, sysex_callback); midi_register_sysex_callback(&midi_device, sysex_callback);
init_notes(); // init_notes();
// midi_send_cc(&midi_device, 0, 1, 2); // midi_send_cc(&midi_device, 0, 1, 2);
// midi_send_cc(&midi_device, 15, 1, 0); // midi_send_cc(&midi_device, 15, 1, 0);
// midi_send_noteon(&midi_device, 0, 64, 127); // midi_send_noteon(&midi_device, 0, 64, 127);