Nilton Constantino 57d54c8783
add more specs
2026-01-17 10:19:00 +00:00

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_id
  • pos (posição fracionária no sample)
  • rate (pitch)
  • volume (0..255)
  • pan (0..255, esquerda→direita)
  • loop_mode (off / on)
  • loop_start, loop_end
  • priority (opcional)

5.3 Conflito de Voices

Se todas as voices estiverem ocupadas:

  • aplica-se uma política explícita:
    • STEAL_OLDEST
    • STEAL_QUIETEST
    • STEAL_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_rate
  • frames_len
  • loop_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 normal
  • rate > 1.0 → mais agudo
  • rate < 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):

  1. Para cada voice ativa:
    • ler sample na posição atual
    • aplicar pitch
    • aplicar volume
    • aplicar pan → gera L/R
  2. Somar todas as voices
  3. Aplicar clamp
  4. 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

< Voltar | Sumário | Adiante >