qmk_firmware

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

keymap.c (10263B)


      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_giabarinaix2(...) LAYOUT_giabarinaix2(__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_giabarinaix2(
    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_Db2,      MI_E2,       MI_G2,       MI_Bb2,      MI_Db3,     MI_E3,      MI_G3,      MI_Bb3,     MI_Db4,     MI_E4,      MI_G4,      MI_Bb4,
    160       MI_Eb2,      MI_Fs2,      MI_A2,       MI_C3,       MI_Eb3,     MI_Fs3,     MI_A3,      MI_C4,      MI_Eb4,     MI_Fs4,     MI_A4,      MI_C5,
    161         MI_F2,       MI_Ab2,      MI_B2,       MI_D3,       MI_F3,      MI_Ab3,     MI_B3,      MI_D4,      MI_F4,      MI_Ab4,     MI_B4,      MI_D5,
    162           MI_G2,       MI_Bb2,      MI_Db3,      MI_E3,       MI_G3,      MI_Bb3,     MI_Db4,     MI_E4,      MI_G4,      MI_Bb4,     MI_Db5,     MI_E5,
    163             MI_A2,       MI_C3,       MI_Eb3,      MI_Fs3,      MI_A3,      MI_C4,      MI_Eb4,     MI_Fs4,     MI_A4,      MI_C5,      MI_Eb5,     FN_MUTE
    164   ),
    165 
    166   /* QWERTY */
    167   [_QWERTY] = LAYOUT_wrapper_giabarinaix2(
    168     QK_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
    169       KC_TAB,  _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL,
    170         KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT,
    171           KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT,
    172             KC_LCTL, KC_LGUI, KC_LALT, KC_LNG2, KC_SPC,  KC_SPC, KC_SPC, KC_SPC, KC_LNG1, KC_RALT,  KC_RGUI, KC_RCTL,
    173 
    174     QK_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
    175       KC_TAB,  _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL,
    176         KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT,
    177           KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT,
    178             KC_LCTL, KC_LGUI, KC_LALT, KC_LNG2, KC_SPC,  KC_SPC, KC_SPC, KC_SPC, KC_LNG1, KC_RALT,  KC_RGUI, _______
    179   ),
    180 
    181   /* Fn */
    182   [_FN] = LAYOUT_giabarinaix2(
    183     DFCBASE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    184       DF_QWER, 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           XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    187             XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    188 
    189     DFCBASE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    190       DF_QWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    191         XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, VERSION, XXXXXXX,
    192           XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
    193             XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,  _______
    194   )
    195 };
    196 
    197 #if defined(ENCODER_MAP_ENABLE)
    198 const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
    199     [_C_SYSTEM_BASE]        = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
    200     [_QWERTY]               = { ENCODER_CCW_CW(_______, _______) },
    201     [_FN]                   = { ENCODER_CCW_CW(_______, _______) },
    202 };
    203 #endif
    204 
    205 void keyboard_post_init_user(void) {
    206     //  Set octave to 0
    207     midi_config.octave = QK_MIDI_OCTAVE_0 - MIDI_OCTAVE_MIN;
    208 
    209     // avoid using 127 since it is used as a special number in some sound sources.
    210     midi_config.velocity = MIDI_INITIAL_VELOCITY;
    211 
    212     for (uint8_t i = 0; i < MY_CHORD_COUNT; i++) {
    213         chord_status[i] = MIDI_INVALID_NOTE;
    214     }
    215 
    216     default_layer_set(1UL << _C_SYSTEM_BASE);
    217 };
    218 
    219 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
    220     uint16_t root_note = MIDI_INVALID_NOTE;  // Starting value for the root note of each chord
    221 
    222     uint8_t chord        = keycode - MY_CHORD_MIN;
    223 
    224     switch (keycode) {
    225         case VERSION: // Output firmware info.
    226             if (record->event.pressed) {
    227                 SEND_STRING(QMK_KEYBOARD ":" QMK_KEYMAP " @ " QMK_VERSION " | " QMK_BUILDDATE);
    228             }
    229             break;
    230 
    231         // MIDI Chord Keycodes, on the left side.
    232         case MI_CH_Cr ... MI_CH_Br:  // Root Notes
    233             root_note = keycode - MI_CH_Cr + MI_C1;
    234             my_process_midi4Bass(midi_bass_ch, record, chord_status, chord, root_note, false);
    235             break;
    236 
    237         case MI_CH_C ... MI_CH_B:  // Major Chords
    238             root_note = keycode - MI_CH_C + MI_C2;
    239             // Root, Major Third, and Fifth Notes
    240             my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 4, 7);
    241             break;
    242 
    243         case MI_CH_Cm ... MI_CH_Bm:  // Minor Chord
    244             root_note = keycode - MI_CH_Cm + MI_C2;
    245             // Root, Minor Third, and Fifth Notes
    246             my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 7);
    247             break;
    248 
    249         case MI_CH_CDom7 ... MI_CH_BDom7:  // Dominant 7th Chord
    250             root_note = keycode - MI_CH_CDom7 + MI_C2;
    251             // Major Third, Major Fifth, and Minor Seventh Notes
    252             my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 4, 7, 10);
    253             break;
    254 
    255         case MI_CH_CDim7 ... MI_CH_BDim7:                // Diminished 7th Chord
    256             root_note = keycode - MI_CH_CDim7 + MI_C2;
    257             // Root, Minor Third, and Diminished 5th Note
    258             my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 6);
    259             break;
    260     }
    261     return true;
    262 }