Play sound in .NET using generated waveform data

后端 未结 6 1675
感情败类
感情败类 2021-02-02 03:55

How can I play a sound based on waveform data that my .NET program is generating from user input and mathematical functions?

By \"waveform data\" I mean SPL (sound press

6条回答
  •  被撕碎了的回忆
    2021-02-02 04:16

    I have this code but you will have to have code to generate your wav file in memory.

    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
    

提交回复
热议问题