ES/getSoundFFTData: Difference between revisions

From Multi Theft Auto: Wiki
Jump to navigation Jump to search
(dont add "translated" in sub pages, use main page for credits)
m (→‎Ejemplo: ¡Más y mejores ejemplos!)
Line 25: Line 25:


== Ejemplo ==
== Ejemplo ==
Este ejemplo hace una visualización simple en el centro superior de la pantalla:
<section name="Ejemplo 1" class="client" show="true">
<section name="Cliente" class="client" show="true">
Este ejemplo hace una visualización simple en el centro superior de la pantalla
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
function ReproducirMusica ()
local Musica = playSound ("Musica.mp3", true) -- Reproducir la música
Musica = playSound ("Musica.mp3", true) -- Reproducir la musica
local PantallaX = guiGetScreenSize () -- Obtener la resolución X de la pantalla
addEventHandler ("onClientRender", root, Visualizacion) -- Activar la funcion de Visualizacion
function Visualizacion ()
local TbFFT = getSoundFFTData (Musica, 4096, 20) -- Obtener la trama de audio en 4096 muestras y 20 barras
for X, FFT in pairs (TbFFT) do -- Procesar todas las barras
local FFT = math.sqrt (FFT/6)*128 -- Ajustar las barras
local FFT = FFT <= 13 and FFT or 13 -- Limitar las barras a que no se estiren más de 13 pixeles
dxDrawRectangle (PantallaX/2 - 97.5 + X*10, 0, 5, FFT, tocolor (0, 255, 0)) -- Dibujar el rectángulo que representa las barras y ajustarlas a la pantalla
end
end
end
addEventHandler ("onClientResourceStart", resourceRoot, ReproducirMusica)
addEventHandler ("onClientRender", root, Visualizacion)
 
</syntaxhighlight>
 
</section>
local PantallaX = guiGetScreenSize () -- Obtener la resolucion X de la pantalla
<section name="Ejemplo 2" class="client" show="true">
function Visualizacion () -- Funcion de Visualizacion
Este otro ejemplo hace una visualización en forma de rueda en medio de la pantalla
FFT = getSoundFFTData (Musica, 4096, 21) -- Obtener la tabla en 4096 muestras y 20 barras (la funcion da una barra menos)
<syntaxhighlight lang="lua">
for X = 0, 20 do -- Establecer que X vale de 0 a 20 (un numero para cada barra) simultaneamente
local PantallaX, PantallaY = guiGetScreenSize () -- Obtener la resolución X y Y de la pantalla
FFT [X] = math.sqrt (FFT [X]/6)*128 -- Ajustar las barras para que no se hagan muy largas
function Visualizacion ()
if FFT [X] > 13 then FFT [X] = 13 end -- Limitar las barras a que no se estiren mas de 13 pixeles
local Musica = getElementsByType ("sound") [1] -- Detectar si se reproduce un sonido
if FFT [X] < 1 then FFT [X] = 1 end -- Establecer que minimo tengan un pixel de altura
if not Musica then return end -- Parar la función aquí si no se reproduce ningún sonido
dxDrawRectangle (PantallaX/2 + X*10 - 98, 0, 5, FFT [X], tocolor (0, 255, 0)) -- Dibujar el rectangulo que representa las barras y ajustarlas a la pantalla
local TbFFT = getSoundFFTData (Musica, 4096, 90) -- Obtener la trama de audio en 4096 muestras y 90 barras
for X, FFT in pairs (TbFFT) do -- Procesar todas las barras
local FFT = math.sqrt (FFT/6)*128 -- Ajustar las barras
local FFT = FFT <= 13 and FFT or 13 -- Limitar las barras
local PX, PY = math.sin (math.rad (X*4))*100, math.cos (math.rad (X*4))*100 -- Calcular la posición X y Y
local LX, LY = math.sin (math.rad (X*4))*(100 + FFT), math.cos (math.rad (X*4))*(100 + FFT) -- Calcular el lado hacia el que deben mirar
dxDrawLine (PX + PantallaX/2, PY + PantallaY/2, LX + PantallaX/2, LY + PantallaY/2, tocolor (0, 255, 0), 4) -- Dibujar las líneas ajustadas a la pantalla
end
end
end
end
addEventHandler ("onClientRender", root, Visualizacion)
</syntaxhighlight>
</syntaxhighlight>
</section>
</section>

Revision as of 17:42, 1 August 2014

Esta función obtiene flujos de audio de un sonido y los transforma a una tabla de números decimales que representan la trama de audio actual. Esto permite hacer cosas como visualizaciones.

Genera una tabla de todas las frecuencias de la trama de audio actual, que se inicia en el extremo bajo del espectro de frecuencias, luego medias y altas en ese orden.

En caso de tener algún problema existe un recurso que puede servir como ejemplo: Visualiser

Sólo escribe "startmusic mystreamurl" en la consola y lo reproducirá en la cartelera de cine cerca del Área 51 (drvin_screen).

Si el elemento es un jugador, esta función utilizará la voz de los jugadores.

Sintaxis

table getSoundFFTData (element Sonido, int Muestras [, int Bandas = 0])

Argumentos obligatorios

  • Sonido: Un sonido que se creó utilizando las funciones playSound o playSound3D.
  • Muestras: Las muestras que utilizara la función para crear la tabla. Las muestras permitidas son 256, 512, 1024, 2048, 4096, 8192 y 16384.

Argumentos opcionales

  • Bandas: La cantidad de bandas o barras a las cuales las muestras se van a dividir. Si sólo se necesitan 5 barras, esto ahorra una gran cantidad de energía del CPU en comparación con tratar de hacerlo con 500 barras.

Devoluciones

Devuelve una tabla de Muestras/2 (o Bandas - 1 si son utilizadas) con números decimales representando la trama de audio actual. Devuelve false si el sonido no se está reproduciendo o no hay suficiente información en buffer en el caso de streams.

Ejemplo

Click to collapse [-]
Ejemplo 1

Este ejemplo hace una visualización simple en el centro superior de la pantalla

local Musica = playSound ("Musica.mp3", true) -- Reproducir la música
local PantallaX = guiGetScreenSize () -- Obtener la resolución X de la pantalla
function Visualizacion ()
	local TbFFT = getSoundFFTData (Musica, 4096, 20) -- Obtener la trama de audio en 4096 muestras y 20 barras
	for X, FFT in pairs (TbFFT) do -- Procesar todas las barras
		local FFT = math.sqrt (FFT/6)*128 -- Ajustar las barras
		local FFT = FFT <= 13 and FFT or 13 -- Limitar las barras a que no se estiren más de 13 pixeles
		dxDrawRectangle (PantallaX/2 - 97.5 + X*10, 0, 5, FFT, tocolor (0, 255, 0)) -- Dibujar el rectángulo que representa las barras y ajustarlas a la pantalla
	end
end
addEventHandler ("onClientRender", root, Visualizacion)
Click to collapse [-]
Ejemplo 2

Este otro ejemplo hace una visualización en forma de rueda en medio de la pantalla

local PantallaX, PantallaY = guiGetScreenSize () -- Obtener la resolución X y Y de la pantalla
function Visualizacion ()
	local Musica = getElementsByType ("sound") [1] -- Detectar si se reproduce un sonido
	if not Musica then return end -- Parar la función aquí si no se reproduce ningún sonido
	local TbFFT = getSoundFFTData (Musica, 4096, 90) -- Obtener la trama de audio en 4096 muestras y 90 barras
	for X, FFT in pairs (TbFFT) do -- Procesar todas las barras
		local FFT = math.sqrt (FFT/6)*128 -- Ajustar las barras
		local FFT = FFT <= 13 and FFT or 13 -- Limitar las barras
		local PX, PY = math.sin (math.rad (X*4))*100, math.cos (math.rad (X*4))*100 -- Calcular la posición X y Y
		local LX, LY = math.sin (math.rad (X*4))*(100 + FFT), math.cos (math.rad (X*4))*(100 + FFT) -- Calcular el lado hacia el que deben mirar
		dxDrawLine (PX + PantallaX/2, PY + PantallaY/2, LX + PantallaX/2, LY + PantallaY/2, tocolor (0, 255, 0), 4) -- Dibujar las líneas ajustadas a la pantalla
	end
end
addEventHandler ("onClientRender", root, Visualizacion)

Cambios

Version Description
1.3.2 Agregado el elemento jugador para usar la voz de los jugadores

Vea también