Controlador MIDI programático com Python: o que você precisa saber
O fettuccine allegro é uma biblioteca Python voltada para criação e manipulação de arquivos MIDI de forma programática. Ela se destaca por oferecer uma API orientada a objetos que permite construir sequências musicais, controlar timing com precisão e gerar arquivos que funcionam em praticamente qualquer software de notação ou DAW. O nome vem diretamente do repositório no GitHub, e a documentação original fica em github.com/danny-rose/fettuccine-allegro.
O que o fettuccine allegro faz na prática
A biblioteca não toca áudio por si só. Ela gera arquivos MIDI ou stream MIDI em tempo real, dependendo da configuração. O fluxo básico é: criar um programa, definir notas com pitches e durações, aplicar timing e, por fim, exportar. A parte que as pessoas subestimam é o sistema de timing. Ele usa uma lógica de tick-based scheduling, onde cada nota é agendada com base em ticks por beat e BPM. Isso significa que sincronização real com outros tracks ou batidas de metrônomo funciona sem esforço adicional. O que eu mais vejo gente errando é aconfusão entre unidades de tempo. O sistema interno trabalha com ticks, não com segundos diretamente. Se você quer uma nota que dure exatamente meio segundo a 120 BPM com 480 ticks por beat, o cálculo fica assim: meio segundo equivale a 240 ticks, mas só se o BPM estiver fixo durante toda a seção. Se houver mudanças de tempo no meio, esse número simplesmente não se aplica mais. Eu perdi duas horas num projeto assim, achando que minhas durações estavam corretas, até entender que uma clave de tempo escondida no meio do programa havia dobrado o valor de ticks por beat. A solução foi iterar sobre os objetos de tempo antes de gerar o arquivo e verificar se o schedule realmente batia com o que eu esperava.
Instalação e requisitos
A instalação é simples, mas o ambiente precisa estar limpo. O pacote roda em Python 3.7 ou superior. Use: pip install fettuccine-allegro
Se você estiver em Windows, vale instalar também o pywinmm se quiser usar saída MIDI direta pelo sistema. No macOS, o MIDI via CoreAudio geralmente funciona sem configuração extra. No Linux, o FluidSynth costuma ser o caminho mais estável. Sem saída MIDI configurada, a biblioteca ainda gera arquivos .mid perfeitamente, então isso só é problema se você quer tocar em tempo real.
Montando um programa do zero
A estrutura básica começa com a criação de um programa e a adição de pistas. Cada pista representa um canal MIDI, e cada nota precisa de pitch, duration e tempo de início relativos ao tick zero da pista.
Exemplo prático com código
Aqui está um exemplo minimalista que eu uso quando quero testar algo rápido antes de construir algo maior: from fettuccine_allegro import Program, Note, Tempo
prog = Program() prog.add_tempo(0, Tempo(120))
👉 Clique no botão abaixo para saber mais sobre o assunto!
prog.add_note(Note(60, 480)) prog.add_note(Note(62, 480))
prog.add_note(Note(64, 480)) prog.write("escala_c_maior.mid")
Esse código gera um arquivo MIDI com três notas, cada uma durando 480 ticks no BPM 120. O arquivo resultante abre sem problema no MuseScore, Logic ou qualquer leitor básico. O tempo total fica em exatamente dois beats, ou um compasso 4/4 preenchido com três colcheias. Simples, mas funcional.
Pitfalls comuns que ninguém menciona
A primeira armadilha é o default program. Quando você não define um canal MIDI ou instrumento, ele cai num padrão que nem sempre é o que você espera. Muitos players usam piano acústico por padrão, mas alguns sintetizadores embarcados trocam isso por organo ou cordas. Se você está exportando para uso comercial ou para alguém que vai importar num DAW específico, sempre defina o programa explicitamente. Um comando como prog.add_program_change(channel, program_number) resolve isso em uma linha. A segunda armadilha é mais sutil. Notas que começam exatamente no mesmo tick são agrupadas pelo motor de exportação. Isso é bom na maioria dos casos, mas se você precisa de articulação individual, como staccato muito curto em polyphony densa, o agrupamento pode transformar duas notas adjacentes numa única execução fundida. A correção é adicionar um delta minúsculo, tipo um tick de diferença, entre elas. Funciona porque a resolução MIDI suporta frações menores que um beat sem alterar a percepção auditiva.
Quando o fettuccine allegro não serve
Se você precisa de síntese de áudio, processamento de sinais, ou geração de wav diretamente, essa biblioteca não é a ferramenta certa. Ela cuida apenas da camada MIDI. Para áudio real, você precisa de outra coisa, como o FluidSynth acoplado ou bibliotecas como soundlib ou pygame.mixer. Também não espere interface gráfica nativa. Tudo é código, e se você quer visualização, terá que integrar com outra stack, como matplotlib para mostrar notas num gráfico de piano roll ou usar ferramentas externas. Outro ponto fraco é a ausência de suporte nativo a arquivos MusicXML ou ABC. Se seu fluxo de trabalho depende de converter partituras de softwares de notação para MIDI depois de editadas, você vai precisar de um intermediário. O fettuccine allegro entra apenas na geração programática, não na edição de partituras existentes.
Alternativas quando o fettuccine allegro chega no limite
Para projetos maiores ou que precisam de sintaxe mais próxima de partitura, o mido é uma opção mais baixa nível, mas com controle absoluto sobre cada byte MIDI. Para quem prefere uma abordagem mais declarativa e orientada a estruturas musicais, o music21 oferece análise e geração com teoria musical embutida. Se o foco for interação com DAWs modernas, o python-rtmidi direto no metal também funciona, mas exige mais linha de código para atingir o mesmo nível de abstração que o fettuccine allegro proporciona.
Dicas para evitar dor de cabeça
Sempre valide o tick count total antes de exportar. Um erro comum é acumular notas que extrapolam o tempo esperado e acabar com um arquivo MIDI com silêncio silencioso no final que quebra automações em DAWs. Verificar com prog.get_max_tick() e comparar com o que você planejava evita surpresas. Outro conselho prático: gere arquivos MIDI curtos durante o desenvolvimento. Testar com 2 a 4 notas por vez e ir ampliando permite isolar bugs de timing muito mais rápido. Eu já vi gente gerar arquivos de minutos inteiros e não conseguir descobrir onde o schedule estava quebrado só porque o problema estava nas primeiras duas notas.
Se você está exportando para uso em produção, defina claramente os canais. Canais cruzados sem programação explícita criam armadilhas onde notas de uma pista aparecem no canal errado no DAW, o que gera confusão na mixagem e exige retrabalho. O fettuccine allegro é uma ferramenta útil para gerar MIDI programaticamente quando você precisa de rapidez, repetibilidade e controle sobre timing. Ele não é solução para tudo, mas dentro do seu escopo funciona de forma consistente e sem atrito. Use nos lugares certos e evite tentar transformar uma biblioteca de notação MIDI num sintetizador ou editor de partituras.