Aller au contenu

Dystopia Blog

  • billets
    64
  • commentaires
    545
  • vues
    57 653

Dysto'lab 3 : Une note dans la matrice


Dystopia

1 988 vues

 Share

Troisième épisode pour le Dysto'lab fourre-tout qui relate mes expériences, hybrides musicaux et idées.

 

Comme quelques-uns d'entre vous peuvent le savoir j'ai deux grandes passions dans ma vie : la musique et les ordinateurs.

L'enfant naturel des deux sembles être la MAO et à juste titre la MAO pourrait être une de mes passions mais non, le monde dans sa complexité m'a rajouté une âme de bidouilleur qui aime chercher plus compliqué qu'il faudrait pour des résultats moins réussi que les choses qui existent.

 

Terrible malédiction ou terrible bénédiction, impossible de trancher, mais c'est là et ça va nous plonger dans notre sujet : la MAO.

 

Halte aux préjugés, non vous ne lirez pas plus d'une fois "Cubase" ou "Pro Tool", ces mots sont bannis en mes terres (intégrisme libriste ? Non c'est juste pas le sujet ici !), mais de quoi allons nous donc parler..la MAO c'est pas justement ça ? En effet...mais pas seulement...

 

Comme quelques-uns d'entre vous peuvent le savoir j'ai une autre grande passion, la genèse ! Comment cette œuvre à étés pensée, quelle est la logique,etc, et cette fois-ci c'est tout le propos de ce billet : la création musicale assistée par ordinateur autrement la composition par algorithmes (une sorte de recette que l'ordinateur va suivre), et là encore on dois dissocier plusieurs pratiques :

  • La musique générative unique, qui pourra dépendre du spectateur/auditeur/etc. La musique pseudo générative non unique, c'est à dire que le programme produira toujours le même effet.
  • La musique composée avec l'aide d'un ordinateur (harmonisation, mélodie générée,etc...). Par exemple pour une Fugue et l'harmonisation automatique des voix inférieures et supérieures.
  • et celles que j'oublie

A noter que la musique générative est un concept pas forcement simple à apprécier ou appréhender, comme tout il faut aimer pour comprendre...cela dit la curiosité intellectuelle est un bon vecteur aussi il me semble.

 

Nous ne parlerons donc pas de VST ici même, bien que j'ai fortement envie d'en parler sous peu même si le sujet est assez complexe (en apparence).

 

I - La boite à outils ?

 

Pour ce cas j'ai choisi jMusic, une librairie Java, mais qui peut s'utiliser avec Jython (une implémentation de Python en Java, et qui permet d’accéder aux libs Java tout en gardant la simplicité de Python).

 

Bien que Java ne soit pas un langage hyper compliqué, il me semble que Python est largement plus accessible à quiconque l'essaye au premier abord, parfait pour notre cas...

 

Oui, je hais Python pour pas mal de raisons mais il faut avouer que c'est pratique pour des petites choses mais vite bordélique pour un fan comme moi de mes parenthèses et accolades chéries.

 

Il vous faudra donc installer Jython : http://jythonmusic.org/ rubrique download.

 

C'est le site d'un livre qui m'a fait découvrir tout ça, et c'est franchement pas mal (mais pas donné).

 

Il y a d'autres langages spécialisés dans l'audio, ou même certaines lib dans d'autres langages mais ici on reste sur Jython.

 

 

II - Qu'est-ce qu'on peux faire avec Jython music ?

 

Générer des fichiers midi, analyser des fichiers midi, lire des fichiers midi, etc...en gros tout ce qui touche le midi. Il est même possible de faire une application desktop qui exécute des commandes depuis un smartphone (pour des boutons virtuels par exemple ?).

 

Dans ce premier billet j'aimerais surtout montrer à quel point on arrive très rapidement et facilement à un résultat sympathique qui peu résoudre des petits problèmes du quotidien (en musique j'entends) ou simplement s'initier à la programmation via la musique.

 

Petite digression, à titre personnel chercher à chaque fois l'utilité ne me semble pas forcement la meilleure chose dans ce cas présent. Vous aurez très peu de chance de révolution le monde du DSP (Digital Audio Processing) ou de la MAO qui regorge de développeurs et chercheurs de talent mais c'est un bon moyen de prendre du plaisir en découvrant des choses nouvelles, progresser en maths par exemple ou même être plus à l'aise avec l'ordinateur lui même et comprendre un peu plus comment il "pense".

 

Et donc je vais pas vraiment vous presenter un programme d'exemple forcement fou ou utile, non pas que j'en ai pas les compétences mais que c'est pas le plus important tout simplement.

 

Voici ce que je vais vous présenter :

 

Un premier programme qui découper notre clavier maître en deux : La partie strictement sous le C5 sera considérée comme "basse", et sera joué en même temps la tierce, quinte et septime, dans une tonalité de C majeur, et la partie à partir du C5 et jusqu'au maximum possible du clavier sera harmonisé à la tierce majeure, un peu comme un synthé en gros (enfin c'est la vision que j'ai du synthé :p ).

Rien de fou et de super utile mais bon, ça permet de démontrer l'utilité dans un cadre "Live", car il est possible d'enregistrer dans un fichier midi cette performance live + "effets" mais j'en parlerais pas ici (mais vous pourriez l'implémenter, si c'est le cas n'hésitez pas à partager votre code en commentaire ;) ).

 

Le second programme, une génération d'un mini orchestre Jazz. Ça sonne bien comme ça mais en réalité c'est juste un piano qui va jouer l'accord de la mesure et une trompette qui va improviser dans la gamme et aléatoirement pendant quelques mesures. C'est moche mais ça montre que simplement on peux faire du bruit déjà, et du bruit rationnel.

 

 

Pour info, par défaut le son midi de Java est utilisé, c'est moche. Théoriquement vous pouvez router ça vers un truc comme Kontakt mais c'est à voir...sur mon Linux impossible de router vers Jackd (mon serveur audio low-latency pour la MAO).Mais ce n'est pas bien grave que l'export en midi se fait facilement, puis lecture dans un DAW donc...

 

Désolé mais je vais pas pouvoir expliquer toutes les lignes de code, pour ça la documentation de jMusic sera bien plus pratique...

 

ATTENTION : Je ne vais pas expliquer les fondement de programmation non plus, tel que fonctions, variables, blocs, etc...donc pas forcement évident à lire si vous n'avez pas de base là dedans...c'est un petit peu technique bien que j'ai réduis au maximum les difficultés de lecture.

 

EDIT : Le forum m'a viré toute l'indentation du code, donc utilisez les fichiers présents dans le .zip....j'ai pas le courage d'indenter à la main là...désolé....

 

Le premier programme : Mini Synthé

 

from music import *
from random import *
from midi import *
def chordNotes(note):
global scale
return mapScale(note + 4,C0,C7,C0,C7,scale),mapScale(note + 7,C0,C7,C0,C7,scale),mapScale(note + 11,C0,C7,C0,C7,scale)
def noteOn(eventType, channel, note, volume):
global mOut,scale
if note < C5:
#Note en dessous de C5, donc c'est un accord
tierce,quinte,septieme = chordNotes(note)
mOut.noteOn(note, volume)
mOut.noteOn(tierce, volume)
mOut.noteOn(quinte, volume)
mOut.noteOn(septieme, volume)
else:
#On harmonise a la tierce (majeure) la note de melodie
tierce = mapScale(note + 4,C0,C7,C0,C7,scale)
mOut.noteOn(note, volume)
mOut.noteOn(tierce, volume)
def noteOff(eventType, channel, note, volume):
global mOut,scale
if note < C5:
#Note en dessous de C5, donc c'est un accord
tierce,quinte,septieme = chordNotes(note)
mOut.noteOff(note)
mOut.noteOff(tierce)
mOut.noteOff(quinte)
mOut.noteOff(septieme)
else:
#On harmonise a la tierce (majeure) la note de melodie
tierce = mapScale(note + 4,C0,C7,C0,C7,scale)
mOut.noteOff(note)
mOut.noteOff(tierce)
scale = MAJOR_SCALE
mIn = MidiIn()
mOut = MidiOut()
mOut.setInstrument(PIANO, 0)
mIn.onNoteOn(noteOn)
mIn.onNoteOff(noteOff)

 

C'est pas du très beau code (désolé pour les programmeurs qui passeraient pas là) mais ça fera l'affaire ici.

 

Dès qu'un événement midi est détecte on le redirige vers notre fonction noteOn() et on va agir en conséquence.

  • Si note inférieur à C5, on va jouer un accord
  • Sinon c'est une mélodie qu'on harmonise.

J'utilise la fonction mapScale qui permet d'avoir seulement les notes de la gamme, et donc corrige d'un demi-ton celles qui ne le sont pas dedans.

Je m'explique, si par exemple je lui donne un D#5 en premier argument, dans une gamme Majeure de Do, il va me la transformer en D5, et dans mon cas c'est cool parce que la tierce de D c'est D+4 MAIS je vais tomber sur une tierce MAJEURE, hors en Do majeur je veux une tierce MINEURE, et donc il va me la décaler d'un demi ton.

 

Vous pouvez essayer le programme, le changer,etc...Vous voyez comme c'est simple d'interagir avec l'entrée midi en direct ?

 

Le second programme : jazz Band

 

from music import *
from random import *
#Chords definitions
CMAJ7 = [C3,E3,G3,B3]
DMIN7 = [D3,F3,A3,G3]
G7 = [G3,B3,D3,F3]
AMIN7 = [A3,C3,E3,G3]
#Program section
chordProg = [DMIN7,G7,CMAJ7,AMIN7]
bars = 16
tempo = 240
soloRythm = EN
soloScale = LYDIAN_SCALE
startSoloBar = 5
endSoloBar = 12
#Instruments part
score = Score("Jazz band")
piano = Part(PIANO,0)
piano.setTempo(tempo)
trumpet = Part(TRUMPET,1)
trumpet.setTempo(tempo)
#Generating the chord progression
for bar in range(1,bars+1):
cycle = int(bar/16)
timeInCycle = bar%4
chord = CPhrase((bar-1)*4.0)
chord.addChord(chordProg[timeInCycle],WN)
piano.addCPhrase(chord)
if bar >= startSoloBar and bar <= endSoloBar:
for time in range(1,9):
pitch = choice(soloScale) + 60
note = Note(pitch,soloRythm,100)
phrase = Phrase((bar-1)*4.0 + (time * 0.5))
phrase.addNote(note)
trumpet.addPhrase(phrase)

score.addPart(piano)
score.addPart(trumpet)
View.sketch(score)
Play.midi(score)

 

Cette fois ci génération de fichier midi, mais on l'enregistre pas ! On pourrais le faire avec un Midi.write(score,"monfichier.midi") à la fin.

D'ailleurs j'aurais pu l'ajouter....ça me demandait rien de plus, m'enfin bon...c'est passé...

 

jMusic est livré avec des constantes comme EN pour Eight Note (croche), LYDIAN_SCALE (au même titre que tout à l'heure MAJOR_SCALE ! ) est c'est très pratique.

 

Rien de bien fou ici non plus, je génére mes mesures et si c'est des mesures du solo, je génére des phrases moches car aléatoires....

 

 

Faites gaffe dans vos C/C car python, aussi mal foutu qu'il est (je hais cette syntaxe, je l'ai pas déjà dis ?) est sensible aux tabulations et retour de ligne...c'est d'ailleurs tout son principe.

 

View.sketch(score) permet de voir la "partition" en midi. En Y la hauteur de note, et en X la durée.

 

 

III - C'est cool mais ça sert à rien

 

Oui....et non....et oui....

Pour générer rapidement un backtrack midi, avec un ou deux pattern de batterie qui changent, un accompagnement piano + basse, etc...le tout qui change suivant une clef et une grille d'accord (comme l'ex.2) c'est utile.

 

Mais aussi pour de la musique générative, mais on est plus dans l'art là et je vous assure qu'on arrive à des résultats magnifiques (vraiment).

 

Et puis même si ça sert au fond à "rien" de très concret, c'est toujours une ouverture intellectuelle comme déjà dit !

 

 

Voilà un très bref aperçu de Jython et jMusic, un bout de mon monde (petit bout mais bout quand même), et pas le plus élégant.

J'aimerais rentrer plus dans les détails par la suite mais faudra voir...

 

En tous cas pour ceux qui auront tenu jusqu'à la fin, j'ai essayé de faire très simple et je sais que c'est pas évident pour tout le monde.

 

P.S : En plus dans le zip, un midi généré. Je trouve le pattern mélodique très intéressant. Qui sera capable de deviner comment cette "musique" à été généré ? C'est à dire de quoi vient-elle.

 Share

10 Commentaires


Commentaires recommandés

Hum....

J'avoue n'avoir pas compris le détail, n'ayant pas les connaissances informatiques nécessaires (et malheureusement pas le temps de m'y plonger sans laisser de côté d'autres passions) (rien que le terme "Indentation", déjà.....)

 

Mais le principe général, j'ai pigé...

 

Une façon intéressante d'aborder la musique... qui prend l'acronyme "MAO" dans son sens le plus.... jusqu'auboutiste: l'informatique n'est plus un outil comme un studio, ou un instrument.... elle devient le créateur.

 

Pourquoi pas...

 

Perso, j'ai toujours essayé d'humaniser l'informatique et les outils qu'elle propose (pour la musique).... pourquoi ne pas faire le contraire?

Et pourquoi ne pas essayer de pousser encore plus loin, en déshumanisant l'humain? Je veux dire par là: prendre ce qu'a fait un humain.... et le rendre "automatique" et "mécanique".... par un tas de traitements décidés par un programme?

Lien vers le commentaire

@Lestael : Merci d'avoir lu déjà !

 

L'indentation c'est entre autre les tabulations et retour à la ligne qui font que le code est plus aéré et organiser et donc plus clair à lire. Et en python c'est aussi comme ça que l'ordinateur sait qu'on est dans un bloc conditionnel ou pas par exemple. C'est juste une question de présentation cela dit la plupart du temps, car on pourrais très bien avoir un programme sur une seule ligne...mais c'est moche et illisible.

 

De façon générale, je crois (et c'est vraiment de la croyance là) que toutes nos perceptions sensorielles "sentimentales" sont simulables : le feeling de Gilmour, le vibrato unique du regretté B.B King, etc....il faut juste trouver comment le faire bien, et ça passe forcement par l'analyse, l'analyse et encore l'analyse et au final un apprentissage comme en robotique pour les obstacle ou les OCR qui "lisent" du texte sur une image en analysant pixel par pixel, et en estimant qu'ici c'est un A par que ....truc machin.

Après tout nous ne sommes que des machins avec des capteurs sensoriels imparfaits et trompeurs non ?

 

Et j'estime donc possible de faire composer à un ordinateur des musiques très construites et émotionnelles alors que comme tu le dis c'est automatisé.

 

Le livre en question qui m'a guidé un peu la dedans parle d'un compositeur qui tirait au dès (19éme siècle) pour une partie des ses choix, on retrouve un peu l'idée de la musique générative et assistée par ordinateur : l'ordinateur est la façon systématique de répondre à la note par le lancé de dès, et la part unique vient de l'aléatoire du dés.

 

La question n'est pas de savoir si on humanise ou pas il semble, car le créateur reste l'intelligence qui a agencé tout ça : le programmeur dans notre cas. Quelque soit le résultat, il en reste créateur absolu dans toutes les possibilités.

 

J'ai oublié de mentionner PureData qui est largement plus accessible, et très utilisé. C'est la version libre de Max/MSP (par le même créateur). C'est sympathique, mais personnellement je préfère taper du code que de bouger des rectangles à l'écran.

Lien vers le commentaire

Ca pourrait me donner une idée... tiens.....

Le coup des dés...

 

Je vais creuser ça....

Ca existe, de pouvoir simuler un lancer de dés à X faces sur ordi?

Lien vers le commentaire

Ca pourrait me donner une idée... tiens.....

Le coup des dés...

 

Je vais creuser ça....

Ca existe, de pouvoir simuler un lancer de dés à X faces sur ordi?

 

Tu peux utiliser ce site internet par exemple : https://www.random.org/integers/

Mais sinon oui c'est très simple en programmation, généralement la fonction rand(min,max);

Lien vers le commentaire

J'attends avec impatience que tu me génères une mélodie gilmourienne habitée par le vibrato de bb. King

Lien vers le commentaire

Perso, j'ai toujours essayé d'humaniser l'informatique et les outils qu'elle propose (pour la musique).... pourquoi ne pas faire le contraire?

Et pourquoi ne pas essayer de pousser encore plus loin, en déshumanisant l'humain? Je veux dire par là: prendre ce qu'a fait un humain.... et le rendre "automatique" et "mécanique".... par un tas de traitements décidés par un programme?

 

Un arpégiateur c'est un peu déjà ce concept là.

Lien vers le commentaire

C'est même beaucoup ce concept là.... Surtout avec l'option "random" de plus en plus courante.

 

Mais on pourrait aussi, par exemple, penser à un slicer automatisé selon des paramètres aléatoires, capable de rejouer dans un ordre tout aussi aléatoire les slices, et en y apportant un traitement radical....

Lien vers le commentaire

Sympa l'article Dysto' (à l'exception de l'indentation qui m'a arraché les yeux ;) ).

 

Pour embrayer sur la possibilité de composer automatiquement une mélodie avec un feeling Gilmourien ou IronMaidien, je me dis qu'un p'ti réseau de neurone intercalé permettrait de se rapprocher d'une telle cible.

Ceci dit, l'algo serait + complexe car il prendrait en compte les nuances, et la rythmique à la note (j'sais pas si je suis clair) ainsi que le touché (au sens slide/legato/Ho/Po etc.). Mais dans l'absolue je ne vois pas ce qui pourrait l'empêcher :)

Lien vers le commentaire

Sympa l'article Dysto' (à l'exception de l'indentation qui m'a arraché les yeux ;) ).

 

Pour embrayer sur la possibilité de composer automatiquement une mélodie avec un feeling Gilmourien ou IronMaidien, je me dis qu'un p'ti réseau de neurone intercalé permettrait de se rapprocher d'une telle cible.

Ceci dit, l'algo serait + complexe car il prendrait en compte les nuances, et la rythmique à la note (j'sais pas si je suis clair) ainsi que le touché (au sens slide/legato/Ho/Po etc.). Mais dans l'absolue je ne vois pas ce qui pourrait l'empêcher :)

 

Je pensais exactement à ça oui. Mais on peux voir le truc d'un point de vue mathématique et faire des stats sur les intervals selon plusieurs variables aléatoires (accord de la mesure, tonalité, etc...).

 

Mais encore, l’imitation de Gilmour ou truc ou machin n'est pas d'un grand intérêt je pense...c'était vraiment pour illustrer que mathématiquement et techniquement on peux avoir les outils pour faire déjà pas mal de choses et plus la technologie avance plus on est proche du fameux générateur de tubes (ou alors il existe déjà ? ).

 

Et plus que l'indentation, c'est Python qui me fait mal aux yeux :p Je vais essayer de fixer ça quand même...sachant que l'éditeur du forum c'est pas la joie

Lien vers le commentaire

Penhuel m'a piqué ma réponse. J'allait abordé les réseaux neurones parce que a la limite pour définir un accompagnement, la programmation simple peut suffire, mais si on part sur du note a note, là c'est plus complexe. Pour ce qui est de la composition je pense que c'est possible d'avoir un bon résultat avec une bonne base de donnée (aussi fournis que cohérente).

Là ou je suis plus mitigé c'est sur l'interprétation. C'est la part de la musique qui sera je pense le plus difficile a simuler.

C'est toujours un grand débat quand l'informatique essaie de décrypter l'art. Je pense personnellement qu'une oeuvre n'est pas juste le résultat mais la manière, les messages implicites, l'adaptation au contexte.

 

Mais c'est effectivement une super ouverture intellectuelle.

C'est très intéressant !

Lien vers le commentaire

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...