Paquets qui gèrent le MIDI avec Python midi et pretty_midi

Travailler avec MIDI en Python

Le MIDI peut être utilisé lors du traitement de la musique.

MIDI est un fichier qui contient des informations dites de partition. En d'autres termes, il est écrit comme quel son est produit à quel moment.

Lorsque vous utilisez Python, il existe un package qui traite le MIDI, je vais donc l'expliquer.

midi et pretty_midi

Ces packages sont également utilisés dans un projet appelé Magenta, qui compose avec l'intelligence artificielle.

Installation

Nous utiliserons Python2 ici.

Il semble qu'il puisse être installé avec pip (corrigé le 22/11/2016)

pip install python-midi
pip install pretty_midi

Si vous pouvez l'importer, vous avez terminé.

import midi
import pretty_midi

En Python3, vous pouvez utiliser pretty_midi en clonant et en installant depuis github. (Si vous le faites avec pip, vous obtiendrez une erreur lors de l'importation)

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

Pour midi, il existe une version Python3 sur ici.

midi Un fichier MIDI se compose essentiellement de pistes et d'événements.

La piste contient des données de performance pour chaque instrument.

Et les données de performance sont composées d'événements. Un événement est une information telle que quand changer le tempo et quand commencer (terminer) le son.

C'est midi qui les décrit directement.

Maintenant, créons un fichier midi contenant les informations de performance des noires So.

import midi

file = "test.mid"

pattern = midi.Pattern(resolution=960) #Ce modèle correspond au fichier midi.

track = midi.Track() #Faire une trace
pattern.append(track) #Ajoutez la piste que vous avez créée au motif.

ev = midi.SetTempoEvent(tick=0, bpm=120) #Créer un événement pour définir le tempo
track.append(ev) #Ajoutez l'événement à la piste.

e = midi.NoteOnEvent(tick=0, velocity=100, pitch=midi.G_4) #Créez un événement qui commence à faire le son de SEO.
track.append(e)

e = midi.NoteOffEvent(tick=960, velocity=100, pitch=midi.G_4) #Créez un événement qui termine le son de Seo.
track.append(e)

eot = midi.EndOfTrackEvent(tick=1) #Créer un événement pour terminer la piste
track.append(eot)
            
midi.write_midifile(file, pattern) #Écrivez le motif dans un fichier.

Maintenant, lisez le fichier midi

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

Les informations suivantes s'affichent. Ce sont les mêmes que les informations que j'ai écrites plus tôt.

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 est encore plus facile à comprendre.

Vous pouvez faire la même chose avec pretty_midi, qui est un code plus court.

Créez un fichier midi de la même manière.

import pretty_midi

pm = pretty_midi.PrettyMIDI(resolution=960, initial_tempo=120) #pretty_Créer un objet midi
instrument = pretty_midi.Instrument(0) #l'instrument est comme un camion.

note_number = pretty_midi.note_name_to_number('G4')
note = pretty_midi.Note(velocity=100, pitch=note_number, start=0, end=1) #note équivaut à NoteOnEvent et NoteOffEvent.

instrument.notes.append(note)
pm.instruments.append(instrument)
pm.write('test.mid') #Écrivez un fichier midi.

(Remarque) Lorsqu'une erreur se produit

note = pretty_midi.Note(velocity=100, pitch=note_number, >start=1e-20, end=1) #note équivaut à NoteOnEvent et NoteOffEvent.

Veuillez réécrire comme>. Cela est dû au fait que la méthode PrettyMIDI time_to_tick retourne en tant que type numpy.int64 pour une raison quelconque uniquement lorsque l'entrée est 0. (Dans d'autres cas, il est renvoyé sous forme de type int)

Lire le fichier midi

import pretty_midi

midi_data = pretty_midi.PrettyMIDI('test.mid') #Lire le fichier midi
print(midi_data.get_piano_roll()) #Rouleau de piano de sortie
print(midi_data.synthesize()) #La forme d'onde est sortie en utilisant l'onde sinusoïdale.

Il semble qu'il existe également d'autres fonctions utiles.

Résumé

Fondamentalement, il semble préférable d'utiliser pretty_midi lorsque vous traitez des fichiers midi en Python.

Recommended Posts

Paquets qui gèrent le MIDI avec Python midi et pretty_midi
Les modules et packages en Python sont des "espaces de noms"
Paquets et modules Python
Organisez les modules et les packages Python dans le désordre
Créez un fichier MIDI en Python en utilisant pretty_midi
Apprenez à connaître les packages et les modules Python
Pile et file d'attente en Python
Unittest et CI en Python
Différence entre list () et [] en Python
Différence entre == et est en python
Afficher les photos en Python et html
Algorithme de tri et implémentation en Python
Manipuler des fichiers et des dossiers en Python
À propos de Python et Cython dtype
Affectations et modifications des objets Python
Vérifiez et déplacez le répertoire en Python
Un moyen standard de développer et de distribuer des packages en Python
Cours de base Python (14 modules et packages)
Chiffrement avec Python: IND-CCA2 et RSA-OAEP
Hashing de données en R et Python
Synthèse de fonctions et application en Python
Exporter et exporter des fichiers en Python
Inverser le pseudonyme plat et le katakana en Python2.7
Lire et écrire du texte en Python
[GUI en Python] Menu PyQt5 et barre d'outils-
Créer et lire des paquets de messages en Python
Chevauchement d'expressions régulières en Python et Java
Différence d'authenticité entre Python et JavaScript
Notes utilisant cChardet et python3-chardet dans Python 3.3.1.
Évitez les boucles imbriquées en PHP et Python
Différences entre Ruby et Python dans la portée
Modulation et démodulation AM avec Python Partie 2
différence entre les instructions (instructions) et les expressions (expressions) en Python
Valeurs authentiques et vecteurs propres: Algèbre linéaire en Python <7>
Environnement virtuel Python et packages sur Ubuntu
Module d'implémentation de file d'attente et Python "deque"
Graphique à lignes pliées et ligne d'échelle en python
Implémenter le filtre FIR en langage Python et C
Différences entre la syntaxe Python et Java
Vérifier et recevoir le port série en Python (vérification du port)
Rechercher et lire des vidéos YouTube avec Python
Différence entre @classmethod et @staticmethod en Python
Différence entre append et + = dans la liste Python
Différence entre non local et global en Python
Ecrire le fichier O_SYNC en C et Python
Gérer les "années et mois" en Python
Lire et écrire des fichiers JSON avec Python
Représentez facilement des données graphiques dans le shell et Python
Méthodes et champs privés en python [chiffrement]
Rechercher et vérifier la matrice inverse en Python
Indépendance et base linéaires: Algèbre linéaire en Python <6>
Appelez sudo en Python et mot de passe à saisie automatique
Gérer les packages python à installer dans des conteneurs
Différences de multithreading entre Python et Jython
Importation de modules et gestion des exceptions en python
Comment utiliser is et == en Python
Projet Euler # 1 "Multiple de 3 et 5" en Python
Quadtree en Python --2
Python en optimisation
CURL en Python
Métaprogrammation avec Python