midi_visualizer / app.py
Next
Update app.py
0bf9c89 verified
raw
history blame
1.74 kB
import gradio as gr
import mido
import matplotlib.pyplot as plt
import numpy as np
import tempfile
from midi2audio import FluidSynth
def midi_to_audio(midi_file):
# Convert MIDI to audio using FluidSynth
fs = FluidSynth()
with tempfile.NamedTemporaryFile(suffix=".wav") as tmp:
fs.midi_to_audio(midi_file.name, tmp.name)
return tmp.read()
def visualize_midi(midi_file):
# Visualize MIDI data (a simple piano roll visualization)
midi = mido.MidiFile(midi_file.name)
notes = []
for msg in midi.play():
if msg.type == 'note_on' and msg.velocity > 0:
notes.append((msg.note, msg.time))
if not notes:
return "No note data found in the MIDI file."
fig, ax = plt.subplots()
notes = np.array(notes)
ax.scatter(notes[:, 1].cumsum(), notes[:, 0])
ax.set_xlabel("Time (s)")
ax.set_ylabel("Note")
ax.set_title("MIDI Note Visualization")
with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as tmp:
plt.savefig(tmp.name)
plt.close(fig)
return tmp.name
def process_midi(file):
audio = midi_to_audio(file)
visualization = visualize_midi(file)
return audio, visualization
with gr.Blocks() as demo:
gr.Markdown("# MIDI Visualizer and Player")
with gr.Row():
with gr.Column():
midi_input = gr.File(label="Upload MIDI File")
play_button = gr.Button("Play and Visualize")
with gr.Column():
midi_audio_output = gr.Audio(label="MIDI Audio")
midi_visualization_output = gr.Image(label="MIDI Visualization")
play_button.click(process_midi, inputs=midi_input, outputs=[midi_audio_output, midi_visualization_output])
demo.launch()