PCの原始的な通信ともいえるキーボードの入力、つまりキーコードの受信について、最近スイッチとしてのキーボード活用に興味があることから、Pythonの入力装置のライブラリpynputを試してみました。
https://pynput.readthedocs.io/en/latest/
https://buildmedia.readthedocs.org/media/pdf/pynput/latest/pynput.pdf
このライブラリはキーボードだけでなくマウスについても豊富な機能がありますが、ここではキーボードだけを対象にします。
まずは、上記ドキュメントからそのままの引用で、キーのオンオフをプログラムで実行するサンプルに興味を持ちました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
from pynput.keyboard import Key, Controller keyboard = Controller() # Press and release space keyboard.press(Key.space) keyboard.release(Key.space) # Type a lower case A; this will work even if no key on the # physical keyboard is labelled 'A' keyboard.press('a') keyboard.release('a') # Type two upper case As keyboard.press('A') keyboard.release('A') with keyboard.pressed(Key.shift): keyboard.press('a') keyboard.release('a') # Type 'Hello World' using the shortcut keyboard.type('Hello World') |
これを実行すると
” aAAHello World”
このように出力されます。
フォーカスがうつれば、そこに対して入力します。(テキストエディタで確認)
次に、キーコードをMIDIデータとして送信してみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
import time import rtmidi from pynput import keyboard from pynput._util.win32 import VkKeyScan midiout = rtmidi.MidiOut() available_ports = midiout.get_ports() print(available_ports) midiout.open_port(0) def noteon(note): data = [0x90, note, 0x7f] midiout.send_message(data) def noteoff(note): control = [0x90, note, 0x00] midiout.send_message(control) def on_press(key): try: if type(key.char) is str: code = VkKeyScan(key.char) print('{0} On'.format(code)) noteon(code) except AttributeError: print('{0} On'.format(key)) def on_release(key): if key == keyboard.Key.esc: return False try: if type(key.char) is str: code = VkKeyScan(key.char) print('{0} Off'.format(code)) noteoff(code) except AttributeError: print('{0} Off'.format(key)) with keyboard.Listener( on_press=on_press, on_release=on_release) as listener: listener.join() listener = keyboard.Listener( on_press=on_press, on_release=on_release) listener.start() |
環境) Python 3.7.7 / Windows 10
python-rtmidi 1.4.1
pynput 1.7.6
キーコードを取得するには、以下のソースコードよりVkKeyScanを使いました。
https://github.com/moses-palmer/pynput/blob/master/lib/pynput/keyboard/_win32.py
全角キーなどを押したときに例外がでないように、key.charのタイプチェックをしました。
MIDIは内臓ソフトシンセに対して送信します。
[‘Microsoft GS Wavetable Synth 0’]
これもフォーカスがかわっても動作し続けます。
PCキーボードはコンピュータを操作する上で重要なデバイスですので、これを利用して様々なことができそうです。