Manguebyte

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.

6 de 6 prontos
  • manguebyte-core: AudioBuffer, Sample, Smoothed, floats atômicos, fila SPSC wait-free, conversões de decibéis
  • manguebyte-dsp: trait Processor, cadeias em tuplas resolvidas na compilação, oscilador com banda limitada, filtros biquad, ADSR, linha de atraso e eco, ganho
  • manguebyte-midi: mensagens de voz de canal, MidiBuffer com precisão de amostra
  • manguebyte-formats: leitura e escrita de WAV
  • manguebyte-devices: reprodução no dispositivo de saída padrão
  • manguebyte: 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.

45 de 56 prontos

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 Voice com 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 Gesture no contrato de editor, enviada aos hosts CLAP como eventos de gesto e aos hosts VST 3 como beginEdit, performEdit e endEdit
  • 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_std em manguebyte-core e manguebyte-dsp

Fase 2: plugins

Escrever o processador uma vez e distribuir em todos os formatos.

4 de 11 prontos
  • 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-support e posix-fd-support para plugins com editor, testados pela interface C contra editores e hosts falsos, inclusive editores do manguebyte-gui numa 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, IPlugView com escala de conteúdo, mostrando o editor ao ser anexado, IPlugFrame e IRunLoop, testados contra objetos de host falsos, inclusive editores do manguebyte-gui numa 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 .lv2 gravados por cargo mangue bundle --format lv2, e os dos exemplos encontrados e lidos pelo lilv no CI. Ainda não conferido pelo lv2lint nem rodado num host; sem editor
  • Wrapper de aplicativo standalone: placa de som, portas MIDI, entrada para efeitos
  • Ferramentas: cargo mangue empacota (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.

2 de 8 prontos
  • 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.

2 de 5 prontos
  • 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.

0 de 3 prontos
  • 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 do manguebyte-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.