首页 > 解决方案 > 使用 Mido 获取 Midi-Input 并使用 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 输入,代码不再监听任何 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)

谢谢您的帮助!

标签: pythontkintermidomidi-interface

解决方案


推荐阅读