Created
August 16, 2023 13:16
-
-
Save pointofpresence/5c8d7be7893008f10ab1dfac822f4854 to your computer and use it in GitHub Desktop.
Python midi to system
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
pip install rtmidi | |
http://zabaykin.ru/?p=200 | |
""" | |
import time | |
import rtmidi | |
import win32api | |
#import win32clipboard | |
import win32com.client | |
import win32con | |
import win32gui | |
PIANO_NAME = "2- LPMiniMK3 MIDI" | |
# функция клика в определенном месте | |
def click(x, y): | |
# сначала выставляем позицию | |
win32api.SetCursorPos((x, y)) | |
time.sleep(0.2) | |
# а потом кликаем (небольшая задержка для большей человечности) | |
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, x, y, 0, 0) | |
time.sleep(0.3) | |
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, x, y, 0, 0) | |
# данная функция - фильтр по выбору нужного окна (по названию этого окна) | |
def openItNow(hwnd, windowText): | |
if windowText in win32gui.GetWindowText(hwnd): | |
win32gui.SetForegroundWindow(hwnd) | |
# выбираем среди открытых окон то, которое содержит название Notepad | |
# заметьте что используется фильтр, описанный выше | |
# win32gui.EnumWindows(openItNow, '*новый 14 - Notepad++') | |
# нажимать на клавиши будет с помощью shell | |
shell = win32com.client.Dispatch("WScript.Shell") | |
# метод SendKeys программно нажимает на клавиши, поэтому далее записана последовательность нажатий | |
# shell.SendKeys("%") | |
# for i in range(0, 4, 1): | |
# shell.SendKeys("{RIGHT}") | |
# time.sleep(0.1) | |
# shell.SendKeys("{DOWN}") | |
# time.sleep(0.1) | |
# здесь выполняем комбинацию клавиш Alt + 9 | |
# shell.SendKeys("%9") | |
# | |
# а теперь пара кликов | |
# click(300, 700) | |
# | |
# win32clipboard.OpenClipboard() | |
# data = win32clipboard.GetClipboardData() | |
# win32clipboard.CloseClipboard() | |
# | |
# win32clipboard.OpenClipboard() | |
# win32clipboard.SetClipboardData(win32clipboard.CF_UNICODETEXT, 'вапвап 123') | |
# win32clipboard.CloseClipboard() | |
################################################################################################### | |
class MidiSubscriber(): | |
def __init__(self, pianoName): | |
self.midiin = rtmidi.RtMidiIn() | |
self.midiPort = self.__getPort(pianoName) | |
print("Opening port", self.midiPort) | |
self.midiin.openPort(self.midiPort) | |
def run(self): | |
while True: | |
m = self.midiin.getMessage(250) # some timeout in ms | |
if m: | |
if m.isNoteOn(): | |
print('ON: ', m.getMidiNoteName(m.getNoteNumber()), m.getVelocity()) | |
elif m.isNoteOff(): | |
note_name = m.getMidiNoteName(m.getNoteNumber()) | |
print('OFF:', note_name) | |
if note_name == 'B3': | |
click(300, 700) | |
time.sleep(1) | |
shell.SendKeys('^a') | |
time.sleep(1) | |
# win32gui.EnumWindows(openItNow, 'Novation Components') | |
# win32clipboard.OpenClipboard() | |
# win32clipboard.SetClipboardData(win32clipboard.CF_UNICODETEXT, 'вапвап 123') | |
# # win32clipboard.CloseClipboard() | |
# # win32clipboard.OpenClipboard() | |
# data = win32clipboard.GetClipboardData() | |
# win32clipboard.CloseClipboard() | |
# print('data', data) | |
elif m.isController(): | |
print('CONTROLLER', m.getControllerNumber(), m.getControllerValue()) | |
def __getPort(self, pianoName): | |
ports = range(self.midiin.getPortCount()) | |
if ports: | |
pianoPort = None | |
for i in ports: | |
portName = self.midiin.getPortName(i) | |
print(portName) | |
if pianoName in portName: | |
pianoPort = i | |
if pianoPort is None: | |
raise Exception("Piano not found") | |
return pianoPort | |
else: | |
raise Exception("NO MIDI INPUT PORTS!") | |
################################################################################################### | |
midi = MidiSubscriber(PIANO_NAME) | |
midi.run() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment