Skip to content
Jean Bresson edited this page Jan 16, 2020 · 7 revisions

La bibliothèque DYCI2 library a été conçue pour l'imitation stylistique et l'improvisation guidée par scenario. Elle fonctionne sur des séquences de labels (ou "étiquettes") plus ou moins abstraits (par exemple des noms d'accords, modes de jeu, etc.) attachés à des segments de mémoire (une séquence musicale enregistrée préalablement, ou à la volée). Le moteur DYCI2 (appelé "générateur") produit des nouvelles séquences par recombinaison des segments de mémoire, suivant un scénario exprimé sous la forme d'une suite de labels, et maintenant une unité et une cohérence correspondant à des proriétés d'enchainements apprises dans la séquence initiale.

Principes

L'objet principal de la bibliothèque om-dyci2 est appelé DYCI2GENERATOR. Il est initialisé par une mémoire (liste de "segments" de musique) et une séquence de labels décrivant cette mémoire (donc, deux listes de la même taille!). Actuellement DYCI2GENERATOR supporte uniquement des segments et labels exprimés sous forme de chaine de caractères (cf. exemples ci-dessous).

Dans le premier exemple ci-dessous, la mémoire est une simple liste de 9 segments ("s1", ..., "s9") indexée par un alphabet de 3 labels ("A", "B", or "C"). Une fois le générateur initialisé, une requête (query) peut-être faite en utilisant la fonction dyci2query et une nouvelle liste de labels guidant la génération, appelée le scenario.

Le patch dyci2generator-basic foruni avec la bibliothèque contient un exemple similaire.

Séquences musicales

Dans la plupart des cas avec des séquences musicales "réelles", la mémoire consistera en une liste d'index ou de marqueurs temporels indiquant le début et la fin des segments dans un buffer audio ou une séquence MIDI. Ces marqueurs pourront ainsi correspondre à des méta-données inclues ou extraites de fichiers audio (voir ci-dessous), à des notes ou d'autres évènements spéciaux dans des séquences ou fichiers MIDI, etc.

Selon le cas d'application, une première étape sera donc de convertir la liste de marqueurs temporels définissant la mémoire segmentée, et la liste de labels correspondants, en deux listes adaptées à l'initialisation d'un générateur. De la même manière, il faudra savoir recombiner une séquence musicale à parti de la liste de segments de mémoire renvoyées par le générateur.

Deux cas principaux sont traités ici (et dans le exemples fournis):

  • Un fichier audio segmenté et indexé par des étiquettes.
  • Un fichier MIDI contenant des messages de type 'Lyrics' (texte).

Fichier Audio

Notre premier exemple est un fichier audio (objet SOUND dans OpenMusic) contenant des markers/labels.

om7 permet d'assigner et/ou d'extraire des marqueurs et labels sur les objets SOUND à l'aide de l'entrée :markers de la boîte SOUND. Ceux-ci peuvent également être ajoutés manuellement (CMD + clic) et édités labelled (selection + L) dans l'éditeur de l'objet SOUND. Les marqueurs étiquetés sont alors renvoyés en sortir de la boîte SOUND sous la forme d'une liste ((temps "label") (temps "label") ...). A partir de cette liste, doivent être générées :

  • Une liste de segments formattés en chaînes de caractères: (par exemple: "(t1 t2)" "(t2 t3)" ...)
  • Une liste de labels

Le résultat d'une requête sera donc également une liste de la forme : ("(ta ta+1)" ... "(tx tx+1)" ...). ... à partir de laquelle il faudra reconstituer et concaténer les segments du fichier audio original. Des outils de manipulation de fichiers et buffers audio sont disponibles dans OM.

=> Voir le patch dyci2generator-audio inclus dans la bibliothèque.

Obtenir marqueurs et labels à partir d'un logiciel tiers

OM propose de nombreux outils permettant de parcourir le contenu de fichiers produits par des outils tiers, et d'en extraire des informations telles que les marqueurs temporels et labels textuels.

AudioSculpt (IRCAM) offre par exemple des fonctionalités efficaces pour la segmentation automatique d'un fichier audio en temps (beats), et permet d'attacher des labels (texte) aux marqueurs générés.
Ceux-ci peuvent ensuite être exportés sous forme d'un fichier au format SDIF, importés puis ytraités dans OM:

Selon les conventions et methodes d'annotation et de stockage des données, des patches différents seront à programmer dans OM afin d'obtenir le format souhaité pour les segments de mémoire et leurs labels.

MIDI

Le traitement de données MIDI fonctionne d'une façon similaire aux exemples précédents, à la différence que les labels pourront être encodés comme des messages MIDI (par exemple de type Lyrics). OM fournit également des outils pour l'extraction et le traitement de ces messages.

Des exemples sont aussi inclus dans la bibliothèque.

Requêtes

La fonction dyci2query permet de demander à un objet DYCI2GENERATOR initialisé de produire une nouvelle séquence suivant une nouvelle liste de labels (scenario).

Attention: les labels dans le scenario doivent tous être présents parmi les labels sur lesquels est effectué l'apprentissage !

Selon le format de la mémoire, des opréations adéquates devront être effectuées pour reconstituer une séquence musicale (ex. concaténation des extraits de MIDI, des buffer audio, etc.)

Formattage des réquêtes

L'objet TEXTBUFFER peut être utile pour saisir les requêtes de dyci2query. Utilise les options de l'input :read-mode pour obtenir le bon format du contenu (par exemple avec l'option "flat-list"), et convertir le résultat en chaîne de cartactères (string) adaptées au format des labels du DYCI2GENERATOR.

=> Eviter les expaces dans les labels, qui peuvent produire des erreurs de traitement et de formattage.

Paramètres de génération

De nombreuses options et paramètres dans DYCI2 permettent de contrôler le génération de séquences.
La fonction dyci2setparam permet de fixer certains de ces paramètres du DYCI2Generator. Chosir le parameter (une chaîne de caractères correspondant à son nom — cf. la documentation de), et donner une valuer (value) correspondante sur le dernier input.

Setting parameters

Deux paramètres principaux sont opérationnels actuellement:

  • avoid_repetitions_mode:

    • 0: interdit la répétition / évite d'utiliser plusieurs fois le même segment dans la séquence générée.
    • 1: limite les répétitions / favorise les segments peu utilisés.
    • 2: permet toutes les répétitions.
  • max_continuity: la longueur maximum d'une séquence de segments de la mémoire pouvant être répliquée telle quelle dans la séquence générée.