]> git.donarmstrong.com Git - qmk_firmware.git/blob - keyboards/s60_x/keymaps/bluebear/keymap.c
Improvements and corrections to morse code macros layer
[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,        //Base Layer
7   ARROWFN,     //Arrow/FN Layer
8   MOUSE,       //Mouse Layer
9   MIDI_BASE,   //Midi Layer
10   MIDI_CHORDS, //Midi Chord Layer
11   MORSE,       //Morse Code Layer
12 };
13
14 // Midi Chords
15
16 enum midi_chord_modes { //ACTION_FUNCTION opt
17   major,
18   minor,
19   dom_seventh,
20   dim_seventh,
21 };
22
23 enum midi_chord_root { //ACTION_FUNCTION id
24   C,
25   Cs,
26   Db = Cs,
27   D,
28   Ds,
29   Eb = Ds,
30   E,
31   F,
32   Fs,
33   Gb = Fs,
34   G,
35   Gs,
36   Ab = Gs,
37   A,
38   As,
39   Bb = As,
40   B,
41 };
42   
43 enum midi_chord_id { //ACTION_FUNCTION Progmem Id
44
45   //Major Chords
46
47   CMajor,
48   CsMajor,
49   DbMajor = CsMajor,
50   DMajor,
51   DsMajor,
52   EbMajor = DsMajor,
53   EMajor,
54   FMajor,
55   FsMajor,
56   GbMajor = FsMajor,
57   GMajor,
58   GsMajor,
59   AbMajor = GsMajor,
60   AMajor,
61   AsMajor,
62   BbMajor = AsMajor,
63   BMajor,
64
65   //Minor Chords
66
67   CMinor,
68   CsMinor,
69   DbMinor = CsMinor,
70   DMinor,
71   DsMinor,
72   EbMinor = DsMinor,
73   EMinor,
74   FMinor,
75   FsMinor,
76   GbMinor = FsMinor,
77   GMinor,
78   GsMinor,
79   AbMinor = GsMinor,
80   AMinor,
81   AsMinor,
82   BbMinor = AsMinor,
83   BMinor,
84
85   //Dominant Seventh Chords
86
87   CDom7,
88   CsDom7,
89   DbDom7 = CsDom7,
90   DDom7,
91   DsDom7,
92   EbDom7 = DsDom7,
93   EDom7,
94   FDom7,
95   FsDom7,
96   GbDom7 = FsDom7,
97   GDom7,
98   GsDom7,
99   AbDom7 = GsDom7,
100   ADom7,
101   AsDom7,
102   BbDom7 = AsDom7,
103   BDom7,
104   
105   //Diminished Seventh Chords
106
107   CDim7,
108   CsDim7,
109   DbDim7 = CsDim7,
110   DDim7,
111   DsDim7,
112   EbDim7 = DsDim7,
113   EDim7,
114   FDim7,
115   FsDim7,
116   GbDim7 = FsDim7,
117   GDim7,
118   GsDim7,
119   AbDim7 = GsDim7,
120   ADim7,
121   AsDim7,
122   BbDim7 = AsDim7,
123   BDim7, 
124 };
125
126 enum midi_chord_keycodes { //Midi Chocd Keycodes
127
128   //Major Chord Keycodes
129   
130   MI_CH_C = F(CMajor),
131   MI_CH_Cs = F(CsMajor),
132   MI_CH_Db = MI_CH_Cs,
133   MI_CH_D = F(DMajor),
134   MI_CH_Ds = F(DsMajor),
135   MI_CH_Eb = MI_CH_Ds,
136   MI_CH_E = F(EMajor),
137   MI_CH_F = F(FMajor),
138   MI_CH_Fs = F(FsMajor),
139   MI_CH_Gb = MI_CH_Fs,
140   MI_CH_G = F(GMajor),
141   MI_CH_Gs = F(GsMajor),
142   MI_CH_Ab = MI_CH_Gs,
143   MI_CH_A = F(AMajor),
144   MI_CH_As = F(AsMajor),
145   MI_CH_Bb = MI_CH_As,
146   MI_CH_B = F(BMajor),
147
148   //Minor Chord Keycodes
149
150   MI_CH_Cm = F(CMinor),
151   MI_CH_Csm = F(CsMinor),
152   MI_CH_Dbm = MI_CH_Csm,
153   MI_CH_Dm = F(DMinor),
154   MI_CH_Dsm = F(DsMinor),
155   MI_CH_Ebm = MI_CH_Dsm,
156   MI_CH_Em = F(EMinor),
157   MI_CH_Fm = F(FMinor),
158   MI_CH_Fsm = F(FsMinor),
159   MI_CH_Gbm = MI_CH_Fsm,
160   MI_CH_Gm = F(GMinor),
161   MI_CH_Gsm = F(GsMinor),
162   MI_CH_Abm = MI_CH_Gsm,
163   MI_CH_Am = F(AMinor),
164   MI_CH_Asm = F(AsMinor),
165   MI_CH_Bbm = MI_CH_Asm,
166   MI_CH_Bm = F(BMinor),
167
168   //Dominant Seventh Keycodes
169
170   MI_CH_CDom7 = F(CDom7),
171   MI_CH_CsDom7 = F(CsDom7),
172   MI_CH_DbDom7 = MI_CH_CsDom7,
173   MI_CH_DDom7 = F(DDom7),
174   MI_CH_DsDom7 = F(DsDom7),
175   MI_CH_EbDom7 = MI_CH_DsDom7,
176   MI_CH_EDom7 = F(EDom7),
177   MI_CH_FDom7 = F(FDom7),
178   MI_CH_FsDom7 = F(FsDom7),
179   MI_CH_GbDom7 = MI_CH_FsDom7,
180   MI_CH_GDom7 = F(GDom7),
181   MI_CH_GsDom7 = F(GsDom7),
182   MI_CH_AbDom7 = MI_CH_GsDom7,
183   MI_CH_ADom7 = F(ADom7),
184   MI_CH_AsDom7 = F(AsDom7),
185   MI_CH_BbDom7 = MI_CH_AsDom7,
186   MI_CH_BDom7 = F(BDom7),
187
188   //Diminished Seventh Keycodes
189
190   MI_CH_CDim7 = F(CDim7),
191   MI_CH_CsDim7 = F(CsDim7),
192   MI_CH_DbDim7 = MI_CH_CsDim7,
193   MI_CH_DDim7 = F(DDim7),
194   MI_CH_DsDim7 = F(DsDim7),
195   MI_CH_EbDim7 = MI_CH_DsDim7,
196   MI_CH_EDim7 = F(EDim7),
197   MI_CH_FDim7 = F(FDim7),
198   MI_CH_FsDim7 = F(FsDim7),
199   MI_CH_GbDim7 = MI_CH_FsDim7,
200   MI_CH_GDim7 = F(GDim7),
201   MI_CH_GsDim7 = F(GsDim7),
202   MI_CH_AbDim7 = MI_CH_GsDim7,
203   MI_CH_ADim7 = F(ADim7),
204   MI_CH_AsDim7 = F(AsDim7),
205   MI_CH_BbDim7 = MI_CH_AsDim7,
206   MI_CH_BDim7 = F(BDim7),
207 };
208
209 //Morse Code Macro Keys
210
211 enum morse_macros {
212   MC_0 = M(0),
213   MC_1 = M(1),
214   MC_2 = M(2),
215   MC_3 = M(3),
216   MC_4 = M(4),
217   MC_5 = M(5),
218   MC_6 = M(6),
219   MC_7 = M(7),
220   MC_8 = M(8),
221   MC_9 = M(9),
222   MC_A = M(10),
223   MC_B = M(11),
224   MC_C = M(12),
225   MC_D = M(13),
226   MC_E = M(14),
227   MC_F = M(15),
228   MC_G = M(16),
229   MC_H = M(17),
230   MC_I = M(18),
231   MC_J = M(19),
232   MC_K = M(20),
233   MC_L = M(21),
234   MC_M = M(22),
235   MC_N = M(23),
236   MC_O = M(24),
237   MC_P = M(25),
238   MC_Q = M(26),
239   MC_R = M(27),
240   MC_S = M(28),
241   MC_T = M(29),
242   MC_U = M(30),
243   MC_V = M(31),
244   MC_W = M(32),
245   MC_X = M(33),
246   MC_Y = M(34),
247   MC_Z = M(35),
248   MC_DOT = M(36),
249   MC_COMM = M(37),
250   MC_APOS = M(38),
251   MC_SLSH = M(39),
252   MC_SCLN = M(40),
253   MC_EQL = M(41),
254   MC_MINS = M(42),
255   MC_SPACE = M(43),
256 };
257
258 //Keymaps
259   
260 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
261
262   /* 0: Custom Dvorak/HHKBish Base Layer
263          
264          ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
265          │ ESC │  1  │  2  │  3  │  4  │  5  │  6  │  7  │  8  │  9  │  0  │  [  │  ]  │  \  │  `  │
266          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
267          │ TAB │  '  │  ,  │  .  │  P  │  Y  │  F  │  G  │  C  │  R  │  L  │  /  │  =  │BSPC │█████│
268          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
269          │CT/ES│  A  │  O  │  E  │  U  │  I  │  D  │  H  │  T  │  N  │  S  │  -  │▒▒▒▒▒│CT/EN│█████│
270          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
271          │LSPO │▒▒▒▒▒│  ;  │  Q  │  J  │  K  │  X  │  B  │  M  │  W  │  V  │  Z  │▒▒▒▒▒│RSPC │▒▒▒▒▒│
272          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
273          │MO(2)│L_GUI│L_ALT│█████│█████│█████│SPFN1│█████│█████│█████│AG/AP│R_GUI│CT|S │CT|AL│█████│
274          └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
275   */
276   
277   [BASE] = KEYMAP(
278                                   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, \
279                                   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,     \
280                                   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), \
281                                   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, \
282                                   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)
283                                   ),
284
285   /* 1: Arrow/FN Layer
286
287          ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
288          │     │ F1  │ F2  │ F3  │ F4  │ F5  │ F6  │ F7  │ F8  │ F9  │ F10 │ F11 │ F12 │TO(3)│TO(5)│
289          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
290          │     │     │     │     │     │     │     │PGUP │  UP │     │     │     │ INS │ DEL │█████│
291          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
292          │CAPS │HOME │     │ END │     │     │     │LEFT │DOWN │RIGHT│     │     │▒▒▒▒▒│     │█████│
293          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
294          │     │▒▒▒▒▒│     │     │     │     │     │SPACE│PGDN │PSCR │SLCK │PAUSE│▒▒▒▒▒│     │▒▒▒▒▒│
295          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
296          │     │     │     │█████│█████│█████│     │█████│█████│█████│     │     │     │     │█████│
297          └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
298   */
299
300   [ARROWFN] = KEYMAP(
301                                          KC_TRNS,  KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_F6,  KC_F7,  KC_F8,  KC_F9, KC_F10,  KC_F11,  KC_F12,  TO(3),  TO(5), \
302                                          KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_NO,  KC_PGUP,  KC_UP,  KC_NO,  KC_NO,  KC_NO,  KC_INS,  KC_DEL, \
303                                          KC_CAPS,  KC_HOME,  KC_NO,  KC_END,  KC_NO,  KC_NO,  KC_NO,  KC_LEFT,  KC_DOWN,  KC_RIGHT,  KC_NO,  KC_NO,  KC_NO,  KC_TRNS,  \
304                                          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, \
305                                          KC_NO,  KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_TRNS, KC_TRNS,  KC_TRNS,  KC_TRNS
306                                          ),
307
308   /* 2: Mouse Keys Layer
309
310          ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
311          │RESET│ F13 │ F14 │ F15 │ F16 │ F17 │ F18 │ F19 │ F20 │ F21 │ F22 │ F23 │ F24 │     │     │
312          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
313          │DEBUG│     │     │     │     │     │     │BTN1 │MS_UP│BTN2 │WH_UP│     │     │     │█████│
314          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
315          │     │     │     │     │     │     │     │MS_LT│MS_DN│MS_RT│WH_DN│BTN3 │▒▒▒▒▒│     │█████│
316          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
317          │     │▒▒▒▒▒│     │     │     │     │     │     │     │     │     │     │▒▒▒▒▒│     │▒▒▒▒▒│
318          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
319          │     │     │     │█████│█████│█████│ PWR │█████│█████│█████│     │     │     │     │█████│
320          └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
321   */
322
323   [MOUSE] = KEYMAP(
324                                          
325                                    RESET,  KC_F13,  KC_F14,  KC_F15,  KC_F16,  KC_F17,  KC_F18,  KC_F19,  KC_F20,  KC_F21, KC_F22,  KC_F23,  KC_F24,  KC_NO,  KC_NO,  \
326                                    DEBUG,  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, \
327                                    KC_LCTL,  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_TRNS,  \
328                                    KC_TRNS,  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_TRNS,  KC_NO, \
329                                    KC_TRNS,  KC_TRNS,  KC_TRNS,  KC_POWER,  KC_TRNS, KC_TRNS,  KC_NO,  KC_NO
330                                    ),
331
332   /* 3: Midi Base Layer
333
334          ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
335          │TO(0)│ Cmaj│ Gmaj│ Dmaj│ Amaj│ Emaj│ Bmaj│Gbmaj│Dbmaj│Abmaj│Ebmaj│Bbmaj│ Fmaj│     │TO(4)│
336          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
337          │OCT+ │     │  C# │  D# │     │  F# │  G# │  A# │     │  C# │  D# │     │     │     │█████│
338          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
339          │OCT- │  C  │  D  │  E  │  F  │  G  │  A  │  B  │  C  │  D  │  E  │  F  │▒▒▒▒▒│     │█████│
340          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
341          │ Cm  │▒▒▒▒▒│ Gm  │ Dm  │ Am  │ Em  │ Bm  │ Gbm │ Dbm │ Abm │ Ebm │ Bbm │▒▒▒▒▒│ Fm  │▒▒▒▒▒│
342          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
343          │     │     │     │█████│█████│█████│A-OFF│█████│█████│█████│     │     │     │     │█████│
344          └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
345   */
346         
347   [MIDI_BASE] = KEYMAP(
348                                            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,  TO(4), \
349                                            MI_OCTU,  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, \
350                                            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,  KC_NO,  \
351                                            MI_CH_Cm,  KC_NO,  MI_CH_Gm,  MI_CH_Dm,  MI_CH_Am,  MI_CH_Em,  MI_CH_Bm,  MI_CH_Gbm,  MI_CH_Dbm,  MI_CH_Abm,  MI_CH_Ebm,  MI_CH_Bbm,  KC_NO,  MI_CH_Fm,  KC_NO, \
352                                            KC_NO,  KC_NO,  KC_NO,  MI_ALLOFF,  KC_NO, KC_NO,  KC_NO,  KC_NO
353                                            ),
354
355   /* 4: Midi Chord Layer
356
357          ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
358          │TO(0)│ Cmaj│ Gmaj│ Dmaj│ Amaj│ Emaj│ Bmaj│Gbmaj│Dbmaj│Abmaj│Ebmaj│Bbmaj│ Fmaj│TO(3)│     │
359          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
360          │OCT+ │  Cm │  Gm │  Dm │  Am │  Em │ Bbm │ Gbm │ Dbm │ Abm │ Ebm │ Bbm │ Fm  │     │█████│
361          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
362          │OCT- │Cdom7│Gdom7│Ddom7│Adom7│Edom7│Bdom7│Gbdo7│Dbdo7│Abdo7│Ebdo7│Bbdo7│▒▒▒▒▒│Fdom7│█████│
363          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
364          │Cdim7│▒▒▒▒▒│Gdim7│Ddim7│Adim7│Edim7│Bdim7│Gbdi7│Dbdi7│Abdi7│Ebdi7│Bbdi7│▒▒▒▒▒│Fdim7│▒▒▒▒▒│
365          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
366          │     │     │     │█████│█████│█████│A-OFF│█████│█████│█████│     │     │     │     │█████│
367          └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
368   */
369         
370   [MIDI_CHORDS] = KEYMAP(
371                                                  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,  TO(3),  KC_NO, \
372                                                  MI_OCTU,  MI_CH_Cm,  MI_CH_Gm,  MI_CH_Dm,  MI_CH_Am,  MI_CH_Em,  MI_CH_Bbm,  MI_CH_Gbm,  MI_CH_Dbm,  MI_CH_Abm,  MI_CH_Ebm,  MI_CH_Bbm,  MI_CH_Fm,  KC_NO, \
373                                                  MI_OCTD,  MI_CH_CDom7,  MI_CH_GDom7,  MI_CH_DDom7,  MI_CH_ADom7,  MI_CH_EDom7,  MI_CH_BDom7,  MI_CH_GbDom7,  MI_CH_DbDom7,  MI_CH_AbDom7,  MI_CH_EbDom7,  MI_CH_BbDom7,  KC_NO,  MI_CH_FDom7, \
374                                                  MI_CH_CDim7,  KC_NO,  MI_CH_GDim7,  MI_CH_DDim7,  MI_CH_ADim7,  MI_CH_EDim7,  MI_CH_BDim7,  MI_CH_GbDim7,  MI_CH_DbDim7,  MI_CH_AbDim7,  MI_CH_EbDim7,  MI_CH_BbDim7,  KC_NO,  MI_CH_FDim7,  KC_NO, \
375                                                  KC_NO,  KC_NO,  KC_NO,  MI_ALLOFF,  KC_NO, KC_NO,  KC_NO,  KC_NO
376                                                  ),
377
378   /* 5: Morse Code Layer
379          
380          ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
381          │TO(0)│  1  │  2  │  3  │  4  │  5  │  6  │  7  │  8  │  9  │  0  │     │     │     │     │
382          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
383          │     │  '  │  ,  │  .  │  P  │  Y  │  F  │  G  │  C  │  R  │  L  │  /  │  =  │BSPC │█████│
384          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
385          │     │  A  │  O  │  E  │  U  │  I  │  D  │  H  │  T  │  N  │  S  │  -  │▒▒▒▒▒│ENTER│█████│
386          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
387          │SHIFT│▒▒▒▒▒│  ;  │  Q  │  J  │  K  │  X  │  B  │  M  │  W  │  V  │  Z  │▒▒▒▒▒│SHIFT│▒▒▒▒▒│
388          ├─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
389          │     │     │     │█████│█████│█████│SPACE│█████│█████│█████│     │     │     │     │█████│
390          └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
391   */
392   
393   [MORSE] = KEYMAP(
394                                    TO(0),  MC_1,  MC_2,  MC_3,  MC_4,  MC_5,  MC_6,  MC_7,  MC_8,  MC_9,  MC_0,  KC_NO,  KC_NO,  KC_NO,  KC_NO, \
395                                    KC_TAB,  MC_APOS,  MC_COMM, MC_DOT,  MC_P,  MC_Y,  MC_F,  MC_G,  MC_C,  MC_R,  MC_L,  MC_SLSH,  MC_EQL,  KC_BSPC, \
396                                    KC_NO,  MC_A,  MC_O,  MC_E,  MC_U,  MC_I,  MC_D,  MC_H,  MC_T,  MC_N,  MC_S,  MC_MINS,  KC_NO,  KC_ENT, \
397                                    KC_LSFT,  KC_NO,  MC_SCLN,  MC_Q,  MC_J,  MC_K,  MC_X,  MC_B,  MC_M,  MC_W,  MC_V,  MC_Z,  KC_NO,  KC_RSFT,  KC_NO, \
398                                    KC_NO, KC_NO, KC_NO,   MC_SPACE,  KC_NO,  KC_NO,  KC_NO, KC_NO
399                                    ),
400
401 };
402
403 // Morse Code Macros
404
405 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) {
406   switch(id) {
407   case 0: //Number 0-)
408         if (record->event.pressed) {
409           if (keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
410                 clear_mods();
411                 return MACRO(T(MINS), T(DOT), T(MINS), T(MINS), T(DOT), T(MINS), T(SPACE), END); //-.--.-
412           }
413           else {
414                 return MACRO(T(MINS), T(MINS), T(MINS), T(MINS), T(MINS), T(SPACE), END); //-----
415           }
416         }
417         break;
418   case 1: //Number 1-!
419         if (record->event.pressed) {
420           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
421                 clear_mods();
422                 return MACRO(T(MINS), T(DOT), T(MINS), T(DOT), T(MINS), T(MINS), T(SPACE), END); //-.-.--
423           }
424           else {
425                 return MACRO(T(DOT), T(MINS), T(MINS), T(MINS), T(MINS), T(SPACE), END); //.----
426           }
427         }
428         break;
429   case 2: //Number 2-@
430         if (record->event.pressed) {
431           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
432                 clear_mods();
433                 return MACRO(T(DOT), T(MINS), T(MINS), T(DOT), T(MINS), T(DOT), T(SPACE), END); //.--.-.
434           }
435           else {
436                 return MACRO(T(DOT), T(DOT), T(MINS), T(MINS), T(MINS), T(SPACE), END); //..---
437           }
438         }
439         break;
440   case 3: // Number 3
441         if (record->event.pressed) {
442           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
443                 clear_mods();
444           }
445           return MACRO(T(DOT), T(DOT), T(DOT), T(MINS), T(MINS), T(SPACE), END); //...--
446         }
447         break;
448   case 4: //Number 4-$
449         if (record->event.pressed) {
450           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
451                 clear_mods();
452                 return MACRO(T(DOT), T(DOT), T(DOT), T(MINS), T(DOT), T(DOT), T(MINS), T(SPACE), END); //...-..-
453           }
454           else {
455                 return MACRO(T(DOT), T(DOT), T(DOT), T(DOT), T(MINS), T(SPACE), END); //....-
456           }
457         }
458         break;
459   case 5: //Number 5
460         if (record->event.pressed) {
461           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
462                 clear_mods();
463           }
464           return MACRO(T(DOT), T(DOT), T(DOT), T(DOT), T(DOT), T(SPACE), END); //.....
465         }
466         break;
467   case 6: //Number 6
468         if (record->event.pressed) {
469           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
470                 clear_mods();
471           }
472           return MACRO(T(MINS), T(DOT), T(DOT), T(DOT), T(DOT), T(SPACE), END); //-....
473         }
474         break;
475   case 7: //Number 7-&
476         if (record->event.pressed) {
477           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
478                 clear_mods();
479                 return MACRO(T(DOT), T(MINS), T(DOT), T(DOT), T(DOT), T(SPACE), END); //.-...
480           }
481           else {
482                 return MACRO(T(MINS), T(MINS), T(DOT), T(DOT), T(DOT), T(SPACE), END); //--...
483           }
484         }
485         break;
486   case 8: //Number 8
487         if (record->event.pressed) {
488           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
489                 clear_mods();
490           }
491           return MACRO(T(MINS), T(MINS), T(MINS), T(DOT), T(DOT), T(SPACE), END); //---..
492         }
493         break;
494   case 9: //Number 9-(
495         if (record->event.pressed) {
496           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
497                 clear_mods();
498                 return MACRO(T(MINS), T(DOT), T(MINS), T(MINS), T(DOT), T(SPACE), END); //-.--.
499           }
500           else {
501                 return MACRO(T(MINS), T(MINS), T(MINS), T(MINS), T(DOT), T(SPACE), END); //----.
502           }
503         }
504         break;
505   case 10: //Letter A
506         if (record->event.pressed) {
507           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
508                 clear_mods();
509           }
510           return MACRO(T(DOT), T(MINS), T(SPACE), END); //.-
511         }
512         break;
513   case 11: //Letter B
514         if (record->event.pressed) {
515           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
516                 clear_mods();
517           }
518           return MACRO(T(MINS), T(DOT), T(DOT), T(DOT), T(SPACE), END); //-...
519         }
520         break;
521   case 12: //Letter C
522         if (record->event.pressed) {
523           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
524                 clear_mods();
525           }
526           return MACRO(T(MINS), T(DOT), T(MINS), T(DOT), T(SPACE), END); //-.-.
527         }
528         break;
529   case 13: //Letter D
530         if (record->event.pressed) {
531           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
532                 clear_mods();
533           }
534           return MACRO(T(MINS), T(DOT), T(DOT), T(SPACE), END); //-..
535         }
536         break;
537   case 14: //Letter E
538         if (record->event.pressed) {
539           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
540                 clear_mods();
541           }
542           return MACRO(T(DOT), T(SPACE), END); //.
543         }
544         break;
545   case 15: //Letter F
546         if (record->event.pressed) {
547           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
548                 clear_mods();
549           }
550           return MACRO(T(DOT), T(DOT), T(MINS), T(DOT), T(SPACE), END); //..-.
551         }
552         break;
553   case 16: //Letter G
554         if (record->event.pressed) {
555           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
556                 clear_mods();
557           }
558           return MACRO(T(MINS), T(MINS), T(DOT), T(SPACE), END); //--.
559         }
560         break;
561   case 17: //Letter H
562         if (record->event.pressed) {
563           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
564                 clear_mods();
565           }
566           return MACRO(T(DOT), T(DOT), T(DOT), T(DOT), T(SPACE), END); //....
567         }
568         break; 
569   case 18: //Letter I
570         if (record->event.pressed) {
571           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
572                 clear_mods();
573           }
574           return MACRO(T(DOT), T(DOT), T(SPACE), END); //..
575         }
576         break;
577   case 19: //Letter J
578         if (record->event.pressed) {
579           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
580                 clear_mods();
581           }
582           return MACRO(T(DOT), T(MINS), T(MINS), T(MINS), T(SPACE), END); //.---
583         }
584         break;
585   case 20: //Letter K
586         if (record->event.pressed) {
587           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
588                 clear_mods();
589           }
590           return MACRO(T(MINS), T(DOT), T(MINS), T(SPACE), END); //-.-
591         }
592         break;
593   case 21: //Letter L
594         if (record->event.pressed) {
595           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
596                 clear_mods();
597           }
598           return MACRO(T(DOT), T(MINS), T(DOT), T(DOT), T(SPACE), END); //.-..
599         }
600         break;
601   case 22: //Letter M
602         if (record->event.pressed) {
603           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
604                 clear_mods();
605           }
606           return MACRO(T(MINS), T(MINS), T(SPACE), END); //--
607         }
608         break;
609   case 23: //Letter N
610         if (record->event.pressed) {
611           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
612                 clear_mods();
613           }
614           return MACRO(T(MINS), T(DOT), T(SPACE), END); //-.
615         }
616         break;
617   case 24: //Letter O
618         if (record->event.pressed) {
619           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
620                 clear_mods();
621           }
622           return MACRO(T(MINS), T(MINS), T(MINS), T(SPACE), END); //---
623         }
624         break;
625   case 25: //Letter P
626         if (record->event.pressed) {
627           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
628                 clear_mods();
629           }
630           return MACRO(T(DOT), T(MINS), T(MINS), T(DOT), T(SPACE), END); //.--.
631         }
632         break;
633   case 26: //Letter Q
634         if (record->event.pressed) {
635           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
636                 clear_mods();
637           }
638           return MACRO(T(MINS), T(MINS), T(DOT), T(MINS), T(SPACE), END); //--.-
639         }
640         break;
641   case 27: //Letter R
642         if (record->event.pressed) {
643           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
644                 clear_mods();
645           }
646           return MACRO(T(DOT), T(MINS), T(DOT), T(SPACE), END); //.-.
647         }
648         break;
649   case 28: //Letter S
650         if (record->event.pressed) {
651           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
652                 clear_mods();
653           }
654           return MACRO(T(DOT), T(DOT), T(DOT), T(SPACE), END); //...
655         }
656         break;
657   case 29: //Letter T
658         if (record->event.pressed) {
659           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
660                 clear_mods();
661           }
662           return MACRO(T(MINS), T(SPACE), END); //-
663         }
664         break;
665   case 30: //Letter U
666         if (record->event.pressed) {
667           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
668                 clear_mods();
669           }
670           return MACRO(T(DOT), T(DOT), T(MINS), T(SPACE), END); //..-
671         }
672         break;
673   case 31: //Letter V
674         if (record->event.pressed) {
675           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
676                 clear_mods();
677           }
678           return MACRO(T(DOT), T(DOT), T(DOT), T(MINS), T(SPACE), END); //...-
679         }
680         break;
681   case 32: //Letter W
682         if (record->event.pressed) {
683           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
684                 clear_mods();
685           }
686           return MACRO(T(DOT), T(MINS), T(MINS), T(SPACE), END); //.--
687         }
688         break;
689   case 33: //Letter X
690         if (record->event.pressed) {
691           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
692                 clear_mods();
693           }
694           return MACRO(T(MINS), T(DOT), T(DOT), T(MINS), T(SPACE), END); //-..-
695         }
696         break;
697   case 34: //Letter Y
698         if (record->event.pressed) {
699           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
700                 clear_mods();
701           }
702           return MACRO(T(MINS), T(DOT), T(MINS), T(MINS), T(SPACE), END); //-.--
703         }
704         break;
705   case 35: //Letter Z
706         if (record->event.pressed) {
707           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
708                 clear_mods();
709           }
710           return MACRO(T(MINS), T(MINS), T(DOT), T(DOT), T(SPACE), END); //--..
711         }
712         break;
713   case 36: //Punctuation .
714         if (record->event.pressed) {
715           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
716                 clear_mods();
717           }
718           return MACRO(T(DOT), T(MINS), T(DOT), T(MINS), T(DOT), T(MINS), T(SPACE), END); //.-.-.-
719         }
720         break;
721   case 37: //Punctuation ,
722         if (record->event.pressed) {
723           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
724                 clear_mods();
725           }
726           return MACRO(T(MINS), T(MINS), T(DOT), T(DOT), T(MINS), T(MINS), T(SPACE), END); //--..--
727         }
728         break;
729   case 38: //Punctuation '-"
730         if (record->event.pressed) {
731           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
732                 clear_mods();
733                 return MACRO(T(DOT), T(MINS), T(DOT), T(DOT), T(MINS), T(DOT), T(SPACE), END); //.-..-.
734           }
735           else {
736                 return MACRO(T(DOT), T(MINS), T(MINS), T(MINS), T(MINS), T(DOT), T(SPACE), END); //-....-
737           }
738         }
739         break;
740   case 39: //Punctuation /-?
741         if (record->event.pressed) {
742           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
743                 clear_mods();
744                 return MACRO(T(DOT), T(DOT), T(MINS), T(MINS), T(DOT), T(DOT), T(SPACE), END); //..--..
745           }
746           else {
747                 return MACRO(T(MINS), T(DOT), T(DOT), T(MINS), T(DOT), T(SPACE), END); //-..-.
748           }
749         }
750         break;
751   case 40: //Punctuation ;-:
752         if (record->event.pressed) {
753           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
754                 clear_mods();
755                 return MACRO(T(MINS), T(MINS), T(MINS), T(DOT), T(DOT), T(DOT), T(SPACE), END); //---...
756           }
757           else {
758                 return MACRO(T(MINS), T(DOT), T(MINS), T(DOT), T(MINS), T(DOT), T(SPACE), END); //-.-.-.
759           }
760         }
761         break;
762   case 41: //Punctuation =-+
763         if (record->event.pressed) {
764           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
765                 clear_mods();
766                 return MACRO(T(DOT), T(MINS), T(DOT), T(MINS), T(DOT), T(SPACE), END); //.-.-.
767           }
768           else {
769                 return MACRO(T(MINS), T(DOT), T(DOT), T(DOT), T(MINS), T(SPACE), END); //-...-
770           }
771         }
772         break;
773   case 42: //Punctuation --_
774         if (record->event.pressed) {
775           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
776                 clear_mods();
777                 return MACRO(T(DOT), T(DOT), T(MINS), T(MINS), T(DOT), T(MINS), T(SPACE), END); //..--.-
778           }
779           else {
780                 return MACRO(T(MINS), T(DOT), T(DOT), T(DOT), T(DOT), T(MINS), T(SPACE), END); //-....-
781           }
782         }
783         break;
784   case 43: //Morse Space
785         if (record->event.pressed) {
786           if (keyboard_report->mods & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT))) {
787                 clear_mods();
788           }
789           return MACRO(T(BSLS), T(SPACE), END); //When pressed, this sends a slash followed by a space, making it easier to distinguish words in Morse
790         }
791         break;
792   }
793   return MACRO_NONE;
794 };
795
796 // Midi Chord Function
797
798 const uint16_t PROGMEM fn_actions[] = {
799
800   //Major Chords
801   
802   [CMajor] = ACTION_FUNCTION_OPT(C, major),
803   [CsMajor] =  ACTION_FUNCTION_OPT(Cs, major),
804   [DMajor] = ACTION_FUNCTION_OPT(D, major),
805   [DsMajor] = ACTION_FUNCTION_OPT(Ds, major),
806   [EMajor] = ACTION_FUNCTION_OPT(E, major),
807   [FMajor] = ACTION_FUNCTION_OPT(F, major),
808   [FsMajor] = ACTION_FUNCTION_OPT(Fs, major),
809   [GMajor] = ACTION_FUNCTION_OPT(G, major),
810   [GsMajor] = ACTION_FUNCTION_OPT(Gs, major),
811   [AMajor] = ACTION_FUNCTION_OPT(A, major),
812   [AsMajor] = ACTION_FUNCTION_OPT(As, major),
813   [BMajor] = ACTION_FUNCTION_OPT(B, major),
814
815   //Minor Chords
816
817   [CMinor] = ACTION_FUNCTION_OPT(C, minor),
818   [CsMinor] =  ACTION_FUNCTION_OPT(Cs, minor),
819   [DMinor] = ACTION_FUNCTION_OPT(D, minor),
820   [DsMinor] = ACTION_FUNCTION_OPT(Ds, minor),
821   [EMinor] = ACTION_FUNCTION_OPT(E, minor),
822   [FMinor] = ACTION_FUNCTION_OPT(F, minor),
823   [FsMinor] = ACTION_FUNCTION_OPT(Fs, minor),
824   [GMinor] = ACTION_FUNCTION_OPT(G, minor),
825   [GsMinor] = ACTION_FUNCTION_OPT(Gs, minor),
826   [AMinor] = ACTION_FUNCTION_OPT(A, minor),
827   [AsMinor] = ACTION_FUNCTION_OPT(As, minor),
828   [BMinor] = ACTION_FUNCTION_OPT(B, minor),
829   
830   //Dominant 7th
831
832   [CDom7] = ACTION_FUNCTION_OPT(C, dom_seventh),
833   [CsDom7] =  ACTION_FUNCTION_OPT(Cs, dom_seventh),
834   [DDom7] = ACTION_FUNCTION_OPT(D, dom_seventh),
835   [DsDom7] = ACTION_FUNCTION_OPT(Ds, dom_seventh),
836   [EDom7] = ACTION_FUNCTION_OPT(E, dom_seventh),
837   [FDom7] = ACTION_FUNCTION_OPT(F, dom_seventh),
838   [FsDom7] = ACTION_FUNCTION_OPT(Fs, dom_seventh),
839   [GDom7] = ACTION_FUNCTION_OPT(G, dom_seventh),
840   [GsDom7] = ACTION_FUNCTION_OPT(Gs, dom_seventh),
841   [ADom7] = ACTION_FUNCTION_OPT(A, dom_seventh),
842   [AsDom7] = ACTION_FUNCTION_OPT(As, dom_seventh),
843   [BDom7] = ACTION_FUNCTION_OPT(B, dom_seventh),
844
845   //Diminished 7th
846
847   [CDim7] = ACTION_FUNCTION_OPT(C, dim_seventh),
848   [CsDim7] =  ACTION_FUNCTION_OPT(Cs, dim_seventh),
849   [DDim7] = ACTION_FUNCTION_OPT(D, dim_seventh),
850   [DsDim7] = ACTION_FUNCTION_OPT(Ds, dim_seventh),
851   [EDim7] = ACTION_FUNCTION_OPT(E, dim_seventh),
852   [FDim7] = ACTION_FUNCTION_OPT(F, dim_seventh),
853   [FsDim7] = ACTION_FUNCTION_OPT(Fs, dim_seventh),
854   [GDim7] = ACTION_FUNCTION_OPT(G, dim_seventh),
855   [GsDim7] = ACTION_FUNCTION_OPT(Gs, dim_seventh),
856   [ADim7] = ACTION_FUNCTION_OPT(A, dim_seventh),
857   [AsDim7] = ACTION_FUNCTION_OPT(As, dim_seventh),
858   [BDim7] = ACTION_FUNCTION_OPT(B, dim_seventh),
859 };
860
861 void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) {
862   uint16_t root_note = MIDI_INVALID_NOTE;
863   switch (id) {
864   case C: //Root note C
865         root_note = MI_C;
866         break;
867   case Cs: //Root note C#/Db
868         root_note = MI_Cs;
869         break;
870   case D: // Root note D
871         root_note = MI_D;
872         break;
873   case Ds: // Root note D#/Eb
874         root_note = MI_Ds;
875         break;
876   case E: // Root note E
877         root_note = MI_E;
878         break;
879   case F: // Root note F
880         root_note = MI_F;
881         break;
882   case Fs: // Root note F#/Gb
883         root_note = MI_Fs;
884         break;
885   case G: // Root note G
886         root_note = MI_G;
887         break;
888   case Gs: // Root note G#/Ab
889         root_note = MI_Gs;
890         break;
891   case A: // Root note A
892         root_note = MI_A;
893         break;
894   case As: // Root note A#/Bb
895         root_note = MI_As;
896         break;
897   case B: // Root note B
898         root_note = MI_B;
899         break;
900   }
901   uint16_t major_third = root_note + 4;
902   uint16_t minor_third = root_note + 3;
903   //uint16_t flat_fifth = root_note + 6;
904   uint16_t fifth = root_note + 7;
905   uint16_t minor_seventh = root_note + 10;
906   uint16_t diminished_seventh = root_note -3;
907   switch (opt) {
908   case major: //Major chord
909         process_midi(root_note, record);
910         process_midi(major_third, record);
911         process_midi(fifth, record);
912         break;
913   case minor: //Minor chord
914         process_midi(root_note, record);
915         process_midi(minor_third, record);
916         process_midi(fifth, record);
917         break;
918   case dom_seventh: //Dominant Seventh chord
919         process_midi(root_note, record);
920         process_midi(major_third, record);
921         process_midi(minor_seventh, record);
922         break;
923   case dim_seventh: //Diminished Seventh Chord
924         process_midi(root_note, record);
925         process_midi(minor_third, record);
926         process_midi(diminished_seventh, record);
927         break;
928   }
929 }