/* Copyright 2019 niltea
*
* 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 .
*/
///////////////////////////////////
// PAE ver 3.00 by OOOKA Toshihiko
///////////////////////////////////
// Adobe PremiereとAfter Effectsをどちらも似た操作感で使う為の左手マクロパッド配列
// Win/Mac, Premiere/After Effectsを都度切り替えて使います
// ver 3の新しい考え方は、小指を不使用にしたこと。中段真ん中の2キーを中指人差し指ホームポジションとして、
// 親指のメインを角ではなく、ひとつ左のキーにしたこと。このことで使用感がガラリと変わった。
#include QMK_KEYBOARD_H
#ifdef OLED_DRIVER_ENABLE
#include
#include "lib/oled_helper.h"
#endif
// Windows/Mac デフォでは電源オンで、Win/Premiere
// これを変えたければ以下のフラグと、このあとのenum layerIDでの構造変更をすること
// Win or Mac
static bool Win_or_Mac = true;
//Premiere or AfterEffects
static bool P_or_AE = true;
// LAYER
//Premiereに3レイヤー、AEに3レイヤー、それぞれWinMacで計12レイヤー。あとテンキーとスペシャル(切り替え用)レイヤー
enum layerID {
// Win
_0_Win_P = 0, // default layer
_1_Win_P,
_2_Win_P,
// 3レイヤーごとにペアになっているので、デフォにしたいものを3レイヤーごとここにもってくるとデフォを変えられるよ
// 最後の切り替えマクロ321行以降でベースレイヤーをどれにしたかで処理を変えること
_0_Win_AE,
_1_Win_AE,
_2_Win_AE,
// Mac
_0_Mac_P,
_1_Mac_P,
_2_Mac_P,
_0_Mac_AE,
_1_Mac_AE,
_2_Mac_AE,
// 切り替えレイヤーとテンキーレイヤー
_SPECIAL,
_ten,
};
// keymap内にしこむマクロ
enum custom_keycodes {
// Win/Mac Premiere/AfrerEffects切り替えマクロ
MC_Win_P = SAFE_RANGE,
MC_Mac_P,
MC_Win_AE,
MC_Mac_AE,
// テンキーオン
MC_tenON,
// 5F進むマクロ
MC_5FL,
MC_5FR,
};
// Tap Dance
enum {
// シングルでc(カミソリツール)、ダブルタップでv(選択ツール)
TD_CV,
// シングルでエンター、ダブルでエンター+テンキーオフ
TD_ENT,
};
// Tap Dance Def
void ten_enter_finished(qk_tap_dance_state_t *state, void *user_data) {
register_code(KC_ENTER);
}
void ten_enter_reset(qk_tap_dance_state_t *state, void *user_data) {
unregister_code(KC_ENTER);
if (state->count == 1) {
} else {
layer_off(_ten);
}
}
qk_tap_dance_action_t tap_dance_actions[] = {
[TD_CV] = ACTION_TAP_DANCE_DOUBLE(KC_C, KC_V),
[TD_ENT] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ten_enter_finished, ten_enter_reset),
};
// KEYMAP overview//////////////////////////////////////////////////////////////
/////Premiere///////////////////
// Default: 基本的な移動と再生。エンコーダーはタイムラインの拡大と縮小、アンドゥリスト
// In点へ | 5F ← | 5F → | Out点へ || Undo (( Save )) Redo
// 前の編集点 | 1F ← /Ctrl | 1F → /Shift |次の編集点 /Alt|| TL Zoom In(( TL全体 )) TL Zoom Out
// | Undo | 巻き戻し | 再生、停止 || 早送り
//
// Layer 1: 基本的な編集機能。InOutベース、カミソリベースの編集機能
// //はシングルタップ、ダブルタップで機能が変わるもの
// In点設定 |前の編集点までカット|次の編集点までカット| Out点設定 || ((このレイヤーでInOut))
// 全レイヤーに編集点 | 編集点追加 | BS | マッチフレーム || Vol - (( Mute )) Vol +
// | Copy | カミソリ//選択 |**ここを押しながら**|| Paste
// Layer 2: 補助的なものたち
// マーカー消去 | 前のマーカー | 次のマーカー | マーク || (( ))
// 前方全選択 | UnGroup | Group | 後方全選択 || (( ))
// | 前後再生 |**ここを押しながら**|ここからOutまで再生|| InOut再生
//
/////After Effects///////////////////
// Dfault: Premiereと同様、基本的な移動と再生。同じ機能で使えるようにした。タブとパネルを開いてコントロールしやすく。
// ワークIn点へ | 5F ← | 5F → | ワークOut点へ || Undo (( Save )) Redo
// 前の編集点 | 1F ← /Ctrl | 1F → /Shift |次の編集点 /Alt|| TL Zoom In(( TL全体 )) TL Zoom Out
// | Undo | 全キーフレームタブ | 再生、停止 || コントロールパネル
//
// Layer 1: 基本的なレイヤーの編集機能。
// ワークIn点設定 |Inからここまで消去|ここからOutまで消去 | ワークOut点設定 || ((このレイヤーでInOut))
// Inをここへ移動 | レイヤー分割 | BS | Outをここへ移動 || Vol - (( Mute )) Vol +
// | Copy | Dupe |**ここを押しながら**|| Paste
// Layer 2: タブを開いたり閉じたり、スナップショットしたり。
// A アンカータブ | 前のキーF | 次のキーF | M マスクタブ || (( ))
// R 回転タブ | P 位置タブ | T 透明度タブ | S スケールタブ || (( ))
// | スナップショット |**ここを押しながら**|スナップショット表示|| E エフェクトタブ
//
/////SPECIAL/////////////////// Ten ONで恒久的にテンキーになる。(数値は連続で入力することが多いので)
// Mac P | Mac AE | Win P | Win AE || (( ))
// | | ten ON | || (( ))
// | | | ||*************
/////Ten Key/////////////////// Enterダブルクリックで、エンター+テンキー終了してDefaultレイヤーになる
// BS | 7 | 8 | 9 || (( - ))
// 0 | 4 | 5 | 6 || (( . ))
// | 1 | 2 | 3 || Enter//Ent+終了
// KEYMAP 本体//////////////////////////////////////////////////////////////
// 一段目 1,2,3,4, 上のエンコのクリック,
// 二段目 1,2,3,4, 下のエンコのクリック,
// 親指 1,2,3, 4
// エンコーダーの回転はキーマップ以外で定義(234行以降)
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// 注:LT(),MT()の中のキーは、Basic Keycodesでないといけない制約がある。なのでレイヤーキーの単キーは、単純なキーという縛りがあるよ。
///////////////////Windows
// Win Premiere
[_0_Win_P] = LAYOUT(
S(KC_I), S(KC_LEFT), S(KC_RGHT), S(KC_O), C(KC_S),
KC_UP, MT(MOD_LCTL, KC_LEFT), MT(MOD_LSFT, KC_RGHT), KC_DOWN, MT(MOD_LALT, KC_JYEN),
C(KC_Z), LT(_2_Win_P, KC_J), LT(_1_Win_P, KC_SPC), LT(_SPECIAL, KC_L)
),
[_1_Win_P] = LAYOUT(
KC_I, KC_Q, KC_W, KC_O, KC_SLSH,
S(C(KC_K)), C(KC_K), KC_BSPC, KC_F, KC_MUTE,
C(KC_C) , TD(TD_CV), _______, C(KC_V)
),
[_2_Win_P] = LAYOUT(
C(A(KC_M)), S(C(KC_M)), S(KC_M), KC_M, _______,
S(KC_A), S(C(KC_G)), C(KC_G), KC_A, _______,
S(KC_K), _______, C(KC_SPC), C(S(KC_SPC))
),
// Win AfterEffects
[_0_Win_AE] = LAYOUT(
S(KC_HOME), MC_5FL, MC_5FR, S(KC_END), C(KC_S),
C(S(A(KC_LEFT))), MT(MOD_LCTL, KC_PGUP), MT(MOD_LSFT, KC_PGDN), C(S(A(KC_RGHT))) , MT(MOD_LALT, KC_SCLN),
C(KC_Z), LT(_2_Win_AE, KC_U) , LT(_1_Win_AE, KC_SPC), LT(_SPECIAL, KC_F3)
),
[_1_Win_AE] = LAYOUT(
KC_B, A(KC_RBRC), A(KC_BSLS), KC_N, C(A(KC_B)),
KC_RBRC, C(S(KC_D)), KC_BSPC, KC_BSLS, KC_MUTE,
C(KC_C), C(KC_D), _______, C(KC_V)
),
[_2_Win_AE] = LAYOUT(
KC_A, KC_J, KC_K, KC_M, _______,
KC_R, KC_P, KC_T, KC_S, _______,
S(KC_F5), _______, KC_F5, KC_E
),
/////////////////////Mac
// Mac Premiere
[_0_Mac_P] = LAYOUT(
S(KC_I), S(KC_LEFT), S(KC_RGHT), S(KC_O), G(KC_S),
KC_UP, MT(MOD_LGUI, KC_LEFT), MT(MOD_LSFT, KC_RGHT), KC_DOWN, MT(MOD_LALT, KC_JYEN),
G(KC_Z), LT(_2_Mac_P, KC_J), LT(_1_Mac_P, KC_SPC), LT(_SPECIAL, KC_L)
),
[_1_Mac_P] = LAYOUT(
KC_I, KC_Q, KC_W, KC_O, KC_SLSH,
S(G(KC_K)), G(KC_K), KC_BSPC, KC_F, KC_MUTE,
G(KC_C) , TD(TD_CV), _______, G(KC_V)
),
[_2_Mac_P] = LAYOUT(
G(A(KC_M)), S(G(KC_M)), S(KC_M), KC_M, _______,
S(KC_A), S(G(KC_G)), G(KC_G), KC_A, _______,
S(KC_K), _______, G(KC_SPC), A(KC_K)
),
// InOut再生だけWinとMacでショートカットが違う(Op+K)
// Mac AfterEffects
[_0_Mac_AE] = LAYOUT(
S(KC_HOME), MC_5FL, MC_5FR, S(KC_END), C(KC_S),
G(S(A(KC_LEFT))), MT(MOD_LCTL, KC_PGUP), MT(MOD_LSFT, KC_PGDN), G(S(A(KC_RGHT))) , MT(MOD_LALT, KC_SCLN),
G(KC_Z), LT(_2_Mac_AE, KC_U) , LT(_1_Mac_AE, KC_SPC), LT(_SPECIAL, KC_F3)
),
[_1_Mac_AE] = LAYOUT(
KC_B, A(KC_RBRC), A(KC_BSLS), KC_N, G(A(KC_B)),
KC_RBRC, G(S(KC_D)), KC_BSPC, KC_BSLS, KC_MUTE,
G(KC_C), G(KC_D), _______, G(KC_V)
),
[_2_Mac_AE] = LAYOUT(
KC_A, KC_J, KC_K, KC_M, _______,
KC_R, KC_P, KC_T, KC_S, _______,
S(KC_F5), _______, KC_F5, KC_E
),
/////// Win/Mac Premiere/After Effects切り替え、テンキーに切り替え
[_SPECIAL] = LAYOUT(
MC_Mac_P, MC_Mac_AE, MC_Win_P, MC_Win_AE, XXXXXXX,
XXXXXXX, XXXXXXX, MC_tenON, XXXXXXX, XXXXXXX,
XXXXXXX, XXXXXXX, XXXXXXX, _______
),
// テンキー 数値入力しやすいように、一回オンにしたらオフにするまでテンキー。オフはエンターダブルクリック(エンター+もとに戻る)
[_ten] = LAYOUT(
KC_BSPC, KC_7, KC_8, KC_9, KC_MINUS,
KC_0, KC_4, KC_5, KC_6, KC_DOT,
KC_1, KC_2, KC_3, TD(TD_ENT)
),
};
// エンコーダ― Mac/Win, Premiere/AfterEffectsでキーバインド切り替える
void encoder_update_user(uint8_t index, bool clockwise) {
if (index == 0) {
///////
// 上のエンコーダ―(P/AEで、Undo/Redo共通)
if (Win_or_Mac) {
// Win
if (clockwise) {
// clockwise: Redo
SEND_STRING(SS_LSFT(SS_LCTL(SS_TAP(X_Z))));
} else {
// couterclockwise: Undo
SEND_STRING(SS_LCTL(SS_TAP(X_Z)));
}
} else {
// Mac
if (clockwise) {
// clockwise: Redo
SEND_STRING(SS_LSFT(SS_LGUI(SS_TAP(X_Z))));
} else {
// couterclockwise: Undo
SEND_STRING(SS_LGUI(SS_TAP(X_Z)));
}
}
} else if (index == 1) {
//////////
//下のエンコーダー
if (layer_state_is(_1_Win_P) ==1 || layer_state_is(_1_Win_AE) ==1 || layer_state_is(_1_Mac_P) ==1 || layer_state_is(_1_Mac_AE) ==1) {
// layer 1 on のときはVolつまみになる(Win/Mac共通)
if (clockwise) {
SEND_STRING(SS_TAP(X_VOLU));
// clockwise
} else {
SEND_STRING(SS_TAP(X_VOLD));
//counterclockwise
}
} else {
// タイムラインの拡大縮小(Win/Mac共通)
if (P_or_AE) {
///// Premiere
if (clockwise) {
SEND_STRING("'");
// clockwise: timeline scale +
// 日本語の:キーをUSで打っているので。
} else {
SEND_STRING("-");
//counterclockwise: timeline scale -
}
} else {
////// AfterEffects
if (clockwise) {
SEND_STRING("=");
// clockwise: timeline scale +
// 日本語の^キーをUSで打っているので。
} else {
SEND_STRING("-");
//counterclockwise: timeline scale -
}
}
}
}
}
// Macros ///////////////////////////////////////////
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
// AEで5F移動(デフォルトのショートカットが10Fしかないので、Premireと合わせる)
case MC_5FL:
if (record->event.pressed) {
SEND_STRING(SS_TAP(X_PGUP));
SEND_STRING(SS_TAP(X_PGUP));
SEND_STRING(SS_TAP(X_PGUP));
SEND_STRING(SS_TAP(X_PGUP));
SEND_STRING(SS_TAP(X_PGUP));
}
break;
case MC_5FR:
if (record->event.pressed) {
SEND_STRING(SS_TAP(X_PGDOWN));
SEND_STRING(SS_TAP(X_PGDOWN));
SEND_STRING(SS_TAP(X_PGDOWN));
SEND_STRING(SS_TAP(X_PGDOWN));
SEND_STRING(SS_TAP(X_PGDOWN));
}
break;
// Win/Mac, Premiere/AfterEffectsのレイヤーの切り替え
case MC_Win_P:
if (record->event.pressed) {
layer_clear();
//Windows/Premiereはベースレイヤーなのでクリアするだけでよい
// もしベースレイヤーを変更したら以下を生かしてね
// layer_on(_0_Win_P);
Win_or_Mac = true;
P_or_AE = true;
}
break;
case MC_Win_AE:
if (record->event.pressed) {
layer_clear();
layer_on(_0_Win_AE);
Win_or_Mac = true;
P_or_AE = false;
}
break;
case MC_Mac_P:
if (record->event.pressed) {
layer_clear();
layer_on(_0_Mac_P);
Win_or_Mac = false;
P_or_AE = true;
}
break;
case MC_Mac_AE:
if (record->event.pressed) {
layer_clear();
layer_on(_0_Mac_AE);
Win_or_Mac = false;
P_or_AE = false;
}
break;
// テンキーのオン
case MC_tenON:
if (record->event.pressed) {
} else {
// キーリリースのときにレイヤーチェンジにしないと5がでちゃうっぽい
layer_on(_ten);
}
break;
}
return true;
};