Spaces:
Running
on
Zero
Running
on
Zero
Update app.py
Browse files
app.py
CHANGED
|
@@ -5,7 +5,6 @@ import datetime
|
|
| 5 |
from pytz import timezone
|
| 6 |
|
| 7 |
import torch
|
| 8 |
-
import torch.nn.functional as F
|
| 9 |
|
| 10 |
import gradio as gr
|
| 11 |
import spaces
|
|
@@ -18,12 +17,11 @@ from midi_to_colab_audio import midi_to_colab_audio
|
|
| 18 |
|
| 19 |
import matplotlib.pyplot as plt
|
| 20 |
|
| 21 |
-
in_space = os.getenv("SYSTEM") == "spaces"
|
| 22 |
-
|
| 23 |
# =================================================================================================
|
| 24 |
|
| 25 |
@spaces.GPU
|
| 26 |
-
def GenerateMIDI(num_tok, idrums, iinstr):
|
|
|
|
| 27 |
print('=' * 70)
|
| 28 |
print('Req start time: {:%Y-%m-%d %H:%M:%S}'.format(datetime.datetime.now(PDT)))
|
| 29 |
start_time = time.time()
|
|
@@ -32,6 +30,7 @@ def GenerateMIDI(num_tok, idrums, iinstr):
|
|
| 32 |
print('Req num tok:', num_tok)
|
| 33 |
print('Req instr:', iinstr)
|
| 34 |
print('Drums:', idrums)
|
|
|
|
| 35 |
print('-' * 70)
|
| 36 |
|
| 37 |
if idrums:
|
|
@@ -49,35 +48,7 @@ def GenerateMIDI(num_tok, idrums, iinstr):
|
|
| 49 |
print(start_tokens)
|
| 50 |
print('-' * 70)
|
| 51 |
|
| 52 |
-
|
| 53 |
-
output_file_name = 'Allegro-Music-Transformer-Music-Composition'
|
| 54 |
-
track_name = 'Project Los Angeles'
|
| 55 |
-
list_of_MIDI_patches = [0, 24, 32, 40, 42, 46, 56, 71, 73, 0, 53, 19, 0, 0, 0, 0]
|
| 56 |
-
number_of_ticks_per_quarter = 500
|
| 57 |
-
text_encoding = 'ISO-8859-1'
|
| 58 |
-
|
| 59 |
-
output_header = [number_of_ticks_per_quarter,
|
| 60 |
-
[['track_name', 0, bytes(output_signature, text_encoding)]]]
|
| 61 |
-
|
| 62 |
-
patch_list = [['patch_change', 0, 0, list_of_MIDI_patches[0]],
|
| 63 |
-
['patch_change', 0, 1, list_of_MIDI_patches[1]],
|
| 64 |
-
['patch_change', 0, 2, list_of_MIDI_patches[2]],
|
| 65 |
-
['patch_change', 0, 3, list_of_MIDI_patches[3]],
|
| 66 |
-
['patch_change', 0, 4, list_of_MIDI_patches[4]],
|
| 67 |
-
['patch_change', 0, 5, list_of_MIDI_patches[5]],
|
| 68 |
-
['patch_change', 0, 6, list_of_MIDI_patches[6]],
|
| 69 |
-
['patch_change', 0, 7, list_of_MIDI_patches[7]],
|
| 70 |
-
['patch_change', 0, 8, list_of_MIDI_patches[8]],
|
| 71 |
-
['patch_change', 0, 9, list_of_MIDI_patches[9]],
|
| 72 |
-
['patch_change', 0, 10, list_of_MIDI_patches[10]],
|
| 73 |
-
['patch_change', 0, 11, list_of_MIDI_patches[11]],
|
| 74 |
-
['patch_change', 0, 12, list_of_MIDI_patches[12]],
|
| 75 |
-
['patch_change', 0, 13, list_of_MIDI_patches[13]],
|
| 76 |
-
['patch_change', 0, 14, list_of_MIDI_patches[14]],
|
| 77 |
-
['patch_change', 0, 15, list_of_MIDI_patches[15]],
|
| 78 |
-
['track_name', 0, bytes(track_name, text_encoding)]]
|
| 79 |
-
|
| 80 |
-
output = output_header + [patch_list]
|
| 81 |
|
| 82 |
print('Loading model...')
|
| 83 |
|
|
@@ -109,7 +80,7 @@ def GenerateMIDI(num_tok, idrums, iinstr):
|
|
| 109 |
|
| 110 |
print('Done!')
|
| 111 |
print('=' * 70)
|
| 112 |
-
|
| 113 |
|
| 114 |
inp = torch.LongTensor([start_tokens]).cuda()
|
| 115 |
|
|
@@ -122,41 +93,51 @@ def GenerateMIDI(num_tok, idrums, iinstr):
|
|
| 122 |
verbose=False)
|
| 123 |
|
| 124 |
out0 = out[0].tolist()
|
|
|
|
|
|
|
| 125 |
|
| 126 |
ctime = 0
|
| 127 |
-
dur =
|
| 128 |
vel = 90
|
| 129 |
-
pitch =
|
| 130 |
channel = 0
|
| 131 |
|
| 132 |
for ss1 in out0:
|
| 133 |
|
| 134 |
if 0 < ss1 < 256:
|
|
|
|
| 135 |
ctime += ss1 * 8
|
| 136 |
|
| 137 |
if 256 <= ss1 < 1280:
|
|
|
|
| 138 |
dur = ((ss1 - 256) // 8) * 32
|
| 139 |
vel = (((ss1 - 256) % 8) + 1) * 15
|
| 140 |
|
| 141 |
if 1280 <= ss1 < 2816:
|
|
|
|
| 142 |
channel = (ss1 - 1280) // 128
|
| 143 |
pitch = (ss1 - 1280) % 128
|
| 144 |
|
| 145 |
if channel != 9:
|
| 146 |
-
pat =
|
| 147 |
else:
|
| 148 |
pat = 128
|
| 149 |
|
| 150 |
event = ['note', ctime, dur, channel, pitch, vel, pat]
|
| 151 |
|
| 152 |
-
output
|
| 153 |
|
| 154 |
-
|
|
|
|
| 155 |
|
| 156 |
-
|
| 157 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 158 |
|
| 159 |
-
output_plot = TMIDIX.plot_ms_SONG(output
|
| 160 |
|
| 161 |
audio = midi_to_colab_audio('Allegro-Music-Transformer-Composition.mid',
|
| 162 |
soundfont_path="SGM-v2.01-YamahaGrand-Guit-Bass-v2.7.sf2",
|
|
@@ -184,8 +165,11 @@ if __name__ == "__main__":
|
|
| 184 |
print('=' * 70)
|
| 185 |
|
| 186 |
app = gr.Blocks()
|
|
|
|
| 187 |
with app:
|
|
|
|
| 188 |
gr.Markdown("<h1 style='text-align: center; margin-bottom: 1rem'>Allegro Music Transformer</h1>")
|
|
|
|
| 189 |
gr.Markdown(
|
| 190 |
"\n\n"
|
| 191 |
"Full-attention multi-instrumental music transformer featuring asymmetrical encoding with octo-velocity, and chords counters tokens, optimized for speed and performance\n\n"
|
|
@@ -200,6 +184,7 @@ if __name__ == "__main__":
|
|
| 200 |
["Piano", "Guitar", "Bass", "Violin", "Cello", "Harp", "Trumpet", "Sax", "Flute", "Choir", "Organ"],
|
| 201 |
value="Piano", label="Lead Instrument Controls", info="Desired lead instrument")
|
| 202 |
input_drums = gr.Checkbox(label="Add Drums", value=False, info="Add drums to the composition")
|
|
|
|
| 203 |
input_num_tokens = gr.Slider(16, 1024, value=512, label="Number of Tokens", info="Number of tokens to generate")
|
| 204 |
|
| 205 |
run_btn = gr.Button("generate", variant="primary")
|
|
@@ -207,6 +192,7 @@ if __name__ == "__main__":
|
|
| 207 |
output_audio = gr.Audio(label="output audio", format="mp3", elem_id="midi_audio")
|
| 208 |
output_plot = gr.Plot(label='output plot')
|
| 209 |
output_midi = gr.File(label="output midi", file_types=[".mid"])
|
| 210 |
-
|
|
|
|
| 211 |
[output_plot, output_midi, output_audio])
|
| 212 |
app.queue().launch()
|
|
|
|
| 5 |
from pytz import timezone
|
| 6 |
|
| 7 |
import torch
|
|
|
|
| 8 |
|
| 9 |
import gradio as gr
|
| 10 |
import spaces
|
|
|
|
| 17 |
|
| 18 |
import matplotlib.pyplot as plt
|
| 19 |
|
|
|
|
|
|
|
| 20 |
# =================================================================================================
|
| 21 |
|
| 22 |
@spaces.GPU
|
| 23 |
+
def GenerateMIDI(num_tok, idrums, iinstr, input_align):
|
| 24 |
+
|
| 25 |
print('=' * 70)
|
| 26 |
print('Req start time: {:%Y-%m-%d %H:%M:%S}'.format(datetime.datetime.now(PDT)))
|
| 27 |
start_time = time.time()
|
|
|
|
| 30 |
print('Req num tok:', num_tok)
|
| 31 |
print('Req instr:', iinstr)
|
| 32 |
print('Drums:', idrums)
|
| 33 |
+
print('Align:', input_align)
|
| 34 |
print('-' * 70)
|
| 35 |
|
| 36 |
if idrums:
|
|
|
|
| 48 |
print(start_tokens)
|
| 49 |
print('-' * 70)
|
| 50 |
|
| 51 |
+
output = []
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
|
| 53 |
print('Loading model...')
|
| 54 |
|
|
|
|
| 80 |
|
| 81 |
print('Done!')
|
| 82 |
print('=' * 70)
|
| 83 |
+
print('Generating...')
|
| 84 |
|
| 85 |
inp = torch.LongTensor([start_tokens]).cuda()
|
| 86 |
|
|
|
|
| 93 |
verbose=False)
|
| 94 |
|
| 95 |
out0 = out[0].tolist()
|
| 96 |
+
|
| 97 |
+
patches = [0, 24, 32, 40, 42, 46, 56, 71, 73, 0, 53, 19, 0, 0, 0, 0]
|
| 98 |
|
| 99 |
ctime = 0
|
| 100 |
+
dur = 1
|
| 101 |
vel = 90
|
| 102 |
+
pitch = 60
|
| 103 |
channel = 0
|
| 104 |
|
| 105 |
for ss1 in out0:
|
| 106 |
|
| 107 |
if 0 < ss1 < 256:
|
| 108 |
+
|
| 109 |
ctime += ss1 * 8
|
| 110 |
|
| 111 |
if 256 <= ss1 < 1280:
|
| 112 |
+
|
| 113 |
dur = ((ss1 - 256) // 8) * 32
|
| 114 |
vel = (((ss1 - 256) % 8) + 1) * 15
|
| 115 |
|
| 116 |
if 1280 <= ss1 < 2816:
|
| 117 |
+
|
| 118 |
channel = (ss1 - 1280) // 128
|
| 119 |
pitch = (ss1 - 1280) % 128
|
| 120 |
|
| 121 |
if channel != 9:
|
| 122 |
+
pat = patches[channel]
|
| 123 |
else:
|
| 124 |
pat = 128
|
| 125 |
|
| 126 |
event = ['note', ctime, dur, channel, pitch, vel, pat]
|
| 127 |
|
| 128 |
+
output.append(event)
|
| 129 |
|
| 130 |
+
if input_align:
|
| 131 |
+
output = TMIDIX.align_escore_notes_to_bars(output)
|
| 132 |
|
| 133 |
+
detailed_stats = TMIDIX.Tegridy_ms_SONG_to_MIDI_Converter(output,
|
| 134 |
+
output_signature = 'Allegro Music Transformer',
|
| 135 |
+
output_file_name = 'Allegro-Music-Transformer-Composition',
|
| 136 |
+
track_name='Project Los Angeles',
|
| 137 |
+
list_of_MIDI_patches=patches
|
| 138 |
+
)
|
| 139 |
|
| 140 |
+
output_plot = TMIDIX.plot_ms_SONG(output, plot_title='Allegro-Music-Transformer-Composition', return_plt=True)
|
| 141 |
|
| 142 |
audio = midi_to_colab_audio('Allegro-Music-Transformer-Composition.mid',
|
| 143 |
soundfont_path="SGM-v2.01-YamahaGrand-Guit-Bass-v2.7.sf2",
|
|
|
|
| 165 |
print('=' * 70)
|
| 166 |
|
| 167 |
app = gr.Blocks()
|
| 168 |
+
|
| 169 |
with app:
|
| 170 |
+
|
| 171 |
gr.Markdown("<h1 style='text-align: center; margin-bottom: 1rem'>Allegro Music Transformer</h1>")
|
| 172 |
+
|
| 173 |
gr.Markdown(
|
| 174 |
"\n\n"
|
| 175 |
"Full-attention multi-instrumental music transformer featuring asymmetrical encoding with octo-velocity, and chords counters tokens, optimized for speed and performance\n\n"
|
|
|
|
| 184 |
["Piano", "Guitar", "Bass", "Violin", "Cello", "Harp", "Trumpet", "Sax", "Flute", "Choir", "Organ"],
|
| 185 |
value="Piano", label="Lead Instrument Controls", info="Desired lead instrument")
|
| 186 |
input_drums = gr.Checkbox(label="Add Drums", value=False, info="Add drums to the composition")
|
| 187 |
+
input_align = gr.Checkbox(label="Align output to bars", value=False, info="Align output to bars")
|
| 188 |
input_num_tokens = gr.Slider(16, 1024, value=512, label="Number of Tokens", info="Number of tokens to generate")
|
| 189 |
|
| 190 |
run_btn = gr.Button("generate", variant="primary")
|
|
|
|
| 192 |
output_audio = gr.Audio(label="output audio", format="mp3", elem_id="midi_audio")
|
| 193 |
output_plot = gr.Plot(label='output plot')
|
| 194 |
output_midi = gr.File(label="output midi", file_types=[".mid"])
|
| 195 |
+
|
| 196 |
+
run_event = run_btn.click(GenerateMIDI, [input_num_tokens, input_drums, input_instrument, input_align],
|
| 197 |
[output_plot, output_midi, output_audio])
|
| 198 |
app.queue().launch()
|