TTTキーボード研究室


Leia配列 日本語拡張 QMK Firmwareソースコード(ID75キーボード)

●説明

ID75キーボード用のソースコードです。QMK Firmware 0.15.10を使用しています。新しいバージョンではキーコードの修正が必要です。

ID75キーボードは15×5の格子配列です。

ファイル「rules.mk」には「COMBO_ENABLE=yes」という行を追加してください。

Mac OS(iOS、iPad OS)、Windows(JIS配列)、Androidに対応しています。それぞれレイヤーを用意してあります。

(2022年10月)

/* Copyright 2018 MechMerlin
 *
 * 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 .
 */
#include QMK_KEYBOARD_H

// ID75 keyboard
// Leia3 日本語拡張3.0 2022/4/8
// 
// 3.70 2022/09/03  アルゴリズム改善、コード共通化

// Defines the keycodes used by our macros in process_record_user

enum layer_number {
  BASE_WIN = 0,
  BASE_AOS, //android
  SYMBOL_1_WIN,
  SYMBOL_2_WIN,
  BASE_MAC,
  SYMBOL_1_MAC,
  SYMBOL_2_MAC,
  ADJUST,
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
 [BASE_MAC] = LAYOUT_ortho_5x15(
	KC_F1,	KC_F2,	KC_F3,	KC_F4,	KC_F8,	LT(ADJUST,KC_ESC),	KC_7,	KC_8,	KC_9,	KC_LBRC,	KC_UNDS,	KC_PSLS,	(LALT(LGUI(LSFT(KC_V)))),	LGUI(KC_Z),	LGUI(KC_W),
	KC_Q,	  KC_Y,	  KC_O,	  KC_U,	  KC_C,	  KC_NO,	      KC_4,	KC_5,	KC_6,	KC_NO,  	KC_B, 	KC_N, 	KC_K, 	KC_M,	  KC_F,
	KC_L, 	KC_E, 	KC_I,		KC_A,	  KC_X,	  KC_LSFT,    	KC_1,	KC_2,	KC_3,	KC_LGUI,	KC_G,	  KC_T,	  KC_S,	  KC_R, 	KC_P,
	KC_J, KC_COMM,KC_DOT,	KC_W,	KC_V,	KC_NO,LT(SYMBOL_1_MAC,KC_PDOT),LT(SYMBOL_2_MAC,KC_0),	KC_PPLS,	KC_NO,	KC_D,	KC_H,	KC_Z,	KC_MINS,	KC_UP,
	LGUI(KC_X),	LGUI(KC_C),	LGUI(KC_V),	KC_TAB,	KC_NO,	KC_BSPC,	LALT_T(KC_LANG2),	LCTL_T(KC_LANG1),	KC_PMNS,	KC_ENT,	KC_NO,	KC_SPC,	KC_LEFT,	KC_DOWN,	KC_RGHT
  ),
 [SYMBOL_1_MAC] = LAYOUT_ortho_5x15(
  KC_NO,		KC_NO,			KC_NO,		KC_NO,		KC_F8,		KC_NO,	KC_PPLS,		KC_PAST,		KC_PEQL,		KC_NO,	KC_NO,		KC_NO,		KC_NO,		KC_NO,			KC_NO,
  KC_NO,		KC_NO,			KC_NO,		KC_NO,		KC_NO,		KC_NO,	KC_PERC,		KC_EXLM,		KC_AMPR,		KC_NO,	KC_NO,		KC_NO,		KC_NO,		KC_NO,			KC_NO,
  KC_NO,		KC_NO,			KC_NO,		KC_NO,		KC_NO,		KC_NO,	KC_COLN,		KC_LPRN,		KC_RPRN,		KC_NO,	KC_NO,		KC_NO,		KC_NO,		KC_NO,			KC_NO,
  KC_NO,		KC_NO,			KC_NO,		KC_NO,		KC_NO,		KC_NO,	KC_NO,	  	KC_NO,    	KC_NO,  		KC_NO,	KC_NO,		KC_NO,		KC_NO,		KC_NO,			KC_NO,
  KC_NO,		KC_NO,			KC_NO,		KC_NO,		KC_NO,		KC_NO,	KC_NO,  		KC_NO,	  	KC_NO,  		KC_NO,	KC_NO,		KC_NO,		KC_NO,		KC_NO,			KC_NO
  ),
 [SYMBOL_2_MAC] = LAYOUT_ortho_5x15(
  KC_NO,		KC_NO,			KC_NO,		KC_NO,		KC_NO,		KC_NO,	KC_PMNS,		KC_PSLS,		KC_AT,		KC_NO,	KC_NO,		KC_NO,		KC_NO,		KC_NO,		KC_NO,
  KC_NO,		KC_NO,			KC_NO,		KC_NO,		KC_NO,		KC_NO,	KC_DLR,	  	KC_QUES,		KC_HASH,	KC_NO,	KC_NO,		KC_NO,		KC_NO,		KC_NO,		KC_NO,
  KC_NO,		KC_NO,			KC_NO,		KC_NO,		KC_NO,		KC_NO,	KC_SCLN,		KC_LBRC,		KC_RBRC,	KC_NO,	KC_NO,		KC_NO,		KC_NO,		KC_NO,		KC_NO,
  KC_NO,		KC_NO,			KC_NO,		KC_NO,		KC_NO,		KC_NO,	KC_NO,	  	KC_NO,	  	KC_NO,		KC_NO,	KC_NO,		KC_NO,		KC_NO,		KC_NO,		KC_NO,
  KC_NO,		KC_NO,			KC_NO,		KC_NO,		KC_NO,		KC_NO,	KC_NO,	  	KC_NO,	  	KC_NO,		KC_NO,	KC_NO,		KC_NO,		KC_NO,		KC_NO,		KC_NO
  ),
 [BASE_WIN] = LAYOUT_ortho_5x15(
  LCA(KC_1),LCA(KC_2),	LCA(KC_3),KC_F10,	KC_F12,	LT(ADJUST,KC_ESC),	  KC_P7,	    KC_P8,			KC_P9,		KC_RBRC,	LSFT(KC_RO),KC_SLSH,KC_DEL,	LCTL(KC_Z),	LCTL(KC_W), 
  KC_Q,	  	KC_Y,			  KC_O,	  	KC_U,	  KC_C,	  KC_NO,		  	  KC_P4,    	KC_P5,			KC_P6,	  KC_NO,	  KC_B,	    	KC_N,		KC_K,		KC_M,		    KC_F, 
  KC_L,		  KC_E,			  KC_I,		  KC_A,	  KC_X,	  KC_LSFT,		  	KC_P1,    	KC_P2,			KC_P3,	 	KC_LCTL,	KC_G,		    KC_T,		KC_S,		KC_R,   		KC_P, 
  KC_J,	KC_COMM,KC_DOT,	KC_W,	KC_V,	KC_NO,LT(SYMBOL_1_WIN,KC_PDOT),LT(SYMBOL_2_WIN,KC_P0),	KC_PPLS,	KC_NO,	  KC_D,	  	  KC_H,	  KC_Z,		KC_MINS,		KC_UP, 
  LCTL(KC_X),	LCTL(KC_C),	LCTL(KC_V),	KC_TAB,	KC_NO,	KC_BSPC,	LALT_T(KC_CAPS),	LGUI_T(KC_GRV),	KC_PMNS,	KC_ENT,	  KC_NO,	    KC_SPC, KC_LEFT,KC_DOWN,  	KC_RGHT
  ),
 [BASE_AOS] = LAYOUT_ortho_5x15(
  LCA(KC_1),LCA(KC_2),	LCA(KC_3),KC_F10,	KC_F12,	LT(ADJUST,KC_ESC),	  KC_P7,	    KC_P8,			KC_P9,		KC_RBRC,	LSFT(KC_RO),KC_SLSH,KC_DEL,	LCTL(KC_Z),	LCTL(KC_W), 
  KC_Q,	  	KC_Y,			  KC_O,	  	KC_U,	  KC_C,	  KC_NO,		  	  KC_P4,    	KC_P5,			KC_P6,	  KC_NO,	  KC_B,	    	KC_N,		KC_K,		KC_M,		    KC_F, 
  KC_L,		  KC_E,			  KC_I,		  KC_A,	  KC_X,	  KC_LSFT,		  	KC_P1,    	KC_P2,			KC_P3,	 	KC_LCTL,	KC_G,		    KC_T,		KC_S,		KC_R,   		KC_P, 
  KC_J,	KC_COMM,KC_DOT,	KC_W,	KC_V,	KC_NO,LT(SYMBOL_1_MAC,KC_PDOT),LT(SYMBOL_2_MAC,KC_P0),	KC_PPLS,	KC_NO,	  KC_D,	  	  KC_H,	  KC_Z,		KC_MINS,		KC_UP, 
  LCTL(KC_X),	LCTL(KC_C),	LCTL(KC_V),	KC_TAB,	KC_NO,	KC_BSPC,	LALT_T(KC_HOME),	LGUI_T(KC_END),	KC_PMNS,	KC_ENT,	  KC_NO,	    KC_SPC, KC_LEFT,KC_DOWN,  	KC_RGHT
  ),
 [SYMBOL_1_WIN] = LAYOUT_ortho_5x15(
  KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_PPLS,	KC_PAST,	KC_UNDS,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,
  KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_PERC,	KC_EXLM,	KC_CIRC,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,
  KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_QUOT,	KC_ASTR,	KC_LPRN,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,
  KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,
  KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO
  ),
 [SYMBOL_2_WIN] = LAYOUT_ortho_5x15(
  KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_PMNS,	KC_PSLS,	KC_LBRC,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,
  KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_DLR,	KC_QUES,	KC_HASH,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,
  KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_SCLN,	KC_RBRC,	KC_NUHS,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,
  KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,
  KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO
  ),
 [ADJUST] = LAYOUT_ortho_5x15(
  TO(BASE_MAC),	TO(BASE_WIN),	TO(BASE_AOS),	KC_NO,	RESET,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,
  KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	RGB_TOG,	RGB_HUI,	RGB_SAI,	RGB_VAI,	RGB_SPI,
  KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	RGB_HUD,	RGB_SAD,	RGB_VAD,	RGB_SPD,
  KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	RGB_M_SN,	RGB_M_P,	RGB_M_B,	RGB_M_R,	RGB_M_SW,
  KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	RESET,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	KC_NO,	RGB_M_K,	RGB_M_X,	RGB_M_G
  ),

};

// コンボ
//  定数の定義

enum combo_events {
  C_ANN, // 撥音
  C_INN,
  C_UNN,
  C_ENN,
  C_ONN,
  C_YOU, // 二重母音
  C_AI,
  C_OU,
  C_EI,
  C_YUU,
  C_UU,
  C_OI,
  C_UI,
  C_YA,  // やゆよ
  C_YU,
  C_YE,
  C_YO,
  C_NI,  //  助詞
  C_GA,
  C_DE,
  C_DA,
  C_NO,
  C_TO,
  C_HA,
  C_MO,
  C_KO,
  C_WO,
  C_XTU, //  「っ」
  C_NN,  //  「ん」
  COMBO_LENGTH
};

uint16_t COMBO_LEN = COMBO_LENGTH; // remove the COMBO_COUNT define and use this instead!

//  入力キーの組み合わせの定義

const uint16_t PROGMEM ann_combo[] = {KC_A, KC_V , COMBO_END};
const uint16_t PROGMEM inn_combo[] = {KC_I, KC_W , COMBO_END};
const uint16_t PROGMEM unn_combo[] = {KC_U, KC_X , COMBO_END};
const uint16_t PROGMEM enn_combo[] = {KC_E, KC_W , COMBO_END};
const uint16_t PROGMEM onn_combo[] = {KC_O, KC_A , COMBO_END};

const uint16_t PROGMEM you_combo[] = {KC_Y, KC_O , COMBO_END};
const uint16_t PROGMEM ai_combo[] = {KC_A, KC_I , COMBO_END};
const uint16_t PROGMEM ou_combo[] = {KC_O, KC_U , COMBO_END};
const uint16_t PROGMEM ei_combo[] = {KC_E, KC_I , COMBO_END};
const uint16_t PROGMEM yuu_combo[] = {KC_Y, KC_U , COMBO_END};
const uint16_t PROGMEM uu_combo[] = {KC_A, KC_X , COMBO_END};
const uint16_t PROGMEM oi_combo[] = {KC_O, KC_I , COMBO_END};
const uint16_t PROGMEM ui_combo[] = {KC_U, KC_A , COMBO_END};

const uint16_t PROGMEM ya_combo[] = {KC_W, KC_DOT , COMBO_END};
const uint16_t PROGMEM yu_combo[] = {KC_COMMA, KC_W , COMBO_END};
const uint16_t PROGMEM ye_combo[] = {KC_Y, KC_A , COMBO_END};
const uint16_t PROGMEM yo_combo[] = {KC_DOT, KC_COMMA , COMBO_END};

const uint16_t PROGMEM ni_combo[] = {KC_N, KC_G , COMBO_END};
const uint16_t PROGMEM ga_combo[] = {KC_G, KC_T , COMBO_END};
const uint16_t PROGMEM de_combo[] = {KC_D, KC_H , COMBO_END};
const uint16_t PROGMEM da_combo[] = {KC_D, KC_T , COMBO_END};
const uint16_t PROGMEM no_combo[] = {KC_N, KC_K , COMBO_END};
const uint16_t PROGMEM to_combo[] = {KC_T, KC_S , COMBO_END};
const uint16_t PROGMEM ha_combo[] = {KC_H, KC_Z , COMBO_END};
const uint16_t PROGMEM mo_combo[] = {KC_N, KC_M , COMBO_END};
const uint16_t PROGMEM ko_combo[] = {KC_K, KC_T , COMBO_END};
const uint16_t PROGMEM wo_combo[] = {KC_W, KC_V , COMBO_END};

const uint16_t PROGMEM xtu_combo[] = {KC_S, KC_R , COMBO_END};
const uint16_t PROGMEM nn_combo[] = {KC_K, KC_M , COMBO_END};
  
combo_t key_combos[] = {
  [C_ANN] = COMBO_ACTION(ann_combo),
  [C_INN] = COMBO_ACTION(inn_combo),
  [C_UNN] = COMBO_ACTION(unn_combo),
  [C_ENN] = COMBO_ACTION(enn_combo),
  [C_ONN] = COMBO_ACTION(onn_combo),

  [C_YOU] = COMBO_ACTION(you_combo),
  [C_AI] = COMBO_ACTION(ai_combo),
  [C_OU] = COMBO_ACTION(ou_combo),
  [C_EI] = COMBO_ACTION(ei_combo),
  [C_YUU] = COMBO_ACTION(yuu_combo),
  [C_UU] = COMBO_ACTION(uu_combo),
  [C_OI] = COMBO_ACTION(oi_combo),
  [C_UI] = COMBO_ACTION(ui_combo),

  [C_YA] = COMBO_ACTION(ya_combo),
  [C_YU] = COMBO_ACTION(yu_combo),
  [C_YE] = COMBO_ACTION(ye_combo),
  [C_YO] = COMBO_ACTION(yo_combo),
  
  [C_NI] = COMBO_ACTION(ni_combo),
  [C_GA] = COMBO_ACTION(ga_combo),
  [C_DE] = COMBO_ACTION(de_combo),
  [C_DA] = COMBO_ACTION(da_combo),
  [C_NO] = COMBO_ACTION(no_combo),
  [C_TO] = COMBO_ACTION(to_combo),
  [C_HA] = COMBO_ACTION(ha_combo),
  [C_MO] = COMBO_ACTION(mo_combo),
  [C_KO] = COMBO_ACTION(ko_combo),
  [C_WO] = COMBO_ACTION(wo_combo),

  [C_XTU] = COMBO_ACTION(xtu_combo),
  [C_NN] = COMBO_ACTION(nn_combo),

};
/* COMBO_ACTION(x) is same as COMBO(x, KC_NO) */

//  2打鍵入力の変数

static uint16_t jp_on;
static uint16_t first_on;

//  分岐と文字列出力

//  コンボの処理
void process_combo_event(uint16_t combo_index, bool pressed) {
  first_on=0;
  switch(combo_index) {
    case C_ANN:
      if (pressed) {
        SEND_STRING("ann");
      }
      break;
    case C_INN:
      if (pressed) {
        SEND_STRING("inn");
      }
      break;
    case C_UNN:
      if (pressed) {
        SEND_STRING("unn");
      }
      break;
    case C_ENN:
      if (pressed) {
        SEND_STRING("enn");
      }
      break;
    case C_ONN:
      if (pressed) {
        SEND_STRING("onn");
      }
      break;

    case C_YOU:
      if (pressed) {
        SEND_STRING("you");
      }
      break;
    case C_AI:
      if (pressed) {
        SEND_STRING("ai");
      }
      break;
    case C_OU:
      if (pressed) {
        SEND_STRING("ou");
      }
      break;
    case C_EI:
      if (pressed) {
        SEND_STRING("ei");
      }
      break;
    case C_YUU:
      if (pressed) {
        SEND_STRING("yuu");
      }
      break;
    case C_UU:
      if (pressed) {
        SEND_STRING("uu");
      }
      break;
    case C_OI:
      if (pressed) {
        SEND_STRING("oi");
      }
      break;
    case C_UI:
      if (pressed) {
        SEND_STRING("ui");
      }
      break;

    case C_YA:
      if (pressed) {
        SEND_STRING("ya");
      }
      break;
    case C_YU:
      if (pressed) {
        SEND_STRING("yu");
      }
      break;
    case C_YE:
      if (pressed) {
        SEND_STRING("ye");
      }
      break;
    case C_YO:
      if (pressed) {
        SEND_STRING("yo");
      }
      break;

    case C_NI:
      if (pressed) {
        SEND_STRING("ni");
      }
      break;
    case C_GA:
      if (pressed) {
        SEND_STRING("ga");
      }
      break;
    case C_DE:
      if (pressed) {
        SEND_STRING("de");
      }
      break;
    case C_DA:
      if (pressed) {
        SEND_STRING("da");
      }
      break;
    case C_NO:
      if (pressed) {
        SEND_STRING("no");
      }
      break;
    case C_TO:
      if (pressed) {
        SEND_STRING("to");
      }
      break;
    case C_HA:
      if (pressed) {
        SEND_STRING("ha");
      }
      break;
    case C_MO:
      if (pressed) {
        SEND_STRING("mo");
      }
      break;
    case C_KO:
      if (pressed) {
        SEND_STRING("ko");
      }
      break;
    case C_WO:
      if (pressed) {
        SEND_STRING("wo");
      }
      break;

    case C_XTU:
      if (pressed) {
        SEND_STRING("xtu");
      }
      break;
    case C_NN:
        if (pressed) {
        SEND_STRING("nn");
      }
      break;
  }
}


bool process_record_user(uint16_t keycode, keyrecord_t *record) {

  //かな・英数の切り替え いろいろなcaseを用意しているが、不要ならコメントアウトして良い
   switch (keycode) {
     case KC_LANG2:  //Mac、Windows英数モードKC_LANG2
     case LALT_T(KC_LANG2):  //Mac英数モード optionキーと兼用
     case LSFT_T(KC_LANG2):  //Mac英数モード shiftキーと兼用
      if(record->tap.count  && record->event.pressed) {// タップの処理
        tap_code16(KC_LANG2);//key down
        jp_on=0;
        first_on=0;
        return false;
       } else {
        return true;
       }
       break;
     case KC_CAPS:  //Win英数モード
     case KC_MHEN:  //Win英数モード
     case LALT_T(KC_CAPS):  //Win英数モード altキーと兼用
      if(record->tap.count  && record->event.pressed) {// タップの処理
        tap_code16(KC_LANG2);//key down
        //tap_code16(KC_CAPS);//古いWindowsの場合
        jp_on=0;
        first_on=0;
        return false;
       } else {
        return true;
       }
       break;
     case LALT_T(KC_HOME):  //Android英数モード 意味のないキーを割り当てている
      if(record->tap.count  && record->event.pressed) {// タップの処理
        //key downは無視
        jp_on=0;
        first_on=0;
        return false;
       } else {
        return true;
       }
       break;
    case KC_LANG1: //Mac、WindowsかなモードKC_LANG1
    case LCTL_T(KC_LANG1): //Macかなモード ctrlキーと兼用
    case LGUI_T(KC_LANG1): //Macかなモード commandキーと兼用
      if(record->tap.count  && record->event.pressed) {// タップの処理
        tap_code16(KC_LANG1);//key down
        jp_on=1;
        first_on=0;
          return false;
        } else {
          return true;
        }
        break;
    case KC_GRV:  //Winかなモード
    case KC_HENK:  //Winかなモード
    case LGUI_T(KC_GRV):  //Winかなモード guiキーと兼用
      if(record->tap.count  && record->event.pressed) {// タップの処理
        tap_code16(KC_LANG1);//key down
        //tap_code16(KC_GRV);//古いWindowsの場合
        //tap_code16(KC_HENK);//別の定義
        jp_on=1;
        first_on=0;
        return false;
      } else {
        return true;
      }
      break;
    case LGUI_T(KC_END):  //Androidかなモード 意味のないキーを割り当てている
      if(record->tap.count  && record->event.pressed) {// タップの処理
        //key downは無視
        jp_on=1;
        first_on=0;
        return false;
      } else {
        return true;
      }
      break;
    //default:
   }

 
  //  かなモードの時、2打鍵処理
  if (jp_on==1) {
          if (first_on==0) {  //1打目の処理
              switch (keycode) {
              case KC_D: 
              case KC_G: 
              case KC_H: 
              case KC_K: 
              case KC_M: 
              case KC_N: 
              case KC_R: 
              case KC_S: 
              case KC_T: 
              case KC_W: 
              case KC_Y: 
              case KC_Z: 
                if (record->event.pressed) {
                  register_code(keycode);  //key downn
                } else {
                  unregister_code(keycode); //key up ここでフラグをセット
                  first_on=keycode; //1打目のキーコードを記録
                }
                return false; //false
                break;
          }
        } else {  //2打目の処理
           if (first_on==KC_D) {
            switch (keycode) {
              case KC_S: //
                if (record->event.pressed) {
                 SEND_STRING("esu");  //key downで残りの文字列を出力
                } else {
                 first_on=0; //key upの時にフラグをリセット
                }
                break;
              case KC_T: //
                if (record->event.pressed) {
                  SEND_STRING("esita");
                } else {
                 first_on=0;
                }
                break;
              case KC_H: //
                if (record->event.pressed) {
                  SEND_STRING("eha");
                } else {
                 first_on=0;
                }
                break;
              default:
                 first_on=0;
                return true;//指定された組み合わせ以外はそのまま返す
            }
             return false;
          }
           if (first_on==KC_G) {
            switch (keycode) {
              case KC_T: //
                if (record->event.pressed) {
                 SEND_STRING("atu");
                } else {
                 first_on=0;
                 }
                break;
              case KC_W: //
                if (record->event.pressed) {
                  SEND_STRING("awa");
                } else {
                 first_on=0;
                }
                break;
              default:
                 first_on=0;
                return true;
            }
             return false;
          }
           if (first_on==KC_H) {
            switch (keycode) {
              case KC_D: //
                if (record->event.pressed) {
                  SEND_STRING("odo");
                } else {
                 first_on=0;
                }
                break;
              case KC_K: //
                if (record->event.pressed) {
                  SEND_STRING("oka");
                } else {
                 first_on=0;
                }
                break;
              case KC_N: //
                if (record->event.pressed) {
                  SEND_STRING("unn");
                } else {
                 first_on=0;
                }
                break;
              case KC_S: //
                if (record->event.pressed) {
                  SEND_STRING("asi");
                } else {
                 first_on=0;
                }
                break;
              default:
                 first_on=0;
                return true;
                }
              return false;
            }
           if (first_on==KC_K) {
            switch (keycode) {
              case KC_N: //
                if (record->event.pressed) {
                  SEND_STRING("ono");
                } else {
                 first_on=0;
                }
                break;
              case KC_R: //
                if (record->event.pressed) {
                  SEND_STRING("ara");
                } else {
                 first_on=0;
                }
                break;
              case KC_S: //
                if (record->event.pressed) {
                  SEND_STRING("udasai");
                } else {
                 first_on=0;
                }
                break;
              case KC_T: //
                if (record->event.pressed) {
                  SEND_STRING("oto");
                } else {
                 first_on=0;
                }
                break;
              case KC_W: //
                if (record->event.pressed) {
                  SEND_STRING("awa");
                } else {
                 first_on=0;
                }
                break;
              default:
                 first_on=0;
                return true;
                }
              return false;
           }
           if (first_on==KC_M) {
            switch (keycode) {
              case KC_D: //
                if (record->event.pressed) {
                  SEND_STRING("ade");
                } else {
                 first_on=0;
                }
                break;
              case KC_M: //
                if (record->event.pressed) {
                  SEND_STRING("inami");
                } else {
                 first_on=0;
                }
                break;
              case KC_N: //
                if (record->event.pressed) {
                  SEND_STRING("ono");
                } else {
                 first_on=0;
                }
                break;
              case KC_S: //
                if (record->event.pressed) {
                  SEND_STRING("asu");
                } else {
                 first_on=0;
                }
                break;
              case KC_T: //
                if (record->event.pressed) {
                  SEND_STRING("asita");
                } else {
                 first_on=0;
                }
                break;
              default:
                 first_on=0;
                return true;
                }
              return false;
           }
           if (first_on==KC_N) {
            switch (keycode) {
             case KC_D: //
                if (record->event.pressed) {
                  SEND_STRING("ado");
                } else {
                 first_on=0;
                }
                break;
             case KC_H: //
                if (record->event.pressed) {
                  SEND_STRING("iha");
                } else {
                 first_on=0;
                }
                break;
              case KC_K: //
                if (record->event.pressed) {
                  SEND_STRING("aka");
                } else {
                 first_on=0;
                }
                break;
              case KC_R: //
                if (record->event.pressed) {
                  SEND_STRING("aru");
                } else {
                 first_on=0;
                }
                break;
              case KC_T: //
                if (record->event.pressed) {
                  SEND_STRING("iti");
                } else {
                 first_on=0;
                }
                break;
              default:
                 first_on=0;
                return true;
                }
              return false;
           }

           if (first_on==KC_S) {
            switch (keycode) {
             case KC_G: //
                if (record->event.pressed) {
                  SEND_STRING("iki");
                } else {
                 first_on=0;
                }
                break;
             case KC_K: //
                if (record->event.pressed) {
                  SEND_STRING("oko");
                } else {
                 first_on=0;
                }
                break;
              case KC_M: //
                if (record->event.pressed) {
                  SEND_STRING("ama");
                } else {
                 first_on=0;
                }
                break;
              case KC_N: //
                if (record->event.pressed) {
                  SEND_STRING("ono");
                } else {
                 first_on=0;
                }
                break;
              case KC_R: //
                if (record->event.pressed) {
                  SEND_STRING("uru");
                } else {
                 first_on=0;
                }
                break;
              case KC_S: //
                if (record->event.pressed) {
                  SEND_STRING("imasu");
                } else {
                 first_on=0;
                }
                break;
              case KC_T: //
                if (record->event.pressed) {
                  SEND_STRING("ita");
                } else {
                 first_on=0;
                }
                break;
              case KC_Z: //
                if (record->event.pressed) {
                  SEND_STRING("imasita");
                } else {
                 first_on=0;
                }
                break;
             case KC_MINUS: //
                if (record->event.pressed) {
                  SEND_STRING("yunn");
                } else {
                 first_on=0;
                }
                break;
              default:
                 first_on=0;
                return true;
                }
              return false;
           }

           if (first_on==KC_T) {
            switch (keycode) {
             case KC_G: //
                if (record->event.pressed) {
                  SEND_STRING("ugi");
                } else {
                 first_on=0;
                }
                break;
              case KC_H: //
                if (record->event.pressed) {
                  SEND_STRING("oha");
                } else {
                 first_on=0;
                }
                break;
              case KC_K: //
                if (record->event.pressed) {
                  SEND_STRING("eki");
                } else {
                 first_on=0;
                }
                break;
              case KC_M: //
                if (record->event.pressed) {
                  SEND_STRING("ame");
                } else {
                 first_on=0;
                }
                break;
              default:
                 first_on=0;
                return true;
                }
              return false;
           }

//          if (first_on==KC_W) {
//            switch (keycode) {
//             case KC_K: //
//                if (record->event.pressed) {
//                  SEND_STRING("ake");
//                } else {
//                 first_on=0;
//                }
//                break;
//              default:
//                 first_on=0;
//                return true;
//                }
//              return false;
//           }

           if (first_on==KC_Y) {
            switch (keycode) {
             case KC_K: //
                if (record->event.pressed) {
                  SEND_STRING("oku");
                } else {
                 first_on=0;
                }
                break;
              case KC_R: //
                if (record->event.pressed) {
                  SEND_STRING("ori");
                } else {
                 first_on=0;
                }
                break;
              default:
                 first_on=0;
                return true;
                }
              return false;
           }
           if (first_on==KC_Z) {
            switch (keycode) {
             case KC_MINUS: //
                if (record->event.pressed) {
                  SEND_STRING("yunn");
                } else {
                 first_on=0;
                }
                break;
              default:
                 first_on=0;
                return true;
                }
              return false;
           }
        }
        first_on=0;//どれにも当てはまらなければ強制的に1文字目に戻す
        return true;
      } else {//英数モードの時は何もしない
        if (record->event.pressed) {
        } else {
         // when keycode is released
       }
  }

  return true;
}


[TTTキーボード研究室 TOP] [東京タヌキ探検隊! TOP]