Skip to content

Instantly share code, notes, and snippets.

@pointofpresence
Created August 16, 2023 13:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pointofpresence/5c8d7be7893008f10ab1dfac822f4854 to your computer and use it in GitHub Desktop.
Save pointofpresence/5c8d7be7893008f10ab1dfac822f4854 to your computer and use it in GitHub Desktop.
Python midi to system
"""
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