Générateur de couverture musicale Python dans Blender

Dans cet article, je parlerai de mon addon au mélangeur, des raisons qui m'ont poussé à le créer, du processus de développement et du «succès» sur YouTube.




Contexte


Tout a commencé avec le fait qu'il y a environ un an (en novembre 2018), j'ai vu dans l'offre de YouTube une couverture si inhabituelle sur The Ultimate Canon

Le gars a enregistré les échantillons de chaque note de la chanson et, à travers un montage minutieux, a assemblé la chanson entière à partir d'eux. Pour qui c'est, mais je pense que c'est au moins drôle. Et le nombre de vues (à l'époque un peu plus de 1 000 000) indiquait que le sujet ( 1% de compétence en guitare 99% de compétence en édition ) était populaire.

Je suis sûr que ceux qui étaient au moins un peu impliqués dans le mixage des chansons savent que parfois il est plus facile de couper et déplacer légèrement la piste que de demander au guitariste imprudent de rejouer la partie. Je faisais aussi des couvertures classiques, et même alors j'ai eu l'idée de me glisser et de créer une couverture exactement comme le gars de la vidéo. Et maintenant je vois que "mon idée a été effrontément volée" et j'ai obtenu un bon échappement. J'étais ennuyé que mon train soit parti, mais il m'est apparu que je pouvais faire la même chose, mais à un niveau différent, en ajoutant une nouvelle étape - 1% guitare 1% édition 98% compétences en programmation .

De plus, cela vous permettra de créer des compositions beaucoup plus complexes, qui, lorsqu'elles sont éditées manuellement, peu de gens ont la patience.

Développement


La tâche consistait donc à automatiser le processus de découpage d'échantillons sonores en une composition musicale.

Tout d'abord, il fallait en quelque sorte transmettre au futur programme des données sur la composition, ses notes, ses pistes, ses instruments. J'ai immédiatement pensé à GuitarPro et à ses options d'exportation de données: MusicXML et MIDI.

Les recherches m'ont amené à choisir un analyseur pour les fichiers midi sur Python music21 . Ce n'est pas seulement un analyseur, mais à part cela, je n'ai besoin de rien du module. Et les analogues étaient soit avec une documentation terrible, soit ne pouvaient pas faire ce dont j'avais besoin aussi facilement que la musique21.

Génial, maintenant je peux obtenir des données à partir de fichiers midi sur les pistes, leurs notes, leur position et leur durée. Nous allons plus loin.

Maintenant, sur la base de ces données, vous devez couper des fichiers vidéo / audio. Ensuite, j'ai choisi assez vite. Certainement Blender, même malgré ses modestes capacités en tant qu'éditeur vidéo. J'ai de l'expérience avec Adobe PremierePro, After Effects, mais il y a mon propre dialecte de script, qui n'est plus utile nulle part, et ses capacités me sont inconnues. Dans Blender, presque toutes les actions peuvent être effectuées via un script Python. Et cela correspond déjà au langage de la musique21. Il vaut la peine d'expliquer qu'à cette époque je ne connaissais pas du tout Python, donc j'ai également considéré ce projet comme une excellente occasion de se familiariser avec ce langage populaire. Bingo!

Peu à peu, j'ai commencé à me plonger dans le langage, à publier des notes de fichiers midi sur la console via music21, à voir rapidement comment ajouter des modules complémentaires au mélangeur et à passer à la première tâche pratique: générer des échantillons de données. Il a enregistré chaque note unique sur la guitare et a commencé à couper, mais s'est rapidement arrêté. Mon programmeur interne a protesté contre ce travail minutieux (et il peut y avoir beaucoup de notes pour chaque instrument: 30-50). Et cela devrait couper les notes et les rendre individuellement dans des fichiers séparés, et pour ce faire, ajuster chaque note de piste en longueur au début de la timeline ... En général, ce processus devait être simplifié.

La solution était d'utiliser une telle chose dans Blender comme marqueurs. Il s'agit essentiellement de points contenant des informations textuelles pouvant être définies sur un cadre spécifique. La logique était la suivante: l'utilisateur organise sa vidéo et son (si l'audio a été enregistré sur une piste distincte), les conduit les uns aux autres et marque avec les marqueurs le début de chaque note dans la vidéo, et dans le texte du marqueur indique le type de note (A #, D, C et etc.) et sa durée maximale sur l'enregistrement. Ensuite, les informations sur les marqueurs sont enregistrées dans un fichier et sont déjà utilisées lors de la découpe de notes individuelles.



Le point suivant était le «noyau» réel des notes de coupe fonctionnelles et leur positionnement sur la chronologie. Ironiquement, il n'y a rien de spécial à dire: il y avait beaucoup de documentation de lecture, la documentation de Blender était loin d'être toujours assez détaillée, mais progressivement j'ai atteint ce que je voulais. Quand j'ai vu (et entendu) le premier résultat (c'était une courte composition du groupe Epidemic - Frodo), le bonheur ne connaissait pas de limites. Je pense que tout le monde connaît le sentiment quand quelque chose sort enfin.



La qualité du code est médiocre. J'ai essayé de le faire à la hâte, car J'imaginais que je n'étais pas le seul à penser à une telle chose, et que je ne voudrais pas m'avancer ici (spoiler! Comme j'étais naïf). Par conséquent, je n'ai pas eu le temps d'adhérer au style et de réfléchir à la structure, j'ai essayé d'obtenir un prototype fonctionnel plus rapidement.

Nuances


Maintenant, pour les nuances de mise en œuvre. Blender a une limite dans les couches de l'éditeur, 32 au maximum. L'image montre que les échantillons audio et vidéo (vert et violet) occupent chacun 14 couches et sont formés dans l'ordre croissant, puis à nouveau au début de leur secteur. Cela est dû au fait que Blender ne vous permettra pas de générer un échantillon au-dessus d'un autre. Et en musique, il arrive souvent que la note suivante commence avant même la fin du son précédent. Par conséquent, afin d'éviter le chevauchement, j'ai décidé de générer la note suivante sur un calque plus élevé que le précédent, et lorsque les couches du secteur se terminent, recommencez à partir de la première couche (il est peu probable que la première note retentisse jusqu'à 14 couches en avant). Oui, cela pourrait être fait plus intelligemment en enregistrant des couches, mais comme je l'ai dit, j'étais pressé.

Les plus attentifs pourraient remarquer que le secteur entier est de 2 par 14 couches, c'est 28, et le maximum dans Blender est 32. Le fait est que pour les notes de spawn, vous devez générer 2 pistes originales (vidéo et audio) via un script puis les couper note. Et vous ne pouvez pas apparaître sur une autre piste, j'ai donc réservé les 31e et 32e couches pour cette entreprise. Les 29th et 30th sont utilisés pour le stockage intermédiaire des pistes déjà générées: la génération se produit sous une piste à partir du fichier midi, puis les notes sont regroupées en une seule piste, transférées vers la couche 29/30, nous générons la piste suivante, etc.

Il y a aussi une nuance: dans les partitions midi, il existe une propriété telle que la vitesse de lecture. Et cela peut changer plusieurs fois à l'intérieur de la composition. En musique21, je n'ai jamais trouvé l'occasion de suivre ces changements de vitesse. Par conséquent, la vitesse des notes générées coïncidera avec la toute première vitesse spécifiée dans le fichier midi. Il existe 2 solutions:

  1. pour chaque section avec une nouvelle vitesse, créez un nouveau fichier midi uniquement avec elle;
  2. générer à nouveau des notes de section avec le modificateur de vitesse Tempo (facteur multiplicatif de la vitesse initiale).



Je préfère ajouter mes propres pistes pour chaque vitesse dans GuitarPro, puis dans Blender, il suffit de les générer uniquement avec un modificateur de vitesse, c'est plus rapide et plus difficile à confondre.

Utilitaires Video Editor


Maintenant que vous disposez d'un projet de jeu de pistes générées, vous devez monter un couvercle observable. C'est-à-dire positionnez les pistes dans les coins de la vidéo, changez en fonction de la musique, etc. Dans un mélangeur, c'est assez mauvais. Pour appliquer l'effet à la piste, vous devez «coller» une autre piste d'en haut, qui sera rendue lors du rendu, et la mettre dans la bonne position.

Les accords sont particulièrement importants. C'est lorsque plusieurs notes sonnent en même temps, c'est-à-dire lors du rendu d'une vidéo, seule la note de tête de l'accord sera affichée. La solution a été d'ajouter le même effet (heureusement, ils ne se cassent pas lorsqu'ils se superposent). Si pendant l'édition normale des pistes générées, je pouvais tout faire manuellement, alors l'édition de chaque note de l'accord est trop. Comme vous le savez, j'ai également automatisé cette nuance. Maintenant, au simple toucher d'un bouton «Chordify strips», les échantillons sélectionnés seront transformés selon les besoins et chaque note de l'accord sera dessinée.





Et encore un point d'automatisation: parfois les échantillons générés ont des parties vides entre eux. Cela est dû au fait que les scores dans ces endroits sont soudainement des endroits vides. Dans GuitarPro, cela semble normal, en raison de divers effets, le son de la note est conservé entre les deux. Cependant, des vides se forment dans le mélangeur. Ils doivent être remplis en étirant la note précédente avant la suivante. Exactement cette tâche est effectuée par le bouton «Remplir les lacunes».

La fonctionnalité de travail avec le volume a également été écrite sur des bagatelles, ainsi que la possibilité de remplacer une note absente par une autre, mais avec une valeur différente de la hauteur, ce qui vous permet d'aller au-delà des limites de la plage de l'instrument (bien qu'en pratique, elle ne dépasse pas 1 octave).

Gloire sur YouTube


Ainsi, l'addon est prêt. Environ un mois et demi a été dépensé depuis le début de l'idée, il a travaillé le soir, pendant son temps libre. Il est temps de faire une couverture qui battra la couverture de la main de ce type. J'ai choisi la même chanson, mais dans un arrangement rock: Canon Rock. Il est beaucoup plus mélodique et plus compliqué que l'original, et démontrera clairement le nouveau niveau de mon approche. Oui, et en réponse à une vidéo déjà populaire, elle peut attirer l'attention d'un public.

Dans le texte ci-dessus, j'ai un peu trompé, car J'ai commencé à travailler sur la couverture en train d'écrire l'add-on, afin que, à l'aide de son exemple, je comprenne quelles fonctionnalités sont nécessaires et les implémente.

Et maintenant, la couverture est prête et polie ! Il a tourné l'introduction et la fin, dans laquelle, en anglais cassé, il a essayé d'expliquer la raideur de ma réponse. Il a prononcé quelques mots délibérément avec des erreurs (complimenté, double et eff), dans l'espoir d'amener les téléspectateurs à modifier dans les commentaires. Préparer un aperçu. Avec haleine, en prévision du triomphe attendu, a téléchargé et publié la vidéo. Je les ai envoyés en groupes de reprises sur des couvertures et j'ai jeté le lien sur Instagram à ce type. Soit dit en passant, il a un surnom très triomphant: Ralph Jay Triumfo.

Le temps a passé. Il n'y a pas eu de triomphe. Le premier jour, j'ai eu environ 100 vues, dont la moitié étaient les miennes et mes amies. Puis il y a eu une accalmie. Avec chaque nouveau jour, je suis devenu de plus en plus déçu par toute cette entreprise. Les gens ne comprennent-ils vraiment pas à quel point je l'ai fait? Pourquoi le bouche à oreille ne fonctionne pas? Ou peut-être que l'idée elle-même n'était cool que dans ma tête?

Quoi qu'il en soit, j'ai aimé le résultat et j'ai progressivement commencé à faire de plus en plus de nouvelles couvertures.
À cette époque, j'ai participé au tournage de l'émission «Brain Modeling» à la télévision locale, et une fois j'ai mentionné mon métier dans une conversation avec l'hôte. Le résultat a été un petit rapport sur moi. Maman, je suis à la télé !

J'ai parfaitement compris que les retraités regardent principalement la télévision locale, il n'y avait donc aucune attente.

Même alors, je voulais me rappeler le code du module complémentaire, optimiser la génération et mettre le module complémentaire dans le domaine public, mais l'échec du triomphe a diminué mon ardeur. De plus, la version complète de la nouvelle version de Blender était en cours de préparation et l'API évoluait. Je voulais attendre sa sortie cet été et transférer l'addon dans la nouvelle version, puis le sortir, mais encore une fois, il n'y avait pas de désir particulier.

Et maintenant, après presque un an, alors que les vues de la première vidéo dépassaient à peine 600, j'ai décidé de mettre un addon sur le public et d'écrire cet article, peut-être au moins cela égayera mon temps libre, mais en même temps j'ai réprimandé.

Bien sûr, j'ai essayé de transférer l'addon vers la nouvelle version 2.80, mais il s'est avéré que l'éditeur vidéo n'était pas seulement amélioré, mais même aggravé. Les performances sont bien pires, plantent parfois lors de la génération de morceaux lourds. L'éditeur lui-même a commencé à ralentir. L'impossibilité d'étouffer certaines pistes audio (j'espère que c'est un bug, et elles seront corrigées dans la prochaine version mineure). En attendant, l'addon a besoin de la bonne vieille version 2.79

Voici un lien vers l'addon , n'oubliez pas de mettre music21 sur le mélangeur d'interpréteur python. J'attends avec impatience l'apparition massive de couvertures synthétisées de votre part.

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


All Articles