Spaces:
Sleeping
Sleeping
import gradio as gr | |
import mido | |
import pygame | |
import threading | |
import time | |
# Function to play MIDI | |
def play_midi(file): | |
pygame.midi.init() | |
port = pygame.midi.Output(0) | |
mid = mido.MidiFile(file.name) | |
for msg in mid.play(): | |
if msg.type == 'note_on': | |
port.note_on(msg.note, msg.velocity) | |
elif msg.type == 'note_off': | |
port.note_off(msg.note, msg.velocity) | |
port.close() | |
pygame.midi.quit() | |
# Function to visualize MIDI | |
def visualize_midi(file): | |
mid = mido.MidiFile(file.name) | |
events = [] | |
for track in mid.tracks: | |
for msg in track: | |
if msg.type in ['note_on', 'note_off']: | |
events.append((msg.time, msg.type, msg.note, msg.velocity)) | |
# Create a simple visualization (text-based for this example) | |
visualization = "" | |
current_time = 0 | |
for event in events: | |
current_time += event[0] | |
visualization += f"Time: {current_time}, Type: {event[1]}, Note: {event[2]}, Velocity: {event[3]}\n" | |
return visualization | |
# Gradio interface | |
def midi_interface(file): | |
# Start playing MIDI in a separate thread to avoid blocking | |
threading.Thread(target=play_midi, args=(file,)).start() | |
# Return visualization | |
visualization = visualize_midi(file) | |
return visualization | |
# Gradio blocks | |
with gr.Blocks() as demo: | |
midi_file = gr.File(label="Upload MIDI File") | |
visualization_output = gr.Textbox(label="MIDI Visualization", lines=20) | |
play_btn = gr.Button("Play MIDI and Visualize") | |
play_btn.click(fn=midi_interface, inputs=midi_file, outputs=visualization_output) | |
demo.launch() | |