Merge pull request #104 from jackhumbert/smarkefile
Rework Planck file structure
This commit is contained in:
		
						commit
						9a1ae948c9
					
				
					 34 changed files with 958 additions and 441 deletions
				
			
		| 
						 | 
				
			
			@ -8,29 +8,6 @@
 | 
			
		|||
#define MDIA 2 // media keys
 | 
			
		||||
 | 
			
		||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		||||
/* Keymap 0: Basic layer
 | 
			
		||||
 *
 | 
			
		||||
 * ,--------------------------------------------------.           ,--------------------------------------------------.
 | 
			
		||||
 * |   =    |   1  |   2  |   3  |   4  |   5  | LEFT |           | RIGHT|   6  |   7  |   8  |   9  |   0  |   -    |
 | 
			
		||||
 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 | 
			
		||||
 * | Del    |   Q  |   W  |   E  |   R  |   T  |  L1  |           |  L1  |   Y  |   U  |   I  |   O  |   P  |   \    |
 | 
			
		||||
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 | 
			
		||||
 * | BkSp   |   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |; / L2|   '    |
 | 
			
		||||
 * |--------+------+------+------+------+------| Hyper|           | Meh  |------+------+------+------+------+--------|
 | 
			
		||||
 * | LShift |Z/Ctrl|   X  |   C  |   V  |   B  |      |           |      |   N  |   M  |   ,  |   .  |//Ctrl| RShift |
 | 
			
		||||
 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 | 
			
		||||
 *   |Grv/L1|  '"  |AltShf| Left | Right|                                       |  Up  | Down |   [  |   ]  | ~L1  |
 | 
			
		||||
 *   `----------------------------------'                                       `----------------------------------'
 | 
			
		||||
 *                                        ,-------------.       ,-------------.
 | 
			
		||||
 *                                        | App  | LGui |       | Alt  |Ctrl/Esc|
 | 
			
		||||
 *                                 ,------|------|------|       |------+--------+------.
 | 
			
		||||
 *                                 |      |      | Home |       | PgUp |        |      |
 | 
			
		||||
 *                                 | Space|Backsp|------|       |------|  Tab   |Enter |
 | 
			
		||||
 *                                 |      |ace   | End  |       | PgDn |        |      |
 | 
			
		||||
 *                                 `--------------------'       `----------------------'
 | 
			
		||||
 */
 | 
			
		||||
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
 | 
			
		||||
// Otherwise, it needs KC_*
 | 
			
		||||
[BASE] = KEYMAP(  // layer 0 : default
 | 
			
		||||
        // left hand
 | 
			
		||||
        KC_NO,          KC_1,         KC_2,   KC_3,   KC_4,   KC_5,   KC_NO,
 | 
			
		||||
| 
						 | 
				
			
			@ -51,28 +28,6 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
             KC_PGUP,
 | 
			
		||||
             KC_PGDN, KC_SPC,KC_SPC
 | 
			
		||||
    ),
 | 
			
		||||
/* Keymap 1: Symbol Layer
 | 
			
		||||
 *
 | 
			
		||||
 * ,--------------------------------------------------.           ,--------------------------------------------------.
 | 
			
		||||
 * |        |  F1  |  F2  |  F3  |  F4  |  F5  |      |           |      |  F6  |  F7  |  F8  |  F9  |  F10 |   F11  |
 | 
			
		||||
 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 | 
			
		||||
 * |        |   !  |   @  |   {  |   }  |   |  |      |           |      |   Up |   7  |   8  |   9  |   *  |   F12  |
 | 
			
		||||
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 | 
			
		||||
 * |        |   #  |   $  |   (  |   )  |   `  |------|           |------| Down |   4  |   5  |   6  |   +  |        |
 | 
			
		||||
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 | 
			
		||||
 * |        |   %  |   ^  |   [  |   ]  |   ~  |      |           |      |   &  |   1  |   2  |   3  |   \  |        |
 | 
			
		||||
 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 | 
			
		||||
 *   |      |      |      |      |      |                                       |      |    . |   0  |   =  |      |
 | 
			
		||||
 *   `----------------------------------'                                       `----------------------------------'
 | 
			
		||||
 *                                        ,-------------.       ,-------------.
 | 
			
		||||
 *                                        |      |      |       |      |      |
 | 
			
		||||
 *                                 ,------|------|------|       |------+------+------.
 | 
			
		||||
 *                                 |      |      |      |       |      |      |      |
 | 
			
		||||
 *                                 |      |      |------|       |------|      |      |
 | 
			
		||||
 *                                 |      |      |      |       |      |      |      |
 | 
			
		||||
 *                                 `--------------------'       `--------------------'
 | 
			
		||||
 */
 | 
			
		||||
// SYMBOLS
 | 
			
		||||
[SYMB] = KEYMAP(
 | 
			
		||||
       // left hand
 | 
			
		||||
       KC_TRNS,KC_F1,  KC_F2,  KC_F3,  KC_F4,  KC_F5,  KC_TRNS,
 | 
			
		||||
| 
						 | 
				
			
			@ -93,29 +48,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		|||
       KC_TRNS,
 | 
			
		||||
       KC_TRNS, KC_TRNS, KC_TRNS
 | 
			
		||||
),
 | 
			
		||||
/* Keymap 2: Media and mouse keys
 | 
			
		||||
 *
 | 
			
		||||
 * ,--------------------------------------------------.           ,--------------------------------------------------.
 | 
			
		||||
 * |        |      |      |      |      |      |      |           |      |      |      |      |      |      |        |
 | 
			
		||||
 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 | 
			
		||||
 * |        |      |      | MsUp |      |      |      |           |      |      |      |      |      |      |        |
 | 
			
		||||
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 | 
			
		||||
 * |        |      |MsLeft|MsDown|MsRght|      |------|           |------|      |      |      |      |      |  Play  |
 | 
			
		||||
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 | 
			
		||||
 * |        |      |      |      |      |      |      |           |      |      |      | Prev | Next |      |        |
 | 
			
		||||
 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 | 
			
		||||
 *   |      |      |      | Lclk | Rclk |                                       |VolUp |VolDn | Mute |      |      |
 | 
			
		||||
 *   `----------------------------------'                                       `----------------------------------'
 | 
			
		||||
 *                                        ,-------------.       ,-------------.
 | 
			
		||||
 *                                        |      |      |       |      |      |
 | 
			
		||||
 *                                 ,------|------|------|       |------+------+------.
 | 
			
		||||
 *                                 |      |      |      |       |      |      |Brwser|
 | 
			
		||||
 *                                 |      |      |------|       |------|      |Back  |
 | 
			
		||||
 *                                 |      |      |      |       |      |      |      |
 | 
			
		||||
 *                                 `--------------------'       `--------------------'
 | 
			
		||||
 */
 | 
			
		||||
// MEDIA AND MOUSE
 | 
			
		||||
KEYMAP(
 | 
			
		||||
[MDIA] = KEYMAP(
 | 
			
		||||
       KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
 | 
			
		||||
       KC_TILD, KC_EXLM, KC_AT,   KC_HASH, KC_DLR,  KC_PERC, KC_TRNS,
 | 
			
		||||
       KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,  
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										78
									
								
								keyboard/ergodox_ez/keymaps/keymap_generated.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								keyboard/ergodox_ez/keymaps/keymap_generated.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,78 @@
 | 
			
		|||
#include "ergodox_ez.h"
 | 
			
		||||
#include "debug.h"
 | 
			
		||||
#include "action_layer.h"
 | 
			
		||||
 | 
			
		||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		||||
 | 
			
		||||
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
 | 
			
		||||
// Otherwise, it needs KC_*
 | 
			
		||||
 | 
			
		||||
#define SYMB 0
 | 
			
		||||
 | 
			
		||||
[0] = KEYMAP( \
 | 
			
		||||
\
 | 
			
		||||
KC_KP_EQUAL, KC_1, KC_2, KC_3, KC_4, KC_5, KC_LEFT, KC_DELETE, KC_Q, KC_W, KC_E, KC_R, KC_T, TG(1), KC_BSPACE, KC_A, KC_S, KC_D, KC_F, KC_G, KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TAB, KC_LEFT, KC_RIGHT, KC_TRANSPARENT, KC_LGUI, KC_HOME, KC_SPACE, KC_BSPACE, KC_END, KC_RIGHT, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINUS, TG(1), KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSLASH, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_QUOTE, KC_TRANSPARENT, KC_N, KC_M, KC_COMMA, KC_DOT, KC_LCTRL, KC_LSHIFT, KC_UP, KC_DOWN, KC_LBRACKET, KC_RBRACKET, KC_TRANSPARENT, KC_LALT, KC_ESCAPE, KC_PGUP, KC_PGDOWN, KC_TAB, KC_ENTER \
 | 
			
		||||
\
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
[1] = KEYMAP( \
 | 
			
		||||
\
 | 
			
		||||
KC_TRANSPARENT, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_TRANSPARENT, KC_UP, KC_KP_7, KC_KP_8, KC_KP_9, KC_KP_ASTERISK, KC_F12, KC_DOWN, KC_KP_4, KC_KP_5, KC_KP_6, KC_KP_PLUS, KC_TRANSPARENT, KC_TRANSPARENT, , KC_KP_1, KC_KP_2, KC_KP_3, KC_KP_SLASH, KC_TRANSPARENT, KC_TRANSPARENT, KC_KP_DOT, KC_KP_0, KC_KP_EQUAL, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT \
 | 
			
		||||
\
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
[2] = KEYMAP( \
 | 
			
		||||
\
 | 
			
		||||
KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_UP, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MS_BTN3, KC_MS_BTN2, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MEDIA_PLAY_PAUSE, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_MEDIA_PREV_TRACK, KC_MEDIA_NEXT_TRACK, KC_TRANSPARENT, KC_TRANSPARENT, KC_AUDIO_VOL_UP, KC_AUDIO_VOL_DOWN, KC_AUDIO_MUTE, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT \
 | 
			
		||||
\
 | 
			
		||||
),
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const uint16_t PROGMEM fn_actions[] = {
 | 
			
		||||
    [1] = ACTION_LAYER_TAP_TOGGLE(SYMB)                // FN1 - Momentary Layer 1 (Symbols)
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
        } else {
 | 
			
		||||
          unregister_code(KC_RSFT);
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    return MACRO_NONE;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Runs just one time when the keyboard initializes.
 | 
			
		||||
void * matrix_init_user(void) {
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Runs constantly in the background, in a loop.
 | 
			
		||||
void * matrix_scan_user(void) {
 | 
			
		||||
 | 
			
		||||
    uint8_t layer = biton32(layer_state);
 | 
			
		||||
 | 
			
		||||
    ergodox_board_led_off();
 | 
			
		||||
    ergodox_right_led_1_off();
 | 
			
		||||
    ergodox_right_led_2_off();
 | 
			
		||||
    ergodox_right_led_3_off();
 | 
			
		||||
    switch (layer) {
 | 
			
		||||
      // TODO: Make this relevant to the ErgoDox EZ.
 | 
			
		||||
        case 1:
 | 
			
		||||
            ergodox_right_led_1_on();
 | 
			
		||||
            break;
 | 
			
		||||
        case 2:
 | 
			
		||||
            ergodox_right_led_2_on();
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            // none
 | 
			
		||||
            break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -50,14 +50,30 @@ TMK_DIR = ../../tmk_core
 | 
			
		|||
TARGET_DIR = .
 | 
			
		||||
 | 
			
		||||
# # project specific files
 | 
			
		||||
SRC = planck.c \
 | 
			
		||||
	backlight.c 
 | 
			
		||||
SRC = planck.c
 | 
			
		||||
 | 
			
		||||
ifdef keymap
 | 
			
		||||
	KEYMAP = $(keymap)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifdef KEYMAP
 | 
			
		||||
    SRC := keymaps/keymap_$(KEYMAP).c $(SRC)
 | 
			
		||||
ifneq ("$(wildcard keymaps/$(KEYMAP).c)","")
 | 
			
		||||
	KEYMAP_FILE = keymaps/$(KEYMAP).c
 | 
			
		||||
else
 | 
			
		||||
    SRC := keymaps/keymap_default.c $(SRC)
 | 
			
		||||
ifneq ("$(wildcard keymaps/$(KEYMAP)/keymap.c)","")
 | 
			
		||||
	KEYMAP_FILE = keymaps/$(KEYMAP)/keymap.c
 | 
			
		||||
else
 | 
			
		||||
$(error Keymap file does not exist)
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
else
 | 
			
		||||
ifneq ("$(wildcard keymaps/default.c)","")
 | 
			
		||||
	KEYMAP_FILE = keymaps/default.c
 | 
			
		||||
else
 | 
			
		||||
	KEYMAP_FILE = keymaps/default/keymap.c
 | 
			
		||||
endif
 | 
			
		||||
endif
 | 
			
		||||
SRC := $(KEYMAP_FILE) $(SRC)
 | 
			
		||||
 | 
			
		||||
CONFIG_H = config.h
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -122,11 +138,15 @@ COMMAND_ENABLE = yes    # Commands for debug and configuration
 | 
			
		|||
# 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
 | 
			
		||||
# 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
 | 
			
		||||
 | 
			
		||||
ifdef BACKLIGHT_ENABLE
 | 
			
		||||
	SRC += backlight.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
# Optimize size but this may cause error "relocation truncated to fit"
 | 
			
		||||
#EXTRALDFLAGS = -Wl,--relax
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,29 +3,42 @@ Planck keyboard firmware
 | 
			
		|||
DIY/Assembled compact ortholinear 40% keyboard by [Ortholinear Keyboards](http://ortholinearkeyboards.com).
 | 
			
		||||
 | 
			
		||||
## Quantum MK Firmware
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
    MIDI_ENABLE = yes      # MIDI controls
 | 
			
		||||
    # UNICODE_ENABLE = yes # Unicode support
 | 
			
		||||
    # UNICODE_ENABLE = yes # Unicode support - this is commented out, just as an example. You have to use #, not //
 | 
			
		||||
    BLUETOOTH_ENABLE = yes # Enable Bluetooth with the Adafruit EZ-Key HID
 | 
			
		||||
 | 
			
		||||
### Mod shortcuts
 | 
			
		||||
## Quick aliases to common actions
 | 
			
		||||
 | 
			
		||||
* `LSFT(kc)` - applies left shift to *kc* - `S(kc)` is an alias
 | 
			
		||||
* `RSFT(kc)` - applies right shift to *kc*
 | 
			
		||||
* `LCTL(kc)` - applies left control to *kc*
 | 
			
		||||
* `RCTL(kc)` - applies right control to *kc*
 | 
			
		||||
* `LALT(kc)` - applies left alt to *kc*
 | 
			
		||||
* `RALT(kc)` - applies right alt to *kc*
 | 
			
		||||
* `LGUI(kc)` - applies left gui (command/win) to *kc*
 | 
			
		||||
* `RGUI(kc)` - applies right gui (command/win) to *kc*
 | 
			
		||||
Your keymap can include shortcuts to common operations (called "function actions" in tmk).
 | 
			
		||||
 | 
			
		||||
You can also use more than one, like this:
 | 
			
		||||
### Switching and toggling layers
 | 
			
		||||
 | 
			
		||||
    LALT(LGUI(KC_ESC))
 | 
			
		||||
`MO(layer)` - momentary switch to *layer*. As soon as you let go of the key, the layer is deactivated and you pop back out to the previous layer. When you apply this to a key, that same key must be set as `KC_TRNS` on the destination layer. Otherwise, you won't make it back to the original layer when you release the key (and you'll get a keycode sent). You can only switch to layers *above* your current layer. If you're on layer 0 and you use `MO(1)`, that will switch to layer 1 just fine. But if you include `MO(3)` on layer 5, that won't do anything for you -- because layer 3 is lower than layer 5 on the stack.
 | 
			
		||||
 | 
			
		||||
The following shortcuts automatically add `LSFT()` to keycodes to get commonly used symbols. Their long names (see `quantum/keymap_common.h`) are also availble.
 | 
			
		||||
`LT(layer, kc)` - momentary switch to *layer* when held, and *kc* when tapped. Like `MO()`, this only works upwards in the layer stack (`layer` must be higher than the current layer).
 | 
			
		||||
 | 
			
		||||
`TG(layer)` - toggles a layer on or off. As with `MO()`, you should set this key as `KC_TRNS` in the destination layer so that tapping it again actually toggles back to the original layer. Only works upwards in the layer stack.
 | 
			
		||||
 | 
			
		||||
### Fun with modifier keys
 | 
			
		||||
 | 
			
		||||
* `LSFT(kc)` - applies left Shift to *kc* (keycode) - `S(kc)` is an alias
 | 
			
		||||
* `RSFT(kc)` - applies right Shift to *kc*
 | 
			
		||||
* `LCTL(kc)` - applies left Control to *kc*
 | 
			
		||||
* `RCTL(kc)` - applies right Control to *kc*
 | 
			
		||||
* `LALT(kc)` - applies left Alt to *kc*
 | 
			
		||||
* `RALT(kc)` - applies right Alt to *kc*
 | 
			
		||||
* `LGUI(kc)` - applies left GUI (command/win) to *kc*
 | 
			
		||||
* `RGUI(kc)` - applies right GUI (command/win) to *kc*
 | 
			
		||||
 | 
			
		||||
You can also chain these, like this:
 | 
			
		||||
 | 
			
		||||
    LALT(LCTL(KC_DEL)) -- this makes a key that sends Alt, Control, and Delete in a single keypress.
 | 
			
		||||
 | 
			
		||||
The following shortcuts automatically add `LSFT()` to keycodes to get commonly used symbols. Their long names are also available and documented in `/quantum/keymap_common.h`.
 | 
			
		||||
 | 
			
		||||
    KC_TILD  ~
 | 
			
		||||
    KC_EXLM  !
 | 
			
		||||
| 
						 | 
				
			
			@ -45,31 +58,71 @@ The following shortcuts automatically add `LSFT()` to keycodes to get commonly u
 | 
			
		|||
    KC_PIPE  |
 | 
			
		||||
    KC_COLN  :
 | 
			
		||||
 | 
			
		||||
### Function shortcuts
 | 
			
		||||
`MT(mod, kc)` - is *mod* (modifier key - MOD_LCTL, MOD_LSFT) when held, and *kc* when tapped. In other words, you can have a key that sends Esc (or the letter O or whatever) when you tap it, but works as a Control key or a Shift key when you hold it down. 
 | 
			
		||||
 | 
			
		||||
Instead of using `FNx`, you can use `F(x)` - the benefit here is being able to use more than 32 function layers (up to 4096), if you happen to need them.
 | 
			
		||||
These are the values you can use for the `mod` in `MT()` (right-hand modifiers are not available):
 | 
			
		||||
 | 
			
		||||
There are also keycode shortcuts for common actions:
 | 
			
		||||
  * MOD_LCTL
 | 
			
		||||
  * MOD_LSFT
 | 
			
		||||
  * MOD_LALT
 | 
			
		||||
  * MOD_LGUI
 | 
			
		||||
 | 
			
		||||
These can also be combined like `MOD_LCTL | MOD_LSFT` e.g. `MT(MOD_LCTL | MOD_LSFT, KC_ESC)` which would activate Control and Shift when held, and send Escape when tapped.
 | 
			
		||||
 | 
			
		||||
We've added shortcuts to make common modifier/tap (mod-tap) mappings more compact:
 | 
			
		||||
 | 
			
		||||
* `MO(layer)` - momentary switch to *layer*
 | 
			
		||||
* `DF(layer)` - sets default layer to *layer*
 | 
			
		||||
* `TG(layer)` - toggle between the current layer and *layer*
 | 
			
		||||
* `MT(mod, kc)` - is *mod* when held, and *kc* when tapped
 | 
			
		||||
  * `CTL_T(kc)` - is LCTL when held and *kc* when tapped 
 | 
			
		||||
  * `SFT_T(kc)` - is LSFT when held and *kc* when tapped 
 | 
			
		||||
  * `ALT_T(kc)` - is LALT when held and *kc* when tapped 
 | 
			
		||||
  * `GUI_T(kc)` - is LGUI when held and *kc* when tapped 
 | 
			
		||||
  * `ALL_T(kc)` - is Hyper (all mods) when held and *kc* when tapped 
 | 
			
		||||
* `LT(layer, kc)` - momentary switch to *layer* when held, and *kc* when tapped
 | 
			
		||||
  * `ALL_T(kc)` - is Hyper (all mods) when held and *kc* when tapped. To read more about what you can do with a Hyper key, see [this blog post by Brett Terpstra](http://brettterpstra.com/2012/12/08/a-useful-caps-lock-key/)
 | 
			
		||||
 | 
			
		||||
These functions work the same way that their `ACTION_*` functions do, and will require KC_TRNS on the layer being switched to - check out the default keymap for an example.
 | 
			
		||||
### Temporarily setting the default layer 
 | 
			
		||||
 | 
			
		||||
### Additional keycodes for software-implemented layouts (Colemak, Dvorak, etc)
 | 
			
		||||
`DF(layer)` - sets default layer to *layer*. The default layer is the one at the "bottom" of the layer stack - the ultimate fallback layer. This currently does not persist over power loss. When you plug the keyboard back in, layer 0 will always be the default. It is theoretically possible to work around that, but that's not what `DF` does.
 | 
			
		||||
 | 
			
		||||
### Remember: These are just aliases
 | 
			
		||||
 | 
			
		||||
These functions work the same way that their `ACTION_*` functions do - they're just quick aliases. To dig into all of the tmk ACTION_* functions, please see the [TMK documentation](https://github.com/jackhumbert/qmk_firmware/blob/master/tmk_core/doc/keymap.md#2-action).
 | 
			
		||||
 | 
			
		||||
Instead of using `FNx` when defining `ACTION_*` functions, you can use `F(x)` - the benefit here is being able to use more than 32 function actions (up to 4096), if you happen to need them.
 | 
			
		||||
 | 
			
		||||
## Macro shortcuts: Send a whole string when pressing just one key
 | 
			
		||||
 | 
			
		||||
Instead of using the `ACTION_MACRO` function, you can simply use `M(n)` to access macro *n* - *n* will get passed into the `action_get_macro` as the `id`, and you can use a switch statement to trigger it. This gets called on the keydown and keyup, so you'll need to use an if statement testing `record->event.pressed` (see keymaps/default.c).
 | 
			
		||||
 | 
			
		||||
```c
 | 
			
		||||
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt) // this is the function signature -- just copy/paste it into your keymap file as it is.
 | 
			
		||||
{
 | 
			
		||||
  switch(id) {
 | 
			
		||||
    case 0: // this would trigger when you hit a key mapped as M(0)
 | 
			
		||||
      if (record->event.pressed) {
 | 
			
		||||
        return MACRO( I(255), T(H), T(E), T(L), T(L), W(255), T(O), END  ); // this sends the string 'hello' when the macro executes
 | 
			
		||||
      } 
 | 
			
		||||
      break;
 | 
			
		||||
  }
 | 
			
		||||
  return MACRO_NONE;
 | 
			
		||||
};
 | 
			
		||||
```
 | 
			
		||||
A macro can include the following commands:
 | 
			
		||||
 | 
			
		||||
* I() change interval of stroke in milliseconds.
 | 
			
		||||
* D() press key.
 | 
			
		||||
* U() release key.
 | 
			
		||||
* T() type key(press and release).
 | 
			
		||||
* W() wait (milliseconds).
 | 
			
		||||
* END end mark.
 | 
			
		||||
 | 
			
		||||
So above you can see the stroke interval changed to 255ms between each keystroke, then a bunch of keys being typed, waits a while, then the macro ends.
 | 
			
		||||
 | 
			
		||||
Note: Using macros to have your keyboard send passwords for you is a bad idea.
 | 
			
		||||
 | 
			
		||||
### Additional keycode aliases for software-implemented layouts (Colemak, Dvorak, etc)
 | 
			
		||||
 | 
			
		||||
Everything is assuming you're in Qwerty (in software) by default, but there is built-in support for using a Colemak or Dvorak layout by including this at the top of your keymap:
 | 
			
		||||
 | 
			
		||||
     #include "keymap_<layout>.h"
 | 
			
		||||
     
 | 
			
		||||
   #include "keymap_<layout>.h"
 | 
			
		||||
 | 
			
		||||
Where <layout> is "colemak" or "dvorak". After including this line, you will get access to:
 | 
			
		||||
 
 | 
			
		||||
 * `CM_*` for all of the Colemak-equivalent characters
 | 
			
		||||
| 
						 | 
				
			
			@ -79,19 +132,15 @@ These implementations assume you're using Colemak or Dvorak on your OS, not on y
 | 
			
		|||
 | 
			
		||||
To give an example, if you're using software-implemented Colemak, and want to get an `F`, you would use `CM_F` - `KC_F` under these same circumstances would result in `T`.
 | 
			
		||||
 | 
			
		||||
### Additional language support
 | 
			
		||||
## Additional language support
 | 
			
		||||
 | 
			
		||||
In `quantum/keymap_extras/`, you'll see various language files - these work the same way as the alternative layout ones do. Most are defined by their two letter country/language code followed by an underscore and a 4-letter abbrivation of its name. `FR_UGRV` which will result in a `ù` when using a software-implemented AZERTY layout. It's currently difficult to send such characters in just the firmware (but it's being worked on - see Unicode support).
 | 
			
		||||
In `quantum/keymap_extras/`, you'll see various language files - these work the same way as the alternative layout ones do. Most are defined by their two letter country/language code followed by an underscore and a 4-letter abbreviation of its name. `FR_UGRV` which will result in a `ù` when using a software-implemented AZERTY layout. It's currently difficult to send such characters in just the firmware (but it's being worked on - see Unicode support).
 | 
			
		||||
 | 
			
		||||
### Unicode support
 | 
			
		||||
## Unicode support
 | 
			
		||||
 | 
			
		||||
You can currently send 4 hex digits with your OS-specific modifier key (RALT for OSX with the "Unicode Hex Input" layout) - this is currently limited to supporting one OS at a time, and requires a recompile for switching. 8 digit hex codes are being worked on. The keycode function is `UC(n)`, where *n* is a 4 digit hexidecimal. Enable from the Makefile.
 | 
			
		||||
 | 
			
		||||
### Macro shortcuts
 | 
			
		||||
 | 
			
		||||
Instead of using the `ACTION_MACRO` function, you can simply use `M(n)` to access macro *n* - *n* will get passed into the `action_get_macro` as the `id`, and you can use a switch statement to filter them. This gets called on the keydown and keyup, so you'll need to use an if statement testing `record->event.pressed` (see keymap_default.c).
 | 
			
		||||
 | 
			
		||||
### Other keyboard shortcut keycodes
 | 
			
		||||
## Other firmware shortcut keycodes
 | 
			
		||||
 | 
			
		||||
* `RESET` - puts the MCU in DFU mode for flashing new firmware (with `make dfu`)
 | 
			
		||||
* `DEBUG` - the firmware into debug mode - you'll need hid_listen to see things
 | 
			
		||||
| 
						 | 
				
			
			@ -105,12 +154,11 @@ Instead of using the `ACTION_MACRO` function, you can simply use `M(n)` to acces
 | 
			
		|||
 | 
			
		||||
Enable the backlight from the Makefile.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### MIDI functionalty
 | 
			
		||||
## MIDI functionalty
 | 
			
		||||
 | 
			
		||||
This is still a WIP, but check out `quantum/keymap_midi.c` to see what's happening. Enable from the Makefile.
 | 
			
		||||
 | 
			
		||||
### Bluetooth functionality
 | 
			
		||||
## Bluetooth functionality
 | 
			
		||||
 | 
			
		||||
This requires [some hardware changes](https://www.reddit.com/r/MechanicalKeyboards/comments/3psx0q/the_planck_keyboard_with_bluetooth_guide_and/?ref=search_posts), but can be enabled via the Makefile. The firmware will still output characters via USB, so be aware of this when charging via a computer. It would make sense to have a switch on the Bluefruit to turn it off at will.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -124,13 +172,13 @@ Depending on which keymap you would like to use, you will have to compile slight
 | 
			
		|||
To build with the default keymap, simply run `make`.
 | 
			
		||||
 | 
			
		||||
### Other Keymaps
 | 
			
		||||
Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `keymap_<name>.c` and see keymap document (you can find in top README.md) and existent keymap files.
 | 
			
		||||
Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` and see keymap document (you can find in top README.md) and existent keymap files.
 | 
			
		||||
 | 
			
		||||
To build the firmware binary hex file with a keymap just do `make` with `KEYMAP` option like:
 | 
			
		||||
```
 | 
			
		||||
$ make KEYMAP=[default|jack|<name>]
 | 
			
		||||
```
 | 
			
		||||
Keymaps follow the format **__keymap\_\<name\>.c__** and are stored in the `keymaps` folder.
 | 
			
		||||
Keymaps follow the format **__<name\>.c__** and are stored in the `keymaps` folder.
 | 
			
		||||
 | 
			
		||||
### Notable forks (which some of the keymap files are from)
 | 
			
		||||
- [Shane's Fork](https://github.com/shanecelis/tmk_keyboard/tree/master/keyboard/planck)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										34
									
								
								keyboard/planck/keymaps/default/README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								keyboard/planck/keymaps/default/README.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,34 @@
 | 
			
		|||
# 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}
 | 
			
		||||
    }
 | 
			
		||||
    };
 | 
			
		||||
| 
						 | 
				
			
			@ -2,7 +2,9 @@
 | 
			
		|||
// this is the style you want to emulate.
 | 
			
		||||
 | 
			
		||||
#include "planck.h"
 | 
			
		||||
#include "backlight.h"
 | 
			
		||||
#ifdef BACKLIGHT_ENABLE
 | 
			
		||||
  #include "backlight.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// 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.
 | 
			
		||||
| 
						 | 
				
			
			@ -58,7 +60,9 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 | 
			
		|||
        case 0:
 | 
			
		||||
          if (record->event.pressed) {
 | 
			
		||||
            register_code(KC_RSFT);
 | 
			
		||||
            backlight_step();
 | 
			
		||||
            #ifdef BACKLIGHT_ENABLE
 | 
			
		||||
              backlight_step();
 | 
			
		||||
            #endif
 | 
			
		||||
          } else {
 | 
			
		||||
            unregister_code(KC_RSFT);
 | 
			
		||||
          }
 | 
			
		||||
| 
						 | 
				
			
			@ -1,50 +0,0 @@
 | 
			
		|||
#include "keymap_common.h"
 | 
			
		||||
 | 
			
		||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		||||
[0] = { /* Jack soft-coded colemak */
 | 
			
		||||
  {KC_TAB,  CM_Q,    CM_W,    CM_F,    CM_P,    CM_G,    CM_J,    CM_L,    CM_U,    CM_Y,    CM_SCLN, KC_BSPC},
 | 
			
		||||
  {KC_ESC,  CM_A,    CM_R,    CM_S,    CM_T,    CM_D,    CM_H,    CM_N,    CM_E,    CM_I,    CM_O,     KC_QUOT},
 | 
			
		||||
  {KC_LSFT, CM_Z,    CM_X,    CM_C,    CM_V,    CM_B,    CM_K,    CM_M,    CM_COMM, CM_DOT,  CM_SLSH, KC_ENT},
 | 
			
		||||
  {BL_STEP, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2),    KC_SPC,   KC_SPC,    FUNC(1),   KC_LEFT, KC_DOWN, KC_UP,  KC_RGHT}
 | 
			
		||||
                                                // Space is repeated to accommadate for both spacebar wiring positions
 | 
			
		||||
},
 | 
			
		||||
[1] = { /* Jack hard-coded 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},
 | 
			
		||||
  {KC_FN3, KC_LCTL, KC_LALT, KC_LGUI, FUNC(2),    KC_SPC,   KC_SPC,    FUNC(1),   KC_LEFT, KC_DOWN, KC_UP,  KC_RGHT}
 | 
			
		||||
},
 | 
			
		||||
[2] = { /* Jack 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, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, KC_MINS, KC_EQL,  KC_LBRC, KC_RBRC, KC_BSLS},
 | 
			
		||||
  {KC_TRNS, KC_F11,  KC_F12,  KC_F13,  KC_F14,  KC_F15,  KC_F16,  KC_F17,  KC_F18,  KC_F19,  KC_F20, KC_TRNS},
 | 
			
		||||
  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,    KC_TRNS,   KC_TRNS,  FUNC(1),   KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
 | 
			
		||||
},
 | 
			
		||||
[3] = { /* Jack LOWER */
 | 
			
		||||
  {S(KC_GRV),  S(KC_1),    S(KC_2),    S(KC_3),    S(KC_4),    S(KC_5),    S(KC_6),    S(KC_7),    S(KC_8),    S(KC_9),    S(KC_0), KC_BSPC},
 | 
			
		||||
  {KC_TRNS, FUNC(3), FUNC(4), LSFT(RSFT(KC_PAUSE)), KC_TRNS, KC_TRNS, KC_TRNS, S(KC_MINS), S(KC_EQL),  S(KC_LBRC), S(KC_RBRC), S(KC_BSLS)},
 | 
			
		||||
  {KC_TRNS, KC_F1,   KC_F2,   KC_F3,   KC_F4,   KC_F5,   KC_F6,   KC_F7,   KC_F8,   KC_F9,   KC_F10,  KC_TRNS},
 | 
			
		||||
  {KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, FUNC(2),   KC_TRNS,   KC_TRNS,   KC_TRNS, KC_MNXT, KC_VOLD, KC_VOLU, KC_MPLY}
 | 
			
		||||
}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
const uint16_t PROGMEM fn_actions[] = {
 | 
			
		||||
    [1] = ACTION_LAYER_MOMENTARY(2),  // to Fn overlay
 | 
			
		||||
    [2] = ACTION_LAYER_MOMENTARY(3),  // to Fn overlay
 | 
			
		||||
 | 
			
		||||
    [3] = ACTION_DEFAULT_LAYER_SET(0),
 | 
			
		||||
    [4] = ACTION_DEFAULT_LAYER_SET(1),
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
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:
 | 
			
		||||
        return MACRODOWN(T(CM_T), END);
 | 
			
		||||
      break;
 | 
			
		||||
    } 
 | 
			
		||||
    return MACRO_NONE;
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										3
									
								
								keyboard/planck/keymaps/lock/README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								keyboard/planck/keymaps/lock/README.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,3 @@
 | 
			
		|||
# Lock layout
 | 
			
		||||
 | 
			
		||||
This layout is designed for having a lock switch in the lower-left-hand corner, and for experimenting with MIDI/audio features. It's constantly in development, so don't expect anything to work/be documented correctly!
 | 
			
		||||
| 
						 | 
				
			
			@ -1,7 +1,12 @@
 | 
			
		|||
// USING_MIDI
 | 
			
		||||
// USING_BACKLIGHT
 | 
			
		||||
#include "keymap_common.h"
 | 
			
		||||
#include "backlight.h"
 | 
			
		||||
#ifdef BACKLIGHT_ENABLE
 | 
			
		||||
  #include "backlight.h"
 | 
			
		||||
#endif
 | 
			
		||||
#include "action_layer.h"
 | 
			
		||||
#include "keymap_midi.h"
 | 
			
		||||
#include "audio.h"
 | 
			
		||||
#include <avr/boot.h>
 | 
			
		||||
 | 
			
		||||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 | 
			
		||||
| 
						 | 
				
			
			@ -63,15 +68,31 @@ uint16_t hextokeycode(int hex) {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float walk_up[][2] = {
 | 
			
		||||
  {440.0*pow(2.0,(60)/12.0), 400},
 | 
			
		||||
  {0, 50},
 | 
			
		||||
  {440.0*pow(2.0,(67)/12.0), 600},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
float walk_dn[][2] = {
 | 
			
		||||
  {440.0*pow(2.0,(67)/12.0), 400},
 | 
			
		||||
  {0, 50},
 | 
			
		||||
  {440.0*pow(2.0,(60)/12.0), 600},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
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) {
 | 
			
		||||
 | 
			
		||||
          play_notes(&walk_up, 3, false);
 | 
			
		||||
          // play_note(440, 20);
 | 
			
		||||
          // register_code(KC_RSFT);
 | 
			
		||||
          backlight_set(BACKLIGHT_LEVELS);
 | 
			
		||||
          #ifdef BACKLIGHT_ENABLE
 | 
			
		||||
            backlight_set(BACKLIGHT_LEVELS);
 | 
			
		||||
          #endif
 | 
			
		||||
          default_layer_and(0); 
 | 
			
		||||
          default_layer_or((1<<5));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -103,19 +124,33 @@ const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
 | 
			
		|||
          // register_code(hextokeycode((lock & 0x0F)));
 | 
			
		||||
          // unregister_code(hextokeycode((lock & 0x0F)));
 | 
			
		||||
 | 
			
		||||
          // note(0+12, 20);
 | 
			
		||||
          // note(0+24, 20);
 | 
			
		||||
        } else {
 | 
			
		||||
          // unregister_code(KC_RSFT);
 | 
			
		||||
          // stop_note();
 | 
			
		||||
          backlight_set(0);
 | 
			
		||||
          unregister_code(KC_RSFT);
 | 
			
		||||
          play_notes(&walk_dn, 3, false);
 | 
			
		||||
          #ifdef BACKLIGHT_ENABLE
 | 
			
		||||
            backlight_set(0);
 | 
			
		||||
          #endif
 | 
			
		||||
          default_layer_and(0); 
 | 
			
		||||
          default_layer_or(0);
 | 
			
		||||
          // note(0+24, 20);
 | 
			
		||||
          // note(0, 20);
 | 
			
		||||
          // play_note(4, 20);
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
      } 
 | 
			
		||||
    return MACRO_NONE;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
float start_up[][2] = {
 | 
			
		||||
  {440.0*pow(2.0,(67)/12.0), 600},
 | 
			
		||||
  {0, 50},
 | 
			
		||||
  {440.0*pow(2.0,(64)/12.0), 400},
 | 
			
		||||
  {0, 50},
 | 
			
		||||
  {440.0*pow(2.0,(55)/12.0), 400},
 | 
			
		||||
  {0, 50},
 | 
			
		||||
  {440.0*pow(2.0,(60)/12.0), 400},
 | 
			
		||||
  {0, 50},
 | 
			
		||||
  {440.0*pow(2.0,(64)/12.0), 1000},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void * matrix_init_user(void) {
 | 
			
		||||
    init_notes();
 | 
			
		||||
    play_notes(&start_up, 9, false);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -3,8 +3,13 @@
 | 
			
		|||
 | 
			
		||||
#include "matrix.h"
 | 
			
		||||
#include "keymap_common.h"
 | 
			
		||||
#include "backlight.h"
 | 
			
		||||
#ifdef BACKLIGHT_ENABLE
 | 
			
		||||
	#include "backlight.h"
 | 
			
		||||
#endif
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
#ifdef MIDI_ENABLE
 | 
			
		||||
	#include <keymap_midi.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define PLANCK_MIT( \
 | 
			
		||||
	k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										362
									
								
								quantum/audio.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										362
									
								
								quantum/audio.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,362 @@
 | 
			
		|||
#include <stdio.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <math.h>
 | 
			
		||||
#include <avr/pgmspace.h>
 | 
			
		||||
#include <avr/interrupt.h>
 | 
			
		||||
#include <avr/io.h>
 | 
			
		||||
 | 
			
		||||
#include "audio.h"
 | 
			
		||||
#include "keymap_common.h"
 | 
			
		||||
 | 
			
		||||
#define PI 3.14159265
 | 
			
		||||
 | 
			
		||||
// #define PWM_AUDIO
 | 
			
		||||
 | 
			
		||||
#ifdef PWM_AUDIO
 | 
			
		||||
    #include "wave.h"
 | 
			
		||||
    #define SAMPLE_DIVIDER 39
 | 
			
		||||
    #define SAMPLE_RATE (2000000.0/SAMPLE_DIVIDER/2048)
 | 
			
		||||
    // Resistor value of 1/ (2 * PI * 10nF * (2000000 hertz / SAMPLE_DIVIDER / 10)) for 10nF cap
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void delay_us(int count) {
 | 
			
		||||
  while(count--) {
 | 
			
		||||
    _delay_us(1);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int voices = 0;
 | 
			
		||||
int voice_place = 0;
 | 
			
		||||
double frequency = 0;
 | 
			
		||||
int volume = 0;
 | 
			
		||||
long position = 0;
 | 
			
		||||
 | 
			
		||||
double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
 | 
			
		||||
int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
 | 
			
		||||
bool sliding = false;
 | 
			
		||||
 | 
			
		||||
int max = 0xFF;
 | 
			
		||||
float sum = 0;
 | 
			
		||||
int value = 128;
 | 
			
		||||
float place = 0;
 | 
			
		||||
float places[8] = {0, 0, 0, 0, 0, 0, 0, 0};
 | 
			
		||||
 | 
			
		||||
uint16_t place_int = 0;
 | 
			
		||||
bool repeat = true;
 | 
			
		||||
uint8_t * sample;
 | 
			
		||||
uint16_t sample_length = 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
bool notes = false;
 | 
			
		||||
bool note = false;
 | 
			
		||||
float note_frequency = 0;
 | 
			
		||||
float note_length = 0;
 | 
			
		||||
uint16_t note_position = 0;
 | 
			
		||||
float (* notes_pointer)[][2];
 | 
			
		||||
uint8_t notes_length;
 | 
			
		||||
bool notes_repeat;
 | 
			
		||||
uint8_t current_note = 0;
 | 
			
		||||
 | 
			
		||||
void stop_all_notes() {
 | 
			
		||||
    voices = 0;
 | 
			
		||||
    #ifdef PWM_AUDIO
 | 
			
		||||
        TIMSK3 &= ~_BV(OCIE3A);
 | 
			
		||||
    #else
 | 
			
		||||
        TIMSK3 &= ~_BV(OCIE3A);
 | 
			
		||||
        TCCR3A &= ~_BV(COM3A1);
 | 
			
		||||
    #endif
 | 
			
		||||
    notes = false;
 | 
			
		||||
    note = false;
 | 
			
		||||
    frequency = 0;
 | 
			
		||||
    volume = 0;
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < 8; i++) {
 | 
			
		||||
        frequencies[i] = 0;
 | 
			
		||||
        volumes[i] = 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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) {
 | 
			
		||||
        #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;
 | 
			
		||||
        }
 | 
			
		||||
        frequency = freq;
 | 
			
		||||
        volume = vol;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void init_notes() {
 | 
			
		||||
 | 
			
		||||
    #ifdef PWM_AUDIO
 | 
			
		||||
        PLLFRQ = _BV(PDIV2);
 | 
			
		||||
        PLLCSR = _BV(PLLE);
 | 
			
		||||
        while(!(PLLCSR & _BV(PLOCK)));
 | 
			
		||||
        PLLFRQ |= _BV(PLLTM0); /* PCK 48MHz */
 | 
			
		||||
 | 
			
		||||
        /* Init a fast PWM on Timer4 */
 | 
			
		||||
        TCCR4A = _BV(COM4A0) | _BV(PWM4A); /* Clear OC4A on Compare Match */
 | 
			
		||||
        TCCR4B = _BV(CS40); /* No prescaling => f = PCK/256 = 187500Hz */
 | 
			
		||||
        OCR4A = 0;
 | 
			
		||||
 | 
			
		||||
        /* Enable the OC4A output */
 | 
			
		||||
        DDRC |= _BV(PORTC6);
 | 
			
		||||
 | 
			
		||||
        TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs
 | 
			
		||||
        
 | 
			
		||||
        TCCR3A = 0x0; // Options not needed
 | 
			
		||||
        TCCR3B = _BV(CS31) | _BV(CS30) | _BV(WGM32); // 64th prescaling and CTC
 | 
			
		||||
        OCR3A = SAMPLE_DIVIDER - 1; // Correct count/compare, related to sample playback
 | 
			
		||||
    #else
 | 
			
		||||
        DDRC |= _BV(PORTC6);
 | 
			
		||||
 | 
			
		||||
        TIMSK3 &= ~_BV(OCIE3A); // Turn off 3A interputs
 | 
			
		||||
 | 
			
		||||
        TCCR3A = (0 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
 | 
			
		||||
        TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
 | 
			
		||||
    #endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ISR(TIMER3_COMPA_vect) {
 | 
			
		||||
 | 
			
		||||
    if (note) {
 | 
			
		||||
        #ifdef PWM_AUDIO
 | 
			
		||||
            if (voices == 1) {
 | 
			
		||||
                // SINE
 | 
			
		||||
                OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 2;
 | 
			
		||||
            
 | 
			
		||||
                // SQUARE
 | 
			
		||||
                // if (((int)place) >= 1024){
 | 
			
		||||
                //     OCR4A = 0xFF >> 2;
 | 
			
		||||
                // } else {
 | 
			
		||||
                //     OCR4A = 0x00;
 | 
			
		||||
                // }
 | 
			
		||||
                
 | 
			
		||||
                // SAWTOOTH
 | 
			
		||||
                // OCR4A = (int)place / 4;
 | 
			
		||||
 | 
			
		||||
                // TRIANGLE
 | 
			
		||||
                // if (((int)place) >= 1024) {
 | 
			
		||||
                //     OCR4A = (int)place / 2;
 | 
			
		||||
                // } else {
 | 
			
		||||
                //     OCR4A = 2048 - (int)place / 2;
 | 
			
		||||
                // }
 | 
			
		||||
 | 
			
		||||
                place += frequency;
 | 
			
		||||
 | 
			
		||||
                if (place >= SINE_LENGTH)
 | 
			
		||||
                    place -= SINE_LENGTH;
 | 
			
		||||
 | 
			
		||||
            } else {
 | 
			
		||||
                int sum = 0;
 | 
			
		||||
                for (int i = 0; i < voices; i++) {
 | 
			
		||||
                    // SINE
 | 
			
		||||
                    sum += pgm_read_byte(&sinewave[(uint16_t)places[i]]) >> 2;
 | 
			
		||||
 | 
			
		||||
                    // SQUARE
 | 
			
		||||
                    // if (((int)places[i]) >= 1024){
 | 
			
		||||
                    //     sum += 0xFF >> 2;
 | 
			
		||||
                    // } else {
 | 
			
		||||
                    //     sum += 0x00;
 | 
			
		||||
                    // }
 | 
			
		||||
 | 
			
		||||
                    places[i] += frequencies[i];
 | 
			
		||||
 | 
			
		||||
                    if (places[i] >= SINE_LENGTH)
 | 
			
		||||
                        places[i] -= SINE_LENGTH;
 | 
			
		||||
                }
 | 
			
		||||
                OCR4A = sum;
 | 
			
		||||
            }
 | 
			
		||||
        #else
 | 
			
		||||
            if (frequency > 0) {
 | 
			
		||||
                // ICR3 = (int)(((double)F_CPU) / frequency); // Set max to the period
 | 
			
		||||
                // OCR3A = (int)(((double)F_CPU) / frequency) >> 1; // Set compare to half the period
 | 
			
		||||
                if (place > 10) {
 | 
			
		||||
                    voice_place = (voice_place + 1) % voices;
 | 
			
		||||
                    place = 0.0;
 | 
			
		||||
                }
 | 
			
		||||
                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
 | 
			
		||||
                place++;
 | 
			
		||||
            }
 | 
			
		||||
        #endif
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // SAMPLE
 | 
			
		||||
    // OCR4A = pgm_read_byte(&sample[(uint16_t)place_int]);
 | 
			
		||||
 | 
			
		||||
    // place_int++;
 | 
			
		||||
 | 
			
		||||
    // if (place_int >= sample_length)
 | 
			
		||||
    //     if (repeat)
 | 
			
		||||
    //         place_int -= sample_length;
 | 
			
		||||
    //     else
 | 
			
		||||
    //         TIMSK3 &= ~_BV(OCIE3A);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    if (notes) {
 | 
			
		||||
        #ifdef PWM_AUDIO
 | 
			
		||||
            OCR4A = pgm_read_byte(&sinewave[(uint16_t)place]) >> 0;
 | 
			
		||||
 | 
			
		||||
            place += note_frequency;
 | 
			
		||||
            if (place >= SINE_LENGTH)
 | 
			
		||||
                place -= SINE_LENGTH;
 | 
			
		||||
        #else
 | 
			
		||||
            if (note_frequency > 0) {
 | 
			
		||||
                ICR3 = (int)(((double)F_CPU) / note_frequency); // Set max to the period
 | 
			
		||||
                OCR3A = (int)(((double)F_CPU) / note_frequency) >> 1; // Set compare to half the period
 | 
			
		||||
            }
 | 
			
		||||
        #endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        note_position++;
 | 
			
		||||
        if (note_position >= note_length) {
 | 
			
		||||
            current_note++;
 | 
			
		||||
            if (current_note >= notes_length) {
 | 
			
		||||
                if (notes_repeat) {
 | 
			
		||||
                    current_note = 0;
 | 
			
		||||
                } else {
 | 
			
		||||
                    #ifdef PWM_AUDIO
 | 
			
		||||
                        TIMSK3 &= ~_BV(OCIE3A);
 | 
			
		||||
                    #else
 | 
			
		||||
                        TIMSK3 &= ~_BV(OCIE3A);
 | 
			
		||||
                        TCCR3A &= ~_BV(COM3A1);
 | 
			
		||||
                    #endif
 | 
			
		||||
                    notes = false;
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            #ifdef PWM_AUDIO
 | 
			
		||||
                note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
 | 
			
		||||
                note_length = (*notes_pointer)[current_note][1];
 | 
			
		||||
            #else
 | 
			
		||||
                note_frequency = (*notes_pointer)[current_note][0];
 | 
			
		||||
                note_length = (*notes_pointer)[current_note][1] / 4;
 | 
			
		||||
            #endif
 | 
			
		||||
            note_position = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat) {
 | 
			
		||||
    if (note)
 | 
			
		||||
        stop_all_notes();
 | 
			
		||||
    notes = true;
 | 
			
		||||
 | 
			
		||||
    notes_pointer = np;
 | 
			
		||||
    notes_length = n_length;
 | 
			
		||||
    notes_repeat = n_repeat;
 | 
			
		||||
 | 
			
		||||
    place = 0;
 | 
			
		||||
    current_note = 0;
 | 
			
		||||
    #ifdef PWM_AUDIO
 | 
			
		||||
        note_frequency = (*notes_pointer)[current_note][0] / SAMPLE_RATE;
 | 
			
		||||
        note_length = (*notes_pointer)[current_note][1];
 | 
			
		||||
    #else
 | 
			
		||||
        note_frequency = (*notes_pointer)[current_note][0];
 | 
			
		||||
        note_length = (*notes_pointer)[current_note][1] / 4;
 | 
			
		||||
    #endif
 | 
			
		||||
    note_position = 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    #ifdef PWM_AUDIO
 | 
			
		||||
        TIMSK3 |= _BV(OCIE3A);
 | 
			
		||||
    #else
 | 
			
		||||
        TIMSK3 |= _BV(OCIE3A);
 | 
			
		||||
        TCCR3A |= _BV(COM3A1);
 | 
			
		||||
    #endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void play_sample(uint8_t * s, uint16_t l, bool r) {
 | 
			
		||||
    stop_all_notes();
 | 
			
		||||
    place_int = 0;
 | 
			
		||||
    sample = s;
 | 
			
		||||
    sample_length = l;
 | 
			
		||||
    repeat = r;
 | 
			
		||||
 | 
			
		||||
    #ifdef PWM_AUDIO
 | 
			
		||||
        TIMSK3 |= _BV(OCIE3A);
 | 
			
		||||
    #else
 | 
			
		||||
    #endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void play_note(double freq, int vol) {
 | 
			
		||||
    if (notes)
 | 
			
		||||
        stop_all_notes();
 | 
			
		||||
    note = true;
 | 
			
		||||
    #ifdef PWM_AUDIO
 | 
			
		||||
        freq = freq / SAMPLE_RATE;
 | 
			
		||||
    #endif
 | 
			
		||||
    if (freq > 0) {
 | 
			
		||||
        if (frequency != 0) {
 | 
			
		||||
            double starting_f = frequency;
 | 
			
		||||
            if (frequency < freq) {
 | 
			
		||||
                for (double f = starting_f; f <= freq; f += ((freq - starting_f) / 2000.0)) {   
 | 
			
		||||
                    frequency = f;
 | 
			
		||||
                }
 | 
			
		||||
            } else if (frequency > freq) {
 | 
			
		||||
                for (double f = starting_f; f >= freq; f -= ((starting_f - freq) / 2000.0)) {
 | 
			
		||||
                    frequency = f;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        frequency = freq;
 | 
			
		||||
        volume = vol;
 | 
			
		||||
 | 
			
		||||
        frequencies[voices] = frequency;
 | 
			
		||||
        volumes[voices] = volume;
 | 
			
		||||
        voices++;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #ifdef PWM_AUDIO
 | 
			
		||||
        TIMSK3 |= _BV(OCIE3A);
 | 
			
		||||
    #else
 | 
			
		||||
        TIMSK3 |= _BV(OCIE3A);
 | 
			
		||||
        TCCR3A |= _BV(COM3A1);
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -3,10 +3,9 @@
 | 
			
		|||
#include <avr/io.h>
 | 
			
		||||
#include <util/delay.h>
 | 
			
		||||
 | 
			
		||||
void note(int x, float length);
 | 
			
		||||
void beeps();
 | 
			
		||||
void true_note(float x, float y, float length);
 | 
			
		||||
void play_sample(uint8_t * s, uint16_t l, bool r);
 | 
			
		||||
void play_note(double freq, int vol);
 | 
			
		||||
void stop_note(double freq);
 | 
			
		||||
void stop_all_notes();
 | 
			
		||||
void init_notes();
 | 
			
		||||
void init_notes();
 | 
			
		||||
void play_notes(float (*np)[][2], uint8_t n_length, bool n_repeat);
 | 
			
		||||
							
								
								
									
										246
									
								
								quantum/beeps.c
									
										
									
									
									
								
							
							
						
						
									
										246
									
								
								quantum/beeps.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,246 +0,0 @@
 | 
			
		|||
#include "beeps.h"
 | 
			
		||||
#include <math.h>
 | 
			
		||||
#include <avr/pgmspace.h>
 | 
			
		||||
#include <avr/interrupt.h>
 | 
			
		||||
#include <avr/io.h>
 | 
			
		||||
 | 
			
		||||
#define PI 3.14159265
 | 
			
		||||
 | 
			
		||||
void delay_us(int count) {
 | 
			
		||||
  while(count--) {
 | 
			
		||||
    _delay_us(1);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int voices = 0;
 | 
			
		||||
double frequency = 0;
 | 
			
		||||
int volume = 0;
 | 
			
		||||
int position = 0;
 | 
			
		||||
 | 
			
		||||
double frequencies[8] = {0, 0, 0, 0, 0, 0, 0, 0};
 | 
			
		||||
int volumes[8] = {0, 0, 0, 0, 0, 0, 0, 0};
 | 
			
		||||
bool sliding = false;
 | 
			
		||||
#define RANGE 1000
 | 
			
		||||
volatile int i=0; //elements of the wave
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void beeps() {
 | 
			
		||||
    play_notes();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void send_freq(double freq, int vol) {
 | 
			
		||||
    int duty = (((double)F_CPU) / freq);
 | 
			
		||||
    ICR3 = duty; // Set max to the period
 | 
			
		||||
    OCR3A = duty >> (0x10 - vol); // Set compare to half the period
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void stop_all_notes() {
 | 
			
		||||
    voices = 0;
 | 
			
		||||
    TCCR3A = 0;
 | 
			
		||||
    TCCR3B = 0;
 | 
			
		||||
    frequency = 0;
 | 
			
		||||
    volume = 0;
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < 8; i++) {
 | 
			
		||||
        frequencies[i] = 0;
 | 
			
		||||
        volumes[i] = 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void stop_note(double freq) {
 | 
			
		||||
    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) {
 | 
			
		||||
        TCCR3A = 0;
 | 
			
		||||
        TCCR3B = 0;
 | 
			
		||||
        frequency = 0;
 | 
			
		||||
        volume = 0;
 | 
			
		||||
    } else {
 | 
			
		||||
        double freq = frequencies[voices - 1];
 | 
			
		||||
        int vol = volumes[voices - 1];
 | 
			
		||||
        if (frequency < freq) {
 | 
			
		||||
            sliding = true;
 | 
			
		||||
            for (double f = frequency; f <= freq; f += ((freq - frequency) / 500.0)) {
 | 
			
		||||
                send_freq(f, vol);
 | 
			
		||||
            }
 | 
			
		||||
            sliding = false;
 | 
			
		||||
        } else if (frequency > freq) {
 | 
			
		||||
            sliding = true;
 | 
			
		||||
            for (double f = frequency; f >= freq; f -= ((frequency - freq) / 500.0)) {
 | 
			
		||||
                send_freq(f, vol);
 | 
			
		||||
            }
 | 
			
		||||
            sliding = false;
 | 
			
		||||
        }
 | 
			
		||||
        send_freq(freq, vol);
 | 
			
		||||
        frequency = freq;
 | 
			
		||||
        volume = vol;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void init_notes() {
 | 
			
		||||
    // TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (1 << WGM10);
 | 
			
		||||
    // TCCR1B = (1 << COM1B1) | (0 << COM1A0) | (1 << WGM13) | (1 << WGM12) | (0 << CS12) | (0 << CS11) | (1 << CS10);
 | 
			
		||||
 | 
			
		||||
    // DDRC |= (1<<6); 
 | 
			
		||||
 | 
			
		||||
    // TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
 | 
			
		||||
    // TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (0 << CS31) | (1 << CS30);
 | 
			
		||||
 | 
			
		||||
    // ICR3 = 0xFFFF; 
 | 
			
		||||
    // OCR3A = (int)((float)wave[i]*ICR3/RANGE); //go to next array element
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // cli();
 | 
			
		||||
 | 
			
		||||
    // /* Enable interrupt on timer2 == 127, with clk/8 prescaler. At 16MHz,
 | 
			
		||||
    //    this gives a timer interrupt at 15625Hz. */
 | 
			
		||||
    // TIMSK3 = (1 << OCIE3A);
 | 
			
		||||
 | 
			
		||||
    // /* clear/reset timer on match */
 | 
			
		||||
    // // TCCR3A = 1<<WGM31 | 0<<WGM30;  CTC mode, reset on match 
 | 
			
		||||
    // // TCCR3B = 0<<CS32 | 1<<CS31 | 0<<CS30; /* clk, /8 prescaler */
 | 
			
		||||
 | 
			
		||||
    // TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
 | 
			
		||||
    // TCCR3B = (0 << WGM33) | (0 << WGM32) | (0 << CS32) | (0 << CS31) | (1 << CS30);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // TCCR1A = (1 << COM1A1) | (0 << COM1A0) | (1 << WGM11) | (0 << WGM10);
 | 
			
		||||
    // TCCR1B = (1 << WGM12) | (0 << CS12) | (0 << CS11) | (1 << CS10);
 | 
			
		||||
    // // SPCR = 0x50;
 | 
			
		||||
    // // SPSR = 0x01;
 | 
			
		||||
    // DDRC |= (1<<6);
 | 
			
		||||
    // // ICR3 = 0xFFFF; 
 | 
			
		||||
    // // OCR3A=80;
 | 
			
		||||
    // PORTC |= (1<<6);
 | 
			
		||||
 | 
			
		||||
    // sei();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// #define highByte(c) ((c >> 8) & 0x00FF)
 | 
			
		||||
// #define lowByte(c) (c & 0x00FF)
 | 
			
		||||
 | 
			
		||||
ISR(TIMER3_COMPA_vect) {
 | 
			
		||||
 | 
			
		||||
    if (ICR3 > 0 && !sliding) {
 | 
			
		||||
        switch (position) {
 | 
			
		||||
            case 0: {
 | 
			
		||||
                int duty = (((double)F_CPU) / (frequency));
 | 
			
		||||
                ICR3 = duty; // Set max to the period
 | 
			
		||||
                OCR3A = duty >> 1; // Set compare to half the period
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            case 1: {
 | 
			
		||||
                int duty = (((double)F_CPU) / (frequency*2));
 | 
			
		||||
                ICR3 = duty; // Set max to the period
 | 
			
		||||
                OCR3A = duty >> 1; // Set compare to half the period
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            case 2: {
 | 
			
		||||
                int duty = (((double)F_CPU) / (frequency*3));
 | 
			
		||||
                ICR3 = duty; // Set max to the period
 | 
			
		||||
                OCR3A = duty >> 1; // Set compare to half the period
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        position = (position + 1) % 3;
 | 
			
		||||
    }
 | 
			
		||||
//     /* OCR2A has been cleared, per TCCR2A above */
 | 
			
		||||
//     // OCR3A = 127;
 | 
			
		||||
 | 
			
		||||
//     // pos1 += incr1;
 | 
			
		||||
//     // pos2 += incr2;
 | 
			
		||||
//     // pos3 += incr3;
 | 
			
		||||
 | 
			
		||||
//     // sample = sinewave[highByte(pos1)] + sinewave[highByte(pos2)] + sinewave[highByte(pos3)];
 | 
			
		||||
 | 
			
		||||
//     // OCR3A = sample;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//     OCR3A=pgm_read_byte(&sinewave[pos1]);
 | 
			
		||||
//     pos1++;
 | 
			
		||||
//     // PORTC &= ~(1<<6);
 | 
			
		||||
 | 
			
		||||
//     /* buffered, 1x gain, active mode */
 | 
			
		||||
//     // SPDR = highByte(sample) | 0x70;
 | 
			
		||||
//     // while (!(SPSR & (1<<SPIF)));
 | 
			
		||||
 | 
			
		||||
//     // SPDR = lowByte(sample);
 | 
			
		||||
//     // while (!(SPSR & (1<<SPIF)));
 | 
			
		||||
 | 
			
		||||
//     // PORTC |= (1<<6);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void play_note(double freq, int vol) {
 | 
			
		||||
 | 
			
		||||
    if (freq > 0) {
 | 
			
		||||
        DDRC |= (1<<6); 
 | 
			
		||||
 | 
			
		||||
        TCCR3A = (1 << COM3A1) | (0 << COM3A0) | (1 << WGM31) | (0 << WGM30);
 | 
			
		||||
        TCCR3B = (1 << WGM33) | (1 << WGM32) | (0 << CS32) | (1 << CS31) | (0 << CS30);
 | 
			
		||||
 | 
			
		||||
        if (frequency != 0) {
 | 
			
		||||
            if (frequency < freq) {
 | 
			
		||||
                for (double f = frequency; f <= freq; f += ((freq - frequency) / 500.0)) {
 | 
			
		||||
                    send_freq(f, vol);
 | 
			
		||||
                }
 | 
			
		||||
            } else if (frequency > freq) {
 | 
			
		||||
                for (double f = frequency; f >= freq; f -= ((frequency - freq) / 500.0)) {
 | 
			
		||||
                    send_freq(f, vol);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        send_freq(freq, vol);
 | 
			
		||||
        frequency = freq;
 | 
			
		||||
        volume = vol;
 | 
			
		||||
 | 
			
		||||
        frequencies[voices] = frequency;
 | 
			
		||||
        volumes[voices] = volume;
 | 
			
		||||
        voices++;
 | 
			
		||||
    }
 | 
			
		||||
    // ICR3 = 0xFFFF;
 | 
			
		||||
    // for (int i = 0; i < 10000; i++) {
 | 
			
		||||
    //     OCR3A = round((sin(i*freq)*.5)+.5)*0xFFFF;
 | 
			
		||||
    //     // _delay_us(50);
 | 
			
		||||
    // }
 | 
			
		||||
 | 
			
		||||
    // TCCR3A = 0;
 | 
			
		||||
    // TCCR3B = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// void note(int x, float length) {
 | 
			
		||||
//     DDRC |= (1<<6);
 | 
			
		||||
// 	int t = (int)(440*pow(2,-x/12.0)); // starting note
 | 
			
		||||
//     for (int y = 0; y < length*1000/t; y++) { // note length
 | 
			
		||||
//         PORTC |= (1<<6);
 | 
			
		||||
//         delay_us(t);
 | 
			
		||||
//         PORTC &= ~(1<<6);
 | 
			
		||||
//         delay_us(t);
 | 
			
		||||
//     }
 | 
			
		||||
// 	PORTC &= ~(1<<6);
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
// void true_note(float x, float y, float length) {
 | 
			
		||||
// 	for (uint32_t i = 0; i < length * 50; i++) {
 | 
			
		||||
// 		uint32_t v = (uint32_t) (round(sin(PI*2*i*640000*pow(2, x/12.0))*.5+1 + sin(PI*2*i*640000*pow(2, y/12.0))*.5+1) / 2 * pow(2, 8)); 
 | 
			
		||||
// 		for (int u = 0; u < 8; u++) {
 | 
			
		||||
// 			if (v & (1 << u) && !(PORTC&(1<<6)))
 | 
			
		||||
// 		        PORTC |= (1<<6);
 | 
			
		||||
// 		    else if (PORTC&(1<<6))
 | 
			
		||||
// 	        	PORTC &= ~(1<<6);
 | 
			
		||||
// 		}
 | 
			
		||||
// 	}
 | 
			
		||||
// 	PORTC &= ~(1<<6);
 | 
			
		||||
// }
 | 
			
		||||
| 
						 | 
				
			
			@ -17,7 +17,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		|||
 | 
			
		||||
#include "keymap_common.h"
 | 
			
		||||
#include "keymap_midi.h"
 | 
			
		||||
#include <lufa.h>
 | 
			
		||||
 | 
			
		||||
uint8_t starting_note = 0x0C;
 | 
			
		||||
int offset = 7;
 | 
			
		||||
| 
						 | 
				
			
			@ -35,7 +34,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
 | 
			
		|||
    if (record->event.key.col == (MATRIX_COLS - 1) && record->event.key.row == (MATRIX_ROWS - 1)) {
 | 
			
		||||
        if (record->event.pressed) {
 | 
			
		||||
            starting_note++;
 | 
			
		||||
            play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
 | 
			
		||||
            play_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
 | 
			
		||||
            midi_send_cc(&midi_device, 0, 0x7B, 0);
 | 
			
		||||
            midi_send_cc(&midi_device, 1, 0x7B, 0);
 | 
			
		||||
            midi_send_cc(&midi_device, 2, 0x7B, 0);
 | 
			
		||||
| 
						 | 
				
			
			@ -43,7 +42,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
 | 
			
		|||
            midi_send_cc(&midi_device, 4, 0x7B, 0);
 | 
			
		||||
            return;
 | 
			
		||||
        } else {
 | 
			
		||||
            stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
 | 
			
		||||
            stop_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
 | 
			
		||||
            stop_all_notes();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -51,7 +50,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
 | 
			
		|||
    if (record->event.key.col == (MATRIX_COLS - 2) && record->event.key.row == (MATRIX_ROWS - 1)) {
 | 
			
		||||
        if (record->event.pressed) {
 | 
			
		||||
            starting_note--;
 | 
			
		||||
            play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
 | 
			
		||||
            play_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
 | 
			
		||||
            midi_send_cc(&midi_device, 0, 0x7B, 0);
 | 
			
		||||
            midi_send_cc(&midi_device, 1, 0x7B, 0);
 | 
			
		||||
            midi_send_cc(&midi_device, 2, 0x7B, 0);
 | 
			
		||||
| 
						 | 
				
			
			@ -59,7 +58,7 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
 | 
			
		|||
            midi_send_cc(&midi_device, 4, 0x7B, 0);
 | 
			
		||||
            return;
 | 
			
		||||
        } else {
 | 
			
		||||
            stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
 | 
			
		||||
            stop_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[0 + offset])/12.0+(MATRIX_ROWS - 1)));
 | 
			
		||||
            stop_all_notes();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -74,9 +73,9 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
 | 
			
		|||
        midi_send_cc(&midi_device, 4, 0x7B, 0);
 | 
			
		||||
        stop_all_notes();
 | 
			
		||||
        for (int i = 0; i <= 7; i++) {
 | 
			
		||||
            play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
 | 
			
		||||
            play_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
 | 
			
		||||
            _delay_us(80000);
 | 
			
		||||
            stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)));
 | 
			
		||||
            stop_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)));
 | 
			
		||||
            _delay_us(8000);
 | 
			
		||||
        }
 | 
			
		||||
        return;
 | 
			
		||||
| 
						 | 
				
			
			@ -90,9 +89,9 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
 | 
			
		|||
        midi_send_cc(&midi_device, 4, 0x7B, 0);
 | 
			
		||||
        stop_all_notes();
 | 
			
		||||
        for (int i = 0; i <= 7; i++) {
 | 
			
		||||
            play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
 | 
			
		||||
            play_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)), 0xC);
 | 
			
		||||
            _delay_us(80000);
 | 
			
		||||
            stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)));
 | 
			
		||||
            stop_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[i + offset])/12.0+(MATRIX_ROWS - 1)));
 | 
			
		||||
            _delay_us(8000);
 | 
			
		||||
        }
 | 
			
		||||
        return;
 | 
			
		||||
| 
						 | 
				
			
			@ -101,10 +100,10 @@ void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
 | 
			
		|||
    if (record->event.pressed) {
 | 
			
		||||
    	// midi_send_noteon(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
 | 
			
		||||
        midi_send_noteon(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
 | 
			
		||||
        play_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
 | 
			
		||||
        play_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)), 0xF);
 | 
			
		||||
    } else {
 | 
			
		||||
        // midi_send_noteoff(&midi_device, record->event.key.row, starting_note + SCALE[record->event.key.col], 127);
 | 
			
		||||
        midi_send_noteoff(&midi_device, 0, (starting_note + SCALE[record->event.key.col + offset])+12*(MATRIX_ROWS - record->event.key.row), 127);
 | 
			
		||||
        stop_note(((double)261.6)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
 | 
			
		||||
        stop_note(((double)261.626)*pow(2.0, -1.0)*pow(2.0,(starting_note + SCALE[record->event.key.col + offset])/12.0+(MATRIX_ROWS - record->event.key.row)));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -18,6 +18,8 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		|||
#ifndef KEYMAP_MIDI_H
 | 
			
		||||
#define KEYMAP_MIDI_H
 | 
			
		||||
 | 
			
		||||
#include <lufa.h>
 | 
			
		||||
 | 
			
		||||
#define MIDI 0x6000
 | 
			
		||||
#define MIDI12 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000, 0x6000
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -30,6 +30,8 @@ uint16_t hextokeycode(int hex) {
 | 
			
		|||
void action_function(keyrecord_t *record, uint8_t id, uint8_t opt)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    // For more info on how this works per OS, see here: https://en.wikipedia.org/wiki/Unicode_input#Hexadecimal_code_input
 | 
			
		||||
 | 
			
		||||
    if (record->event.pressed) {
 | 
			
		||||
        uint16_t unicode = (opt << 8) | id;
 | 
			
		||||
        register_code(KC_LALT);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,13 +4,31 @@ QUANTUM_DIR = quantum
 | 
			
		|||
SRC += $(QUANTUM_DIR)/keymap_common.c \
 | 
			
		||||
	$(QUANTUM_DIR)/led.c 
 | 
			
		||||
 | 
			
		||||
# ifdef KEYMAP_FILE
 | 
			
		||||
# ifneq (,$(shell grep USING_MIDI '$(KEYMAP_FILE)'))
 | 
			
		||||
# MIDI_ENABLE=yes
 | 
			
		||||
# $(info  * Overriding MIDI_ENABLE setting - $(KEYMAP_FILE) requires it)
 | 
			
		||||
# endif
 | 
			
		||||
# ifneq (,$(shell grep USING_UNICODE '$(KEYMAP_FILE)'))
 | 
			
		||||
# UNICODE_ENABLE=yes
 | 
			
		||||
# $(info  * Overriding UNICODE_ENABLE setting - $(KEYMAP_FILE) requires it)
 | 
			
		||||
# endif
 | 
			
		||||
# ifneq (,$(shell grep USING_BACKLIGHT '$(KEYMAP_FILE)'))
 | 
			
		||||
# BACKLIGHT_ENABLE=yes
 | 
			
		||||
# $(info  * Overriding BACKLIGHT_ENABLE setting - $(KEYMAP_FILE) requires it)
 | 
			
		||||
# endif
 | 
			
		||||
# endif
 | 
			
		||||
 | 
			
		||||
ifndef CUSTOM_MATRIX
 | 
			
		||||
	SRC += $(QUANTUM_DIR)/matrix.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifdef MIDI_ENABLE
 | 
			
		||||
	SRC += $(QUANTUM_DIR)/keymap_midi.c \
 | 
			
		||||
		   $(QUANTUM_DIR)/beeps.c
 | 
			
		||||
	SRC += $(QUANTUM_DIR)/keymap_midi.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifdef AUDIO_ENABLE
 | 
			
		||||
	SRC += $(QUANTUM_DIR)/audio.c
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifdef UNICODE_ENABLE
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										265
									
								
								quantum/wave.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										265
									
								
								quantum/wave.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,265 @@
 | 
			
		|||
#include <avr/io.h>
 | 
			
		||||
#include <avr/interrupt.h>
 | 
			
		||||
#include <avr/pgmspace.h>
 | 
			
		||||
 | 
			
		||||
#define SINE_LENGTH 2048
 | 
			
		||||
 | 
			
		||||
const uint8_t sinewave[] PROGMEM= //2048 values
 | 
			
		||||
{
 | 
			
		||||
0x80,0x80,0x80,0x81,0x81,0x81,0x82,0x82,
 | 
			
		||||
0x83,0x83,0x83,0x84,0x84,0x85,0x85,0x85,
 | 
			
		||||
0x86,0x86,0x87,0x87,0x87,0x88,0x88,0x88,
 | 
			
		||||
0x89,0x89,0x8a,0x8a,0x8a,0x8b,0x8b,0x8c,
 | 
			
		||||
0x8c,0x8c,0x8d,0x8d,0x8e,0x8e,0x8e,0x8f,
 | 
			
		||||
0x8f,0x8f,0x90,0x90,0x91,0x91,0x91,0x92,
 | 
			
		||||
0x92,0x93,0x93,0x93,0x94,0x94,0x95,0x95,
 | 
			
		||||
0x95,0x96,0x96,0x96,0x97,0x97,0x98,0x98,
 | 
			
		||||
0x98,0x99,0x99,0x9a,0x9a,0x9a,0x9b,0x9b,
 | 
			
		||||
0x9b,0x9c,0x9c,0x9d,0x9d,0x9d,0x9e,0x9e,
 | 
			
		||||
0x9e,0x9f,0x9f,0xa0,0xa0,0xa0,0xa1,0xa1,
 | 
			
		||||
0xa2,0xa2,0xa2,0xa3,0xa3,0xa3,0xa4,0xa4,
 | 
			
		||||
0xa5,0xa5,0xa5,0xa6,0xa6,0xa6,0xa7,0xa7,
 | 
			
		||||
0xa7,0xa8,0xa8,0xa9,0xa9,0xa9,0xaa,0xaa,
 | 
			
		||||
0xaa,0xab,0xab,0xac,0xac,0xac,0xad,0xad,
 | 
			
		||||
0xad,0xae,0xae,0xae,0xaf,0xaf,0xb0,0xb0,
 | 
			
		||||
0xb0,0xb1,0xb1,0xb1,0xb2,0xb2,0xb2,0xb3,
 | 
			
		||||
0xb3,0xb4,0xb4,0xb4,0xb5,0xb5,0xb5,0xb6,
 | 
			
		||||
0xb6,0xb6,0xb7,0xb7,0xb7,0xb8,0xb8,0xb8,
 | 
			
		||||
0xb9,0xb9,0xba,0xba,0xba,0xbb,0xbb,0xbb,
 | 
			
		||||
0xbc,0xbc,0xbc,0xbd,0xbd,0xbd,0xbe,0xbe,
 | 
			
		||||
0xbe,0xbf,0xbf,0xbf,0xc0,0xc0,0xc0,0xc1,
 | 
			
		||||
0xc1,0xc1,0xc2,0xc2,0xc2,0xc3,0xc3,0xc3,
 | 
			
		||||
0xc4,0xc4,0xc4,0xc5,0xc5,0xc5,0xc6,0xc6,
 | 
			
		||||
0xc6,0xc7,0xc7,0xc7,0xc8,0xc8,0xc8,0xc9,
 | 
			
		||||
0xc9,0xc9,0xca,0xca,0xca,0xcb,0xcb,0xcb,
 | 
			
		||||
0xcb,0xcc,0xcc,0xcc,0xcd,0xcd,0xcd,0xce,
 | 
			
		||||
0xce,0xce,0xcf,0xcf,0xcf,0xcf,0xd0,0xd0,
 | 
			
		||||
0xd0,0xd1,0xd1,0xd1,0xd2,0xd2,0xd2,0xd2,
 | 
			
		||||
0xd3,0xd3,0xd3,0xd4,0xd4,0xd4,0xd5,0xd5,
 | 
			
		||||
0xd5,0xd5,0xd6,0xd6,0xd6,0xd7,0xd7,0xd7,
 | 
			
		||||
0xd7,0xd8,0xd8,0xd8,0xd9,0xd9,0xd9,0xd9,
 | 
			
		||||
0xda,0xda,0xda,0xda,0xdb,0xdb,0xdb,0xdc,
 | 
			
		||||
0xdc,0xdc,0xdc,0xdd,0xdd,0xdd,0xdd,0xde,
 | 
			
		||||
0xde,0xde,0xde,0xdf,0xdf,0xdf,0xe0,0xe0,
 | 
			
		||||
0xe0,0xe0,0xe1,0xe1,0xe1,0xe1,0xe2,0xe2,
 | 
			
		||||
0xe2,0xe2,0xe3,0xe3,0xe3,0xe3,0xe4,0xe4,
 | 
			
		||||
0xe4,0xe4,0xe4,0xe5,0xe5,0xe5,0xe5,0xe6,
 | 
			
		||||
0xe6,0xe6,0xe6,0xe7,0xe7,0xe7,0xe7,0xe8,
 | 
			
		||||
0xe8,0xe8,0xe8,0xe8,0xe9,0xe9,0xe9,0xe9,
 | 
			
		||||
0xea,0xea,0xea,0xea,0xea,0xeb,0xeb,0xeb,
 | 
			
		||||
0xeb,0xeb,0xec,0xec,0xec,0xec,0xec,0xed,
 | 
			
		||||
0xed,0xed,0xed,0xed,0xee,0xee,0xee,0xee,
 | 
			
		||||
0xee,0xef,0xef,0xef,0xef,0xef,0xf0,0xf0,
 | 
			
		||||
0xf0,0xf0,0xf0,0xf0,0xf1,0xf1,0xf1,0xf1,
 | 
			
		||||
0xf1,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,0xf3,
 | 
			
		||||
0xf3,0xf3,0xf3,0xf3,0xf3,0xf4,0xf4,0xf4,
 | 
			
		||||
0xf4,0xf4,0xf4,0xf5,0xf5,0xf5,0xf5,0xf5,
 | 
			
		||||
0xf5,0xf5,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,
 | 
			
		||||
0xf6,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,
 | 
			
		||||
0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,
 | 
			
		||||
0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
 | 
			
		||||
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
 | 
			
		||||
0xfa,0xfa,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,
 | 
			
		||||
0xfb,0xfb,0xfb,0xfb,0xfc,0xfc,0xfc,0xfc,
 | 
			
		||||
0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,
 | 
			
		||||
0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,
 | 
			
		||||
0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfe,0xfe,
 | 
			
		||||
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
 | 
			
		||||
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
 | 
			
		||||
0xfe,0xfe,0xfe,0xfe,0xff,0xff,0xff,0xff,
 | 
			
		||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 | 
			
		||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 | 
			
		||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 | 
			
		||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 | 
			
		||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 | 
			
		||||
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
 | 
			
		||||
0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfe,
 | 
			
		||||
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
 | 
			
		||||
0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,
 | 
			
		||||
0xfe,0xfe,0xfe,0xfd,0xfd,0xfd,0xfd,0xfd,
 | 
			
		||||
0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,0xfd,
 | 
			
		||||
0xfd,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,0xfc,
 | 
			
		||||
0xfc,0xfc,0xfc,0xfc,0xfc,0xfb,0xfb,0xfb,
 | 
			
		||||
0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfa,
 | 
			
		||||
0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,0xfa,
 | 
			
		||||
0xfa,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,0xf9,
 | 
			
		||||
0xf9,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,0xf8,
 | 
			
		||||
0xf8,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,
 | 
			
		||||
0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf6,0xf5,
 | 
			
		||||
0xf5,0xf5,0xf5,0xf5,0xf5,0xf5,0xf4,0xf4,
 | 
			
		||||
0xf4,0xf4,0xf4,0xf4,0xf3,0xf3,0xf3,0xf3,
 | 
			
		||||
0xf3,0xf3,0xf2,0xf2,0xf2,0xf2,0xf2,0xf2,
 | 
			
		||||
0xf1,0xf1,0xf1,0xf1,0xf1,0xf0,0xf0,0xf0,
 | 
			
		||||
0xf0,0xf0,0xf0,0xef,0xef,0xef,0xef,0xef,
 | 
			
		||||
0xee,0xee,0xee,0xee,0xee,0xed,0xed,0xed,
 | 
			
		||||
0xed,0xed,0xec,0xec,0xec,0xec,0xec,0xeb,
 | 
			
		||||
0xeb,0xeb,0xeb,0xeb,0xea,0xea,0xea,0xea,
 | 
			
		||||
0xea,0xe9,0xe9,0xe9,0xe9,0xe8,0xe8,0xe8,
 | 
			
		||||
0xe8,0xe8,0xe7,0xe7,0xe7,0xe7,0xe6,0xe6,
 | 
			
		||||
0xe6,0xe6,0xe5,0xe5,0xe5,0xe5,0xe4,0xe4,
 | 
			
		||||
0xe4,0xe4,0xe4,0xe3,0xe3,0xe3,0xe3,0xe2,
 | 
			
		||||
0xe2,0xe2,0xe2,0xe1,0xe1,0xe1,0xe1,0xe0,
 | 
			
		||||
0xe0,0xe0,0xe0,0xdf,0xdf,0xdf,0xde,0xde,
 | 
			
		||||
0xde,0xde,0xdd,0xdd,0xdd,0xdd,0xdc,0xdc,
 | 
			
		||||
0xdc,0xdc,0xdb,0xdb,0xdb,0xda,0xda,0xda,
 | 
			
		||||
0xda,0xd9,0xd9,0xd9,0xd9,0xd8,0xd8,0xd8,
 | 
			
		||||
0xd7,0xd7,0xd7,0xd7,0xd6,0xd6,0xd6,0xd5,
 | 
			
		||||
0xd5,0xd5,0xd5,0xd4,0xd4,0xd4,0xd3,0xd3,
 | 
			
		||||
0xd3,0xd2,0xd2,0xd2,0xd2,0xd1,0xd1,0xd1,
 | 
			
		||||
0xd0,0xd0,0xd0,0xcf,0xcf,0xcf,0xcf,0xce,
 | 
			
		||||
0xce,0xce,0xcd,0xcd,0xcd,0xcc,0xcc,0xcc,
 | 
			
		||||
0xcb,0xcb,0xcb,0xcb,0xca,0xca,0xca,0xc9,
 | 
			
		||||
0xc9,0xc9,0xc8,0xc8,0xc8,0xc7,0xc7,0xc7,
 | 
			
		||||
0xc6,0xc6,0xc6,0xc5,0xc5,0xc5,0xc4,0xc4,
 | 
			
		||||
0xc4,0xc3,0xc3,0xc3,0xc2,0xc2,0xc2,0xc1,
 | 
			
		||||
0xc1,0xc1,0xc0,0xc0,0xc0,0xbf,0xbf,0xbf,
 | 
			
		||||
0xbe,0xbe,0xbe,0xbd,0xbd,0xbd,0xbc,0xbc,
 | 
			
		||||
0xbc,0xbb,0xbb,0xbb,0xba,0xba,0xba,0xb9,
 | 
			
		||||
0xb9,0xb8,0xb8,0xb8,0xb7,0xb7,0xb7,0xb6,
 | 
			
		||||
0xb6,0xb6,0xb5,0xb5,0xb5,0xb4,0xb4,0xb4,
 | 
			
		||||
0xb3,0xb3,0xb2,0xb2,0xb2,0xb1,0xb1,0xb1,
 | 
			
		||||
0xb0,0xb0,0xb0,0xaf,0xaf,0xae,0xae,0xae,
 | 
			
		||||
0xad,0xad,0xad,0xac,0xac,0xac,0xab,0xab,
 | 
			
		||||
0xaa,0xaa,0xaa,0xa9,0xa9,0xa9,0xa8,0xa8,
 | 
			
		||||
0xa7,0xa7,0xa7,0xa6,0xa6,0xa6,0xa5,0xa5,
 | 
			
		||||
0xa5,0xa4,0xa4,0xa3,0xa3,0xa3,0xa2,0xa2,
 | 
			
		||||
0xa2,0xa1,0xa1,0xa0,0xa0,0xa0,0x9f,0x9f,
 | 
			
		||||
0x9e,0x9e,0x9e,0x9d,0x9d,0x9d,0x9c,0x9c,
 | 
			
		||||
0x9b,0x9b,0x9b,0x9a,0x9a,0x9a,0x99,0x99,
 | 
			
		||||
0x98,0x98,0x98,0x97,0x97,0x96,0x96,0x96,
 | 
			
		||||
0x95,0x95,0x95,0x94,0x94,0x93,0x93,0x93,
 | 
			
		||||
0x92,0x92,0x91,0x91,0x91,0x90,0x90,0x8f,
 | 
			
		||||
0x8f,0x8f,0x8e,0x8e,0x8e,0x8d,0x8d,0x8c,
 | 
			
		||||
0x8c,0x8c,0x8b,0x8b,0x8a,0x8a,0x8a,0x89,
 | 
			
		||||
0x89,0x88,0x88,0x88,0x87,0x87,0x87,0x86,
 | 
			
		||||
0x86,0x85,0x85,0x85,0x84,0x84,0x83,0x83,
 | 
			
		||||
0x83,0x82,0x82,0x81,0x81,0x81,0x80,0x80,
 | 
			
		||||
0x80,0x7f,0x7f,0x7e,0x7e,0x7e,0x7d,0x7d,
 | 
			
		||||
0x7c,0x7c,0x7c,0x7b,0x7b,0x7a,0x7a,0x7a,
 | 
			
		||||
0x79,0x79,0x78,0x78,0x78,0x77,0x77,0x77,
 | 
			
		||||
0x76,0x76,0x75,0x75,0x75,0x74,0x74,0x73,
 | 
			
		||||
0x73,0x73,0x72,0x72,0x71,0x71,0x71,0x70,
 | 
			
		||||
0x70,0x70,0x6f,0x6f,0x6e,0x6e,0x6e,0x6d,
 | 
			
		||||
0x6d,0x6c,0x6c,0x6c,0x6b,0x6b,0x6a,0x6a,
 | 
			
		||||
0x6a,0x69,0x69,0x69,0x68,0x68,0x67,0x67,
 | 
			
		||||
0x67,0x66,0x66,0x65,0x65,0x65,0x64,0x64,
 | 
			
		||||
0x64,0x63,0x63,0x62,0x62,0x62,0x61,0x61,
 | 
			
		||||
0x61,0x60,0x60,0x5f,0x5f,0x5f,0x5e,0x5e,
 | 
			
		||||
0x5d,0x5d,0x5d,0x5c,0x5c,0x5c,0x5b,0x5b,
 | 
			
		||||
0x5a,0x5a,0x5a,0x59,0x59,0x59,0x58,0x58,
 | 
			
		||||
0x58,0x57,0x57,0x56,0x56,0x56,0x55,0x55,
 | 
			
		||||
0x55,0x54,0x54,0x53,0x53,0x53,0x52,0x52,
 | 
			
		||||
0x52,0x51,0x51,0x51,0x50,0x50,0x4f,0x4f,
 | 
			
		||||
0x4f,0x4e,0x4e,0x4e,0x4d,0x4d,0x4d,0x4c,
 | 
			
		||||
0x4c,0x4b,0x4b,0x4b,0x4a,0x4a,0x4a,0x49,
 | 
			
		||||
0x49,0x49,0x48,0x48,0x48,0x47,0x47,0x47,
 | 
			
		||||
0x46,0x46,0x45,0x45,0x45,0x44,0x44,0x44,
 | 
			
		||||
0x43,0x43,0x43,0x42,0x42,0x42,0x41,0x41,
 | 
			
		||||
0x41,0x40,0x40,0x40,0x3f,0x3f,0x3f,0x3e,
 | 
			
		||||
0x3e,0x3e,0x3d,0x3d,0x3d,0x3c,0x3c,0x3c,
 | 
			
		||||
0x3b,0x3b,0x3b,0x3a,0x3a,0x3a,0x39,0x39,
 | 
			
		||||
0x39,0x38,0x38,0x38,0x37,0x37,0x37,0x36,
 | 
			
		||||
0x36,0x36,0x35,0x35,0x35,0x34,0x34,0x34,
 | 
			
		||||
0x34,0x33,0x33,0x33,0x32,0x32,0x32,0x31,
 | 
			
		||||
0x31,0x31,0x30,0x30,0x30,0x30,0x2f,0x2f,
 | 
			
		||||
0x2f,0x2e,0x2e,0x2e,0x2d,0x2d,0x2d,0x2d,
 | 
			
		||||
0x2c,0x2c,0x2c,0x2b,0x2b,0x2b,0x2a,0x2a,
 | 
			
		||||
0x2a,0x2a,0x29,0x29,0x29,0x28,0x28,0x28,
 | 
			
		||||
0x28,0x27,0x27,0x27,0x26,0x26,0x26,0x26,
 | 
			
		||||
0x25,0x25,0x25,0x25,0x24,0x24,0x24,0x23,
 | 
			
		||||
0x23,0x23,0x23,0x22,0x22,0x22,0x22,0x21,
 | 
			
		||||
0x21,0x21,0x21,0x20,0x20,0x20,0x1f,0x1f,
 | 
			
		||||
0x1f,0x1f,0x1e,0x1e,0x1e,0x1e,0x1d,0x1d,
 | 
			
		||||
0x1d,0x1d,0x1c,0x1c,0x1c,0x1c,0x1b,0x1b,
 | 
			
		||||
0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x19,
 | 
			
		||||
0x19,0x19,0x19,0x18,0x18,0x18,0x18,0x17,
 | 
			
		||||
0x17,0x17,0x17,0x17,0x16,0x16,0x16,0x16,
 | 
			
		||||
0x15,0x15,0x15,0x15,0x15,0x14,0x14,0x14,
 | 
			
		||||
0x14,0x14,0x13,0x13,0x13,0x13,0x13,0x12,
 | 
			
		||||
0x12,0x12,0x12,0x12,0x11,0x11,0x11,0x11,
 | 
			
		||||
0x11,0x10,0x10,0x10,0x10,0x10,0xf,0xf,
 | 
			
		||||
0xf,0xf,0xf,0xf,0xe,0xe,0xe,0xe,
 | 
			
		||||
0xe,0xd,0xd,0xd,0xd,0xd,0xd,0xc,
 | 
			
		||||
0xc,0xc,0xc,0xc,0xc,0xb,0xb,0xb,
 | 
			
		||||
0xb,0xb,0xb,0xa,0xa,0xa,0xa,0xa,
 | 
			
		||||
0xa,0xa,0x9,0x9,0x9,0x9,0x9,0x9,
 | 
			
		||||
0x9,0x8,0x8,0x8,0x8,0x8,0x8,0x8,
 | 
			
		||||
0x7,0x7,0x7,0x7,0x7,0x7,0x7,0x7,
 | 
			
		||||
0x6,0x6,0x6,0x6,0x6,0x6,0x6,0x6,
 | 
			
		||||
0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,
 | 
			
		||||
0x5,0x5,0x4,0x4,0x4,0x4,0x4,0x4,
 | 
			
		||||
0x4,0x4,0x4,0x4,0x3,0x3,0x3,0x3,
 | 
			
		||||
0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,
 | 
			
		||||
0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,
 | 
			
		||||
0x2,0x2,0x2,0x2,0x2,0x2,0x1,0x1,
 | 
			
		||||
0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,
 | 
			
		||||
0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,
 | 
			
		||||
0x1,0x1,0x1,0x1,0x0,0x0,0x0,0x0,
 | 
			
		||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
 | 
			
		||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
 | 
			
		||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
 | 
			
		||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
 | 
			
		||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
 | 
			
		||||
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
 | 
			
		||||
0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x1,
 | 
			
		||||
0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,
 | 
			
		||||
0x1,0x1,0x1,0x1,0x1,0x1,0x1,0x1,
 | 
			
		||||
0x1,0x1,0x1,0x2,0x2,0x2,0x2,0x2,
 | 
			
		||||
0x2,0x2,0x2,0x2,0x2,0x2,0x2,0x2,
 | 
			
		||||
0x2,0x3,0x3,0x3,0x3,0x3,0x3,0x3,
 | 
			
		||||
0x3,0x3,0x3,0x3,0x3,0x4,0x4,0x4,
 | 
			
		||||
0x4,0x4,0x4,0x4,0x4,0x4,0x4,0x5,
 | 
			
		||||
0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,
 | 
			
		||||
0x5,0x6,0x6,0x6,0x6,0x6,0x6,0x6,
 | 
			
		||||
0x6,0x7,0x7,0x7,0x7,0x7,0x7,0x7,
 | 
			
		||||
0x7,0x8,0x8,0x8,0x8,0x8,0x8,0x8,
 | 
			
		||||
0x9,0x9,0x9,0x9,0x9,0x9,0x9,0xa,
 | 
			
		||||
0xa,0xa,0xa,0xa,0xa,0xa,0xb,0xb,
 | 
			
		||||
0xb,0xb,0xb,0xb,0xc,0xc,0xc,0xc,
 | 
			
		||||
0xc,0xc,0xd,0xd,0xd,0xd,0xd,0xd,
 | 
			
		||||
0xe,0xe,0xe,0xe,0xe,0xf,0xf,0xf,
 | 
			
		||||
0xf,0xf,0xf,0x10,0x10,0x10,0x10,0x10,
 | 
			
		||||
0x11,0x11,0x11,0x11,0x11,0x12,0x12,0x12,
 | 
			
		||||
0x12,0x12,0x13,0x13,0x13,0x13,0x13,0x14,
 | 
			
		||||
0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15,
 | 
			
		||||
0x15,0x16,0x16,0x16,0x16,0x17,0x17,0x17,
 | 
			
		||||
0x17,0x17,0x18,0x18,0x18,0x18,0x19,0x19,
 | 
			
		||||
0x19,0x19,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,
 | 
			
		||||
0x1b,0x1b,0x1b,0x1c,0x1c,0x1c,0x1c,0x1d,
 | 
			
		||||
0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x1e,0x1f,
 | 
			
		||||
0x1f,0x1f,0x1f,0x20,0x20,0x20,0x21,0x21,
 | 
			
		||||
0x21,0x21,0x22,0x22,0x22,0x22,0x23,0x23,
 | 
			
		||||
0x23,0x23,0x24,0x24,0x24,0x25,0x25,0x25,
 | 
			
		||||
0x25,0x26,0x26,0x26,0x26,0x27,0x27,0x27,
 | 
			
		||||
0x28,0x28,0x28,0x28,0x29,0x29,0x29,0x2a,
 | 
			
		||||
0x2a,0x2a,0x2a,0x2b,0x2b,0x2b,0x2c,0x2c,
 | 
			
		||||
0x2c,0x2d,0x2d,0x2d,0x2d,0x2e,0x2e,0x2e,
 | 
			
		||||
0x2f,0x2f,0x2f,0x30,0x30,0x30,0x30,0x31,
 | 
			
		||||
0x31,0x31,0x32,0x32,0x32,0x33,0x33,0x33,
 | 
			
		||||
0x34,0x34,0x34,0x34,0x35,0x35,0x35,0x36,
 | 
			
		||||
0x36,0x36,0x37,0x37,0x37,0x38,0x38,0x38,
 | 
			
		||||
0x39,0x39,0x39,0x3a,0x3a,0x3a,0x3b,0x3b,
 | 
			
		||||
0x3b,0x3c,0x3c,0x3c,0x3d,0x3d,0x3d,0x3e,
 | 
			
		||||
0x3e,0x3e,0x3f,0x3f,0x3f,0x40,0x40,0x40,
 | 
			
		||||
0x41,0x41,0x41,0x42,0x42,0x42,0x43,0x43,
 | 
			
		||||
0x43,0x44,0x44,0x44,0x45,0x45,0x45,0x46,
 | 
			
		||||
0x46,0x47,0x47,0x47,0x48,0x48,0x48,0x49,
 | 
			
		||||
0x49,0x49,0x4a,0x4a,0x4a,0x4b,0x4b,0x4b,
 | 
			
		||||
0x4c,0x4c,0x4d,0x4d,0x4d,0x4e,0x4e,0x4e,
 | 
			
		||||
0x4f,0x4f,0x4f,0x50,0x50,0x51,0x51,0x51,
 | 
			
		||||
0x52,0x52,0x52,0x53,0x53,0x53,0x54,0x54,
 | 
			
		||||
0x55,0x55,0x55,0x56,0x56,0x56,0x57,0x57,
 | 
			
		||||
0x58,0x58,0x58,0x59,0x59,0x59,0x5a,0x5a,
 | 
			
		||||
0x5a,0x5b,0x5b,0x5c,0x5c,0x5c,0x5d,0x5d,
 | 
			
		||||
0x5d,0x5e,0x5e,0x5f,0x5f,0x5f,0x60,0x60,
 | 
			
		||||
0x61,0x61,0x61,0x62,0x62,0x62,0x63,0x63,
 | 
			
		||||
0x64,0x64,0x64,0x65,0x65,0x65,0x66,0x66,
 | 
			
		||||
0x67,0x67,0x67,0x68,0x68,0x69,0x69,0x69,
 | 
			
		||||
0x6a,0x6a,0x6a,0x6b,0x6b,0x6c,0x6c,0x6c,
 | 
			
		||||
0x6d,0x6d,0x6e,0x6e,0x6e,0x6f,0x6f,0x70,
 | 
			
		||||
0x70,0x70,0x71,0x71,0x71,0x72,0x72,0x73,
 | 
			
		||||
0x73,0x73,0x74,0x74,0x75,0x75,0x75,0x76,
 | 
			
		||||
0x76,0x77,0x77,0x77,0x78,0x78,0x78,0x79,
 | 
			
		||||
0x79,0x7a,0x7a,0x7a,0x7b,0x7b,0x7c,0x7c,
 | 
			
		||||
0x7c,0x7d,0x7d,0x7e,0x7e,0x7e,0x7f,0x7f
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -53,6 +53,9 @@ ifdef MIDI_ENABLE
 | 
			
		|||
    OPT_DEFS += -DMIDI_ENABLE
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifdef AUDIO_ENABLE
 | 
			
		||||
    OPT_DEFS += -DAUDIO_ENABLE
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifdef USB_6KRO_ENABLE
 | 
			
		||||
    OPT_DEFS += -DUSB_6KRO_ENABLE
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,8 +52,8 @@
 | 
			
		|||
#include "descriptor.h"
 | 
			
		||||
#include "lufa.h"
 | 
			
		||||
 | 
			
		||||
#ifdef MIDI_ENABLE
 | 
			
		||||
    #include <beeps.h>
 | 
			
		||||
#ifdef AUDIO_ENABLE
 | 
			
		||||
    #include <audio.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef BLUETOOTH_ENABLE
 | 
			
		||||
| 
						 | 
				
			
			@ -946,6 +946,8 @@ int main(void)
 | 
			
		|||
#ifdef MIDI_ENABLE
 | 
			
		||||
void fallthrough_callback(MidiDevice * device,
 | 
			
		||||
    uint16_t cnt, uint8_t byte0, uint8_t byte1, uint8_t byte2){
 | 
			
		||||
 | 
			
		||||
#ifdef AUDIO_ENABLE
 | 
			
		||||
  if (cnt == 3) {
 | 
			
		||||
    switch (byte0 & 0xF0) {
 | 
			
		||||
        case MIDI_NOTEON:
 | 
			
		||||
| 
						 | 
				
			
			@ -959,6 +961,7 @@ void fallthrough_callback(MidiDevice * device,
 | 
			
		|||
  if (byte0 == MIDI_STOP) {
 | 
			
		||||
    stop_all_notes();
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void cc_callback(MidiDevice * device,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue