| import autochord
|
| import pretty_midi
|
| import librosa
|
|
|
| class MusicToChordsConverter:
|
| def __init__(self, audio_file):
|
| self.audio_file = audio_file
|
| self.chords = None
|
| self.midi_chords = pretty_midi.PrettyMIDI()
|
| self.instrument_chords = pretty_midi.Instrument(program=0)
|
|
|
| def recognize_chords(self):
|
| """
|
| Perform chord recognition on the audio file.
|
| """
|
| self.chords = autochord.recognize(self.audio_file, lab_fn='chords.lab')
|
|
|
| def chord_to_midi_notes(self, chord_name):
|
| """
|
| Map chord names to MIDI notes.
|
|
|
| Args:
|
| chord_name (str): The chord name to be mapped.
|
|
|
| Returns:
|
| list: A list of MIDI notes corresponding to the chord.
|
| """
|
| note_mapping = {
|
| 'C:maj': ['C4', 'E4', 'G4'],
|
| 'C:min': ['C4', 'E-4', 'G4'],
|
| 'D:maj': ['D4', 'F#4', 'A4'],
|
| 'D:min': ['D4', 'F4', 'A4'],
|
| 'E:maj': ['E4', 'G#4', 'B4'],
|
| 'E:min': ['E4', 'G4', 'B4'],
|
| 'F:maj': ['F4', 'A4', 'C5'],
|
| 'F:min': ['F4', 'A-4', 'C5'],
|
| 'G:maj': ['G4', 'B4', 'D5'],
|
| 'G:min': ['G4', 'B-4', 'D5'],
|
| 'A:maj': ['A4', 'C#5', 'E5'],
|
| 'A:min': ['A4', 'C5', 'E5'],
|
| 'B:maj': ['B4', 'D#5', 'F#5'],
|
| 'B:min': ['B4', 'D5', 'F#5']
|
| }
|
| return note_mapping.get(chord_name, [])
|
|
|
| def generate_midi(self):
|
| """
|
| Generate a MIDI file from the recognized chords.
|
| """
|
| for chord in self.chords:
|
| start_time = chord[0]
|
| end_time = chord[1]
|
| chord_name = chord[2]
|
| if chord_name != 'N':
|
| chord_notes = self.chord_to_midi_notes(chord_name)
|
| for note_name in chord_notes:
|
| midi_note = pretty_midi.Note(
|
| velocity=100,
|
| pitch=librosa.note_to_midi(note_name),
|
| start=start_time,
|
| end=end_time
|
| )
|
| self.instrument_chords.notes.append(midi_note)
|
|
|
| self.midi_chords.instruments.append(self.instrument_chords)
|
|
|
| def save_midi(self, output_file):
|
| """
|
| Save the generated MIDI file to disk.
|
|
|
| Args:
|
| output_file (str): The path where the MIDI file should be saved.
|
| """
|
| self.midi_chords.write(output_file)
|
| print(f"Saved chords to {output_file}")
|
|
|