floriangardin's picture
choose chord progression
ffe5a89
raw
history blame
No virus
2.79 kB
import gradio as gr
from musiclang_predict import MusicLangPredictor # Assuming this is the correct import
from midi2audio import FluidSynth
import os
def musiclang(nb_tokens, temperature, chord_progression, tempo):
top_p = 1.0
seed = 0
# If chord progression is empty, we might set it to None or handle it accordingly
if chord_progression.strip() == "":
chord_progression = None # Assuming the predictor can handle None as "generate freely"
# Initialize the MusicLangPredictor
ml = MusicLangPredictor('musiclang/musiclang-v2')
# Generate the score
if chord_progression is None or chord_progression.strip() == "":
score = ml.predict(
nb_tokens=int(nb_tokens),
temperature=float(temperature),
topp=top_p,
chord_progression=chord_progression, # Pass the chord progression, can be None
rng_seed=seed
)
else:
score = ml.predict_chords(
chord_progression,
time_signature=(4, 4),
temperature=temperature,
topp=top_p,
rng_seed=seed)
# Save the score as a MIDI file
midi_path = 'test.mid'
score.to_midi(midi_path, tempo=tempo, time_signature=(4, 4))
# Convert MIDI to WAV then WAV to MP3
wav_path = 'result.wav'
mp3_path = 'result.mp3'
FluidSynth("/usr/share/sounds/sf2/FluidR3_GM.sf2").midi_to_audio(midi_path, wav_path)
os.system(f'ffmpeg -i {wav_path} -acodec libmp3lame -y -loglevel quiet -stats {mp3_path}')
# Return the path to the MP3 for Gradio to display
# Return both the MP3 path for Gradio to display and the MIDI file path for download
return mp3_path, midi_path
# Gradio interface with inputs for temperature, nb_tokens, chord progression, and tempo
iface = gr.Interface(
fn=musiclang,
inputs=[
gr.Number(label="Number of Tokens", value=1024, minimum=256, maximum=2048, step=256),
gr.Slider(label="Temperature", value=0.9, minimum=0.1, maximum=1.0, step=0.1),
gr.Textbox(label="Chord Progression", placeholder="Am CM Dm/F E7 Am", lines=2, value=""),
gr.Slider(label="Tempo", value=120, minimum=60, maximum=240, step=1)
],
outputs=[
gr.Audio(label="Generated Music"),
gr.File(label="Download MIDI")
],
title="Controllable Symbolic Music Generation with MusicLang Predict",
description="""Customize the music generation by specifying the number of tokens, temperature, chord progression, and tempo.
\nChord qualities: M, m, 7, m7, m7b5, sus2, sus4, M7, dim, dim7. You can also specify the bass if it belongs to the chord (e.g., Bm/D).
\nIf no chord progression is given, it generates a free sample with the specified number of tokens."""
)
iface.launch()