私はピアノで演奏する音符を識別するプログラムを作成しようとしていますが、Goertzelフィルタはアルゴリズムを実装するのは簡単ですが使用方法はわかりません。ここで NAudioでC#を使用してピアノノートを検出する
コードです:コードが正しく動作していないが、どのように私はコンソールに書き込みに行う必要があります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;
}
}
}
:私はマイクにC4のノートを演奏するたびに、「あなたはC4を果たしてきましたか」?
ようこそ!私はあなたの質問は、あなたが実際に助けを必要としているかどうか少し不明であると思います。 You'rコードは_ "あなたはC4を演奏しました" _ので、何か問題があるか、またはこれらのメソッドを呼び出す方法について助けが必要なので、これらのメソッドの助けが必要ですか? – Binke
こんにちは、ありがとう!どこかでエラーがあったので、私はこの方法の助けが必要でした。私はすでにこの質問に答えましたが、私は将来もっと明確にしようとします。 –