Antoine Gabriel Brun – MidLib : Bibliothèque C++ pour la génération de samples MIDI

Cette page présente MidLib, une librairie C++ que j’ai créée pour générer facilement des fichiers MIDI avec du code. Elle donne accès aux sources et aux tutoriels associés.

Code source et tutoriels de MidLib

MidLib est accessible gratuitement sur GitHub. Le lien suivant donne accès à tout le matériel nécessaire pour l’utiliser :

Vue d’ensemble

La bibliothèque MidLib permet aux utilisateurs de générer des fichiers MIDI à l’aide de programmes en C++. Elle prend en charge les notes MIDI, les échantillons multipistes, les canaux, les pitch bends, les « control changes », les instruments, l’aftertouch, le tempo, les signatures rythmiques, les événements personnalisés, et intègre de nombreux outils permettant de créer et transformer des échantillons musicaux aussi complexes que vous le souhaitez.

Comment fonctionne MidLib ?

MidLib est une bibliothèque logicielle. Une fois incluse dans un projet C++, elle permet de créer des objets musicaux et de les exporter sous forme de fichiers MIDI.

La bibliothèque MidLib est conçue pour être à la fois simple et flexible :

  • La prise en main (créer un échantillon – ajouter des notes – enregistrer au format .mid) est très simple. La complexité sous-jacente des spécifications MIDI (chunks, événements, écriture de fichiers octet par octet…) est cachée.
  • Cependant, les utilisateurs avancés peuvent utiliser MidLib pour créer des fichiers MIDI complexes qui tirent parti de la plupart des fonctionnalités offertes par la norme MIDI.

MidLib est-elle facile à utiliser ?

L’objectif principal de la bibliothèque MidLib est de rendre la création de fichiers MIDI aussi simple que possible. À cette fin, toutes les choses qui rendent la spécification MIDI délicate ont été dissimulées sous une syntaxe simple qui cache toute la misère sous-jacente :

  • Les notes sont ajoutées en une seule étape : MidLib gère les événements NoteOn et NoteOff et contrôle de manière transparente ce qui se passe si certaines notes se chevauchent.
  • Vous n’avez pas besoin d’ajouter les notes ou les autres événements dans l’ordre chronologique : MidLib trie les événements pour vous.
  • La plupart des constantes « magiques » sont cachées et remplacées par des noms mnémotechniques. Vous n’avez pas besoin de connaître l’index d’un control change donné ou le numéro du program change qui désigne un instrument particulier : vous y ferez référence dans votre code avec des mots comme Accordion, Pan ou ChannelVolume.
  • Les éléments délicats tels que les chunks, les « variable-length sizes », le « running status », les entiers codés sur 14 ou 28 bits, etc. sont complètement cachés dans les sous-sols de la bibliothèque et gérés sans aucune action de votre part.

Quelles fonctions MIDI standard ne sont pas prises en charge par MidLib ?

Malgré les efforts déployés pour rendre MidLib aussi complète que possible, certaines fonctionnalités du format MIDI ne sont pas prises en charge par la bibliothèque :

  • MidLib ne peut qu’écrire des fichiers MIDI. Elle n’est pas conçue pour ouvrir des fichiers MIDI existants, jouer des échantillons MIDI en tant qu’audio, ou gérer des flux MIDI en temps réel.
  • Le seul format de fichier MIDI disponible en écriture est le format 1 (fichier MIDI multipiste).
  • Le seul mode temporel proposé est basé sur les durées rythmiques en rapport avec un tempo. Les temps SMPTE ne sont pas pris en charge.
  • Certains événements MIDI de moindre intérêt, tels que les « cue points », les paroles, etc. ne sont pas nativement pris en charge. Pour les utiliser, il faut soi-même étendre la bibliothèque en dérivant la classe de base Event.

Comment bien démarrer ?

  • Téléchargez les fichiers de la bibliothèque (voir le lien GitHub ci-dessus) et ajoutez-les à votre projet.
  • Incluez la bibliothèque :
#include "Mid/Lib.hpp"
using namespace MID;
  • Dans une fonction, créez un nouvel échantillon MIDI vide ; ajoutez des notes définies par leur position, leur durée et leur hauteur ; et enfin enregistrez le fichier MIDI résultant :
int main() {
    Sample sample;
    for (int pos = 0; pos < 16; pos++) {
        sample << Note(pos, 1, 60);
    }
    sample.save("sample.mid");
}

Voilà comment générer un fichier MIDI à l’aide de MidLib.

Pour aller plus loin et découvrir les autres fonctionnalités disponibles, exécutez et lisez les fichiers du dossier Mid/tutorials.

Pourquoi MidLib a-t-elle été créée ?

J’ai créé la bibliothèque MidLib pour mon propre usage.

Elle vient après ScoreGen, une autre bibliothèque que j’ai écrite précédemment, et qui permet de générer des partitions musicales avec des programmes en C++.

Les deux bibliothèques présentent des avantages complémentaires :

  • Contrairement à ScoreGen, MidLib permet de générer un contenu musical qui n’est pas dépendant du rythme : les durées ne sont pas des additions de figures rythmiques atomiques, mais sont complètement libres. En outre, MidLib prend en charge certaines fonctionnalités telles que les pitch bends, l’aftertouch, le panning… qui n’existent pas dans le monde des partitions.
  • Cependant, l’utilisation de MidLib au lieu de ScoreGen comporte également certaines limitations, puisque le format MIDI ne prend pas en charge certains éléments présents sur les partitions, tels que les liaisons, les articulations, les dynamiques textuelles, etc. ScoreGen supporte toutes ces notations.

Dans les deux cas, l’objectif est de fournir aux compositeurs une interface de programmation pour réaliser leurs idées de composition algorithmique.

Références sur les spécifications des fichiers MIDI

Les références utilisées lors de l’écriture de la bibliothèque MidLib sont les suivantes :

Sentez-vous libre d’utiliser MidLib pour vos propres projets, en respectant sa licence d’utilisation (incluse dans le téléchargement et très permissive). Faites-en bon usage !