import gradio as gr import mido import matplotlib.pyplot as plt from pydub import AudioSegment from pydub.playback import play import io def visualize_midi(midi_file): # Load MIDI file mid = mido.MidiFile(midi_file.name) # Prepare to plot plt.figure(figsize=(10, 4)) ticks = [] notes = [] # Extract note and tick data for i, track in enumerate(mid.tracks): time = 0 for msg in track: time += msg.time if not msg.is_meta and msg.type == 'note_on': ticks.append(time) notes.append(msg.note) plt.scatter(ticks, notes, c='blue', marker='o') plt.xlabel('Ticks') plt.ylabel('Note') plt.title('MIDI Visualization') plt.grid(True) # Save plot to a buffer buf = io.BytesIO() plt.savefig(buf, format='png') buf.seek(0) plt.close() return buf def play_midi(midi_file): # Convert MIDI to audio using pydub audio = AudioSegment.from_file(midi_file.name, format='mid') play(audio) return "Playing MIDI..." # Create Gradio blocks interface with gr.Blocks() as demo: midi_input = gr.File(label="Upload MIDI File") midi_visual = gr.Image(type="plot", label="MIDI Visualization") play_button = gr.Button("Play MIDI") midi_input.change(visualize_midi, inputs=midi_input, outputs=midi_visual) play_button.click(play_midi, inputs=midi_input, outputs=None) demo.launch()