|
import os |
|
|
|
import gradio as gr |
|
|
|
from utils import ( |
|
generate_song, |
|
remove_last_instrument, |
|
regenerate_last_instrument, |
|
change_tempo, |
|
) |
|
|
|
|
|
os.environ["PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION"] = "python" |
|
|
|
DESCRIPTION = """ |
|
<h1>π΅ Multitrack Midi Generator πΆ</h1> |
|
<h3>AI-driven Music Composer: Creating Music One Instrument at a Time!</h3> |
|
<p>This interactive application uses an AI model to generate music sequences based on a chosen genre and various user inputs. The apps constructs the piece instrument by instrument</p> |
|
|
|
<div style="display: flex; justify-content: space-between;"> |
|
<div style="width: 45%; margin-right: 5%;"> |
|
<h2>Features:</h2> |
|
<ul> |
|
<li>πΌ Select the genre for the music.</li> |
|
<li>π‘οΈ Use the "Temperature" slider to adjust the randomness of the music generated (higher values will produce more random outputs).</li> |
|
<li>β±οΈ Adjust the "Tempo" slider to change the speed of the music.</li> |
|
<li>πΉ Use the buttons to generate a new song from scratch, continue generation with the current settings, remove the last added instrument, regenerate the last added instrument with a new one, or change the tempo of the current song.</li> |
|
</ul> |
|
</div> |
|
<div style="width: 45%; margin-left: 5%;"> |
|
<h2>Outputs:</h2> |
|
<p>The app outputs the following:</p> |
|
<ul> |
|
<li>π§ The audio of the generated song.</li> |
|
<li>π A MIDI file of the song.</li> |
|
<li>π A plot of the song's sequence.</li> |
|
<li>πΈ A list of the generated instruments.</li> |
|
<li>π The text sequence of the song.</li> |
|
</ul> |
|
</div> |
|
</div> |
|
|
|
<hr style="margin-top: 2em; margin-bottom: 2em;"> |
|
|
|
<p>This application is built upon the inspiring work of <a href="https://www.linkedin.com/in/dr-tristan-behrens-734967a2" target="_blank">Dr. Tristan Behrens</a></p> |
|
|
|
<p>Enjoy creating your own music!</p> |
|
""" |
|
|
|
|
|
genres = ["ROCK", "POP", "OTHER", "R&B/SOUL", "JAZZ", "ELECTRONIC", "RANDOM"] |
|
|
|
|
|
with open('artist_names.json', 'r') as f: |
|
artist_names = json.load(f) |
|
|
|
|
|
demo = gr.Blocks() |
|
|
|
|
|
def run(): |
|
with demo: |
|
gr.HTML(DESCRIPTION) |
|
gr.DuplicateButton(value="Duplicate Space for private use") |
|
with gr.Row(): |
|
with gr.Column(): |
|
temp = gr.Slider( |
|
minimum=0, maximum=1, step=0.05, value=0.85, label="Temperature" |
|
) |
|
genre = gr.Dropdown( |
|
choices=genres, value="POP", label="Select the genre" |
|
) |
|
artist = gr.Dropdown( |
|
choices=artist_names, value=artist_names[0], label="Select the artist style" |
|
) |
|
with gr.Row(): |
|
btn_from_scratch = gr.Button("π§Ή Start from scratch") |
|
btn_continue = gr.Button("β‘οΈ Continue Generation") |
|
btn_remove_last = gr.Button("β©οΈ Remove last instrument") |
|
btn_regenerate_last = gr.Button("π Regenerate last instrument") |
|
with gr.Column(): |
|
with gr.Box(): |
|
audio_output = gr.Video(show_share_button=True) |
|
midi_file = gr.File() |
|
with gr.Row(): |
|
qpm = gr.Slider( |
|
minimum=60, maximum=140, step=10, value=120, label="Tempo" |
|
) |
|
btn_qpm = gr.Button("Change Tempo") |
|
with gr.Row(): |
|
with gr.Column(): |
|
plot_output = gr.Plot() |
|
with gr.Column(): |
|
instruments_output = gr.Markdown("# List of generated instruments") |
|
with gr.Row(): |
|
text_sequence = gr.Text() |
|
empty_sequence = gr.Text(visible=False) |
|
with gr.Row(): |
|
num_tokens = gr.Text(visible=False) |
|
btn_from_scratch.click( |
|
fn=generate_song, |
|
inputs=[genre, artist, temp, empty_sequence, qpm], |
|
outputs=[ |
|
audio_output, |
|
midi_file, |
|
plot_output, |
|
instruments_output, |
|
text_sequence, |
|
num_tokens, |
|
], |
|
) |
|
btn_continue.click( |
|
fn=generate_song, |
|
inputs=[genre, artist, temp, text_sequence, qpm], |
|
outputs=[ |
|
audio_output, |
|
midi_file, |
|
plot_output, |
|
instruments_output, |
|
text_sequence, |
|
num_tokens, |
|
], |
|
) |
|
btn_remove_last.click( |
|
fn=remove_last_instrument, |
|
inputs=[text_sequence, qpm], |
|
outputs=[ |
|
audio_output, |
|
midi_file, |
|
plot_output, |
|
instruments_output, |
|
text_sequence, |
|
num_tokens, |
|
], |
|
) |
|
btn_regenerate_last.click( |
|
fn=regenerate_last_instrument, |
|
inputs=[text_sequence, qpm], |
|
outputs=[ |
|
audio_output, |
|
midi_file, |
|
plot_output, |
|
instruments_output, |
|
text_sequence, |
|
num_tokens, |
|
], |
|
) |
|
btn_qpm.click( |
|
fn=change_tempo, |
|
inputs=[text_sequence, qpm], |
|
outputs=[ |
|
audio_output, |
|
midi_file, |
|
plot_output, |
|
instruments_output, |
|
text_sequence, |
|
num_tokens, |
|
], |
|
) |
|
|
|
demo.launch(server_name="0.0.0.0", server_port=7860) |
|
|
|
|
|
if __name__ == "__main__": |
|
run() |
|
|