Files
Beyond-KLE/keyboard-design-layers.md
T
ewdernaandClaude Opus 5 8c47e547b4 layers: レイヤー構造を確定した仕様に追従させる
ELCがPHYのノードIDを直接参照すると決めたので、IDX→ELCの直列フローを
PHY→ELC / PHY→IDX の並列に改めた。row/colとLED番号をIDXの出力から外し、
KLEをビュワーとして扱う記述に合わせた。ツール名2つが捨てたモデルを
含んでいたため改名。アナログ値の解釈を持つ層が未定なのでP-1に立てた。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-20 21:48:43 +09:00

184 lines
6.5 KiB
Markdown

# Beyond KLE: キーボード設計レイヤー構造とツール設計方針
## 背景
### KLEの問題点
- **物理配置と論理構造の混同**: y座標や回転角度で行を判定するため、カラムスタッガードや曲線配列で大量の行が生成される
- **データモデルの限界**: 物理配置(PHY)のみを扱い、マトリックス座標やキーマップ情報を保持できない
- **VIAのhackyな対応**: ラベルフィールドに"1,5"と入れて`matrix:[1,5]`を表現
### 設計思想
- 「Better KLE」ではなく「Beyond KLE」: UIではなくデータモデルとワークフロー全体の再設計
- UNIX哲学の適用: 小さな役割のツールがそれぞれしっかり機能する
- 統合環境(IDE)の提供: 独立したツール群をオーケストレート
## レイヤー構造
レイヤーは一列に積み上がらない。ELCとIDXはそれぞれ独立にPHYを参照する。
ELCはIDXを参照せず、IDXもELCを参照しない。
他レイヤーからキーや部品を指す参照には、PHYのノードIDを使う。
### 1. PHYレイヤー (物理配置)
- **役割**: キーと部品の物理的な位置、サイズ、回転
- **対応ツール**: PCBエディタ、KLE
- **出力**: 相対座標の木(キー・クラスター・部品ノード)。各ノードはIDを持つ
### 2. ELCレイヤー (電気配線)
- **役割**: ピン提供者が提供する論理ピンと、各キーの端子・LEDの対応
- **入力**: PHYのノードID
- **対応ツール**: 回路図エディタ、ファームウェア
- **出力**: 提供者定義、キーごとの端子の接続先、LEDチェーン
- **備考**: 配線方式(マトリクス / direct / charlieplexing)を区分として選ばせず、端子の接続先の組み合わせとして表すため、非標準的な実装も同じ形で書ける
- **備考**: row / col は正本に持たない。QMKなどが要求する形は出力時に割り当てる
### 3. IDXレイヤー (キー識別)
- **役割**: PHYのキーと"キー番号"の対応付け
- **入力**: PHYのキーID
- **重要性**: 物理世界と論理世界を繋ぐ最も重要な抽象化層
- **出力**: キーIDとキー番号の対応
- **備考**: 現状のエコシステムで最も欠けている層
- **備考**: マトリックス座標とLEDの識別番号はIDXが持たない(どちらも配線で決まるためELCが持つ)
### 4. MAPレイヤー (キーマップ)
- **役割**: キー番号とキーコードの対応
- **対応ツール**: ファームウェア、VIA、Remap
- **出力**: レイヤー別キーコード配列
### 5. IMEレイヤー (入力変換)
- **役割**: キーコードと実際の入力文字の対応
- **対応ツール**: OS
- **備考**: MAPレイヤー設計時に考慮が必要
## ツール設計方針
### 個別ツール (独立動作可能)
#### PHY Editor
- 物理配置の視覚的編集
- KLE JSONの読み込み・書き出し
- 出力: PHY JSON
#### Key Indexer
- PHY JSONを入力
- キーにキー番号を割り当て
- 出力: IDX JSON
#### Wiring Editor
- PHY JSONを入力
- ピン提供者(マイコン、マルチプレクサ等)を置き、各キーの端子の接続先を指定
- 視覚的に配線を確認
- 出力: ELC JSON
#### Keymap Designer
- キー番号のリストを入力
- レイヤー別キーコード割り当て
- VIA/Remapとの互換性
- 出力: MAP JSON
#### Firmware Generator
- 全レイヤーの情報を統合
- row / col など、ターゲットが要求する派生情報をここで割り当てる
- QMK/VIA/KMK等へ変換
- 出力: ターゲット固有の設定ファイル
### 統合環境 (IDE)
- **プロジェクトファイル**: 全レイヤーの状態を一元管理
- **リアルタイムプレビュー**: レイヤー間の依存関係を可視化
- **バージョン管理統合**: テキストベース定義でgit管理
- **ワークフローサポート**: ガイド付きウィザード、テンプレート
## プロトコル設計
### レイヤー間インターフェース
```txt
PHY → ELC
Input: ノードID + 配置
Output: 提供者定義 + 端子の接続先 + LEDチェーン
PHY → IDX
Input: キーID + 配置
Output: キーIDとキー番号の対応
IDX → MAP
Input: キー番号のリスト
Output: レイヤー別キーコード配列
All → Firmware
Output: QMK keyboard.json / VIA JSON / KMK .py
```
### データフォーマット
- JSON Schema で各レイヤーの入出力を定義
- 後方互換性の維持 (KLE JSONからのインポート)
- 拡張可能な設計 (3D配置、非標準マトリックス対応)
## 実装戦略
### Phase 1: プロトコル策定
- JSON Schemaでフォーマット定義
- リファレンス実装(言語・構成は `implementation-plan.md` で選定)
- CLIツールとして動作確認
### Phase 2: 個別ツール開発
- 各レイヤー用エディタを独立開発
- 既存ツールからのインポート機能
- 単独利用可能な設計
### Phase 3: IDE統合
- Electron/Tauri or Webアプリ
- プロジェクト管理機能
- ワークフロー支援
## 既存ツールとの関係
- **KLE**: PHYデータを表示できる既存のビュワー。KLE JSONの読み書きで連携する
- **VIA/Remap**: MAP Layerクライアントとして連携
- **QMK Configurator**: Firmware Generatorのターゲット
## 配慮事項
### 学習コスト
- テンプレートプロジェクト提供 (60%, Split等)
- 簡易モード/詳細モードの切り替え
- 段階的な機能開示
### 互換性
- 既存KLE JSONの読み込み(PHYデータがなくても読める)
- 段階的移行パスの提供
- レガシーツールとの共存
## 次のステップ
1. プロトコル仕様ドラフト作成
2. GitHubでRFCリポジトリ立ち上げ
3. 小規模コミュニティでフィードバック収集
4. リファレンス実装の開発
## 未確認事項
### P-1 アナログ値の解釈をどの層が持つか
- 位置づけ: 未解決の問い。ELCは配線だけを持つと決めたため、生値から押下深さを出す変換の置き場が空いている
- 現状の認識: センサの品種と出力特性はPCB設計ツール側、キャリブレーションは実機ごとの実測値で設計データではない、とまでは決まっている。残りをMAPに寄せるか、別の層を立てるかは未定
- 格上げ条件: アナログ入力のキーボードを1つ通しで設計し、変換に必要な情報と、それを置く層をユーザーが決める