2017-07-10 1 views
1

Cette fonction est mise à l'échelle du volume mesuré à -90 à 0 (-90 sons les plus bas et 0 pour les sons les plus forts) en décibels.Recherche du rythme de la musique et de la touche à bascule

private int todBFS(double amplitude){ 
    if(amplitude != 0) { 
     return (int) (20.0 * Math.log10(amplitude/32767.0)); 
    } else { 
     return 0; 
    } 
} 

Comment puis-je détecter le rythme de la musique? J'ai essayé de faire quelques algorithmes pour détecter la croissance du volume sonore, mais rien n'a vraiment fonctionné. Je veux un led bascule au rythme.

+0

Le rythme a au mieux une relation occasionnelle (non causale) avec le volume. Êtes-vous sûr que le rythme est ce que vous cherchez? –

+2

trop large ... et pas vraiment une question de programmation car vous avez besoin de définir ce qu'est le rythme. Vous devriez puiser dans les sites de technologie audio et DSP pour trouver la réponse ou de désecher certains effets électroniques disco .. probablement la recherche d'un motif sur la sortie FFT filtrée .... ou un ensemble de filtres passe-bande avec une logique binaire au-dessus. .. – Spektre

Répondre

1

Comme d'autres l'ont mentionné, vous devez vraiment définir ce que vous entendez par rythme, mais je donne cette réponse en supposant que vous voulez allumer un "led" en réponse à l'un des éléments suivants:

Pour l'une de ces amplitude de mesure ne suffit pas parce que vous pourriez avoir deux formes d'onde par ailleurs identiques avec les mêmes « notes » dans, mais avec un à 10% l'amplitude o f l'autre. Si votre seuil de détection d'un "événement rythmique" est, disons, de -10 dBFS, alors il ne détectera aucun événement dans la forme d'onde mise à l'échelle de l'amplitude.

Plutôt que de réinventer la roue, je suggère d'utiliser une bibliothèque existante, comme Aubio ou SoundTouch

Si vous êtes complètement mis à faire vous-même, alors je suggère la lecture sur onset detection, qui utilise des fonctionnalités timbrales plutôt que amplitude pour déterminer les lieux de début.