Skip to content

Instantly share code, notes, and snippets.

@siedentop
Last active August 17, 2020 00:33
Show Gist options
  • Save siedentop/c761c375ba87e094f6d494e28f0401d9 to your computer and use it in GitHub Desktop.
Save siedentop/c761c375ba87e094f6d494e28f0401d9 to your computer and use it in GitHub Desktop.
Midi Keyboard as Computer Keyboard. Upper case through pressing faster.
#!/usr/bin/env python3
""" MIDI Keyboard as a computer keyboard, where fast-presses generate upper
case letters.
Proof of concept.
This program is free software: you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, either version 3 of the License, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
this program. If not, see <http://www.gnu.org/licenses/>.
"""
__author__ = "Christoph Siedentop"
__copyright__ = "Copyright 2020, Christoph Siedentop"
__date__ = "2020-08-16"
__license__ = "GPLv3"
import mido
from pynput.keyboard import Key, Controller
from contextlib import nullcontext
inputs = mido.get_input_names()
inport = mido.open_input(inputs[1])
keyboard = Controller()
DICT = {
45: "a",
47: "b",
48: "c",
50: "d",
52: "e",
53: "f",
55: "g",
57: "h",
59: "i",
60: "j",
62: "k",
64: "l",
66: "m",
67: "n",
69: "o",
71: "p",
72: "q",
74: "r",
76: "s",
77: "t",
79: "u",
80: "v",
81: "w",
82: "x",
83: "y",
84: "z",
39: Key.enter,
38: Key.backspace,
36: " ",
54: ".",
56: ",",
58: "!",
}
def note2char(note):
return DICT.get(note, "?")
while True:
msg = inport.receive()
if msg.type == "note_on":
char = note2char(msg.note)
# Type upper case letters (i.e. hold down Shift) if velocity is high.
if msg.velocity > 70:
modifier_context = keyboard.pressed(Key.shift)
else:
modifier_context = nullcontext()
with modifier_context:
keyboard.press(char)
keyboard.release(char)
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
black = "*"
[packages]
py-midi = "*"
mido = "*"
rtmidi = "*"
python-rtmidi = "*"
pynput = "*"
[requires]
python_version = "3.8"
[pipenv]
allow_prereleases = true
{
"_meta": {
"hash": {
"sha256": "f7afefe462dd14efe7161eb792b94bc3d071993ecaf084ca9797f5f594035c93"
},
"pipfile-spec": 6,
"requires": {
"python_version": "3.8"
},
"sources": [
{
"name": "pypi",
"url": "https://pypi.org/simple",
"verify_ssl": true
}
]
},
"default": {
"mido": {
"hashes": [
"sha256:c4a7d5528fefa3d3dcaa2056d4bc873e2c96a395658d15af5a89c8c3fa7c7acc",
"sha256:fc6364efa028c8405166f63e6a83cbc6c17aaeac2c28680abe64ae48703a89dd"
],
"index": "pypi",
"version": "==1.2.9"
},
"py-midi": {
"hashes": [
"sha256:3bbc896f4bd7ee55e595a2300e173e95522c87964f3acbee705a3d160bfdeac6"
],
"index": "pypi",
"version": "==2.0.1"
},
"pynput": {
"hashes": [
"sha256:42d6d58abe401a4c98ea04e443e61f74b6b0f97672f42042f566c68700ad0c65",
"sha256:68c1863d6a1520b44b6a915e866cbfa1b8d127aef9289f25183c93e28ee5049a",
"sha256:dffcf42299aa25248d1a508b14f988b3a55aad8afbf42dfa3a8f259cd96bb15b"
],
"index": "pypi",
"version": "==1.6.8"
},
"pyobjc-core": {
"hashes": [
"sha256:38e7b15a042439dadd18b28b78229e52fb882460fc16ddbae342b9972d5a827c",
"sha256:47a89171d218905dbf13011b1a7d698c246cb66fb5f14119bc0d9e039d0486fa",
"sha256:60d0c57de915b6ed91a9a26e3bdefdcaeb1288623c69f291338208c5a227d190",
"sha256:73938398559b718595076fce4921022f21983dd85ebace3ecbe6182697abe164",
"sha256:be312b7a0edb45dd8ea68e70f2b411b59677d4ceb513c48eace73cb78dbfd85f"
],
"markers": "python_version >= '3.6'",
"version": "==6.2.2"
},
"pyobjc-framework-cocoa": {
"hashes": [
"sha256:2a5ab2e33cafe577592c31b2663f3b23f6e142fd717c8cf3826394a380cc4353",
"sha256:45e3011efbd8ab4eb4c7ee1f55a8b5ecb41cf66fa797aff0e9454060781645a0",
"sha256:6f5e1d59f6e1f4be40dedf051925b8d90c561657c9ec2453652af033fe5c2bf0",
"sha256:75821b98fb789d240bea7034c4f96396b2eac3e7b02428b4be9101fc899b7fc3",
"sha256:779299f73b8b5a1dd0973b3b16bd706e1f67df44edfb3f3ca6e5e873591c0efc"
],
"markers": "python_version >= '3.6'",
"version": "==6.2.2"
},
"pyobjc-framework-quartz": {
"hashes": [
"sha256:15f3c7b50d0543f66b927e28cd336c1a6962d58c9808799f49dcf30e4a1a13c2",
"sha256:552b15eb409f87d34870345feabe6695375a031d8c4063f175dbaa3422005160",
"sha256:56d183dc32b11f15ceb0833a2a24953d1212264f07c274e2b8878e691eb72472",
"sha256:5a56cfc0289061eaf33f04e3c73e749e04f177b0c1ee8749aa46e87d1e897cda",
"sha256:a57c7f50286d96ee7b9051c657a8607f0449949891cf0697be3efac76a97be7e"
],
"markers": "sys_platform == 'darwin'",
"version": "==6.2.2"
},
"pyserial": {
"hashes": [
"sha256:6e2d401fdee0eab996cf734e67773a0143b932772ca8b42451440cfed942c627",
"sha256:e0770fadba80c31013896c7e6ef703f72e7834965954a78e71a3049488d4d7d8"
],
"version": "==3.4"
},
"python-rtmidi": {
"hashes": [
"sha256:18242e894b2695711a09451e119cee3084132b00248106d36afd8ea0ef972d32",
"sha256:2200684eec87050bca57d8dd9db1a2fa8e49894119757a8cf85c2275d2ed32aa",
"sha256:497d008b3ddd80c680a08ed3c9d5b513fa4ff4bda189909cac5e1b784db94885",
"sha256:4aa5d8109dc5231cd93df85556e2817bfc1612ed473140317d69efccfcc09bb6",
"sha256:4dc75160fe0805a1e16333ce42edae7332ac81f14e4766dbf9b511fd8e852555",
"sha256:511af06cc36eac4e618ae89fc83e2c63e526b2819ec6016815ca36faaf0f9a13",
"sha256:7bb59bbb12defa28eeb02f48406a92e8c4f58b709effcd23f38c6296f8e081e1",
"sha256:7c729ec356d5a0f4ba08cb53a99d60585d3a4094d15a89e4f3bb6e570e84d5a6",
"sha256:7f4bbcd77431917503d6ae738093c8419ed67812d50883fa9cfefce1eb21eb3a",
"sha256:81f79b544a16dc5875e8bacc426fe89a2a01719ee533dc5ab6c123241ebd7341",
"sha256:ac2a950fb760783d8316e4e4534af4d37a78fc672ee43c6e4666ca4ed62363ca",
"sha256:bf4e5f7813959ce63d8abfddba7f4a3af944376abd12a4c965e015f9f0aabfc8"
],
"index": "pypi",
"version": "==1.4.3"
},
"rtmidi": {
"hashes": [
"sha256:f1ffd73d6571e6ce2769d77e247523738605a71c32d8f60b56a3b41002d0d54c"
],
"index": "pypi",
"version": "==2.3.4"
},
"six": {
"hashes": [
"sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259",
"sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==1.15.0"
}
},
"develop": {
"appdirs": {
"hashes": [
"sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41",
"sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"
],
"version": "==1.4.4"
},
"attrs": {
"hashes": [
"sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c",
"sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==19.3.0"
},
"black": {
"hashes": [
"sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b",
"sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"
],
"index": "pypi",
"version": "==19.10b0"
},
"click": {
"hashes": [
"sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a",
"sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
"version": "==7.1.2"
},
"pathspec": {
"hashes": [
"sha256:7d91249d21749788d07a2d0f94147accd8f845507400749ea19c1ec9054a12b0",
"sha256:da45173eb3a6f2a5a487efba21f050af2b41948be6ab52b6a1e3ff22bb8b7061"
],
"version": "==0.8.0"
},
"regex": {
"hashes": [
"sha256:0dc64ee3f33cd7899f79a8d788abfbec168410be356ed9bd30bbd3f0a23a7204",
"sha256:1269fef3167bb52631ad4fa7dd27bf635d5a0790b8e6222065d42e91bede4162",
"sha256:14a53646369157baa0499513f96091eb70382eb50b2c82393d17d7ec81b7b85f",
"sha256:3a3af27a8d23143c49a3420efe5b3f8cf1a48c6fc8bc6856b03f638abc1833bb",
"sha256:46bac5ca10fb748d6c55843a931855e2727a7a22584f302dd9bb1506e69f83f6",
"sha256:4c037fd14c5f4e308b8370b447b469ca10e69427966527edcab07f52d88388f7",
"sha256:51178c738d559a2d1071ce0b0f56e57eb315bcf8f7d4cf127674b533e3101f88",
"sha256:5ea81ea3dbd6767873c611687141ec7b06ed8bab43f68fad5b7be184a920dc99",
"sha256:6961548bba529cac7c07af2fd4d527c5b91bb8fe18995fed6044ac22b3d14644",
"sha256:75aaa27aa521a182824d89e5ab0a1d16ca207318a6b65042b046053cfc8ed07a",
"sha256:7a2dd66d2d4df34fa82c9dc85657c5e019b87932019947faece7983f2089a840",
"sha256:8a51f2c6d1f884e98846a0a9021ff6861bdb98457879f412fdc2b42d14494067",
"sha256:9c568495e35599625f7b999774e29e8d6b01a6fb684d77dee1f56d41b11b40cd",
"sha256:9eddaafb3c48e0900690c1727fba226c4804b8e6127ea409689c3bb492d06de4",
"sha256:bbb332d45b32df41200380fff14712cb6093b61bd142272a10b16778c418e98e",
"sha256:bc3d98f621898b4a9bc7fecc00513eec8f40b5b83913d74ccb445f037d58cd89",
"sha256:c11d6033115dc4887c456565303f540c44197f4fc1a2bfb192224a301534888e",
"sha256:c50a724d136ec10d920661f1442e4a8b010a4fe5aebd65e0c2241ea41dbe93dc",
"sha256:d0a5095d52b90ff38592bbdc2644f17c6d495762edf47d876049cfd2968fbccf",
"sha256:d6cff2276e502b86a25fd10c2a96973fdb45c7a977dca2138d661417f3728341",
"sha256:e46d13f38cfcbb79bfdb2964b0fe12561fe633caf964a77a5f8d4e45fe5d2ef7"
],
"version": "==2020.7.14"
},
"toml": {
"hashes": [
"sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f",
"sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"
],
"version": "==0.10.1"
},
"typed-ast": {
"hashes": [
"sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355",
"sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919",
"sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa",
"sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652",
"sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75",
"sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01",
"sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d",
"sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1",
"sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907",
"sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c",
"sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3",
"sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b",
"sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614",
"sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb",
"sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b",
"sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41",
"sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6",
"sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34",
"sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe",
"sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4",
"sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"
],
"version": "==1.4.1"
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment