Uma estação de partituras local que só informa o que consegue medir
O ARPEON é meu aplicativo desktop open source para ler, editar e estudar partituras. Módulos Java cuidam da música, do áudio e dos arquivos; uma interface Angular roda numa janela Chromium embutida. É um pré-lançamento: o código é público, os binários para Windows ainda não.
Contexto
Estudar por partitura costuma significar alternar entre ferramentas: uma para ler, outra para reproduzir, um afinador, um metrônomo e alguma coisa para gravar uma tentativa e comparar com o que estava escrito. A maioria exige conta online ou envia o áudio para um servidor. O ARPEON junta esse ciclo num único aplicativo desktop que roda inteiro na máquina à sua frente.
É open source sob AGPL-3.0-or-later e ainda está em pré-lançamento. A versão 0.1.1 foi publicada como código-fonte; uma build 0.1.2 para Windows existe localmente, mas os binários públicos ficam retidos até fecharem os critérios de lançamento de assinatura, redistribuição e recuperação.

O problema
Software musical falha em silêncio. Um parser que descarta uma segunda voz, um motor de reprodução que arredonda uma quiáltera ou um afinador que reporta uma altura confiante para ruído produzem resultados que parecem certos. Desenhar notas na tela é a parte fácil. A difícil é manter uma representação exata da música da importação à edição, reprodução e análise — e se recusar a fingir quando uma entrada não pode ser representada.
O segundo problema é o formato da aplicação. A interface pede um framework web moderno e um renderizador de notação; captura de áudio, tempo e arquivos pedem um runtime com acesso direto à máquina. Juntar os dois sem cuidado dá uma página web com o microfone ligado ao JavaScript ou uma interface nativa cara de evoluir.
Restrições
Arquitetura
A aplicação são dois programas entregues como um. O Java 25 cuida do domínio musical, do parsing de MusicXML, da captura de áudio, da detecção de afinação, do transporte MIDI e do armazenamento de projetos. A interface em Angular 22 renderiza a notação com OpenSheetMusicDisplay e roda dentro de uma janela Chromium embutida via JCEF, então o renderizador vai junto com a aplicação em vez de depender do navegador instalado.
As duas metades conversam por HTTP em 127.0.0.1, numa porta efêmera, autenticadas por um token de sessão aleatório de 256 bits gerado com segurança criptográfica. As requisições são limitadas, Host e Origin são verificados, o CORS fica desligado e não existe ponte JavaScript–Java. Só dados da partitura e medições atravessam essa linha; o microfone pertence ao Java.
Abaixo da aplicação desktop, onze módulos Gradle dividem o trabalho: domínio, MusicXML, áudio, DSP, afinador, transporte, reprodução, importação, OMR, análise e um experimento offline de machine learning. O módulo de domínio não depende de nenhum outro, e nenhum módulo musical conhece a janela, o instalador ou a camada HTTP.
Decisões-chave e trade-offs
Cinco decisões moldaram o sistema, e cada uma custou algo.

Qualidade e testes
O repositório tem 242 testes JUnit e 184 testes Vitest. O CI compila e testa os módulos Java em Windows, Linux e macOS, roda formatação, lint, checagem de tipos, testes e build de produção do frontend, e verifica as licenças das dependências. Os testes usam áudio sintético e fixtures salvas, então a detecção de afinação e o pipeline de reconhecimento são exercitados sem microfone.
Um CI verde no macOS significa que os módulos funcionam lá, não que exista instalador para macOS. Latência de microfone, qualidade do sintetizador e dispositivos de áudio reais ainda precisam de aceite em hardware físico, e o repositório diz isso em vez de deixar um build aprovado sugerir o contrário.
Resultados
O que existe: uma build desktop para Windows com importação e edição de partituras, reprodução MIDI com loops e metrônomo, afinador cromático, relatórios de desempenho com andamento fixo, reconhecimento de PDF e imagem com revisão, perfis de estudo locais e um instalador MSI por usuário. A validação local exercitou instalação, reparo, atualização, rejeição de downgrade, desinstalação e reinstalação preservando projetos e preferências, e abriu a aplicação sem Java nem Node no PATH.

O que ainda não existe: um lançamento público dos binários. Assinatura de código confiável, um feed de atualização em produção e algumas obrigações de redistribuição continuam abertos, e o rollback do instalador falhou sob injeção de falhas na máquina de teste. Isso está listado no repositório como critérios em aberto, não escondido atrás de um botão de download.
Retrospectiva
A primeira versão abria o navegador do sistema a partir de um launcher Java. Era o tamanho certo para a primeira fatia vertical — um afinador funcionando — e o formato errado para um produto: a experiência dependia do navegador instalado, e o microfone ficava preso a uma aba aberta. Migrar para uma janela Chromium embutida só foi barato porque o contrato loopback já existia; a interface não precisou mudar.
O que eu repetiria é falhar fechado. Todo importador rejeita o que não consegue representar fielmente. Isso deixa a lista de recursos mais curta — MSCZ de uma pauta, rascunhos de MIDI monofônico — mas nada que o usuário abre fica silenciosamente diferente do arquivo que ele escolheu.