2017-06-01 2 views
2

J'essaie de pré-traiter un morceau et d'implémenter une détection de rythme avant de jouer la chanson (pas en temps réel pendant la lecture de la chanson). Mon idée de base est d'échantillonner les données de spectre à environ 90 fois par seconde et j'essaye de le faire en incrémentant AudioSource.timeSamples par une valeur et en faisant des appels à AudioSource.GetSpectrumData(). Mais le tableau que je fournis semble toujours rempli des mêmes valeurs.Pré-traitement des données de spectre audio dans Unity

Il semble que la définition de timeSamples ne met pas réellement à jour l'échantillon utilisé par AudioSource. Cependant, si je joue normalement la chanson et que j'appelle GetSpectrumData(), mon tableau est rempli avec les données correctes.

Y a-t-il quelque chose que je peux faire pour que AudioSource utilise l'exemple défini dans timeSamples lorsque je fais l'appel à GetSpectrumData(), ou d'une autre manière je devrais analyser la chanson pour obtenir ces données?

Merci

Voici un exemple de code (chanson est un AudioSource), la 2ème boucle est la zone d'intérêt:

float[][] get_spectrum_data() 
{ 
    int samples = song.clip.samples; 
    int sample_rate = song.clip.frequency/parse_rate; 
    int arr_siz = samples/sample_rate; 
    FFTWindow win = FFTWindow.Rectangular; //which type do we want? 

    float[][] spectrum = new float[arr_siz][]; 
    for (int i = 0; i < arr_siz; i++) 
    { 
     spectrum[i] = new float[spec_res]; 
    } 

    for (int i = 1, j = 0; j < arr_siz; i += sample_rate, j++) 
    { 
     song.timeSamples = i; 
     song.GetSpectrumData(spectrum[j], 0, win); 
    } 

    return spectrum; 
} 

Répondre

1

Je pense que AudioSource.GetSpectrumData repose sur le AudioSource actuellement engagé dans lecture. Je suppose que c'est l'échantillonnage à partir du fil audio à la place du clip lui-même, car un utilisateur peut également avoir ajouté des filtres audio ultérieurs. Essayez de jouer explicitement le clip dans votre boucle:

for (int i = 1, j = 0; j < arr_siz; i += sample_rate, j++) 
{ 
    song.Play(); 
    song.timeSamples = i; 
    song.GetSpectrumData(spectrum[j], 0, win); 
}