0

SoundEffect(C#) XNA オーディオ フレームワークのクラスを使用して、特定のピッチでサウンドを再生しようとしています。これまでのところ、私はこれを持っています(非常に基本的です)

public void playSynth(SoundEffect se, int midiNote) {
    float pitch = (float)functions.getMIDIFreq(midiNote) / ((float)functions.getMIDIFreq(127)/2);
    pitch-=1F;
    Debug.WriteLine("Note: {0}. Float: {1}",midiNote,pitch);
    synth = se.CreateInstance();
    synth.IsLooped = false;
    synth.Pitch = pitch;
    synth.Play();
}

現在、計算が間違っているため、再生されるピッチは非常にオフキーです。この関数が機能する方法は、私が作成したgetMIDIFreqという関数を使用して MIDI ノート (0 ~ 127) を関数に送信し、そのノートを周波数に変換することです。これは正常に機能します。

この関数を呼び出すために、私はこれを使用しています:

SoundEffect sound = SoundEffect.FromStream(TitleContainer.OpenStream(@"synth.wav"));
playSynth(sound,(int)midiNote);  //where midiNote is 0...127 number

synth.wav、DAW で作成してエクスポートした単純な C ノートです。このプログラムの要点は、そのシンセ音で指定された MIDI ノートを再生することですが、私は喜んで正弦波またはその他のもので解決します。Console.Beep非常に遅く、音符のある曲全体を立て続けに再生するのには適していないため、使用できません。

私の質問は、サンプルを正しいピッチで再生するように、このコードを修正するにはどうすればよいですか? ここで作業するのは 2 オクターブしかないので、特定の周波数でトーンを生成することを含む非常に高速なソリューションがあれば、それはさらに優れています。

ありがとう!

編集:これを XNA ゲームではなく WinForms アプリケーションにしていますが、プロジェクトでフレームワークをダウンロードして参照しています。

4

1 に答える 1

2

任意の周波数を適用することはできません。ピッチを 1 オクターブ下げる (半分の周波数) か、1 オクターブ上げる (2 倍の周波数) ことしかできません。したがって、ピッチベンド値を計算するには、まずサンプルの初期ピッチを知る必要があります。

サンプルがで、1 オクターブ下 ( )440 Hz Aが必要だとします。必要な値は です。 に。それを ~ のスケールにする必要があります。スケールが対数であるかどうかがドキュメントに明確に記載されていないため、正確な方法を説明することはできません。実験する必要がありますが、これで始められるはずです。A220 Hz-1yourPitch / initiPitch = 0.52.0-1+1

于 2013-01-16T14:21:42.000 に答える