[PYTHON] Détecter les données General MIDI à partir d'une grande quantité de MIDI

TL;DR

Qu'est-ce que General MIDI?

General MIDI (general midi) est une norme unifiée de MIDI qui définit les cartes de ton de base et les changements de contrôle. L'abréviation est GM. (De wikipedia https://ja.wikipedia.org/wiki/General_MIDI)

Ainsi, GS est l'extension de ce standard par Roland, et XG est l'extension par Yamaha. À cette époque, la série SC de Roland était la source sonore la plus vendue de ce type, donc beaucoup de données GS étaient distribuées sur les forums Nifty et ainsi de suite. Nostalgique,,,

Je veux un tel fichier MIDI en 2020

Donc, recherchez les données GM, GS, XG de 130000 chansons sur cette page de reddit (https://www.reddit.com/r/WeAreTheMusicMakers/comments/3ajwe4/the_largest_midi_collection_on_the_internet/) J'ai fait un scénario.

Comment le trouver?

Dans le cas des données GM, GS, XG, il contient souvent des informations pour configurer l'appareil avec SysEx (si vous avez créé correctement les données pour ces appareils), donc dans les données midi J'ai essayé de le faire avec la politique que vous devriez juger en regardant SysEx.

Qu'est-ce que SysEx?

Abréviation de System Exclusive, cette page (https://www.g200kg.com/jp/docs/dic/systemexclusive.html) explique ce qui suit.

C'est l'un des types de messages MIDI, et ce n'est pas une fonction commune au MIDI, mais un message utilisé pour contrôler des fonctions telles que des effets spécifiques au modèle de la source sonore.

Donc, quand j'ai vérifié le SysEx de chaque entreprise en disant que si ce sont des données MIDI qui utilisent une fonction de GM, GS, XG, le SysEx correspondant devrait être inclus, ...

Types de normes de données MIDI System Exclusive
GM (General MIDI) F0 7E xx 09
GS (L'expansion GM de Roland) F0 41 xx 42
XG (Expansion de Yamaha GM F0 43 xx 4C

S'il est inclus au début de SysEx, on peut dire qu'il s'agit d'un plan de chaque constructeur. Dans le tableau ci-dessus, F0 marque le début de SysEx. Vient ensuite l'ID du fabricant, xx est l'ID de l'appareil (ID spécifique à l'appareil) et le dernier est l'ID du modèle (si vous écoutez le GS de Roland, cela ressemble à l'ID de modèle 42, vous pouvez donc identifier la source sonore GS), alors utilisez-le.

À propos du script

Il existe une bibliothèque appelée mido (https://mido.readthedocs.io/en/latest/#) pour gérer midi en Python, donc je l'utilise. Le nom du référentiel est également utilisé pour le maîtriser, n'est-ce pas? Le mido est bien entretenu (important) et peut être fonctionnellement varié, donc je pense qu'il est parfait pour manipuler le midi.

Le résultat de l'exécution est un fichier appelé GMMidiCheck.ipynb. Quand j'écrivais, mon ami m'a dit: «Si vous écrivez en .py, vous pouvez exécuter le test en CI», et j'ai pensé que c'était le cas, et toutes les fonctions étaient écrites dans midi_utill.py (après tout). Je n'ai pas encore écrit de test, mais ...). Par conséquent, dans chaque cellule de .jpynb

importlib.reload(midi_utill)

Donc, je recharge midi_utill.py. Donc, le but de ce traitement est que nous devons comparer SysEx des fichiers MIDI, donc nous comparons après avoir converti tous les midi en hex avec la fonction suivante.

def getMidiHexData(midifilename):
    import mido
    midi = mido.MidiFile(midifilename)
    MidiData = []
    for i in range(len(midi.tracks)):
        for msg in midi.tracks[i]:
#             print(msg.hex())
            MidiData.append(msg.hex())
    
    return MidiData

De plus, j'ai beaucoup appris sur la gestion des fichiers, la gestion des répertoires, etc., mais comme il s'agit de Python lui-même, je vais l'omettre, donc si vous êtes intéressé, veuillez lire le script.

Au fait, veuillez spécifier les deux suivants comme variables dans GMMidiCheck.ipynb.

On suppose que les données reddit sont dans le même répertoire que GMMidiCheck.ipynb. De même, on suppose que les données jugées conformes à GM seront écrites en créant un répertoire au même emplacement.

Qu'est-il arrivé au résultat?

Sur les 130 000 chansons (dans ce script), 33 000 chansons ont été capturées comme "comme les données GM, GS, XG".

C'est suffisant comme données source d'apprentissage pour l'apprentissage automatique, n'est-ce pas? De plus, étant donné que les informations de tonalité sont ouvertes au public pour GM, il est également possible d'extraire de la piste «batterie et percussions», «instruments de musique simples», «instruments de musique doubles», etc. , Devrait être. Je suis sûr).

Au fait, il faut environ 5 heures pour vérifier 130 000 chansons, alors utilisez-les systématiquement.

Recommended Posts

Détecter les données General MIDI à partir d'une grande quantité de MIDI
Remarques sur la gestion de grandes quantités de données avec python + pandas
Prétraitement des fichiers de vidage Wikipedia et partage de grandes quantités de données avec MeCab
Acquisition des données de croissance des plantes Acquisition des données des capteurs
Transition du baseball vue à partir des données
Je veux détecter des images de chats d'Instagram
Générer une image verticale d'un roman à partir de données textuelles
DataNitro, implémentation de la fonction de lecture des données de feuille
[Bases de la science des données] Collecte de données depuis RSS avec python