Manguebyte

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 em f32 ou f64
  • 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 Processor e cadeias em tuplas; eventos com precisão de amostra e transporte
  • Um Synth polifô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 gui do CLAP e o IPlugView do 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, #define e #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 AudioWorklet e 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 MidiBuffer com 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 new cria um crate de plugin a partir de um modelo, instrumento ou efeito
  • bundle o transforma num .clap e num .vst3, no layout de cada sistema, e bundle --format lv2 num .lv2
  • install copia um plugin para as pastas de plugins do usuário
  • validate roda 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.