我目前正在做一个项目。我的目标是从我的 MIDI 键盘获取输入并对音符事件做出反应。当我收到特定注释的注释事件时,我想在我的 Tkinter GUI 上可视化它,我在其上创建了一个带有矩形的键盘。我希望 GUI 一直显示,当我按下任何 c-note 时,我希望 c 矩形被标记为一个点。当我收到 note-off 事件时,我想删除点。我在 Mac 和 Python 3.9.2 上使用 Big-Sur 11.0.1。
问题是:如何在显示 TkinterGUI 的同时使用 Mido 接收 midi 输入并在 GUI 中对其做出反应。当我运行导入“klaviatur.py”文件的“keyboardInput.py”文件时,GUI 被绘制并且没有收到 Midi 输入,代码不再监听任何 midi 输入。如何在显示 GUI 的同时接收 midi 信号以在我的 GUI 上“实时”显示它们?
这是我的 Tkinter GUI 文件中的代码,名为“klaviatur.py”:
from tkinter import *
root = Tk()
root.title("It's alive!")
root.geometry('1200x600+0+0')
root.configure(background = 'gray')
canvas = Canvas(root, width=width, height=height)
canvas.pack()
note_C = Note((x1, y1, x2, y2), colorWhite)
dot_C = Dot((dotx1, doty1, dotx2, doty2), colordot)
note_C.draw(canvas)
def drawDot_C():
dot_C.draw(canvas)
这里是代码文件“keyboardInput.py”,它获取 midi 输入并导入 klaviatur.py 文件:
import klaviatur
import pygame
import pygame.midi
import time
import mido
def makeNumberToNote(notenumber):
if notenumber == 36:
note = 'f'
print('note is ' + note)
# klaviatur.drawDot_F()
#klaviatur.dot_F.draw(klaviatur.canvas)
inputs = mido.get_input_names() # hol dir eine Liste mit allen Midi-Geräten, die angeschlossen sind
#print(inputs)
with mido.open_input(inputs[0]) as p: # hier die [1] mit dem richtigen Gerät ersetzen
for msg in p:
#print(msg) # gibt alle Midi-Events aus
if not msg.is_meta:
print(msg.note)
print(msg.type)
if msg.type =='note_on':
print("note on is the type")
makeNumberToNote(msg.note)
谢谢您的帮助!