5.2 KiB
< Voltar | Sumário | Adiante >
🔊 Periférico AUDIO (Sistema de Som)
1. Visão Geral
O Periférico AUDIO é responsável pela geração e mistura de som no PROMETEU.
Assim como os demais subsistemas:
- não é automático
- não é gratuito
- não é mágico
Cada som é resultado de comandos explícitos, executados sob orçamento de tempo e recursos.
Som consome tempo.
Som consome memória.
2. Filosofia
PROMETEU trata áudio como:
- um periférico ativo
- com canais limitados
- comportamento determinístico
- controle explícito
Objetivo: clareza arquitetural e didática, não realismo absoluto.
3. Arquitetura Geral
O sistema de áudio é composto por:
- Voices (canais) — tocadores independentes
- Samples — dados PCM
- Mixer — soma das voices
- Saída — buffer estéreo PCM
Separação conceitual:
- Jogo envia comandos a 60Hz
- Áudio é gerado continuamente em 48kHz
4. Formato de Saída
- Sample rate: 48.000 Hz
- Formato: PCM16 estéreo (signed i16)
- Clipping: saturação/clamp
Esse formato é compatível com:
- DACs I2S comuns
- HDMI áudio
- USB áudio
- SBCs DIY (Raspberry Pi, Orange Pi, etc.)
5. Voices (Canais)
5.1 Quantidade
MAX_VOICES = 16
Cada voice:
- toca 1 sample por vez
- é independente
- é misturada no output final
5.2 Estado de uma Voice
Cada voice mantém:
sample_idpos(posição fracionária no sample)rate(pitch)volume(0..255)pan(0..255, esquerda→direita)loop_mode(off / on)loop_start,loop_endpriority(opcional)
5.3 Conflito de Voices
Se todas as voices estiverem ocupadas:
- aplica-se uma política explícita:
STEAL_OLDESTSTEAL_QUIETESTSTEAL_LOWEST_PRIORITY
PROMETEU não resolve isso automaticamente sem regra definida.
6. Modelo Conceitual: “CPU de Áudio”
O AUDIO do PROMETEU é concebido como um periférico independente, assim como consoles clássicos tinham:
- CPU principal do jogo
- CPU dedicada ao som
No PROMETEU:
- O core lógico assume essa separação conceitual
- O host decide como implementar:
- mesma thread
- thread separada
- core separado
6.1 Metáfora de Hardware
Conceitualmente:
[CPU do Jogo] → envia comandos 60Hz → [Periférico AUDIO]
|
v
Voices + Mixer
|
v
Saída PCM
6.2 Implementação é Papel do Host
O core:
- define o modelo
- define os comandos
- define os limites
O host:
- escolhe:
- threads
- afinidade de CPU
- backend de áudio
- garante entrega contínua dos buffers
Assim:
PROMETEU modela o hardware.
O host decide como realizá-lo fisicamente.
7. Samples
7.1 Formato
Samples do PROMETEU:
- PCM16 mono
- sample_rate próprio (ex.: 22050, 44100, 48000)
- dados imutáveis em runtime
Campos:
sample_rateframes_lenloop_start,loop_end(opcional)
7.2 Uso
Exemplo:
audio.play(sample_id, voice_id, volume, pan, pitch, priority)
Ou:
audio.playAuto(sample_id, volume, pan, pitch, priority)
(usa política de stealing)
8. Pitch e Interpolação
rate = 1.0→ velocidade normalrate > 1.0→ mais agudorate < 1.0→ mais grave
Como posição vira fracionária:
- usa-se interpolação linear entre dois samples vizinhos
9. Mixer
Para cada frame de saída (48kHz):
- Para cada voice ativa:
- ler sample na posição atual
- aplicar pitch
- aplicar volume
- aplicar pan → gera L/R
- Somar todas as voices
- Aplicar clamp
- Escrever no buffer estéreo
Custo depende de:
- número de voices ativas
- uso de interpolação
10. Sincronização com o Jogo
- Jogo roda a 60Hz
- Áudio gera dados a 48kHz
A cada frame (60Hz):
- jogo envia comandos:
- play
- stop
- set_volume
- set_pan
- set_pitch
O áudio aplica esses comandos e continua tocando.
11. Comandos Básicos
Exemplos conceituais:
audio.play(sample, voice, volume, pan, pitch, priority)
audio.stop(voice)
audio.setVolume(voice, v)
audio.setPan(voice, p)
audio.setPitch(voice, p)
audio.isPlaying(voice)
12. Áudio e CAP
O áudio participa do Execution CAP:
- custo de mixagem por frame
- custo por voice ativa
- custo de comandos
Exemplo:
Frame 1024:
voices_active: 9
mix_cycles: 410
audio_commands: 6
13. Boas Práticas
Recomendado:
- reutilizar samples
- limitar voices simultâneas
- tratar som como evento
- separar música e efeitos
Evitar:
- tocar som todo frame
- abusar de voices
- samples gigantes para efeitos simples
14. Inspiração Histórica
O modelo PROMETEU se inspira em:
- NES: canais fixos
- SNES: sample playback + mixagem
- CPS2: polifonia confortável
- Neo Geo: sample pesado (não copiado integralmente)
Mas abstraído para:
- clareza
- simplicidade
- ensino
15. Resumo
- Output: PCM16 estéreo @ 48kHz
- 16 voices
- Samples PCM16 mono
- Volume, pan, pitch
- Interpolação linear
- Mixer explícito
- Conceito de “CPU de áudio”
- Implementação é papel do host