Friday, August 29, 2014

Escrevendo um sintetizador... em Java

Java. Um sintetizador. Estou escrevendo o último com o primeiro. As primeiras perguntas que me fazem a respeito disso são: por que você está escrevendo um sintetizador? Por que Java?

Estou realmente escrevendo um sintetizador subtrativo em Java. "Por que?", você me perguntaria. Tenho dois objetivos com este projeto:
  1. Desafiar a mim mesmo, aprender algo novo, e escrever software que vou gostar de usar com frequência.
  2. Demonstrar que Java é poderoso o suficiente para sintetizar áudio decente em tempo real.
Nesta série de posts, vou descrever os desafios e compartilhar o conhecimento que adquiro ao longo desta aventura.

(Nota: estarei usando links para a Wikipédia em inglês porque o conteúdo é muito mais completo que as versões em português.)

Por que um sintetizador?

Muita gente não sabe, mas eu sou fanático por música eletrônica (em particular: várias formas de Trance, incluindo Uplifting TranceGoa TrancePsychedelic TranceDrum & Bass e variantes como Neurofunk; alguns Breakbeats; e outras coisas), o suficiente para começar a me envolver com produção musical. Estudei um pouco de teoria musical, procurei por tutoriais, dicas e truques em todo lugar e segui alguns canais no YouTube de grandes produtores por aí para aprender mais sobre a área. Brinquei com vários sintetizadores e efeitos e experimentei alguns DAWs, sendo FL Studio o meu favorito.

O passo natural após esta fase de experimentação, para um programador ávido que está sempre em busca de um desafio, é aprender como essas coisas funcionam por dentro. E qual a melhor forma de fazer isso? Ora, mas é claro: escrever código!

Claro que escrever um sintetizador (ou qualquer software, nesse caso) não se resume a escrever código. Você precisa saber os conceitos por trás do que deseja escrever.

Para construir os mecanismos internos de um sintetizador, você precisa ter um bom fundamento em Processamento de Sinais Digitais, ou DSP na sigla em inglês, e conhecimento prático de MIDI se você quer que ele responda a instrumentos reais e DAWs. Também é bom aprender sobre a tecnologia VST da Steinberg, uma das mais populares interfaces de software para sintetizadores e efeitos de áudio, e tecnologias similares, como DXiRTAS e Audio Units, pois elas vão permitir que você use seu plugin em praticamente qualquer DAW existente.

Como um bônus, escrever meu próprio sintetizador significa que eu posso dar meu próprio toque às minhas músicas. (Apesar de que eu ainda tenho que terminar e publicar uma...)

Por que Java?

Minha linguagem escolhida foi o Java em parte por causa da experiência que eu tenho com ela, mas principalmente porque eu queria um desafio extra escrevendo um sintetizador em uma linguagem que é geralmente considerada inadequada para processamento numérico em tempo real (e provar que ela realmente está à altura da tarefa).

Como eu gostaria que o sintetizador integrasse com o FL Studio, eu tive que procurar uma biblioteca Java que me fornecesse uma implementação de uma das interfaces de plugins de áudio supportadas pelo DAW. jVSTwRapper foi minha escolha; ela faz um ótimo trabalho de manter o overhead nativo-Java muito baixo e fornece uma API que lembra bem de perto a nativa em C++ ao mesmo tempo que dá aquele gostinho de orientação a objetos.

Também tive que escrever uma GUI simples para testar o sintetizador por si só em Java sem precisar passar por um processo de build completo e reiniciar meu DAW toda vez que fazia alterações em código. Isto não foi tão desafiador quanto antes, pois eu já havia escrito um player de música tracker em Java (suportando MODS3M e IT) e o funcionamento é bem similar.

Ah, e Java é a linguagem principal dos aplicativos para Android. Quem sabe no futuro vocês poderão estar brincando com meu sintetizador no seu smartphone. Já pensou que legal?


Fiquem ligados!

No comments:

Post a Comment