Gerador de capa de música Python no Blender

Neste artigo, falarei sobre meu complemento para o liquidificador, sobre os motivos que me levaram a criá-lo, o processo de desenvolvimento e o "sucesso" no YouTube.




Antecedentes


Tudo começou com o fato de que há cerca de um ano (em novembro de 2018) eu vi na oferta do YouTube uma capa tão incomum em The Ultimate Canon

O cara gravou as amostras de cada nota da música e, através de edição cuidadosa, montou a música inteira a partir delas. Para quem é, mas acho que é pelo menos engraçado. E o número de visualizações (na época um pouco mais de 1.000.000) indicava que o tópico ( 1% de habilidade de guitarra e 99% de edição ) era popular.

Tenho certeza de que aqueles que estavam pelo menos um pouco envolvidos na mixagem de músicas sabem que às vezes é mais fácil cortar e mover a faixa um pouco do que pedir ao guitarrista descuidado que reproduza a parte. Eu também costumava fazer capas clássicas e, mesmo assim, tive a ideia de criar uma capa exatamente como o cara do vídeo. E agora vejo que "minha ideia foi descaradamente roubada" e tive um bom escapamento. Fiquei aborrecido porque meu trem partiu, mas de repente me ocorreu que eu poderia fazer o mesmo, mas em um nível diferente, adicionando uma nova etapa - 1% de guitarra 1% editando 98% de habilidades de programação .

Além disso, isso permitirá criar composições muito mais complexas que, quando editadas manualmente, poucas pessoas têm paciência.

Desenvolvimento


Portanto, a tarefa era automatizar o processo de fatiar amostras de som em uma composição musical.

Antes de tudo, era necessário transmitir de algum modo aos dados futuros do programa sobre a composição, suas notas, faixas, instrumentos. Pensei imediatamente no GuitarPro e suas opções de exportação de dados: MusicXML e MIDI.

Pesquisas me levaram a escolher um analisador para arquivos midi no Python music21 . Este não é apenas um analisador, mas, além disso, não preciso de nada do módulo. E os análogos estavam com documentação terrível ou não podiam fazer o que eu precisava tão facilmente quanto a música21.

Ótimo, agora posso obter dados de arquivos midi sobre faixas, anotações, posição e duração. Nós estamos indo além.

Agora, com base nesses dados, você precisa cortar de arquivos de vídeo / áudio. Então eu escolhi rápido o suficiente. Definitivamente o Blender, apesar de suas modestas capacidades como editor de vídeo. Tenho experiência em trabalhar com o Adobe PremierePro, After Effects, mas existe meu próprio dialeto de script, que não é útil em nenhum outro lugar, e seus recursos são desconhecidos para mim. No Blender, quase qualquer ação pode ser executada através de um script Python. E isso já corresponde à linguagem da música21. Vale a pena explicar que, naquela época, eu não conhecia o Python, portanto, também considerei esse projeto uma excelente ocasião para me familiarizar com essa linguagem popular. Bingo!

Gradualmente, comecei a me aprofundar no idioma, emitindo notas de arquivos médios para o console por meio do music21, rapidamente observei como criar complementos no liquidificador e passei à primeira tarefa prática: gerar dados de amostra. Ele gravou todas as notas únicas no violão e começou a cortar, mas logo parou. Meu programador interno protestou contra esse trabalho meticuloso (e pode haver muitas notas para cada instrumento: 30-50). E isso teria que cortar as notas e renderizá-las individualmente em arquivos separados, e, para isso, ajustar cada nota de trilha no início da linha do tempo ... Em geral, esse processo teve que ser simplificado.

A solução foi usar algo no Blender como marcadores. Estes são essencialmente pontos com informações textuais que podem ser definidas em um quadro específico. A lógica era a seguinte: o usuário organiza seu vídeo e áudio (se o áudio foi gravado em uma faixa separada), direciona-os um para o outro e marca com os marcadores o início de cada nota no vídeo, e no texto do marcador indica que tipo de nota é (A #, D, C e etc.) e sua duração máxima no registro. Em seguida, as informações sobre os marcadores são registradas em um arquivo e já são usadas ao cortar notas individuais.



O próximo ponto já era o “núcleo” real do funcional - notas de corte e seu posicionamento na linha do tempo. Ironicamente, não há nada de especial a dizer: havia muita documentação de leitura, a documentação do Blender estava longe de ser sempre bastante detalhada, mas gradualmente eu consegui o que queria. Quando vi (e ouvi) o primeiro resultado (era uma composição curta do grupo Epidemic - Frodo), a felicidade não tinha limites. Eu acho que todo mundo conhece o sentimento quando algo finalmente sai.



A qualidade do código é ruim. Eu tentei fazê-lo às pressas, porque Imaginei que não era o único que pensava em algo assim e não gostaria de me antecipar aqui (spoiler! Quão ingênuo eu era). Portanto, não houve tempo para aderir ao estilo e refletir sobre a estrutura, tentei obter um protótipo de trabalho mais rápido.

Nuances


Agora, as nuances da implementação. O Blender tem um limite nas camadas do editor, no máximo 32. Na imagem, você pode ver que as amostras de áudio e vídeo (verde e roxo) ocupam 14 camadas cada e são formadas em ordem crescente, e novamente no início de seu setor. Isso se deve ao fato de o Blender não permitir que você crie uma amostra em cima de outra. E na música, muitas vezes acontece que a próxima nota começa mesmo antes do final do som anterior. Portanto, para evitar sobreposição, decidi gerar a próxima nota em uma camada superior à anterior e, quando as camadas do setor terminarem, começar novamente a partir da primeira camada (é improvável que a primeira nota soe até 14 camadas à frente). Sim, isso poderia ser feito de maneira mais inteligente, salvando camadas, mas como eu disse, estava com pressa.

O mais atento pode notar que o setor inteiro é de 2 por 14 camadas, isso é 28 e o máximo no Blender é 32. O fato é que, para notas de desova, você precisa gerar 2 faixas originais (vídeo e áudio) através de um script e depois cortá-las nota. E você não pode aparecer em cima de outra faixa, então reservei as camadas 31 e 32 para esse negócio. Os dias 29 e 30 são usados ​​para armazenamento intermediário de faixas já geradas: a geração ocorre em uma faixa do arquivo midi, as notas são agrupadas em uma faixa, transferidas para a camada 29/30, geramos a próxima faixa etc.

Há também uma nuance: nas pontuações médias, existe uma propriedade como a velocidade de reprodução. E isso pode mudar muitas vezes dentro da composição. Na music21, nunca encontrei a oportunidade de acompanhar essas mudanças de velocidade. Portanto, a velocidade das notas geradas coincidirá com a primeira velocidade especificada no arquivo midi. Existem 2 soluções:

  1. para cada seção com uma nova velocidade, faça um novo arquivo midi somente com ele;
  2. gere notas de seção novamente com o modificador de velocidade Tempo (fator multiplicativo à velocidade inicial).



Prefiro adicionar minhas próprias faixas para cada velocidade no GuitarPro, depois no Blender, basta gerá-las com um modificador de velocidade, é mais rápido e mais difícil ficar confuso.

Utilitários de edição de vídeo


Agora que você possui um conjunto de rascunhos de faixas geradas, é necessário montar uma capa assistível de assistir. I.e. posicione as faixas nos cantos do vídeo, troque de acordo com a música etc. No liquidificador, isso é muito ruim. Para aplicar o efeito à faixa, você precisa “colar” outra faixa de cima, que será renderizada ao renderizar e colocá-la na posição correta.

De nota particular são acordes. É quando várias notas tocam ao mesmo tempo, ou seja, ao renderizar um vídeo, apenas a nota de topo do acorde será exibida. A solução foi adicionar o mesmo efeito (felizmente, eles não se quebram quando sobrepostos). Se durante a edição normal das faixas geradas eu pudesse fazer tudo manualmente, editar demais todas as notas do acorde. Como você sabe, eu também automatizei essa nuance. Agora, com o clique do botão "Chordify strips", as amostras selecionadas serão transformadas conforme necessário e cada nota do acorde será desenhada.





E mais um ponto de automação: às vezes as amostras geradas têm partes vazias entre si. Isso se deve ao fato de que as pontuações nesses locais são subitamente vazias. No GuitarPro, isso soa normal, devido a vários efeitos, o som da nota é mantido no meio. No entanto, vazios se formam no liquidificador. Eles devem ser preenchidos esticando a nota anterior antes da próxima. Exatamente essa tarefa é realizada pelo botão "Preencher lacunas".

A funcionalidade para trabalhar com o volume, bem como a capacidade de substituir uma nota ausente por uma nota diferente, mas com um valor diferente da afinação, também foi escrita para pequenas coisas, o que permite ir além dos limites da faixa do instrumento (embora na prática não ultrapasse 1 oitava).

Glória no youtube


Então, o complemento está pronto. Cerca de um mês e meio foi gasto desde o início da idéia, ele trabalhava à noite nas horas vagas. Está na hora de fazer uma capa que vai bater na capa da mão daquele cara. Eu escolhi a mesma música, mas em um arranjo de rock: Canon Rock. É muito mais melódico e complicado do que o original e demonstrará claramente o novo nível da minha abordagem. Sim, e como resposta a um vídeo já popular, pode atrair a atenção de um público.

No texto acima, eu me enganei um pouco, porque Comecei a trabalhar na capa no processo de criação do complemento, para que, usando o exemplo dele, entenda que funcionalidade é necessária e a implemente.

E agora a capa está pronta e polida ! Ele filmou a introdução e o final, nos quais, em inglês quebrado, ele tentou explicar a inclinação da minha resposta. Ele falou algumas palavras deliberadamente com erros (elogiado, duplo efeito), esperando que os espectadores alterassem os comentários. Preparou uma visualização. Com a respiração suspensa, antecipando o triunfo esperado, carregou e publicou o vídeo. Enviei-os em grupos de capas e joguei o link no Instagram para aquele cara. A propósito, ele tem um apelido muito triunfante: Ralph Jay Triumfo.

O tempo passou. Não houve triunfo. No primeiro dia, obtive cerca de 100 visualizações, metade das quais eram minhas e minhas amigas. Então houve uma pausa. A cada novo dia eu ficava cada vez mais decepcionado com todo esse empreendimento. As pessoas realmente não entendem o quão legal eu fiz isso? Por que o boca a boca não funciona? Ou talvez a ideia em si fosse legal apenas na minha cabeça?

Seja como for, gostei do resultado e gradualmente comecei a fazer mais e mais capas novas.
Naquela época, participei das filmagens do programa “Modelagem Cerebral” na TV local e uma vez mencionei meu ofício em uma conversa com o apresentador. O resultado foi um pequeno relatório sobre mim. Mãe, eu estou na TV !

Eu entendi perfeitamente que os aposentados assistem principalmente à TV local, então não havia expectativas disso.

Mesmo assim, eu queria trazer o código do complemento à minha mente, otimizar a geração e colocar o complemento em domínio público, mas a falha do triunfo diminuiu meu ardor. Além disso, o lançamento completo da nova versão do Blender estava sendo preparado e a API estava mudando. Eu queria esperar pelo seu lançamento no verão e transferir o complemento para a nova versão, e depois lançá-lo, mas, novamente, não havia nenhum desejo em particular.

E agora, depois de quase um ano, quando as visualizações do primeiro vídeo mal excederam 600, decidi colocar um complemento no público e escrever este artigo, talvez pelo menos isso ilumine meu tempo de lazer, mas ao mesmo tempo eu falei.

Obviamente, tentei transferir o complemento para a nova versão 2.80, mas o editor de vídeo não apenas não foi melhorado, mas também piorado. O desempenho é muito pior, às vezes falha ao gerar faixas pesadas. O próprio editor começou a desacelerar. A incapacidade de abafar certas faixas de áudio (espero que isso seja um bug, e elas serão corrigidas no próximo lançamento menor). Enquanto isso, o complemento precisa da boa e antiga versão 2.79

Aqui está um link para o complemento , não esqueça de colocar music21 no interpretador python blender. Estou ansioso pela aparência maciça de capas sintetizadas suas.

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


All Articles