2012-04-04 13 views
3

私は、その面では本当にシンプルに見えますが、私は大きな問題を解決しているという問題があります。二重配列のサウンドを再生

44.1KHzにダウンコンバートした350KHzのDAQでサンプリングされたデータを含む2つのダブルアレイ(左右のチャンネル)があります。

私がしたいのは、これらの2つの配列をとり、それらを再生することですが、サウンドを出力するために利用できるオプション、すなわちdirectx、NAudioなどが多すぎるようです。誰かがいるかもしれないと思っています。これを行うための最良の方法は何かについてアドバイスをしてくれるかもしれません。

アドバイスを事前にお寄せいただきありがとうございます。

デイブ

答えて

3

NAudioは(あなたも同じように)私は、人々が何度か言及聞いた一つの選択肢です。私はそれがオープンソースの第三者図書館であることを知っています。あなたはそれを見たいかもしれません。

残念ながら、私が集めているところから、DirectXが出てきていて、MSは長年に亘っていくつかの異なるものにプッシュしているように思えます。そして今、彼らは人々にXNAを使用するよう促しています。 XNAでプロジェクトを作成すると、デスクトップ環境、Xbox 360、Windows PhoneでWindows上で実行できるフレームワーク全体です。私にとっては、MSがモバイルの世界で大きなプレーヤーではないようだが、Xboxで動作するアプリは私にとって魅力的であるように、Windows Phoneは大きな問題ではない。しかし、私は、ビデオの再生やオーディオの再生を含む、通常の.NETフレームワークでは欠けているXNAフレームワーク/アーキテクチャのいくつかの優れた機能を見てきました。私はまだXNAで(まだ)発展していないので、それ以上の詳細は分かりません。

また、サードパーティのライブラリを使用せずにSystem.Media.SoundPlayerを使用して.NETで直接再生することもできます。

私は以下のコードがそれを使用して単純な正弦波を演奏することを発見しました。サウンドサンプルを生成し、MemoryStreamに送り、SoundPlayerで再生します。 SoundPlayer自体は、WAV形式のストリームを使用していますが、ステレオサウンドは再生できますが、ステレオサウンドは必要ありませんので、WAVファイル形式に追加する方法については検討していません。これについて私が大好きなのは、サードパーティのDLLが必要ないということです。この方法は、あなたにとって有用である場合は、ここにある:もちろん

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) 

あなたは、この最後のオプションで行くならば、あなたはWAV形式にステレオサウンドをフォーマットし、それに見てどのように把握する必要がありますあなた自身(またはそれについて尋ねる)。ハッピーコーディング!

+0

これがあなたにとって有用であれば、投票してください。ありがとう!) – Edward

+0

私は、コード内の 'トラック'変数が 'チャンネル'であると信じていますが、私は信じていません。ステレオサウンドの場合は2になります。 http://www.sonicspot.com/guide/wavefiles.htmlは、WAVファイル形式に関する情報の素晴らしい1つのページです。 – Edward

関連する問題