Roadmap
O que existe e o que está planejado
O Manguebyte pretende se tornar o equivalente completo do JUCE para Rust. Isso é trabalho de anos, então ele está dividido em fases, e cada fase deixa o framework útil para um conjunto maior de projetos que a anterior.
Nada aqui é promessa nem cronograma. É uma declaração de direção, e muda conforme as pessoas aparecem e constroem. Se um item interessa a você, abra uma issue e diga.
- Pronto
- Em andamento
- Não começado
Fase 0: fundação (v0.1)
Os tipos sobre os quais todo o resto é construído, e o bastante em volta deles para fazer som.
manguebyte-core:AudioBuffer,Sample,Smoothed, floats atômicos, fila SPSC wait-free, conversões de decibéismanguebyte-dsp: traitProcessor, cadeias em tuplas resolvidas na compilação, oscilador com banda limitada, filtros biquad, ADSR, linha de atraso e eco, ganhomanguebyte-midi: mensagens de voz de canal,MidiBuffercom precisão de amostramanguebyte-formats: leitura e escrita de WAVmanguebyte-devices: reprodução no dispositivo de saída padrãomanguebyte: crate de fachada e prelude
Fase 1: uma caixa de ferramentas de áudio completa
Tudo de que um aplicativo de áudio independente precisa, menos a interface com o usuário.
Dispositivos
- Entrada de áudio e streams full-duplex
- Listagem e seleção de dispositivos; escolha da taxa de amostragem e do tamanho do buffer
- Avisos de conexão a quente e de troca do dispositivo padrão
- Compensação do desvio de relógio entre dispositivos duplex por reamostragem adaptativa (o reamostrador necessário já existe)
- Escolha do host de áudio (ASIO, JACK, PipeWire)
- Portas MIDI de entrada e de saída, com tempo sem jitter até a thread de áudio
MIDI
- Mensagens de sistema comuns, de tempo real e SysEx
- Running status e um parser de fluxo de bytes
- Leitura e escrita de arquivos MIDI padrão, com tempo que respeita o andamento
- MIDI 2.0: Universal MIDI Packets com todos os tipos de mensagem, e tradução do MIDI 1.0 para o 2.0 como a especificação manda
- RPN e NRPN, zonas MPE, alocação de canais e acompanhamento por nota, e um estado de teclado que a interface lê enquanto a thread de áudio escreve
- MIDI 2.0 e MPE entregues aos processadores como eventos por nota, e pelas camadas de dispositivos e de plugins
DSP
- FFT de qualquer tamanho, FFT real e funções de janela
- Análise de espectro: transformada de Fourier de tempo curto com qualquer tamanho, salto e janela, balística, retenção de pico, bandas em frações de oitava, ponderação A e C
- Ressíntese por overlap-add para processamento espectral
- Reamostragem em qualquer razão, e oversampling de 2, 4, 8 ou 16 vezes
- Filtro de variável de estado, estável com modulação em taxa de áudio
- Projeto de passa-baixas FIR (sinc com janela de Kaiser)
- Filtros de um polo e ladder, estáveis com modulação em taxa de áudio
- Projeto de IIR de ordem alta: Butterworth, Chebyshev I e II, elíptico, ordem 1 a 16, deslizando entre projetos sem explodir
- Crossovers Linkwitz-Riley, de 2 a 5 bandas que somam plano
- Processador de filtro FIR, escolhendo convolução direta ou por FFT conforme o tamanho
- Dinâmica: compressor com soft knee, noise gate
- Limitador look-ahead cujo teto vale para todas as amostras
- Expansor, e sidechain para o compressor, o gate e o expansor, escolhido por processador
- Reverb (rede de atrasos realimentados)
- Chorus e flanger, phaser, mistura dry/wet com compensação de latência, panner, seguidor de envelope, linhas de atraso interpoladas
- Convolução: particionada de modo uniforme, com latência zero ou de uma partição, estéreo verdadeiro e respostas trocadas com crossfade enquanto toca. Um esquema não uniforme, mais barato para respostas longas com blocos pequenos, não foi começado
- Ruído (branco, rosa, marrom), LFO sincronizado ao andamento, waveshaper, bloqueador de DC
- Oscilador de wavetable: banda limitada por mip-map, com morphing entre quadros e modulação de fase
- Sampler: um player de SFZ (
manguebyte-sampler): multisamples, camadas de velocidade, round robin e camadas aleatórias, pontos de loop com crossfade, samples de release, grupos de choke e limites de polifonia, de arquivos ou da memória, também em WebAssembly, aberto para que qualquer programa toque os instrumentos que o Parabolic exportar. Os samples são carregados inteiros, não lidos do disco em fluxo; filtros, LFOs, modulação por controladores e keyswitches não foram começados - Alocação de vozes polifônica com expressão e modulação por nota, acentos e legato
- Instrumentos: cordas dedilhadas por modelagem física (violões, guitarras e baixos), FM de quatro operadores, um órgão de tonewheel com caixa rotativa, a bateria e o bumbo-baixo da clássica bateria eletrônica analógica, e um baixo acid; cada um uma
Voicecom presets, medida em afinação, decaimento, velocidade e acento - Kits de bateria: bateria acústica e pratos por síntese modal, calibrados com gravações de uma caixa e de um prato de verdade; os 909, 606, CR-78 e 808; kits de trap, techno, house, drum and bass e lo-fi
- Medição: loudness segundo a ITU-R BS.1770 e a EBU R 128 (conferido com os sinais de teste da EBU), true peak, pico, RMS, VU, PPM, correlação estéreo
- Detecção de altura (YIN e o método de McLeod) com o nome da nota
- Eventos com precisão de amostra, transporte e sidechain na chamada de processamento
- Operações de buffer aceleradas por SIMD
Formatos
- Leitores e escritores em fluxo, que não carregam o arquivo inteiro, com busca exata até a amostra, RF64 e pontes wait-free para tocar e gravar a partir de um callback de áudio
- Leitura e escrita de AIFF e AIFF-C
- Decodificação de FLAC
- Reconhecimento do formato pelo conteúdo do arquivo
- Decodificação de Ogg Vorbis e MP3, sem lacunas e com busca exata
- Decodificação de Opus
- Codificação de FLAC, conferida com o FFmpeg
- Codificação de Ogg Vorbis
- Metadados, cue points e marcadores de loop
Rede
- Open Sound Control: codec, padrões de endereço, UDP e TCP, e uma ponte de tempo real que põe os bundles com time tag no seu frame exato
Núcleo
- Sistema de parâmetros: faixas, enviesamento, conversão em texto, suavização
- Eventos de automação de parâmetro com precisão de amostra
- Gestos de mudança (começo e fim de uma edição do usuário): uma guarda
Gestureno contrato de editor, enviada aos hosts CLAP como eventos de gesto e aos hosts VST 3 comobeginEdit,performEditeendEdit - Salvar e restaurar o estado dos parâmetros, com tolerância a mudanças de versão
- Descrições dos parâmetros como dado e como JSON (faixa, curva, passos, nomes, suavização), para editores fora do Rust, como o do Aratu
- Proteção contra denormais:
NoDenormals, mantida pelos wrappers, pelo motor standalone, pelos streams de dispositivo e pelo harness de testes - Verificação de alocação em builds de depuração (hoje é um alocador só dos testes)
- Suporte a
no_stdemmanguebyte-coreemanguebyte-dsp
Fase 2: plugins
Escrever o processador uma vez e distribuir em todos os formatos.
manguebyte-plugin: a API de plugin independente de formato, o estado do plugin e um harness que roda o plugin num teste unitário, sem host- CLAP: portas de áudio e de notas, entrada de eventos com precisão de amostra, parâmetros, estado, latência, aviso de mudanças de parâmetro ao host. Conferido no CI pelo validador do projeto CLAP
- CLAP
gui,timer-supporteposix-fd-supportpara plugins com editor, testados pela interface C contra editores e hosts falsos, inclusive editores domanguebyte-guinuma janela sem tela; ainda não abertos num host de verdade - Extensões CLAP que ainda faltam: automação por nota, fim de nota e informação de vozes, áudio em 64 bits, cauda, presets, controles remotos
- VST 3: barramentos de áudio e de eventos, cada ponto de automação no seu frame, notas com ids, afinação e expressão de nota, os controladores MIDI que o plugin declara por parâmetros ocultos, parâmetros, unidades, estado, latência. Conferido no CI pelo validador da Steinberg em Windows, Linux e macOS
- Interfaces de editor do VST 3: o component handler guardado e usado nas edições,
IPlugViewcom escala de conteúdo, mostrando o editor ao ser anexado,IPlugFrameeIRunLoop, testados contra objetos de host falsos, inclusive editores domanguebyte-guinuma janela sem tela; ainda não abertos num host de verdade - O que ainda falta no VST 3: áudio em 64 bits, mudança do layout de barramentos, listas de programas
- Audio Unit (AUv2 e AUv3)
- LV2: portas de áudio e de sidechain, parâmetros como portas de controle, MIDI e transporte nos seus frames, estado, latência e arquivos Turtle gerados, testados dentro do processo pela interface C; pacotes
.lv2gravados porcargo mangue bundle --format lv2, e os dos exemplos encontrados e lidos pelo lilv no CI. Ainda não conferido pelolv2lintnem rodado num host; sem editor - Wrapper de aplicativo standalone: placa de som, portas MIDI, entrada para efeitos
- Ferramentas:
cargo mangueempacota (CLAP, VST 3 e LV2), instala e valida plugins e cria crates de plugin a partir de modelos; os pacotes de macOS ganham assinatura ad hoc e binários universais. Assinatura com identidade real e notarização não foram começadas, e ele não tem validador de LV2
O AAX depende de um SDK proprietário e será considerado quando os outros formatos estiverem sólidos.
Fase 3: interface com o usuário
Um contrato de editor na API de plugin, renderização na CPU primeiro, uma camada fina de janelas própria do framework, e nada anunciado antes de existir o teste.
- Contrato de editor e gestos de parâmetro na API de plugin e nos dois wrappers, cada um testado pela interface real do formato contra hosts falsos
- Renderizador 2D na CPU (
manguebyte-gfx): caminhos, gradientes, imagens, recortes, camadas, uma primitiva de colunas para medidores e espectros, redesenho limitado ao que mudou que bate bit a bit com um redesenho completo, e texto com um subconjunto embutido da Inter. Renderização em GPU depois, nunca como padrão enquanto o CI não puder testar os seus pixels - Janelas, inclusive embutidas dentro de um host de plugins: janelas filhas no Win32 dentro da janela do host e um backend sem tela para testes (
manguebyte-window), e a ligação que abre um editor nelas (manguebyte-gui), testadas no Windows, com os editores de dois binários de plugin abertos num mesmo processo; macOS e Linux vêm conforme o CI comprovar cada um - Editores para os plugins de exemplo: o do Mangue Duck (knobs, chave de bypass e medidor de redução de ganho) e o do Mangue Pluck (um knob para cada parâmetro), testados sem tela e em janelas Win32 de verdade; ainda não abertos num host à mão
- Layout, estilo e um conjunto de widgets (
manguebyte-ui): layout em linha, coluna e pilha, tokens de tema, rótulo, knob, slider, chave, medidor e canvas prontos; entrada de texto (um campo de texto, e valores digitados nos knobs e sliders, com a área de transferência), menus popup com submenus, combo box, hover e dicas prontos; arrastar e soltar, rolagem e listas não começados - Widgets de áudio: forma de onda, espectro, teclado, editores de envelope e de EQ
- Acessibilidade: cada widget se descreve (o método não tem implementação padrão) e o harness de testes só encontra widgets desse jeito; adaptadores de plataforma não começados
- Alta densidade de pixels: a escala vem do host, passa pelo contrato e chega ao renderizador, e uma janela Win32 usa a escala do sistema quando o host não informa nenhuma; uma mudança de escala com a janela aberta é tratada, mas não testada
Fase 4: hospedagem e grafos
O grafo e a hospedagem de plugins CLAP e VST 3 estão prontos. A varredura e os editores dos plugins hospedados não foram começados.
- Grafo de processamento de áudio, religado enquanto toca, com compensação automática de latência
- Extras do grafo: sidechain e roteamento de eventos por nó, realimentação por um atraso explícito, trocas com crossfade, reaproveitamento de buffers
- Hospedagem de plugins CLAP e VST 3 como processadores, por uma única interface para os dois formatos, com cada evento no seu frame
- Varredura de plugins (fora do processo), editores dos plugins hospedados, AU e LV2
- Transporte, mapa de andamento e primitivas de linha do tempo
Fase 5: em todo lugar
O motor para o navegador está em andamento; celulares e alvos embarcados não foram começados.
- iOS e Android
- WebAssembly e Web Audio:
manguebyte-web, um motor no AudioWorklet de um navegador, alimentado por registros de 32 bytes com marca de tempo por um anel de memória compartilhada, com um synth, um kit de bateria, um sampler SFZ, os instrumentos domanguebyte-dsp, treze efeitos e um master com limitador de true peak; testado nativamente e no Node.js, ainda não sob carga num navegador. O Aratu toca sobre ele - Alvos embarcados
Além da paridade
Igualar o JUCE é a linha de base, não a linha de chegada. Estes são os pontos em que um framework projetado para Rust pode fazer melhor. São metas: o que já está provado tem a sua própria página.
- Segurança em tempo real do código do usuário verificada na compilação
- Grafos de processamento que o compilador consiga embutir de ponta a ponta
- Renderização offline determinística, para testar código de áudio no CI
- Suporte de primeira classe ao CLAP, incluindo as extensões mais novas
- Uma API de plugin em que compartilhar estado entre threads do jeito errado não compila
Diante do JUCE, módulo a módulo
O JUCE 9.0.4 tem 24 módulos. Paridade significa a mesma capacidade, não as mesmas classes: onde o Rust ou o seu ecossistema já resolve bem alguma coisa, o plano é não refazer. O JUCE_PARITY.md explica cada linha.
| Módulo do JUCE | Crates do Manguebyte | Situação |
|---|---|---|
juce_audio_basics |
core, midi, dsp, sampler |
Em andamento |
juce_audio_devices |
devices |
Em andamento |
juce_audio_formats |
formats |
Em andamento |
juce_audio_processors |
params, plugin, host, graph |
Em andamento |
juce_audio_processors_headless |
params, plugin, host, graph |
Pronto |
juce_audio_plugin_client |
clap, vst3, lv2, standalone |
Em andamento |
juce_audio_utils |
Não começado | |
juce_dsp |
dsp |
Em andamento |
juce_midi_ci |
Não começado | |
juce_osc |
osc |
Pronto |
juce_graphics |
gfx |
Em andamento |
juce_gui_basics |
ui, window, gui |
Em andamento |
juce_gui_extra |
Não começado | |
juce_animation |
Não começado | |
juce_opengl |
Não começado | |
juce_video |
Fora do plano | |
juce_core |
core |
Fora do plano |
juce_events |
Fora do plano | |
juce_data_structures |
Não começado | |
juce_cryptography |
Fora do plano | |
juce_javascript |
Fora do plano | |
juce_box2d |
Fora do plano | |
juce_analytics |
Fora do plano | |
juce_product_unlocking |
Fora do plano |
Esta página segue o ROADMAP.md e o docs/JUCE_PARITY.md no commit c5835bf. Um item segue o README, que é mais novo: o ROADMAP.md ainda lista a decodificação de Ogg Vorbis e MP3 como não começada, enquanto o README e o changelog dizem que os dois são lidos.