2019年05月08日

【薙刀式】気づいたらQMK薙刀式更新されてる…っ!

すごい。僕じゃ絶対無理なことだ。

gitに公開ってことは公開情報と考えて良いのかしら。
https://github.com/eswai/qmk_firmware/tree/master/keyboards/crkbd/keymaps/naginata


配列(arrayのほうの)ではなくビット演算で組み合わせを定義してるようだ。
多くの同時押し配列をこれで定義できる可能性を含む、
ということだよね。
コルネなら小指外キーもあるから、
ニコラ、飛鳥、蜂蜜小梅あたりはいけそう。
新下駄は物理数字段のある、lily58ならいけそう。

偉業ではないのかなこれ。


今スマホからで行数が見えないので、行数が特定できないが、

// 同時押しされているキーから仮名に変換して出力する。
memcpy_P(&kana, &ng_kana[i], sizeof(kana));
send_string(kana);

がキモの部分だと思われる。

あと最後のブロックの、
キーダウンとキーアップ(pressとrelease)の処理部が、
打鍵感を決定すると思われる。


双方向シフトに対応してるかどうかとか、
連続シフトがどうかとか、
シフト押しながらの同時押しは無理だろうなとか
(キーダウン3文字でバッファを発火させてるので)、
チェックしてみないとあとは分からないので、
読み込んでみます。

(バッファの上限を5としてる理由が解せぬ。
処理が追いつかない時の保険なのかと思ったが、
ニコラの時からそうなんだよね…)


うまくいけば、
DvorakJより柔軟に対応した、
僕の思い描いていた薙刀式になる可能性がある、かも。

これでメモリが足りてるわけだから、
LEDの部分を削れば編集モードも乗るかも…っ!
posted by おおおかとしひこ at 09:40| Comment(19) | カタナ式 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
早くも捕捉いただき恐縮です。
コードはもちろん公開情報です。
シフト押しながらの同時押し、というのは例えばどのような押し方になるでしょうか。
シフトキーは事前に押しておく必要がありますが、連続シフトが有効です。シフトキーは文字数にカウントしていません。
濁音、半濁音など文字の同時押しは時間に関係なく、同時に押し下げたかどうか。以下の記事の双方向シフト?になっていると思います。

http://oookaworks.seesaa.net/article/465268936.html

バッファが5なのは深い理由はありません。余裕を見て確保しておいた、実際は使わない、という感じです。
編集モード、トライしたいですね。
Posted by eswai at 2019年05月08日 14:01
コンパイルできただけで、miniaxeがないので動作確認していませんが、miniaxe用の薙刀式キーマップです。
https://github.com/eswai/qmk_firmware/tree/master/keyboards/miniaxe/keymaps/naginata
Posted by eswai at 2019年05月08日 14:16
eswaiさんいろいろありがとうございます。

ああ、そうか。ng_chrcountにはシフトは含まれていないからどっちでもいいのか。理解できました。
小書きは「シフト+半濁音同時押し」という変則定義にしたもので。
(最初はシフト不要にしていたんだけど、頻出する「こう」をロールオーバーOKにしたかったんです)

NICOLAはシフトキーを先に押しても後に押してもよい、
双方向シフトだった所までは理解できましたが、
今回のビットは慣れてない領域で。

編集モードはOSによってコマンドの異同があります。
(「再変換」はWinだと変換キー、Macだとかなキーダブルクリックなど)
いくつかはカタナ式キーボードでも実装しましたが、
OS切り替えキー(コマンド?)が必要になります。
使うOSを限定して割り切り、ファームを二種類焼く手もあるけど
(IME切り替えなどはそのようになってますね)、
もっとエレガントな解があればいいのですが。

あと全角記号の出力(○、…などの文字単打でないもの)は、僕にはできませんでした。
文字コードはOS上でどう扱われているのか、
のレベルを理解する必要があると思うので、そこまで手が届いていない感じです。


バッファが5なのは、打鍵のほうが速くて処理が追いついてない現象があり、とりあえず何文字かためとく現実的な処理ができる?
などと予測していましたが、使わないんですね。

学生以来プログラミングなどしてこなかったので、
専門家の仕事の速さには感服です。。。
Posted by おおおかとしひこ at 2019年05月08日 16:42
大岡さんがお探しのものかは判りませんが、
WindowsやQMKでのUnicodeの入力について書かれた記事を見付けました。
https://qiita.com/kitakitash/items/ead550a19533f00bcb7d

あと大岡さんとeswaiさんのおかげで、今すごくワクワクドキドキしています。
二十数年前にパソコンを使い始めて一カ月で、
ローマ字入力に頭に来て親指シフトに乗り換え、
不合理で美しくないQWETYの斜め配列を疎みつつも使うしかなかった過去に、
ようやく終止符を打てそうです。

この場を借りてお二人に深い感謝を捧げます。
Posted by ヨシアキ at 2019年05月08日 19:45
ヨシアキさんコメントありがとうございます。

その記事は既に見つけていて、
別ソフトのインストールがあまり美しくないなあ、
と思って思考停止していたところでした。
理想は、WinでもMacでも繋げば記号が出る、
ということをやろうとしてるのですが、
何をどう調べていいのやら、で諦めた感じ。

僕は事あるごとにqwertyを目の敵にしているので(笑、
薙刀式はとりあえずの回答と考えています。
僕の理想は「メガネケースに入るキーボード」ぐらいなので、
20%でカナ配列が作れないかと、
実は無想しているところだったり。

eswaiさんに感謝しつつ、
薙刀式がお役に立てると幸いです。
Posted by おおおかとしひこ at 2019年05月08日 21:43
私も職業プログラマではないので、本職の人が見たらもっと効率的にできるところがあると思います。
ようやく私も薙刀式に入門する環境が整ったので、マニュアルを見ながら練習してみます。拗音同時押しは本当に気持ちいいですね。qmkの方も改良していきたいとおもいます。
Posted by eswai at 2019年05月09日 04:22
>eswaiさん

本職でなくてあれだけ書けるとは凄いとしか…。
薙刀式で質問があれば是非どうぞ。
改良もお待ちしております。
Posted by おおおかとしひこ at 2019年05月09日 11:47
はじめまして。
薙刀式かな入力、いつも愛用させていただいております。
プログラム初心者なので、eswai様のcrkbd用薙刀式日本語入力キーマップで自作キーボードでも手軽に薙刀式が使えることには感謝してもしきれません。

現在もプログラムの内容が更新されているようで、最新の情報は正直追いきれてないのですが、自分なりに改変して、美しさを犠牲にhexファイルを600bytes程圧縮してみました。

naginata.h とnaginata.c の該当箇所をリンク先のコードを参考に 置き換えれば、おそらく再現できると思います。
穴だらけのお見苦しいコードで恐縮ですが、少しでも改良のヒントになれば幸いです。

https://github.com/trp3l/qmk_firmware/tree/master/keyboards/ergodox_ez/keymaps/naginata_16
Posted by trp3l at 2019年12月25日 12:11
>trp3lさん

おお、色々ありがとうございます。
誰かのなにかの役に立つに違いない。今出先なのであとで読みます。

今ぼっちラボさんという方が、汎用性のあるqmkへ改良しつつある情報を得ていて、
その公開を待っているところです。
(年末のゆるキーに間に合うかな?)
そもそもどういう構造になってるかなどの、
c分からない人でもある程度わかるような、
そんな解説を僕は待ってます…

あと「薙刀式はいいぞ」などと発信していただけると、
「親指シフトはいいぞ」「漢直はいいぞ」「新下駄はいいぞ」などのように、
「接触回数が多いものをいいと思うようになる」現象があるので、
薙刀式はいいぞ。(宗教)
Posted by おおおかとしひこ at 2019年12月25日 12:54
>trp3lさん

なるほど、同時押しの組み合わせを減らすことで、容量を減らせるんですね。確かにほどんどの組み合わせは同時押しはないですよね。改良のヒントになります。
最近の私は富豪的にARM化でメモリの心配をしなくていいようにしよう、などと横着をしていますが、どんどんみなさんが改良してよくなるといいですね。
Posted by eswai at 2019年12月25日 22:58
ご返信ありがとうございます。

コードの書き方次第である程度見やすくできるとはいえ、わかりやすさと省スペースはトレードオフの関係にあるところがやはり残念ですね。精進いたします。
多くの方に理解してもらう為には ある程度の広い容量が必須であることを考えると、eswai様の仰っているハード自体をarudinoから乗り換えるという手段がベターなのかなと私も思います。

>>今ぼっちラボさんという方が、汎用性のあるqmkへ改良しつつある情報を得ていて、
>>その公開を待っているところです。
cの知識がなくてもハードに依らずコピペで薙刀式が使える時代ですか……。
来年は益々自キ界隈に薙刀式が浸透していきそうですね。

悲しいことに、私の周りの人は文字入力の仕方には興味がないようなので、存在するだけで人目を引く自作キーボードが広告塔のような役割となって、薙刀式を知るきっかけになってくれればいいなと思います。
(薙刀式はいいぞキーキャップ誰か作ってくれないかな……)
Posted by trp3l at 2019年12月27日 09:57
>eswai様

拝見頂き恐縮です。

arduino以外でもqmkって載るんですね。いい事を伺いました。
ngmapの配列を3列にして、アルファベットと記号系も薙刀式の感覚で打てるようになったら最高だなあと思っていたのですが、容量を気にしなくていいなら問題なく実装できそうですね。= true;即入力みたいなプログラマのための編集モードとか作りたい……。
Posted by trp3l at 2019年12月27日 10:12
>trp3lさん

僕はプログラムに関しては多少できるレベルでしかないのでアレですが、
ソースコード以外に、
「大雑把な構成表」のようなものを添付する習慣はないのでしょうか。
switch caseだとcase以下は大体同じだから省略したりなどの記法。
タブの深さで表示を変えるみたいなのがエディタの機能としてあるのかも知れないけど。
人為的にまとめた、ペラ一枚の「どういう原理で動いてるか」
があると、わかりやすいなあといつも思ってます。
構成の要になるところのフォントだけデカくするとか、
そういうことが出来れば、
他人のソースコードを読む時わかりやすいのに、
といつも思います。
(だから毎度紙に出して蛍光ペンで塗って理解してる…)

「自分より下のレベルの人に自分のやったことを説明する」
が欲しい…


プログラマの為の編集モードは、
DvorakJで実装した方がすぐ出来そうですね。
試しては改造も、qmkより楽だと思います。
SD同時、KL同時は現在小説を書く為の「固有名詞ショートカット」
としてますが、そこに好きな文言を入れてしまえば、
いかようにでもつくれるかと。
英数のほうにも同じものを定義すれば、IMEオンオフどちらでも使えます。
薙刀式のDvorakJソースの、最後の方をごらんください。
Posted by おおおかとしひこ at 2019年12月27日 13:23
QMKはいわゆるフレームワークなので、独自処理の部分だけ書けばあとはQMKで決まっている順序で実行される仕組みになっています。だからkeymap.cだけみても流れは分からないのが分かりにくいでしょうか。さらにnaginata.cは共通部分だけ抜き出したファイルなので、これまた処理の流れはわからない。
ということで、フローチャートを作れば多少は分かりやすいかな?
Posted by eswai at 2019年12月28日 13:43
>eswaiさん

そうそう。僕はBASICや古典cしか知らないので、
「これ頭から順番に処理してないぞ」
に気づくのに、物凄い時間がかかりました。
AutoHotKey触った経験がなければずっと分からなかったかも。

keymap.cとconfig.hだけ見とけば大体OKの、
ふつうのキーマップ改造と違って、
全部のファイルのフローチャート的なものがあると、
わかりやすいかもです。
Posted by おおおかとしひこ at 2019年12月28日 15:36
半年以上経ってしまった上、v12版の解説になってしまい申し訳ないのですが
フローチャート、作りました。
https://github.com/trp3l/qmk_firmware/blob/add_naginata_keymap_for_crkbd/keyboards/crkbd/keymaps/naginata/naginata_qmk_flowchart.jpg

キーが押/離された時、keymap.c のprocess_record_user()以降で
どんな操作がされているかを大雑把に書いてあります。
naginata_v12.cでeswaiさんが書いてくださっているコメントを睨みつけながら、
A押 SFT押 A離 B押 B離 J押 F押 J離 F離 SFT離 M押 M離 H押 H離
など、実例を使って各変数が変わっていく様子をメモして
フローチャートをたどっていくとぎりぎり挙動が追えるかもしれません。

もっと詳しい解説もしようと思っているのですが、
いつになるかわからないので、とりあえず画像だけで失礼いたします。
解説記事を書いたらまた報告いたします。
Posted by trp3l at 2020年08月07日 08:12
trp3lさんコメントありがとうございます。

こ、こんなに複雑だったのか…
前身の親指シフトニコラ配列のバージョンは、
僕にも解析可能なくらいでしたが、
3キー同時押しの薙刀式版は、正直把握し切れてません。
これを解説するのは大変そうだな…

親指シフトバージョンから改造した、最初の版
(編集モードもないやつ)は残ってるのかしら。
それがあればミッシングリンクになるかもしれません。

とりあえず解説を楽しみにしています。
他に3キー同時押し配列(あるのか?)を実装したい人の、
参考になるやも。
Posted by おおおかとしひこ at 2020年08月07日 08:39
大岡先生のおっしゃるとおり、根幹以外、つまり枝葉の部分は解説の初期段階では雑音になるため、同じ内容のフローチャートを複数個用意し、段階的に詳しくしていくのが良いかなと私も思っております。

3キー同時押し配列の参考になるやも。とのことですが、実際に私は 固有名詞モードを追加したり、連続シフト中でないときの同手シフトで挙動を変更したり
(例えば 左シフト + K→E は「もり」、左シフト + E は「り」ではない独自のキー 等)と魔改造して遊んでいるので、全然夢の話じゃないです。
Posted by trp3l at 2020年08月07日 09:21
>trp3lさん

同手シフトを活用するのは面白そう。
左右分割だととくに二つスペースキーがあるので、
それを役割を分けるのはありでしょうね。
(僕は苦手なので手を出してないですが、
なんらかの圧縮はできるので、
さらに打鍵範囲を小さくすることはできたり…?)
薙刀式は仕組みはシンプル(実装は大変ですが)なので、
魔改造のしやすい配列だとも思います。

ともあれ、解説が大変そうですが、
うまく整理されれば、他の人たちも参入しやすいかもですね。
Posted by おおおかとしひこ at 2020年08月07日 10:30
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。