質問

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

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

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

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

役に立ちましたか?

解決

あなたは NAudioするを使用してこれを行うことができます。あなたはWaveStreamから派生し、そのオーバーライドReadメソッドでは、あなたがその場で生成することができますあなたのサンプルを返すストリームを作成します。あなたは、待ち時間を制御することができますサウンドカードによって使用されるバッファのサイズを制御できます。

他のヒント

をdoubleの配列から再生する方法
    PlayerEx pl = new PlayerEx();

    private static void PlayArray(PlayerEx pl)
    {
        double fs = 8000; // sample freq
        double freq = 1000; // desired tone
        short[] mySound = new short[4000];
        for (int i = 0; i < 4000; i++)
        {
            double t = (double)i / fs; // current time
            mySound[i] = (short)(Math.Cos(t * freq) * (short.MaxValue));
        }
        IntPtr format = AudioCompressionManager.GetPcmFormat(1, 16, (int)fs);
        pl.OpenPlayer(format);
        byte[] mySoundByte = new byte[mySound.Length * 2];
        Buffer.BlockCopy(mySound, 0, mySoundByte, 0, mySoundByte.Length);
        pl.AddData(mySoundByte);
        pl.StartPlay();
    }

アップロードするには、このスレッドをチェック DirectSoundには、任意のデータをバッファリングし、それを再生ます。

コメントパー:はい、私は知っています。あなたは、C#やVB.NETにC ++を変換する必要があります。しかし、概念が重要だものです。あなたの主バッファに経由でストリーミングして再生するためにそれを使用し、その後、二次DirectSoundのバッファを作成します。

イルクラン, BASS.net (「その他の API」の下)、 Nオーディオ, シジミ, G3D, 、およびこれを実行できる他のもの。

を使用する必要があると思います ダイレクトサウンド (ダイレクトX API)そのために。これは、生成されたデータで満たされる可能性のあるバッファーを処理します。

たぶん次のようなもの これ (ここ 帰りの機械で) 役に立ちます

私はこのコードを持っていますが、メモリ内のあなたの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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top