Pakete, die MIDI mit Python Midi und Pretty_Midi verarbeiten

Arbeiten mit MIDI in Python

MIDI kann bei der Verarbeitung von Musik verwendet werden.

MIDI ist eine Datei, die sogenannte Score-Informationen enthält. Mit anderen Worten, es wird so geschrieben, wie welcher Ton zu welchem Zeitpunkt erzeugt wird.

Wenn Sie Python verwenden, gibt es ein Paket, das MIDI verarbeitet, daher werde ich es erklären.

Midi und Pretty_Midi

Diese Pakete werden auch in einem Projekt namens Magenta verwendet, das mit künstlicher Intelligenz komponiert.

Installation

Wir werden hier Python2 verwenden.

Es scheint, dass es mit pip installiert werden kann (korrigiert am 22.11.2016)

pip install python-midi
pip install pretty_midi

Wenn Sie es importieren können, sind Sie fertig.

import midi
import pretty_midi

In Python3 können Sie Pretty_Midi verwenden, indem Sie von github klonen und installieren. (Wenn Sie es mit pip machen, wird beim Importieren eine Fehlermeldung angezeigt.)

git clone https://github.com/craffel/pretty-midi
cd pretty-midi
python setup.py install

Für Midi gibt es eine Python3-Version unter hier.

midi Eine MIDI-Datei besteht im Wesentlichen aus Spuren und Ereignissen.

Die Spur enthält Leistungsdaten für jedes Instrument.

Und die Leistungsdaten setzen sich aus Ereignissen zusammen. Ein Ereignis ist eine Information darüber, wann das Tempo geändert werden muss und wann der Sound gestartet (beendet) werden soll.

Es ist Midi, das sie direkt beschreibt.

Erstellen wir nun eine Midi-Datei, die die Performance-Informationen der So-Viertelnoten enthält.

import midi

file = "test.mid"

pattern = midi.Pattern(resolution=960) #Dieses Muster entspricht der Midi-Datei.

track = midi.Track() #Mach einen Track
pattern.append(track) #Fügen Sie die von Ihnen erstellte Spur zum Muster hinzu.

ev = midi.SetTempoEvent(tick=0, bpm=120) #Erstellen Sie ein Ereignis, um das Tempo festzulegen
track.append(ev) #Fügen Sie das Ereignis der Spur hinzu.

e = midi.NoteOnEvent(tick=0, velocity=100, pitch=midi.G_4) #Erstellen Sie ein Ereignis, das den Sound von Seo erzeugt.
track.append(e)

e = midi.NoteOffEvent(tick=960, velocity=100, pitch=midi.G_4) #Erstellen Sie ein Ereignis, das den Sound von Seo beendet.
track.append(e)

eot = midi.EndOfTrackEvent(tick=1) #Erstellen Sie ein Ereignis, um den Track zu beenden
track.append(eot)
            
midi.write_midifile(file, pattern) #Schreiben Sie das Muster in eine Datei.

Lesen Sie nun die Midi-Datei

pattern = midi.read_midifile("test.mid")
print(pattern)

Die folgenden Informationen werden angezeigt. Dies sind die gleichen Informationen, die ich zuvor geschrieben habe.

midi.Pattern(format=1, resolution=960, tracks=\
[midi.Track(\
  [midi.SetTempoEvent(tick=0, data=[7, 161, 32]),
   midi.NoteOnEvent(tick=0, channel=0, data=[55, 100]),
   midi.NoteOffEvent(tick=960, channel=0, data=[55, 100]),
   midi.EndOfTrackEvent(tick=1, data=[])])])

pretty_midi Pretty_Midi ist noch einfacher zu verstehen.

Sie können dasselbe mit hübschem_midi tun, dem kürzeren Code.

Erstellen Sie auf die gleiche Weise eine Midi-Datei.

import pretty_midi

pm = pretty_midi.PrettyMIDI(resolution=960, initial_tempo=120) #pretty_Erstellen Sie ein MIDI-Objekt
instrument = pretty_midi.Instrument(0) #Instrument ist wie ein LKW.

note_number = pretty_midi.note_name_to_number('G4')
note = pretty_midi.Note(velocity=100, pitch=note_number, start=0, end=1) #note entspricht NoteOnEvent und NoteOffEvent.

instrument.notes.append(note)
pm.instruments.append(instrument)
pm.write('test.mid') #Schreiben Sie eine MIDI-Datei.

(Hinweis) Wenn ein Fehler auftritt

note = pretty_midi.Note(velocity=100, pitch=note_number, >start=1e-20, end=1) #note entspricht NoteOnEvent und NoteOffEvent.

Bitte umschreiben als>. Dies liegt daran, dass die PrettyMIDI-Methode time_to_tick aus irgendeinem Grund nur dann als numpy.int64-Typ zurückgegeben wird, wenn die Eingabe 0 ist. (In anderen Fällen wird es als int-Typ zurückgegeben.)

Midi-Datei lesen

import pretty_midi

midi_data = pretty_midi.PrettyMIDI('test.mid') #Midi-Datei lesen
print(midi_data.get_piano_roll()) #Klavierrolle ausgeben
print(midi_data.synthesize()) #Die Wellenform wird unter Verwendung der Sinuswelle ausgegeben.

Es scheint, dass es auch andere nützliche Funktionen gibt.

Zusammenfassung

Grundsätzlich scheint es besser zu sein, ziemlich_midi zu verwenden, wenn es um MIDI-Dateien in Python geht.

Recommended Posts

Pakete, die MIDI mit Python Midi und Pretty_Midi verarbeiten
Module und Pakete in Python sind "Namespaces"
Python-Pakete und -Module
Organisieren Sie Python-Module und -Pakete in einem Chaos
Erstellen Sie eine MIDI-Datei in Python mit pretty_midi
Lernen Sie Python-Pakete und -Module kennen
Stapel und Warteschlange in Python
Unittest und CI in Python
Unterschied zwischen list () und [] in Python
Unterschied zwischen == und ist in Python
Zeigen Sie Fotos in Python und HTML an
Sortieralgorithmus und Implementierung in Python
Bearbeiten Sie Dateien und Ordner in Python
Über Python und Cython dtype
Zuweisungen und Änderungen in Python-Objekten
Überprüfen und verschieben Sie das Verzeichnis in Python
Eine Standardmethode zum Entwickeln und Verteilen von Paketen in Python
Python-Grundkurs (14 Module und Pakete)
Verschlüsselung mit Python: IND-CCA2 und RSA-OAEP
Hashing von Daten in R und Python
Funktionssynthese und Anwendung in Python
Exportieren und Ausgeben von Dateien in Python
Reverse Flat Pseudonym und Katakana in Python2.7
Lesen und Schreiben von Text in Python
[GUI in Python] PyQt5-Menü und Symbolleiste-
Erstellen und lesen Sie Messagepacks in Python
Überlappende reguläre Ausdrücke in Python und Java
Unterschied in der Authentizität zwischen Python und JavaScript
Hinweise zur Verwendung von cChardet und python3-chardet in Python 3.3.1.
Vermeiden Sie verschachtelte Schleifen in PHP und Python
Unterschiede zwischen Ruby und Python im Umfang
AM-Modulation und Demodulation mit Python Part 2
Unterschied zwischen Anweisungen (Anweisungen) und Ausdrücken (Ausdrücken) in Python
Echte Werte und Eigenvektoren: Lineare Algebra in Python <7>
Virtuelle Python-Umgebung und Pakete unter Ubuntu
Warteschlangen- und Python-Implementierungsmodul "deque"
Gefaltetes Liniendiagramm und Skalierungslinie in Python
Implementieren Sie den FIR-Filter in Python und C.
Unterschiede zwischen Python- und Java-Syntax
Überprüfen und empfangen Sie die serielle Schnittstelle in Python (Portprüfung)
Suchen und spielen Sie YouTube-Videos mit Python
Unterschied zwischen @classmethod und @staticmethod in Python
Unterschied zwischen Anhängen und + = in der Python-Liste
Unterschied zwischen nicht lokal und global in Python
Schreiben Sie die O_SYNC-Datei in C und Python
Umgang mit "Jahren und Monaten" in Python
Lesen und schreiben Sie JSON-Dateien mit Python
Zeichnen Sie Daten einfach in Shell und Python
Private Methoden und Felder in Python [Verschlüsselung]
Suchen und überprüfen Sie die inverse Matrix in Python
Lineare Unabhängigkeit und Basis: Lineare Algebra in Python <6>
Rufen Sie sudo in Python auf und füllen Sie das Passwort automatisch aus
Verwalten Sie Python-Pakete, um sie in Containern zu installieren
Unterschiede in der Multithread-Verarbeitung zwischen Python und Jython
Modulimport und Ausnahmebehandlung in Python
Verwendung ist und == in Python
Projekt Euler # 1 "Vielfaches von 3 und 5" in Python
Quadtree in Python --2
Python in der Optimierung
CURL in Python
Metaprogrammierung mit Python