Przeglądaj źródła

Merge branch 'master' of https://github.com/jackhumbert/qmk_firmware

Stephan Bösebeck 9 lat temu
rodzic
commit
38a1d830fa

+ 13 - 1
README.md

@@ -16,13 +16,21 @@ The documentation below explains QMK customizations and elaborates on some of th
 * If you're looking to customize a keyboard that currently runs QMK or TMK, find your keyboard's directory under `keyboard/` and run the make commands from there.
 * If you're looking to customize a keyboard that currently runs QMK or TMK, find your keyboard's directory under `keyboard/` and run the make commands from there.
 * If you're looking to apply this firmware to an entirely new hardware project (a new kind of keyboard), you can create your own Quantum-based project by using `./new_project.sh <project_name>`, which will create `/keyboard/<project_name>` with all the necessary components for a Quantum project.
 * If you're looking to apply this firmware to an entirely new hardware project (a new kind of keyboard), you can create your own Quantum-based project by using `./new_project.sh <project_name>`, which will create `/keyboard/<project_name>` with all the necessary components for a Quantum project.
 
 
+### Makefile Options
+
 You have access to a bunch of goodies! Check out the Makefile to enable/disable some of the features. Uncomment the `#` to enable them. Setting them to `no` does nothing and will only confuse future you.
 You have access to a bunch of goodies! Check out the Makefile to enable/disable some of the features. Uncomment the `#` to enable them. Setting them to `no` does nothing and will only confuse future you.
 
 
     BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
     BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
     MIDI_ENABLE = yes      # MIDI controls
     MIDI_ENABLE = yes      # MIDI controls
-    # UNICODE_ENABLE = yes # Unicode support - this is commented out, just as an example. You have to use #, not //
+    UNICODE_ENABLE = no    # <-- This is how you disable an option, just set it to "no"
     BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
     BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
 
 
+### Customizing Makefile options on a per-keymap basis
+
+If your keymap directory has a file called `makefile.mk` (note the lowercase filename, and the `.mk` extension), any Makefile options you set in that file will take precedence over other Makefile options (those set for Quantum as a whole or for your particular keyboard).
+
+So let's say your keyboard's makefile has `CONSOLE_ENABLE = yes` (or maybe doesn't even list the `CONSOLE_ENABLE` option, which would cause it to revert to the global Quantum default). You want your particular keymap to not have the debug console, so you make a file called `makefile.mk` and specify `CONSOLE_ENABLE = no`.
+
 ## Quick aliases to common actions
 ## Quick aliases to common actions
 
 
 Your keymap can include shortcuts to common operations (called "function actions" in tmk).
 Your keymap can include shortcuts to common operations (called "function actions" in tmk).
@@ -199,6 +207,10 @@ This will clear all mods currently pressed.
 
 
 This will clear all keys besides the mods currently pressed.
 This will clear all keys besides the mods currently pressed.
 
 
+* `update_tri_layer(layer_1, layer_2, layer_3);`
+
+If the user attempts to activate layer 1 AND layer 2 at the same time (for example, by hitting their respective layer keys), layer 3 will be activated. Layers 1 and 2 will _also_ be activated, for the purposes of fallbacks (so a given key will fall back from 3 to 2, to 1 -- and only then to 0).
+
 #### Timer functionality
 #### Timer functionality
 
 
 It's possible to start timers and read values for time-specific events - here's an example:
 It's possible to start timers and read values for time-specific events - here's an example:

+ 37 - 14
keyboard/planck/Makefile

@@ -41,7 +41,6 @@
 # Target file name (without extension).
 # Target file name (without extension).
 TARGET = planck
 TARGET = planck
 
 
-
 # Directory common source filess exist
 # Directory common source filess exist
 TOP_DIR = ../..
 TOP_DIR = ../..
 TMK_DIR = ../../tmk_core
 TMK_DIR = ../../tmk_core
@@ -62,17 +61,28 @@ ifneq ("$(wildcard keymaps/$(KEYMAP).c)","")
 else
 else
 ifneq ("$(wildcard keymaps/$(KEYMAP)/keymap.c)","")
 ifneq ("$(wildcard keymaps/$(KEYMAP)/keymap.c)","")
 	KEYMAP_FILE = keymaps/$(KEYMAP)/keymap.c
 	KEYMAP_FILE = keymaps/$(KEYMAP)/keymap.c
+ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","")
+	include keymaps/$(KEYMAP)/makefile.mk
+endif
 else
 else
 $(error Keymap file does not exist)
 $(error Keymap file does not exist)
+endif 
 endif
 endif
-endif
+
 else
 else
+
 ifneq ("$(wildcard keymaps/default.c)","")
 ifneq ("$(wildcard keymaps/default.c)","")
 	KEYMAP_FILE = keymaps/default.c
 	KEYMAP_FILE = keymaps/default.c
 else
 else
 	KEYMAP_FILE = keymaps/default/keymap.c
 	KEYMAP_FILE = keymaps/default/keymap.c
 endif
 endif
+
+ifneq ("$(wildcard keymaps/default/makefile.mk)","")
+	include keymaps/default/makefile.mk
+endif
+
 endif
 endif
+
 SRC := $(KEYMAP_FILE) $(SRC)
 SRC := $(KEYMAP_FILE) $(SRC)
 
 
 CONFIG_H = config.h
 CONFIG_H = config.h
@@ -94,7 +104,6 @@ MCU = atmega32u4
 #     software delays.
 #     software delays.
 F_CPU = 16000000
 F_CPU = 16000000
 
 
-
 #
 #
 # LUFA specific
 # LUFA specific
 #
 #
@@ -126,31 +135,45 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
 #   USBaspLoader     2048
 #   USBaspLoader     2048
 OPT_DEFS += -DBOOTLOADER_SIZE=4096
 OPT_DEFS += -DBOOTLOADER_SIZE=4096
 
 
-
 # Build Options
 # Build Options
-#   comment out to disable the options.
+#   change to "no" to disable the options, or define them in the makefile.mk in 
+#   the appropriate keymap folder that will get included automatically
 #
 #
 BOOTMAGIC_ENABLE = yes      # Virtual DIP switch configuration(+1000)
 BOOTMAGIC_ENABLE = yes      # Virtual DIP switch configuration(+1000)
 MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
 MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
 CONSOLE_ENABLE = yes        # Console for debug(+400)
 CONSOLE_ENABLE = yes        # Console for debug(+400)
 COMMAND_ENABLE = yes        # Commands for debug and configuration
 COMMAND_ENABLE = yes        # Commands for debug and configuration
-# NKRO_ENABLE = yes         # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+NKRO_ENABLE = no            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
 BACKLIGHT_ENABLE = yes      # Enable keyboard backlight functionality
 BACKLIGHT_ENABLE = yes      # Enable keyboard backlight functionality
-# MIDI_ENABLE = yes         # MIDI controls
-# AUDIO_ENABLE = yes        # Audio output on port C6
-# UNICODE_ENABLE = yes      # Unicode
-# BLUETOOTH_ENABLE = ye     # Enable Bluetooth with the Adafruit EZ-Key HID
-# RGBLIGHT_ENABLE = yes     # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+MIDI_ENABLE = no            # MIDI controls
+AUDIO_ENABLE = no           # Audio output on port C6
+UNICODE_ENABLE = no         # Unicode
+BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
 
 
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-#SLEEP_LED_ENABLE = yes    # Breathing sleep LED during USB suspend
+SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
 
 
+ifdef KEYMAP
 
 
-ifdef BACKLIGHT_ENABLE
-	SRC += backlight.c
+ifeq ("$(wildcard keymaps/$(KEYMAP).c)","")
+ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","")
+	include keymaps/$(KEYMAP)/makefile.mk
+endif 
 endif
 endif
 
 
+else
+
+ifneq ("$(wildcard keymaps/default/makefile.mk)","")
+	include keymaps/default/makefile.mk
+endif
+
+endif
+
+ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
+	SRC := backlight.c $(SRC)
+endif
 
 
 # Optimize size but this may cause error "relocation truncated to fit"
 # Optimize size but this may cause error "relocation truncated to fit"
 #EXTRALDFLAGS = -Wl,--relax
 #EXTRALDFLAGS = -Wl,--relax

+ 2 - 2
keyboard/planck/config.h

@@ -73,10 +73,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
  */
 
 
 /* disable debug print */
 /* disable debug print */
-#define NO_DEBUG
+//#define NO_DEBUG
 
 
 /* disable print */
 /* disable print */
-#define NO_PRINT
+//#define NO_PRINT
 
 
 /* disable action features */
 /* disable action features */
 //#define NO_ACTION_LAYER
 //#define NO_ACTION_LAYER

+ 112 - 0
keyboard/planck/keymaps/bone2planck.c

@@ -0,0 +1,112 @@
+
+#include "planck.h"
+#ifdef BACKLIGHT_ENABLE
+#include "backlight.h"
+#endif
+#include "..\..\quantum\keymap_extras\keymap_german.h"
+
+/* This Layout tries to emulate the Bone2 Variant of Neo2, and is intended to be used with a German QWERTZ Softwarelayout.
+   It has Umlauts and "ß" as it is optimized for a mix of German & English.
+   My favourite features are the placement of the special characters often used for programming right on the home row 
+   and the number & navigation block combo, so you never have to move your hands from their home position.
+   
+   Bone2 wiki page: http://wiki.neo-layout.org/wiki/Bone
+*/
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+	/* Bone2
+	* ,-----------------------------------------------------------------------------------.
+	* | Q	 |   J  |   D  |   U  |   A  |   X  |   P  |   H  |   L  |   M  |   W  |  ẞ   |
+	* |------+------+------+------+------+-------------+------+------+------+------+------|
+	* | M1   |   C  |   T  |   I  |   E  |   O  |   B  |   N  |   R  |   S  |   G  |  M1  |
+	* |------+------+------+------+------+------|------+------+------+------+------+------|
+	* | Shift|   F  |   V  |   Ü  |   Ä  |   Ö  |   Y  |   Z  |   ,  |   .  |   K  |Shift |
+	* |------+------+------+------+------+------+------+------+------+------+------+------|
+	* | Ctrl | GUI  | Alt  |  M3  |  M2  |    Space    |  M2  |  M3  |  Esc |  Tab |Enter |
+	* `-----------------------------------------------------------------------------------'
+	*/
+	[0] = {
+		{ DE_Q,	   DE_J,	DE_D,    DE_U,    DE_A,    DE_X,    DE_P,    DE_H,    DE_L,    DE_M,    DE_W,    DE_SS  },
+		{ MO(1),   DE_C,    DE_T,    DE_I,    DE_E,    DE_O,    DE_B,    DE_N,    DE_R,    DE_S,    DE_G,    MO(1)  },
+		{ DE_S,	   DE_F,    DE_V,    DE_UE,   DE_AE,   DE_OE,   DE_Y,    DE_Z,    DE_COMM, DE_DOT,  DE_K,    DE_S   },
+		{ KC_LCTL, KC_LGUI, KC_LALT, MO(3),   MO(2),   KC_SPC,  KC_SPC,  MO(2),   MO(3),   KC_ESC,  KC_TAB,  KC_ENT }
+	},
+
+	/* M1 Special Characters
+	* ,-----------------------------------------------------------------------------------.
+	* | °    |   @  |   _  |   [  |   ]  |   ^  |   !  |   <  |   >  |   =  |   &  |      |
+	* |------+------+------+------+------+-------------+------+------+------+------+------|
+	* | M1   |   \  |   /  |   {  |   }  |   *  |   ?  |   (  |   )  |   -  |   :  |  M1  |
+	* |------+------+------+------+------+------|------+------+------+------+------+------|
+	* |      |   #  |   $  |   |  |   ~  |   €  |   +  |   %  |   "  |   '  |   ;  |      |
+	* |------+------+------+------+------+------+------+------+------+------+------+------|
+	* | Ctrl | GUI  | Alt  |  M3  |  M2  |    Space    |  M2  |  M3  |  Esc |  Tab |Enter |
+	* `-----------------------------------------------------------------------------------'
+	*/
+	[1] = {
+		{ DE_RING, DE_AT,   DE_UNDS, DE_LBRC, DE_RBRC, DE_CIRC, DE_EXLM, DE_LESS, DE_MORE, DE_EQL,  DE_AMPR, KC_NO   },
+		{ KC_TRNS, DE_BSLS, DE_SLSH, DE_LCBR, DE_RCBR, DE_ASTR, DE_QST,  DE_LPRN, DE_RPRN, DE_MINS, DE_COLN, KC_TRNS },
+		{ KC_NO  , DE_HASH, DE_DLR,  DE_PIPE, DE_TILD, DE_EURO, DE_PLUS, DE_PERC, DE_DQOT, DE_QUOT, DE_SCLN, KC_NO   },
+		{ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }
+	},
+
+	/* Navigation & Number Blocks
+	* ,-----------------------------------------------------------------------------------.
+	* |      | PgUp | Bksp |  Up  |  DEL | PgDn |      |   7  |   8  |   9  |      |      |
+	* |------+------+------+------+------+-------------+------+------+------+------+------|
+	* |      | Home |  Lft | Down | Right| End  |   .  |   4  |   5  |   6  |   ,  |      |
+	* |------+------+------+------+------+------|------+------+------+------+------+------|
+	* | Shift|      |  Tab | Ins  | Enter|      |   0  |   1  |   2  |   3  |   ;  |Shift |
+	* |------+------+------+------+------+------+------+------+------+------+------+------|
+	* | Ctrl | GUI  | Alt  |  M3  |  M2  |    Space    |  M2  |  M3  |  Esc |  Tab |Enter |
+	* `-----------------------------------------------------------------------------------'
+	*/
+	[2] = {
+		{ KC_NO,   KC_PGUP, KC_BSPC, KC_UP,   KC_DEL,  KC_PGDN, KC_NO,   DE_7,    DE_8,    DE_9,    KC_NO,   KC_NO   },
+		{ KC_NO,   KC_HOME, KC_LEFT, KC_DOWN, KC_RGHT, KC_END,  DE_DOT,  DE_4,    DE_5,    DE_6,    DE_COMM, KC_NO   },
+		{ DE_S,    KC_NO,   KC_TAB,  KC_INS,  KC_ENT,  KC_NO,   KC_0,    DE_1,    DE_2,    DE_3,    DE_SCLN, DE_S    },
+		{ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS }
+	},
+
+	/* Function & Media Keys
+	* ,-----------------------------------------------------------------------------------.
+	* |      |      | Print|Scroll|Pause |      |      |  F7  |  F8  |  F9  |  F12 |      |
+	* |------+------+------+------+------+-------------+------+------+------+------+------|
+	* |      |      | Mute | Vol- | Vol+ |      |   ³  |  F4  |  F5  |  F6  |  F11 |      |
+	* |------+------+------+------+------+------|------+------+------+------+------+------|
+	* | Shift|      | Prev | Play | Next |      |   ²  |  F1  |  F2  |  F3  |  F10 |Shift |
+	* |------+------+------+------+------+------+------+------+------+------+------+------|
+	* | Ctrl | GUI  | Alt  |  M3  |      |    Space    |      |  M3  |  Esc |  Tab |Enter |
+	* `-----------------------------------------------------------------------------------'
+	*/
+	[3] = {
+		{ KC_NO,   KC_NO,   KC_PSCR, KC_SLCK, KC_PAUS, KC_NO,   KC_NO,   KC_F7,   KC_F8,   KC_F9,   KC_F12,  KC_NO	},
+		{ KC_NO,   KC_NO,   KC_MUTE, KC_VOLD, KC_VOLU, KC_NO,   DE_SQ3,  KC_F4,   KC_F5,   KC_F6,   KC_F11,  KC_NO  },
+		{ KC_TRNS, KC_NO,   KC_MPRV, KC_MPLY, KC_MNXT, KC_NO,   DE_SQ2,  KC_F1,   KC_F2,   KC_F3,   KC_F10,  KC_TRNS},
+		{ KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO,   KC_TRNS, KC_TRNS, KC_NO,   KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS}
+	}
+};
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+	// MACRODOWN only works in this function
+	switch (id) {
+	case 0:
+		if (record->event.pressed) {
+			register_code(KC_RSFT);
+#ifdef BACKLIGHT_ENABLE
+			backlight_step();
+#endif
+		}
+		else {
+			unregister_code(KC_RSFT);
+		}
+		break;
+	}
+	return MACRO_NONE;
+};

+ 155 - 21
keyboard/planck/keymaps/default/keymap.c

@@ -2,8 +2,9 @@
 // this is the style you want to emulate.
 // this is the style you want to emulate.
 
 
 #include "planck.h"
 #include "planck.h"
-#ifdef BACKLIGHT_ENABLE
-  #include "backlight.h"
+#include "action_layer.h"
+#ifdef AUDIO_ENABLE
+  #include "audio.h"
 #endif
 #endif
 
 
 // Each layer gets a name for readability, which is then used in the keymap matrix below.
 // Each layer gets a name for readability, which is then used in the keymap matrix below.
@@ -15,6 +16,19 @@
 #define _DV 2
 #define _DV 2
 #define _LW 3
 #define _LW 3
 #define _RS 4
 #define _RS 4
+#define _AD 5
+
+// Macro name shortcuts
+#define QWERTY M(_QW)
+#define COLEMAK M(_CM)
+#define DVORAK M(_DV)
+#define LOWER M(_LW)
+#define RAISE M(_RS)
+#define M_BL 5
+#ifdef AUDIO_ENABLE
+  #define AUD_OFF M(6)
+  #define AUD_ON M(7)
+#endif
 
 
 // Fillers to make layering more clear
 // Fillers to make layering more clear
 #define _______ KC_TRNS
 #define _______ KC_TRNS
@@ -37,7 +51,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   {KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC},
   {KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC},
   {KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
   {KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
   {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT },
   {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT },
-  {M(0),    KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+  {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
 },
 },
 
 
 /* Colemak
 /* Colemak
@@ -55,7 +69,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   {KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC},
   {KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC},
   {KC_ESC,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT},
   {KC_ESC,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT},
   {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT },
   {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT },
-  {M(0),    KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+  {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
 },
 },
 
 
 /* Dvorak
 /* Dvorak
@@ -73,43 +87,61 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
   {KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_BSPC},
   {KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_BSPC},
   {KC_ESC,  KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_SLSH},
   {KC_ESC,  KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_SLSH},
   {KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_ENT },
   {KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_ENT },
-  {M(0),    KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+  {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+},
+
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |  |   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |      |      |      |      |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_LW] = {
+  {KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
+  {KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  _______, _______, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
 },
 },
 
 
 /* Raise
 /* Raise
  * ,-----------------------------------------------------------------------------------.
  * ,-----------------------------------------------------------------------------------.
  * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
  * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
  * |------+------+------+------+------+-------------+------+------+------+------+------|
  * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | Esc  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   |
+ * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   |
  * |------+------+------+------+------+------|------+------+------+------+------+------|
  * |------+------+------+------+------+------|------+------+------+------+------+------|
- * | Shift|  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |Qwerty|Colemk|Dvorak| Reset|Enter |
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |      |      |      |      |Enter |
  * |------+------+------+------+------+------+------+------+------+------+------+------|
  * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Next | Vol- | Vol+ | Play |
+ * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
  * `-----------------------------------------------------------------------------------'
  * `-----------------------------------------------------------------------------------'
  */
  */
 [_RS] = {
 [_RS] = {
   {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
   {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
-  {_______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
-  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  DF(_QW), DF(_CM), DF(_DV), RESET,   _______},
+  {KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
+  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  _______, _______, _______, _______, _______},
   {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
   {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
 },
 },
 
 
-/* Lower
+/* Adjust (Lower + Raise)
  * ,-----------------------------------------------------------------------------------.
  * ,-----------------------------------------------------------------------------------.
- * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp |
+ * |      | Reset|      |      |      |      |      |      |      |      |      |  Del |
  * |------+------+------+------+------+-------------+------+------+------+------+------|
  * |------+------+------+------+------+-------------+------+------+------+------+------|
- * | Esc  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |  |   |
+ * |      |      |      |Aud on|Audoff|      |      |Qwerty|Colemk|Dvorak|      |      |
  * |------+------+------+------+------+------|------+------+------+------+------+------|
  * |------+------+------+------+------+------|------+------+------+------+------+------|
- * | Shift|  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |Qwerty|Colemk|Dvorak| Reset|Enter |
+ * |      |      |      |      |      |      |      |      |      |      |      |      |
  * |------+------+------+------+------+------+------+------+------+------+------+------|
  * |------+------+------+------+------+------+------+------+------+------+------+------|
- * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Next | Vol- | Vol+ | Play |
+ * |      |      |      |      |      |             |      |      |      |      |      |
  * `-----------------------------------------------------------------------------------'
  * `-----------------------------------------------------------------------------------'
  */
  */
-[_LW] = {
-  {KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
-  {_______, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
-  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  DF(_QW), DF(_CM), DF(_DV), RESET,   _______},
-  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+[_AD] = {
+  {_______, RESET,   _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL},
+  {_______, _______, _______, AUD_ON,  AUD_OFF, _______, _______, QWERTY,  COLEMAK, DVORAK,  _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
 }
 }
 };
 };
 
 
@@ -117,11 +149,91 @@ const uint16_t PROGMEM fn_actions[] = {
 
 
 };
 };
 
 
+#ifdef AUDIO_ENABLE
+float start_up[][2] = {
+  {440.0*pow(2.0,(67)/12.0), 12},
+  {440.0*pow(2.0,(64)/12.0), 8},
+  {440.0*pow(2.0,(55)/12.0), 8},
+  {440.0*pow(2.0,(60)/12.0), 8},
+  {440.0*pow(2.0,(64)/12.0), 20}
+};
+
+float tone_qw[][2] = {
+  {440.0*pow(2.0,(59)/12.0), 8},
+  {440.0*pow(2.0,(60)/12.0), 8},
+  {0, 4},
+  {440.0*pow(2.0,(67)/12.0), 16}
+};
+
+float tone_cm[][2] = {
+  {440.0*pow(2.0,(59)/12.0), 8},
+  {440.0*pow(2.0,(60)/12.0), 8},
+  {0, 4},
+  {440.0*pow(2.0,(67)/12.0), 12},
+  {0, 4},
+  {440.0*pow(2.0,(71)/12.0), 12}
+};
+
+float tone_dv[][2] = {
+  {440.0*pow(2.0,(59)/12.0), 8},
+  {440.0*pow(2.0,(60)/12.0), 8},
+  {0, 4},
+  {440.0*pow(2.0,(67)/12.0), 8},
+  {0, 4},
+  {440.0*pow(2.0,(69)/12.0), 8},
+  {0, 4},
+  {440.0*pow(2.0,(67)/12.0), 8}
+};
+#endif
+
+
 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 {
 {
   // MACRODOWN only works in this function
   // MACRODOWN only works in this function
       switch(id) {
       switch(id) {
-        case 0:
+        case _QW:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              play_notes(&tone_qw, 4, false);
+            #endif
+            default_layer_set(1UL<<_QW);
+          }
+          break;
+        case _CM:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              play_notes(&tone_cm, 6, false);
+            #endif
+            default_layer_set(1UL<<_CM);
+          }
+          break;
+        case _DV:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              play_notes(&tone_dv, 8, false);
+            #endif
+            default_layer_set(1UL<<_DV);
+          }
+          break;
+        case _LW:
+          if (record->event.pressed) {
+            layer_on(_LW);
+            update_tri_layer(_LW, _RS, _AD);
+          } else {
+            layer_off(_LW);
+            update_tri_layer(_LW, _RS, _AD);
+          }
+          break;
+        case _RS:
+          if (record->event.pressed) {
+            layer_on(_RS);
+            update_tri_layer(_LW, _RS, _AD);
+          } else {
+            layer_off(_RS);
+            update_tri_layer(_LW, _RS, _AD);
+          }
+          break;
+        case M_BL:
           if (record->event.pressed) {
           if (record->event.pressed) {
             register_code(KC_RSFT);
             register_code(KC_RSFT);
             #ifdef BACKLIGHT_ENABLE
             #ifdef BACKLIGHT_ENABLE
@@ -131,6 +243,28 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
             unregister_code(KC_RSFT);
             unregister_code(KC_RSFT);
           }
           }
         break;
         break;
+        case 6:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              audio_off();
+            #endif
+          }
+        break;
+        case 7:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              audio_on();
+              play_notes(&start_up, 5, false);
+            #endif
+          }
+        break;
       }
       }
     return MACRO_NONE;
     return MACRO_NONE;
 };
 };
+
+void matrix_init_user(void) {
+  #ifdef AUDIO_ENABLE
+    init_notes();
+    play_notes(&start_up, 5, false);
+  #endif
+}

+ 1 - 0
keyboard/planck/keymaps/default/makefile.mk

@@ -0,0 +1 @@
+AUDIO_ENABLE = yes 

+ 36 - 19
keyboard/preonic/Makefile

@@ -126,27 +126,44 @@ OPT_DEFS += -DINTERRUPT_CONTROL_ENDPOINT
 #   USBaspLoader     2048
 #   USBaspLoader     2048
 OPT_DEFS += -DBOOTLOADER_SIZE=4096
 OPT_DEFS += -DBOOTLOADER_SIZE=4096
 
 
-
 # Build Options
 # Build Options
-#   comment out to disable the options.
-#
-BOOTMAGIC_ENABLE = yes	# Virtual DIP switch configuration(+1000)
-MOUSEKEY_ENABLE = yes	# Mouse keys(+4700)
-EXTRAKEY_ENABLE = yes	# Audio control and System control(+450)
-CONSOLE_ENABLE = yes	# Console for debug(+400)
-COMMAND_ENABLE = yes    # Commands for debug and configuration
+#   change to "no" to disable the options, or define them in the makefile.mk in 
+#   the appropriate keymap folder that will get included automatically
+#
+BOOTMAGIC_ENABLE = yes      # Virtual DIP switch configuration(+1000)
+MOUSEKEY_ENABLE = yes       # Mouse keys(+4700)
+EXTRAKEY_ENABLE = yes       # Audio control and System control(+450)
+CONSOLE_ENABLE = yes        # Console for debug(+400)
+COMMAND_ENABLE = yes        # Commands for debug and configuration
+NKRO_ENABLE = no            # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
+BACKLIGHT_ENABLE = yes      # Enable keyboard backlight functionality
+MIDI_ENABLE = no            # MIDI controls
+AUDIO_ENABLE = no           # Audio output on port C6
+UNICODE_ENABLE = no         # Unicode
+BLUETOOTH_ENABLE = no       # Enable Bluetooth with the Adafruit EZ-Key HID
+RGBLIGHT_ENABLE = no        # Enable WS2812 RGB underlight.  Do not enable this with audio at the same time.
+
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
 # Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE
-# SLEEP_LED_ENABLE = yes  # Breathing sleep LED during USB suspend
-# NKRO_ENABLE = yes		# USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
-BACKLIGHT_ENABLE = yes  # Enable keyboard backlight functionality
-MIDI_ENABLE = YES 		# MIDI controls
-AUDIO_ENABLE = YES 		# Audio output on port C6
-# UNICODE_ENABLE = YES 		# Unicode
-# BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
-# RGBLIGHT_ENABLE = yes # Enable WS2812 RGB underlight.  Do not enable this with MIDI at the same time.
-
-ifdef BACKLIGHT_ENABLE
-	SRC += backlight.c
+SLEEP_LED_ENABLE = no    # Breathing sleep LED during USB suspend
+
+ifdef KEYMAP
+
+ifeq ("$(wildcard keymaps/$(KEYMAP).c)","")
+ifneq ("$(wildcard keymaps/$(KEYMAP)/makefile.mk)","")
+	include keymaps/$(KEYMAP)/makefile.mk
+endif 
+endif
+
+else
+
+ifneq ("$(wildcard keymaps/default/makefile.mk)","")
+	include keymaps/default/makefile.mk
+endif
+
+endif
+
+ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
+	SRC := backlight.c $(SRC)
 endif
 endif
 
 
 
 

+ 1 - 34
keyboard/preonic/keymaps/default/README.md

@@ -1,34 +1 @@
-# The Default Planck Layout
-
-    const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-    [_QW] = { /* Qwerty */
-      {KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC},
-      {KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
-      {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT },
-      {M(0),    KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
-    },
-    [_CM] = { /* Colemak */
-      {KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC},
-      {KC_ESC,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT},
-      {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT },
-      {M(0),    KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
-    },
-    [_DV] = { /* Dvorak */
-      {KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_BSPC},
-      {KC_ESC,  KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_SLSH},
-      {KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_ENT },
-      {M(0),    KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
-    },
-    [_RS] = { /* RAISE */
-      {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
-      {KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
-      {KC_TRNS, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  DF(_QW), DF(_CM), DF(_DV), RESET,   KC_TRNS},
-      {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
-    },
-    [_LW] = { /* LOWER */
-      {KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
-      {KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
-      {KC_TRNS, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  DF(_QW), DF(_CM), DF(_DV), RESET,   KC_TRNS},
-      {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
-    }
-    };
+# The default Preonic layout - largely based on the Planck's

+ 296 - 40
keyboard/preonic/keymaps/default/keymap.c

@@ -1,56 +1,182 @@
-// This is the canonical layout file for the Quantum project. If you want to add another keyboard,
-// this is the style you want to emulate.
-
 #include "preonic.h"
 #include "preonic.h"
-#ifdef BACKLIGHT_ENABLE
-  #include "backlight.h"
+#include "action_layer.h"
+#include "eeconfig.h"
+#ifdef AUDIO_ENABLE
+  #include "audio.h"
+  #define SCALE (int []){ 0 + (12*0), 2 + (12*0), 4 + (12*0), 5 + (12*0), 7 + (12*0), 9 + (12*0), 11 + (12*0), \
+              0 + (12*1), 2 + (12*1), 4 + (12*1), 5 + (12*1), 7 + (12*1), 9 + (12*1), 11 + (12*1), \
+              0 + (12*2), 2 + (12*2), 4 + (12*2), 5 + (12*2), 7 + (12*2), 9 + (12*2), 11 + (12*2), \
+              0 + (12*3), 2 + (12*3), 4 + (12*3), 5 + (12*3), 7 + (12*3), 9 + (12*3), 11 + (12*3), \
+              0 + (12*4), 2 + (12*4), 4 + (12*4), 5 + (12*4), 7 + (12*4), 9 + (12*4), 11 + (12*4), }
 #endif
 #endif
 
 
 // Each layer gets a name for readability, which is then used in the keymap matrix below.
 // Each layer gets a name for readability, which is then used in the keymap matrix below.
 // The underscores don't mean anything - you can have a layer called STUFF or any other name.
 // The underscores don't mean anything - you can have a layer called STUFF or any other name.
 // Layer names don't all need to be of the same length, obviously, and you can also skip them
 // Layer names don't all need to be of the same length, obviously, and you can also skip them
 // entirely and just use numbers.
 // entirely and just use numbers.
-#define _QW 0
-#define _CM 1
-#define _DV 2
-#define _LW 3
-#define _RS 4
+#define _QWERTY 0
+#define _COLEMAK 1
+#define _DVORAK 2
+#define _LOWER 3
+#define _RAISE 4
+#define _ADJUST 5
+#define _MUSIC 6
+
+// Macro name shortcuts
+#define QWERTY M(_QWERTY)
+#define COLEMAK M(_COLEMAK)
+#define DVORAK M(_DVORAK)
+#define LOWER M(_LOWER)
+#define RAISE M(_RAISE)
+#define M_BL 5
+#ifdef AUDIO_ENABLE
+  #define AUD_OFF M(6)
+  #define AUD_ON M(7)
+#endif
+#define MUS_OFF M(8)
+#define MUS_ON M(9)
+
+// Fillers to make layering more clear
+#define _______ KC_TRNS
+#define XXXXXXX KC_NO
 
 
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
-[_QW] = { /* Qwerty */
+
+/* Qwerty
+ * ,-----------------------------------------------------------------------------------.
+ * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Tab  |   Q  |   W  |   E  |   R  |   T  |   Y  |   U  |   I  |   O  |   P  | Del  |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   S  |   D  |   F  |   G  |   H  |   J  |   K  |   L  |   ;  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   N  |   M  |   ,  |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_QWERTY] = {
   {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
   {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
-  {KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_BSPC},
+  {KC_TAB,  KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P,    KC_DEL},
   {KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
   {KC_ESC,  KC_A,    KC_S,    KC_D,    KC_F,    KC_G,    KC_H,    KC_J,    KC_K,    KC_L,    KC_SCLN, KC_QUOT},
   {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT },
   {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_N,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT },
-  {M(0),    KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+  {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
 },
 },
-[_CM] = { /* Colemak */
+
+/* Colemak
+ * ,-----------------------------------------------------------------------------------.
+ * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Tab  |   Q  |   W  |   F  |   P  |   G  |   J  |   L  |   U  |   Y  |   ;  | Del  |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   R  |   S  |   T  |   D  |   H  |   N  |   E  |   I  |   O  |  "   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   Z  |   X  |   C  |   V  |   B  |   K  |   M  |   ,  |   .  |   /  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_COLEMAK] = {
   {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
   {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
-  {KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_BSPC},
+  {KC_TAB,  KC_Q,    KC_W,    KC_F,    KC_P,    KC_G,    KC_J,    KC_L,    KC_U,    KC_Y,    KC_SCLN, KC_DEL},
   {KC_ESC,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT},
   {KC_ESC,  KC_A,    KC_R,    KC_S,    KC_T,    KC_D,    KC_H,    KC_N,    KC_E,    KC_I,    KC_O,    KC_QUOT},
   {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT },
   {KC_LSFT, KC_Z,    KC_X,    KC_C,    KC_V,    KC_B,    KC_K,    KC_M,    KC_COMM, KC_DOT,  KC_SLSH, KC_ENT },
-  {M(0),    KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+  {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
 },
 },
-[_DV] = { /* Dvorak */
+
+/* Dvorak
+ * ,-----------------------------------------------------------------------------------.
+ * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Tab  |   "  |   ,  |   .  |   P  |   Y  |   F  |   G  |   C  |   R  |   L  | Del  |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Esc  |   A  |   O  |   E  |   U  |   I  |   D  |   H  |   T  |   N  |   S  |  /   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * | Shift|   ;  |   Q  |   J  |   K  |   X  |   B  |   M  |   W  |   V  |   Z  |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * | Brite| Ctrl | Alt  | GUI  |Lower |    Space    |Raise | Left | Down |  Up  |Right |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_DVORAK] = {
   {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
   {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
-  {KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_BSPC},
+  {KC_TAB,  KC_QUOT, KC_COMM, KC_DOT,  KC_P,    KC_Y,    KC_F,    KC_G,    KC_C,    KC_R,    KC_L,    KC_DEL},
   {KC_ESC,  KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_SLSH},
   {KC_ESC,  KC_A,    KC_O,    KC_E,    KC_U,    KC_I,    KC_D,    KC_H,    KC_T,    KC_N,    KC_S,    KC_SLSH},
   {KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_ENT },
   {KC_LSFT, KC_SCLN, KC_Q,    KC_J,    KC_K,    KC_X,    KC_B,    KC_M,    KC_W,    KC_V,    KC_Z,    KC_ENT },
-  {M(0),    KC_LCTL, KC_LALT, KC_LGUI, MO(_LW), KC_SPC,  KC_SPC,  MO(_RS), KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
+  {M(M_BL), KC_LCTL, KC_LALT, KC_LGUI, LOWER,   KC_SPC,  KC_SPC,  RAISE,   KC_LEFT, KC_DOWN, KC_UP,   KC_RGHT}
 },
 },
-[_RS] = { /* RAISE */
-  {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
-  {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
-  {KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
-  {KC_TRNS, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  DF(_QW), DF(_CM), DF(_DV), RESET,   KC_TRNS},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+
+/* Lower
+ * ,-----------------------------------------------------------------------------------.
+ * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Bksp |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |   ~  |   !  |   @  |   #  |   $  |   %  |   ^  |   &  |   *  |   (  |   )  | Del  |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   _  |   +  |   {  |   }  |  |   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |      |      |      |      |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_LOWER] = {
+  {KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
+  {KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_DEL},
+  {KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
+  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  _______, _______, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
 },
 },
-[_LW] = { /* LOWER */
+
+/* Raise
+ * ,-----------------------------------------------------------------------------------.
+ * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Bksp |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |   `  |   1  |   2  |   3  |   4  |   5  |   6  |   7  |   8  |   9  |   0  | Del  |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * | Del  |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |   -  |   =  |   [  |   ]  |  \   |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |      |      |      |      |Enter |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      | Next | Vol- | Vol+ | Play |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_RAISE] = {
   {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
   {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_BSPC},
-  {KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_CIRC, KC_AMPR, KC_ASTR, KC_LPRN, KC_RPRN, KC_BSPC},
-  {KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_UNDS, KC_PLUS, KC_LCBR, KC_RCBR, KC_PIPE},
-  {KC_TRNS, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  DF(_QW), DF(_CM), DF(_DV), RESET,   KC_TRNS},
-  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+  {KC_GRV,  KC_1,    KC_2,    KC_3,    KC_4,    KC_5,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0,    KC_DEL},
+  {KC_DEL,  KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
+  {_______, KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12,  _______, _______, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
+},
+
+/* Adjust (Lower + Raise)
+ * ,-----------------------------------------------------------------------------------.
+ * |  F1  |  F2  |  F3  |  F4  |  F5  |  F6  |  F7  |  F8  |  F9  |  F10 |  F11 |  F12 |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      | Reset|      |      |      |      |      |      |      |      |      |  Del |
+ * |------+------+------+------+------+-------------+------+------+------+------+------|
+ * |      |      |      |Audoff|Aud on|      |      |Qwerty|Colemk|Dvorak|      |      |
+ * |------+------+------+------+------+------|------+------+------+------+------+------|
+ * |      |      |      |      |      |      |      |      |      |      |      |      |
+ * |------+------+------+------+------+------+------+------+------+------+------+------|
+ * |      |      |      |      |      |             |      |      |      |      |      |
+ * `-----------------------------------------------------------------------------------'
+ */
+[_ADJUST] = {
+  {KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_F11,  KC_F12},
+  {_______, RESET,   _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_DEL},
+  {_______, _______, _______, AUD_ON,  AUD_OFF, _______, _______, QWERTY,  COLEMAK, DVORAK,  _______, _______},
+  {_______, _______, _______, MUS_ON,  MUS_OFF, _______, _______, _______, _______, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
+},
+
+/* Music (reserved for process_action_user)
+ *
+ */
+[_MUSIC] = {
+  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______},
+  {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______}
 }
 }
 };
 };
 
 
@@ -58,19 +184,103 @@ const uint16_t PROGMEM fn_actions[] = {
 
 
 };
 };
 
 
+#ifdef AUDIO_ENABLE
 float start_up[][2] = {
 float start_up[][2] = {
-  {440.0*pow(2.0,(67)/12.0), 600},
-  {440.0*pow(2.0,(64)/12.0), 400},
-  {440.0*pow(2.0,(55)/12.0), 400},
-  {440.0*pow(2.0,(60)/12.0), 400},
-  {440.0*pow(2.0,(64)/12.0), 1000},
+  {440.0*pow(2.0,(50)/12.0), 20},
+  {440.0*pow(2.0,(62)/12.0), 8},
+  {440.0*pow(2.0,(54)/12.0), 20},
+  {440.0*pow(2.0,(62)/12.0), 8}
+};
+
+float tone_qwerty[][2] = {
+  {440.0*pow(2.0,(59)/12.0), 8},
+  {440.0*pow(2.0,(60)/12.0), 8},
+  {0, 4},
+  {440.0*pow(2.0,(67)/12.0), 16}
+};
+
+float tone_colemak[][2] = {
+  {440.0*pow(2.0,(59)/12.0), 8},
+  {440.0*pow(2.0,(60)/12.0), 8},
+  {0, 4},
+  {440.0*pow(2.0,(67)/12.0), 12},
+  {0, 4},
+  {440.0*pow(2.0,(71)/12.0), 12}
+};
+
+float tone_dvorak[][2] = {
+  {440.0*pow(2.0,(59)/12.0), 8},
+  {440.0*pow(2.0,(60)/12.0), 8},
+  {0, 4},
+  {440.0*pow(2.0,(67)/12.0), 8},
+  {0, 4},
+  {440.0*pow(2.0,(69)/12.0), 8},
+  {0, 4},
+  {440.0*pow(2.0,(67)/12.0), 8}
 };
 };
 
 
+float tone_music[][2] = {
+  {440.0*pow(2.0,(48)/12.0), 8},
+  {440.0*pow(2.0,(50)/12.0), 8},
+  {440.0*pow(2.0,(52)/12.0), 8},
+  {440.0*pow(2.0,(53)/12.0), 8},
+  {440.0*pow(2.0,(55)/12.0), 8},
+  {440.0*pow(2.0,(57)/12.0), 8},
+  {440.0*pow(2.0,(59)/12.0), 8},
+  {440.0*pow(2.0,(60)/12.0), 8}
+};
+#endif
+
+
 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 {
 {
-  // MACRODOWN only works in this function
       switch(id) {
       switch(id) {
-        case 0:
+        case _QWERTY:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              play_notes(&tone_qwerty, 4, false);
+            #endif
+            eeconfig_write_default_layer(1UL<<_QWERTY);
+            default_layer_set(1UL<<_QWERTY);
+          }
+          break;
+        case _COLEMAK:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              play_notes(&tone_colemak, 6, false);
+            #endif
+            eeconfig_write_default_layer(1UL<<_COLEMAK);
+            default_layer_set(1UL<<_COLEMAK);
+          }
+          break;
+        case _DVORAK:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              play_notes(&tone_dvorak, 8, false);
+            #endif
+            eeconfig_write_default_layer(1UL<<_DVORAK);
+            default_layer_set(1UL<<_DVORAK);
+          }
+          break;
+        case _LOWER:
+          if (record->event.pressed) {
+            layer_on(_LOWER);
+            update_tri_layer(_LOWER, _RAISE, _ADJUST);
+          } else {
+            layer_off(_LOWER);
+            update_tri_layer(_LOWER, _RAISE, _ADJUST);
+          }
+          break;
+        case _RAISE:
+          if (record->event.pressed) {
+            layer_on(_RAISE);
+            update_tri_layer(_LOWER, _RAISE, _ADJUST);
+          } else {
+            layer_off(_RAISE);
+            update_tri_layer(_LOWER, _RAISE, _ADJUST);
+          }
+          break;
+        case M_BL:
           if (record->event.pressed) {
           if (record->event.pressed) {
             register_code(KC_RSFT);
             register_code(KC_RSFT);
             #ifdef BACKLIGHT_ENABLE
             #ifdef BACKLIGHT_ENABLE
@@ -80,13 +290,59 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
             unregister_code(KC_RSFT);
             unregister_code(KC_RSFT);
           }
           }
         break;
         break;
+        case 6:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              audio_off();
+            #endif
+          }
+        break;
+        case 7:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              audio_on();
+              play_notes(&start_up, 4, false);
+            #endif
+          }
+        break;
+        case 8:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              layer_off(_MUSIC);
+              stop_all_notes();
+            #endif
+          }
+        break;
+        case 9:
+          if (record->event.pressed) {
+            #ifdef AUDIO_ENABLE
+              play_notes(&tone_music, 8, false);
+              layer_on(_MUSIC);
+            #endif
+          }
+        break;
       }
       }
     return MACRO_NONE;
     return MACRO_NONE;
 };
 };
 
 
+uint8_t starting_note = 0x0C;
+int offset = 7;
+
+void process_action_user(keyrecord_t *record) {
+
+  if (IS_LAYER_ON(_MUSIC)) {
+    if (record->event.pressed) {
+        play_note(((double)261.626)*pow(2.0, -2.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
+    } else {
+        stop_note(((double)261.626)*pow(2.0, -2.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
+    }
+  }
+
+}
+
 void matrix_init_user(void) {
 void matrix_init_user(void) {
-#ifdef AUDIO_ENABLE
+  #ifdef AUDIO_ENABLE
     init_notes();
     init_notes();
-    play_notes(&start_up, 5, false);
-#endif
+    play_notes(&start_up, 4, false);
+  #endif
 }
 }

+ 1 - 0
keyboard/preonic/keymaps/default/makefile.mk

@@ -0,0 +1 @@
+AUDIO_ENABLE = yes

+ 107 - 46
quantum/audio.c

@@ -8,6 +8,8 @@
 #include "audio.h"
 #include "audio.h"
 #include "keymap_common.h"
 #include "keymap_common.h"
 
 
+#include "eeconfig.h"
+
 #define PI 3.14159265
 #define PI 3.14159265
 
 
 // #define PWM_AUDIO
 // #define PWM_AUDIO
@@ -30,6 +32,8 @@ int voice_place = 0;
 double frequency = 0;
 double frequency = 0;
 int volume = 0;
 int volume = 0;
 long position = 0;
 long position = 0;
+int duty_place = 1;
+int duty_counter = 0;
 
 
 double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
 double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
 int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
 int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
@@ -57,6 +61,25 @@ uint8_t notes_length;
 bool notes_repeat;
 bool notes_repeat;
 uint8_t current_note = 0;
 uint8_t current_note = 0;
 
 
+audio_config_t audio_config;
+
+
+void audio_toggle(void) {
+    audio_config.enable ^= 1;
+    eeconfig_write_audio(audio_config.raw);
+}
+
+void audio_on(void) {
+    audio_config.enable = 1;
+    eeconfig_write_audio(audio_config.raw);
+}
+
+void audio_off(void) {
+    audio_config.enable = 0;
+    eeconfig_write_audio(audio_config.raw);
+}
+
+
 void stop_all_notes() {
 void stop_all_notes() {
     voices = 0;
     voices = 0;
     #ifdef PWM_AUDIO
     #ifdef PWM_AUDIO
@@ -77,58 +100,66 @@ void stop_all_notes() {
 }
 }
 
 
 void stop_note(double freq) {
 void stop_note(double freq) {
-    #ifdef PWM_AUDIO
-        freq = freq / SAMPLE_RATE;
-    #endif
-    for (int i = 7; i >= 0; i--) {
-        if (frequencies[i] == freq) {
-            frequencies[i] = 0;
-            volumes[i] = 0;
-            for (int j = i; (j < 7); j++) {
-                frequencies[j] = frequencies[j+1];
-                frequencies[j+1] = 0;
-                volumes[j] = volumes[j+1];
-                volumes[j+1] = 0;
-            }
-        }
-    }
-    voices--;
-    if (voices < 0)
-        voices = 0;
-    if (voices == 0) {
+    if (note) {
         #ifdef PWM_AUDIO
         #ifdef PWM_AUDIO
-            TIMSK3 &= ~_BV(OCIE3A);
-        #else
-            TIMSK3 &= ~_BV(OCIE3A);
-            TCCR3A &= ~_BV(COM3A1);
+            freq = freq / SAMPLE_RATE;
         #endif
         #endif
-        frequency = 0;
-        volume = 0;
-        note = false;
-    } else {
-        double freq = frequencies[voices - 1];
-        int vol = volumes[voices - 1];
-        double starting_f = frequency;
-        if (frequency < freq) {
-            sliding = true;
-            for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) {
-                frequency = f;
+        for (int i = 7; i >= 0; i--) {
+            if (frequencies[i] == freq) {
+                frequencies[i] = 0;
+                volumes[i] = 0;
+                for (int j = i; (j < 7); j++) {
+                    frequencies[j] = frequencies[j+1];
+                    frequencies[j+1] = 0;
+                    volumes[j] = volumes[j+1];
+                    volumes[j+1] = 0;
+                }
             }
             }
-            sliding = false;
-        } else if (frequency > freq) {
-            sliding = true;
-            for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) {
-                frequency = f;
+        }
+        voices--;
+        if (voices < 0)
+            voices = 0;
+        if (voices == 0) {
+            #ifdef PWM_AUDIO
+                TIMSK3 &= ~_BV(OCIE3A);
+            #else
+                TIMSK3 &= ~_BV(OCIE3A);
+                TCCR3A &= ~_BV(COM3A1);
+            #endif
+            frequency = 0;
+            volume = 0;
+            note = false;
+        } else {
+            double freq = frequencies[voices - 1];
+            int vol = volumes[voices - 1];
+            double starting_f = frequency;
+            if (frequency < freq) {
+                sliding = true;
+                for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) {
+                    frequency = f;
+                }
+                sliding = false;
+            } else if (frequency > freq) {
+                sliding = true;
+                for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) {
+                    frequency = f;
+                }
+                sliding = false;
             }
             }
-            sliding = false;
+            frequency = freq;
+            volume = vol;
         }
         }
-        frequency = freq;
-        volume = vol;
     }
     }
 }
 }
 
 
 void init_notes() {
 void init_notes() {
 
 
+    /* check signature */
+    if (!eeconfig_is_enabled()) {
+        eeconfig_init();
+    }
+    audio_config.raw = eeconfig_read_audio();
+
     #ifdef PWM_AUDIO
     #ifdef PWM_AUDIO
         PLLFRQ = _BV(PDIV2);
         PLLFRQ = _BV(PDIV2);
         PLLCSR = _BV(PLLE);
         PLLCSR = _BV(PLLE);
@@ -160,7 +191,6 @@ void init_notes() {
 
 
 
 
 ISR(TIMER3_COMPA_vect) {
 ISR(TIMER3_COMPA_vect) {
-
     if (note) {
     if (note) {
         #ifdef PWM_AUDIO
         #ifdef PWM_AUDIO
             if (voices == 1) {
             if (voices == 1) {
@@ -213,13 +243,19 @@ ISR(TIMER3_COMPA_vect) {
             if (frequency > 0) {
             if (frequency > 0) {
                 // ICR3 = (int)(((double)F_CPU) / frequency); // Set max to the period
                 // ICR3 = (int)(((double)F_CPU) / frequency); // Set max to the period
                 // OCR3A = (int)(((double)F_CPU) / frequency) >> 1; // Set compare to half the period
                 // OCR3A = (int)(((double)F_CPU) / frequency) >> 1; // Set compare to half the period
-                if (place > 10) {
+                voice_place %= voices;
+                if (place > (frequencies[voice_place] / 500)) {
                     voice_place = (voice_place + 1) % voices;
                     voice_place = (voice_place + 1) % voices;
                     place = 0.0;
                     place = 0.0;
                 }
                 }
                 ICR3 = (int)(((double)F_CPU) / frequencies[voice_place]); // Set max to the period
                 ICR3 = (int)(((double)F_CPU) / frequencies[voice_place]); // Set max to the period
-                OCR3A = (int)(((double)F_CPU) / frequencies[voice_place]) >> 1; // Set compare to half the period
+                OCR3A = (int)(((double)F_CPU) / frequencies[voice_place]) >> 1 * duty_place; // Set compare to half the period
                 place++;
                 place++;
+                // if (duty_counter > (frequencies[voice_place] / 500)) {
+                //     duty_place = (duty_place % 3) + 1;
+                //     duty_counter = 0;
+                // }
+                // duty_counter++;
             }
             }
         #endif
         #endif
     }
     }
@@ -255,7 +291,12 @@ ISR(TIMER3_COMPA_vect) {
 
 
 
 
         note_position++;
         note_position++;
-        if (note_position >= note_length) {
+        bool end_of_note = false;
+        if (ICR3 > 0) 
+            end_of_note = (note_position >= (note_length / ICR3 * 0xFFFF));
+        else 
+            end_of_note = (note_position >= (note_length * 0x7FF));
+        if (end_of_note) {
             current_note++;
             current_note++;
             if (current_note >= notes_length) {
             if (current_note >= notes_length) {
                 if (notes_repeat) {
                 if (notes_repeat) {
@@ -283,9 +324,16 @@ ISR(TIMER3_COMPA_vect) {
 
 
     }
     }
 
 
+    if (!audio_config.enable) {
+        notes = false;
+        note = false;
+    }
 }
 }
 
 
 void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) {
 void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) {
+
+if (audio_config.enable) {
+
     if (note)
     if (note)
         stop_all_notes();
         stop_all_notes();
     notes = true;
     notes = true;
@@ -314,7 +362,12 @@ void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) {
     #endif
     #endif
 }
 }
 
 
+}
+
 void play_sample(uint8_t * s, uint16_t l, bool r) {
 void play_sample(uint8_t * s, uint16_t l, bool r) {
+
+if (audio_config.enable) {
+
     stop_all_notes();
     stop_all_notes();
     place_int = 0;
     place_int = 0;
     sample = s;
     sample = s;
@@ -325,9 +378,15 @@ void play_sample(uint8_t * s, uint16_t l, bool r) {
         TIMSK3 |= _BV(OCIE3A);
         TIMSK3 |= _BV(OCIE3A);
     #else
     #else
     #endif
     #endif
+
+}
+
 }
 }
 
 
 void play_note(double freq, int vol) {
 void play_note(double freq, int vol) {
+
+if (audio_config.enable && voices < 8) {
+
     if (notes)
     if (notes)
         stop_all_notes();
         stop_all_notes();
     note = true;
     note = true;
@@ -362,4 +421,6 @@ void play_note(double freq, int vol) {
         TCCR3A |= _BV(COM3A1);
         TCCR3A |= _BV(COM3A1);
     #endif
     #endif
 
 
+}
+
 }
 }

+ 13 - 1
quantum/audio.h

@@ -3,9 +3,21 @@
 #include <avr/io.h>
 #include <avr/io.h>
 #include <util/delay.h>
 #include <util/delay.h>
 
 
+typedef union {
+    uint8_t raw;
+    struct {
+        bool    enable :1;
+        uint8_t level  :7;
+    };
+} audio_config_t;
+
+void audio_toggle(void);
+void audio_on(void);
+void audio_off(void);
+
 void play_sample(uint8_t * s, uint16_t l, bool r);
 void play_sample(uint8_t * s, uint16_t l, bool r);
 void play_note(double freq, int vol);
 void play_note(double freq, int vol);
 void stop_note(double freq);
 void stop_note(double freq);
 void stop_all_notes();
 void stop_all_notes();
 void init_notes();
 void init_notes();
-void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat);
+void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat);

+ 12 - 6
quantum/keymap_common.c

@@ -33,11 +33,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
     #include "audio.h"
     #include "audio.h"
 
 
     float goodbye[][2] = {
     float goodbye[][2] = {
-        {440.0*pow(2.0,(67)/12.0), 400},
-        {0, 50},
-        {440.0*pow(2.0,(60)/12.0), 400},
-        {0, 50},
-        {440.0*pow(2.0,(55)/12.0), 600},
+        {440.0*pow(2.0,(67)/12.0), 8},
+        {440.0*pow(2.0,(60)/12.0), 8},
+        {440.0*pow(2.0,(55)/12.0), 12},
     };
     };
 #endif
 #endif
 
 
@@ -90,7 +88,7 @@ action_t action_for_key(uint8_t layer, keypos_t key)
     	action_t action;
     	action_t action;
         clear_keyboard();
         clear_keyboard();
         #ifdef AUDIO_ENABLE
         #ifdef AUDIO_ENABLE
-            play_notes(&goodbye, 5, false);
+            play_notes(&goodbye, 3, false);
         #endif
         #endif
         _delay_ms(250);
         _delay_ms(250);
         #ifdef ATREUS_ASTAR
         #ifdef ATREUS_ASTAR
@@ -293,3 +291,11 @@ action_t keymap_func_to_action(uint16_t keycode)
 	// For FUNC without 8bit limit
 	// For FUNC without 8bit limit
     return (action_t){ .code = pgm_read_word(&fn_actions[(int)keycode]) };
     return (action_t){ .code = pgm_read_word(&fn_actions[(int)keycode]) };
 }
 }
+
+void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3) {
+  if (IS_LAYER_ON(layer1) && IS_LAYER_ON(layer2)) {
+    layer_on(layer3);
+  } else {
+    layer_off(layer3);
+  }
+}

+ 4 - 0
quantum/keymap_common.h

@@ -208,5 +208,9 @@ extern const uint16_t fn_actions[];
 #define UNICODE(n) (n | 0x8000)
 #define UNICODE(n) (n | 0x8000)
 #define UC(n) UNICODE(n)
 #define UC(n) UNICODE(n)
 
 
+// For tri-layer
+void update_tri_layer(uint8_t layer1, uint8_t layer2, uint8_t layer3);
+#define IS_LAYER_ON(layer)  ((layer_state) & (1UL<<(layer)))
+#define IS_LAYER_OFF(layer) ((!layer_state) & (1UL<<(layer)))
 
 
 #endif
 #endif

+ 5 - 4
quantum/quantum.mk

@@ -23,19 +23,19 @@ ifndef CUSTOM_MATRIX
 	SRC += $(QUANTUM_DIR)/matrix.c
 	SRC += $(QUANTUM_DIR)/matrix.c
 endif
 endif
 
 
-ifdef MIDI_ENABLE
+ifeq ($(strip $(MIDI_ENABLE)), yes)
 	SRC += $(QUANTUM_DIR)/keymap_midi.c
 	SRC += $(QUANTUM_DIR)/keymap_midi.c
 endif
 endif
 
 
-ifdef AUDIO_ENABLE
+ifeq ($(strip $(AUDIO_ENABLE)), yes)
 	SRC += $(QUANTUM_DIR)/audio.c
 	SRC += $(QUANTUM_DIR)/audio.c
 endif
 endif
 
 
-ifdef UNICODE_ENABLE
+ifeq ($(strip $(UNICODE_ENABLE)), yes)
 	SRC += $(QUANTUM_DIR)/keymap_unicode.c
 	SRC += $(QUANTUM_DIR)/keymap_unicode.c
 endif
 endif
 
 
-ifdef RGBLIGHT_ENABLE
+ifeq ($(strip $(RGBLIGHT_ENABLE)), yes)
 	SRC += $(QUANTUM_DIR)/light_ws2812.c
 	SRC += $(QUANTUM_DIR)/light_ws2812.c
 	SRC += $(QUANTUM_DIR)/rgblight.c
 	SRC += $(QUANTUM_DIR)/rgblight.c
 	OPT_DEFS += -DRGBLIGHT_ENABLE
 	OPT_DEFS += -DRGBLIGHT_ENABLE
@@ -46,6 +46,7 @@ endif
 
 
 # Search Path
 # Search Path
 VPATH += $(TOP_DIR)/$(QUANTUM_DIR)
 VPATH += $(TOP_DIR)/$(QUANTUM_DIR)
+VPATH += $(TOP_DIR)/$(QUANTUM_DIR)/keymap_extras
 
 
 include $(TMK_DIR)/protocol/lufa.mk
 include $(TMK_DIR)/protocol/lufa.mk
 
 

+ 6 - 0
quantum/tools/README.md

@@ -0,0 +1,6 @@
+`eeprom_reset.hex` is to reset the eeprom on the Atmega32u4, like this:
+
+    dfu-programmer atmega32u4 erase
+    dfu-programmer atmega32u4 flash --eeprom eeprom-reset.bin
+
+ You'll need to reflash afterwards, because DFU requires the flash to be erased before messing with the eeprom.

+ 9 - 0
quantum/tools/eeprom_reset.hex

@@ -0,0 +1,9 @@
+:10000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00
+:10001000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
+:10002000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0
+:10003000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0
+:10004000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0
+:10005000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB0
+:10006000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA0
+:10007000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF90
+:00000001FF

+ 14 - 13
tmk_core/common.mk

@@ -17,66 +17,67 @@ SRC +=	$(COMMON_DIR)/host.c \
 
 
 
 
 # Option modules
 # Option modules
-ifdef BOOTMAGIC_ENABLE
+ifeq ($(strip $(BOOTMAGIC_ENABLE)), yes)
     SRC += $(COMMON_DIR)/bootmagic.c
     SRC += $(COMMON_DIR)/bootmagic.c
     SRC += $(COMMON_DIR)/avr/eeconfig.c
     SRC += $(COMMON_DIR)/avr/eeconfig.c
     OPT_DEFS += -DBOOTMAGIC_ENABLE
     OPT_DEFS += -DBOOTMAGIC_ENABLE
 endif
 endif
 
 
-ifdef MOUSEKEY_ENABLE
+ifeq ($(strip $(MOUSEKEY_ENABLE)), yes)
     SRC += $(COMMON_DIR)/mousekey.c
     SRC += $(COMMON_DIR)/mousekey.c
     OPT_DEFS += -DMOUSEKEY_ENABLE
     OPT_DEFS += -DMOUSEKEY_ENABLE
     OPT_DEFS += -DMOUSE_ENABLE
     OPT_DEFS += -DMOUSE_ENABLE
 endif
 endif
 
 
-ifdef EXTRAKEY_ENABLE
+ifeq ($(strip $(EXTRAKEY_ENABLE)), yes)
     OPT_DEFS += -DEXTRAKEY_ENABLE
     OPT_DEFS += -DEXTRAKEY_ENABLE
 endif
 endif
 
 
-ifdef CONSOLE_ENABLE
+ifeq ($(strip $(CONSOLE_ENABLE)), yes)
     OPT_DEFS += -DCONSOLE_ENABLE
     OPT_DEFS += -DCONSOLE_ENABLE
 else
 else
     OPT_DEFS += -DNO_PRINT
     OPT_DEFS += -DNO_PRINT
     OPT_DEFS += -DNO_DEBUG
     OPT_DEFS += -DNO_DEBUG
 endif
 endif
 
 
-ifdef COMMAND_ENABLE
+ifeq ($(strip $(COMMAND_ENABLE)), yes)
     SRC += $(COMMON_DIR)/command.c
     SRC += $(COMMON_DIR)/command.c
     OPT_DEFS += -DCOMMAND_ENABLE
     OPT_DEFS += -DCOMMAND_ENABLE
 endif
 endif
 
 
-ifdef NKRO_ENABLE
+ifeq ($(strip $(NKRO_ENABLE)), yes)
     OPT_DEFS += -DNKRO_ENABLE
     OPT_DEFS += -DNKRO_ENABLE
 endif
 endif
 
 
-ifdef MIDI_ENABLE
+ifeq ($(strip $(MIDI_ENABLE)), yes)
     OPT_DEFS += -DMIDI_ENABLE
     OPT_DEFS += -DMIDI_ENABLE
 endif
 endif
 
 
-ifdef AUDIO_ENABLE
+ifeq ($(strip $(AUDIO_ENABLE)), yes)
     OPT_DEFS += -DAUDIO_ENABLE
     OPT_DEFS += -DAUDIO_ENABLE
 endif
 endif
 
 
-ifdef USB_6KRO_ENABLE
+ifeq ($(strip $(USB_6KRO_ENABLE)), yes)
     OPT_DEFS += -DUSB_6KRO_ENABLE
     OPT_DEFS += -DUSB_6KRO_ENABLE
 endif
 endif
 
 
-ifdef SLEEP_LED_ENABLE
+ifeq ($(strip $(SLEEP_LED_ENABLE)), yes)
     SRC += $(COMMON_DIR)/sleep_led.c
     SRC += $(COMMON_DIR)/sleep_led.c
     OPT_DEFS += -DSLEEP_LED_ENABLE
     OPT_DEFS += -DSLEEP_LED_ENABLE
     OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
     OPT_DEFS += -DNO_SUSPEND_POWER_DOWN
 endif
 endif
 
 
-ifdef BACKLIGHT_ENABLE
+ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
     SRC += $(COMMON_DIR)/backlight.c
     SRC += $(COMMON_DIR)/backlight.c
+    SRC += $(COMMON_DIR)/avr/eeconfig.c
     OPT_DEFS += -DBACKLIGHT_ENABLE
     OPT_DEFS += -DBACKLIGHT_ENABLE
 endif
 endif
 
 
-ifdef BLUETOOTH_ENABLE
+ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
     OPT_DEFS += -DBLUETOOTH_ENABLE
     OPT_DEFS += -DBLUETOOTH_ENABLE
 endif
 endif
 
 
-ifdef KEYMAP_SECTION_ENABLE
+ifeq ($(strip $(KEYMAP_SECTION_ENABLE)), yes)
     OPT_DEFS += -DKEYMAP_SECTION_ENABLE
     OPT_DEFS += -DKEYMAP_SECTION_ENABLE
 
 
     ifeq ($(strip $(MCU)),atmega32u2)
     ifeq ($(strip $(MCU)),atmega32u2)

+ 8 - 0
tmk_core/common/avr/eeconfig.c

@@ -13,6 +13,9 @@ void eeconfig_init(void)
 #ifdef BACKLIGHT_ENABLE
 #ifdef BACKLIGHT_ENABLE
     eeprom_write_byte(EECONFIG_BACKLIGHT,      0);
     eeprom_write_byte(EECONFIG_BACKLIGHT,      0);
 #endif
 #endif
+#ifdef AUDIO_ENABLE
+    eeprom_write_byte(EECONFIG_AUDIO,      	   0xFF); // On by default
+#endif
 }
 }
 
 
 void eeconfig_enable(void)
 void eeconfig_enable(void)
@@ -43,3 +46,8 @@ void eeconfig_write_keymap(uint8_t val) { eeprom_write_byte(EECONFIG_KEYMAP, val
 uint8_t eeconfig_read_backlight(void)      { return eeprom_read_byte(EECONFIG_BACKLIGHT); }
 uint8_t eeconfig_read_backlight(void)      { return eeprom_read_byte(EECONFIG_BACKLIGHT); }
 void eeconfig_write_backlight(uint8_t val) { eeprom_write_byte(EECONFIG_BACKLIGHT, val); }
 void eeconfig_write_backlight(uint8_t val) { eeprom_write_byte(EECONFIG_BACKLIGHT, val); }
 #endif
 #endif
+
+#ifdef AUDIO_ENABLE
+uint8_t eeconfig_read_audio(void)      { return eeprom_read_byte(EECONFIG_AUDIO); }
+void eeconfig_write_audio(uint8_t val) { eeprom_write_byte(EECONFIG_AUDIO, val); }
+#endif

+ 6 - 0
tmk_core/common/eeconfig.h

@@ -31,6 +31,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #define EECONFIG_KEYMAP                             (uint8_t *)4
 #define EECONFIG_KEYMAP                             (uint8_t *)4
 #define EECONFIG_MOUSEKEY_ACCEL                     (uint8_t *)5
 #define EECONFIG_MOUSEKEY_ACCEL                     (uint8_t *)5
 #define EECONFIG_BACKLIGHT                          (uint8_t *)6
 #define EECONFIG_BACKLIGHT                          (uint8_t *)6
+#define EECONFIG_AUDIO                              (uint8_t *)7
 
 
 
 
 /* debug bit */
 /* debug bit */
@@ -72,4 +73,9 @@ uint8_t eeconfig_read_backlight(void);
 void eeconfig_write_backlight(uint8_t val);
 void eeconfig_write_backlight(uint8_t val);
 #endif
 #endif
 
 
+#ifdef AUDIO_ENABLE
+uint8_t eeconfig_read_audio(void);
+void eeconfig_write_audio(uint8_t val);
+#endif
+
 #endif
 #endif

+ 2 - 2
tmk_core/protocol/lufa.mk

@@ -17,7 +17,7 @@ LUFA_SRC = $(LUFA_DIR)/lufa.c \
 	   $(LUFA_DIR)/descriptor.c \
 	   $(LUFA_DIR)/descriptor.c \
 	   $(LUFA_SRC_USB)
 	   $(LUFA_SRC_USB)
 
 
-ifdef MIDI_ENABLE
+ifeq ($(strip $(MIDI_ENABLE)), yes)
 	LUFA_SRC += $(LUFA_DIR)/midi/midi.c \
 	LUFA_SRC += $(LUFA_DIR)/midi/midi.c \
 	   $(LUFA_DIR)/midi/midi_device.c \
 	   $(LUFA_DIR)/midi/midi_device.c \
 	   $(LUFA_DIR)/midi/bytequeue/bytequeue.c \
 	   $(LUFA_DIR)/midi/bytequeue/bytequeue.c \
@@ -25,7 +25,7 @@ ifdef MIDI_ENABLE
 	   $(LUFA_SRC_USBCLASS)
 	   $(LUFA_SRC_USBCLASS)
 endif
 endif
 
 
-ifdef BLUETOOTH_ENABLE
+ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
 	LUFA_SRC += $(LUFA_DIR)/bluetooth.c \
 	LUFA_SRC += $(LUFA_DIR)/bluetooth.c \
 	$(TMK_DIR)/protocol/serial_uart.c
 	$(TMK_DIR)/protocol/serial_uart.c
 endif
 endif