-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathshell.py
executable file
·50 lines (42 loc) · 1.2 KB
/
shell.py
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
#!/usr/bin/env python3
import asyncio
import mido
import itertools
from threading import Thread
import readchar
in_port = mido.open_input("Digital Keyboard:Digital Keyboard MIDI 1 24:0")
out_port = mido.open_output("Digital Keyboard:Digital Keyboard MIDI 1 24:0")
def got_message(message):
if message.dict()["type"] != "sysex":
return
data = message.dict()["data"]
if len(data) < 9:
return
payload = data[7:]
# print(payload)
s = ""
for hi, lo in zip(payload[0::2], payload[1::2]):
c = chr((hi << 4) | lo)
if c == '\r':
c = '\n'
s += c
print(s, end="", flush=True)
in_port.callback = got_message
def send_str(s):
payload = [[(ord(c) >> 4) & 0xf, ord(c) & 0xf] for c in s]
payload = list(itertools.chain(*payload))
out_port.send(mido.Message("sysex", data=[0x43, 0x73, 0x01, 0x52, 0x19, 0x00, 0x00] + payload))
def poll_input():
while True:
key = readchar.readchar()
if key:
if key == '\n':
key = '\r'
elif key == chr(3):
return
send_str(key)
async def main():
t = Thread(target=poll_input)
t.run()
t.join()
asyncio.run(main())