Spaces:
Sleeping
Sleeping
| 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() | |