Pular para o conteúdo

Som

Cliente

O áudio de script do MTAX roda inteiramente do lado do jogador. Você toca um arquivo do próprio resource ou uma URL de streaming, recebe de volta um elemento do tipo sound e usa esse elemento em todas as outras funções desta página.

São dois modos de reprodução. O 2D toca sempre no mesmo volume, direto nos alto-falantes — é o que você quer para música de menu, avisos e efeitos de interface. O 3D ancora o som num ponto do mundo: o ouvinte é a câmera, e o volume cai conforme ela se afasta desse ponto.

Quase toda função desta página recebe um som como primeiro argumento. Se você passar algo que não é um som vivo, ou um argumento do tipo errado, a função devolve false e registra um aviso no console de debug — ela não interrompe o script. As exceções são setSoundLooped, isSoundLooped e showSound, que levantam um erro Lua para um argumento inválido.

Muitas dessas funções também aceitam um jogador no lugar do som: elas passam a agir sobre o chat de voz que você ouve desse jogador. O jogador local sempre tem voz; um jogador remoto, só enquanto o chat de voz está ligado. Para um jogador sem voz a função devolve false.

Estas 42 funções existem somente no cliente. Chamá-las de um script de servidor resulta em erro de valor nulo.

Todo som segue o mesmo caminho: uma função play* cria, as funções set* controlam e stopSound destrói. O arquivo precisa estar declarado em files no manifesto para chegar até o jogador.

-- criar
local musica = playSound("sons/tema.mp3", true) -- em loop
if not musica then
outputDebugString("nao consegui tocar o tema")
return
end
-- controlar
setSoundVolume(musica, 0.4)
addCommandHandler("pausar", function()
setSoundPaused(musica, not isSoundPaused(musica))
end)
addCommandHandler("recomecar", function()
setSoundPosition(musica, 0)
end)
-- destruir
addCommandHandler("parar", function()
stopSound(musica)
musica = nil
end)

Num som 3D o ouvinte é sempre a câmera. Dentro da distância mínima o som toca no volume cheio; entre a mínima e a máxima ele decai progressivamente; além da máxima fica em silêncio. A direção da câmera também distribui o som entre os canais esquerdo e direito, a menos que você desligue isso com setSoundPanningEnabled.

Cada som tem nove espaços de efeito, um por nome. Ligue o efeito com setSoundEffectEnabled e só depois ajuste os parâmetros dele — ler ou escrever parâmetros de um efeito desligado devolve false.

Nomes de efeito

Nome
"chorus"
"compressor"
"distortion"
"echo"
"flanger"
"gargle"
"i3dl2reverb"
"parameq"
"reverb"

Nas tabelas abaixo, decimal aceita qualquer número, inteiro aceita qualquer número e descarta a parte fracionária, e bool aceita apenas true ou false. Passar um booleano para um parâmetro numérico, ou um número para um booleano, devolve false.

chorus

ParâmetroTipo
wetDryMixdecimal
depthdecimal
feedbackdecimal
frequencydecimal
waveforminteiro
delaydecimal
phaseinteiro

compressor

ParâmetroTipo
gaindecimal
attackdecimal
releasedecimal
thresholddecimal
ratiodecimal
predelaydecimal

distortion

ParâmetroTipo
gaindecimal
edgedecimal
postEQCenterFrequencydecimal
postEQBandwidthdecimal
preLowpassCutoffdecimal

echo

ParâmetroTipo
wetDryMixdecimal
feedbackdecimal
leftDelaydecimal
rightDelaydecimal
panDelaybool

flanger

ParâmetroTipo
wetDryMixdecimal
depthdecimal
feedbackdecimal
frequencydecimal
waveforminteiro
delaydecimal
phaseinteiro

gargle

ParâmetroTipo
rateHzinteiro
waveShapeinteiro

i3dl2reverb

ParâmetroTipo
roominteiro
roomHFinteiro
roomRolloffFactordecimal
decayTimedecimal
decayHFRatiodecimal
reflectionsinteiro
reflectionsDelaydecimal
reverbinteiro
reverbDelaydecimal
diffusiondecimal
densitydecimal
HFReferencedecimal

parameq

ParâmetroTipo
centerdecimal
bandwidthdecimal
gaindecimal

reverb

ParâmetroTipo
inGaindecimal
reverbMixdecimal
reverbTimedecimal
highFreqRTRatiodecimal

Um som criado a partir de uma URL é um stream. A conexão acontece em segundo plano, então logo após playSound o som ainda pode não ter dados: getSoundLength devolve 0 por alguns instantes e o áudio começa quando o buffer enche.

Streams têm algumas limitações próprias — não aceitam setSoundProperties, e um stream ao vivo sem duração conhecida não pode ser posicionado com setSoundPosition. getSoundBPM só responde depois que tocou o bastante do stream para medir.