hummingtomidi / app.py
jayadrath's picture
imported BytesIO
f97af73
#write a gradio app that will turn humming into a musical note file that can be used as an input to a midi generator
import gradio as gr
import numpy as np
import librosa as lr
import mido
from io import BytesIO
def humming_to_midi(humming_input):
# Load the humming audio file
if isinstance(humming_input, str):
humming_input = BytesIO(humming_input.encode())
wav, sr = lr.load(humming_input, sr=44100)
# Extract the pitch of the audio
pitches, magnitudes = lr.piptrack(wav, sr=sr)
# Convert pitches to MIDI note numbers
midi_notes = lr.hz_to_midi(pitches)
# Create a MIDI file using the extracted notes
midi_file = mido.MidiFile()
track = mido.MidiTrack()
midi_file.tracks.append(track)
# Set tempo to 120 beats per minute
track.append(mido.MetaMessage('set_tempo', tempo=mido.bpm2tempo(120)))
# Convert note numbers to MIDI events and add them to the MIDI track
for midi_note in midi_notes:
note_on = mido.Message('note_on', note=int(round(midi_note)), velocity=64, time=0)
note_off = mido.Message('note_off', note=int(round(midi_note)), velocity=0, time=100)
track.append(note_on)
track.append(note_off)
# Save the MIDI file
output_file = 'humming.midi'
midi_file.save(output_file)
return output_file
# Create an input interface for the microphone recording
microphone_input = gr.inputs.Audio(source="microphone", label="Record your humming", type="filepath")
# Create the Gradio interface
gr.Interface(humming_to_midi, microphone_input, "label", description="description").launch(debug=True)