juancopi81's picture
Change to newer model
b85b5a2
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"]
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"
)
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, 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, 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()