从头开始创建DSP系统

Ed *_*ers 21 .net c# audio f# buffering

我喜欢电子音乐,我对这一切都很感兴趣.我在库上发现了很多有用的问题,可以用来播放音频,过滤器等等.但我真正好奇的是实际上是什么样的:如何在效果和振荡器之间传递数据?我已经研究了dsp的数学方面,我已经解决了问题的结束,但我不确定使用什么缓冲系统等.最终的目标是有一个简单的对象层次效果和振荡器传递数据彼此之间(如果我最终没有拉出所有的头发试图实现它,可能使用多线程).它不会成为下一个Propellerhead Reason,但我对它的运作方式感兴趣,这更像是一种运动而不是最终产品.

目前我使用.net和C#,我最近学习了F#(可能会或可能不会导致一些有趣的处理数据的方法),但如果这些不适合这项工作,我可以在必要时学习另一个系统.

问题是:使用缓冲区通过程序获取大量信号数据的最佳方法是什么?例如,我会更好地使用队列,数组,链接列表等?我是否应该使样本不可变并在每次将效果应用于系统或仅编辑缓冲区中的值时创建一组新数据?Shoud我有一个调度程序/线程池样式对象来组织传递数据,或者效果函数是否应该直接在彼此之间传递数据?

谢谢.

编辑:另一个相关的问题是我如何使用Windows API来播放这个数组?我真的不想使用DirectShow,因为微软现在几乎让它死了

EDIT2:感谢所有的答案.看完所有的技术后,我要么使用XNA 4(我花了一段时间在网上搜索,发现这个网站解释了怎么做)或者NAudio输出音乐...不确定哪一个,取决于如何先进系统最终成为.当C#5.0问世时,我将使用其异步功能来创建一个效果架构.我几乎平等地使用了每个人的答案,所以现在我有一个难题是谁给予赏金......

Lau*_*ent 7

你看过VST.NET(http://vstnet.codeplex.com/)了吗?它是一个使用C#编写VST的库,它有一些例子.您还可以考虑编写VST,以便可以从任何主机应用程序使用您的代码(但即使您不想要,也可以查看它们的代码).

信号数据通常很大,需要大量处理.不要使用链表!我知道的大多数库只是使用一个数组来放置所有的音频数据(毕竟,这就是声卡所期望的).

从VST.NET示例:

    public override void Process(VstAudioBuffer[] inChannels, VstAudioBuffer[] outChannels)
    {
        VstAudioBuffer audioChannel = outChannels[0];

        for (int n = 0; n < audioChannel.SampleCount; n++)
        {
            audioChannel[n] = Delay.ProcessSample(inChannels[0][n]);
        }
    }
Run Code Online (Sandbox Code Playgroud)

audioChannel是一个非托管float*缓冲区的包装器.

您可能将样本存储在不可变数组中.然后,当您想要播放它们时,可以复制输出缓冲区中的数据(如果需要,可以更改频率)并在此缓冲区中执行效果.请注意,您可以使用多个输出缓冲区(或通道)并在结尾处对它们求和.

编辑

我知道有两种低级方式来播放你的数组:来自Windows API的DirectSound和WaveOut.使用DirectSound的C#示例.WaveOut的C#示例.但是,您可能更喜欢使用外部更高级别的库,例如NAudio.NAudio便于.NET音频操作 - 请参阅此博客文章,将正弦波发送到声卡.你可以看到他们也在使用浮点数组,这是我推荐的(如果你使用字节进行计算,你最终会在声音中产生很多混叠).


Dan*_*dor 0

从阅读这个这个开始。

这会让你知道你必须做什么。

然后,学习 DirectShow 架构 - 并学习如何不这样做,而是尝试创建它的简化版本。