Recursos
O que existe hoje
Vinte e três crates, projetados para funcionar juntos e utilizáveis cada um por si: use o framework inteiro, ou só o tipo de buffer. Tudo o que está listado aqui está no repositório e coberto pelos testes dele.
Isso é uma parte pequena do caminho. O que falta está listado com a mesma clareza.
Núcleo
Crates: manguebyte-core
Os tipos sobre os quais todo o resto é construído. Este crate não tem nenhuma dependência.
AudioBuffer: áudio planar, uma fatia contígua por canal- O trait
Sample, para que os processadores funcionem emf32ouf64 - Valores
Smoothed, para parâmetros que não podem estalar - Floats atômicos e uma fila wait-free de um produtor e um consumidor
- Um log em que a thread de áudio pode escrever
- Contas com decibéis, e uma guarda contra números subnormais
Processamento de sinal
Crates: manguebyte-dsp
Uma tupla de processadores é um processador: a cadeia é resolvida em tempo de compilação, sem chamadas virtuais e sem alocação.
- O trait
Processore cadeias em tuplas; eventos com precisão de amostra e transporte - Um
Synthpolifônico com expressão e modulação por nota, acentos e legato - Oscilador com banda limitada e oscilador de wavetable com banda limitada; ruído; LFO sincronizado ao andamento
- Filtros biquad em 8 formas; filtros de variável de estado, de um polo e ladder; projeto de IIR de ordem alta (Butterworth, Chebyshev, elíptico); crossovers Linkwitz-Riley
- Um filtro FIR, e convolução com latência zero, estéreo verdadeiro e respostas trocadas enquanto toca
- Compressor, noise gate, expansor, sidechain para a dinâmica e um limitador look-ahead cujo teto vale para todas as amostras
- Linhas de atraso interpoladas e eco; chorus e flanger; phaser; reverb
- Envelope ADSR, seguidor de envelope, ganho suavizado, panner, mistura dry/wet, waveshaper
- Oversampling de 2, 4, 8 ou 16 vezes; reamostragem em qualquer razão; FFT de qualquer tamanho, funções de janela, projeto de FIR
- Curvas de resposta para desenhar tudo isso, de filtros e dinâmica a envelopes, LFOs, delays e caudas de reverb, calculadas a partir dos ajustes sem tocar no heap
Instrumentos
Crates: manguebyte-dsp
Vozes prontas para tocar, cada uma com presets, medidas em afinação, decaimento, velocidade e acento, e todas na mesma loudness.
- Cordas dedilhadas por modelagem física: violões, guitarras e baixos
- FM de quatro operadores, com presets de piano, sino e baixo
- 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 com acento e slide
- 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 e CR-78; kits de trap, techno, house, drum and bass e lo-fi
Medição e análise
Crates: manguebyte-analysis
Medidores que rodam na thread de áudio e que qualquer thread lê sem esperar.
- Loudness segundo a BS.1770 e a EBU R 128, conferido com os sinais de teste da EBU
- Medidores de true peak, pico, RMS, VU e PPM; correlação estéreo
- Um analisador de espectro com bandas de oitava e ponderação
- Detecção de altura, com o nome da nota mais próxima
Grafo de processamento
Crates: manguebyte-graph
Um grafo que é religado enquanto toca.
- As edições chegam à thread de áudio por uma fila wait-free
- Os nós mantêm o estado entre uma edição e outra
- Os nós removidos são liberados fora da thread de áudio
- Caminhos com latências diferentes são alinhados automaticamente
Parâmetros
Crates: manguebyte-params
Parâmetros são atômicos dentro de uma struct. Não existem listeners.
- Parâmetros lock-free de ponto flutuante, inteiro, chave e escolha
- Faixas lineares, enviesadas e logarítmicas, conversão de e para texto com unidades, e suavização
- Estado salvo que sobrevive a mudanças de versão
- Cada parâmetro descrito como dado e como JSON, para editores fora do Rust
Plugins
Crates: manguebyte-plugin manguebyte-clap manguebyte-vst3 manguebyte-lv2 manguebyte-standalone
Escreva o plugin uma vez. Exporte como CLAP, VST 3 e LV2 com uma linha cada, rode como aplicativo e teste sem host.
- O trait
Plugin, que todos os formatos embrulham, com os controladores MIDI que ele escuta, e o estado do plugin Harness: toca notas, automação e um sidechain num plugin dentro de um teste unitário- CLAP: notas, expressão, automação e modulação chegam no frame exato. Passa no validador do projeto CLAP
- VST 3: cada ponto de automação cai no seu frame; as notas trazem ids, afinação e expressão por nota; os controladores que o plugin declara voltam a chegar como MIDI. Passa no validador da Steinberg em Windows, Linux e macOS
- LV2: os arquivos Turtle são gerados, e o CI carrega os pacotes dos plugins de exemplo com o lilv; ainda não rodou num host, e não tem editor
- Standalone: roda um plugin como aplicativo, com saída na placa de som, teclados MIDI na entrada e microfone para os efeitos
Editores de plugin
Crates: manguebyte-gfx manguebyte-ui manguebyte-window manguebyte-gui
Editores desenhados na CPU e abertos numa janela filha da janela do host, por enquanto no Win32. Testados no CI; ninguém abriu um num host à mão ainda.
- As interfaces de editor dos dois formatos, a extensão
guido CLAP e oIPlugViewdo VST 3, testadas pelas interfaces reais - Janelas no Win32 que só redesenham o que mudou, e um backend sem tela que deixa um teste conduzir uma janela em qualquer sistema
- Desenho 2D na CPU: caminhos, gradientes, imagens, recortes e camadas, gravados como uma cena; texto com um subconjunto embutido da Inter
- Widgets: rótulo, knob, slider, chave, medidor e canvas; um campo de texto e valores digitados nos knobs e sliders; menus popup, combo box, hover e dicas
- Edições de parâmetro como gestos, uma descrição de acessibilidade obrigatória em cada widget, e um harness que conduz tudo num teste unitário
- Editores para os dois plugins de exemplo
Hospedagem de plugins
Crates: manguebyte-host
Carregue plugins feitos por qualquer pessoa e rode-os como processadores.
- CLAP e VST 3, por uma única interface para os dois formatos
- Cada evento no seu frame, e nada alocado durante o processamento
- Regras de thread nos tipos: o estado não pode ser carregado a partir da thread de áudio
Sampler
Crates: manguebyte-sampler
Um player de SFZ, aberto para que qualquer programa toque os instrumentos que receber.
- Instrumentos SFZ com herança,
#definee#include, com os samples carregados de arquivos ou da memória - Tocados no frame exato, com camadas de velocidade, round robin, samples de release, loops com crossfade, grupos de choke e roubo de voz com fade
- Compila para WebAssembly
No navegador
Crates: manguebyte-web
Um motor para o AudioWorklet de um navegador. Testado nativamente e no Node.js, ainda não na thread de áudio de um navegador sob carga.
- Partes que tocam um synth, kits de bateria, instrumentos SFZ ou os instrumentos do
manguebyte-dsp - Uma cadeia de efeitos para cada parte, e um master com limitador de true peak
- Todo tipo de instrumento e todo preset na mesma loudness, os instrumentos com samples medidos ao carregar
- Eventos como registros de 32 bytes que caem no frame exato, por um anel de memória compartilhada
- Exports de WebAssembly sem imports, um
AudioWorklete uma página de demonstração
MIDI
Crates: manguebyte-midi
MIDI 1.0 e 2.0, com o tempo preservado até a amostra.
- Mensagens de canal e de sistema do MIDI 1.0, um parser de fluxo de bytes, arquivos MIDI padrão
- Um
MidiBuffercom precisão de amostra - Pacotes MIDI 2.0 (UMP) e tradução entre os protocolos
- RPN e NRPN; zonas MPE e acompanhamento de notas
- Um estado de teclado que a interface lê enquanto a thread de áudio escreve
Arquivos de áudio
Crates: manguebyte-formats
Leia e grave arquivos inteiros ou bloco a bloco, do disco até a thread de áudio.
- WAV (com RF64), AIFF e FLAC, lidos e gravados
- Ogg Vorbis e MP3 lidos, com decodificadores escritos a partir das especificações e testados com arquivos gravados pelo libvorbis e pelo LAME
- Inteiros ou bloco a bloco, com busca exata
- Um codificador e um decodificador de FLAC escritos a partir da especificação e conferidos com o FFmpeg
- Pontes wait-free para tocar e gravar a partir de um callback de áudio
Open Sound Control
Crates: manguebyte-osc
Mensagens de controladores e de programas de live coding, no frame que elas pedem.
- OSC por UDP e TCP
- Uma ponte de tempo real que põe os bundles com time tag no seu frame exato
Dispositivos
Crates: manguebyte-devices
Placas de som e portas MIDI.
- Listagem e seleção de dispositivos
- Streams de reprodução, gravação e full-duplex, em qualquer formato de amostra do hardware
- Portas MIDI de entrada e de saída, com os horários de chegada convertidos em frames, para que o tempo de quem toca sobreviva ao buffer de áudio
Ferramenta de linha de comando
Crates: cargo-mangue
De uma pasta vazia a um plugin instalado.
cargo mangue newcria um crate de plugin a partir de um modelo, instrumento ou efeitobundleo transforma num.clape num.vst3, no layout de cada sistema, ebundle --format lv2num.lv2installcopia um plugin para as pastas de plugins do usuáriovalidateroda nele os validadores do CLAP e do VST 3
O crate manguebyte reúne todos sob um nome só, com um prelude.
O que ainda não existe
Nada disto existe hoje no Manguebyte. Se você precisa de algum destes itens agora, o JUCE tem.
- Um editor de plugin aberto num host à mão: por enquanto os editores só foram testados no CI
- Janelas de editor em macOS e Linux
- LV2 rodando num host ou conferido pelo
lv2lint, e editores LV2 - O motor do navegador e o sampler na thread de áudio de um navegador sob carga
- Os formatos de plugin Audio Unit e AAX
- Codificação em formatos com perdas, e leitura de Opus
- Varredura de plugins, e os editores dos plugins hospedados
- Plataformas móveis
- Uma versão publicada no crates.io, e uma API estável
O roadmap lista cada item planejado e a sua situação, e onde o JUCE está à frente diz o mesmo pelo outro lado.