GetSoundFFTData: Difference between revisions

From Multi Theft Auto: Wiki
Jump to navigation Jump to search
m (Change See Also template)
 
(23 intermediate revisions by 10 users not shown)
Line 1: Line 1:
__NOTOC__  
__NOTOC__  
{{Client function}}
{{Client function}}
This function gets the fast fourier transform data for an audio stream which is a table of floats representing the current audio frame.
This function gets the fast fourier transform data for an audio stream which is a table of floats representing the current audio frame. This allows things like visualisations.
This allows things like visualisations.
A fast fourier transform generates a table of all the frequencies of the current audio frame which starts at the bass end of the spectrum to mids to highs in that order.
Should you have any problems there is an example resource located on the resources repository:
[https://github.com/multitheftauto/mtasa-resources/tree/master/%5Bgameplay%5D/visualiser Visualiser]


a fast fourier transform generates a table of all the frequencies of the current audio frame which starts at the bass end of the spectrum to mids to highs in that order
Just type "startmusic mystreamurl" in your console and it will play on the cinema billboard near A51. If the element is a player, this function will use the players voice.
 
Should you have any problems there is an example resource located on the resource svn here:
[https://code.google.com/p/mtasa-resources/source/browse/#svn%2Ftrunk%2F%5Bgameplay%5D%2FVisualiser Visualiser]
 
just type "startmusic mystreamurl" in your console and it will play on the cinema billboard near A51
If the element is a player, this function will use the players voice.


==Syntax==  
==Syntax==  
<syntaxhighlight lang="lua">table getSoundFFTData ( element sound, int iSamples [, int iBands = 0 ] )</syntaxhighlight>  
<syntaxhighlight lang="lua">table getSoundFFTData ( element sound, int iSamples [, int iBands = 0 ] )</syntaxhighlight>  
 
{{OOP||[[sound]]:getFFTData}}
===Required Arguments===  
===Required Arguments===  
*'''sound:''' A sound element that is created using [[playSound]] or [[playSound3D]]. Streams are also supported
*'''sound:''' a sound element that is created using [[playSound]] or [[playSound3D]]. Streams are also supported
*'''iSamples:''' Allowed samples are 256, 512, 1024, 2048, 4096, 8192 and 16384
*'''iSamples:''' allowed samples are 256, 512, 1024, 2048, 4096, 8192 and 16384.


===Optional Arguments===
===Optional Arguments===
*'''iBands:''' Post processing option allows you to split the samples into the desired amount of bands or bars so if you only need 5 bars this saves a lot of cpu power compared to trying to do it in Lua. Using it function returns '''iBands'''-1 floats.
*'''iBands:''' post processing option allows you to split the samples into the desired amount of bands or bars so if you only need 5 bars this saves a lot of cpu power compared to trying to do it in Lua.


===Returns===
===Returns===
Returns a table of floats representing the current audio frame.
Returns a table of '''iSamples'''/2 (or '''iBands''' if '''iBands''' is used) ''floats'' representing the current audio frame.
Returns false if the sound is not playing yet or hasn't buffered in the
Returns ''false'' if the sound is not playing yet or hasn't buffered in the
case of streams.
case of streams.


==Example==  
==Example==  
This code creates vertical waveform in center of screen from top to bottom. Key '''9''' - start, key '''0''' - stop.
<section name="Client" class="client" show="true">
<section name="Client" class="client" show="true">
<syntaxhighlight lang="lua">
<syntaxhighlight lang="lua">
local handl = nil
soundHandler = playSound ( "sound.wav" )
local sx,sy = guiGetScreenSize()


function clientRenderFunc()
function onSoundPlayRender ( )
     if(handl) then
     if ( soundHandler ) then
         local bt = getSoundFFTData(handl,2048,257)
         local soundFFT = getSoundFFTData ( soundHandler, 2048, 256 )
        for i=1,256 do
if ( soundFFT ) then
            bt[i] = math.sqrt(bt[i])*128 --scale it (sqrt to make low values more visible)
            for i = 0, 255 do -- Data starts from index 0
             dxDrawRectangle(sx/2-bt[i]/2,i-1,bt[i],1)
                dxDrawRectangle ( i, 0, 1, math.sqrt ( soundFFT[i] ) * 256 )
             end
         end
         end
     end
     end
end
end
 
addEventHandler ( "onClientRender", getRootElement(), onSoundPlayRender )
function musicStartFunc()
    if(not handl) then
        handl = playSound('btr.mp3')
        addEventHandler("onClientRender",root,clientRenderFunc)
    end
end
 
function musicStopFunc()
    if(handl) then
        stopSound(handl)
        handl = nil
        removeEventHandler("onClientRender",root,clientRenderFunc)
    end
end
 
bindKey("9","down",musicStartFunc)
bindKey("0","down",musicStopFunc)
</syntaxhighlight>
</syntaxhighlight>
</section>
</section>
Line 69: Line 47:


==See Also==
==See Also==
{{Client_audio_functions}}
{{Audio_functions|client}}
[[Category:Needs Example]]
[[HU:getSoundFFTData]]
[[ES:getSoundFFTData]]
[[AR:getSoundFFTData]]
[[AR:getSoundFFTData]]
[[PT-BR:getSoundFFTData]]

Latest revision as of 22:13, 6 September 2024

This function gets the fast fourier transform data for an audio stream which is a table of floats representing the current audio frame. This allows things like visualisations. A fast fourier transform generates a table of all the frequencies of the current audio frame which starts at the bass end of the spectrum to mids to highs in that order. Should you have any problems there is an example resource located on the resources repository: Visualiser

Just type "startmusic mystreamurl" in your console and it will play on the cinema billboard near A51. If the element is a player, this function will use the players voice.

Syntax

table getSoundFFTData ( element sound, int iSamples [, int iBands = 0 ] )

OOP Syntax Help! I don't understand this!

Method: sound:getFFTData(...)


Required Arguments

  • sound: a sound element that is created using playSound or playSound3D. Streams are also supported
  • iSamples: allowed samples are 256, 512, 1024, 2048, 4096, 8192 and 16384.

Optional Arguments

  • iBands: post processing option allows you to split the samples into the desired amount of bands or bars so if you only need 5 bars this saves a lot of cpu power compared to trying to do it in Lua.

Returns

Returns a table of iSamples/2 (or iBands if iBands is used) floats representing the current audio frame. Returns false if the sound is not playing yet or hasn't buffered in the case of streams.

Example

Click to collapse [-]
Client
soundHandler = playSound ( "sound.wav" )

function onSoundPlayRender ( )
    if ( soundHandler ) then
        local soundFFT = getSoundFFTData ( soundHandler, 2048, 256 )
	if ( soundFFT ) then
            for i = 0, 255 do -- Data starts from index 0
                dxDrawRectangle ( i, 0, 1, math.sqrt ( soundFFT[i] ) * 256 )
            end
        end
    end
end
addEventHandler ( "onClientRender", getRootElement(), onSoundPlayRender )

Changelog

Version Description
1.3.2 Added player element to use a players voice

See Also