Add giabalanai keyboard (#10125)

by 3araht
This commit is contained in:
3araht
2022-09-01 05:05:43 +09:00
committed by GitHub
parent d4c935d8fa
commit 1ccd0c19da
39 changed files with 5283 additions and 0 deletions

View File

@@ -0,0 +1,9 @@
#pragma once
//#define USE_MATRIX_I2C
/* Select hand configuration */
// #define MASTER_LEFT
// #define MASTER_RIGHT
#define EE_HANDS

View File

@@ -0,0 +1,739 @@
/* Copyright 2020 3araht
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
#include "split_util.h"
#include "print.h"
#include "version.h"
// Alias layout macros that expand groups of keys.
#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
#define DF_QWER DF(_QWERTY)
#define DF_COLE DF(_COLEMAK)
#define MO_ADJ MO(_ADJUST)
// Long press: go to _FN layer, tap: MUTE
#define FN_MUTE LT(_FN, KC_MUTE)
#define SHIF_UP RSFT_T(KC_UP)
#define ADJ_EIS LT(_ADJUST,KC_LANG2)
#define MIS_KAN LT(_MISC,KC_LANG1)
// Used to set octave to MI_OCT_0
extern midi_config_t midi_config;
uint8_t midi_bass_ch = 0, midi_chord_ch = 0; // By default, all use the same channel.
// UNISON flags
static bool melody_dyad_high = false; // true when +1 octave unison dyad is enabled.
static bool melody_dyad_low = false; // true when -1 octave unison dyad is enabled.
static bool melody_unison_suppress = true; // true: velocity of octave unison note is suppressd to UNISON_VELOCITY_RATIO
// To record the status of Bass Chord (single or dyad, default: dyad.)
typedef union {
uint32_t raw;
struct {
bool isSingleBass:1;
};
} user_config_t;
user_config_t user_config;
#define IS_SINGLE_BASS() (user_config.isSingleBass)
#ifdef RGBLIGHT_ENABLE
/* used to specify there is no LED on the keylocation. */
# define NO_LED 255
#endif // RGBLIGHT_ENABLE
// Defines names for use in layer keycodes and the keymap
enum layer_names {
_C_SYSTEM_BASE, // MIDI C-system
_FAKE_B_SYSTEM, // MIDI fake B-system doesn't have correct assignments on top two rows. The bottom 3 rows are B-system.
_C_SYSTEM_BASS2ROW, // counter bass system
_C_SYSTEM_ENTIRELY, // single notes for both left and right keybaords.
_CHROMATONE,
_CFLIP_BASS2ROW, // 180 degree flipped layout on right side keyboard
_QWERTY,
_COLEMAK,
_ADJUST, // for Fn keys, etc.
_FN // for changing layers, octaves, etc.
};
// Defines the keycodes used by our macros in process_record_user
enum custom_keycodes {
// MIDI Chord Keycodes - Root notes
MY_CHORD_MIN = SAFE_RANGE,
MI_CH_Cr = MY_CHORD_MIN,
MI_CH_Csr,
MI_CH_Dbr = MI_CH_Csr,
MI_CH_Dr,
MI_CH_Dsr,
MI_CH_Ebr = MI_CH_Dsr,
MI_CH_Er,
MI_CH_Fr,
MI_CH_Fsr,
MI_CH_Gbr = MI_CH_Fsr,
MI_CH_Gr,
MI_CH_Gsr,
MI_CH_Abr = MI_CH_Gsr,
MI_CH_Ar,
MI_CH_Asr,
MI_CH_Bbr = MI_CH_Asr,
MI_CH_Br,
// MIDI Chord Keycodes - Major
MI_CH_C,
MI_CH_Cs,
MI_CH_Db = MI_CH_Cs,
MI_CH_D,
MI_CH_Ds,
MI_CH_Eb = MI_CH_Ds,
MI_CH_E,
MI_CH_F,
MI_CH_Fs,
MI_CH_Gb = MI_CH_Fs,
MI_CH_G,
MI_CH_Gs,
MI_CH_Ab = MI_CH_Gs,
MI_CH_A,
MI_CH_As,
MI_CH_Bb = MI_CH_As,
MI_CH_B,
// MIDI Chord Keycodes Minor
MI_CH_Cm,
MI_CH_Csm,
MI_CH_Dbm = MI_CH_Csm,
MI_CH_Dm,
MI_CH_Dsm,
MI_CH_Ebm = MI_CH_Dsm,
MI_CH_Em,
MI_CH_Fm,
MI_CH_Fsm,
MI_CH_Gbm = MI_CH_Fsm,
MI_CH_Gm,
MI_CH_Gsm,
MI_CH_Abm = MI_CH_Gsm,
MI_CH_Am,
MI_CH_Asm,
MI_CH_Bbm = MI_CH_Asm,
MI_CH_Bm,
//MIDI Chord Keycodes Dominant Seventh
MI_CH_CDom7,
MI_CH_CsDom7,
MI_CH_DbDom7 = MI_CH_CsDom7,
MI_CH_DDom7,
MI_CH_DsDom7,
MI_CH_EbDom7 = MI_CH_DsDom7,
MI_CH_EDom7,
MI_CH_FDom7,
MI_CH_FsDom7,
MI_CH_GbDom7 = MI_CH_FsDom7,
MI_CH_GDom7,
MI_CH_GsDom7,
MI_CH_AbDom7 = MI_CH_GsDom7,
MI_CH_ADom7,
MI_CH_AsDom7,
MI_CH_BbDom7 = MI_CH_AsDom7,
MI_CH_BDom7,
// MIDI Chord Keycodes Diminished Seventh
MI_CH_CDim7,
MI_CH_CsDim7,
MI_CH_DbDim7 = MI_CH_CsDim7,
MI_CH_DDim7,
MI_CH_DsDim7,
MI_CH_EbDim7 = MI_CH_DsDim7,
MI_CH_EDim7,
MI_CH_FDim7,
MI_CH_FsDim7,
MI_CH_GbDim7 = MI_CH_FsDim7,
MI_CH_GDim7,
MI_CH_GsDim7,
MI_CH_AbDim7 = MI_CH_GsDim7,
MI_CH_ADim7,
MI_CH_AsDim7,
MI_CH_BbDim7 = MI_CH_AsDim7,
MI_CH_BDim7,
MY_CHORD_MAX = MI_CH_BDim7,
VERSION,
CSYSTEM, // C-SYSTEM layout
BSYSTEM, // B-SYSTEM layout
CNTBASC, // CouNTer BASs C-system layout
CSYSALL, // C-SYStem ALL layout
CHRTONE, // CHRomaTONE layout
CFLIP2B, // C-system FLIPped 2(to) Backwards
TGLBASS, // ToGgLe BASS unison
TGLMICH, // ToGgLe MIdi CHannel separation
MELDYAL, // MELody DYad Low
MELODYS, // MELODY Single
MELDYAH, // MELody DYad High
TGLUVEL // ToGgLe Unison VELocity
};
#define MY_CHORD_COUNT (MY_CHORD_MAX - MY_CHORD_MIN + 1)
static uint8_t chord_status[MY_CHORD_COUNT];
static uint8_t my_tone_status[MIDI_TONE_COUNT];
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* C-system Base */
[_C_SYSTEM_BASE] = LAYOUT(
MI_CH_Dbr, MI_CH_Abr, MI_CH_Ebr, MI_CH_Bbr, MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr,
MI_CH_Db, MI_CH_Ab, MI_CH_Eb, MI_CH_Bb, MI_CH_F, MI_CH_C, MI_CH_G, MI_CH_D, MI_CH_A, MI_CH_E, MI_CH_B, MI_CH_Fs,
MI_CH_Dbm, MI_CH_Abm, MI_CH_Ebm, MI_CH_Bbm, MI_CH_Fm, MI_CH_Cm, MI_CH_Gm, MI_CH_Dm, MI_CH_Am, MI_CH_Em, MI_CH_Bm, MI_CH_Fsm,
MI_CH_DbDom7, MI_CH_AbDom7, MI_CH_EbDom7, MI_CH_BbDom7, MI_CH_FDom7, MI_CH_CDom7, MI_CH_GDom7, MI_CH_DDom7, MI_CH_ADom7, MI_CH_EDom7, MI_CH_BDom7, MI_CH_FsDom7,
MI_CH_DbDim7, MI_CH_AbDim7, MI_CH_EbDim7, MI_CH_BbDim7, MI_CH_FDim7, MI_CH_CDim7, MI_CH_GDim7, MI_CH_DDim7, MI_CH_ADim7, MI_CH_EDim7, MI_CH_BDim7, MI_CH_FsDim7,
MI_Fs_2,
MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5, FN_MUTE,
MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Fs_5
),
/* fake B-system */
[_FAKE_B_SYSTEM] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
MI_Ab_2,
MI_A_2, MI_C_3, MI_Eb_3, MI_Gb_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Gb_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Gb_5, _______,
MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5
),
/* BASS2row */
[_C_SYSTEM_BASS2ROW] = LAYOUT(
MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr, MI_CH_Csr, MI_CH_Gsr, MI_CH_Dsr, MI_CH_Asr,
MI_CH_Dbr, MI_CH_Abr, MI_CH_Ebr, MI_CH_Bbr, MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr,
MI_CH_Db, MI_CH_Ab, MI_CH_Eb, MI_CH_Bb, MI_CH_F, MI_CH_C, MI_CH_G, MI_CH_D, MI_CH_A, MI_CH_E, MI_CH_B, MI_CH_Fs,
MI_CH_Dbm, MI_CH_Abm, MI_CH_Ebm, MI_CH_Bbm, MI_CH_Fm, MI_CH_Cm, MI_CH_Gm, MI_CH_Dm, MI_CH_Am, MI_CH_Em, MI_CH_Bm, MI_CH_Fsm,
MI_CH_DbDom7, MI_CH_AbDom7, MI_CH_EbDom7, MI_CH_BbDom7, MI_CH_FDom7, MI_CH_CDom7, MI_CH_GDom7, MI_CH_DDom7, MI_CH_ADom7, MI_CH_EDom7, MI_CH_BDom7, MI_CH_FsDom7,
MI_Fs_2,
MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5, _______,
MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Fs_5
),
/* C-system entirely */
[_C_SYSTEM_ENTIRELY] = LAYOUT(
MI_BENDU, XXXXXXX, XXXXXXX, MI_Db, MI_E, MI_G, MI_Bb, MI_Db_1, MI_E_1, MI_G_1, MI_Bb_1, MI_Db_2,
MI_BENDD, XXXXXXX, MI_C, MI_Eb, MI_Fs, MI_A, MI_C_1, MI_Eb_1, MI_Fs_1, MI_A_1, MI_C_2, MI_Eb_2,
XXXXXXX, XXXXXXX, MI_D, MI_F, MI_Ab, MI_B, MI_D_1, MI_F_1, MI_Ab_1, MI_B_1, MI_D_2, MI_F_2,
XXXXXXX, MI_Db, MI_E, MI_G, MI_Bb, MI_Db_1, MI_E_1, MI_G_1, MI_Bb_1, MI_Db_2, MI_E_2, MI_G_2,
MI_C, MI_Eb, MI_Fs, MI_A, MI_C_1, MI_Eb_1, MI_Fs_1, MI_A_1, MI_C_2, MI_Eb_2, MI_Fs_2, MI_A_2,
MI_Fs_2,
MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5, FN_MUTE,
MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Fs_5
),
/* Chromatone */
[_CHROMATONE] = LAYOUT(
MI_Db, MI_Eb, MI_F, MI_G, MI_A, MI_B, MI_Db_1, MI_Eb_1, MI_F_1, MI_G_1, MI_A_1, MI_B_1,
MI_D, MI_E, MI_Fs, MI_Ab, MI_Bb, MI_C_1, MI_D_1, MI_E_1, MI_Fs_1, MI_Ab_1, MI_Bb_1, MI_C_2,
MI_Eb, MI_F, MI_G, MI_A, MI_B, MI_Db_1, MI_Eb_1, MI_F_1, MI_G_1, MI_A_1, MI_B_1, MI_Db_2,
MI_E, MI_Fs, MI_Ab, MI_Bb, MI_C_1, MI_D_1, MI_E_1, MI_Fs_1, MI_Ab_1, MI_Bb_1, MI_C_2, MI_D_2,
MI_F, MI_G, MI_A, MI_B, MI_Db_1, MI_Eb_1, MI_F_1, MI_G_1, MI_A_1, MI_B_1, MI_Db_2, MI_Eb_2,
MI_C_2,
MI_Db_2, MI_Eb_2, MI_F_2, MI_G_2, MI_A_2, MI_B_2, MI_Db_3, MI_Eb_3, MI_F_3, MI_G_3, MI_A_3, MI_B_3, FN_MUTE,
MI_C_2, MI_D_2, MI_E_2, MI_Gb_2, MI_Ab_2, MI_Bb_2, MI_C_3, MI_D_3, MI_E_3, MI_Gb_3, MI_Ab_3, MI_Bb_3, MI_C_4,
MI_Db_2, MI_Eb_2, MI_F_2, MI_G_2, MI_A_2, MI_B_2, MI_Db_3, MI_Eb_3, MI_F_3, MI_G_3, MI_A_3, MI_B_3
),
[_CFLIP_BASS2ROW] = LAYOUT(
MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr, MI_CH_Csr, MI_CH_Gsr, MI_CH_Dsr, MI_CH_Asr,
MI_CH_Dbr, MI_CH_Abr, MI_CH_Ebr, MI_CH_Bbr, MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr,
MI_CH_Db, MI_CH_Ab, MI_CH_Eb, MI_CH_Bb, MI_CH_F, MI_CH_C, MI_CH_G, MI_CH_D, MI_CH_A, MI_CH_E, MI_CH_B, MI_CH_Fs,
MI_CH_Dbm, MI_CH_Abm, MI_CH_Ebm, MI_CH_Bbm, MI_CH_Fm, MI_CH_Cm, MI_CH_Gm, MI_CH_Dm, MI_CH_Am, MI_CH_Em, MI_CH_Bm, MI_CH_Fsm,
MI_CH_DbDom7, MI_CH_AbDom7, MI_CH_EbDom7, MI_CH_BbDom7, MI_CH_FDom7, MI_CH_CDom7, MI_CH_GDom7, MI_CH_DDom7, MI_CH_ADom7, MI_CH_EDom7, MI_CH_BDom7, MI_CH_FsDom7,
MI_G_5,
MI_F_5, MI_D_5, MI_B_4, MI_Ab_4, MI_F_4, MI_D_4, MI_B_3, MI_Ab_3, MI_F_3, MI_D_3, MI_B_2, MI_Ab_2, FN_MUTE,
MI_Fs_5, MI_Eb_5, MI_C_5, MI_A_4, MI_Fs_4, MI_Eb_4, MI_C_4, MI_A_3, MI_Fs_3, MI_Eb_3, MI_C_3, MI_A_2, MI_Fs_2,
MI_E_5, MI_Db_5, MI_Bb_4, MI_G_4, MI_E_4, MI_Db_4, MI_Bb_3, MI_G_3, MI_E_3, MI_Db_3, MI_Bb_2, MI_G_2
),
/* QWERTY */
[_QWERTY] = LAYOUT_wrapper(
KC_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
KC_TAB, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL,
KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT,
KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, ADJ_EIS, KC_SPC, KC_SPC, KC_LANG1, KC_APP, MO_ADJ, KC_LEFT, KC_DOWN, KC_RGHT,
_______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
/* COLEMAK */
[_COLEMAK] = LAYOUT_wrapper(
KC_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
KC_TAB, _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, KC_DEL,
KC_LCTL, _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, KC_ENT,
KC_LSFT, _________________COLEMAK_L3________________, _________________COLEMAK_R3________________, SHIF_UP,
KC_CAPS, KC_LGUI, KC_LALT, ADJ_EIS, KC_SPC, KC_SPC, KC_LANG1, KC_APP, MO_ADJ, KC_LEFT, KC_DOWN, KC_RGHT,
_______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
/* ADJUST */
[_ADJUST] = LAYOUT_wrapper(
_______, _________________FUNC__L___________________, _________________FUNC__R___________________, _______,
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, KC_EQL, _______,
_______, KC_VOLD, KC_VOLU, KC_MUTE, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_GRV, _______,
_______, KC_BRID, KC_BRIU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LBRC, KC_RBRC, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_QUOT, KC_BSLS, _______,
_______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
/* Fn */
[_FN] = LAYOUT(
CSYSTEM, BSYSTEM, CNTBASC, CSYSALL, CHRTONE, CFLIP2B, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG,
DF_QWER, TGLBASS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
DF_COLE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, TGLMICH,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX,
MI_OCT_N2, MI_OCT_N1, MI_OCT_0, MI_OCT_1, MI_OCT_2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, VERSION, EEP_RST, _______,
CSYSTEM, BSYSTEM, CNTBASC, CSYSALL, CHRTONE, CFLIP2B, XXXXXXX, XXXXXXX, XXXXXXX, MI_VELD, MI_VELU, XXXXXXX, RGB_TOG,
XXXXXXX, TGLBASS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, TGLUVEL, MELDYAL, MELODYS, MELDYAH
)
};
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[_C_SYSTEM_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_FAKE_B_SYSTEM] = { ENCODER_CCW_CW(_______, _______) },
[_C_SYSTEM_BASS2ROW] = { ENCODER_CCW_CW(_______, _______) },
[_C_SYSTEM_ENTIRELY] = { ENCODER_CCW_CW(_______, _______) },
[_CHROMATONE] = { ENCODER_CCW_CW(_______, _______) },
[_CFLIP_BASS2ROW] = { ENCODER_CCW_CW(_______, _______) },
[_QWERTY] = { ENCODER_CCW_CW(_______, _______) },
[_COLEMAK] = { ENCODER_CCW_CW(_______, _______) },
[_ADJUST] = { ENCODER_CCW_CW(_______, _______) },
[_FN] = { ENCODER_CCW_CW(_______, _______) },
};
#endif
#ifdef RGBLIGHT_ENABLE
// Light up adjust layer keys (left keyboard)
const rgblight_segment_t PROGMEM my_adjust_layer[] = RGBLIGHT_LAYER_SEGMENTS({1, 10, HSV_ORANGE},
{21, 2, HSV_ORANGE},
{25, 3, HSV_ORANGE},
{30, 5, HSV_ORANGE},
{37, 2, HSV_ORANGE},
{45, 2, HSV_ORANGE},
{57, 2, HSV_ORANGE}
);
// Light up fn layer keys
const rgblight_segment_t PROGMEM my_fn_layer[] = RGBLIGHT_LAYER_SEGMENTS( // left keyboard
{0, 6, HSV_ORANGE}, // MIDI layouts
{11, 1, HSV_RED}, // RGB_TOG
{12, 1, HSV_WHITE}, // DF_QWER
{13, 1, HSV_CORAL}, // TGLBASS
{24, 1, HSV_WHITE}, // DF_COLE
{35, 1, HSV_TEAL}, // TGLMICH
#if 0 // Color Test
{36, 1, HSV_WHITE},
{37, 1, HSV_RED},
{38, 1, HSV_CORAL},
{39, 1, HSV_ORANGE},
{40, 1, HSV_GOLDENROD},
{41, 1, HSV_GOLD},
{42, 1, HSV_YELLOW},
{43, 1, HSV_CHARTREUSE},
{44, 1, HSV_GREEN},
{45, 1, HSV_SPRINGGREEN},
{46, 1, HSV_TURQUOISE},
{47, 1, HSV_TEAL},
{48, 1, HSV_CYAN},
{49, 1, HSV_AZURE},
{50, 1, HSV_BLUE},
{51, 1, HSV_PURPLE},
{52, 1, HSV_MAGENTA},
{53, 1, HSV_PINK},
#endif
// right keyboard
{60, 6, HSV_ORANGE}, // MIDI layouts
{74, 1, HSV_CORAL}, // TGLBASS
{85, 1, HSV_BLUE}, // MIDI Oct
{86, 1, HSV_CYAN}, // MIDI Oct
{87, 1, HSV_SPRINGGREEN}, // MIDI Oct
{88, 1, HSV_GREEN}, // MIDI Oct
{89, 1, HSV_CHARTREUSE}, // MIDI Oct
{96, 1, HSV_PINK}, // EEP_RST
{98, 6, HSV_ORANGE}, // MIDI layouts
{107, 1, HSV_YELLOW}, // MI_VELD
{108, 1, HSV_GREEN}, // MI_VELU
{110, 1, HSV_RED}, // RGB_TOG
{112, 1, HSV_CORAL}, // TGLBASS
{119, 1, HSV_CORAL}, // TGLUVEL
{120, 1, HSV_CYAN}, // MELDYAL
{121, 1, HSV_GOLD}, // MELODYS
{122, 1, HSV_SPRINGGREEN} // MELDYAH
);
// Now define the array of layers. Later layers take precedence
const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(my_fn_layer, my_adjust_layer);
layer_state_t layer_state_set_user(layer_state_t state) {
// Both layers will light up if both kb layers are active
rgblight_set_layer_state(0, layer_state_cmp(state, _FN));
rgblight_set_layer_state(1, layer_state_cmp(state, _ADJUST));
return state;
};
#endif // RGBLIGHT_ENABLE
void my_init(void){
// Set octave to MI_OCT_0
midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN;
// avoid using 127 since it is used as a special number in some sound sources.
midi_config.velocity = MIDI_INITIAL_VELOCITY;
}
void eeconfig_init_user(void) {
midi_init();
my_init();
// Used to set octave to MI_OCT_0
midi_bass_ch = 0, midi_chord_ch = 0; // By default, all use the same channel.
// UNISON flags
melody_dyad_high = false; // true when +1 octave unison dyad is enabled.
melody_dyad_low = false; // true when -1 octave unison dyad is enabled.
melody_unison_suppress = true; // true: velocity of octave unison note is suppressd to UNISON_VELOCITY_RATIO
// Reset Bass setting
user_config.raw = 0; // default: dyad
eeconfig_update_user(user_config.raw);
// Reset the midi keyboard layout
set_single_persistent_default_layer(_C_SYSTEM_BASS2ROW);
}
void keyboard_post_init_user(void) {
my_init();
for (uint8_t i = 0; i < MY_CHORD_COUNT; i++) {
chord_status[i] = MIDI_INVALID_NOTE;
}
for (uint8_t i = 0; i < MIDI_TONE_COUNT; i++) {
my_tone_status[i] = MIDI_INVALID_NOTE;
}
// load EEPROM data for isSingleBass
user_config.raw = eeconfig_read_user();
// When USB cable is connected to the left side keyboard, use QWERTY layout by default.
if (is_keyboard_master() && isLeftHand) {
default_layer_set(1UL << _QWERTY);
}
#ifdef RGBLIGHT_ENABLE
rgblight_layers = my_rgb_layers;
// Reset LED off
rgblight_sethsv(HSV_BLACK);
# if defined(RGBLIGHT_EFFECT_KNIGHT) || defined(RGBLIGHT_EFFECT_TWINKLE)
rgblight_sethsv(30, 50, 40);
# ifdef RGBLIGHT_EFFECT_KNIGHT
rgblight_mode(RGBLIGHT_MODE_KNIGHT);
# elif defined(RGBLIGHT_EFFECT_TWINKLE)
rgblight_mode(RGBLIGHT_MODE_TWINKLE+3);
# endif
# endif
#endif // RGBLIGHT_ENABLE
};
void toggle_isSingleBass(void) {
#ifdef CONSOLE_ENABLE
uprintf("isSingleBass(before) %u\n", user_config.isSingleBass);
#endif
user_config.isSingleBass = !user_config.isSingleBass;
#ifdef CONSOLE_ENABLE
uprintf("isSingleBass(after) %u\n", user_config.isSingleBass);
#endif
eeconfig_update_user(user_config.raw);
}
void toggle_MIDI_channel_separation(void) {
if (midi_chord_ch > 0) {
midi_chord_ch = 0;
midi_bass_ch = 0;
} else {
midi_chord_ch = 1;
midi_bass_ch = 2;
}
}
#ifdef RGBLIGHT_ENABLE
void switch_keylight_color4bass(keyrecord_t *record, uint8_t keylocation){
switch (biton32(default_layer_state)) {
case _C_SYSTEM_BASE:
keylight_manager(record, HSV_GREEN, keylocation);
break;
case _FAKE_B_SYSTEM:
keylight_manager(record, HSV_ORANGE, keylocation);
break;
case _C_SYSTEM_BASS2ROW:
keylight_manager(record, HSV_YELLOW, keylocation);
break;
case _CFLIP_BASS2ROW:
keylight_manager(record, HSV_PURPLE, keylocation);
break;
}
}
void switch_keylight_color4chords(keyrecord_t *record, uint8_t keylocation){
switch (biton32(default_layer_state)) {
case _C_SYSTEM_BASE:
keylight_manager(record, HSV_SPRINGGREEN, keylocation);
break;
case _FAKE_B_SYSTEM:
keylight_manager(record, HSV_YELLOW, keylocation);
break;
case _C_SYSTEM_BASS2ROW:
keylight_manager(record, HSV_GOLDENROD, keylocation);
break;
case _CFLIP_BASS2ROW:
keylight_manager(record, HSV_MAGENTA, keylocation);
break;
}
}
#endif // RGBLIGHT_ENABLE
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
uint16_t root_note = MIDI_INVALID_NOTE; // Starting value for the root note of each chord
#ifdef RGBLIGHT_ENABLE
/* prepare for turning on LEDs when keys are pressed. */
uint8_t r = record->event.key.row;
uint8_t c = record->event.key.col;
// uint8_t keylocation = convert_key_to_led[MATRIX_COLS * r + c];
// uint8_t keylocation2 = convert_key_to_led2[MATRIX_COLS * r + c];
uint8_t keylocation = pgm_read_byte(&convert_key_to_led[MATRIX_COLS * r + c]);
uint8_t keylocation2 = pgm_read_byte(&convert_key_to_led2[MATRIX_COLS * r + c]);
#endif // RGBLIGHT_ENABLE
uint8_t chord = keycode - MY_CHORD_MIN;
switch (keycode) {
case VERSION: // Output firmware info.
if (record->event.pressed) {
SEND_STRING(QMK_KEYBOARD ":" QMK_KEYMAP " @ " QMK_VERSION " | " QMK_BUILDDATE);
}
break;
// set default layer and save it to EEPROM when MIDI key layers are selected.
case CSYSTEM:
if (record->event.pressed) {
set_single_persistent_default_layer(_C_SYSTEM_BASE);
}
break;
case BSYSTEM:
if (record->event.pressed) {
set_single_persistent_default_layer(_FAKE_B_SYSTEM);
}
break;
case CNTBASC:
if (record->event.pressed) {
set_single_persistent_default_layer(_C_SYSTEM_BASS2ROW);
}
break;
case CSYSALL:
if (record->event.pressed) {
set_single_persistent_default_layer(_C_SYSTEM_ENTIRELY);
}
break;
case CHRTONE:
if (record->event.pressed) {
set_single_persistent_default_layer(_CHROMATONE);
}
break;
case CFLIP2B:
if (record->event.pressed) {
set_single_persistent_default_layer(_CFLIP_BASS2ROW);
}
break;
case TGLBASS:
if (record->event.pressed) {
toggle_isSingleBass();
};
break;
case TGLMICH:
if (record->event.pressed) {
toggle_MIDI_channel_separation();
};
break;
case MELDYAL:
if (record->event.pressed) {
melody_dyad_low = true;
melody_dyad_high = false;
};
break;
case MELODYS:
if (record->event.pressed) {
melody_dyad_low = false;
melody_dyad_high = false;
};
break;
case MELDYAH:
if (record->event.pressed) {
melody_dyad_low = false;
melody_dyad_high = true;
};
break;
case TGLUVEL:
if (record->event.pressed) {
melody_unison_suppress = !melody_unison_suppress;
};
break;
// MIDI Chord Keycodes, on the left side.
case MI_CH_Cr ... MI_CH_Br: // Root Notes
root_note = keycode - MI_CH_Cr + MI_C_1;
my_process_midi4Bass(midi_bass_ch, record, chord_status, chord, root_note, IS_SINGLE_BASS());
#ifdef RGBLIGHT_ENABLE
switch_keylight_color4bass(record, keylocation);
#endif
break;
case MI_CH_C ... MI_CH_B: // Major Chords
root_note = keycode - MI_CH_C + MI_C_2;
// Root, Major Third, and Fifth Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 4, 7);
#ifdef RGBLIGHT_ENABLE
switch_keylight_color4chords(record, keylocation);
#endif
break;
case MI_CH_Cm ... MI_CH_Bm: // Minor Chord
root_note = keycode - MI_CH_Cm + MI_C_2;
// Root, Minor Third, and Fifth Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 7);
#ifdef RGBLIGHT_ENABLE
switch_keylight_color4chords(record, keylocation);
#endif
break;
case MI_CH_CDom7 ... MI_CH_BDom7: // Dominant 7th Chord
root_note = keycode - MI_CH_CDom7 + MI_C_2;
// Major Third, Major Fifth, and Minor Seventh Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 4, 7, 10);
#ifdef RGBLIGHT_ENABLE
switch_keylight_color4chords(record, keylocation);
#endif
break;
case MI_CH_CDim7 ... MI_CH_BDim7: // Diminished 7th Chord
root_note = keycode - MI_CH_CDim7 + MI_C_2;
// Root, Minor Third, and Diminished 5th Note
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 6);
#ifdef RGBLIGHT_ENABLE
switch_keylight_color4chords(record, keylocation);
#endif
break;
#ifdef RGBLIGHT_ENABLE
case KC_A ... KC_RGUI: // for QWERTY
case KC_GESC:
case ADJ_EIS:
case MO_ADJ:
case SHIF_UP:
keylight_manager(record, HSV_RED, keylocation);
break;
#endif
// Keycodes on the right side.
case MIDI_TONE_MIN ... MIDI_TONE_MAX: // notes on the right side keyboard.
// root_note is played by process_midi().
if ( melody_dyad_high == true ) { // play 1 octave higher as well.
my_process_midi(0, keycode, record, my_tone_status, 12, melody_unison_suppress);
#ifdef RGBLIGHT_ENABLE
keylight_manager(record, HSV_RED, keylocation);
keylight_manager(record, HSV_RED, keylocation2);
#endif
} else if ( melody_dyad_low == true ) { // play 1 octave lower as well.
my_process_midi(0, keycode, record, my_tone_status, -12, melody_unison_suppress);
#ifdef RGBLIGHT_ENABLE
keylight_manager(record, HSV_CYAN, keylocation);
keylight_manager(record, HSV_CYAN, keylocation2);
#endif
} else {
uprintf("layer=%u, default_layer_state = %u\n", biton32(default_layer_state), default_layer_state);
#ifdef RGBLIGHT_ENABLE
keylight_manager(record, HSV_GOLDENROD, keylocation);
keylight_manager(record, HSV_GOLDENROD, keylocation2);
#endif
}
break;
#ifdef RGBLIGHT_ENABLE
// case KC_MUTE:
case FN_MUTE:
keylight_manager(record, HSV_GOLDENROD, keylocation);
break;
#endif
}
// If console is enabled, it will print the matrix position and status of each key pressed
#if defined(CONSOLE_ENABLE) && defined(RGBLIGHT_ENABLE)
uprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
uprintf("r=%d, c=%d, keyloc=%d, keyloc2=%d, matrix_col x r + c = %d\n", r, c, keylocation, keylocation2, MATRIX_COLS * r + c);
#endif
return true;
}

View File

@@ -0,0 +1,12 @@
# A personal keymap for giabalanai with RGBLIGHT_ENABLE = yes in rules.mk, which 3araht is using.
"2firmware" requires writing the firmware separately to left and right keyboards in order to have different functionality when USB cable is connected to the left side keyboard. It can be used without the right side.
(EE_HANDS is defined in 2firmware/config.h).
When USB cable is connected to the left side keyboard, QWERTY layout is used by default.
Use below for writing the firmware to the left side keyboard.
> make giabalanai:2firmware:avrdude-split-left
Use below for writing the firmware to the right side keyboard.
> make giabalanai:2firmware:avrdude-split-right

View File

@@ -0,0 +1,4 @@
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
CONSOLE_ENABLE = no # Console for debug
ENCODER_MAP_ENABLE = yes # replacing ENCODERS_CW_KEY method to this on 2022/08/31.

View File

@@ -0,0 +1,754 @@
/* Copyright 2020 3araht
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
#include "print.h"
#include "version.h"
// Alias layout macros that expand groups of keys.
#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
#define DF_QWER DF(_QWERTY)
#define DF_COLE DF(_COLEMAK)
#define MO_ADJ MO(_ADJUST)
// Long press: go to _FN layer, tap: MUTE
#define FN_MUTE LT(_FN, KC_MUTE)
#define SHIF_UP RSFT_T(KC_UP)
#define ADJ_EIS LT(_ADJUST,KC_LANG2)
#define MIS_KAN LT(_MISC,KC_LANG1)
// Used to set octave to MI_OCT_0
extern midi_config_t midi_config;
uint8_t midi_bass_ch = 0, midi_chord_ch = 0; // By default, all use the same channel.
// UNISON flags
static bool melody_dyad_high = false; // true when +1 octave unison dyad is enabled.
static bool melody_dyad_low = false; // true when -1 octave unison dyad is enabled.
static bool melody_unison_suppress = true; // true: velocity of octave unison note is suppressd to UNISON_VELOCITY_RATIO
// To record the status of Bass Chord (single or dyad, default: dyad.)
typedef union {
uint32_t raw;
struct {
bool isSingleBass:1;
};
} user_config_t;
user_config_t user_config;
#define IS_SINGLE_BASS() (user_config.isSingleBass)
#ifdef RGBLIGHT_ENABLE
/* used to specify there is no LED on the keylocation. */
# define NO_LED 255
#endif // RGBLIGHT_ENABLE
// Defines names for use in layer keycodes and the keymap
enum layer_names {
_C_SYSTEM_BASE, // MIDI C-system
_FAKE_B_SYSTEM, // MIDI fake B-system doesn't have correct assignments on top two rows. The bottom 3 rows are B-system.
_C_SYSTEM_BASS2ROW, // counter bass system
_C_SYSTEM_ENTIRELY, // single notes for both left and right keybaords.
_C_SYSTEM_FREEBASS, // C-system Free Bass
_CHROMATONE,
_CFLIP_BASS2ROW, // 180 degree flipped layout on right side keyboard
_QWERTY,
_COLEMAK,
_ADJUST, // for Fn keys, etc.
_FN // for changing layers, octaves, etc.
};
// Defines the keycodes used by our macros in process_record_user
enum custom_keycodes {
// MIDI Chord Keycodes - Root notes
MY_CHORD_MIN = SAFE_RANGE,
MI_CH_Cr = MY_CHORD_MIN,
MI_CH_Csr,
MI_CH_Dbr = MI_CH_Csr,
MI_CH_Dr,
MI_CH_Dsr,
MI_CH_Ebr = MI_CH_Dsr,
MI_CH_Er,
MI_CH_Fr,
MI_CH_Fsr,
MI_CH_Gbr = MI_CH_Fsr,
MI_CH_Gr,
MI_CH_Gsr,
MI_CH_Abr = MI_CH_Gsr,
MI_CH_Ar,
MI_CH_Asr,
MI_CH_Bbr = MI_CH_Asr,
MI_CH_Br,
// MIDI Chord Keycodes - Major
MI_CH_C,
MI_CH_Cs,
MI_CH_Db = MI_CH_Cs,
MI_CH_D,
MI_CH_Ds,
MI_CH_Eb = MI_CH_Ds,
MI_CH_E,
MI_CH_F,
MI_CH_Fs,
MI_CH_Gb = MI_CH_Fs,
MI_CH_G,
MI_CH_Gs,
MI_CH_Ab = MI_CH_Gs,
MI_CH_A,
MI_CH_As,
MI_CH_Bb = MI_CH_As,
MI_CH_B,
// MIDI Chord Keycodes Minor
MI_CH_Cm,
MI_CH_Csm,
MI_CH_Dbm = MI_CH_Csm,
MI_CH_Dm,
MI_CH_Dsm,
MI_CH_Ebm = MI_CH_Dsm,
MI_CH_Em,
MI_CH_Fm,
MI_CH_Fsm,
MI_CH_Gbm = MI_CH_Fsm,
MI_CH_Gm,
MI_CH_Gsm,
MI_CH_Abm = MI_CH_Gsm,
MI_CH_Am,
MI_CH_Asm,
MI_CH_Bbm = MI_CH_Asm,
MI_CH_Bm,
//MIDI Chord Keycodes Dominant Seventh
MI_CH_CDom7,
MI_CH_CsDom7,
MI_CH_DbDom7 = MI_CH_CsDom7,
MI_CH_DDom7,
MI_CH_DsDom7,
MI_CH_EbDom7 = MI_CH_DsDom7,
MI_CH_EDom7,
MI_CH_FDom7,
MI_CH_FsDom7,
MI_CH_GbDom7 = MI_CH_FsDom7,
MI_CH_GDom7,
MI_CH_GsDom7,
MI_CH_AbDom7 = MI_CH_GsDom7,
MI_CH_ADom7,
MI_CH_AsDom7,
MI_CH_BbDom7 = MI_CH_AsDom7,
MI_CH_BDom7,
// MIDI Chord Keycodes Diminished Seventh
MI_CH_CDim7,
MI_CH_CsDim7,
MI_CH_DbDim7 = MI_CH_CsDim7,
MI_CH_DDim7,
MI_CH_DsDim7,
MI_CH_EbDim7 = MI_CH_DsDim7,
MI_CH_EDim7,
MI_CH_FDim7,
MI_CH_FsDim7,
MI_CH_GbDim7 = MI_CH_FsDim7,
MI_CH_GDim7,
MI_CH_GsDim7,
MI_CH_AbDim7 = MI_CH_GsDim7,
MI_CH_ADim7,
MI_CH_AsDim7,
MI_CH_BbDim7 = MI_CH_AsDim7,
MI_CH_BDim7,
MY_CHORD_MAX = MI_CH_BDim7,
VERSION,
CSYSTEM, // C-SYSTEM layout
BSYSTEM, // B-SYSTEM layout
CNTBASC, // CouNTer BASs C-system layout
CSYSALL, // C-SYStem ALL layout
CSYSFBS, // C-SYStem Free BaSs
CHRTONE, // CHRomaTONE layout
CFLIP2B, // C-system FLIPped 2(to) Backwards
TGLBASS, // ToGgLe BASS unison
TGLMICH, // ToGgLe MIdi CHannel separation
MELDYAL, // MELody DYad Low
MELODYS, // MELODY Single
MELDYAH, // MELody DYad High
TGLUVEL // ToGgLe Unison VELocity
};
#define MY_CHORD_COUNT (MY_CHORD_MAX - MY_CHORD_MIN + 1)
static uint8_t chord_status[MY_CHORD_COUNT];
static uint8_t my_tone_status[MIDI_TONE_COUNT];
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* C-system Base */
[_C_SYSTEM_BASE] = LAYOUT(
MI_CH_Dbr, MI_CH_Abr, MI_CH_Ebr, MI_CH_Bbr, MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr,
MI_CH_Db, MI_CH_Ab, MI_CH_Eb, MI_CH_Bb, MI_CH_F, MI_CH_C, MI_CH_G, MI_CH_D, MI_CH_A, MI_CH_E, MI_CH_B, MI_CH_Fs,
MI_CH_Dbm, MI_CH_Abm, MI_CH_Ebm, MI_CH_Bbm, MI_CH_Fm, MI_CH_Cm, MI_CH_Gm, MI_CH_Dm, MI_CH_Am, MI_CH_Em, MI_CH_Bm, MI_CH_Fsm,
MI_CH_DbDom7, MI_CH_AbDom7, MI_CH_EbDom7, MI_CH_BbDom7, MI_CH_FDom7, MI_CH_CDom7, MI_CH_GDom7, MI_CH_DDom7, MI_CH_ADom7, MI_CH_EDom7, MI_CH_BDom7, MI_CH_FsDom7,
MI_CH_DbDim7, MI_CH_AbDim7, MI_CH_EbDim7, MI_CH_BbDim7, MI_CH_FDim7, MI_CH_CDim7, MI_CH_GDim7, MI_CH_DDim7, MI_CH_ADim7, MI_CH_EDim7, MI_CH_BDim7, MI_CH_FsDim7,
MI_Fs_2,
MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5, FN_MUTE,
MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Fs_5
),
/* fake B-system */
[_FAKE_B_SYSTEM] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
MI_Ab_2,
MI_A_2, MI_C_3, MI_Eb_3, MI_Gb_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Gb_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Gb_5, _______,
MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5
),
/* BASS2row */
[_C_SYSTEM_BASS2ROW] = LAYOUT(
MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr, MI_CH_Csr, MI_CH_Gsr, MI_CH_Dsr, MI_CH_Asr,
MI_CH_Dbr, MI_CH_Abr, MI_CH_Ebr, MI_CH_Bbr, MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr,
MI_CH_Db, MI_CH_Ab, MI_CH_Eb, MI_CH_Bb, MI_CH_F, MI_CH_C, MI_CH_G, MI_CH_D, MI_CH_A, MI_CH_E, MI_CH_B, MI_CH_Fs,
MI_CH_Dbm, MI_CH_Abm, MI_CH_Ebm, MI_CH_Bbm, MI_CH_Fm, MI_CH_Cm, MI_CH_Gm, MI_CH_Dm, MI_CH_Am, MI_CH_Em, MI_CH_Bm, MI_CH_Fsm,
MI_CH_DbDom7, MI_CH_AbDom7, MI_CH_EbDom7, MI_CH_BbDom7, MI_CH_FDom7, MI_CH_CDom7, MI_CH_GDom7, MI_CH_DDom7, MI_CH_ADom7, MI_CH_EDom7, MI_CH_BDom7, MI_CH_FsDom7,
MI_Fs_2,
MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5, _______,
MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Fs_5
),
/* C-system entirely */
[_C_SYSTEM_ENTIRELY] = LAYOUT(
MI_BENDU, XXXXXXX, XXXXXXX, MI_Db, MI_E, MI_G, MI_Bb, MI_Db_1, MI_E_1, MI_G_1, MI_Bb_1, MI_Db_2,
MI_BENDD, XXXXXXX, MI_C, MI_Eb, MI_Fs, MI_A, MI_C_1, MI_Eb_1, MI_Fs_1, MI_A_1, MI_C_2, MI_Eb_2,
XXXXXXX, XXXXXXX, MI_D, MI_F, MI_Ab, MI_B, MI_D_1, MI_F_1, MI_Ab_1, MI_B_1, MI_D_2, MI_F_2,
XXXXXXX, MI_Db, MI_E, MI_G, MI_Bb, MI_Db_1, MI_E_1, MI_G_1, MI_Bb_1, MI_Db_2, MI_E_2, MI_G_2,
MI_C, MI_Eb, MI_Fs, MI_A, MI_C_1, MI_Eb_1, MI_Fs_1, MI_A_1, MI_C_2, MI_Eb_2, MI_Fs_2, MI_A_2,
MI_Fs_2,
MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5, FN_MUTE,
MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Fs_5
),
/* C-system free bass */
[_C_SYSTEM_FREEBASS] = LAYOUT(
MI_Db_3, MI_Bb_2, MI_G_2, MI_E_2, MI_Db_2, MI_Bb_1, MI_G_1, MI_E_1, MI_Db_1, MI_Bb, MI_G, MI_E,
MI_C_3, MI_A_2, MI_Fs_2, MI_Eb_2, MI_C_2, MI_A_1, MI_Fs_1, MI_Eb_1, MI_C_1, MI_A, MI_Fs, MI_Eb,
MI_B_2, MI_Ab_2, MI_F_2, MI_D_2, MI_B_1, MI_Ab_1, MI_F_1, MI_D_1, MI_B, MI_Ab, MI_F, MI_D,
MI_Bb_2, MI_G_2, MI_E_2, MI_Db_2, MI_Bb_1, MI_G_1, MI_E_1, MI_Db_1, MI_Bb, MI_G, MI_E, MI_Db,
MI_A_2, MI_Fs_2, MI_Eb_2, MI_C_2, MI_A_1, MI_Fs_1, MI_Eb_1, MI_C_1, MI_A, MI_Fs, MI_Eb, MI_C,
MI_Fs_2,
MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5, FN_MUTE,
MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Fs_5
),
/* Chromatone */
[_CHROMATONE] = LAYOUT(
MI_Db, MI_Eb, MI_F, MI_G, MI_A, MI_B, MI_Db_1, MI_Eb_1, MI_F_1, MI_G_1, MI_A_1, MI_B_1,
MI_D, MI_E, MI_Fs, MI_Ab, MI_Bb, MI_C_1, MI_D_1, MI_E_1, MI_Fs_1, MI_Ab_1, MI_Bb_1, MI_C_2,
MI_Eb, MI_F, MI_G, MI_A, MI_B, MI_Db_1, MI_Eb_1, MI_F_1, MI_G_1, MI_A_1, MI_B_1, MI_Db_2,
MI_E, MI_Fs, MI_Ab, MI_Bb, MI_C_1, MI_D_1, MI_E_1, MI_Fs_1, MI_Ab_1, MI_Bb_1, MI_C_2, MI_D_2,
MI_F, MI_G, MI_A, MI_B, MI_Db_1, MI_Eb_1, MI_F_1, MI_G_1, MI_A_1, MI_B_1, MI_Db_2, MI_Eb_2,
MI_C_2,
MI_Db_2, MI_Eb_2, MI_F_2, MI_G_2, MI_A_2, MI_B_2, MI_Db_3, MI_Eb_3, MI_F_3, MI_G_3, MI_A_3, MI_B_3, FN_MUTE,
MI_C_2, MI_D_2, MI_E_2, MI_Gb_2, MI_Ab_2, MI_Bb_2, MI_C_3, MI_D_3, MI_E_3, MI_Gb_3, MI_Ab_3, MI_Bb_3, MI_C_4,
MI_Db_2, MI_Eb_2, MI_F_2, MI_G_2, MI_A_2, MI_B_2, MI_Db_3, MI_Eb_3, MI_F_3, MI_G_3, MI_A_3, MI_B_3
),
[_CFLIP_BASS2ROW] = LAYOUT(
MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr, MI_CH_Csr, MI_CH_Gsr, MI_CH_Dsr, MI_CH_Asr,
MI_CH_Dbr, MI_CH_Abr, MI_CH_Ebr, MI_CH_Bbr, MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr,
MI_CH_Db, MI_CH_Ab, MI_CH_Eb, MI_CH_Bb, MI_CH_F, MI_CH_C, MI_CH_G, MI_CH_D, MI_CH_A, MI_CH_E, MI_CH_B, MI_CH_Fs,
MI_CH_Dbm, MI_CH_Abm, MI_CH_Ebm, MI_CH_Bbm, MI_CH_Fm, MI_CH_Cm, MI_CH_Gm, MI_CH_Dm, MI_CH_Am, MI_CH_Em, MI_CH_Bm, MI_CH_Fsm,
MI_CH_DbDom7, MI_CH_AbDom7, MI_CH_EbDom7, MI_CH_BbDom7, MI_CH_FDom7, MI_CH_CDom7, MI_CH_GDom7, MI_CH_DDom7, MI_CH_ADom7, MI_CH_EDom7, MI_CH_BDom7, MI_CH_FsDom7,
MI_G_5,
MI_F_5, MI_D_5, MI_B_4, MI_Ab_4, MI_F_4, MI_D_4, MI_B_3, MI_Ab_3, MI_F_3, MI_D_3, MI_B_2, MI_Ab_2, FN_MUTE,
MI_Fs_5, MI_Eb_5, MI_C_5, MI_A_4, MI_Fs_4, MI_Eb_4, MI_C_4, MI_A_3, MI_Fs_3, MI_Eb_3, MI_C_3, MI_A_2, MI_Fs_2,
MI_E_5, MI_Db_5, MI_Bb_4, MI_G_4, MI_E_4, MI_Db_4, MI_Bb_3, MI_G_3, MI_E_3, MI_Db_3, MI_Bb_2, MI_G_2
),
/* QWERTY */
[_QWERTY] = LAYOUT_wrapper(
KC_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
KC_TAB, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL,
KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT,
KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, ADJ_EIS, KC_SPC, KC_SPC, KC_LANG1, KC_APP, MO_ADJ, KC_LEFT, KC_DOWN, KC_RGHT,
_______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
/* COLEMAK */
[_COLEMAK] = LAYOUT_wrapper(
KC_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
KC_TAB, _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, KC_DEL,
KC_LCTL, _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, KC_ENT,
KC_LSFT, _________________COLEMAK_L3________________, _________________COLEMAK_R3________________, SHIF_UP,
KC_CAPS, KC_LGUI, KC_LALT, ADJ_EIS, KC_SPC, KC_SPC, KC_LANG1, KC_APP, MO_ADJ, KC_LEFT, KC_DOWN, KC_RGHT,
_______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
/* ADJUST */
[_ADJUST] = LAYOUT_wrapper(
_______, _________________FUNC__L___________________, _________________FUNC__R___________________, _______,
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, KC_EQL, _______,
_______, KC_VOLD, KC_VOLU, KC_MUTE, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_GRV, _______,
_______, KC_BRID, KC_BRIU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LBRC, KC_RBRC, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_QUOT, KC_BSLS, _______,
_______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
/* Fn */
[_FN] = LAYOUT(
CSYSTEM, BSYSTEM, CNTBASC, CSYSALL, CHRTONE, CFLIP2B, CSYSFBS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG,
DF_QWER, TGLBASS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
DF_COLE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, TGLMICH,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX,
MI_OCT_N2, MI_OCT_N1, MI_OCT_0, MI_OCT_1, MI_OCT_2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, VERSION, EEP_RST, _______,
CSYSTEM, BSYSTEM, CNTBASC, CSYSALL, CHRTONE, CFLIP2B, CSYSFBS, XXXXXXX, XXXXXXX, MI_VELD, MI_VELU, XXXXXXX, RGB_TOG,
XXXXXXX, TGLBASS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, TGLUVEL, MELDYAL, MELODYS, MELDYAH
)
};
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[_C_SYSTEM_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_FAKE_B_SYSTEM] = { ENCODER_CCW_CW(_______, _______) },
[_C_SYSTEM_BASS2ROW] = { ENCODER_CCW_CW(_______, _______) },
[_C_SYSTEM_ENTIRELY] = { ENCODER_CCW_CW(_______, _______) },
[_C_SYSTEM_FREEBASS] = { ENCODER_CCW_CW(_______, _______) },
[_CHROMATONE] = { ENCODER_CCW_CW(_______, _______) },
[_CFLIP_BASS2ROW] = { ENCODER_CCW_CW(_______, _______) },
[_QWERTY] = { ENCODER_CCW_CW(_______, _______) },
[_COLEMAK] = { ENCODER_CCW_CW(_______, _______) },
[_ADJUST] = { ENCODER_CCW_CW(_______, _______) },
[_FN] = { ENCODER_CCW_CW(_______, _______) },
};
#endif
#ifdef RGBLIGHT_ENABLE
// Light up adjust layer keys (left keyboard)
const rgblight_segment_t PROGMEM my_adjust_layer[] = RGBLIGHT_LAYER_SEGMENTS({1, 10, HSV_ORANGE},
{21, 2, HSV_ORANGE},
{25, 3, HSV_ORANGE},
{30, 5, HSV_ORANGE},
{37, 2, HSV_ORANGE},
{45, 2, HSV_ORANGE},
{57, 2, HSV_ORANGE}
);
// Light up fn layer keys
const rgblight_segment_t PROGMEM my_fn_layer[] = RGBLIGHT_LAYER_SEGMENTS( // left keyboard
{0, 7, HSV_ORANGE}, // MIDI layouts
{11, 1, HSV_RED}, // RGB_TOG
{12, 1, HSV_WHITE}, // DF_QWER
{13, 1, HSV_CORAL}, // TGLBASS
{24, 1, HSV_WHITE}, // DF_COLE
{35, 1, HSV_TEAL}, // TGLMICH
#if 0 // Color Test
{36, 1, HSV_WHITE},
{37, 1, HSV_RED},
{38, 1, HSV_CORAL},
{39, 1, HSV_ORANGE},
{40, 1, HSV_GOLDENROD},
{41, 1, HSV_GOLD},
{42, 1, HSV_YELLOW},
{43, 1, HSV_CHARTREUSE},
{44, 1, HSV_GREEN},
{45, 1, HSV_SPRINGGREEN},
{46, 1, HSV_TURQUOISE},
{47, 1, HSV_TEAL},
{48, 1, HSV_CYAN},
{49, 1, HSV_AZURE},
{50, 1, HSV_BLUE},
{51, 1, HSV_PURPLE},
{52, 1, HSV_MAGENTA},
{53, 1, HSV_PINK},
#endif
// right keyboard
{60, 7, HSV_ORANGE}, // MIDI layouts
{74, 1, HSV_CORAL}, // TGLBASS
{85, 1, HSV_BLUE}, // MIDI Oct
{86, 1, HSV_CYAN}, // MIDI Oct
{87, 1, HSV_SPRINGGREEN}, // MIDI Oct
{88, 1, HSV_GREEN}, // MIDI Oct
{89, 1, HSV_CHARTREUSE}, // MIDI Oct
{96, 1, HSV_PINK}, // EEP_RST
{98, 7, HSV_ORANGE}, // MIDI layouts
{107, 1, HSV_YELLOW}, // MI_VELD
{108, 1, HSV_GREEN}, // MI_VELU
{110, 1, HSV_RED}, // RGB_TOG
{112, 1, HSV_CORAL}, // TGLBASS
{119, 1, HSV_CORAL}, // TGLUVEL
{120, 1, HSV_CYAN}, // MELDYAL
{121, 1, HSV_GOLD}, // MELODYS
{122, 1, HSV_SPRINGGREEN} // MELDYAH
);
// Now define the array of layers. Later layers take precedence
const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(my_fn_layer, my_adjust_layer);
layer_state_t layer_state_set_user(layer_state_t state) {
// Both layers will light up if both kb layers are active
rgblight_set_layer_state(0, layer_state_cmp(state, _FN));
rgblight_set_layer_state(1, layer_state_cmp(state, _ADJUST));
return state;
};
#endif // RGBLIGHT_ENABLE
void my_init(void){
// Set octave to MI_OCT_0
midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN;
// avoid using 127 since it is used as a special number in some sound sources.
midi_config.velocity = MIDI_INITIAL_VELOCITY;
}
void eeconfig_init_user(void) {
midi_init();
my_init();
// Used to set octave to MI_OCT_0
midi_bass_ch = 0, midi_chord_ch = 0; // By default, all use the same channel.
// UNISON flags
melody_dyad_high = false; // true when +1 octave unison dyad is enabled.
melody_dyad_low = false; // true when -1 octave unison dyad is enabled.
melody_unison_suppress = true; // true: velocity of octave unison note is suppressd to UNISON_VELOCITY_RATIO
// Reset Bass setting
user_config.raw = 0; // default: dyad
eeconfig_update_user(user_config.raw);
// Reset the midi keyboard layout
set_single_persistent_default_layer(_C_SYSTEM_BASS2ROW);
}
void keyboard_post_init_user(void) {
my_init();
for (uint8_t i = 0; i < MY_CHORD_COUNT; i++) {
chord_status[i] = MIDI_INVALID_NOTE;
}
for (uint8_t i = 0; i < MIDI_TONE_COUNT; i++) {
my_tone_status[i] = MIDI_INVALID_NOTE;
}
// load EEPROM data for isSingleBass
user_config.raw = eeconfig_read_user();
#ifdef RGBLIGHT_ENABLE
rgblight_layers = my_rgb_layers;
// Reset LED off
rgblight_sethsv(HSV_BLACK);
# if defined(RGBLIGHT_EFFECT_KNIGHT) || defined(RGBLIGHT_EFFECT_TWINKLE)
rgblight_sethsv(30, 50, 40);
# ifdef RGBLIGHT_EFFECT_KNIGHT
rgblight_mode(RGBLIGHT_MODE_KNIGHT);
# elif defined(RGBLIGHT_EFFECT_TWINKLE)
rgblight_mode(RGBLIGHT_MODE_TWINKLE+3);
# endif
# endif
#endif // RGBLIGHT_ENABLE
};
void toggle_isSingleBass(void) {
#ifdef CONSOLE_ENABLE
uprintf("isSingleBass(before) %u\n", user_config.isSingleBass);
#endif
user_config.isSingleBass = !user_config.isSingleBass;
#ifdef CONSOLE_ENABLE
uprintf("isSingleBass(after) %u\n", user_config.isSingleBass);
#endif
eeconfig_update_user(user_config.raw);
}
void toggle_MIDI_channel_separation(void) {
if (midi_chord_ch > 0) {
midi_chord_ch = 0;
midi_bass_ch = 0;
} else {
midi_chord_ch = 1;
midi_bass_ch = 2;
}
}
#ifdef RGBLIGHT_ENABLE
void switch_keylight_color4bass(keyrecord_t *record, uint8_t keylocation){
switch (biton32(default_layer_state)) {
case _C_SYSTEM_BASE:
keylight_manager(record, HSV_GREEN, keylocation);
break;
case _FAKE_B_SYSTEM:
keylight_manager(record, HSV_ORANGE, keylocation);
break;
case _C_SYSTEM_BASS2ROW:
keylight_manager(record, HSV_YELLOW, keylocation);
break;
case _CFLIP_BASS2ROW:
keylight_manager(record, HSV_PURPLE, keylocation);
break;
}
}
void switch_keylight_color4chords(keyrecord_t *record, uint8_t keylocation){
switch (biton32(default_layer_state)) {
case _C_SYSTEM_BASE:
keylight_manager(record, HSV_SPRINGGREEN, keylocation);
break;
case _FAKE_B_SYSTEM:
keylight_manager(record, HSV_YELLOW, keylocation);
break;
case _C_SYSTEM_BASS2ROW:
keylight_manager(record, HSV_GOLDENROD, keylocation);
break;
case _CFLIP_BASS2ROW:
keylight_manager(record, HSV_MAGENTA, keylocation);
break;
}
}
#endif // RGBLIGHT_ENABLE
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
uint16_t root_note = MIDI_INVALID_NOTE; // Starting value for the root note of each chord
#ifdef RGBLIGHT_ENABLE
/* prepare for turning on LEDs when keys are pressed. */
uint8_t r = record->event.key.row;
uint8_t c = record->event.key.col;
// uint8_t keylocation = convert_key_to_led[MATRIX_COLS * r + c];
// uint8_t keylocation2 = convert_key_to_led2[MATRIX_COLS * r + c];
uint8_t keylocation = pgm_read_byte(&convert_key_to_led[MATRIX_COLS * r + c]);
uint8_t keylocation2 = pgm_read_byte(&convert_key_to_led2[MATRIX_COLS * r + c]);
#endif // RGBLIGHT_ENABLE
uint8_t chord = keycode - MY_CHORD_MIN;
switch (keycode) {
case VERSION: // Output firmware info.
if (record->event.pressed) {
SEND_STRING(QMK_KEYBOARD ":" QMK_KEYMAP " @ " QMK_VERSION " | " QMK_BUILDDATE);
}
break;
// set default layer and save it to EEPROM when MIDI key layers are selected.
case CSYSTEM:
if (record->event.pressed) {
set_single_persistent_default_layer(_C_SYSTEM_BASE);
}
break;
case BSYSTEM:
if (record->event.pressed) {
set_single_persistent_default_layer(_FAKE_B_SYSTEM);
}
break;
case CNTBASC:
if (record->event.pressed) {
set_single_persistent_default_layer(_C_SYSTEM_BASS2ROW);
}
break;
case CSYSALL:
if (record->event.pressed) {
set_single_persistent_default_layer(_C_SYSTEM_ENTIRELY);
}
break;
case CHRTONE:
if (record->event.pressed) {
set_single_persistent_default_layer(_CHROMATONE);
}
break;
case CFLIP2B:
if (record->event.pressed) {
set_single_persistent_default_layer(_CFLIP_BASS2ROW);
}
break;
case CSYSFBS:
if (record->event.pressed) {
set_single_persistent_default_layer(_C_SYSTEM_FREEBASS);
}
break;
case TGLBASS:
if (record->event.pressed) {
toggle_isSingleBass();
};
break;
case TGLMICH:
if (record->event.pressed) {
toggle_MIDI_channel_separation();
};
break;
case MELDYAL:
if (record->event.pressed) {
melody_dyad_low = true;
melody_dyad_high = false;
};
break;
case MELODYS:
if (record->event.pressed) {
melody_dyad_low = false;
melody_dyad_high = false;
};
break;
case MELDYAH:
if (record->event.pressed) {
melody_dyad_low = false;
melody_dyad_high = true;
};
break;
case TGLUVEL:
if (record->event.pressed) {
melody_unison_suppress = !melody_unison_suppress;
};
break;
// MIDI Chord Keycodes, on the left side.
case MI_CH_Cr ... MI_CH_Br: // Root Notes
root_note = keycode - MI_CH_Cr + MI_C_1;
my_process_midi4Bass(midi_bass_ch, record, chord_status, chord, root_note, IS_SINGLE_BASS());
#ifdef RGBLIGHT_ENABLE
switch_keylight_color4bass(record, keylocation);
#endif
break;
case MI_CH_C ... MI_CH_B: // Major Chords
root_note = keycode - MI_CH_C + MI_C_2;
// Root, Major Third, and Fifth Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 4, 7);
#ifdef RGBLIGHT_ENABLE
switch_keylight_color4chords(record, keylocation);
#endif
break;
case MI_CH_Cm ... MI_CH_Bm: // Minor Chord
root_note = keycode - MI_CH_Cm + MI_C_2;
// Root, Minor Third, and Fifth Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 7);
#ifdef RGBLIGHT_ENABLE
switch_keylight_color4chords(record, keylocation);
#endif
break;
case MI_CH_CDom7 ... MI_CH_BDom7: // Dominant 7th Chord
root_note = keycode - MI_CH_CDom7 + MI_C_2;
// Major Third, Major Fifth, and Minor Seventh Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 4, 7, 10);
#ifdef RGBLIGHT_ENABLE
switch_keylight_color4chords(record, keylocation);
#endif
break;
case MI_CH_CDim7 ... MI_CH_BDim7: // Diminished 7th Chord
root_note = keycode - MI_CH_CDim7 + MI_C_2;
// Root, Minor Third, and Diminished 5th Note
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 6);
#ifdef RGBLIGHT_ENABLE
switch_keylight_color4chords(record, keylocation);
#endif
break;
#ifdef RGBLIGHT_ENABLE
case KC_A ... KC_RGUI: // for QWERTY
case KC_GESC:
case ADJ_EIS:
case MO_ADJ:
case SHIF_UP:
keylight_manager(record, HSV_RED, keylocation);
break;
#endif
// Keycodes on the right side.
case MIDI_TONE_MIN ... MIDI_TONE_MAX: // notes on the right side keyboard.
// root_note is played by process_midi().
if ( melody_dyad_high == true ) { // play 1 octave higher as well.
my_process_midi(0, keycode, record, my_tone_status, 12, melody_unison_suppress);
#ifdef RGBLIGHT_ENABLE
keylight_manager(record, HSV_RED, keylocation);
keylight_manager(record, HSV_RED, keylocation2);
#endif
} else if ( melody_dyad_low == true ) { // play 1 octave lower as well.
my_process_midi(0, keycode, record, my_tone_status, -12, melody_unison_suppress);
#ifdef RGBLIGHT_ENABLE
keylight_manager(record, HSV_CYAN, keylocation);
keylight_manager(record, HSV_CYAN, keylocation2);
#endif
} else {
uprintf("layer=%u, default_layer_state = %u\n", biton32(default_layer_state), default_layer_state);
#ifdef RGBLIGHT_ENABLE
keylight_manager(record, HSV_GOLDENROD, keylocation);
keylight_manager(record, HSV_GOLDENROD, keylocation2);
#endif
}
break;
#ifdef RGBLIGHT_ENABLE
// case KC_MUTE:
case FN_MUTE:
keylight_manager(record, HSV_GOLDENROD, keylocation);
break;
#endif
}
// If console is enabled, it will print the matrix position and status of each key pressed
#if defined(CONSOLE_ENABLE) && defined(RGBLIGHT_ENABLE)
uprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
uprintf("r=%d, c=%d, keyloc=%d, keyloc2=%d, matrix_col x r + c = %d\n", r, c, keylocation, keylocation2, MATRIX_COLS * r + c);
#endif
return true;
}

View File

@@ -0,0 +1 @@
# A personal keymap for giabalanai with RGBLIGHT_ENABLE = yes in rules.mk, which 3araht is using.

View File

@@ -0,0 +1,4 @@
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
CONSOLE_ENABLE = no # Console for debug
ENCODER_MAP_ENABLE = yes # replacing ENCODERS_CW_KEY method to this on 2022/08/31.

View File

@@ -0,0 +1,259 @@
/* Copyright 2020 3araht
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
#include "version.h"
// Alias layout macros that expand groups of keys.
#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
#define DFCBASE DF(_C_SYSTEM_BASE)
#define DF_QWER DF(_QWERTY)
// Long press: go to _FN layer, tap: MUTE
#define FN_MUTE LT(_FN, KC_MUTE)
// Used to set octave to MI_OCT_0
extern midi_config_t midi_config;
uint8_t midi_bass_ch = 0, midi_chord_ch = 0; // By default, all use the same channel.
// Defines names for use in layer keycodes and the keymap
enum layer_names {
_C_SYSTEM_BASE, // MIDI C-system
_QWERTY, // just in case
_FN
};
// Defines the keycodes used by our macros in process_record_user
enum custom_keycodes {
// MIDI Chord Keycodes - Root notes
MY_CHORD_MIN = SAFE_RANGE,
MI_CH_Cr = MY_CHORD_MIN,
MI_CH_Csr,
MI_CH_Dbr = MI_CH_Csr,
MI_CH_Dr,
MI_CH_Dsr,
MI_CH_Ebr = MI_CH_Dsr,
MI_CH_Er,
MI_CH_Fr,
MI_CH_Fsr,
MI_CH_Gbr = MI_CH_Fsr,
MI_CH_Gr,
MI_CH_Gsr,
MI_CH_Abr = MI_CH_Gsr,
MI_CH_Ar,
MI_CH_Asr,
MI_CH_Bbr = MI_CH_Asr,
MI_CH_Br,
// MIDI Chord Keycodes - Major
MI_CH_C,
MI_CH_Cs,
MI_CH_Db = MI_CH_Cs,
MI_CH_D,
MI_CH_Ds,
MI_CH_Eb = MI_CH_Ds,
MI_CH_E,
MI_CH_F,
MI_CH_Fs,
MI_CH_Gb = MI_CH_Fs,
MI_CH_G,
MI_CH_Gs,
MI_CH_Ab = MI_CH_Gs,
MI_CH_A,
MI_CH_As,
MI_CH_Bb = MI_CH_As,
MI_CH_B,
// MIDI Chord Keycodes Minor
MI_CH_Cm,
MI_CH_Csm,
MI_CH_Dbm = MI_CH_Csm,
MI_CH_Dm,
MI_CH_Dsm,
MI_CH_Ebm = MI_CH_Dsm,
MI_CH_Em,
MI_CH_Fm,
MI_CH_Fsm,
MI_CH_Gbm = MI_CH_Fsm,
MI_CH_Gm,
MI_CH_Gsm,
MI_CH_Abm = MI_CH_Gsm,
MI_CH_Am,
MI_CH_Asm,
MI_CH_Bbm = MI_CH_Asm,
MI_CH_Bm,
//MIDI Chord Keycodes Dominant Seventh
MI_CH_CDom7,
MI_CH_CsDom7,
MI_CH_DbDom7 = MI_CH_CsDom7,
MI_CH_DDom7,
MI_CH_DsDom7,
MI_CH_EbDom7 = MI_CH_DsDom7,
MI_CH_EDom7,
MI_CH_FDom7,
MI_CH_FsDom7,
MI_CH_GbDom7 = MI_CH_FsDom7,
MI_CH_GDom7,
MI_CH_GsDom7,
MI_CH_AbDom7 = MI_CH_GsDom7,
MI_CH_ADom7,
MI_CH_AsDom7,
MI_CH_BbDom7 = MI_CH_AsDom7,
MI_CH_BDom7,
// MIDI Chord Keycodes Diminished Seventh
MI_CH_CDim7,
MI_CH_CsDim7,
MI_CH_DbDim7 = MI_CH_CsDim7,
MI_CH_DDim7,
MI_CH_DsDim7,
MI_CH_EbDim7 = MI_CH_DsDim7,
MI_CH_EDim7,
MI_CH_FDim7,
MI_CH_FsDim7,
MI_CH_GbDim7 = MI_CH_FsDim7,
MI_CH_GDim7,
MI_CH_GsDim7,
MI_CH_AbDim7 = MI_CH_GsDim7,
MI_CH_ADim7,
MI_CH_AsDim7,
MI_CH_BbDim7 = MI_CH_AsDim7,
MI_CH_BDim7,
MY_CHORD_MAX = MI_CH_BDim7,
VERSION
};
#define MY_CHORD_COUNT (MY_CHORD_MAX - MY_CHORD_MIN + 1)
static uint8_t chord_status[MY_CHORD_COUNT];
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* C-system Base */
[_C_SYSTEM_BASE] = LAYOUT(
MI_CH_Dbr, MI_CH_Abr, MI_CH_Ebr, MI_CH_Bbr, MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr,
MI_CH_Db, MI_CH_Ab, MI_CH_Eb, MI_CH_Bb, MI_CH_F, MI_CH_C, MI_CH_G, MI_CH_D, MI_CH_A, MI_CH_E, MI_CH_B, MI_CH_Fs,
MI_CH_Dbm, MI_CH_Abm, MI_CH_Ebm, MI_CH_Bbm, MI_CH_Fm, MI_CH_Cm, MI_CH_Gm, MI_CH_Dm, MI_CH_Am, MI_CH_Em, MI_CH_Bm, MI_CH_Fsm,
MI_CH_DbDom7, MI_CH_AbDom7, MI_CH_EbDom7, MI_CH_BbDom7, MI_CH_FDom7, MI_CH_CDom7, MI_CH_GDom7, MI_CH_DDom7, MI_CH_ADom7, MI_CH_EDom7, MI_CH_BDom7, MI_CH_FsDom7,
MI_CH_DbDim7, MI_CH_AbDim7, MI_CH_EbDim7, MI_CH_BbDim7, MI_CH_FDim7, MI_CH_CDim7, MI_CH_GDim7, MI_CH_DDim7, MI_CH_ADim7, MI_CH_EDim7, MI_CH_BDim7, MI_CH_FsDim7,
MI_Fs_2,
MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5, FN_MUTE,
MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Fs_5
),
/* QWERTY */
[_QWERTY] = LAYOUT_wrapper(
KC_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
KC_TAB, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL,
KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT,
KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_LANG2, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_LANG1, KC_RALT, KC_RGUI, KC_RCTRL,
_______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
/* Fn */
[_FN] = LAYOUT(
DFCBASE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
DF_QWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, VERSION, XXXXXXX, _______,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
)
};
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[_C_SYSTEM_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_QWERTY] = { ENCODER_CCW_CW(_______, _______) },
[_FN] = { ENCODER_CCW_CW(_______, _______) },
};
#endif
void keyboard_post_init_user(void) {
// Set otave to MI_OCT_0
midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN;
// avoid using 127 since it is used as a special number in some sound sources.
midi_config.velocity = MIDI_INITIAL_VELOCITY;
for (uint8_t i = 0; i < MY_CHORD_COUNT; i++) {
chord_status[i] = MIDI_INVALID_NOTE;
}
default_layer_set(1UL << _C_SYSTEM_BASE);
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
uint16_t root_note = MIDI_INVALID_NOTE; // Starting value for the root note of each chord
uint8_t chord = keycode - MY_CHORD_MIN;
switch (keycode) {
case VERSION: // Output firmware info.
if (record->event.pressed) {
SEND_STRING(QMK_KEYBOARD ":" QMK_KEYMAP " @ " QMK_VERSION " | " QMK_BUILDDATE);
}
break;
// MIDI Chord Keycodes, on the left side.
case MI_CH_Cr ... MI_CH_Br: // Root Notes
root_note = keycode - MI_CH_Cr + MI_C_1;
my_process_midi4Bass(midi_bass_ch, record, chord_status, chord, root_note, false);
break;
case MI_CH_C ... MI_CH_B: // Major Chords
root_note = keycode - MI_CH_C + MI_C_2;
// Root, Major Third, and Fifth Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 4, 7);
break;
case MI_CH_Cm ... MI_CH_Bm: // Minor Chord
root_note = keycode - MI_CH_Cm + MI_C_2;
// Root, Minor Third, and Fifth Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 7);
break;
case MI_CH_CDom7 ... MI_CH_BDom7: // Dominant 7th Chord
root_note = keycode - MI_CH_CDom7 + MI_C_2;
// Major Third, Major Fifth, and Minor Seventh Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 4, 7, 10);
break;
case MI_CH_CDim7 ... MI_CH_BDim7: // Diminished 7th Chord
root_note = keycode - MI_CH_CDim7 + MI_C_2;
// Root, Minor Third, and Diminished 5th Note
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 6);
break;
}
return true;
}

View File

@@ -0,0 +1 @@
# The default keymap for giabalanai

View File

@@ -0,0 +1 @@
ENCODER_MAP_ENABLE = yes # replacing ENCODERS_CW_KEY method to this on 2022/08/31.

View File

@@ -0,0 +1,26 @@
#pragma once
#define GIABARINAIX2
#ifdef GIABARINAIX2
# undef MATRIX_ROW_PINS_RIGHT
# undef MATRIX_COL_PINS_RIGHT
# ifdef RGBLIGHT_ENABLE
# undef RGBLED_NUM
# define RGBLED_NUM 120
# undef RGBLIGHT_LED_MAP
# define RGBLIGHT_LED_MAP { \
108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, \
107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, \
84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, \
83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, \
60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, \
\
11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, \
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, \
35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, \
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, \
59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48 \
}
# endif
#endif

View File

@@ -0,0 +1,146 @@
{
"keyboard_name": "giabarinaix2",
"manufacturer": "3araht",
"url": "https://github.com/3araht",
"maintainer": "3araht",
"usb": {
"vid": "0xFEED",
"pid": "0xF4B2",
"device_version": "0.0.1"
},
"layouts": {
"LAYOUT": {
"layout": [
{"label": "l00", "x": 0, "y": 0},
{"label": "l01", "x": 1, "y": 0},
{"label": "l02", "x": 2, "y": 0},
{"label": "l03", "x": 3, "y": 0},
{"label": "l04", "x": 4, "y": 0},
{"label": "l05", "x": 5, "y": 0},
{"label": "l06", "x": 6, "y": 0},
{"label": "l07", "x": 7, "y": 0},
{"label": "l08", "x": 8, "y": 0},
{"label": "l09", "x": 9, "y": 0},
{"label": "l0a", "x": 10, "y": 0},
{"label": "l0b", "x": 11, "y": 0},
{"label": "r00", "x": 14.5, "y": 0},
{"label": "r01", "x": 15.5, "y": 0},
{"label": "r02", "x": 16.5, "y": 0},
{"label": "r03", "x": 17.5, "y": 0},
{"label": "r04", "x": 18.5, "y": 0},
{"label": "r05", "x": 19.5, "y": 0},
{"label": "r06", "x": 20.5, "y": 0},
{"label": "r07", "x": 21.5, "y": 0},
{"label": "r08", "x": 22.5, "y": 0},
{"label": "r09", "x": 23.5, "y": 0},
{"label": "r0a", "x": 24.5, "y": 0},
{"label": "r0b", "x": 25.5, "y": 0},
{"label": "l10", "x": 0.5, "y": 1},
{"label": "l11", "x": 1.5, "y": 1},
{"label": "l12", "x": 2.5, "y": 1},
{"label": "l13", "x": 3.5, "y": 1},
{"label": "l14", "x": 4.5, "y": 1},
{"label": "l15", "x": 5.5, "y": 1},
{"label": "l16", "x": 6.5, "y": 1},
{"label": "l17", "x": 7.5, "y": 1},
{"label": "l18", "x": 8.5, "y": 1},
{"label": "l19", "x": 9.5, "y": 1},
{"label": "l1a", "x": 10.5, "y": 1},
{"label": "l1b", "x": 11.5, "y": 1},
{"label": "r10", "x": 15, "y": 1},
{"label": "r11", "x": 16, "y": 1},
{"label": "r12", "x": 17, "y": 1},
{"label": "r13", "x": 18, "y": 1},
{"label": "r14", "x": 19, "y": 1},
{"label": "r15", "x": 20, "y": 1},
{"label": "r16", "x": 21, "y": 1},
{"label": "r17", "x": 22, "y": 1},
{"label": "r18", "x": 23, "y": 1},
{"label": "r19", "x": 24, "y": 1},
{"label": "r1a", "x": 25, "y": 1},
{"label": "r1b", "x": 26, "y": 1},
{"label": "l20", "x": 1, "y": 2},
{"label": "l21", "x": 2, "y": 2},
{"label": "l22", "x": 3, "y": 2},
{"label": "l23", "x": 4, "y": 2},
{"label": "l24", "x": 5, "y": 2},
{"label": "l25", "x": 6, "y": 2},
{"label": "l26", "x": 7, "y": 2},
{"label": "l27", "x": 8, "y": 2},
{"label": "l28", "x": 9, "y": 2},
{"label": "l29", "x": 10, "y": 2},
{"label": "l2a", "x": 11, "y": 2},
{"label": "l2b", "x": 12, "y": 2},
{"label": "r20", "x": 15.5, "y": 2},
{"label": "r21", "x": 16.5, "y": 2},
{"label": "r22", "x": 17.5, "y": 2},
{"label": "r23", "x": 18.5, "y": 2},
{"label": "r24", "x": 19.5, "y": 2},
{"label": "r25", "x": 20.5, "y": 2},
{"label": "r26", "x": 21.5, "y": 2},
{"label": "r27", "x": 22.5, "y": 2},
{"label": "r28", "x": 23.5, "y": 2},
{"label": "r29", "x": 24.5, "y": 2},
{"label": "r2a", "x": 25.5, "y": 2},
{"label": "r2b", "x": 26.5, "y": 2},
{"label": "l30", "x": 1.5, "y": 3},
{"label": "l31", "x": 2.5, "y": 3},
{"label": "l32", "x": 3.5, "y": 3},
{"label": "l33", "x": 4.5, "y": 3},
{"label": "l34", "x": 5.5, "y": 3},
{"label": "l35", "x": 6.5, "y": 3},
{"label": "l36", "x": 7.5, "y": 3},
{"label": "l37", "x": 8.5, "y": 3},
{"label": "l38", "x": 9.5, "y": 3},
{"label": "l39", "x": 10.5, "y": 3},
{"label": "l3a", "x": 11.5, "y": 3},
{"label": "l3b", "x": 12.5, "y": 3},
{"label": "r30", "x": 16, "y": 3},
{"label": "r31", "x": 17, "y": 3},
{"label": "r32", "x": 18, "y": 3},
{"label": "r33", "x": 19, "y": 3},
{"label": "r34", "x": 20, "y": 3},
{"label": "r35", "x": 21, "y": 3},
{"label": "r36", "x": 22, "y": 3},
{"label": "r37", "x": 23, "y": 3},
{"label": "r38", "x": 24, "y": 3},
{"label": "r39", "x": 25, "y": 3},
{"label": "r3a", "x": 26, "y": 3},
{"label": "r3b", "x": 27, "y": 3},
{"label": "l40", "x": 2, "y": 4},
{"label": "l41", "x": 3, "y": 4},
{"label": "l42", "x": 4, "y": 4},
{"label": "l43", "x": 5, "y": 4},
{"label": "l44", "x": 6, "y": 4},
{"label": "l45", "x": 7, "y": 4},
{"label": "l46", "x": 8, "y": 4},
{"label": "l47", "x": 9, "y": 4},
{"label": "l48", "x": 10, "y": 4},
{"label": "l49", "x": 11, "y": 4},
{"label": "l4a", "x": 12, "y": 4},
{"label": "l4b", "x": 13, "y": 4},
{"label": "r40", "x": 16.5, "y": 4},
{"label": "r41", "x": 17.5, "y": 4},
{"label": "r42", "x": 18.5, "y": 4},
{"label": "r43", "x": 19.5, "y": 4},
{"label": "r44", "x": 20.5, "y": 4},
{"label": "r45", "x": 21.5, "y": 4},
{"label": "r46", "x": 22.5, "y": 4},
{"label": "r47", "x": 23.5, "y": 4},
{"label": "r48", "x": 24.5, "y": 4},
{"label": "r49", "x": 25.5, "y": 4},
{"label": "r4a", "x": 26.5, "y": 4},
{"label": "r4b", "x": 27.5, "y": 4}
]
}
}
}

View File

@@ -0,0 +1,262 @@
/* Copyright 2020 3araht
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
#include "version.h"
// Alias layout macros that expand groups of keys.
#define LAYOUT_wrapper_giabarinaix2(...) LAYOUT_giabarinaix2(__VA_ARGS__)
#define DFCBASE DF(_C_SYSTEM_BASE)
#define DF_QWER DF(_QWERTY)
// Long press: go to _FN layer, tap: MUTE
#define FN_MUTE LT(_FN, KC_MUTE)
// Used to set octave to MI_OCT_0
extern midi_config_t midi_config;
uint8_t midi_bass_ch = 0, midi_chord_ch = 0; // By default, all use the same channel.
// Defines names for use in layer keycodes and the keymap
enum layer_names {
_C_SYSTEM_BASE, // MIDI C-system
_QWERTY, // just in case
_FN
};
// Defines the keycodes used by our macros in process_record_user
enum custom_keycodes {
// MIDI Chord Keycodes - Root notes
MY_CHORD_MIN = SAFE_RANGE,
MI_CH_Cr = MY_CHORD_MIN,
MI_CH_Csr,
MI_CH_Dbr = MI_CH_Csr,
MI_CH_Dr,
MI_CH_Dsr,
MI_CH_Ebr = MI_CH_Dsr,
MI_CH_Er,
MI_CH_Fr,
MI_CH_Fsr,
MI_CH_Gbr = MI_CH_Fsr,
MI_CH_Gr,
MI_CH_Gsr,
MI_CH_Abr = MI_CH_Gsr,
MI_CH_Ar,
MI_CH_Asr,
MI_CH_Bbr = MI_CH_Asr,
MI_CH_Br,
// MIDI Chord Keycodes - Major
MI_CH_C,
MI_CH_Cs,
MI_CH_Db = MI_CH_Cs,
MI_CH_D,
MI_CH_Ds,
MI_CH_Eb = MI_CH_Ds,
MI_CH_E,
MI_CH_F,
MI_CH_Fs,
MI_CH_Gb = MI_CH_Fs,
MI_CH_G,
MI_CH_Gs,
MI_CH_Ab = MI_CH_Gs,
MI_CH_A,
MI_CH_As,
MI_CH_Bb = MI_CH_As,
MI_CH_B,
// MIDI Chord Keycodes Minor
MI_CH_Cm,
MI_CH_Csm,
MI_CH_Dbm = MI_CH_Csm,
MI_CH_Dm,
MI_CH_Dsm,
MI_CH_Ebm = MI_CH_Dsm,
MI_CH_Em,
MI_CH_Fm,
MI_CH_Fsm,
MI_CH_Gbm = MI_CH_Fsm,
MI_CH_Gm,
MI_CH_Gsm,
MI_CH_Abm = MI_CH_Gsm,
MI_CH_Am,
MI_CH_Asm,
MI_CH_Bbm = MI_CH_Asm,
MI_CH_Bm,
//MIDI Chord Keycodes Dominant Seventh
MI_CH_CDom7,
MI_CH_CsDom7,
MI_CH_DbDom7 = MI_CH_CsDom7,
MI_CH_DDom7,
MI_CH_DsDom7,
MI_CH_EbDom7 = MI_CH_DsDom7,
MI_CH_EDom7,
MI_CH_FDom7,
MI_CH_FsDom7,
MI_CH_GbDom7 = MI_CH_FsDom7,
MI_CH_GDom7,
MI_CH_GsDom7,
MI_CH_AbDom7 = MI_CH_GsDom7,
MI_CH_ADom7,
MI_CH_AsDom7,
MI_CH_BbDom7 = MI_CH_AsDom7,
MI_CH_BDom7,
// MIDI Chord Keycodes Diminished Seventh
MI_CH_CDim7,
MI_CH_CsDim7,
MI_CH_DbDim7 = MI_CH_CsDim7,
MI_CH_DDim7,
MI_CH_DsDim7,
MI_CH_EbDim7 = MI_CH_DsDim7,
MI_CH_EDim7,
MI_CH_FDim7,
MI_CH_FsDim7,
MI_CH_GbDim7 = MI_CH_FsDim7,
MI_CH_GDim7,
MI_CH_GsDim7,
MI_CH_AbDim7 = MI_CH_GsDim7,
MI_CH_ADim7,
MI_CH_AsDim7,
MI_CH_BbDim7 = MI_CH_AsDim7,
MI_CH_BDim7,
MY_CHORD_MAX = MI_CH_BDim7,
VERSION
};
#define MY_CHORD_COUNT (MY_CHORD_MAX - MY_CHORD_MIN + 1)
static uint8_t chord_status[MY_CHORD_COUNT];
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* C-system Base */
[_C_SYSTEM_BASE] = LAYOUT_giabarinaix2(
MI_CH_Dbr, MI_CH_Abr, MI_CH_Ebr, MI_CH_Bbr, MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr,
MI_CH_Db, MI_CH_Ab, MI_CH_Eb, MI_CH_Bb, MI_CH_F, MI_CH_C, MI_CH_G, MI_CH_D, MI_CH_A, MI_CH_E, MI_CH_B, MI_CH_Fs,
MI_CH_Dbm, MI_CH_Abm, MI_CH_Ebm, MI_CH_Bbm, MI_CH_Fm, MI_CH_Cm, MI_CH_Gm, MI_CH_Dm, MI_CH_Am, MI_CH_Em, MI_CH_Bm, MI_CH_Fsm,
MI_CH_DbDom7, MI_CH_AbDom7, MI_CH_EbDom7, MI_CH_BbDom7, MI_CH_FDom7, MI_CH_CDom7, MI_CH_GDom7, MI_CH_DDom7, MI_CH_ADom7, MI_CH_EDom7, MI_CH_BDom7, MI_CH_FsDom7,
MI_CH_DbDim7, MI_CH_AbDim7, MI_CH_EbDim7, MI_CH_BbDim7, MI_CH_FDim7, MI_CH_CDim7, MI_CH_GDim7, MI_CH_DDim7, MI_CH_ADim7, MI_CH_EDim7, MI_CH_BDim7, MI_CH_FsDim7,
MI_Db_2, MI_E_2, MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4,
MI_Eb_2, MI_Fs_2, MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5,
MI_F_2, MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5,
MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5,
MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, FN_MUTE
),
/* QWERTY */
[_QWERTY] = LAYOUT_wrapper_giabarinaix2(
KC_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
KC_TAB, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL,
KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT,
KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_LANG2, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_LANG1, KC_RALT, KC_RGUI, KC_RCTRL,
KC_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
KC_TAB, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL,
KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT,
KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_LANG2, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_LANG1, KC_RALT, KC_RGUI, _______
),
/* Fn */
[_FN] = LAYOUT_giabarinaix2(
DFCBASE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
DF_QWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
DFCBASE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
DF_QWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, VERSION, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______
)
};
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[_C_SYSTEM_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_QWERTY] = { ENCODER_CCW_CW(_______, _______) },
[_FN] = { ENCODER_CCW_CW(_______, _______) },
};
#endif
void keyboard_post_init_user(void) {
// Set otave to MI_OCT_0
midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN;
// avoid using 127 since it is used as a special number in some sound sources.
midi_config.velocity = MIDI_INITIAL_VELOCITY;
for (uint8_t i = 0; i < MY_CHORD_COUNT; i++) {
chord_status[i] = MIDI_INVALID_NOTE;
}
default_layer_set(1UL << _C_SYSTEM_BASE);
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
uint16_t root_note = MIDI_INVALID_NOTE; // Starting value for the root note of each chord
uint8_t chord = keycode - MY_CHORD_MIN;
switch (keycode) {
case VERSION: // Output firmware info.
if (record->event.pressed) {
SEND_STRING(QMK_KEYBOARD ":" QMK_KEYMAP " @ " QMK_VERSION " | " QMK_BUILDDATE);
}
break;
// MIDI Chord Keycodes, on the left side.
case MI_CH_Cr ... MI_CH_Br: // Root Notes
root_note = keycode - MI_CH_Cr + MI_C_1;
my_process_midi4Bass(midi_bass_ch, record, chord_status, chord, root_note, false);
break;
case MI_CH_C ... MI_CH_B: // Major Chords
root_note = keycode - MI_CH_C + MI_C_2;
// Root, Major Third, and Fifth Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 4, 7);
break;
case MI_CH_Cm ... MI_CH_Bm: // Minor Chord
root_note = keycode - MI_CH_Cm + MI_C_2;
// Root, Minor Third, and Fifth Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 7);
break;
case MI_CH_CDom7 ... MI_CH_BDom7: // Dominant 7th Chord
root_note = keycode - MI_CH_CDom7 + MI_C_2;
// Major Third, Major Fifth, and Minor Seventh Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 4, 7, 10);
break;
case MI_CH_CDim7 ... MI_CH_BDim7: // Diminished 7th Chord
root_note = keycode - MI_CH_CDim7 + MI_C_2;
// Root, Minor Third, and Diminished 5th Note
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 6);
break;
}
return true;
}

View File

@@ -0,0 +1 @@
# The default keymap for giabarinaix2

View File

@@ -0,0 +1,3 @@
ENCODER_ENABLE = no # encoder on mute button
ENCODER_MAP_ENABLE = yes # replacing ENCODERS_CW_KEY method to this on 2022/08/31.

View File

@@ -0,0 +1,26 @@
#pragma once
#define GIABARINAIX2
#ifdef GIABARINAIX2
# undef MATRIX_ROW_PINS_RIGHT
# undef MATRIX_COL_PINS_RIGHT
# ifdef RGBLIGHT_ENABLE
# undef RGBLED_NUM
# define RGBLED_NUM 120
# undef RGBLIGHT_LED_MAP
# define RGBLIGHT_LED_MAP { \
108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, \
107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, \
84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, \
83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, \
60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, \
\
11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, \
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, \
35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, \
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, \
59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48 \
}
# endif
#endif

View File

@@ -0,0 +1,146 @@
{
"keyboard_name": "giabarinaix2",
"manufacturer": "3araht",
"url": "https://github.com/3araht",
"maintainer": "3araht",
"usb": {
"vid": "0xFEED",
"pid": "0xF4B2",
"device_version": "0.0.1"
},
"layouts": {
"LAYOUT": {
"layout": [
{"label": "l00", "x": 0, "y": 0},
{"label": "l01", "x": 1, "y": 0},
{"label": "l02", "x": 2, "y": 0},
{"label": "l03", "x": 3, "y": 0},
{"label": "l04", "x": 4, "y": 0},
{"label": "l05", "x": 5, "y": 0},
{"label": "l06", "x": 6, "y": 0},
{"label": "l07", "x": 7, "y": 0},
{"label": "l08", "x": 8, "y": 0},
{"label": "l09", "x": 9, "y": 0},
{"label": "l0a", "x": 10, "y": 0},
{"label": "l0b", "x": 11, "y": 0},
{"label": "r00", "x": 14.5, "y": 0},
{"label": "r01", "x": 15.5, "y": 0},
{"label": "r02", "x": 16.5, "y": 0},
{"label": "r03", "x": 17.5, "y": 0},
{"label": "r04", "x": 18.5, "y": 0},
{"label": "r05", "x": 19.5, "y": 0},
{"label": "r06", "x": 20.5, "y": 0},
{"label": "r07", "x": 21.5, "y": 0},
{"label": "r08", "x": 22.5, "y": 0},
{"label": "r09", "x": 23.5, "y": 0},
{"label": "r0a", "x": 24.5, "y": 0},
{"label": "r0b", "x": 25.5, "y": 0},
{"label": "l10", "x": 0.5, "y": 1},
{"label": "l11", "x": 1.5, "y": 1},
{"label": "l12", "x": 2.5, "y": 1},
{"label": "l13", "x": 3.5, "y": 1},
{"label": "l14", "x": 4.5, "y": 1},
{"label": "l15", "x": 5.5, "y": 1},
{"label": "l16", "x": 6.5, "y": 1},
{"label": "l17", "x": 7.5, "y": 1},
{"label": "l18", "x": 8.5, "y": 1},
{"label": "l19", "x": 9.5, "y": 1},
{"label": "l1a", "x": 10.5, "y": 1},
{"label": "l1b", "x": 11.5, "y": 1},
{"label": "r10", "x": 15, "y": 1},
{"label": "r11", "x": 16, "y": 1},
{"label": "r12", "x": 17, "y": 1},
{"label": "r13", "x": 18, "y": 1},
{"label": "r14", "x": 19, "y": 1},
{"label": "r15", "x": 20, "y": 1},
{"label": "r16", "x": 21, "y": 1},
{"label": "r17", "x": 22, "y": 1},
{"label": "r18", "x": 23, "y": 1},
{"label": "r19", "x": 24, "y": 1},
{"label": "r1a", "x": 25, "y": 1},
{"label": "r1b", "x": 26, "y": 1},
{"label": "l20", "x": 1, "y": 2},
{"label": "l21", "x": 2, "y": 2},
{"label": "l22", "x": 3, "y": 2},
{"label": "l23", "x": 4, "y": 2},
{"label": "l24", "x": 5, "y": 2},
{"label": "l25", "x": 6, "y": 2},
{"label": "l26", "x": 7, "y": 2},
{"label": "l27", "x": 8, "y": 2},
{"label": "l28", "x": 9, "y": 2},
{"label": "l29", "x": 10, "y": 2},
{"label": "l2a", "x": 11, "y": 2},
{"label": "l2b", "x": 12, "y": 2},
{"label": "r20", "x": 15.5, "y": 2},
{"label": "r21", "x": 16.5, "y": 2},
{"label": "r22", "x": 17.5, "y": 2},
{"label": "r23", "x": 18.5, "y": 2},
{"label": "r24", "x": 19.5, "y": 2},
{"label": "r25", "x": 20.5, "y": 2},
{"label": "r26", "x": 21.5, "y": 2},
{"label": "r27", "x": 22.5, "y": 2},
{"label": "r28", "x": 23.5, "y": 2},
{"label": "r29", "x": 24.5, "y": 2},
{"label": "r2a", "x": 25.5, "y": 2},
{"label": "r2b", "x": 26.5, "y": 2},
{"label": "l30", "x": 1.5, "y": 3},
{"label": "l31", "x": 2.5, "y": 3},
{"label": "l32", "x": 3.5, "y": 3},
{"label": "l33", "x": 4.5, "y": 3},
{"label": "l34", "x": 5.5, "y": 3},
{"label": "l35", "x": 6.5, "y": 3},
{"label": "l36", "x": 7.5, "y": 3},
{"label": "l37", "x": 8.5, "y": 3},
{"label": "l38", "x": 9.5, "y": 3},
{"label": "l39", "x": 10.5, "y": 3},
{"label": "l3a", "x": 11.5, "y": 3},
{"label": "l3b", "x": 12.5, "y": 3},
{"label": "r30", "x": 16, "y": 3},
{"label": "r31", "x": 17, "y": 3},
{"label": "r32", "x": 18, "y": 3},
{"label": "r33", "x": 19, "y": 3},
{"label": "r34", "x": 20, "y": 3},
{"label": "r35", "x": 21, "y": 3},
{"label": "r36", "x": 22, "y": 3},
{"label": "r37", "x": 23, "y": 3},
{"label": "r38", "x": 24, "y": 3},
{"label": "r39", "x": 25, "y": 3},
{"label": "r3a", "x": 26, "y": 3},
{"label": "r3b", "x": 27, "y": 3},
{"label": "l40", "x": 2, "y": 4},
{"label": "l41", "x": 3, "y": 4},
{"label": "l42", "x": 4, "y": 4},
{"label": "l43", "x": 5, "y": 4},
{"label": "l44", "x": 6, "y": 4},
{"label": "l45", "x": 7, "y": 4},
{"label": "l46", "x": 8, "y": 4},
{"label": "l47", "x": 9, "y": 4},
{"label": "l48", "x": 10, "y": 4},
{"label": "l49", "x": 11, "y": 4},
{"label": "l4a", "x": 12, "y": 4},
{"label": "l4b", "x": 13, "y": 4},
{"label": "r40", "x": 16.5, "y": 4},
{"label": "r41", "x": 17.5, "y": 4},
{"label": "r42", "x": 18.5, "y": 4},
{"label": "r43", "x": 19.5, "y": 4},
{"label": "r44", "x": 20.5, "y": 4},
{"label": "r45", "x": 21.5, "y": 4},
{"label": "r46", "x": 22.5, "y": 4},
{"label": "r47", "x": 23.5, "y": 4},
{"label": "r48", "x": 24.5, "y": 4},
{"label": "r49", "x": 25.5, "y": 4},
{"label": "r4a", "x": 26.5, "y": 4},
{"label": "r4b", "x": 27.5, "y": 4}
]
}
}
}

View File

@@ -0,0 +1,464 @@
/* Copyright 2020 3araht
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
#include "version.h"
// Alias layout macros that expand groups of keys.
#define LAYOUT_wrapper_giabarinaix2(...) LAYOUT_giabarinaix2(__VA_ARGS__)
#define DFCBASE DF(_C_SYSTEM_BASE)
#define DF_QWER DF(_QWERTY)
// Long press: go to _FN layer, tap: MUTE
#define FN_MUTE LT(_FN, KC_MUTE)
// Used to set octave to MI_OCT_0
extern midi_config_t midi_config;
uint8_t midi_bass_ch = 0, midi_chord_ch = 0; // By default, all use the same channel.
#ifdef RGBLIGHT_ENABLE
/* used to specify there is no LED on the keylocation. */
# define NO_LED 255
#endif // RGBLIGHT_ENABLE
// Defines names for use in layer keycodes and the keymap
enum layer_names {
_C_SYSTEM_BASE, // MIDI C-system
_C_SYSTEM_BASS2ROW, // counter bass system
_C_SYSTEM_ENTIRELY, // single notes for both left and right keybaords.
_CHROMATONE,
_QWERTY, // just in case
_FN
};
// Defines the keycodes used by our macros in process_record_user
enum custom_keycodes {
// MIDI Chord Keycodes - Root notes
MY_CHORD_MIN = SAFE_RANGE,
MI_CH_Cr = MY_CHORD_MIN,
MI_CH_Csr,
MI_CH_Dbr = MI_CH_Csr,
MI_CH_Dr,
MI_CH_Dsr,
MI_CH_Ebr = MI_CH_Dsr,
MI_CH_Er,
MI_CH_Fr,
MI_CH_Fsr,
MI_CH_Gbr = MI_CH_Fsr,
MI_CH_Gr,
MI_CH_Gsr,
MI_CH_Abr = MI_CH_Gsr,
MI_CH_Ar,
MI_CH_Asr,
MI_CH_Bbr = MI_CH_Asr,
MI_CH_Br,
// MIDI Chord Keycodes - Major
MI_CH_C,
MI_CH_Cs,
MI_CH_Db = MI_CH_Cs,
MI_CH_D,
MI_CH_Ds,
MI_CH_Eb = MI_CH_Ds,
MI_CH_E,
MI_CH_F,
MI_CH_Fs,
MI_CH_Gb = MI_CH_Fs,
MI_CH_G,
MI_CH_Gs,
MI_CH_Ab = MI_CH_Gs,
MI_CH_A,
MI_CH_As,
MI_CH_Bb = MI_CH_As,
MI_CH_B,
// MIDI Chord Keycodes Minor
MI_CH_Cm,
MI_CH_Csm,
MI_CH_Dbm = MI_CH_Csm,
MI_CH_Dm,
MI_CH_Dsm,
MI_CH_Ebm = MI_CH_Dsm,
MI_CH_Em,
MI_CH_Fm,
MI_CH_Fsm,
MI_CH_Gbm = MI_CH_Fsm,
MI_CH_Gm,
MI_CH_Gsm,
MI_CH_Abm = MI_CH_Gsm,
MI_CH_Am,
MI_CH_Asm,
MI_CH_Bbm = MI_CH_Asm,
MI_CH_Bm,
//MIDI Chord Keycodes Dominant Seventh
MI_CH_CDom7,
MI_CH_CsDom7,
MI_CH_DbDom7 = MI_CH_CsDom7,
MI_CH_DDom7,
MI_CH_DsDom7,
MI_CH_EbDom7 = MI_CH_DsDom7,
MI_CH_EDom7,
MI_CH_FDom7,
MI_CH_FsDom7,
MI_CH_GbDom7 = MI_CH_FsDom7,
MI_CH_GDom7,
MI_CH_GsDom7,
MI_CH_AbDom7 = MI_CH_GsDom7,
MI_CH_ADom7,
MI_CH_AsDom7,
MI_CH_BbDom7 = MI_CH_AsDom7,
MI_CH_BDom7,
// MIDI Chord Keycodes Diminished Seventh
MI_CH_CDim7,
MI_CH_CsDim7,
MI_CH_DbDim7 = MI_CH_CsDim7,
MI_CH_DDim7,
MI_CH_DsDim7,
MI_CH_EbDim7 = MI_CH_DsDim7,
MI_CH_EDim7,
MI_CH_FDim7,
MI_CH_FsDim7,
MI_CH_GbDim7 = MI_CH_FsDim7,
MI_CH_GDim7,
MI_CH_GsDim7,
MI_CH_AbDim7 = MI_CH_GsDim7,
MI_CH_ADim7,
MI_CH_AsDim7,
MI_CH_BbDim7 = MI_CH_AsDim7,
MI_CH_BDim7,
MY_CHORD_MAX = MI_CH_BDim7,
VERSION,
CSYSTEM, // C-SYSTEM layout
CNTBASC, // CouNTer BASs C-system layout
CSYSALL, // C-SYStem ALL layout
CHRTONE, // CHRomaTONE layout
TGLMICH // ToGgLe MIdi CHannel separation
};
#define MY_CHORD_COUNT (MY_CHORD_MAX - MY_CHORD_MIN + 1)
static uint8_t chord_status[MY_CHORD_COUNT];
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* C-system Base */
[_C_SYSTEM_BASE] = LAYOUT_giabarinaix2(
MI_CH_Dbr, MI_CH_Abr, MI_CH_Ebr, MI_CH_Bbr, MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr,
MI_CH_Db, MI_CH_Ab, MI_CH_Eb, MI_CH_Bb, MI_CH_F, MI_CH_C, MI_CH_G, MI_CH_D, MI_CH_A, MI_CH_E, MI_CH_B, MI_CH_Fs,
MI_CH_Dbm, MI_CH_Abm, MI_CH_Ebm, MI_CH_Bbm, MI_CH_Fm, MI_CH_Cm, MI_CH_Gm, MI_CH_Dm, MI_CH_Am, MI_CH_Em, MI_CH_Bm, MI_CH_Fsm,
MI_CH_DbDom7, MI_CH_AbDom7, MI_CH_EbDom7, MI_CH_BbDom7, MI_CH_FDom7, MI_CH_CDom7, MI_CH_GDom7, MI_CH_DDom7, MI_CH_ADom7, MI_CH_EDom7, MI_CH_BDom7, MI_CH_FsDom7,
MI_CH_DbDim7, MI_CH_AbDim7, MI_CH_EbDim7, MI_CH_BbDim7, MI_CH_FDim7, MI_CH_CDim7, MI_CH_GDim7, MI_CH_DDim7, MI_CH_ADim7, MI_CH_EDim7, MI_CH_BDim7, MI_CH_FsDim7,
MI_Db_2, MI_E_2, MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4,
MI_Eb_2, MI_Fs_2, MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5,
MI_F_2, MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5,
MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5,
MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, FN_MUTE
),
/* BASS2row */
[_C_SYSTEM_BASS2ROW] = LAYOUT_giabarinaix2(
MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr, MI_CH_Csr, MI_CH_Gsr, MI_CH_Dsr, MI_CH_Asr,
MI_CH_Dbr, MI_CH_Abr, MI_CH_Ebr, MI_CH_Bbr, MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr,
MI_CH_Db, MI_CH_Ab, MI_CH_Eb, MI_CH_Bb, MI_CH_F, MI_CH_C, MI_CH_G, MI_CH_D, MI_CH_A, MI_CH_E, MI_CH_B, MI_CH_Fs,
MI_CH_Dbm, MI_CH_Abm, MI_CH_Ebm, MI_CH_Bbm, MI_CH_Fm, MI_CH_Cm, MI_CH_Gm, MI_CH_Dm, MI_CH_Am, MI_CH_Em, MI_CH_Bm, MI_CH_Fsm,
MI_CH_DbDom7, MI_CH_AbDom7, MI_CH_EbDom7, MI_CH_BbDom7, MI_CH_FDom7, MI_CH_CDom7, MI_CH_GDom7, MI_CH_DDom7, MI_CH_ADom7, MI_CH_EDom7, MI_CH_BDom7, MI_CH_FsDom7,
MI_Db_2, MI_E_2, MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4,
MI_Eb_2, MI_Fs_2, MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5,
MI_F_2, MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5,
MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5,
MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, FN_MUTE
),
/* C-system entirely */
[_C_SYSTEM_ENTIRELY] = LAYOUT_giabarinaix2(
XXXXXXX, XXXXXXX, XXXXXXX, MI_Db, MI_E, MI_G, MI_Bb, MI_Db_1, MI_E_1, MI_G_1, MI_Bb_1, MI_Db_2,
XXXXXXX, XXXXXXX, MI_C, MI_Eb, MI_Fs, MI_A, MI_C_1, MI_Eb_1, MI_Fs_1, MI_A_1, MI_C_2, MI_Eb_2,
XXXXXXX, XXXXXXX, MI_D, MI_F, MI_Ab, MI_B, MI_D_1, MI_F_1, MI_Ab_1, MI_B_1, MI_D_2, MI_F_2,
XXXXXXX, MI_Db, MI_E, MI_G, MI_Bb, MI_Db_1, MI_E_1, MI_G_1, MI_Bb_1, MI_Db_2, MI_E_2, MI_G_2,
MI_C, MI_Eb, MI_Fs, MI_A, MI_C_1, MI_Eb_1, MI_Fs_1, MI_A_1, MI_C_2, MI_Eb_2, MI_Fs_2, MI_A_2,
MI_E_2, MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5,
MI_Fs_2, MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5,
MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5,
MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Fs_5, FN_MUTE
),
/* Chromatone */
[_CHROMATONE] = LAYOUT_giabarinaix2(
XXXXXXX, XXXXXXX, MI_Db, MI_Eb, MI_F, MI_G, MI_A, MI_B, MI_Db_1, MI_Eb_1, MI_F_1, MI_G_1,
XXXXXXX, MI_C, MI_D, MI_E, MI_Fs, MI_Ab, MI_Bb, MI_C_1, MI_D_1, MI_E_1, MI_Fs_1, MI_Ab_1,
XXXXXXX, MI_Db, MI_Eb, MI_F, MI_G, MI_A, MI_B, MI_Db_1, MI_Eb_1, MI_F_1, MI_G_1, MI_A_1,
MI_C, MI_D, MI_E, MI_Fs, MI_Ab, MI_Bb, MI_C_1, MI_D_1, MI_E_1, MI_Fs_1, MI_Ab_1, MI_Bb_1,
MI_Db, MI_Eb, MI_F, MI_G, MI_A, MI_B, MI_Db_1, MI_Eb_1, MI_F_1, MI_G_1, MI_A_1, MI_B_1,
MI_A_1, MI_B_1, MI_Db_2, MI_Eb_2, MI_F_2, MI_G_2, MI_A_2, MI_B_2, MI_Db_3, MI_Eb_3, MI_F_3, MI_G_3,
MI_Bb_1, MI_C_2, MI_D_2, MI_E_2, MI_Gb_2, MI_Ab_2, MI_Bb_2, MI_C_3, MI_D_3, MI_E_3, MI_Gb_3, MI_Ab_3,
MI_B_1, MI_Db_2, MI_Eb_2, MI_F_2, MI_G_2, MI_A_2, MI_B_2, MI_Db_3, MI_Eb_3, MI_F_3, MI_G_3, MI_A_3,
MI_C_2, MI_D_2, MI_E_2, MI_Gb_2, MI_Ab_2, MI_Bb_2, MI_C_3, MI_D_3, MI_E_3, MI_Gb_3, MI_Ab_3, MI_Bb_3,
MI_Db_2, MI_Eb_2, MI_F_2, MI_G_2, MI_A_2, MI_B_2, MI_Db_3, MI_Eb_3, MI_F_3, MI_G_3, MI_A_3, FN_MUTE
),
/* QWERTY */
[_QWERTY] = LAYOUT_wrapper_giabarinaix2(
KC_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
KC_TAB, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL,
KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT,
KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_LANG2, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_LANG1, KC_RALT, KC_RGUI, KC_RCTRL,
KC_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
KC_TAB, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL,
KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT,
KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_LANG2, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_LANG1, KC_RALT, KC_RGUI, _______
),
/* Fn */
[_FN] = LAYOUT_giabarinaix2(
CSYSTEM, CNTBASC, CSYSALL, CHRTONE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG,
DF_QWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, TGLMICH,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
CSYSTEM, CNTBASC, CSYSALL, CHRTONE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG,
DF_QWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, VERSION, TGLMICH,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______
)
};
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[_C_SYSTEM_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_C_SYSTEM_BASS2ROW] = { ENCODER_CCW_CW(_______, _______) },
[_C_SYSTEM_ENTIRELY] = { ENCODER_CCW_CW(_______, _______) },
[_CHROMATONE] = { ENCODER_CCW_CW(_______, _______) },
[_QWERTY] = { ENCODER_CCW_CW(_______, _______) },
[_FN] = { ENCODER_CCW_CW(_______, _______) },
};
#endif
#ifdef RGBLIGHT_ENABLE
// Light up fn layer keys
const rgblight_segment_t PROGMEM my_fn_layer[] = RGBLIGHT_LAYER_SEGMENTS( // left keyboard
{0, 4, HSV_ORANGE}, // MIDI layouts
{11, 1, HSV_RED}, // RGB_TOG
{12, 1, HSV_WHITE}, // DF_QWER
{35, 1, HSV_TEAL}, // TGLMICH
// right keyboard
{60, 4, HSV_ORANGE}, // MIDI layouts
{71 , 1, HSV_RED}, // RGB_TOG
{72, 1, HSV_WHITE}, // DF_QWER
{83, 1, HSV_TEAL} // TGLMICH
);
// Now define the array of layers. Later layers take precedence
const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(my_fn_layer);
layer_state_t layer_state_set_user(layer_state_t state) {
// Both layers will light up if both kb layers are active
rgblight_set_layer_state(0, layer_state_cmp(state, _FN));
return state;
};
#endif // RGBLIGHT_ENABLE
void keyboard_post_init_user(void) {
// Set otave to MI_OCT_0
midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN;
// avoid using 127 since it is used as a special number in some sound sources.
midi_config.velocity = MIDI_INITIAL_VELOCITY;
for (uint8_t i = 0; i < MY_CHORD_COUNT; i++) {
chord_status[i] = MIDI_INVALID_NOTE;
}
#ifdef RGBLIGHT_ENABLE
rgblight_layers = my_rgb_layers;
// Reset LED off
rgblight_sethsv(HSV_BLACK);
# if defined(RGBLIGHT_EFFECT_KNIGHT) || defined(RGBLIGHT_EFFECT_TWINKLE)
rgblight_sethsv(30, 50, 40);
# ifdef RGBLIGHT_EFFECT_KNIGHT
rgblight_mode(RGBLIGHT_MODE_KNIGHT);
# elif defined(RGBLIGHT_EFFECT_TWINKLE)
rgblight_mode(RGBLIGHT_MODE_TWINKLE+3);
# endif
# endif
#endif // RGBLIGHT_ENABLE
};
void toggle_MIDI_channel_separation(void) {
if (midi_chord_ch > 0) {
midi_chord_ch = 0;
midi_bass_ch = 0;
} else {
midi_chord_ch = 1;
midi_bass_ch = 2;
}
}
#ifdef RGBLIGHT_ENABLE
void switch_keylight_color4bass(keyrecord_t *record, uint8_t keylocation){
switch (biton32(default_layer_state)) {
case _C_SYSTEM_BASE:
keylight_manager(record, HSV_GREEN, keylocation);
break;
case _C_SYSTEM_BASS2ROW:
keylight_manager(record, HSV_YELLOW, keylocation);
break;
}
}
void switch_keylight_color4chords(keyrecord_t *record, uint8_t keylocation){
switch (biton32(default_layer_state)) {
case _C_SYSTEM_BASE:
keylight_manager(record, HSV_SPRINGGREEN, keylocation);
break;
case _C_SYSTEM_BASS2ROW:
keylight_manager(record, HSV_GOLDENROD, keylocation);
break;
}
}
#endif // RGBLIGHT_ENABLE
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
uint16_t root_note = MIDI_INVALID_NOTE; // Starting value for the root note of each chord
#ifdef RGBLIGHT_ENABLE
/* prepare for turning on LEDs when keys are pressed. */
uint8_t r = record->event.key.row;
uint8_t c = record->event.key.col;
uint8_t keylocation = pgm_read_byte(&convert_key_to_led[MATRIX_COLS * r + c]);
#endif // RGBLIGHT_ENABLE
uint8_t chord = keycode - MY_CHORD_MIN;
switch (keycode) {
case VERSION: // Output firmware info.
if (record->event.pressed) {
SEND_STRING(QMK_KEYBOARD ":" QMK_KEYMAP " @ " QMK_VERSION " | " QMK_BUILDDATE);
}
break;
// set default layer and save it to EEPROM when MIDI key layers are selected.
case CSYSTEM:
if (record->event.pressed) {
set_single_persistent_default_layer(_C_SYSTEM_BASE);
}
break;
case CNTBASC:
if (record->event.pressed) {
set_single_persistent_default_layer(_C_SYSTEM_BASS2ROW);
}
break;
case CSYSALL:
if (record->event.pressed) {
set_single_persistent_default_layer(_C_SYSTEM_ENTIRELY);
}
break;
case CHRTONE:
if (record->event.pressed) {
set_single_persistent_default_layer(_CHROMATONE);
}
break;
case TGLMICH:
if (record->event.pressed) {
toggle_MIDI_channel_separation();
};
break;
// MIDI Chord Keycodes, on the left side.
case MI_CH_Cr ... MI_CH_Br: // Root Notes
root_note = keycode - MI_CH_Cr + MI_C_1;
my_process_midi4Bass(midi_bass_ch, record, chord_status, chord, root_note, false);
#ifdef RGBLIGHT_ENABLE
switch_keylight_color4bass(record, keylocation);
#endif
break;
case MI_CH_C ... MI_CH_B: // Major Chords
root_note = keycode - MI_CH_C + MI_C_2;
// Root, Major Third, and Fifth Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 4, 7);
#ifdef RGBLIGHT_ENABLE
switch_keylight_color4chords(record, keylocation);
#endif
break;
case MI_CH_Cm ... MI_CH_Bm: // Minor Chord
root_note = keycode - MI_CH_Cm + MI_C_2;
// Root, Minor Third, and Fifth Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 7);
#ifdef RGBLIGHT_ENABLE
switch_keylight_color4chords(record, keylocation);
#endif
break;
case MI_CH_CDom7 ... MI_CH_BDom7: // Dominant 7th Chord
root_note = keycode - MI_CH_CDom7 + MI_C_2;
// Major Third, Major Fifth, and Minor Seventh Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 4, 7, 10);
#ifdef RGBLIGHT_ENABLE
switch_keylight_color4chords(record, keylocation);
#endif
break;
case MI_CH_CDim7 ... MI_CH_BDim7: // Diminished 7th Chord
root_note = keycode - MI_CH_CDim7 + MI_C_2;
// Root, Minor Third, and Diminished 5th Note
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 6);
#ifdef RGBLIGHT_ENABLE
switch_keylight_color4chords(record, keylocation);
#endif
break;
#ifdef RGBLIGHT_ENABLE
case KC_A ... KC_RGUI: // for QWERTY
case KC_GESC:
keylight_manager(record, HSV_GOLDENROD, keylocation);
break;
#endif
// Keycodes on the right side.
#ifdef RGBLIGHT_ENABLE
case MIDI_TONE_MIN ... MIDI_TONE_MAX: // notes on the right side.
keylight_manager(record, HSV_GOLDENROD, keylocation);
break;
// case KC_MUTE:
case FN_MUTE:
keylight_manager(record, HSV_GOLDENROD, keylocation);
break;
#endif
}
return true;
}

View File

@@ -0,0 +1 @@
# A keymap for giabarinaix2 with LEDs.

View File

@@ -0,0 +1,3 @@
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
ENCODER_MAP_ENABLE = yes # replacing ENCODERS_CW_KEY method to this on 2022/08/31.

View File

@@ -0,0 +1,792 @@
/* Copyright 2020 3araht
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
#include "print.h"
#include "version.h"
// Alias layout macros that expand groups of keys.
#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
#define DF_QWER DF(_QWERTY)
#define DF_COLE DF(_COLEMAK)
#define MO_ADJ MO(_ADJUST)
// Long press: go to _FN layer, tap: MUTE
#define FN_MUTE LT(_FN, KC_MUTE)
#define SHIF_UP RSFT_T(KC_UP)
#define ADJ_EIS LT(_ADJUST,KC_LANG2)
#define MIS_KAN LT(_MISC,KC_LANG1)
// Used to set octave to MI_OCT_0
extern midi_config_t midi_config;
uint8_t midi_bass_ch = 0, midi_chord_ch = 0; // By default, all use the same channel.
// UNISON flags
static bool melody_dyad_high = false; // true when +1 octave unison dyad is enabled.
static bool melody_dyad_low = false; // true when -1 octave unison dyad is enabled.
static bool melody_unison_suppress = true; // true: velocity of octave unison note is suppressd to UNISON_VELOCITY_RATIO
// To record the status of Bass Chord (single or dyad, default: dyad.)
typedef union {
uint32_t raw;
struct {
bool isSingleBass:1;
};
} user_config_t;
user_config_t user_config;
#define IS_SINGLE_BASS() (user_config.isSingleBass)
#ifdef RGBLIGHT_ENABLE
/* used to specify there is no LED on the keylocation. */
# define NO_LED 255
#endif // RGBLIGHT_ENABLE
// Defines names for use in layer keycodes and the keymap
enum layer_names {
_C_SYSTEM_BASE, // MIDI C-system
_FAKE_B_SYSTEM, // MIDI fake B-system doesn't have correct assignments on top two rows. The bottom 3 rows are B-system.
_C_SYSTEM_BASS2ROW, // counter bass system
_C_SYSTEM_ENTIRELY, // single notes for both left and right keybaords.
_C_SYSTEM_FREEBASS, // C-system Free Bass
_CHROMATONE,
_CFLIP_BASS2ROW, // 180 degree flipped layout on right side keyboard
_QWERTY,
_COLEMAK,
_ADJUST, // for Fn keys, etc.
_FN // for changing layers, octaves, etc.
};
// Defines the keycodes used by our macros in process_record_user
enum custom_keycodes {
// MIDI Chord Keycodes - Root notes
MY_CHORD_MIN = SAFE_RANGE,
MI_CH_Cr = MY_CHORD_MIN,
MI_CH_Csr,
MI_CH_Dbr = MI_CH_Csr,
MI_CH_Dr,
MI_CH_Dsr,
MI_CH_Ebr = MI_CH_Dsr,
MI_CH_Er,
MI_CH_Fr,
MI_CH_Fsr,
MI_CH_Gbr = MI_CH_Fsr,
MI_CH_Gr,
MI_CH_Gsr,
MI_CH_Abr = MI_CH_Gsr,
MI_CH_Ar,
MI_CH_Asr,
MI_CH_Bbr = MI_CH_Asr,
MI_CH_Br,
// MIDI Chord Keycodes - Major
MI_CH_C,
MI_CH_Cs,
MI_CH_Db = MI_CH_Cs,
MI_CH_D,
MI_CH_Ds,
MI_CH_Eb = MI_CH_Ds,
MI_CH_E,
MI_CH_F,
MI_CH_Fs,
MI_CH_Gb = MI_CH_Fs,
MI_CH_G,
MI_CH_Gs,
MI_CH_Ab = MI_CH_Gs,
MI_CH_A,
MI_CH_As,
MI_CH_Bb = MI_CH_As,
MI_CH_B,
// MIDI Chord Keycodes Minor
MI_CH_Cm,
MI_CH_Csm,
MI_CH_Dbm = MI_CH_Csm,
MI_CH_Dm,
MI_CH_Dsm,
MI_CH_Ebm = MI_CH_Dsm,
MI_CH_Em,
MI_CH_Fm,
MI_CH_Fsm,
MI_CH_Gbm = MI_CH_Fsm,
MI_CH_Gm,
MI_CH_Gsm,
MI_CH_Abm = MI_CH_Gsm,
MI_CH_Am,
MI_CH_Asm,
MI_CH_Bbm = MI_CH_Asm,
MI_CH_Bm,
//MIDI Chord Keycodes Dominant Seventh
MI_CH_CDom7,
MI_CH_CsDom7,
MI_CH_DbDom7 = MI_CH_CsDom7,
MI_CH_DDom7,
MI_CH_DsDom7,
MI_CH_EbDom7 = MI_CH_DsDom7,
MI_CH_EDom7,
MI_CH_FDom7,
MI_CH_FsDom7,
MI_CH_GbDom7 = MI_CH_FsDom7,
MI_CH_GDom7,
MI_CH_GsDom7,
MI_CH_AbDom7 = MI_CH_GsDom7,
MI_CH_ADom7,
MI_CH_AsDom7,
MI_CH_BbDom7 = MI_CH_AsDom7,
MI_CH_BDom7,
// MIDI Chord Keycodes Diminished Seventh
MI_CH_CDim7,
MI_CH_CsDim7,
MI_CH_DbDim7 = MI_CH_CsDim7,
MI_CH_DDim7,
MI_CH_DsDim7,
MI_CH_EbDim7 = MI_CH_DsDim7,
MI_CH_EDim7,
MI_CH_FDim7,
MI_CH_FsDim7,
MI_CH_GbDim7 = MI_CH_FsDim7,
MI_CH_GDim7,
MI_CH_GsDim7,
MI_CH_AbDim7 = MI_CH_GsDim7,
MI_CH_ADim7,
MI_CH_AsDim7,
MI_CH_BbDim7 = MI_CH_AsDim7,
MI_CH_BDim7,
MY_CHORD_MAX = MI_CH_BDim7,
VERSION,
CSYSTEM, // C-SYSTEM layout
BSYSTEM, // B-SYSTEM layout
CNTBASC, // CouNTer BASs C-system layout
CSYSALL, // C-SYStem ALL layout
CSYSFBS, // C-SYStem Free BaSs
CHRTONE, // CHRomaTONE layout
CFLIP2B, // C-system FLIPped 2(to) Backwards
TGLBASS, // ToGgLe BASS unison
TGLMICH, // ToGgLe MIdi CHannel separation
MELDYAL, // MELody DYad Low
MELODYS, // MELODY Single
MELDYAH, // MELody DYad High
TGLUVEL // ToGgLe Unison VELocity
};
#define MY_CHORD_COUNT (MY_CHORD_MAX - MY_CHORD_MIN + 1)
static uint8_t chord_status[MY_CHORD_COUNT];
static uint8_t my_tone_status[MIDI_TONE_COUNT];
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* C-system Base */
[_C_SYSTEM_BASE] = LAYOUT(
MI_CH_Dbr, MI_CH_Abr, MI_CH_Ebr, MI_CH_Bbr, MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr,
MI_CH_Db, MI_CH_Ab, MI_CH_Eb, MI_CH_Bb, MI_CH_F, MI_CH_C, MI_CH_G, MI_CH_D, MI_CH_A, MI_CH_E, MI_CH_B, MI_CH_Fs,
MI_CH_Dbm, MI_CH_Abm, MI_CH_Ebm, MI_CH_Bbm, MI_CH_Fm, MI_CH_Cm, MI_CH_Gm, MI_CH_Dm, MI_CH_Am, MI_CH_Em, MI_CH_Bm, MI_CH_Fsm,
MI_CH_DbDom7, MI_CH_AbDom7, MI_CH_EbDom7, MI_CH_BbDom7, MI_CH_FDom7, MI_CH_CDom7, MI_CH_GDom7, MI_CH_DDom7, MI_CH_ADom7, MI_CH_EDom7, MI_CH_BDom7, MI_CH_FsDom7,
MI_CH_DbDim7, MI_CH_AbDim7, MI_CH_EbDim7, MI_CH_BbDim7, MI_CH_FDim7, MI_CH_CDim7, MI_CH_GDim7, MI_CH_DDim7, MI_CH_ADim7, MI_CH_EDim7, MI_CH_BDim7, MI_CH_FsDim7,
MI_Fs_2,
MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5, FN_MUTE,
MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Fs_5
),
/* fake B-system */
[_FAKE_B_SYSTEM] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
MI_Ab_2,
MI_A_2, MI_C_3, MI_Eb_3, MI_Gb_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Gb_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Gb_5, _______,
MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5
),
/* BASS2row */
[_C_SYSTEM_BASS2ROW] = LAYOUT(
MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr, MI_CH_Csr, MI_CH_Gsr, MI_CH_Dsr, MI_CH_Asr,
MI_CH_Dbr, MI_CH_Abr, MI_CH_Ebr, MI_CH_Bbr, MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr,
MI_CH_Db, MI_CH_Ab, MI_CH_Eb, MI_CH_Bb, MI_CH_F, MI_CH_C, MI_CH_G, MI_CH_D, MI_CH_A, MI_CH_E, MI_CH_B, MI_CH_Fs,
MI_CH_Dbm, MI_CH_Abm, MI_CH_Ebm, MI_CH_Bbm, MI_CH_Fm, MI_CH_Cm, MI_CH_Gm, MI_CH_Dm, MI_CH_Am, MI_CH_Em, MI_CH_Bm, MI_CH_Fsm,
MI_CH_DbDom7, MI_CH_AbDom7, MI_CH_EbDom7, MI_CH_BbDom7, MI_CH_FDom7, MI_CH_CDom7, MI_CH_GDom7, MI_CH_DDom7, MI_CH_ADom7, MI_CH_EDom7, MI_CH_BDom7, MI_CH_FsDom7,
MI_Fs_2,
MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5, _______,
MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Fs_5
),
/* C-system entirely */
[_C_SYSTEM_ENTIRELY] = LAYOUT(
MI_BENDU, XXXXXXX, XXXXXXX, MI_Db, MI_E, MI_G, MI_Bb, MI_Db_1, MI_E_1, MI_G_1, MI_Bb_1, MI_Db_2,
MI_BENDD, XXXXXXX, MI_C, MI_Eb, MI_Fs, MI_A, MI_C_1, MI_Eb_1, MI_Fs_1, MI_A_1, MI_C_2, MI_Eb_2,
XXXXXXX, XXXXXXX, MI_D, MI_F, MI_Ab, MI_B, MI_D_1, MI_F_1, MI_Ab_1, MI_B_1, MI_D_2, MI_F_2,
XXXXXXX, MI_Db, MI_E, MI_G, MI_Bb, MI_Db_1, MI_E_1, MI_G_1, MI_Bb_1, MI_Db_2, MI_E_2, MI_G_2,
MI_C, MI_Eb, MI_Fs, MI_A, MI_C_1, MI_Eb_1, MI_Fs_1, MI_A_1, MI_C_2, MI_Eb_2, MI_Fs_2, MI_A_2,
MI_Fs_2,
MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5, FN_MUTE,
MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Fs_5
),
/* C-system free bass */
[_C_SYSTEM_FREEBASS] = LAYOUT(
MI_Db_3, MI_Bb_2, MI_G_2, MI_E_2, MI_Db_2, MI_Bb_1, MI_G_1, MI_E_1, MI_Db_1, MI_Bb, MI_G, MI_E,
MI_C_3, MI_A_2, MI_Fs_2, MI_Eb_2, MI_C_2, MI_A_1, MI_Fs_1, MI_Eb_1, MI_C_1, MI_A, MI_Fs, MI_Eb,
MI_B_2, MI_Ab_2, MI_F_2, MI_D_2, MI_B_1, MI_Ab_1, MI_F_1, MI_D_1, MI_B, MI_Ab, MI_F, MI_D,
MI_Bb_2, MI_G_2, MI_E_2, MI_Db_2, MI_Bb_1, MI_G_1, MI_E_1, MI_Db_1, MI_Bb, MI_G, MI_E, MI_Db,
MI_A_2, MI_Fs_2, MI_Eb_2, MI_C_2, MI_A_1, MI_Fs_1, MI_Eb_1, MI_C_1, MI_A, MI_Fs, MI_Eb, MI_C,
MI_Fs_2,
MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5, FN_MUTE,
MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Fs_5
),
/* Chromatone */
[_CHROMATONE] = LAYOUT(
MI_Db, MI_Eb, MI_F, MI_G, MI_A, MI_B, MI_Db_1, MI_Eb_1, MI_F_1, MI_G_1, MI_A_1, MI_B_1,
MI_D, MI_E, MI_Fs, MI_Ab, MI_Bb, MI_C_1, MI_D_1, MI_E_1, MI_Fs_1, MI_Ab_1, MI_Bb_1, MI_C_2,
MI_Eb, MI_F, MI_G, MI_A, MI_B, MI_Db_1, MI_Eb_1, MI_F_1, MI_G_1, MI_A_1, MI_B_1, MI_Db_2,
MI_E, MI_Fs, MI_Ab, MI_Bb, MI_C_1, MI_D_1, MI_E_1, MI_Fs_1, MI_Ab_1, MI_Bb_1, MI_C_2, MI_D_2,
MI_F, MI_G, MI_A, MI_B, MI_Db_1, MI_Eb_1, MI_F_1, MI_G_1, MI_A_1, MI_B_1, MI_Db_2, MI_Eb_2,
MI_C_2,
MI_Db_2, MI_Eb_2, MI_F_2, MI_G_2, MI_A_2, MI_B_2, MI_Db_3, MI_Eb_3, MI_F_3, MI_G_3, MI_A_3, MI_B_3, FN_MUTE,
MI_C_2, MI_D_2, MI_E_2, MI_Gb_2, MI_Ab_2, MI_Bb_2, MI_C_3, MI_D_3, MI_E_3, MI_Gb_3, MI_Ab_3, MI_Bb_3, MI_C_4,
MI_Db_2, MI_Eb_2, MI_F_2, MI_G_2, MI_A_2, MI_B_2, MI_Db_3, MI_Eb_3, MI_F_3, MI_G_3, MI_A_3, MI_B_3
),
[_CFLIP_BASS2ROW] = LAYOUT(
MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr, MI_CH_Csr, MI_CH_Gsr, MI_CH_Dsr, MI_CH_Asr,
MI_CH_Dbr, MI_CH_Abr, MI_CH_Ebr, MI_CH_Bbr, MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr,
MI_CH_Db, MI_CH_Ab, MI_CH_Eb, MI_CH_Bb, MI_CH_F, MI_CH_C, MI_CH_G, MI_CH_D, MI_CH_A, MI_CH_E, MI_CH_B, MI_CH_Fs,
MI_CH_Dbm, MI_CH_Abm, MI_CH_Ebm, MI_CH_Bbm, MI_CH_Fm, MI_CH_Cm, MI_CH_Gm, MI_CH_Dm, MI_CH_Am, MI_CH_Em, MI_CH_Bm, MI_CH_Fsm,
MI_CH_DbDom7, MI_CH_AbDom7, MI_CH_EbDom7, MI_CH_BbDom7, MI_CH_FDom7, MI_CH_CDom7, MI_CH_GDom7, MI_CH_DDom7, MI_CH_ADom7, MI_CH_EDom7, MI_CH_BDom7, MI_CH_FsDom7,
MI_G_5,
MI_F_5, MI_D_5, MI_B_4, MI_Ab_4, MI_F_4, MI_D_4, MI_B_3, MI_Ab_3, MI_F_3, MI_D_3, MI_B_2, MI_Ab_2, FN_MUTE,
MI_Fs_5, MI_Eb_5, MI_C_5, MI_A_4, MI_Fs_4, MI_Eb_4, MI_C_4, MI_A_3, MI_Fs_3, MI_Eb_3, MI_C_3, MI_A_2, MI_Fs_2,
MI_E_5, MI_Db_5, MI_Bb_4, MI_G_4, MI_E_4, MI_Db_4, MI_Bb_3, MI_G_3, MI_E_3, MI_Db_3, MI_Bb_2, MI_G_2
),
/* QWERTY */
[_QWERTY] = LAYOUT_wrapper(
KC_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
KC_TAB, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL,
KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT,
KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, ADJ_EIS, KC_SPC, KC_SPC, KC_LANG1, KC_APP, MO_ADJ, KC_LEFT, KC_DOWN, KC_RGHT,
_______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
/* COLEMAK */
[_COLEMAK] = LAYOUT_wrapper(
KC_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
KC_TAB, _________________COLEMAK_L1________________, _________________COLEMAK_R1________________, KC_DEL,
KC_LCTL, _________________COLEMAK_L2________________, _________________COLEMAK_R2________________, KC_ENT,
KC_LSFT, _________________COLEMAK_L3________________, _________________COLEMAK_R3________________, SHIF_UP,
KC_CAPS, KC_LGUI, KC_LALT, ADJ_EIS, KC_SPC, KC_SPC, KC_LANG1, KC_APP, MO_ADJ, KC_LEFT, KC_DOWN, KC_RGHT,
_______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
/* ADJUST */
[_ADJUST] = LAYOUT_wrapper(
_______, _________________FUNC__L___________________, _________________FUNC__R___________________, _______,
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_MINS, KC_EQL, _______,
_______, KC_VOLD, KC_VOLU, KC_MUTE, XXXXXXX, XXXXXXX, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_GRV, _______,
_______, KC_BRID, KC_BRIU, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_LBRC, KC_RBRC, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_QUOT, KC_BSLS, _______,
_______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
/* Fn */
[_FN] = LAYOUT(
CSYSTEM, BSYSTEM, CNTBASC, CSYSALL, CHRTONE, CFLIP2B, CSYSFBS, XXXXXXX, XXXXXXX, XXXXXXX, RGB_MOD, RGB_TOG,
DF_QWER, TGLBASS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
DF_COLE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, TGLMICH,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX,
MI_OCT_N2, MI_OCT_N1, MI_OCT_0, MI_OCT_1, MI_OCT_2, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, VERSION, EEP_RST, _______,
CSYSTEM, BSYSTEM, CNTBASC, CSYSALL, CHRTONE, CFLIP2B, CSYSFBS, XXXXXXX, XXXXXXX, MI_VELD, MI_VELU, RGB_MOD, RGB_TOG,
XXXXXXX, TGLBASS, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, TGLUVEL, MELDYAL, MELODYS, MELDYAH
)
};
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[_C_SYSTEM_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_FAKE_B_SYSTEM] = { ENCODER_CCW_CW(_______, _______) },
[_C_SYSTEM_BASS2ROW] = { ENCODER_CCW_CW(_______, _______) },
[_C_SYSTEM_ENTIRELY] = { ENCODER_CCW_CW(_______, _______) },
[_C_SYSTEM_FREEBASS] = { ENCODER_CCW_CW(_______, _______) },
[_CHROMATONE] = { ENCODER_CCW_CW(_______, _______) },
[_CFLIP_BASS2ROW] = { ENCODER_CCW_CW(_______, _______) },
[_QWERTY] = { ENCODER_CCW_CW(_______, _______) },
[_COLEMAK] = { ENCODER_CCW_CW(_______, _______) },
[_ADJUST] = { ENCODER_CCW_CW(_______, _______) },
[_FN] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD) },
};
#endif
#ifdef RGBLIGHT_ENABLE
// Light up adjust layer keys (left keyboard)
const rgblight_segment_t PROGMEM my_adjust_layer[] = RGBLIGHT_LAYER_SEGMENTS({1, 10, HSV_ORANGE},
{21, 2, HSV_ORANGE},
{25, 3, HSV_ORANGE},
{30, 5, HSV_ORANGE},
{37, 2, HSV_ORANGE},
{45, 2, HSV_ORANGE},
{57, 2, HSV_ORANGE}
);
// Light up fn layer keys
const rgblight_segment_t PROGMEM my_fn_layer[] = RGBLIGHT_LAYER_SEGMENTS( // left keyboard
{0, 7, HSV_ORANGE}, // MIDI layouts
{11, 1, HSV_RED}, // RGB_TOG
{12, 1, HSV_WHITE}, // DF_QWER
{13, 1, HSV_CORAL}, // TGLBASS
{24, 1, HSV_WHITE}, // DF_COLE
{35, 1, HSV_TEAL}, // TGLMICH
#if 0 // Color Test
{36, 1, HSV_WHITE},
{37, 1, HSV_RED},
{38, 1, HSV_CORAL},
{39, 1, HSV_ORANGE},
{40, 1, HSV_GOLDENROD},
{41, 1, HSV_GOLD},
{42, 1, HSV_YELLOW},
{43, 1, HSV_CHARTREUSE},
{44, 1, HSV_GREEN},
{45, 1, HSV_SPRINGGREEN},
{46, 1, HSV_TURQUOISE},
{47, 1, HSV_TEAL},
{48, 1, HSV_CYAN},
{49, 1, HSV_AZURE},
{50, 1, HSV_BLUE},
{51, 1, HSV_PURPLE},
{52, 1, HSV_MAGENTA},
{53, 1, HSV_PINK},
#endif
// right keyboard
{60, 7, HSV_ORANGE}, // MIDI layouts
{74, 1, HSV_CORAL}, // TGLBASS
{85, 1, HSV_BLUE}, // MIDI Oct
{86, 1, HSV_CYAN}, // MIDI Oct
{87, 1, HSV_SPRINGGREEN}, // MIDI Oct
{88, 1, HSV_GREEN}, // MIDI Oct
{89, 1, HSV_CHARTREUSE}, // MIDI Oct
{96, 1, HSV_PINK}, // EEP_RST
{98, 7, HSV_ORANGE}, // MIDI layouts
{107, 1, HSV_YELLOW}, // MI_VELD
{108, 1, HSV_GREEN}, // MI_VELU
{110, 1, HSV_RED}, // RGB_TOG
{112, 1, HSV_CORAL}, // TGLBASS
{119, 1, HSV_CORAL}, // TGLUVEL
{120, 1, HSV_CYAN}, // MELDYAL
{121, 1, HSV_GOLD}, // MELODYS
{122, 1, HSV_SPRINGGREEN} // MELDYAH
);
// Now define the array of layers. Later layers take precedence
const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(my_fn_layer, my_adjust_layer);
layer_state_t layer_state_set_user(layer_state_t state) {
// Both layers will light up if both kb layers are active
rgblight_set_layer_state(0, layer_state_cmp(state, _FN));
rgblight_set_layer_state(1, layer_state_cmp(state, _ADJUST));
return state;
};
#endif // RGBLIGHT_ENABLE
void my_init(void){
// Set octave to MI_OCT_0
midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN;
// avoid using 127 since it is used as a special number in some sound sources.
midi_config.velocity = MIDI_INITIAL_VELOCITY;
}
void eeconfig_init_user(void) {
midi_init();
my_init();
// Used to set octave to MI_OCT_0
midi_bass_ch = 0, midi_chord_ch = 0; // By default, all use the same channel.
// UNISON flags
melody_dyad_high = false; // true when +1 octave unison dyad is enabled.
melody_dyad_low = false; // true when -1 octave unison dyad is enabled.
melody_unison_suppress = true; // true: velocity of octave unison note is suppressd to UNISON_VELOCITY_RATIO
// Reset Bass setting
user_config.raw = 0; // default: dyad
eeconfig_update_user(user_config.raw);
// Reset the midi keyboard layout
set_single_persistent_default_layer(_C_SYSTEM_BASS2ROW);
#ifdef RGB_MATRIX_ENABLE
rgb_matrix_sethsv(HSV_BLUE);
// party mode (for LED soldering test.)
rgb_matrix_mode(RGB_MATRIX_RAINBOW_MOVING_CHEVRON);
#endif
}
#ifdef RGB_MATRIX_ENABLE
void rgb_matrix_indicators_user(void) {
uint8_t i;
// uint32_t mode = rgblight_get_mode();
if (rgb_matrix_is_enabled()) { // turn the lights on when it is enabled.
uint8_t layer = biton32(layer_state);
switch (layer) {
case _ADJUST:
rgb_matrix_set_color(30, RGB_DARKORANGE);
rgb_matrix_set_color(34, RGB_DARKORANGE);
// rgb_matrix_set_color(72, RGB_DARKORANGE);
break;
case _FN:
for (i = 0;i < 7;i++) {
rgb_matrix_set_color(74 - i, RGB_DARKORANGE); // MIDI layouts
// right keyboard
rgb_matrix_set_color(i, RGB_DARKORANGE); // MIDI layouts
rgb_matrix_set_color(50 - i, RGB_DARKORANGE); // MIDI layouts
}
// rgb_matrix_set_color(pgm_read_byte(&convert_led_location2number[11]), RGB_RED); // RGB_TOG <- too heavy.
rgb_matrix_set_color(64, RGB_DARKBLUE); // RGB_MOD
rgb_matrix_set_color(63, RGB_DARKRED); // RGB_TOG
rgb_matrix_set_color(76, RGB_DARKCORAL); // TGLBASS
rgb_matrix_set_color(75, RGB_DARKWHITE); // DF_QWER
rgb_matrix_set_color(98, RGB_DARKWHITE); // DF_COLE
rgb_matrix_set_color(87, RGB_DARKTEAL); // TGLMICH
rgb_matrix_set_color(23, RGB_DARKCORAL); // TGLBASS
rgb_matrix_set_color(26, RGB_DARKBLUE); // MIDI Oct
rgb_matrix_set_color(27, RGB_DARKCYAN); // MIDI Oct
rgb_matrix_set_color(28, RGB_DARKSPRINGGREEN); // MIDI Oct
rgb_matrix_set_color(29, RGB_DARKGREEN); // MIDI Oct
rgb_matrix_set_color(30, RGB_DARKCHARTREUSE); // MIDI Oct
rgb_matrix_set_color(37, RGB_DARKPINK); // EEP_RST
rgb_matrix_set_color(41, RGB_DARKYELLOW); // MI_VELD
rgb_matrix_set_color(40, RGB_DARKGREEN); // MI_VELU
rgb_matrix_set_color(39, RGB_DARKBLUE); // RGB_MOD
rgb_matrix_set_color(38, RGB_DARKRED); // RGB_TOG
rgb_matrix_set_color(52, RGB_DARKCORAL); // TGLBASS
rgb_matrix_set_color(59, RGB_DARKCORAL); // TGLUVEL
rgb_matrix_set_color(60, RGB_DARKCYAN); // MELDYAL
rgb_matrix_set_color(61, RGB_DARKGOLD); // MELODYS
rgb_matrix_set_color(62, RGB_DARKSPRINGGREEN); // MELDYAH
break;
}
}
}
#endif
void keyboard_post_init_user(void) {
my_init();
for (uint8_t i = 0; i < MY_CHORD_COUNT; i++) {
chord_status[i] = MIDI_INVALID_NOTE;
}
for (uint8_t i = 0; i < MIDI_TONE_COUNT; i++) {
my_tone_status[i] = MIDI_INVALID_NOTE;
}
// load EEPROM data for isSingleBass
user_config.raw = eeconfig_read_user();
#ifdef RGBLIGHT_ENABLE
rgblight_layers = my_rgb_layers;
// Reset LED off
rgblight_sethsv(HSV_BLACK);
# if defined(RGBLIGHT_EFFECT_KNIGHT) || defined(RGBLIGHT_EFFECT_TWINKLE)
rgblight_sethsv(30, 50, 40);
# ifdef RGBLIGHT_EFFECT_KNIGHT
rgblight_mode(RGBLIGHT_MODE_KNIGHT);
# elif defined(RGBLIGHT_EFFECT_TWINKLE)
rgblight_mode(RGBLIGHT_MODE_TWINKLE+3);
# endif
# endif
#endif // RGBLIGHT_ENABLE
#ifdef RGB_MATRIX_ENABLE
rgb_matrix_sethsv(HSV_BLUE);
// party mode (for LED soldering test.)
rgb_matrix_mode(RGB_MATRIX_RAINBOW_MOVING_CHEVRON);
#endif
};
void toggle_isSingleBass(void) {
#ifdef CONSOLE_ENABLE
uprintf("isSingleBass(before) %u\n", user_config.isSingleBass);
#endif
user_config.isSingleBass = !user_config.isSingleBass;
#ifdef CONSOLE_ENABLE
uprintf("isSingleBass(after) %u\n", user_config.isSingleBass);
#endif
eeconfig_update_user(user_config.raw);
}
void toggle_MIDI_channel_separation(void) {
if (midi_chord_ch > 0) {
midi_chord_ch = 0;
midi_bass_ch = 0;
} else {
midi_chord_ch = 1;
midi_bass_ch = 2;
}
}
#ifdef RGBLIGHT_ENABLE
void keylight_manager(keyrecord_t *record, uint8_t hue, uint8_t sat, uint8_t val, uint8_t keylocation) {
if (keylocation == NO_LED) {
return; // do nothing.
# ifdef CONSOLE_ENABLE
uprintf("keylight_manager, NO_LED\n");
# endif
}
if (record->event.pressed) {
rgblight_sethsv_at(hue, sat, val, keylocation);
} else {
rgblight_sethsv_at(HSV_BLACK, keylocation);
}
}
#endif // RGBLIGHT_ENABLE
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
uint16_t root_note = MIDI_INVALID_NOTE; // Starting value for the root note of each chord
#ifdef RGBLIGHT_ENABLE
/* prepare for turning on LEDs when keys are pressed. */
uint8_t r = record->event.key.row;
uint8_t c = record->event.key.col;
// uint8_t keylocation = convert_key_to_led[MATRIX_COLS * r + c];
// uint8_t keylocation2 = convert_key_to_led2[MATRIX_COLS * r + c];
uint8_t keylocation = pgm_read_byte(&convert_key_to_led[MATRIX_COLS * r + c]);
uint8_t keylocation2 = pgm_read_byte(&convert_key_to_led2[MATRIX_COLS * r + c]);
#endif // RGBLIGHT_ENABLE
uint8_t chord = keycode - MY_CHORD_MIN;
switch (keycode) {
case VERSION: // Output firmware info.
if (record->event.pressed) {
SEND_STRING(QMK_KEYBOARD ":" QMK_KEYMAP " @ " QMK_VERSION " | " QMK_BUILDDATE);
}
break;
// set default layer and save it to EEPROM when MIDI key layers are selected.
case CSYSTEM:
if (record->event.pressed) {
set_single_persistent_default_layer(_C_SYSTEM_BASE);
}
break;
case BSYSTEM:
if (record->event.pressed) {
set_single_persistent_default_layer(_FAKE_B_SYSTEM);
}
break;
case CNTBASC:
if (record->event.pressed) {
set_single_persistent_default_layer(_C_SYSTEM_BASS2ROW);
}
break;
case CSYSALL:
if (record->event.pressed) {
set_single_persistent_default_layer(_C_SYSTEM_ENTIRELY);
}
break;
case CHRTONE:
if (record->event.pressed) {
set_single_persistent_default_layer(_CHROMATONE);
}
break;
case CFLIP2B:
if (record->event.pressed) {
set_single_persistent_default_layer(_CFLIP_BASS2ROW);
}
break;
case CSYSFBS:
if (record->event.pressed) {
set_single_persistent_default_layer(_C_SYSTEM_FREEBASS);
}
break;
case TGLBASS:
if (record->event.pressed) {
toggle_isSingleBass();
};
break;
case TGLMICH:
if (record->event.pressed) {
toggle_MIDI_channel_separation();
};
break;
case MELDYAL:
if (record->event.pressed) {
melody_dyad_low = true;
melody_dyad_high = false;
};
break;
case MELODYS:
if (record->event.pressed) {
melody_dyad_low = false;
melody_dyad_high = false;
};
break;
case MELDYAH:
if (record->event.pressed) {
melody_dyad_low = false;
melody_dyad_high = true;
};
break;
case TGLUVEL:
if (record->event.pressed) {
melody_unison_suppress = !melody_unison_suppress;
};
break;
// MIDI Chord Keycodes, on the left side.
case MI_CH_Cr ... MI_CH_Br: // Root Notes
root_note = keycode - MI_CH_Cr + MI_C_1;
my_process_midi4Bass(midi_bass_ch, record, chord_status, chord, root_note, IS_SINGLE_BASS());
#ifdef RGBLIGHT_ENABLE
keylight_manager(record, HSV_GOLDENROD, keylocation);
#endif
break;
case MI_CH_C ... MI_CH_B: // Major Chords
root_note = keycode - MI_CH_C + MI_C_2;
// Root, Major Third, and Fifth Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 4, 7);
#ifdef RGBLIGHT_ENABLE
keylight_manager(record, HSV_GOLDENROD, keylocation);
#endif
break;
case MI_CH_Cm ... MI_CH_Bm: // Minor Chord
root_note = keycode - MI_CH_Cm + MI_C_2;
// Root, Minor Third, and Fifth Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 7);
#ifdef RGBLIGHT_ENABLE
keylight_manager(record, HSV_GOLDENROD, keylocation);
#endif
break;
case MI_CH_CDom7 ... MI_CH_BDom7: // Dominant 7th Chord
root_note = keycode - MI_CH_CDom7 + MI_C_2;
// Major Third, Major Fifth, and Minor Seventh Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 4, 7, 10);
#ifdef RGBLIGHT_ENABLE
keylight_manager(record, HSV_GOLDENROD, keylocation);
#endif
break;
case MI_CH_CDim7 ... MI_CH_BDim7: // Diminished 7th Chord
root_note = keycode - MI_CH_CDim7 + MI_C_2;
// Root, Minor Third, and Diminished 5th Note
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 6);
#ifdef RGBLIGHT_ENABLE
keylight_manager(record, HSV_GOLDENROD, keylocation);
#endif
break;
#ifdef RGBLIGHT_ENABLE
case KC_A ... KC_RGUI: // for QWERTY
case KC_GESC:
case ADJ_EIS:
case MO_ADJ:
case SHIF_UP:
keylight_manager(record, HSV_GOLDENROD, keylocation);
break;
#endif
// Keycodes on the right side.
case MIDI_TONE_MIN ... MIDI_TONE_MAX: // notes on the right side keyboard.
// root_note is played by process_midi().
if ( melody_dyad_high == true ) { // play 1 octave higher as well.
my_process_midi(0, keycode, record, my_tone_status, 12, melody_unison_suppress);
} else if ( melody_dyad_low == true ) { // play 1 octave lower as well.
my_process_midi(0, keycode, record, my_tone_status, -12, melody_unison_suppress);
}
#ifdef RGBLIGHT_ENABLE
keylight_manager(record, HSV_GOLDENROD, keylocation);
keylight_manager(record, HSV_GOLDENROD, keylocation2);
#endif
break;
#ifdef RGBLIGHT_ENABLE
// case KC_MUTE:
case FN_MUTE:
keylight_manager(record, HSV_GOLDENROD, keylocation);
break;
#endif
}
// If console is enabled, it will print the matrix position and status of each key pressed
#if defined(CONSOLE_ENABLE) && defined(RGBLIGHT_ENABLE)
uprintf("KL: kc: %u, col: %u, row: %u, pressed: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed);
uprintf("r=%d, c=%d, keyloc=%d, keyloc2=%d, matrix_col x r + c = %d\n", r, c, keylocation, keylocation2, MATRIX_COLS * r + c);
#endif
return true;
}

View File

@@ -0,0 +1,3 @@
# The fancy LED ver. for giabalanai
# warning: There is little space left for the firmware. You can't do anything further with this firmware.
# Power consumption might exceed 5 V * 500 mA = 2.5 W or so.

View File

@@ -0,0 +1,57 @@
#ifdef RGB_MATRIX_KEYREACTIVE_ENABLED
RGB_MATRIX_EFFECT(my_solid_reactive_with_CnoteIndicator)
RGB_MATRIX_EFFECT(my_party_rocks)
# ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
bool my_solid_reactive_with_CnoteIndicator(effect_params_t* params) {
RGB_MATRIX_USE_LIMITS(led_min, led_max);
uint16_t max_tick = 65535 / rgb_matrix_config.speed;
for (uint8_t i = led_min; i < led_max; i++) {
RGB_MATRIX_TEST_LED_FLAGS();
HSV hsv = rgb_matrix_config.hsv;
switch (i) {
// C note indicator
case 15:
case 19:
case 23:
case 52:
case 56:
case 60:
case 80: // left hand side, bass C note when counter bass is chosen.
// HSV_GOLDENROD
hsv.h = 30;
hsv.s = 218;
hsv.v = 218;
break;
}
uint16_t tick = max_tick;
// Reverse search to find most recent key hit
for (int8_t j = g_last_hit_tracker.count - 1; j >= 0; j--) {
if (g_last_hit_tracker.x[j] == g_led_config.point[i].x && g_last_hit_tracker.y[j] == g_led_config.point[i].y && g_last_hit_tracker.tick[j] < tick) {
tick = g_last_hit_tracker.tick[j];
break;
}
}
uint16_t offset = scale16by8(tick, rgb_matrix_config.speed);
hsv.h += qsub8(130, offset);
RGB rgb = rgb_matrix_hsv_to_rgb(hsv);
rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
}
return led_max < DRIVER_LED_TOTAL;
}
bool my_party_rocks(effect_params_t* params) {
RGB_MATRIX_USE_LIMITS(led_min, led_max);
HSV hsv = {rand() & 0xFF, rand() & 0xFF, rgb_matrix_config.hsv.v};
RGB rgb = rgb_matrix_hsv_to_rgb(hsv);
// rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
rgb_matrix_set_color_all(rgb.r, rgb.g, rgb.b);
return led_max < DRIVER_LED_TOTAL;
}
# endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS
#endif // RGB_MATRIX_KEYREACTIVE_ENABLED

View File

@@ -0,0 +1,6 @@
# RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
CONSOLE_ENABLE = no # Console for debug
RGB_MATRIX_ENABLE = yes # Use RGB matrix (Don't enable this when RGBLIGHT_ENABLE is used.)
RGB_MATRIX_CUSTOM_USER = yes #
ENCODER_MAP_ENABLE = yes # replacing ENCODERS_CW_KEY method to this on 2022/08/31.

View File

@@ -0,0 +1,3 @@
#pragma once
#define DYNAMIC_KEYMAP_LAYER_COUNT 3

View File

@@ -0,0 +1,260 @@
/* Copyright 2020 3araht
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
#include "version.h"
// Alias layout macros that expand groups of keys.
#define LAYOUT_wrapper(...) LAYOUT(__VA_ARGS__)
#define DFCBASE DF(_C_SYSTEM_BASE)
#define DF_QWER DF(_QWERTY)
// Long press: go to _FN layer, tap: MUTE
#define FN_MUTE LT(_FN, KC_MUTE)
// Used to set octave to MI_OCT_0
extern midi_config_t midi_config;
uint8_t midi_bass_ch = 0, midi_chord_ch = 0; // By default, all use the same channel.
// Defines names for use in layer keycodes and the keymap
enum layer_names {
_C_SYSTEM_BASE, // MIDI C-system
_QWERTY, // just in case
_FN
};
// Defines the keycodes used by our macros in process_record_user
enum custom_keycodes {
// MIDI Chord Keycodes - Root notes
MY_CHORD_MIN = SAFE_RANGE,
MI_CH_Cr = MY_CHORD_MIN,
MI_CH_Csr,
MI_CH_Dbr = MI_CH_Csr,
MI_CH_Dr,
MI_CH_Dsr,
MI_CH_Ebr = MI_CH_Dsr,
MI_CH_Er,
MI_CH_Fr,
MI_CH_Fsr,
MI_CH_Gbr = MI_CH_Fsr,
MI_CH_Gr,
MI_CH_Gsr,
MI_CH_Abr = MI_CH_Gsr,
MI_CH_Ar,
MI_CH_Asr,
MI_CH_Bbr = MI_CH_Asr,
MI_CH_Br,
// MIDI Chord Keycodes - Major
MI_CH_C,
MI_CH_Cs,
MI_CH_Db = MI_CH_Cs,
MI_CH_D,
MI_CH_Ds,
MI_CH_Eb = MI_CH_Ds,
MI_CH_E,
MI_CH_F,
MI_CH_Fs,
MI_CH_Gb = MI_CH_Fs,
MI_CH_G,
MI_CH_Gs,
MI_CH_Ab = MI_CH_Gs,
MI_CH_A,
MI_CH_As,
MI_CH_Bb = MI_CH_As,
MI_CH_B,
// MIDI Chord Keycodes Minor
MI_CH_Cm,
MI_CH_Csm,
MI_CH_Dbm = MI_CH_Csm,
MI_CH_Dm,
MI_CH_Dsm,
MI_CH_Ebm = MI_CH_Dsm,
MI_CH_Em,
MI_CH_Fm,
MI_CH_Fsm,
MI_CH_Gbm = MI_CH_Fsm,
MI_CH_Gm,
MI_CH_Gsm,
MI_CH_Abm = MI_CH_Gsm,
MI_CH_Am,
MI_CH_Asm,
MI_CH_Bbm = MI_CH_Asm,
MI_CH_Bm,
//MIDI Chord Keycodes Dominant Seventh
MI_CH_CDom7,
MI_CH_CsDom7,
MI_CH_DbDom7 = MI_CH_CsDom7,
MI_CH_DDom7,
MI_CH_DsDom7,
MI_CH_EbDom7 = MI_CH_DsDom7,
MI_CH_EDom7,
MI_CH_FDom7,
MI_CH_FsDom7,
MI_CH_GbDom7 = MI_CH_FsDom7,
MI_CH_GDom7,
MI_CH_GsDom7,
MI_CH_AbDom7 = MI_CH_GsDom7,
MI_CH_ADom7,
MI_CH_AsDom7,
MI_CH_BbDom7 = MI_CH_AsDom7,
MI_CH_BDom7,
// MIDI Chord Keycodes Diminished Seventh
MI_CH_CDim7,
MI_CH_CsDim7,
MI_CH_DbDim7 = MI_CH_CsDim7,
MI_CH_DDim7,
MI_CH_DsDim7,
MI_CH_EbDim7 = MI_CH_DsDim7,
MI_CH_EDim7,
MI_CH_FDim7,
MI_CH_FsDim7,
MI_CH_GbDim7 = MI_CH_FsDim7,
MI_CH_GDim7,
MI_CH_GsDim7,
MI_CH_AbDim7 = MI_CH_GsDim7,
MI_CH_ADim7,
MI_CH_AsDim7,
MI_CH_BbDim7 = MI_CH_AsDim7,
MI_CH_BDim7,
MY_CHORD_MAX = MI_CH_BDim7,
VERSION = USER00
};
#define MY_CHORD_COUNT (MY_CHORD_MAX - MY_CHORD_MIN + 1)
static uint8_t chord_status[MY_CHORD_COUNT];
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* C-system Base */
[_C_SYSTEM_BASE] = LAYOUT(
MI_CH_Dbr, MI_CH_Abr, MI_CH_Ebr, MI_CH_Bbr, MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr,
MI_CH_Db, MI_CH_Ab, MI_CH_Eb, MI_CH_Bb, MI_CH_F, MI_CH_C, MI_CH_G, MI_CH_D, MI_CH_A, MI_CH_E, MI_CH_B, MI_CH_Fs,
MI_CH_Dbm, MI_CH_Abm, MI_CH_Ebm, MI_CH_Bbm, MI_CH_Fm, MI_CH_Cm, MI_CH_Gm, MI_CH_Dm, MI_CH_Am, MI_CH_Em, MI_CH_Bm, MI_CH_Fsm,
MI_CH_DbDom7, MI_CH_AbDom7, MI_CH_EbDom7, MI_CH_BbDom7, MI_CH_FDom7, MI_CH_CDom7, MI_CH_GDom7, MI_CH_DDom7, MI_CH_ADom7, MI_CH_EDom7, MI_CH_BDom7, MI_CH_FsDom7,
MI_CH_DbDim7, MI_CH_AbDim7, MI_CH_EbDim7, MI_CH_BbDim7, MI_CH_FDim7, MI_CH_CDim7, MI_CH_GDim7, MI_CH_DDim7, MI_CH_ADim7, MI_CH_EDim7, MI_CH_BDim7, MI_CH_FsDim7,
MI_Fs_2,
MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5, MI_F_5, FN_MUTE,
MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5, MI_G_5,
MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, MI_Fs_5
),
/* QWERTY */
[_QWERTY] = LAYOUT_wrapper(
KC_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
KC_TAB, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL,
KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT,
KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_LANG2, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_LANG1, KC_RALT, KC_RGUI, KC_RCTRL,
KC_GESC,
_________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_MINS, KC_BSPC, _______,
KC_LCTL, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_QUOT, KC_ENT,
KC_LALT, _________________QWERTY_L3_________________, KC_N, KC_M, KC_COMM, KC_DOT, KC_SPC, KC_RSFT
),
/* Fn */
[_FN] = LAYOUT(
DFCBASE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
DF_QWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
_______,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, VERSION, XXXXXXX, _______,
DFCBASE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
DF_QWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
)
};
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[_C_SYSTEM_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_QWERTY] = { ENCODER_CCW_CW(_______, _______) },
[_FN] = { ENCODER_CCW_CW(_______, _______) },
};
#endif
void keyboard_post_init_user(void) {
// Set otave to MI_OCT_0
midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN;
// avoid using 127 since it is used as a special number in some sound sources.
midi_config.velocity = MIDI_INITIAL_VELOCITY;
for (uint8_t i = 0; i < MY_CHORD_COUNT; i++) {
chord_status[i] = MIDI_INVALID_NOTE;
}
default_layer_set(1UL << _C_SYSTEM_BASE);
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
uint16_t root_note = MIDI_INVALID_NOTE; // Starting value for the root note of each chord
uint8_t chord = keycode - MY_CHORD_MIN;
switch (keycode) {
case VERSION: // Output firmware info.
if (record->event.pressed) {
SEND_STRING(QMK_KEYBOARD ":" QMK_KEYMAP " @ " QMK_VERSION " | " QMK_BUILDDATE);
}
break;
// MIDI Chord Keycodes, on the left side.
case MI_CH_Cr ... MI_CH_Br: // Root Notes
root_note = keycode - MI_CH_Cr + MI_C_1;
my_process_midi4Bass(midi_bass_ch, record, chord_status, chord, root_note, false);
break;
case MI_CH_C ... MI_CH_B: // Major Chords
root_note = keycode - MI_CH_C + MI_C_2;
// Root, Major Third, and Fifth Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 4, 7);
break;
case MI_CH_Cm ... MI_CH_Bm: // Minor Chord
root_note = keycode - MI_CH_Cm + MI_C_2;
// Root, Minor Third, and Fifth Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 7);
break;
case MI_CH_CDom7 ... MI_CH_BDom7: // Dominant 7th Chord
root_note = keycode - MI_CH_CDom7 + MI_C_2;
// Major Third, Major Fifth, and Minor Seventh Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 4, 7, 10);
break;
case MI_CH_CDim7 ... MI_CH_BDim7: // Diminished 7th Chord
root_note = keycode - MI_CH_CDim7 + MI_C_2;
// Root, Minor Third, and Diminished 5th Note
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 6);
break;
}
return true;
}

View File

@@ -0,0 +1 @@
# The default VIA keymap for giabalanai

View File

@@ -0,0 +1,3 @@
VIA_ENABLE = yes
ENCODER_MAP_ENABLE = yes # replacing ENCODERS_CW_KEY method to this on 2022/08/31.

View File

@@ -0,0 +1,27 @@
#pragma once
#define DYNAMIC_KEYMAP_LAYER_COUNT 3
#define GIABARINAIX2
#ifdef GIABARINAIX2
# undef MATRIX_ROW_PINS_RIGHT
# undef MATRIX_COL_PINS_RIGHT
# ifdef RGBLIGHT_ENABLE
# undef RGBLED_NUM
# define RGBLED_NUM 120
# undef RGBLIGHT_LED_MAP
# define RGBLIGHT_LED_MAP { \
108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, \
107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 96, \
84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, \
83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, \
60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, \
\
11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, \
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, \
35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, \
36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, \
59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48 \
}
# endif
#endif

View File

@@ -0,0 +1,146 @@
{
"keyboard_name": "giabarinaix2",
"manufacturer": "3araht",
"url": "https://github.com/3araht",
"maintainer": "3araht",
"usb": {
"vid": "0xFEED",
"pid": "0xF4B2",
"device_version": "0.0.1"
},
"layouts": {
"LAYOUT": {
"layout": [
{"label": "l00", "x": 0, "y": 0},
{"label": "l01", "x": 1, "y": 0},
{"label": "l02", "x": 2, "y": 0},
{"label": "l03", "x": 3, "y": 0},
{"label": "l04", "x": 4, "y": 0},
{"label": "l05", "x": 5, "y": 0},
{"label": "l06", "x": 6, "y": 0},
{"label": "l07", "x": 7, "y": 0},
{"label": "l08", "x": 8, "y": 0},
{"label": "l09", "x": 9, "y": 0},
{"label": "l0a", "x": 10, "y": 0},
{"label": "l0b", "x": 11, "y": 0},
{"label": "r00", "x": 14.5, "y": 0},
{"label": "r01", "x": 15.5, "y": 0},
{"label": "r02", "x": 16.5, "y": 0},
{"label": "r03", "x": 17.5, "y": 0},
{"label": "r04", "x": 18.5, "y": 0},
{"label": "r05", "x": 19.5, "y": 0},
{"label": "r06", "x": 20.5, "y": 0},
{"label": "r07", "x": 21.5, "y": 0},
{"label": "r08", "x": 22.5, "y": 0},
{"label": "r09", "x": 23.5, "y": 0},
{"label": "r0a", "x": 24.5, "y": 0},
{"label": "r0b", "x": 25.5, "y": 0},
{"label": "l10", "x": 0.5, "y": 1},
{"label": "l11", "x": 1.5, "y": 1},
{"label": "l12", "x": 2.5, "y": 1},
{"label": "l13", "x": 3.5, "y": 1},
{"label": "l14", "x": 4.5, "y": 1},
{"label": "l15", "x": 5.5, "y": 1},
{"label": "l16", "x": 6.5, "y": 1},
{"label": "l17", "x": 7.5, "y": 1},
{"label": "l18", "x": 8.5, "y": 1},
{"label": "l19", "x": 9.5, "y": 1},
{"label": "l1a", "x": 10.5, "y": 1},
{"label": "l1b", "x": 11.5, "y": 1},
{"label": "r10", "x": 15, "y": 1},
{"label": "r11", "x": 16, "y": 1},
{"label": "r12", "x": 17, "y": 1},
{"label": "r13", "x": 18, "y": 1},
{"label": "r14", "x": 19, "y": 1},
{"label": "r15", "x": 20, "y": 1},
{"label": "r16", "x": 21, "y": 1},
{"label": "r17", "x": 22, "y": 1},
{"label": "r18", "x": 23, "y": 1},
{"label": "r19", "x": 24, "y": 1},
{"label": "r1a", "x": 25, "y": 1},
{"label": "r1b", "x": 26, "y": 1},
{"label": "l20", "x": 1, "y": 2},
{"label": "l21", "x": 2, "y": 2},
{"label": "l22", "x": 3, "y": 2},
{"label": "l23", "x": 4, "y": 2},
{"label": "l24", "x": 5, "y": 2},
{"label": "l25", "x": 6, "y": 2},
{"label": "l26", "x": 7, "y": 2},
{"label": "l27", "x": 8, "y": 2},
{"label": "l28", "x": 9, "y": 2},
{"label": "l29", "x": 10, "y": 2},
{"label": "l2a", "x": 11, "y": 2},
{"label": "l2b", "x": 12, "y": 2},
{"label": "r20", "x": 15.5, "y": 2},
{"label": "r21", "x": 16.5, "y": 2},
{"label": "r22", "x": 17.5, "y": 2},
{"label": "r23", "x": 18.5, "y": 2},
{"label": "r24", "x": 19.5, "y": 2},
{"label": "r25", "x": 20.5, "y": 2},
{"label": "r26", "x": 21.5, "y": 2},
{"label": "r27", "x": 22.5, "y": 2},
{"label": "r28", "x": 23.5, "y": 2},
{"label": "r29", "x": 24.5, "y": 2},
{"label": "r2a", "x": 25.5, "y": 2},
{"label": "r2b", "x": 26.5, "y": 2},
{"label": "l30", "x": 1.5, "y": 3},
{"label": "l31", "x": 2.5, "y": 3},
{"label": "l32", "x": 3.5, "y": 3},
{"label": "l33", "x": 4.5, "y": 3},
{"label": "l34", "x": 5.5, "y": 3},
{"label": "l35", "x": 6.5, "y": 3},
{"label": "l36", "x": 7.5, "y": 3},
{"label": "l37", "x": 8.5, "y": 3},
{"label": "l38", "x": 9.5, "y": 3},
{"label": "l39", "x": 10.5, "y": 3},
{"label": "l3a", "x": 11.5, "y": 3},
{"label": "l3b", "x": 12.5, "y": 3},
{"label": "r30", "x": 16, "y": 3},
{"label": "r31", "x": 17, "y": 3},
{"label": "r32", "x": 18, "y": 3},
{"label": "r33", "x": 19, "y": 3},
{"label": "r34", "x": 20, "y": 3},
{"label": "r35", "x": 21, "y": 3},
{"label": "r36", "x": 22, "y": 3},
{"label": "r37", "x": 23, "y": 3},
{"label": "r38", "x": 24, "y": 3},
{"label": "r39", "x": 25, "y": 3},
{"label": "r3a", "x": 26, "y": 3},
{"label": "r3b", "x": 27, "y": 3},
{"label": "l40", "x": 2, "y": 4},
{"label": "l41", "x": 3, "y": 4},
{"label": "l42", "x": 4, "y": 4},
{"label": "l43", "x": 5, "y": 4},
{"label": "l44", "x": 6, "y": 4},
{"label": "l45", "x": 7, "y": 4},
{"label": "l46", "x": 8, "y": 4},
{"label": "l47", "x": 9, "y": 4},
{"label": "l48", "x": 10, "y": 4},
{"label": "l49", "x": 11, "y": 4},
{"label": "l4a", "x": 12, "y": 4},
{"label": "l4b", "x": 13, "y": 4},
{"label": "r40", "x": 16.5, "y": 4},
{"label": "r41", "x": 17.5, "y": 4},
{"label": "r42", "x": 18.5, "y": 4},
{"label": "r43", "x": 19.5, "y": 4},
{"label": "r44", "x": 20.5, "y": 4},
{"label": "r45", "x": 21.5, "y": 4},
{"label": "r46", "x": 22.5, "y": 4},
{"label": "r47", "x": 23.5, "y": 4},
{"label": "r48", "x": 24.5, "y": 4},
{"label": "r49", "x": 25.5, "y": 4},
{"label": "r4a", "x": 26.5, "y": 4},
{"label": "r4b", "x": 27.5, "y": 4}
]
}
}
}

View File

@@ -0,0 +1,262 @@
/* Copyright 2020 3araht
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
#include "version.h"
// Alias layout macros that expand groups of keys.
#define LAYOUT_wrapper_giabarinaix2(...) LAYOUT_giabarinaix2(__VA_ARGS__)
#define DFCBASE DF(_C_SYSTEM_BASE)
#define DF_QWER DF(_QWERTY)
// Long press: go to _FN layer, tap: MUTE
#define FN_MUTE LT(_FN, KC_MUTE)
// Used to set octave to MI_OCT_0
extern midi_config_t midi_config;
uint8_t midi_bass_ch = 0, midi_chord_ch = 0; // By default, all use the same channel.
// Defines names for use in layer keycodes and the keymap
enum layer_names {
_C_SYSTEM_BASE, // MIDI C-system
_QWERTY, // just in case
_FN
};
// Defines the keycodes used by our macros in process_record_user
enum custom_keycodes {
// MIDI Chord Keycodes - Root notes
MY_CHORD_MIN = SAFE_RANGE,
MI_CH_Cr = MY_CHORD_MIN,
MI_CH_Csr,
MI_CH_Dbr = MI_CH_Csr,
MI_CH_Dr,
MI_CH_Dsr,
MI_CH_Ebr = MI_CH_Dsr,
MI_CH_Er,
MI_CH_Fr,
MI_CH_Fsr,
MI_CH_Gbr = MI_CH_Fsr,
MI_CH_Gr,
MI_CH_Gsr,
MI_CH_Abr = MI_CH_Gsr,
MI_CH_Ar,
MI_CH_Asr,
MI_CH_Bbr = MI_CH_Asr,
MI_CH_Br,
// MIDI Chord Keycodes - Major
MI_CH_C,
MI_CH_Cs,
MI_CH_Db = MI_CH_Cs,
MI_CH_D,
MI_CH_Ds,
MI_CH_Eb = MI_CH_Ds,
MI_CH_E,
MI_CH_F,
MI_CH_Fs,
MI_CH_Gb = MI_CH_Fs,
MI_CH_G,
MI_CH_Gs,
MI_CH_Ab = MI_CH_Gs,
MI_CH_A,
MI_CH_As,
MI_CH_Bb = MI_CH_As,
MI_CH_B,
// MIDI Chord Keycodes Minor
MI_CH_Cm,
MI_CH_Csm,
MI_CH_Dbm = MI_CH_Csm,
MI_CH_Dm,
MI_CH_Dsm,
MI_CH_Ebm = MI_CH_Dsm,
MI_CH_Em,
MI_CH_Fm,
MI_CH_Fsm,
MI_CH_Gbm = MI_CH_Fsm,
MI_CH_Gm,
MI_CH_Gsm,
MI_CH_Abm = MI_CH_Gsm,
MI_CH_Am,
MI_CH_Asm,
MI_CH_Bbm = MI_CH_Asm,
MI_CH_Bm,
//MIDI Chord Keycodes Dominant Seventh
MI_CH_CDom7,
MI_CH_CsDom7,
MI_CH_DbDom7 = MI_CH_CsDom7,
MI_CH_DDom7,
MI_CH_DsDom7,
MI_CH_EbDom7 = MI_CH_DsDom7,
MI_CH_EDom7,
MI_CH_FDom7,
MI_CH_FsDom7,
MI_CH_GbDom7 = MI_CH_FsDom7,
MI_CH_GDom7,
MI_CH_GsDom7,
MI_CH_AbDom7 = MI_CH_GsDom7,
MI_CH_ADom7,
MI_CH_AsDom7,
MI_CH_BbDom7 = MI_CH_AsDom7,
MI_CH_BDom7,
// MIDI Chord Keycodes Diminished Seventh
MI_CH_CDim7,
MI_CH_CsDim7,
MI_CH_DbDim7 = MI_CH_CsDim7,
MI_CH_DDim7,
MI_CH_DsDim7,
MI_CH_EbDim7 = MI_CH_DsDim7,
MI_CH_EDim7,
MI_CH_FDim7,
MI_CH_FsDim7,
MI_CH_GbDim7 = MI_CH_FsDim7,
MI_CH_GDim7,
MI_CH_GsDim7,
MI_CH_AbDim7 = MI_CH_GsDim7,
MI_CH_ADim7,
MI_CH_AsDim7,
MI_CH_BbDim7 = MI_CH_AsDim7,
MI_CH_BDim7,
MY_CHORD_MAX = MI_CH_BDim7,
VERSION = USER00
};
#define MY_CHORD_COUNT (MY_CHORD_MAX - MY_CHORD_MIN + 1)
static uint8_t chord_status[MY_CHORD_COUNT];
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* C-system Base */
[_C_SYSTEM_BASE] = LAYOUT_giabarinaix2(
MI_CH_Dbr, MI_CH_Abr, MI_CH_Ebr, MI_CH_Bbr, MI_CH_Fr, MI_CH_Cr, MI_CH_Gr, MI_CH_Dr, MI_CH_Ar, MI_CH_Er, MI_CH_Br, MI_CH_Fsr,
MI_CH_Db, MI_CH_Ab, MI_CH_Eb, MI_CH_Bb, MI_CH_F, MI_CH_C, MI_CH_G, MI_CH_D, MI_CH_A, MI_CH_E, MI_CH_B, MI_CH_Fs,
MI_CH_Dbm, MI_CH_Abm, MI_CH_Ebm, MI_CH_Bbm, MI_CH_Fm, MI_CH_Cm, MI_CH_Gm, MI_CH_Dm, MI_CH_Am, MI_CH_Em, MI_CH_Bm, MI_CH_Fsm,
MI_CH_DbDom7, MI_CH_AbDom7, MI_CH_EbDom7, MI_CH_BbDom7, MI_CH_FDom7, MI_CH_CDom7, MI_CH_GDom7, MI_CH_DDom7, MI_CH_ADom7, MI_CH_EDom7, MI_CH_BDom7, MI_CH_FsDom7,
MI_CH_DbDim7, MI_CH_AbDim7, MI_CH_EbDim7, MI_CH_BbDim7, MI_CH_FDim7, MI_CH_CDim7, MI_CH_GDim7, MI_CH_DDim7, MI_CH_ADim7, MI_CH_EDim7, MI_CH_BDim7, MI_CH_FsDim7,
MI_Db_2, MI_E_2, MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4,
MI_Eb_2, MI_Fs_2, MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5,
MI_F_2, MI_Ab_2, MI_B_2, MI_D_3, MI_F_3, MI_Ab_3, MI_B_3, MI_D_4, MI_F_4, MI_Ab_4, MI_B_4, MI_D_5,
MI_G_2, MI_Bb_2, MI_Db_3, MI_E_3, MI_G_3, MI_Bb_3, MI_Db_4, MI_E_4, MI_G_4, MI_Bb_4, MI_Db_5, MI_E_5,
MI_A_2, MI_C_3, MI_Eb_3, MI_Fs_3, MI_A_3, MI_C_4, MI_Eb_4, MI_Fs_4, MI_A_4, MI_C_5, MI_Eb_5, FN_MUTE
),
/* QWERTY */
[_QWERTY] = LAYOUT_wrapper_giabarinaix2(
KC_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
KC_TAB, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL,
KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT,
KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_LANG2, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_LANG1, KC_RALT, KC_RGUI, KC_RCTRL,
KC_GESC, _________________NUMBER_L__________________, _________________NUMBER_R__________________, KC_BSPC,
KC_TAB, _________________QWERTY_L1_________________, _________________QWERTY_R1_________________, KC_DEL,
KC_CAPS, _________________QWERTY_L2_________________, _________________QWERTY_R2_________________, KC_ENT,
KC_LSFT, _________________QWERTY_L3_________________, _________________QWERTY_R3_________________, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_LANG2, KC_SPC, KC_SPC, KC_SPC, KC_SPC, KC_LANG1, KC_RALT, KC_RGUI, _______
),
/* Fn */
[_FN] = LAYOUT_giabarinaix2(
DFCBASE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
DF_QWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
DFCBASE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
DF_QWER, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, VERSION, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, _______
)
};
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[_C_SYSTEM_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_QWERTY] = { ENCODER_CCW_CW(_______, _______) },
[_FN] = { ENCODER_CCW_CW(_______, _______) },
};
#endif
void keyboard_post_init_user(void) {
// Set otave to MI_OCT_0
midi_config.octave = MI_OCT_0 - MIDI_OCTAVE_MIN;
// avoid using 127 since it is used as a special number in some sound sources.
midi_config.velocity = MIDI_INITIAL_VELOCITY;
for (uint8_t i = 0; i < MY_CHORD_COUNT; i++) {
chord_status[i] = MIDI_INVALID_NOTE;
}
default_layer_set(1UL << _C_SYSTEM_BASE);
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
uint16_t root_note = MIDI_INVALID_NOTE; // Starting value for the root note of each chord
uint8_t chord = keycode - MY_CHORD_MIN;
switch (keycode) {
case VERSION: // Output firmware info.
if (record->event.pressed) {
SEND_STRING(QMK_KEYBOARD ":" QMK_KEYMAP " @ " QMK_VERSION " | " QMK_BUILDDATE);
}
break;
// MIDI Chord Keycodes, on the left side.
case MI_CH_Cr ... MI_CH_Br: // Root Notes
root_note = keycode - MI_CH_Cr + MI_C_1;
my_process_midi4Bass(midi_bass_ch, record, chord_status, chord, root_note, false);
break;
case MI_CH_C ... MI_CH_B: // Major Chords
root_note = keycode - MI_CH_C + MI_C_2;
// Root, Major Third, and Fifth Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 4, 7);
break;
case MI_CH_Cm ... MI_CH_Bm: // Minor Chord
root_note = keycode - MI_CH_Cm + MI_C_2;
// Root, Minor Third, and Fifth Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 7);
break;
case MI_CH_CDom7 ... MI_CH_BDom7: // Dominant 7th Chord
root_note = keycode - MI_CH_CDom7 + MI_C_2;
// Major Third, Major Fifth, and Minor Seventh Notes
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 4, 7, 10);
break;
case MI_CH_CDim7 ... MI_CH_BDim7: // Diminished 7th Chord
root_note = keycode - MI_CH_CDim7 + MI_C_2;
// Root, Minor Third, and Diminished 5th Note
my_process_midi4TriadChords(midi_chord_ch, record, chord_status, chord, root_note, 0, 3, 6);
break;
}
return true;
}

View File

@@ -0,0 +1 @@
# The default keymap for giabarinaix2, VIA version.

View File

@@ -0,0 +1,4 @@
VIA_ENABLE = yes
ENCODER_ENABLE = no # encoder on mute button
ENCODER_MAP_ENABLE = yes # replacing ENCODERS_CW_KEY method to this on 2022/08/31.