Spaces:
Running
on
Zero
Running
on
Zero
File size: 8,085 Bytes
b6bb234 498b808 b6bb234 c58641e b6bb234 799558e c58641e 799558e 11f0dcb b6bb234 498b808 b6bb234 11f0dcb c58641e b6bb234 11f0dcb c58641e 11f0dcb af57922 11f0dcb 95675e7 b6bb234 6f88bb6 ffd3c58 b903d50 dbe3ea6 6f88bb6 aad9254 b6bb234 498b808 bbf9a0d 498b808 b6bb234 c58641e 347667d e84a56c b6bb234 65c1eaa b6bb234 c58641e 823b615 b6bb234 |
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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 |
import argparse
import glob
import os.path
import torch
import torch.nn.functional as F
import gradio as gr
from x_transformer import *
import tqdm
from midi_synthesizer import synthesis
import TMIDIX
import matplotlib.pyplot as plt
in_space = os.getenv("SYSTEM") == "spaces"
#=================================================================================================
@torch.no_grad()
def GenerateMIDI(num_tok, idrums, iinstr, progress=gr.Progress()):
print('=' * 70)
print('Req num tok', num_tok)
print('Req instr', iinstr)
print('Drums', idrums)
print('=' * 70)
if idrums:
drums = 3074
else:
drums = 3073
instruments_list = ["Piano", "Guitar", "Bass", "Violin", "Cello", "Harp", "Trumpet", "Sax", "Flute", 'Drums', "Choir", "Organ"]
first_note_instrument_number = instruments_list.index(iinstr)
start_tokens = [3087, drums, 3075+first_note_instrument_number]
print('Selected Improv sequence:')
print(start_tokens)
print('=' * 70)
outy = start_tokens
for i in progress.tqdm(range(num_tok)):
inp = torch.LongTensor([outy]).cpu()
out = model.module.generate(inp,
1,
temperature=0.9,
return_prime=False,
verbose=False)
out0 = out[0].tolist()
outy.extend(out0)
melody_chords_f = outy
print('Sample INTs', melody_chords_f[:12])
print('=' * 70)
if len(melody_chords_f) != 0:
song = melody_chords_f
song_f = []
time = 0
dur = 0
vel = 0
pitch = 0
channel = 0
for ss in song:
ss1 = int(ss)
if ss1 > 0 and ss1 < 256:
time += ss1 * 8
if ss1 >= 256 and ss1 < 1280:
dur = ((ss1-256) // 8) * 32
vel = (((ss1-256) % 8)+1) * 15
if ss1 >= 1280 and ss1 < 2816:
channel = (ss1-1280) // 128
pitch = (ss1-1280) % 128
song_f.append(['note', int(time), int(dur), int(channel), int(pitch), int(vel) ])
output_signature = 'Allegro Music Transformer'
output_file_name = 'Allegro-Music-Transformer-Music-Composition'
track_name='Project Los Angeles'
list_of_MIDI_patches=[0, 24, 32, 40, 42, 46, 56, 71, 73, 0, 53, 19, 0, 0, 0, 0]
number_of_ticks_per_quarter=500
text_encoding='ISO-8859-1'
output_header = [number_of_ticks_per_quarter,
[['track_name', 0, bytes(output_signature, text_encoding)]]]
patch_list = [['patch_change', 0, 0, list_of_MIDI_patches[0]],
['patch_change', 0, 1, list_of_MIDI_patches[1]],
['patch_change', 0, 2, list_of_MIDI_patches[2]],
['patch_change', 0, 3, list_of_MIDI_patches[3]],
['patch_change', 0, 4, list_of_MIDI_patches[4]],
['patch_change', 0, 5, list_of_MIDI_patches[5]],
['patch_change', 0, 6, list_of_MIDI_patches[6]],
['patch_change', 0, 7, list_of_MIDI_patches[7]],
['patch_change', 0, 8, list_of_MIDI_patches[8]],
['patch_change', 0, 9, list_of_MIDI_patches[9]],
['patch_change', 0, 10, list_of_MIDI_patches[10]],
['patch_change', 0, 11, list_of_MIDI_patches[11]],
['patch_change', 0, 12, list_of_MIDI_patches[12]],
['patch_change', 0, 13, list_of_MIDI_patches[13]],
['patch_change', 0, 14, list_of_MIDI_patches[14]],
['patch_change', 0, 15, list_of_MIDI_patches[15]],
['track_name', 0, bytes(track_name, text_encoding)]]
output = output_header + [patch_list + song_f]
midi_data = TMIDIX.score2midi(output, text_encoding)
with open(f"Allegro-Music-Transformer-Music-Composition.mid", 'wb') as f:
f.write(midi_data)
output1 = []
itrack = 1
opus = TMIDIX.score2opus(output)
while itrack < len(opus):
for event in opus[itrack]:
if (event[0] == 'note_on') or (event[0] == 'note_off'):
output1.append(event)
itrack += 1
audio = synthesis([500, output1], 'SGM-v2.01-YamahaGrand-Guit-Bass-v2.7.sf2')
x = []
y =[]
c = []
colors = ['red', 'yellow', 'green', 'cyan', 'blue', 'pink', 'orange', 'purple', 'gray', 'white', 'gold', 'silver']
for s in song_f:
x.append(s[1] / 1000)
y.append(s[4])
c.append(colors[s[3]])
plt.close()
plt.figure(figsize=(14,5))
ax=plt.axes(title='Allegro Music Transformer Composition')
ax.set_facecolor('black')
plt.scatter(x,y, c=c)
plt.xlabel("Time")
plt.ylabel("Pitch")
yield [500, output1], plt, "Allegro-Music-Transformer-Music-Composition.mid", (44100, audio)
#=================================================================================================
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("--share", action="store_true", default=False, help="share gradio app")
parser.add_argument("--port", type=int, default=7860, help="gradio server port")
opt = parser.parse_args()
print('Loading model...')
SEQ_LEN = 2048
# instantiate the model
model = TransformerWrapper(
num_tokens = 3088,
max_seq_len = SEQ_LEN,
attn_layers = Decoder(dim = 1024, depth = 32, heads = 8)
)
model = AutoregressiveWrapper(model)
model = torch.nn.DataParallel(model)
model.cpu()
print('=' * 70)
print('Loading model checkpoint...')
model.load_state_dict(torch.load('Allegro_Music_Transformer_Small_Trained_Model_56000_steps_0.9399_loss_0.7374_acc.pth', map_location='cpu'))
print('=' * 70)
model.eval()
print('Done!')
app = gr.Blocks()
with app:
gr.Markdown("<h1 style='text-align: center; margin-bottom: 1rem'>Allegro Music Transformer</h1>")
gr.Markdown("![Visitors](https://api.visitorbadge.io/api/visitors?path=asigalov61.Allegro-Music-Transformer&style=flat)\n\n"
"Full-attention multi-instrumental music transformer featuring asymmetrical encoding with octo-velocity, and chords counters tokens, optimized for speed and performance\n\n"
"Check out [Allegro Music Transformer](https://github.com/asigalov61/Allegro-Music-Transformer) on GitHub!\n\n"
"[Open In Colab]"
"(https://colab.research.google.com/github/asigalov61/Allegro-Music-Transformer/blob/main/Allegro_Music_Transformer_Composer.ipynb)"
" for faster execution and endless generation"
)
input_drums = gr.Checkbox(label="Drums Controls", value = False, info="Drums present or not")
input_instrument = gr.Radio(["Piano", "Guitar", "Bass", "Violin", "Cello", "Harp", "Trumpet", "Sax", "Flute", "Choir", "Organ"], value="Piano", label="Lead Instrument Controls", info="Desired lead instrument")
input_num_tokens = gr.Slider(16, 512, value=256, label="Number of Tokens", info="Number of tokens to generate")
run_btn = gr.Button("generate", variant="primary")
output_midi_seq = gr.Variable()
output_audio = gr.Audio(label="output audio", format="mp3", elem_id="midi_audio")
output_plot = gr.Plot(label="output plot")
output_midi = gr.File(label="output midi", file_types=[".mid"])
run_event = run_btn.click(GenerateMIDI, [input_num_tokens, input_drums, input_instrument], [output_midi_seq, output_plot, output_midi, output_audio])
app.queue(concurrency_count=1).launch(server_port=opt.port, share=opt.share, inbrowser=True) |