mirror of
https://github.com/qmk/qmk_firmware
synced 2024-11-14 07:55:28 +00:00
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
This commit is contained in:
parent
bf5c2ccee5
commit
fde477a927
8 changed files with 103 additions and 17 deletions
|
@ -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);
|
||||||
|
|
|
@ -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
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue