qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

keymap.c (9351B)


      1 /* Copyright 2020 3araht
      2  *
      3  * This program is free software: you can redistribute it and/or modify
      4  * it under the terms of the GNU General Public License as published by
      5  * the Free Software Foundation, either version 2 of the License, or
      6  * (at your option) any later version.
      7  *
      8  * This program is distributed in the hope that it will be useful,
      9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11  * GNU General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU General Public License
     14  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
     15  */
     16 #include QMK_KEYBOARD_H
     17 #include "version.h"
     18 
     19 // Alias layout macros that expand groups of keys.
     20 #define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
     21 
     22 #define DFCBASE DF(_C_SYSTEM_BASE)
     23 #define DF_QWER DF(_QWERTY)
     24 // Long press: go to _FN layer, tap: MUTE
     25 #define FN_MUTE LT(_FN, KC_MUTE)
     26 
     27 // Used to set octave to 0
     28 extern midi_config_t midi_config;
     29 uint8_t midi_bass_ch = 0, midi_chord_ch = 0;  // By default, all use the same channel.
     30 
     31 // Defines names for use in layer keycodes and the keymap
     32 enum layer_names {
     33     _C_SYSTEM_BASE,  //  MIDI C-system
     34     _QWERTY,         //  just in case
     35     _FN
     36 };
     37 
     38 // Defines the keycodes used by our macros in process_record_user
     39 enum custom_keycodes {
     40 
     41     // MIDI Chord Keycodes - Root notes
     42     MY_CHORD_MIN = SAFE_RANGE,
     43 
     44     MI_CH_Cr = MY_CHORD_MIN,
     45     MI_CH_Csr,
     46     MI_CH_Dbr = MI_CH_Csr,
     47     MI_CH_Dr,
     48     MI_CH_Dsr,
     49     MI_CH_Ebr = MI_CH_Dsr,
     50     MI_CH_Er,
     51     MI_CH_Fr,
     52     MI_CH_Fsr,
     53     MI_CH_Gbr = MI_CH_Fsr,
     54     MI_CH_Gr,
     55     MI_CH_Gsr,
     56     MI_CH_Abr = MI_CH_Gsr,
     57     MI_CH_Ar,
     58     MI_CH_Asr,
     59     MI_CH_Bbr = MI_CH_Asr,
     60     MI_CH_Br,
     61 
     62     // MIDI Chord Keycodes - Major
     63 
     64     MI_CH_C,
     65     MI_CH_Cs,
     66     MI_CH_Db = MI_CH_Cs,
     67     MI_CH_D,
     68     MI_CH_Ds,
     69     MI_CH_Eb = MI_CH_Ds,
     70     MI_CH_E,
     71     MI_CH_F,
     72     MI_CH_Fs,
     73     MI_CH_Gb = MI_CH_Fs,
     74     MI_CH_G,
     75     MI_CH_Gs,
     76     MI_CH_Ab = MI_CH_Gs,
     77     MI_CH_A,
     78     MI_CH_As,
     79     MI_CH_Bb = MI_CH_As,
     80     MI_CH_B,
     81 
     82     // MIDI Chord Keycodes Minor
     83 
     84     MI_CH_Cm,
     85     MI_CH_Csm,
     86     MI_CH_Dbm = MI_CH_Csm,
     87     MI_CH_Dm,
     88     MI_CH_Dsm,
     89     MI_CH_Ebm = MI_CH_Dsm,
     90     MI_CH_Em,
     91     MI_CH_Fm,
     92     MI_CH_Fsm,
     93     MI_CH_Gbm = MI_CH_Fsm,
     94     MI_CH_Gm,
     95     MI_CH_Gsm,
     96     MI_CH_Abm = MI_CH_Gsm,
     97     MI_CH_Am,
     98     MI_CH_Asm,
     99     MI_CH_Bbm = MI_CH_Asm,
    100     MI_CH_Bm,
    101 
    102     //MIDI Chord Keycodes Dominant Seventh
    103 
    104     MI_CH_CDom7,
    105     MI_CH_CsDom7,
    106     MI_CH_DbDom7 = MI_CH_CsDom7,
    107     MI_CH_DDom7,
    108     MI_CH_DsDom7,
    109     MI_CH_EbDom7 = MI_CH_DsDom7,
    110     MI_CH_EDom7,
    111     MI_CH_FDom7,
    112     MI_CH_FsDom7,
    113     MI_CH_GbDom7 = MI_CH_FsDom7,
    114     MI_CH_GDom7,
    115     MI_CH_GsDom7,
    116     MI_CH_AbDom7 = MI_CH_GsDom7,
    117     MI_CH_ADom7,
    118     MI_CH_AsDom7,
    119     MI_CH_BbDom7 = MI_CH_AsDom7,
    120     MI_CH_BDom7,
    121 
    122     // MIDI Chord Keycodes Diminished Seventh
    123 
    124     MI_CH_CDim7,
    125     MI_CH_CsDim7,
    126     MI_CH_DbDim7 = MI_CH_CsDim7,
    127     MI_CH_DDim7,
    128     MI_CH_DsDim7,
    129     MI_CH_EbDim7 = MI_CH_DsDim7,
    130     MI_CH_EDim7,
    131     MI_CH_FDim7,
    132     MI_CH_FsDim7,
    133     MI_CH_GbDim7 = MI_CH_FsDim7,
    134     MI_CH_GDim7,
    135     MI_CH_GsDim7,
    136     MI_CH_AbDim7 = MI_CH_GsDim7,
    137     MI_CH_ADim7,
    138     MI_CH_AsDim7,
    139     MI_CH_BbDim7 = MI_CH_AsDim7,
    140     MI_CH_BDim7,
    141 
    142     MY_CHORD_MAX = MI_CH_BDim7,
    143 
    144     VERSION
    145 };
    146 
    147 #define MY_CHORD_COUNT (MY_CHORD_MAX - MY_CHORD_MIN + 1)
    148 static uint8_t chord_status[MY_CHORD_COUNT];
    149 
    150 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    151   /* C-system Base */
    152   [_C_SYSTEM_BASE] = LAYOUT(
    153     MI_CH_Dbr,    MI_CH_Abr,    MI_CH_Ebr,    MI_CH_Bbr,    MI_CH_Fr,    MI_CH_Cr,    MI_CH_Gr,    MI_CH_Dr,    MI_CH_Ar,    MI_CH_Er,    MI_CH_Br,    MI_CH_Fsr,
    154       MI_CH_Db,     MI_CH_Ab,     MI_CH_Eb,     MI_CH_Bb,     MI_CH_F,     MI_CH_C,     MI_CH_G,     MI_CH_D,     MI_CH_A,     MI_CH_E,     MI_CH_B,     MI_CH_Fs,
    155         MI_CH_Dbm,    MI_CH_Abm,    MI_CH_Ebm,    MI_CH_Bbm,    MI_CH_Fm,    MI_CH_Cm,    MI_CH_Gm,    MI_CH_Dm,    MI_CH_Am,    MI_CH_Em,    MI_CH_Bm,    MI_CH_Fsm,
    156           MI_CH_DbDom7, MI_CH_AbDom7, MI_CH_EbDom7, MI_CH_BbDom7, MI_CH_FDom7, MI_CH_CDom7, MI_CH_GDom7, MI_CH_DDom7, MI_CH_ADom7, MI_CH_EDom7, MI_CH_BDom7, MI_CH_FsDom7,
    157             MI_CH_DbDim7, MI_CH_AbDim7, MI_CH_EbDim7, MI_CH_BbDim7, MI_CH_FDim7, MI_CH_CDim7, MI_CH_GDim7, MI_CH_DDim7, MI_CH_ADim7, MI_CH_EDim7, MI_CH_BDim7, MI_CH_FsDim7,
    158 
    159     MI_Fs2,
    160       MI_Ab2, MI_B2,  MI_D3,  MI_F3,  MI_Ab3, MI_B3,  MI_D4,  MI_F4,  MI_Ab4, MI_B4,  MI_D5,  MI_F5,    FN_MUTE,
    161     MI_G2,  MI_Bb2, MI_Db3, MI_E3,  MI_G3,  MI_Bb3, MI_Db4, MI_E4,  MI_G4,  MI_Bb4, MI_Db5, MI_E5,  MI_G5,
    162       MI_A2,  MI_C3,  MI_Eb3, MI_Fs3, MI_A3,  MI_C4,  MI_Eb4, MI_Fs4, MI_A4,  MI_C5,  MI_Eb5, MI_Fs5
    163   ),
    164 
    165   /* QWERTY */
    166   [_QWERTY] = LAYOUT_wrapper(
    167     QK_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
    168       KC_TAB,  _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL,
    169         KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT,
    170           KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT,
    171             KC_LCTL, KC_LGUI, KC_LALT, KC_LNG2, KC_SPC,  KC_SPC, KC_SPC, KC_SPC, KC_LNG1, KC_RALT,  KC_RGUI, KC_RCTL,
    172 
    173     _______,
    174       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,   _______,
    175     _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
    176       _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
    177   ),
    178 
    179   /* Fn */
    180   [_FN] = LAYOUT(
    181     DFCBASE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    182       DF_QWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    183         XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    184           XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    185             XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    186 
    187     XXXXXXX,
    188       XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, VERSION, XXXXXXX,   _______,
    189     XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    190       XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
    191   )
    192 };
    193 
    194 #if defined(ENCODER_MAP_ENABLE)
    195 const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
    196     [_C_SYSTEM_BASE]    = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
    197     [_QWERTY]           = { ENCODER_CCW_CW(_______, _______) },
    198     [_FN]               = { ENCODER_CCW_CW(_______, _______) },
    199 };
    200 #endif
    201 
    202 void keyboard_post_init_user(void) {
    203     //  Set octave to 0
    204     midi_config.octave = QK_MIDI_OCTAVE_0 - MIDI_OCTAVE_MIN;
    205 
    206     // avoid using 127 since it is used as a special number in some sound sources.
    207     midi_config.velocity = MIDI_INITIAL_VELOCITY;
    208 
    209     for (uint8_t i = 0; i < MY_CHORD_COUNT; i++) {
    210         chord_status[i] = MIDI_INVALID_NOTE;
    211     }
    212 
    213     default_layer_set(1UL << _C_SYSTEM_BASE);
    214 };
    215 
    216 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    217     uint16_t root_note = MIDI_INVALID_NOTE;  // Starting value for the root note of each chord
    218 
    219     uint8_t chord        = keycode - MY_CHORD_MIN;
    220 
    221     switch (keycode) {
    222         case VERSION: // Output firmware info.
    223             if (record->event.pressed) {
    224                 SEND_STRING(QMK_KEYBOARD ":" QMK_KEYMAP " @ " QMK_VERSION " | " QMK_BUILDDATE);
    225             }
    226             break;
    227 
    228         // MIDI Chord Keycodes, on the left side.
    229         case MI_CH_Cr ... MI_CH_Br:  // Root Notes
    230             root_note = keycode - MI_CH_Cr + MI_C1;
    231             my_process_midi4Bass(midi_bass_ch, record, chord_status, chord, root_note, false);
    232             break;
    233 
    234         case MI_CH_C ... MI_CH_B:  // Major Chords
    235             root_note = keycode - MI_CH_C + MI_C2;
    236             // Root, Major Third, and Fifth Notes
    237             my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 4, 7);
    238             break;
    239 
    240         case MI_CH_Cm ... MI_CH_Bm:  // Minor Chord
    241             root_note = keycode - MI_CH_Cm + MI_C2;
    242             // Root, Minor Third, and Fifth Notes
    243             my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 7);
    244             break;
    245 
    246         case MI_CH_CDom7 ... MI_CH_BDom7:  // Dominant 7th Chord
    247             root_note = keycode - MI_CH_CDom7 + MI_C2;
    248             // Major Third, Major Fifth, and Minor Seventh Notes
    249             my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 4, 7, 10);
    250             break;
    251 
    252         case MI_CH_CDim7 ... MI_CH_BDim7:                // Diminished 7th Chord
    253             root_note = keycode - MI_CH_CDim7 + MI_C2;
    254             // Root, Minor Third, and Diminished 5th Note
    255             my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 6);
    256             break;
    257     }
    258     return true;
    259 }