File size: 1,443 Bytes
c00f836
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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()