File size: 3,527 Bytes
d0fbd88
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import sys
import os
import gradio as gr
import json

# Add the path to midigpt
sys.path.append(os.path.dirname(os.getcwd()) + "/python_lib")
import midigpt

def generate_midi(midi_input, ckpt, out, temperature, instrument, density, track_type, polyphony_hard_limit, shuffle, verbose, max_steps, batch_size, percentage, model_dim, mask_top_k, sampling_seed, autoregressive):
    # Save uploaded MIDI file to a temp path
    midi_input_path = midi_input.name
    if out:
        midi_dest = out
    else:
        midi_dest = os.path.join(os.path.split(midi_input_path)[0], 'midigpt_gen.mid')
    e = midigpt.ExpressiveEncoder()
    midi_json_input = json.loads(e.midi_to_json(midi_input_path))
    valid_status = {'tracks': [
        {
            'track_id': 0,
            'temperature': temperature,
            'instrument': instrument,
            'density': density,
            'track_type': track_type,
            'ignore': False,
            'selected_bars': [False, False, True, False],
            'min_polyphony_q': 'POLYPHONY_ANY',
            'max_polyphony_q': 'POLYPHONY_ANY',
            'autoregressive': autoregressive,
            'polyphony_hard_limit': polyphony_hard_limit
        }
    ]}
    parami = {
        'tracks_per_step': 1,
        'bars_per_step': 1,
        'model_dim': model_dim,
        'percentage': percentage,
        'batch_size': batch_size,
        'temperature': temperature,
        'max_steps': max_steps,
        'polyphony_hard_limit': polyphony_hard_limit,
        'shuffle': shuffle,
        'verbose': verbose,
        'ckpt': ckpt,
        'sampling_seed': sampling_seed,
        'mask_top_k': mask_top_k
    }
    piece = json.dumps(midi_json_input)
    status = json.dumps(valid_status)
    param = json.dumps(parami)
    callbacks = midigpt.CallbackManager()
    max_attempts = 3
    midi_str = midigpt.sample_multi_step(piece, status, param, max_attempts, callbacks)[0]
    e = midigpt.ExpressiveEncoder()
    e.json_to_midi(midi_str, midi_dest)
    return midi_dest

def main():
    iface = gr.Interface(
        fn=generate_midi,
        inputs=[
            gr.File(label="Input MIDI File"),
            gr.Textbox(label="Checkpoint Path", value="../models/EXPRESSIVE_ENCODER_RES_1920_12_GIGAMIDI_CKPT_150K.pt"),
            gr.Textbox(label="Output MIDI Path (optional)", value=""),
            gr.Slider(0.0, 2.0, value=0.5, label="Temperature"),
            gr.Textbox(label="Instrument", value="acoustic_grand_piano"),
            gr.Slider(1, 20, value=10, step=1, label="Density"),
            gr.Slider(0, 20, value=10, step=1, label="Track Type"),
            gr.Slider(1, 16, value=9, step=1, label="Polyphony Hard Limit"),
            gr.Checkbox(label="Shuffle", value=True),
            gr.Checkbox(label="Verbose", value=True),
            gr.Slider(1, 1000, value=200, step=1, label="Max Steps"),
            gr.Slider(1, 32, value=1, step=1, label="Batch Size"),
            gr.Slider(1, 100, value=100, step=1, label="Percentage"),
            gr.Slider(1, 32, value=4, step=1, label="Model Dim"),
            gr.Slider(0, 100, value=0, step=1, label="Mask Top K"),
            gr.Number(label="Sampling Seed", value=-1),
            gr.Checkbox(label="Autoregressive", value=False)
        ],
        outputs=gr.File(label="Generated MIDI File"),
        title="MIDI-GPT Generator",
        description="Generate expressive MIDI using MIDI-GPT."
    )
    iface.launch(server_name="0.0.0.0", server_port=7860)

if __name__ == "__main__":
    main()