AI, cours pratique. Transformation musicale basée sur l'émotion



Ceci est un autre article d'une série d'articles de formation pour les développeurs dans le domaine de l'intelligence artificielle. Dans les articles précédents, nous avons examiné la collecte et la préparation des données avec des images, dans cet article, nous continuerons la discussion sur la collecte et l'étude des données musicales.

Le but de ce projet est:

  • Créez une application qui accepte un ensemble d'images en entrée.
  • Soulignant la coloration émotionnelle des images.
  • Réception de la sortie d'un morceau de musique reflétant l'émotion correspondante.


Ce projet utilise pour générer de la musique modulée à l'aide d'émotions, un algorithme (Transformation musicale basée sur les émotions), qui effectue un changement de la mélodie de base en fonction d'une émotion spécifique et l'harmonisation et l'achèvement de la mélodie qui en résulte en utilisant le modèle d'apprentissage profond. Pour effectuer cette tâche, les ensembles de données musicales suivants sont requis:
  • Un ensemble de données pour l'apprentissage de l'algorithme d'achèvement de la mélodie (chorales de Bach).
  • Un ensemble de mélodies populaires qui servent de modèles pour moduler les émotions.

Collecte et étude d'un ensemble de données musicales


Bach Chorales - Projet Music21


Music21 est une boîte à outils basée sur Python pour la science musicale utilisant un ordinateur. Il contient une collection complète des chœurs de Bach dans le cadre de ses œuvres collectées. Par conséquent, la procédure de collecte de données est très simple - il vous suffit d'installer le package music21 (les manuels sont disponibles pour macOS *, Windows * et Linux *).
Après l'installation, l'accès aux chorales Bach peut être obtenu à l'aide du code suivant:

from music21 import corpus for score in corpus.chorales.Iterator(numberingSystem='bwv', returnType='stream'): pass # do stuff with scores here 

Itération sur tous les chœurs de Bach

Comme alternative, vous pouvez utiliser le code suivant: il renvoie une liste de noms de fichiers pour tous les chorals de Bach, qui peuvent être traités ultérieurement à l'aide de la fonction d'analyse:

 from music21 import corpus chorales = corpus.getBachChorales() score = corpus.parse(chorales[0]) # do stuff with score 

Récupération d'une liste de tous les choeurs de Bach

Exploration des données


Après avoir terminé la collecte des données (dans ce cas, après y avoir accédé), l'étape suivante consiste à vérifier et étudier les signes de ces données.

Le code suivant affiche la représentation textuelle d'un fichier musical:

>>> from music21 import corpus
>>> chorales = corpus.getBachChorales()
>>> score = corpus.parse(chorales[0])
>>> score.show('text')

{0.0} <music21.text.TextBox "BWV 1.6 W...">
{0.0} <music21.text.TextBox "Harmonized...">
{0.0} <music21.text.TextBox "PDF 2004 ...">
{0.0} <music21.metadata.Metadata object at 0x117b78f60>
{0.0} <music21.stream.Part Horn 2>
{0.0} <music21.instrument.Instrument P1: Horn 2: Instrument 7>
{0.0} <music21.stream.Measure 0 offset=0.0>
{0.0} <music21.layout.PageLayout>
{0.0} <music21.clef.TrebleClef>
{0.0} <music21.key.Key of F major>
{0.0} <music21.meter.TimeSignature 4/4>
{0.0} <music21.note.Note F>
{1.0} <music21.stream.Measure 1 offset=1.0>
{0.0} <music21.note.Note G>
{0.5} <music21.note.Note C>
{1.0} <music21.note.Note F>
{1.5} <music21.note.Note F>
{2.0} <music21.note.Note A>
{2.5} <music21.note.Note F>
{3.0} <music21.note.Note A>
{3.5} <music21.note.Note C>
{5.0} <music21.stream.Measure 2 offset=5.0>
{0.0} <music21.note.Note F>
{0.25} <music21.note.Note B->
{0.5} <music21.note.Note A>
{0.75} <music21.note.Note G>
{1.0} <music21.note.Note F>
{1.5} <music21.note.Note G>
{2.0} <music21.note.Note A>
{3.0} <music21.note.Note A>
{9.0} <music21.stream.Measure 3 offset=9.0>
{0.0} <music21.note.Note F>
{0.5} <music21.note.Note G>
.
.
.

>>> print(score)
<music21.stream.Score 0x10bf4d828>

Représentation textuelle du choral

Ci-dessus, un affichage de la représentation textuelle du choral en tant qu'objet music21.stream .Score. Il est intéressant de savoir comment music21 représente la musique dans le code, mais ce n'est pas très utile pour étudier les attributs de données importants. Par conséquent, nous avons besoin d'un logiciel capable d'afficher le score.

Comme indiqué précédemment dans l'article Configuration du modèle et des hyperparamètres pour reconnaître les émotions dans les images , la partition dans la musique21 est stockée dans des fichiers MusicXML * (avec extensions .xml ou .mxl). Pour visualiser ces fichiers en notation musicale, l'application gratuite Finale NotePad * 2 est utilisée (version d'essai du package professionnel Finale * pour travailler avec la notation musicale). Finale NotePad est disponible pour Mac et Windows. Après avoir téléchargé Finale Notepad, exécutez le code suivant pour configurer music21 pour qu'il fonctionne avec Finale Notepad:

>>> import music21
>>> music21.configure.run()


Nous pouvons maintenant exécuter le code ci-dessus, mais utilisez le fragment score.show () au lieu de score.show ('text') . Dans ce cas, le fichier MusicXML sera ouvert dans l'application Finale, qui ressemble à ceci:


Première page de Bach en notation musicale

Ce format offre une présentation visuelle plus claire des chorals. Lors de l'examen de plusieurs chorales, nous nous assurons que les données répondent à nos attentes: il s'agit de courtes pièces musicales contenant au moins quatre parties (soprano, alto, ténor et basse), divisées en phrases distinctes au moyen de fermes.

En règle générale, certaines statistiques descriptives sont calculées dans le cadre de la procédure d'étude des données. Dans ce cas, nous pouvons déterminer combien de fois chaque clé apparaît dans les œuvres collectées. Voici un exemple de code qui vous permet de calculer et de visualiser le taux d'utilisation de chaque clé d'un ensemble de données.

 from music21 import* import matplotlib.pyplot as plt chorales = corpus.getBachChorales() dict = {} for chorale in chorales: score = corpus.parse(chorale) key = score.analyze('key').tonicPitchNameWithCase dict[key] = dict[key] + 1 if key in dict.keys() else 1 ind = [i for i in range(len(dict))] fig, ax = plt.subplots() ax.bar(ind, dict.values()) ax.set_title('Frequency of Each Key') ax.set_ylabel('Frequency') plt.xticks(ind, dict.keys(), rotation='vertical') plt.show() 


Fréquence d'utilisation de chaque clé dans les œuvres collectées. Les clés mineures sont représentées par des lettres minuscules et les clés majeures sont représentées par des lettres minuscules. Les appartements sont indiqués par un «-»

Vous trouverez ci-dessous quelques statistiques relatives aux œuvres collectées.


La répartition des clés utilisées dans un ensemble de compositions


Emplacement des notes, calculé comme la compensation depuis le début de la mesure en noires

Les statistiques descriptives d'intérêt pour le calcul varieront pour chaque projet. Cependant, dans la plupart des cas, cela peut vous aider à déterminer avec quel type de données vous travaillez, et même à gérer certaines actions pendant le prétraitement des données. Ces statistiques peuvent également servir de point de départ pour examiner les résultats du prétraitement des données.

Transformation musicale - Informations théoriques


Il y a deux principaux vecteurs d'expression dans la musique - la hauteur et le rythme. Nous utilisons ces supports d'expression comme paramètres pour réécrire notre mélodie dans l'ambiance choisie.

En théorie musicale, en ce qui concerne la hauteur des sons dans une mélodie, la relation des hauteurs entre les notes est implicite. Un système de notes musicales basé sur une séquence de sons d'une certaine hauteur est appelé échelle. Les intervalles ou la mesure de la largeur de chaque étape de la séquence peuvent différer les uns des autres. Une telle différence ou son absence crée une relation entre les tons et les tendances mélodiques dans lesquelles les combinaisons stables et les gravitations créent une expression de l'humeur. Dans la tradition musicale occidentale, lorsqu'il s'agit d'une gamme diatonique simple, la position de la note par rapport à la première note de la gamme est appelée le stade de la gamme (I-II-III-IV-V-VI-VII). Conformément aux combinaisons stables et aux gravitations, l'échelle de l'échelle fournit un son musical qui remplit sa fonction dans le système. Cela rend la notion d'étape d'échelle très utile pour analyser un motif mélodique simple et le coder avec la possibilité d'attribuer différentes valeurs.

Au niveau initial, nous devons choisir les échelles qui conviennent d'un point de vue artistique pour créer une ambiance spécifique. Ainsi, si nous devons changer l'ambiance de la mélodie, nous devons étudier sa structure fonctionnelle en utilisant la notion décrite d'échelle, puis attribuer de nouvelles valeurs au modèle existant à partir des étapes de l'échelle. Comme la carte, ce modèle contient également des informations sur les directions et les périodes de la mélodie.

Pour chaque humeur spécifique, nous utilisons des paramètres supplémentaires pour rendre nos nouvelles mélodies plus expressives, harmonieuses et expressives.

Le rythme est une façon d'organiser les sons dans le temps. Il comprend des informations telles que: l'ordre d'apparition des tons dans la mélodie, leur longueur relative, les pauses entre eux et divers accents. Ainsi, des périodes de temps sont créées pour structurer la taille musicale. Si nous devons préserver le motif mélodique d'origine, nous devons préserver sa structure rythmique. Pour atteindre cet objectif, il suffit de modifier certains paramètres de rythme - la durée des notes et des pauses - et cela devrait suffire d'un point de vue artistique. De plus, pour rendre notre mélodie modifiée plus expressive, nous pouvons utiliser des méthodes supplémentaires pour souligner son humeur.

Par exemple, l'ANXIÉTÉ peut s'exprimer avec une touche mineure et un rythme plus énergique. Le modèle de notre échelle d'origine est le suivant: VV-VI-VI-VII VV-VI-V-II-I VVV (transition d'une octave plus haut) -III-I-VII-VI IV-IV-III-I-II-I .


Modèle source

La mélodie originale est écrite dans une tonalité majeure, qui diffère d'une tonalité mineure en trois notes - dans une tonalité majeure des étapes III, VI et VII sont majeures (un demi-ton ci-dessus), et dans une tonalité mineure - un mineur (un demi-ton ci-dessous). Par conséquent, si nous devons changer la tonalité utilisée, il nous suffit de remplacer les étapes supérieures par les plus basses (ou vice versa). Cependant, pour créer un effet d'anxiété encore plus important, il est nécessaire de quitter le stade VII d'un stade majeur (augmenté) - cela augmentera l'instabilité de ce ton et soulignera notre échelle d'une manière spéciale.

Pour rendre le rythme plus énergique, on peut y ajouter une syncope, ou interruption syncopique du mouvement rythmique régulier, en changeant la position de certaines notes. Dans ce cas, nous déplacerons quelques notes similaires d'un temps vers l'avant.


Anxiété de conversion

La tristesse peut également s'exprimer avec une simple touche mineure, mais son rythme doit être calme. Ainsi, nous remplaçons les étapes majeures par des étapes mineures, y compris l'étape VII. Pour rendre le rythme plus détendu, vous devez remplir les pauses en augmentant la longueur des notes devant elles.


Conversion SAD

Pour exprimer BÉNÉDICTION, nous devons éviter les intonations décisives et strictes - ce sera le principe de la transformation correspondante. Comme vous pouvez le voir, en fonction des différences dans la séquence des sons utilisés, les pas de l'échelle ont des significations différentes et la distance par rapport au premier (I) pas. Ainsi, leur signification est créée dans l'image globale. Par conséquent, le mouvement du stade IV au stade I est très simple en raison de sa fonction. L'intonation lors du passage du stade V au stade I semble également très simple. Nous éviterons ces deux intonations afin de créer une impression d'espace et d'incertitude.

Par conséquent, dans chaque élément du modèle, dans lequel l'étape I suit l'étape V, ou l'étape IV suit l'étape IV, et également dans l'ordre inverse de ces étapes, nous remplacerons l'une de ces notes (ou les deux notes) par les étapes les plus proches. Vous pouvez changer le rythme d'une manière similaire à la création de l'effet de GRUSH - simplement en réduisant le rythme.


Conversion de BLESS

La DÉCISION est associée à un mouvement puissant, donc la façon la plus simple de le montrer est de changer le rythme d'une manière similaire au changement de l'effet ANXIÉTÉ. Il est également nécessaire de réduire la durée de toutes les notes sauf pour chaque dernière note de chaque période, VV-VI-VI-VII VV-VI-V-II-I.


DÉCISION de transformation

La touche majeure en elle-même semble positive et joyeuse, cependant, pour souligner et exprimer le BONHEUR / LA JOIE, nous utilisons la touche pentatonique majeure. Il se compose des mêmes étapes, à l'exception de deux d'entre elles - les quatrième et septième, I-II-III-V-VI.

Par conséquent, chaque fois que nous trouvons ces deux étapes dans notre modèle, nous les remplaçons par les étapes les plus proches. Pour souligner la simplicité apportée par notre tonalité, nous utilisons un fragment mélodique descendant composé de cinq notes ou plus comme démonstration étape par étape de notre gamme.


Conversion de JOY

La tranquillité / tranquillité peut s'exprimer non seulement en changeant la tonalité, elle nécessite également la transformation du mouvement mélodique. Pour ce faire, vous devez analyser le modèle source et y sélectionner des segments similaires. La première note de chaque segment détermine le contexte harmonique de la phrase entière, donc ces notes sont de la plus grande valeur pour nous: V - V -VI-VI-VII-VII-VII V -V-VI-V-II-I V -VV-III-I-VII-VI IV-IV-III-I-II-I.

Pour le premier segment, seules les étapes suivantes doivent être utilisées: IV-VI-VII; pour le second: V-VII-II-I; pour le troisième: VI-VII-III-II; pour le quatrième: VII-IV-I-VII.

Ces ensembles d'étapes possibles sont en fait un autre type de structure musicale, les accords. Cependant, nous pouvons toujours les utiliser comme système pour convertir des mélodies. Les pas de la gamme peuvent être remplacés par les pas les plus proches des modèles d'accords indiqués. Si le segment entier commence par une tonalité inférieure à l'original, il est nécessaire de remplacer toutes les étapes qu'il contient par les étapes inférieures disponibles dans le modèle spécifié. Pour créer un effet de retard, il est également nécessaire de diviser la durée de chaque note en croches et de réduire progressivement la vitesse de ces nouvelles croches.


Conversion tranquillité / tranquillité

Pour accentuer la GRATITUDE, il faut utiliser son affichage stylistique en rythme, créant l'effet d'arpège: on revient à la première note à la fin de chaque segment (phrase). Il est nécessaire de diviser par deux la durée de chaque dernière note d'un segment et d'y placer la première note de ce segment.


Conversion GRATITUDE

Partie pratique


Boîte à outils Python et Music21


Le script de transformation a été implémenté à l'aide du langage Python et de la boîte à outils music21.

Music21 est une classe très polyvalente et de haut niveau pour manipuler avec des concepts musicaux tels que les notes, la taille, l'accord, la tonalité, etc. Il vous permet d'effectuer des opérations directement dans le domaine, par opposition aux manipulations de bas niveau avec des données brutes d'un fichier Interface d'instruments de musique numérique (MIDI). Cependant, travailler directement avec des fichiers MIDI dans music21 n'est pas toujours pratique, surtout quand il s'agit de visualiser la partition. Par conséquent, pour la visualisation et la mise en œuvre de l'algorithme, un moyen plus pratique consiste à convertir les fichiers MIDI source au format musicXML. De plus, le format musicXML est le format d'entrée pour BachBot, qui représente la prochaine étape de notre séquence de traitement.
La conversion peut être effectuée à l'aide de Musescore:
pour obtenir la sortie du fichier musicXML:

musescore input.mid -o output.xml
pour obtenir la sortie d'un fichier MIDI:

musescore input.mid -o output.mid

Jupyter


La boîte à outils music21 est bien intégrée à l'application Jupyter. De plus, l'intégration avec Musescore vous permet d'afficher la partition directement dans le document de bloc-notes Jupyter et d'écouter les résultats via le lecteur intégré pendant le développement et l'expérimentation.


Document de cahier Jupyter avec code, partition et lecteur

La fonction Score Show est particulièrement utile pour le travail d'équipe d'un programmeur et d'un musicien-théoricien. La combinaison de la nature interactive de Jupyter, domaine spécifique à la musique21 et de la simplicité de Python rend ce workflow particulièrement prometteur pour ce type de recherche interdisciplinaire.

Implémentation


Le script de transformation a été implémenté en tant que module Python, il permet donc un appel direct:

python3 emotransform.py --emotion JOY input.mid
Ou vous pouvez l'appeler via un script externe (ou Jupyter):

from emotransform import transform transform('input.mid','JOY')
Dans les deux cas, le résultat du travail sera un fichier modulé à l'aide d'une certaine émotion.

Les transformations associées aux changements d'étapes musicales - ANXIÉTÉ, TRISTESSE, BÉNÉDICTION et JOIE - sont basées sur l'utilisation de la fonction music21.Note.transpose en combinaison avec l'analyse de la position actuelle et requise des étapes musicales. Ici, nous utilisons le module music21.scale et ses fonctions pour construire l'échelle requise à partir de n'importe quel tonique. Pour obtenir le ton d'une mélodie spécifique, vous pouvez utiliser la fonction d'analyse («clé») du module music21.Stream7.

Pour les conversions basées sur des phrases - DÉCISION, GRATITUDE, Tranquillité / Tranquillité - des recherches supplémentaires sont nécessaires. Cette étude nous permettra de détecter avec précision le début et la fin des phrases musicales.

Conclusion


Dans cet article, nous avons présenté l'idée principale sous-jacente à la transformation musicale basée sur les émotions - changer la position d'une seule note dans l'échelle par rapport à la tonique (pas musical), le tempo de la pièce, ainsi que la phrase musicale. Cette idée a été implémentée sous forme de script en Python. Cependant, la mise en œuvre d'idées théoriques dans le monde réel n'est pas toujours facile, nous avons donc rencontré quelques difficultés et identifié des directions possibles pour de futures recherches. Cette étude est principalement liée à la détection de phrases musicales et de leurs transformations. Le bon choix d'instruments (musique21) et la recherche dans le domaine de l'information musicale sont des facteurs clés pour résoudre ces problèmes.

La transformation musicale basée sur les émotions représente la première étape de notre séquence de traitement des données musicales, la prochaine étape est la soumission de la mélodie convertie et préparée à l'entrée de BachBot.

Source: https://habr.com/ru/post/fr423303/


All Articles