-
ChatboxEspace pour des discussions conviviales. Pour les questions "guitare", merci de les poser sur le forum.Afficher plusVous n'avez pas la permission pour chatter.
Rechercher dans la communauté
Affichage des résultats pour les étiquettes 'python'.
1 résultat trouvé
-
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é ). 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.
- 10 commentaires
-
- programmation
- dystolab
-
(et 5 en plus)
Étiqueté avec :