サウンドカードにトーンを生成しようとしています(周波数:1950 hz、持続時間:40 ms、レベル:-30 db、右チャンネル、Steam 1)。C ++またはC#を使用してこれを実現する方法に関する推奨事項。このような正確なトーンを生成するためのライブラリ(C ++またはC#)はありますか?
2 に答える
デビッド、スピーカーにオーディオを再生することは、.NETに組み込まれていました(.NET 2.0 Frameworkにあると思います)。System.Media.SoundPlayer を使用すると、作成したメモリ ストリーム (WAV 形式) からサウンドを再生できます。これは、特定の期間単純な周波数を再生するコード化された関数です。デシベルとサウンドカードへの送信に関して、あなたが言及している詳細がよくわかりません。たとえば、デシベルで測定されたオーディオがサウンドカードに送信される方法を理解できません。私の理解では、デシベルは単に音の大きさの尺度です。スピーカーで再現されています。したがって、スピーカーの音量コントロールは、サウンドが生成するデシベルに影響を与えるため、特定のデシベルをサウンドカードに送信することは、私には意味がありません. もっと詳細な情報が必要かもしれませんが、これはうまくいかないかもしれません。しかし、これを実行して、必要なものを機能させることができるかもしれません。そして多分それはあなたが求めているものとほぼ同じです。
このコードで使用するプロセスにより、必要なオーディオを作成して再生できます。したがって、必要に応じて、この方法を使用して、2 つの正弦波または多数の正弦波または三角波を作成したり、音声合成を作成したりすることもできます。このメソッドは、計算されたサウンド サンプルを受け取り、それらを再生するため、特定の時点で各オーディオ サンプルがどのようなものである必要があるかをコーディングする必要があります。WAV ではステレオ サウンドも使用できますが、このコード サンプルでは非ステレオ サウンドのみを使用しています。ステレオ サウンドが必要な場合は、代わりにステレオ WAV 形式のバイトを生成するように変更する必要があります。さほど難しくないと思います。
ハッピーコーディング!
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
public static void PlayBeep(UInt16 frequency, int msDuration, UInt16 volume = 16383)
{
var mStrm = new MemoryStream();
BinaryWriter writer = new BinaryWriter(mStrm);
const double TAU = 2 * Math.PI;
int formatChunkSize = 16;
int headerSize = 8;
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 samples = (int)((decimal)samplesPerSecond * msDuration / 1000);
int dataChunkSize = samples * frameSize;
int fileSize = waveSize + headerSize + formatChunkSize + headerSize + dataChunkSize;
// var encoding = new System.Text.UTF8Encoding();
writer.Write(0x46464952); // = encoding.GetBytes("RIFF")
writer.Write(fileSize);
writer.Write(0x45564157); // = encoding.GetBytes("WAVE")
writer.Write(0x20746D66); // = encoding.GetBytes("fmt ")
writer.Write(formatChunkSize);
writer.Write(formatType);
writer.Write(tracks);
writer.Write(samplesPerSecond);
writer.Write(bytesPerSecond);
writer.Write(frameSize);
writer.Write(bitsPerSample);
writer.Write(0x61746164); // = encoding.GetBytes("data")
writer.Write(dataChunkSize);
{
double theta = frequency * TAU / (double)samplesPerSecond;
// 'volume' is UInt16 with range 0 thru Uint16.MaxValue ( = 65 535)
// we need 'amp' to have the range of 0 thru Int16.MaxValue ( = 32 767)
double amp = volume >> 2; // so we simply set amp = volume / 2
for (int step = 0; step < samples; step++)
{
short s = (short)(amp * Math.Sin(theta * (double)step));
writer.Write(s);
}
}
mStrm.Seek(0, SeekOrigin.Begin);
new System.Media.SoundPlayer(mStrm).Play();
writer.Close();
mStrm.Close();
} // public static void PlayBeep(UInt16 frequency, int msDuration, UInt16 volume = 16383)
NAudioは、.NET 用の堅牢なオーディオ ライブラリを提供します。
NAudio はオープン ソースの .NET オーディオおよび MIDI ライブラリであり、.NET でのオーディオ関連ユーティリティの開発を加速することを目的とした、多数の有用なオーディオ関連クラスが含まれています。2002 年から開発が続けられており、さまざまな機能を搭載するまでに成長しました。ライブラリの一部は比較的新しく不完全ですが、より成熟した機能は広範なテストを受けており、既存の .NET アプリケーションにオーディオ機能を追加するためにすぐに使用できます。NAudio は、NuGet を使用して .NET アプリケーションにすばやく追加できます。
NAudio を使用して正弦波を作成する方法を順を追って説明する記事を次に示します。任意の周波数で、任意の期間、正弦波を作成できます。