Je travaille actuellement sur un programme qui analyse un fichier wav d'un musicien soliste jouant d'un instrument et détecte les notes qu'il contient. Pour ce faire, il effectue une FFT, puis regarde les données produites. Le but est de (à un certain point) produire la partition en écrivant un fichier midi. Je voulais juste obtenir quelques opinions sur ce qui pourrait être difficile à ce sujet, si quelqu'un l'a déjà essayé, peut-être quelques choses qu'il serait bon de rechercher. Pour le moment, mon plus gros problème est que toutes les notes ne sont pas une seule fréquence et que je ne peux pas encore détecter les accords; juste des notes simples. Il faut aussi qu'il y ait une pause entre les notes que je suis en train de détecter, donc je sais que l'un est terminé et l'autre a commencé. Tout commentaire à ce sujet serait également le bienvenu!Analyse audio pour partitions
C'est le code que j'utilise lorsqu'une nouvelle trame vient du signal. il recherche la fréquence qui est la plus dominante dans l'échantillon:
//Get frequency vector for power match
double[] frequencyVectorDoubleArray = Accord.Audio.Tools.GetFrequencyVector(waveSignal.Length, waveSignal.SampleRate);
powerSpectrumDoubleArray[0] = 0; // zero DC
double[,] frequencyPowerDoubleArray = new double[powerSpectrumDoubleArray.Length, 2];
for (int i = 0; i < powerSpectrumDoubleArray.Length; i++)
{
if (frequencyVectorDoubleArray[i] > 15.00)
{
frequencyPowerDoubleArray[i, 0] = frequencyVectorDoubleArray[i];
frequencyPowerDoubleArray[i, 1] = powerSpectrumDoubleArray[i];
}
}
//Method for finding the highest frequency in a sample of frequency domain data
//But I want to filter out stuff
pulsePowerDouble = lowestPowerAcceptedDouble;//0;//lowestPowerAccepted;
int frequencyIndexAtPulseInt = 0;
int oldFrequencyIndexAtPulse = 0;
for (int j = 0; j < frequencyPowerDoubleArray.Length/2; j++)
{
if (frequencyPowerDoubleArray[j, 1] > pulsePowerDouble)
{
oldPulsePowerDouble = pulsePowerDouble;
pulsePowerDouble = frequencyPowerDoubleArray[j, 1];
oldFrequencyIndexAtPulse = frequencyIndexAtPulseInt;
frequencyIndexAtPulseInt = j;
}
}
foundFreq = frequencyPowerDoubleArray[frequencyIndexAtPulseInt, 0];
Avez-vous du code que vous pouvez nous montrer? –
Bien sûr. Affichera. – Nyx
Voir http://stackoverflow.com/questions/435533/detecting-the-fundamental-frequency – mtrw