Ich versuche, ein Programm zu schreiben, das die Note auf einem Klavier identifiziert. Ich habe herausgefunden, dass der Goertzel-Filter ein einfach zu implementierender Algorithmus ist, aber ich weiß nicht, wie ich ihn benutze .Erkennung von Klaviernoten mit C# mit NAudio
Hier ist der Code:
using NAudio.Wave;
using System.Windows;
using System;
using System.Collections.Generic;
namespace WpfTest {
public partial class MainWindow : Window {
private BufferedWaveProvider buffer;
private WaveIn waveIn;
private WaveOut waveOut;
private const double TargetFreaquency = 261.626;//C4 note
private const int SampleRate = 44100;
public MainWindow() {
InitializeComponent();
InitializeSound();
waveIn.StartRecording();
waveOut.Play();
}
private void InitializeSound() {
waveIn = new WaveIn();
waveOut = new WaveOut();
buffer = new BufferedWaveProvider(waveIn.WaveFormat);
waveIn.DataAvailable += WaveInDataAvailable;
waveOut.Init(buffer);
}
private void WaveInDataAvailable(object sender, WaveInEventArgs e) {
buffer.AddSamples(e.Buffer, 0, e.BytesRecorded);
var floatBuffer = new List<float>();
for (int index = 0; index < e.BytesRecorded; index += 2) {
short sample = (short)((e.Buffer[index + 1] << 8) |
e.Buffer[index + 0]);
float sample32 = sample/32768f;
floatBuffer.Add(sample32);
}
if (NotePlayed(floatBuffer.ToArray(), e.BytesRecorded)) {
Console.WriteLine("You have played C4");
}
}
private bool NotePlayed(float[] buffer, int end) {
double power = GoertzelFilter(buffer, TargetFreaquency, buffer.Length);
if (power > 500) return true;
return false;
}
private double GoertzelFilter(float[] samples, double targetFreaquency, int end) {
double sPrev = 0.0;
double sPrev2 = 0.0;
int i;
double normalizedfreq = targetFreaquency/SampleRate;
double coeff = 2 * Math.Cos(2 * Math.PI * normalizedfreq);
for (i = 0; i < end; i++) {
double s = samples[i] + coeff * sPrev - sPrev2;
sPrev2 = sPrev;
sPrev = s;
}
double power = sPrev2 * sPrev2 + sPrev * sPrev - coeff * sPrev * sPrev2;
return power;
}
}
}
Der Code nicht korrekt funktioniert, aber wie soll ich tun in der Konsole schreiben: jedes Mal, „Sie haben C4 gespielt“ Ich habe die Note C4 auf das Mikrofon spielen?
Hallo und willkommen! Ich denke deine Frage ist ein wenig unklar in was du eigentlich Hilfe brauchst. Dein Code sagt _ "Du hast C4 gespielt" _, also brauchst du Hilfe bei diesen Methoden, weil etwas mit ihnen nicht stimmt, oder brauchst du Hilfe beim Aufruf dieser Methoden? – Binke
Hallo und danke! Ich brauchte Hilfe mit den Methoden, weil es irgendwo einen Fehler gab und ich nicht herausfinden konnte, wo. Ich habe bereits die Antwort auf diese Frage, aber ich werde versuchen, in Zukunft klarer zu sein. –