私は現在、プロジェクトに取り組んでいます。私の目標は、MIDI キーボードから入力を取得し、ノート イベントに反応することです。特定のノートのノートオン イベントを取得したら、長方形のキーボードを作成した Tkinter GUI でこれを視覚化したいと考えています。GUI を常に表示したいのですが、たとえば c-note を押すと、c の四角形にドットが付きます。ノートオフイベントを受信したら、ドットを削除したいです。Mac で Big-Sur 11.0.1 と Python 3.9.2 を使用しています。
問題は、TkinterGUI を表示すると同時に、Mido で midi 入力を受け取り、GUI でそれに反応するにはどうすればよいかということです。「klaviatur.py」ファイルをインポートする「keyboardInput.py」ファイルを実行すると、GUI が描画され、Midi 入力が受信されず、コードが midi 入力をリッスンしなくなります。GUI を表示し、同時に MIDI 信号を受信して GUI に「ライブ」で表示するにはどうすればよいですか?
「klaviatur.py」と呼ばれる私のTkinter GUIファイルからの私のコードは次のとおりです。
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)
ここでは、midi 入力を取得して klaviatur.py ファイルをインポートするコード ファイル "keyboardInput.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)
ご協力ありがとうございました!