我怎么能玩一个声音根据波形数据。净节目是产生从用户输入和数学的功能吗?

通过"波形数据",我的意思是SPL(声音压力水平)的数值,在一个固定的时间间隔的时间序列(可能44.1kHz)。我相信,这需要某种形式的流缓冲区排列。

注意,这是生活的/实际的时间,所以只是创造一个.果文件,然后播放,这将是不足够的。VB.NET 是首选,但C#是可以接受的。

只是澄清:什么我找的是一个简单的工作码的例子。

有帮助吗?

解决方案

您可以用做 n音讯。您创建一个从派生的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 ++转换成C#或VB.NET。但是,是什么概念很重要。您创建一个辅助的DirectSound缓冲区,然后用它来流过你的主缓冲区和发挥。

IrrKlang, BASS.net (在"其他Api"), NAudio, , G3D, 和其他人可以这样做。

我想你会需要使用 DirectSound ( 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