import os import io import streamlit as st from PIL import Image import pretty_midi import music21 import note_seq from scipy.io import wavfile import numpy as np st.title('Music Demo') st.markdown('This example need a .xml music file as input and show partiture, piano roll and a simply wav. You can generate it from MuseScore or similar software.') example_1 = st.button('Test Example') uploaded_file = st.file_uploader("Choose a .xml music file", type='xml') if uploaded_file is not None or example_1: if uploaded_file is not None: # save file with open(os.path.join(os.getcwd(), uploaded_file.name), "wb") as f: f.write(uploaded_file.getbuffer()) file_path = os.path.join(os.getcwd(), uploaded_file.name) else: file_path = 'examples/test.xml' # Show partiture with music21 music = music21.converter.parse(file_path) streaming_partiture = str(music.write('lily.png')) image = Image.open(streaming_partiture) st.text('Partiture') st.image(image) # save to mid midi_path = file_path + '.mid' music.write('midi', fp=midi_path) # plot piano rol unconditional_ns = note_seq.midi_file_to_note_sequence(midi_path) piano_roll = note_seq.plot_sequence(unconditional_ns, show_figure=False) st.text('Piano Roll') st.bokeh_chart(piano_roll, use_container_width=True) # generate wav with st.spinner(f"Sinthezizing to wav"): midi_data = pretty_midi.PrettyMIDI(midi_path) audio_data = midi_data.synthesize() audio_data = np.int16( audio_data / np.max(np.abs(audio_data)) * 32767 * 0.9 ) # -- Normalize for 16 bit audio https://github.com/jkanner/streamlit-audio/blob/main/helper.py virtualfile = io.BytesIO() wavfile.write(virtualfile, 44100, audio_data) st.audio(virtualfile) st.markdown("Download the audio by right-clicking on the media player")