背景と課題
ギターの練習をしながらPCで本や漫画を読みたい、でも実際やってみるとページをめくるのに手を止めないといけないのでエクスペリエンスはイマイチ…という経験があるのは筆者だけではあるまい。この課題をクリアするため、筆者は以前 Tobii EyeX というアイトラッカーを使って視線によるページめくりシステムを実現・使用していたが、諸事情により現在は退役している。何か楽に作れる代替手段はないだろうか?
ソリューション
辺りを見回すと、おお、筆者のPCには常時MIDIキーボードが接続されており、そのキーボードにはサスティンペダルとしてフットスイッチが繋がれている。このペダルを踏んだらページがめくられるようにスクリプトでも書けば、ギターを弾く手を止めずに次々と漫画のページをめくれるではないか。まっ/たく/簡/単/だ。
やりようはいくらでもあるはずだが、調べるのも面倒なので、ChatGPT様に「MIDIデバイス上でサスティンペダルが踏まれたらスペースキーをインジェクトするPythonコード」とか言ってみる。洗練されてはいないが一応動くものを出して来るので、何度か質問を変えたりregenerateを繰り返し、選択肢がだいたいわかったら自分で書き直してこんなふうに仕立てる。(ChatGPT様は場当たり的かつ平気で嘘をつくので当然そのまま使ったりはしない。)
import sys
import mido
import keyboard
def inject_key_on_sustain(device_name, key):
try:
with mido.open_input(device_name) as midi_in:
print(f"MIDI device: {device_name}")
print(f"Key: {key}")
for message in midi_in:
if message.type == 'control_change' and message.control == 64 and message.value >= 64:
keyboard.press_and_release(key)
except OSError as e:
print(f"An error occurred: {e}");
print(f"Available devices: {mido.get_input_names()}")
if __name__ == "__main__":
inject_key_on_sustain(sys.argv[1], sys.argv[2])
この時点では監視対象のMIDIデバイスとインジェクトされるキーはオープン(パラメタで指定可能)にしてあるので、次のようなバッチファイルを作り、アイコンのクリックで実行できるようにしておく。これはページめくりにスペースキーを用いるビューワー用であるが、ページめくりキーが異なるビューワーを使う場合、別のバッチファイルを作成して実行時に自分で選択すればよい。
python.exe inject_key_on_sustain.py "Keystation 49 MK3 0" space
pause
これでめでたしである。
車輪の再発明上等!
実を言うとこのソリューション自体、ノウハウとして共有するほど大層なものではないと思っているのだが、このようなちょっとした課題の解き方について思うところがあるので書いてみた次第である。
「自分がその課題に取り組んだことのある最初の人類でない限り、既にどこかの誰かがノウハウや実装を公開していると思え」というのは近年のソフトウェアエンジニアリング界隈のトレンドである。今回のように「MIDI入力をキー入力に変換する」といったシンプルでありきたりな課題については特に、「誰かが既に作ったものを使う方が効率よい、こんなことにわざわざコードを書くなんて馬鹿げている」と考える人もいるだろう。実際 https://midikey2key.de/ のようなGUIツールが存在し、これを使えばコードを書かずに同じことが実現できたはずである。
では何故筆者はその「どこかの誰かが既に公開してくれたツール」を使わずにコードを書いたのか?それは、そんなツールをダウンロードし、インストールし、マニュアルを読み、使い方を覚え、自分の目的に合っているかどうか評価するというツールを使うこと自体に対する時間と労力の投資がその場限りであり、その後得られるリターンが何もないからである。一方自分でコードを書けば、軽い筋トレになり、将来自分が使うツールボックスの中身が増え、また今流行のGenerative AIの使い方の研究にもなる、と特に長い目で見たときに効くメリットが数多く得られる。
つまり、課題解決という機会があったときに、自分でコードを書くのは自分に対して投資すること、他者の解を使うのはその解に対して投資すること、だと考えられる。「既にあるから」という理由だけで自分への投資をやめて他者に投資する、というのは果たして合理的だろうか、ということはよく考えた方がよい。