可能性のある複製:
C#での正弦波または方形波の作成
音を出したい。次のようなものです:
MakeSound(frequency, duration);
または:
MakeSound(MyArrayOfSamples);
という名前のものが見つかりました:Microsoft.Directx.DirectSound
が廃止されたことを読みました。そして、私はそれをVisual Studio(2010)の参照のオプションとして見つけることができませんでした。私は this link を見つけました。これは私が読んだことによると、それを含めることになっていますが、2006年以降はサポートされなくなる可能性があるため、何かを使用することをためらっています。そして これ はC/C++向けだと言っています(「マネージコード」とも言われています)。できません。私が見つけた最も有望なリンクは WaveFormat ですが、それを使用する方法を見つけることができませんでした。
音波の数学的表現を取得する方法をではありません。また、mp3ファイルなどの再生方法についても質問していません。サードパーティのソフトウェアやラッパーも探していません。非常に特定の目的のためのC#/ .netソリューション用です。
どちらにしても、アンマネージコードを使用したくない場合は、WAVを作成して再生する必要があります。ただし、以下は Eric Lippertのブログ のコードスニペットで、周波数を使用して独自のWAVファイルをロールする方法を示しています。
namespace Wave
{
using System;
using System.IO;
class MainClass {
public static void Main() {
FileStream stream = new FileStream("test.wav", FileMode.Create);
BinaryWriter writer = new BinaryWriter(stream);
int RIFF = 0x46464952;
int WAVE = 0x45564157;
int formatChunkSize = 16;
int headerSize = 8;
int format = 0x20746D66;
short formatType = 1;
short tracks = 1;
int samplesPerSecond = 44100;
short bitsPerSample = 16;
short frameSize = (short)(tracks * ((bitsPerSample + 7)/8));
int bytesPerSecond = samplesPerSecond * frameSize;
int waveSize = 4;
int data = 0x61746164;
int samples = 88200 * 4;
int dataChunkSize = samples * frameSize;
int fileSize = waveSize + headerSize + formatChunkSize + headerSize + dataChunkSize;
writer.Write(RIFF);
writer.Write(fileSize);
writer.Write(WAVE);
writer.Write(format);
writer.Write(formatChunkSize);
writer.Write(formatType);
writer.Write(tracks);
writer.Write(samplesPerSecond);
writer.Write(bytesPerSecond);
writer.Write(frameSize);
writer.Write(bitsPerSample);
writer.Write(data);
writer.Write(dataChunkSize);
double aNatural = 220.0;
double ampl = 10000;
double perfect = 1.5;
double concert = 1.498307077;
double freq = aNatural * perfect;
for (int i = 0; i < samples / 4; i++) {
double t = (double)i / (double)samplesPerSecond;
short s = (short)(ampl * (Math.Sin(t * freq * 2.0 * Math.PI)));
writer.Write(s);
}
freq = aNatural * concert;
for (int i = 0; i < samples / 4; i++) {
double t = (double)i / (double)samplesPerSecond;
short s = (short)(ampl * (Math.Sin(t * freq * 2.0 * Math.PI)));
writer.Write(s);
}
for (int i = 0; i < samples / 4; i++) {
double t = (double)i / (double)samplesPerSecond;
short s = (short)(ampl * (Math.Sin(t * freq * 2.0 * Math.PI) + Math.Sin(t * freq * perfect * 2.0 * Math.PI)));
writer.Write(s);
}
for (int i = 0; i < samples / 4; i++) {
double t = (double)i / (double)samplesPerSecond;
short s = (short)(ampl * (Math.Sin(t * freq * 2.0 * Math.PI) + Math.Sin(t * freq * concert * 2.0 * Math.PI)));
writer.Write(s);
}
writer.Close();
stream.Close();
}
}
}
必要に応じてそれを分解しますが、aNatural
変数に注目してください。これは、まさにあなたが探しているものと同じように、頻度です。
これで、それをMemoryStream
に配置して、必要に応じてSoundPlayer
で再生できます。
以下は、カーネルの Beep 関数のラッパーであり、持続時間と周波数を取得します。現在、Beep
はサウンドカードを使用しています。私の時代は、マザーボードに接着されたピエゾデバイスを使用していました。
using System;
using System.Runtime.InteropServices;
class BeepSample
{
[DllImport("kernel32.dll", SetLastError=true)]
static extern bool Beep(uint dwFreq, uint dwDuration);
static void Main()
{
Console.WriteLine("Testing PC speaker...");
for (uint i = 100; i <= 20000; i++)
{
Beep(i, 5);
}
Console.WriteLine("Testing complete.");
}
}
私のWin10ボックスでは、期間(最後のパラメーター)をここで5ミリ秒よりはるかに長く、最大50ミリ秒に設定する必要がありますが、妥当な値を得るには100ミリ秒にする必要があります。
または、簡単な方法を使いたい場合は、 Console.Beep(Int32、Int32) メソッドを使用します。このメソッドは.Net 2.0で導入されました。