僕はホットキーを使用するためpptrayを常駐している。
PPxアップデート時に一時的に終了するので、うまいことpptrayを再起動する方法がないか考えてたが、FIRSTEVENTに登録すればいいだけだと気づいた。
KC_main = {
FIRSTEVENT , *ifmatch 0,0%NTRA %: *pptray
}
僕はホットキーを使用するためpptrayを常駐している。
PPxアップデート時に一時的に終了するので、うまいことpptrayを再起動する方法がないか考えてたが、FIRSTEVENTに登録すればいいだけだと気づいた。
KC_main = {
FIRSTEVENT , *ifmatch 0,0%NTRA %: *pptray
}
*mapkeyを使うことで、以前よりスマートにできるようになったので紹介。PPx 1.77+5以降とKey Module R5が必要。
操作は前と同じ。
処理元のファイルをマークしたあと、
でサブ窓PPC[X]が開くので、パス移動してShift+Enter。
KC_main = {
\M ,*alias ppcx_cmd = *file !move ,%%*extract(%n"%%%%@*8FCDN"),%%1 %%: %%K"@Q" %: *ppc -r -bootid:x -single "%1" -k *mapkey use,K_subwin %%: *linemessage 移動先を選択してください
\C ,*alias ppcx_cmd = *file !copy ,%%*extract(%n"%%%%@*8FCDN"),%%1 %%: %%K"@Q" %: *ppc -r -bootid:x -single "%1" -k *mapkey use,K_subwin %%: *linemessage コピー先を選択してください
}
K_subwin = {
\ENTER ,*execute ,%'ppcx_cmd'
}
特殊環境変数の%si"name"を使えばエイリアスを使う必要がなくなることに気づいた。ただエスケープのせいで視認性が悪くなるので一長一短。
KC_main = {
\M ,*ppc -r -bootid:x -single "%1" -k *mapkey use,K_subwin %%: *linemessage 移動先を選択してください %%: *string i,temp_exec=*file !move ,%%%%*extract(%n"%%%%%%%%@*8FCDN"),%%%%1 %%%%: %%%%K"@Q"
\C ,*ppc -r -bootid:x -single "%1" -k *mapkey use,K_subwin %%: *linemessage コピー先を選択してください %%: *string i,temp_exec=*file !copy ,%%%%*extract(%n"%%%%%%%%@*8FCDN"),%%%%1 %%%%: %%%%K"@Q"
}
K_subwin = {
\ENTER ,*execute ,%si"temp_exec"
}
1.83からマクロ文字展開抑制ができるようになったので、見やすく書き直し。
KC_main = {
\M ,*setcust _User:sorce_id=%n %: *ppc -r -bootid:x -single "%1" -k %(*mapkey use,K_subwin %: *linemessage 移動先を選択してください %: *string i,temp_exec=%(*file !move ,%*extract(%su"sorce_id""%%@*8FCDN"),%1 %: %K"@Q"%)%)
\C ,*setcust _User:sorce_id=%n %: *ppc -r -bootid:x -single "%1" -k %(*mapkey use,K_subwin %: *linemessage コピー先を選択してください %: *string i,temp_exec=%(*file !copy ,%*extract(%su"sorce_id""%%@*8FCDN"),%1 %: %K"@Q"%)%)
}
K_subwin = {
\ENTER ,*execute ,%si"temp_exec"
}
去年のコロナ禍で暇なときに(今もそうだが)ラズパイオーディオを試してみた。
僕は00年代に買ったミニコンポをずっと使っている。ここ数年間ずっと思ってたのは、「
音楽データを直接再生したい」ということだった。今更CDドライブなんてパカパカ開けたり閉めたりしてられるか!
ミニコンポの後ろにはLINE接続が用意されているので、そこに何らかの機器をつなげばこれは実現できるはずだ。だがその良さげな何らかの機器が見つからない。ネットワークオーディオプレーヤーという名前でメーカーが市販していたりもするが、数万円もする。手頃な値段でいろいろな機種が出ていても良さそうなのになぜだ。ミニコンポで音楽を聴く、という文化自体が廃れてしまってるのだろうか?
そこでラズパイの出番になる。これを使うと、数千円で音楽データを再生する環境を整えられる。
細かい話を抜きにすると、
のどちらかを選べばいい。Pi4は名刺大の大きさで、Zero WHはフリスクの容器に入るほどの大きさだ。スペックはPi4の方が高いが、音楽を再生する程度ならZero WHでも問題ない。
Amazonでも買えるが、いろんなところが出店しててよくわからない。電子パーツ屋の通販で買うのがわかりやすい。僕はZero WHをSwitch Scienceで購入した。近所に電子パーツ屋があればそこに行ってもいい。僕は Pi4 Model Bを京都寺町にあったマルツ(閉店してしまった…)で購入した。
Raspberry Pi は、ピンに拡張ボードを刺すことで機能を拡張できる。本体のイヤホンジャック出力は音が悪すぎるので、音声出力用の拡張ボードを購入する必要がある。
有名なのは
あたり。電子パーツ屋の通販や、メーカーサイトからの輸入で手に入れることができる。
また、amazonで中国製の安いI2S DACを入手できる。そこまで音質にこだわってるわけじゃないなら、こっちの方が手軽かもしれない。
僕はそっち派なのでamazonでinno makerのI2S DACを買った。比較してないのであれだけど、音質はいいと思う。
OSを書き込んだmicroSDカードをラズパイ本体に差し込み、電源コードをコンセントに刺すと起動する。
オーディオ用のOSとしては
の二つが有名。インストールや設定の手順はググれば出てくる。
同一LAN内のPCやスマホからブラウザで操作する。
慣れたら適当なMPDクライアントを使ってもいい。
NASを使うと、音楽データを書き込んだドライブをラズパイにつなぐ手間が省けて便利。NASもラズパイで構築できる。
PPeでコマンドを実行できるようにする。
複数行に渡るコマンドマクロ作成時のテスト用に。PPx: PPeで簡易コード編集 ・ GitHub を参考にした。
以下を編集して取込。
K_cmdtest = {
^\ENTER ,*execute C,%*edittext
}
PPC上から以下を実行する。
*edit -new -k *setcaption Ctrl+Shift+Enterでコマンド実行 %%: *editmode -modify:silent %%: *mapkey use,K_cmdtest %%: *fitwindow %%NC#,%%N.,20 %%: *focus Ctrl+Shift+Enterでコマンド実行
起動したPPeにコマンドを書き、Ctrl+Shift+Enterを押すと、PPC上で実行する。
僕はhowm形式でメモを取っている(参考:MOE)。
メモファイルを他のファイルと紐付けしたい時がある。
・関連するメモ
・画像ファイル
・PDFファイル
・etc
アウトラインプロセッサならこういう機能のやつもありそうだが、ファイラだと実装は無理かなとあまり追求してこなかった。
最近、リストファイルを利用すれば可能なことに気づいた。
Paper Plane xUI Module Junk parts が必要。
KC_main = { ; PPcメイン窓
\ENTER ,*ifmatch CX,%n %: *execute ,%'ppcx_cmd' %: *stop
%K"@\ENTER"
CLOSEEVENT ,*ifmatch CX,%n %: *alias ppcx_cmd = %%K"@\ENTER" %: *stop
^\ENTER ,*ifmatch CX,%n %: *stop
*ifmatch "o:e,a:d-",%0%Y.txt %: *execute C,*jumppath "%0%Y.txt" %: *stop
*alias ppcx_cmd = *makelistfile %0%Y.txt -basic -comment -marked %%: %%K"@Q" %: *ppc -r -bootid:x -single %1 -k *linemessage 登録するファイルを選択してください
BS ,*ifmatch 4,%*DirectoryType %: %K"@^LEFT %: *stop
%K"@BS
}
1.メモファイル上でCtrl+Shift+Enterを押すと、独立窓が開く。紐付けしたいファイルをマークして、Shift+Enter。これでPPxフォルダに、「メモファイルのファイル名.txt」というリストファイルが作成される。
2.次からはCtrl+Shift+Enterでそのリストファイルに潜れる。
・ファイル名が同じリストファイルを作って開いているだけ。howm形式だとかぶることがないので機能する。
・この方法でリストファイルに潜ると、BackSpaceでListFileを保存したフォルダに移動してしまう。なのでPaper Plane xUI Module Junk partsを使い、リストファイルか否かを判別して「履歴を戻る」をしている。
・これだと一つのフォルダ内のファイルしか登録できない。あとで追加したい場合は*ppcfileを使うといい。
PPcのマークの有無で、PPvのカーソル上下の挙動を変更する。
マークがある時は、このように次の、あるいは前のマークファイルを表示。
マークが無い時は通常の挙動をする。
Paper Plane xUI Module Junk partsが必要。
KV_main = { ; PPvメイン窓
UP ,*ifmatch 1,%*extract(C"%%*EntryPrevMark") %: %KC"@N" %: *stop
*ifmatch 1,%*extract(C"%%*EntryLastMark") %: %KC"@N" %: *stop
%K"@UP"
DOWN ,*ifmatch 1,%*extract(C"%%*EntryNextMark") %: %KC"@N" %: *stop
*ifmatch 1,%*extract(C"%%*EntryFirstMark") %: %KC"@N" %: *stop
%K"@DOWN"
}
※一行編集でランチャを前提にした記事です。
一行編集を用いたステップイン・ステップアウトについては前にもやったことがあるが、その時はパスを全て表示していた(参考:PPxをランチャとして使う⑦ステップイン・アウト)。
今回は、カレントフォルダをキャプションに。フォルダ名orファイル名を候補一覧に表示する形式にする。一行編集の入力欄にパスが入力されていた場合、カーソル左右でステップイン・ステップアウト。Enter時、フォルダならPPCで開き、EXEファイルなら実行する。
以下をScriptフォルダに保存。
sublist.js
//!*script
// 受け取ったディレクトリのサブディレクトリ名やファイル名を、ファイルに出力
// 第一引数 : ディレクトリ
// 第二引数 : 出力するファイルパス
// 引数がなければ終了
if (PPx.Arguments.Length < 2){
PPx.SetPopLineMessage("引数が正しくありません。");
PPx.Quit(-1);
}
var pdir = PPx.Arguments(0);
var resultfile = PPx.Arguments(1);
var fso = PPx.CreateObject("Scripting.FileSystemObject");
var dir = fso.GetFolder(pdir);
var folders = new Enumerator(dir.SubFolders);
var files = new Enumerator(dir.Files);
var message = ""
for(; !folders.atEnd(); folders.moveNext()){ // サブフォルダを追加
message += folders.item().Name + "\r\n";
}
for(; !files.atEnd(); files.moveNext()){ // ファイルを追加
var fname = files.item().Name;
if (fso.GetExtensionName(fname).toLowerCase()=="exe"){ // 拡張子がEXEのファイルのみ追加
message += fname + "\r\n";
}
}
fso.CreateTextFile(resultfile);
// 書き込み
objOutFile = fso.OpenTextFile(resultfile, 2);
objOutFile.Write(message);
objOutFile.Close();
PPxをランチャとして使う⑦ステップイン・アウトのsubdirlist.jsとだいたい同じ。出力するのがフルパスか、フォルダ名orファイル名かの違い。
以下を編集して取込。
K_edit = {
FIRSTEVENT , *setcust _User:pplcaption=
}
K_lied = {
LEFT ,*ifmatch "o:e,a:d",%W %: *stepinout %*name(D,"%W") %: *stop
*ifmatch "o:e,a:d","%*edittext" %: *stepinout %*name(D,"%*edittext") %: *stop
%K"@LEFT"
RIGHT ,*ifmatch 0,0%*edittext %: *stop
*ifmatch "o:e,a:d","%*edittext" %: *stepinout %*edittext %: *stop
*ifmatch "/[a-zA-Z]:\\/",%W %: *stepinout %*name(DC,"%*edittext",%W) %: *stop
%K"@RIGHT"
}
_Command = {
stepinout = *string o,dir=%*arg(1)
*setcaption %so"dir"
*setcust _User:pplcaption=%so"dir"
*script %0\Script\sublist.js,"%so"dir"","%'temp'\list.txt"
*replace ""
*completelist -file:"%'temp'\list.txt"
ppl2 = *string o,exec_command=%*input("" -title:"PPlauncher" -mode:e -k:"*completelist /set /file:%%0l_cmd.txt")
*ifmatch !0,0%*getcust(_User:pplcaption) %: *string o,exec_command=%*name(DC,%so"exec_command",%*getcust(_User:pplcaption))
*ifmatch "o:e,a:d+",%so"exec_command" %: *focus C %: *execute C,*jumppath "%so"exec_command"" %: *stop
*ifmatch "o:e,a:d-",%so"exec_command" %: *execute ,"%so"exec_command"" %: *stop
*execute,%so"exec_command"
}
パスを含んだl_cmd.txtをPPxフォルダに用意し、*ppl2を実行すればいけるはず。
ユーザーコマンドは2つあるが、ppl2が本体。stepinoutはステップイン・ステップアウトを実現するコマンド。
ステップイン・ステップアウトをしたら、キャプションをかえると同時に、ユーザデータ"pplcaption"にそのパスを保存している。実行時にpplcaptionの中身を確認、中身があればそれを入力欄のパスとつなげて実行する仕組み。FIRSTEVENTはpplcaptionの初期化に使用。
PPx 1.77+5以降とKey Module R5を使うことで、キーバインドの一時変更ができるようになった。これを取り入れると次のようになる。
K_edit = {
FIRSTEVENT , *setcust _User:pplcaption=
}
K_stepio = {
LEFT ,*ifmatch "o:e,a:d",%W %: *stepinout %*name(D,"%W") %: *stop
*ifmatch "o:e,a:d","%*edittext" %: *stepinout %*name(D,"%*edittext") %: *stop
%K"@LEFT"
RIGHT ,*ifmatch 0,0%*edittext %: *stop
*ifmatch "o:e,a:d","%*edittext" %: *stepinout %*edittext %: *stop
*ifmatch "/[a-zA-Z]:\\/",%W %: *stepinout %*name(DC,"%*edittext",%W) %: *stop
%K"@RIGHT"
}
_Command = {
stepinout = *string o,dir=%*arg(1)
*setcaption %so"dir"
*setcust _User:pplcaption=%so"dir"
*script %0\Script\sublist.js,"%so"dir"","%'temp'\list.txt"
*replace ""
*completelist -file:"%'temp'\list.txt"
ppl2 = *string o,exec_command=%*input("" -title:"PPlauncher" -mode:e -k:"*completelist /set /file:%%0l_cmd.txt %%: *mapkey use,K_stepio")
*ifmatch !0,0%*getcust(_User:pplcaption) %: *string o,exec_command=%*name(DC,%so"exec_command",%*getcust(_User:pplcaption))
*ifmatch "o:e,a:d+",%so"exec_command" %: *focus C %: *execute C,*jumppath "%so"exec_command"" %: *stop
*ifmatch "o:e,a:d-",%so"exec_command" %: *execute ,"%so"exec_command"" %: *stop
*execute,%so"exec_command"
}