| 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() | |