Bonjour,
Je suis entrain de programmer une petite application pour reconnaitre ou vérifier qu'une note de guitare soit jouer correctement. Pour streamer l'audio, je n'ai aucun soucis tout se passe bien avec AudioAnalyzer. J'ai aucun soucis quand j'essaye un son avec une fréquence fixe, mais lorsque j'essaye avec une des notes suivantes, je ne sais pas comment faire.
Voici des MP3 pré-enregistrés :
J'utilise ces images pour trouver la correspondance entre note et case : http://imgur.com/a/rermN.
J'ai aussi ce tableau pour la correspondance des notes :
En principe, d'après ce tableau, voici l'équivalence note <=> fréquence :
Note | Hz |
---|---|
E4 | 329.63 |
F4 | 349.23 |
F#4 | 369.99 |
G4 | 392 |
- | - |
B3 | 246.94 |
- | - |
A2 | 110 |
C#3 | 138.59 |
Je voulais savoir si vous avez des éléments pour m'aider (documentation/site) ou m'expliquer comment je dois m'y prendre pour reconnaitre une note ?
Car je ne sais pas du tout comment je dois m'y prendre, et j'aimerai bien comprendre comment ça fonctionne.
Quand j'ai une fréquence fixe, j'utilise ce script qui me renvoie la fréquence sous la variable "pitch" :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | using UnityEngine; public class AudioMeasureCS : MonoBehaviour { public float RmsValue; public float DbValue; public float PitchValue; public static float sPitchValue; public AudioSource AudioSource; public UnityEngine.UI.Text display; // drag a GUIText here to show results private const int QSamples = 1024; private const float RefValue = 0.1f; private const float Threshold = 0.02f; float[] _samples; private float[] _spectrum; private float _fSample; void Start() { if (!AudioSource) { Debug.Log("Default AudioSource loaded."); AudioSource = GetComponent<AudioSource>(); } _samples = new float[QSamples]; _spectrum = new float[QSamples]; _fSample = AudioSettings.outputSampleRate; } void Update() { AnalyzeSound(); if (display) { display.text = "RMS: " + RmsValue.ToString("F2") + " (" + DbValue.ToString("F1") + " dB)\n" + "Pitch: " + PitchValue.ToString("F0") + " Hz"; } sPitchValue = PitchValue; } void AnalyzeSound() { AudioSource.GetOutputData(_samples, 0); // fill array with samples int i; float sum = 0; for (i = 0; i < QSamples; i++) { sum += _samples[i] * _samples[i]; // sum squared samples } RmsValue = Mathf.Sqrt(sum / QSamples); // rms = square root of average DbValue = 20 * Mathf.Log10(RmsValue / RefValue); // calculate dB if (DbValue < -160) DbValue = -160; // clamp it to -160dB min // get sound spectrum AudioSource.GetSpectrumData(_spectrum, 0, FFTWindow.BlackmanHarris); float maxV = 0; var maxN = 0; for (i = 0; i < QSamples; i++) { // find max if (!(_spectrum[i] > maxV) || !(_spectrum[i] > Threshold)) continue; maxV = _spectrum[i]; maxN = i; // maxN is the index of max } float freqN = maxN; // pass the index to a float variable if (maxN > 0 && maxN < QSamples - 1) { // interpolate index using neighbours var dL = _spectrum[maxN - 1] / _spectrum[maxN]; var dR = _spectrum[maxN + 1] / _spectrum[maxN]; freqN += 0.5f * (dR * dR - dL * dL); } PitchValue = freqN * (_fSample / 2) / QSamples; // convert index to frequency } } |
Je vous remercie d'avance !