]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/s60_x/keymaps/bluebear/keymap.c
f963043c19a9e6d0b6ee12b9252461e294d71aa7
[qmk_firmware.git] / keyboards / s60_x / keymaps / bluebear / keymap.c
1 #include "s60_x.h"
2
3 // Keyboard Layers
4
5 enum keyboard_layers {
6   BASE = 0, //Base Layer
7   ARROW,    //Arrow/FN Layer
8   MOUSE,    //Mouse Layer
9   MIDI,     //Midi Layer
10 };
11
12 // Midi Chord Keycodes
13
14 bool midi_chord(uint8_t mode, uint16_t root);
15
16 enum midi_chord_modes {
17   major = 0,
18   minor,
19 };
20
21 enum midi_chord_keycodes {
22
23   //Major Chords
24
25   MI_CH_C = SAFE_RANGE,
26   MI_CH_Cs,
27   MI_CH_Db = MI_CH_Cs,
28   MI_CH_D,
29   MI_CH_Ds,
30   MI_CH_Eb = MI_CH_Ds,
31   MI_CH_E,
32   MI_CH_F,
33   MI_CH_Fs,
34   MI_CH_Gb = MI_CH_Fs,
35   MI_CH_G,
36   MI_CH_Gs,
37   MI_CH_Ab = MI_CH_Gs,
38   MI_CH_A,
39   MI_CH_As,
40   MI_CH_Bb = MI_CH_As,
41   MI_CH_B,
42
43   //Minor Chords
44
45   MI_CH_Cm,
46   MI_CH_Csm,
47   MI_CH_Dbm = MI_CH_Csm,
48   MI_CH_Dm,
49   MI_CH_Dsm,
50   MI_CH_Ebm = MI_CH_Dsm,
51   MI_CH_Em,
52   MI_CH_Fm,
53   MI_CH_Fsm,
54   MI_CH_Gbm = MI_CH_Fsm,
55   MI_CH_Gm,
56   MI_CH_Gsm,
57   MI_CH_Abm = MI_CH_Gsm,
58   MI_CH_Am,
59   MI_CH_Asm,
60   MI_CH_Bbm = MI_CH_Asm,
61   MI_CH_Bm,
62 };
63
64 //Keymaps
65   
66 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
67
68   /* 0: Custom Dvorak/HHKBish Base Layer
69          
70          ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
71          │ ESC │  1  │  2  │  3  │  4  │  5  │  6  │  7  │  8  │  9  │  0  │  [  │  ]  │  \  │  `  │
72          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
73          │ TAB │  '  │  ,  │  .  │  P  │  Y  │  F  │  G  │  C  │  R  │  L  │  /  │  =  │BSPC │█████│
74          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
75          │CT/ES│  A  │  O  │  E  │  U  │  I  │  D  │  H  │  T  │  N  │  S  │  -  │▒▒▒▒▒│CT/EN│█████│
76          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
77          │LSPO │▒▒▒▒▒│  ;  │  Q  │  J  │  K  │  X  │  B  │  M  │  W  │  V  │  Z  │▒▒▒▒▒│RSPC │▒▒▒▒▒│
78          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
79          │MO(2)│L_GUI│L_ALT│█████│█████│█████│SPFN1│█████│█████│█████│AG/AP│R_GUI│CT|S │CT|AL│█████│
80          └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
81   */
82   
83   [BASE] = KEYMAP(
84                                   KC_ESC,  KC_1,  KC_2,  KC_3,  KC_4,  KC_5,  KC_6,  KC_7,  KC_8,  KC_9,  KC_0,  KC_LBRC,  KC_RBRC,  KC_BSLS,  KC_GRV, \
85                                   KC_TAB,  KC_QUOT, KC_COMM,  KC_DOT,  KC_P,  KC_Y,  KC_F,  KC_G,  KC_C,  KC_R,  KC_L,  KC_SLSH,  KC_EQL,  KC_BSPC,     \
86                                   CTL_T(KC_ESC),  KC_A,  KC_O,  KC_E,  KC_U,  KC_I,  KC_D,  KC_H,  KC_T,  KC_N,  KC_S,  KC_MINS,  KC_NO,  MT(MOD_RCTL, KC_ENT), \
87                                   KC_LSPO,  KC_NO,  KC_SCLN,  KC_Q,  KC_J,  KC_K,  KC_X,  KC_B,  KC_M,  KC_W,  KC_V,  KC_Z,  KC_NO,  KC_RSPC,  KC_NO, \
88                                   MO(2), KC_LGUI, KC_LALT,  LT(1, KC_SPACE),  ALGR_T(KC_APP),  KC_RGUI,  OSM(MOD_LCTL | MOD_LSFT),  OSM(MOD_LCTL | MOD_LALT)
89                                   ),
90   
91   /* 1: Arrow/Missing Keys Layer
92
93          ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
94          │TG(3)│ F1  │ F2  │ F3  │ F4  │ F5  │ F6  │ F7  │ F8  │ F9  │ F10 │ F11 │ F12 │     │     │
95          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
96          │CAPS │     │     │     │     │     │     │PGUP │  UP │HOME │ END │     │ INS │ DEL │█████│
97          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
98          │     │     │     │     │     │     │     │LEFT │DOWN │RIGHT│     │     │▒▒▒▒▒│     │█████│
99          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
100          │     │▒▒▒▒▒│     │     │     │     │     │SPACE│PGDN │PSCR │SLCK │PAUSE│▒▒▒▒▒│     │▒▒▒▒▒│
101          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
102          │     │     │     │█████│█████│█████│     │█████│█████│█████│     │     │     │     │█████│
103          └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
104   */
105
106   [ARROW] = KEYMAP(
107                                    TG(3),  KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_F6,  KC_F7,  KC_F8,  KC_F9, KC_F10,  KC_F11,  KC_F12,  KC_NO,  KC_NO,  \
108                                    KC_CAPS,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_PGUP,  KC_UP,  KC_HOME,  KC_END,  KC_NO,  KC_INS,  KC_DEL,  \
109                                    KC_TRNS,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_LEFT,  KC_DOWN,  KC_RIGHT,  KC_NO,  KC_NO,  KC_NO,  KC_TRNS,  \
110                                    KC_TRNS,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_SPACE,  KC_PGDN,  KC_PSCR,  KC_SLCK,  KC_PAUS,  KC_NO,  KC_TRNS,  KC_NO, \
111                                    KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS
112                                    ),
113
114   /* 2: Mouse Keys Layer
115
116          ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
117          │RESET│ F1  │ F2  │ F3  │ F4  │ F5  │ F6  │ F7  │ F8  │ F9  │ F10 │     │     │     │     │
118          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
119          │     │     │     │     │     │     │     │BTN1 │MS_UP│BTN2 │WH_UP│     │     │     │█████│
120          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
121          │     │     │     │     │     │     │     │MS_LT│MS_DN│MS_RT│WH_DN│BTN3 │▒▒▒▒▒│     │█████│
122          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
123          │     │▒▒▒▒▒│     │     │     │     │     │     │     │     │     │     │▒▒▒▒▒│     │▒▒▒▒▒│
124          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
125          │     │     │     │█████│█████│█████│ PWR │█████│█████│█████│     │     │     │     │█████│
126          └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
127   */
128
129   [MOUSE] = KEYMAP(
130                                          
131                                    RESET,  KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_F6,  KC_F7,  KC_F8,  KC_F9, KC_F10,  KC_F11,  KC_F12,  KC_NO,  KC_NO,  \
132                                    KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_BTN1,  KC_MS_UP,  KC_BTN2,  KC_WH_U,  KC_NO,  KC_NO,  KC_NO,  \
133                                    KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_MS_LEFT,  KC_MS_DOWN,  KC_MS_RIGHT,  KC_WH_D,  KC_BTN3,  KC_NO,  KC_NO,  \
134                                    KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO, \
135                                    KC_TRNS,  KC_NO,  KC_NO,  KC_POWER,  KC_NO, KC_NO,  KC_NO,  KC_NO
136                                    ),
137
138   /* 3: Midi Layer
139
140          ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
141          │TG(0)│ Cmaj│ Gmaj│ Dmaj│ Amaj│ Emaj│ Bmaj│Gbmaj│Dbmaj│Abmaj│Ebmaj│Bbmaj│ Fmaj│     │     │
142          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
143          │     │     │  C# │  D# │     │  F# │  G# │  A# │     │  C# │  D# │     │     │     │█████│
144          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
145          │OCT- │  C  │  D  │  E  │  F  │  G  │  A  │  B  │  C  │  D  │  E  │  F  │▒▒▒▒▒│OCT+ │█████│
146          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
147          │ Am  │▒▒▒▒▒│ Em  │ Bm  │ F#m │ C#m │ G#m │ D#m │ Bbm │ Fm  │ Cm  │ Gm  │▒▒▒▒▒│ Dm  │▒▒▒▒▒│
148          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
149          │     │     │     │█████│█████│█████│A-OFF│█████│█████│█████│     │     │     │     │█████│
150          └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
151   */
152         
153   [MIDI] = KEYMAP(
154                                   TO(0),  MI_CH_C,  MI_CH_G,  MI_CH_D,  MI_CH_A,  MI_CH_E,  MI_CH_B,  MI_CH_Gb,  MI_CH_Db,  MI_CH_Ab, MI_CH_Eb,  MI_CH_Bb,  MI_CH_F,  KC_NO,  KC_NO, \
155                                   KC_NO,  KC_NO,  MI_Cs,  MI_Ds,  KC_NO,  MI_Fs,  MI_Gs,  MI_As,  KC_NO,  MI_Cs_1,  MI_Ds_1,  KC_NO,  KC_NO,  KC_NO, \
156                                   MI_OCTD,  MI_C,  MI_D,  MI_E,  MI_F,  MI_G,  MI_A,  MI_B,  MI_C_1,  MI_D_1,  MI_E_1,  MI_F_1,  KC_NO,  MI_OCTU,  \
157                                   MI_CH_Am,  KC_NO,  MI_CH_Em,  MI_CH_Bm,  MI_CH_Fsm,  MI_CH_Csm,  MI_CH_Gsm,  MI_CH_Dsm,  MI_CH_Bbm,  MI_CH_Fm,  MI_CH_Cm,  MI_CH_Gm,  KC_NO,  MI_CH_Dm,  KC_NO, \
158                                   KC_NO,  KC_NO,  KC_NO,  MI_ALLOFF,  KC_NO, KC_NO,  KC_NO,  KC_NO
159                                   ),
160
161 };
162
163 // Midi Chord Function
164
165 bool midi_chord(uint8_t mode, uint16_t root) {
166   switch (mode) {
167   case 0:
168         uint8_t channel = midi_config.channel;
169         uint8_t tone = root - MIDI_TONE_MIN;
170         uint8_t velocity = compute_velocity(midi_config.velocity);
171         if (record->event.pressed) {
172           uint8_t root_note = midi_compute_note(root);
173           uint8_t major_third = midi_compute_note(root) + 4;
174           uint8_t fifth = midi_compute_note(root) + 7;
175           midi_send_noteon(&midi_device, channel, root_note, velocity);
176           midi_send_noteon(&midi_device, channel, major_third, velocity);
177           midi_send_noteon(&midi_device, channel, fifth, velocity);
178           tone_status[tone] = root_note;
179         }
180         else {
181           uint8_t root_note = tone_status[tone];
182           uint8_t major_third = root_note + 4;
183           uint8_t fifth = root_note + 7;
184           if (root_note != MIDI_INVALID_NOTE)
185                 {
186                   midi_send_noteoff(&midi_device, channel, root_note, velocity);
187                   midi_send_noteoff(&midi_device, channel, major_third, velocity);
188                   midi_send_noteoff(&midi_device, channel, fifth, velocity);
189                 }
190           tone_status[tone] = MIDI_INVALID_NOTE;
191         }
192         return false;
193   case 1:
194         uint8_t channel = midi_config.channel;
195         uint8_t tone = root - MIDI_TONE_MIN;
196         uint8_t velocity = compute_velocity(midi_config.velocity);
197         if (record->event.pressed) {
198           uint8_t root_note = midi_compute_note(root);
199           uint8_t minor_third = midi_compute_note(root) + 3;
200           uint8_t fifth = midi_compute_note(root) + 7;
201           midi_send_noteon(&midi_device, channel, root_note, velocity);
202           midi_send_noteon(&midi_device, channel, major_third, velocity);
203           midi_send_noteon(&midi_device, channel, fifth, velocity);
204           tone_status[tone] = root_note;
205         }
206         else {
207           uint8_t root_note = tone_status[tone];
208           uint8_t minor_third = root_note + 3;
209           uint8_t fifth = root_note + 7;
210           if (root_note != MIDI_INVALID_NOTE)
211                 {
212                   midi_send_noteoff(&midi_device, channel, root_note, velocity);
213                   midi_send_noteoff(&midi_device, channel, minor_third, velocity);
214                   midi_send_noteoff(&midi_device, channel, fifth, velocity);
215                 }
216           tone_status[tone] = MIDI_INVALID_NOTE;
217         }
218         return false;
219   };
220   return true;
221 };
222