File size: 2,789 Bytes
d8926bd
 
 
 
 
ffe5a89
171b8d5
d8926bd
a906ae7
 
 
 
 
d8926bd
 
 
 
a906ae7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d8926bd
 
 
171b8d5
d8926bd
 
 
 
 
 
 
 
 
 
a906ae7
 
d8926bd
ecbd558
a906ae7
d8926bd
 
a906ae7
0e84b37
a906ae7
feef1b0
a906ae7
 
 
 
 
 
171b8d5
a906ae7
171b8d5
a906ae7
d8926bd
 
 
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
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()