O que music-skill faz?
Os scripts residem em scripts/ ao lado deste arquivo; escreva como $S abaixo, mas escreva o caminho absoluto em cada comando, porque as variáveis de shell não persistem entre chamadas Bash.
Você não pode ouvir, então cada etapa transforma a música em algo que você pode ler: padrões como texto, números para verificar e uma imagem para olhar. Fazer uma faixa é semente → ler a partitura → renderizar → look → corrigir. Entender áudio é look → ler a linha do tempo e a ficha → julgar. Entregar é check, para que "está com a loudness correta e não vai clipar" seja um fato.
Requer uv e ffmpeg. Todo comando roda como uv run --no-project --with numpy --with scipy --with pillow python -I <script> …, escrito como RUN abaixo.
Criando uma faixa: banger.py
RUN $S/banger.py --seed 4242 --out <scratch>/b4242
Uma faixa de house ou techno de 72 compassos leva cerca de 10 segundos: track.wav (48 kHz estéreo, -14 LUFS), track.mid, score.txt e score.json. A mesma semente e opções sempre geram o mesmo arquivo.
| Desejo | Opção |
|---|---|
| Um estilo | --style deep-house (120-124 BPM), tech-house (124-128), peak-techno (130-136), melodic-techno (122-126) |
| Um andamento, uma tonalidade | --bpm 124, --key A, --mode minor (ou dorian, phrygian) |
| Uma duração | --bars 24 (qualquer número par a partir de 8), ou --seconds 30: ele escolhe os compassos e ajusta o andamento para que o último compasso termine 2,5 s antes e o reverb termine no tempo |
| Um fundo para voz | --lufs -22 --mute lead (tente também mutear clap) |
| Partes para um DAW ou verificação de mix | --stems escreve stems/<layer>.wav; track.mid é sempre escrito |
Os compassos definem a forma: 8-10 é um loop; 12-22 é intro, drop, outro; 24-46 adiciona um breakdown e um build-up entre dois drops; 48 ou mais é a forma completa com uma seção de groove e partes de 8 compassos.
Leia a partitura antes de renderizar mais. Ela imprime os padrões como texto:
seed 4242 Melodic techno 122 BPM G minor swing 1% chords: pluck
1...2...3...4...
kick X...X...X.X.X...
clap .o..X.......X...
hat x.X...X.x.X...X.
bass .....ORO.O.O3RRR
chords ...X............ i7 Gm7 | bVII7 F7 | bVI7 Ebmaj7 | iv7 Cm7
lead 47244.42.22..442 .3315.553.5.3557
perc fit 74% 1293 patterns tried weakest: Evenly spread 52%, Clear mix 20%
. pausa, o suave, x médio, X forte. Baixo: R tônica, 5 quinta, O oitava, 3 terça. Lead: grau da escala 0-9 em dois compassos. fit é quão bem a parte atende suas regras; weakest nomeia as regras que perdeu.
Para escolher uma semente, faça uma audição como texto primeiro: python3 $S/groove.py --seed N executa apenas a busca (0,5 s, sem áudio, sem dependências). Teste algumas, leia os acordes e o lead, renderize aquela que você defenderia. Você não pode julgar "soa bem": diga isso e entregue o arquivo para a pessoa.
Como uma faixa é escrita
O método vem do Banger Lab. É busca, não um modelo, e cada regra vem de um estudo de percepção rítmica ou de altura.
- Rolar. A semente escolhe um estilo, andamento, tonalidade, escala e alvos: chimbal por compasso, quanta síncope, quantos acordes diferentes.
- Adivinhar. Cada instrumento começa como um padrão aleatório de 16 passos.
- Testar. Cada mudança de um passo (adicionar, remover, deslizar, mais forte, mais suave) é pontuada contra as regras do instrumento, além de alguns saltos aleatórios de dois passos. A melhor é mantida.
- Travar. Quando nenhuma mudança aumenta a pontuação, a parte está pronta e o próximo instrumento é escrito sobre ela. Ordem: kick, clap, chimbal, chimbal aberto, percussão, baixo, acordes, lead. Cada camada ganha quatro inícios aleatórios e mantém o melhor.
- Ouvir.
banger.pyrenderiza cada instrumento sozinho, mede onde sua energia se concentra em seis faixas, e uma segunda passagem reajusta chimbal, percussão, baixo, acordes e lead para que as partes não preencham a mesma faixa no mesmo passo. - Arranjar. As partes se tornam seções, com preenchimentos no final de cada 4 e 8 compassos, um low-pass que abre durante o breakdown, um rufar de caixa e um riser no build, um tempo de silêncio e então o drop.
O que faz o groove funcionar: as regras
Use estas ao escrever ou editar música por qualquer meio: um padrão à mão, MIDI ou um prompt para um modelo de música. score.json tem a pontuação e a fonte de cada regra para uma faixa.
| Parte | Regra | Fonte |
|---|---|---|
| Kick | em cada tempo; no máximo 0-2 extras, colocados logo antes de um tempo; nunca dois seguidos | Butler 2006 |
| Clap | forte nos tempos 2 e 4, ausente nos tempos 1 e 3; extras são suaves e em semicolcheias fracas | Butler 2006; Witek 2014 |
| Chimbal | nas contracorrentes, entre os kicks; uniformemente distribuído; igual nas duas metades do compasso; forte e suave alternados | Butler 2006; Toussaint 2005 |
| Chimbal aberto | no meio entre dois kicks, nunca em cima de um kick ou clap | Butler 2006 |
| Percussão | uniformemente distribuída, onde kick e clap estão silenciosos, com 25-50% de notas fantasmas suaves | Toussaint 2005; Witek 2014 |
| Baixo | toca onde o kick não toca; tônica (ou sua oitava) 60-90% do tempo, quinta ou terça para cor | Plomp & Levelt 1965; Krumhansl & Kessler 1982 |
| Acordes | o compasso 1 é o acorde principal; as fundamentais se movem por grau conjunto, terça ou quarta; cada voz se move pelo caminho mais curto para o próximo acorde | Krumhansl & Kessler 1982; Tymoczko 2011 |
| Lead | notas do acorde nos tempos fortes; nunca um semitom acima de uma nota do acorde; passos pequenos; compasso 1 pergunta (termina fora da nota principal), compasso 2 responde com ritmo semelhante (termina nela); toca nas lacunas entre os acordes | Plomp & Levelt 1965; Huron 2001; Caplin 1998 |
| Tudo | síncope média: algumas notas em passos fracos que pulam um passo forte. Pouco é rígido, demais perde o ritmo | Witek et al. 2014 |
| Temporização | swing e push/pull ficam abaixo de 12 ms por instrumento (chimbal atrasado, clap adiantado). Deslocamentos maiores reduziram as avaliações de groove | Davies et al. 2013 |
| Mixagem | duas partes na mesma faixa no mesmo passo se borram mutuamente; no máximo 4 partes acertando um passo | Plomp & Levelt 1965 |
| Forma | breakdown, build-up e drop: tire o kick e o baixo, aumente a tensão, traga-os de volta | Solberg & Dibben 2019; Butler 2006 |
Cada nota vem de uma escala e o kick é afinado na nota principal, por isso qualquer semente permanece na tonalidade. Os pesos entre regras são uma simplificação, não ajustados a dados de audição, então fit classifica padrões dentro de uma faixa; não é uma pontuação de qualidade entre faixas.
Ouvindo: look
RUN $S/listen.py look TRACK --sheet <scratch>/sheet.png
Funciona em qualquer coisa que o ffmpeg decodifique, incluindo som de vídeo e música de um modelo generativo. Imprime andamento, tonalidade, loudness, pico verdadeiro, balanço, largura estéreo, avisos e uma linha do tempo:
track.wav 2:24.1 122.0 BPM (força 7.9) G minor (pontuação 1.62; próximo Eb major 1.61)
loudness -14.0 LUFS pico verdadeiro -1.3 dBTP faixa 9.3 LU pico-para-loudness 12.7 dB
balanço, dB abaixo da faixa mais alta sub -2 bass 0 low mid -8 mid -17 high -24 air -27
linha do tempo, janelas de 15.7 s (8 compassos): loudness, depois cada faixa em dB contra seu nível em toda a faixa
início LUFS sub bass low mid mid high air
0:47.2 -12.6 +2 +2 +1 +2 +1 -2
1:03.0 -21.1 -29 -12 +1 -7 -7 -6
1:18.7 -20.5 -33 -12 +1 -1 +3 +6
1:34.4 -12.6 +2 +2 +1 +2 +1 -0
Leia a estrutura pela linha do tempo. Sub e bass 20-30 dB abaixo é um breakdown (kick e baixo estão ausentes). High e air subindo enquanto sub fica fora é um build. Tudo de volta de uma vez é o drop. Em seguida, leia a ficha (forma de onda, espectrograma, seis faixas, curva de loudness): um riser é uma linha diagonal, um kick é uma coluna de pontos brilhantes na parte inferior, um bloco plano de cor sem lacunas é uma mixagem sem dinâmica. Dê os tempos a partir do eixo da ficha ao descrever um momento.
Quão confiável é, medido em 24 faixas renderizadas com respostas conhecidas:
- Andamento: dentro de 0.2 BPM em 24 de 24. Prefere 70-190 BPM, então metade ou dobro do tempo é possível em outro material. Força abaixo de 2 significa sem batida estável: diga que o BPM é um palpite.
- Tonalidade: a nota principal estava correta em 19 de 24, e é menos confiável em áudio curto ou esparso. Maior vs menor é uma conclusão mais fraca, e não consegue distinguir modos. Quando as duas maiores pontuações estão próximas, ele informa; relate ambas.
- Loudness e pico verdadeiro: os mesmos números que
ffmpeg -af ebur128=peak=truecom 0.1 de precisão.
Stems uns contra os outros: mix
RUN $S/listen.py mix <scratch>/b4242/stems
Por stem: loudness e onde sua energia se concentra. Depois, os pares que mais se sobrepõem (mesma faixa, mesmo momento), e stems muito silenciosos em comparação com o mais alto. Um par acima de 60% são duas partes brigando pelo mesmo espaço: mova uma no tempo, altura ou nível.
Números a atingir e verificar
| Alvo | Número |
|---|---|
| Uma faixa sozinha (streaming normaliza perto disso) | -14 LUFS integrado |
| A mixagem final de um vídeo web ou podcast | -16 LUFS |
| Um fundo sob uma voz | cerca de -22 LUFS |
| Pico verdadeiro, sempre | -1 dBTP ou abaixo: a codificação com perda ultrapassa |
| Pico-para-loudness abaixo de 7 dB | excessivamente limitado: plano e cansativo |
| Correlação estéreo abaixo de 120 Hz inferior a 0.6 | o baixo pode desaparecer em mono (telefones, clubes) |
RUN $S/listen.py check TRACK --lufs -14 --peak -1 --seconds 30 --bpm 124
check deve passar antes de entregar um arquivo; ele sai com código 1 em caso de falha. Ele também falha em clipping e silêncio no início. Música de um modelo precisa disso mais: um fundo gerado mediu +3.2 dBTP com 2.121 amostras clipeadas. Corrija com ffmpeg (loudnorm=I=-14:TP=-1.5:LRA=11), depois verifique novamente.
Entregando
- Cópia pequena:
ffmpeg -i track.wav -c:a aac -b:a 160k track.m4a(ou-c:a libmp3lame -q:a 2). Executecheckna cópia: a codificação desloca o pico verdadeiro. - Sob um filme: renderize com
--seconds <duração do filme>e--lufs -22, e entregue ao video-skill, que verifica a mixagem final. - Um loop:
--bars 8, depois corte a cauda de 2.5 s (-t <8 compassos em segundos>) para que repita de forma limpa. - Mantenha
score.txtjunto com o arquivo: sua última linha é o comando exato que o criou.
Quando esta é a ferramenta errada
banger.py cria música eletrônica four-on-the-floor a partir de osciladores e ruído. Não tem samples, vocais ou outros gêneros, e sua mixagem é mais escura e estreita que uma gravação masterizada (o médio da demo fica 17 dB abaixo do seu baixo). Para instrumentos acústicos, uma canção ou um clima nomeado, use um modelo de música ou uma faixa de biblioteca, depois execute look e check no resultado. O que esta ferramenta oferece em vez disso: andamento, tonalidade e duração exatos, o mesmo resultado da mesma semente, stems, MIDI, nada para licenciar e uma razão para cada nota.
Erros comuns
| Erro | Correção |
|---|---|
| Dizer que uma faixa "soa ótima" | Você não a ouviu. Relate os números e o que a ficha mostra; a pessoa julga o som |
| Renderizar 20 sementes para escolher uma | groove.py --seed N imprime a pontuação em 0.5 s; renderize a escolhida |
Comparar fit entre faixas | Ele classifica padrões apenas dentro de uma faixa |
| Confiar na tonalidade de um clipe de 10 segundos | Forneça os dois principais candidatos |
Entregar o WAV sem check | Verifique-o e verifique também a cópia codificada |
| Música de um modelo usada como está | look primeiro: clipping e picos +dBTP são comuns |
| Um fundo competindo com a voz | --lufs -22 --mute lead e mantenha 1-4 kHz livres |