7

.NET プログラムがユーザー入力と数学関数から生成している波形データに基づいてサウンドを再生するにはどうすればよいですか?

「波形データ」とは、一定間隔の時系列 (おそらく 44.1 kHz) における SPL (音圧レベル) 値を意味します。これには、ある種のストリーミング バッファの配置が必要だと思います。

これはライブ/リアルタイムでなければならないので、.wav ファイルを作成して再生するだけでは十分ではないことに注意してください。VB.NET が推奨されますが、C# も使用できます。

明確にするために:私が探しているのは、単純な作業コードの例です。

4

6 に答える 6

4

これはNAudioを使用して行うことができます。WaveStream から派生するストリームを作成し、そのオーバーライドされた Read メソッドで、オンザフライで生成できるサンプルを返します。サウンドカードが使用するバッファのサイズを制御できるため、レイテンシを制御できます。

于 2009-07-05T18:53:52.133 に答える
1

IrrKlangBASS.net (「その他の API」の下)、NAudioCLAMG3D、およびこれを実行できるその他のもの。

于 2009-11-14T18:46:17.187 に答える
1

DirectSoundバッファに任意のデータをロードして再生する方法については、このスレッドを確認してください。

コメントごと: はい、わかっています。C++ を C# または VB.NET に変換する必要があります。でも、大事なのはコンセプトです。セカンダリ DirectSound バッファーを作成し、それを使用してプライマリ バッファーにストリーミングして再生します。

于 2009-07-05T18:17:33.710 に答える
0

私はこのコードを持っていますが、wav ファイルをメモリに生成するコードが必要です。

Option Strict Off
Option Explicit On
Imports Microsoft.DirectX.DirectSound
Imports Microsoft.DirectX
Imports System.Threading

Public Class Form1
Const SRATE As Integer = 44100
Const FREQ As Integer = 440
Const DUR As Integer = 1

Private dsDesc As BufferDescription
Private wvFormat As WaveFormat
Private DS As Device

Dim SecondaryBuffer As Microsoft.DirectX.DirectSound.SecondaryBuffer
Dim BufferDescription As Microsoft.DirectX.DirectSound.BufferDescription
Dim DXFormat As Microsoft.DirectX.DirectSound.WaveFormat
Dim sbuf(DUR * SRATE) As Short


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Show()
    DS = New Microsoft.DirectX.DirectSound.Device
    DS.SetCooperativeLevel(Me, CooperativeLevel.Normal)
    wvFormat.FormatTag = WaveFormatTag.Pcm
    wvFormat.Channels = 1
    wvFormat.SamplesPerSecond = SRATE
    wvFormat.BitsPerSample = 16
    wvFormat.AverageBytesPerSecond = 2 * SRATE
    wvFormat.BlockAlign = 2
    dsDesc = New BufferDescription(wvFormat)
    dsDesc.BufferBytes = 2 * DUR * SRATE
    dsDesc.Flags = 0
    Dim buff1 = PlayWave(400)
    Dim buff2 = PlayWave(600)
    buff1 = PlayWave(400)
    buff1.Play(0, Microsoft.DirectX.DirectSound.BufferPlayFlags.Default)
    Thread.Sleep(1000)
    buff1 = PlayWave(600)
    buff1.Play(0, Microsoft.DirectX.DirectSound.BufferPlayFlags.Default)
    ' End
End Sub
Function PlayWave(FREQ As Integer) As SecondaryBuffer
    ' create a buffer
    Dim dsBuffer As SecondaryBuffer
    dsBuffer = New SecondaryBuffer(dsDesc, DS)
    Dim sbuf(DUR * SRATE) As Short
    ' create tone                
    For i As Integer = 0 To DUR * SRATE
        sbuf(i) = CShort(10000 * Math.Sin(2 * Math.PI * FREQ * i / SRATE))
    Next
    ' copy to buffer
    dsBuffer.Write(0, sbuf, LockFlag.EntireBuffer)
    Return dsBuffer
End Function
于 2016-07-20T14:03:47.473 に答える
0

そのためにはDirectSound ( DirectX API)を使用する必要があると思います。生成されたデータで埋めることができるバッファをオフにします。

たぶん、このようなもの(ここではバックマシン)が役立つでしょう

于 2009-07-05T17:59:39.650 に答える