使用 Mido 获取 Midi 输入并使用 Tkinter GUI 做出反应

问题描述

我目前正在做一个项目。我的目标是从我的 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-Inputs,代码不再侦听任何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)

感谢您的帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)