Могу ли я объединить python mido и pygame для анимации midi-файла? - PullRequest
0 голосов
/ 13 июля 2020

Я работаю над программой python для анимации midi-файла. Midi-файл создается на midi-гитаре. Каждая строка представлена ​​отдельным каналом. Я создал скрипт pygame, который будет отображать кружок на изображении гитары. Я также создал mido-скрипт, который выводит значения нот и каналов в реальном времени. Можно ли их объединить в pygame. Похоже, что вызов mido.play () внутри pygame l oop не является хорошей идеей, он вешает программу. Это код, который я написал, который распечатает midi-файл и распечатает кружок на гитаре в любом месте по вашему выбору. Как мне это сделать?


import pygame
import mido

''' FUNCTION TO PLAY MIDI FILE IT PRINTS THE NOTES HOPEFULLY IT CAN DISPLAY THEM ON GUITAR'''
def play_midi():

        mid = mido.MidiFile('boxingday.mid', clip=True)
        for msg in mid.play():
            if not msg.is_meta:
                if msg.type == 'note_on':
                    print(msg.note)
                    print(msg.channel)
                    #pygame.draw.circle(screen, (0, 0, 255), (fretPos[msg.note - 40], stringPos[msg.channel+1]), 12, 0)
                    #pygame.display.flip()

#play_midi()

# Define some colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)

# start pygame
pygame.init()

# Set the width and height of the screen [width, height]
size = (1500, 500)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("My Game")

# Loop until the user clicks the close button.
done = False

# Used to manage how fast the screen updates
clock = pygame.time.Clock()
'''Open a midi file using mido'''
mid = mido.MidiFile('boxingday.mid', clip=True)
''' get a guitar image'''
gitImg = pygame.image.load('guitar.png')

def guitar(x,y):
    screen.blit(gitImg, (x,y))

# string positions for each string
stringPos = {1: 35, 2: 80 , 3 : 125, 4 : 170, 5: 215, 6 : 260}
# positions for each fret 
fretPos = {1:100, 2: 205, 3 : 305, 4 : 400, 5 : 485, 6 : 570, 7 : 650, 8 : 723, 9 : 790, 10 : 855, \
           11: 920, 12: 978, 13: 1033, 14: 1081 , 15: 1132, 16: 1180, 17: 1225, 18: 1266, 19: 1305,\
           20 : 1343, 21 : 1378, 22 : 1413}
# -------- Main Program Loop -----------
while not done:
    # --- Main event loop
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    screen.fill(BLACK)
    guitar(0, 0)

    #play_midi()

    # --- Go ahead and update the screen with what we've drawn.
    pygame.draw.circle(screen, (0, 0, 255), (fretPos[2], stringPos[2]), 12, 0)
    pygame.display.flip()

    # --- Limit to 60 frames per second
    clock.tick(60)

# Close the window and quit.
pygame.quit()
...