c# - 从头开始创建 DSP 系统

标签 c# .net audio f# buffering

我喜欢电子音乐,我对它的节奏很感兴趣。 我在 Stack Overflow 上发现了很多关于可用于播放音频、过滤器等的库的有用问题。但我真正好奇的是实际上发生了什么:数据如何在效果器和振荡器之间传递?我已经对 dsp 的数学方面进行了研究,并且我已经解决了问题的问题,但我不确定要使用什么缓冲系统等。最终目标是拥有一个简单的效果对象层次结构和传递数据的振荡器彼此之间(如果我最终没有拔出所有头发来尝试实现它,可能会使用多线程)。它不会成为下一个 Propellerhead Reason,但我对它的工作原理很感兴趣,这更像是一种练习,而不是产生最终产品的东西。

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

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

谢谢。

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

EDIT2:感谢您的所有回答。在查看了所有技术之后,我将使用 XNA 4(我花了一段时间在互联网上搜索并找到了 this site,它解释了如何做)或 NAudio 来输出音乐……不确定是哪一个,取决于如何先进的系统最终成为。当 C# 5.0 发布时,我将使用它的异步功能在其之上创建一个效果架构。我几乎平等地使用了每个人的答案,所以现在我不知道该给谁赏金......

最佳答案

您看过 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]);
        }
    }

audioChannel 是非托管 float* 缓冲区的包装器。

您可能将样本存储在不可变数组中。然后,当你想播放它们时,你复制输出缓冲区中的数据(如果你想改变频率)并在这个缓冲区中执行效果。请注意,您可以使用多个输出缓冲区(或 channel )并在最后对它们求和。

编辑

我知道两种播放阵列的低级方法:来自 Windows API 的 DirectSound 和 WaveOut。 C# Example using DirectSound . C# example with WaveOut .但是,您可能更喜欢使用外部高级库,例如 NAudio . NAudio 便于 .NET 音频操作 - 请参阅此 blog post用于向声卡发送正弦波。你可以看到他们也使用了一个 float 组,这是我推荐的(如果你使用字节进行计算,你最终会在声音中出现很多混叠)。

关于c# - 从头开始创建 DSP 系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6334104/

相关文章:

c# - ORA-01858 : a non-numeric character was found where a numeric was expected

ios - 使用 AudioUnit 录制设备音频输出

javascript - 提示用户声音权限

c# - Roslyn 内存编译 : CS0103: The name 'Console' does not exist in the current context

javascript - Asp.Net Kendo UI事件函数未定义 "change is not defined"

c# - 将 List<CustomObject> 转换为 JSON

c# - EF 代码优先 : Mapping nontable objects with Fluent API

c# - 如何在 C# 中实现 Jaccard 相似度

c# - 在 AxAcroPDF 中隐藏 pdf 工具栏

android - Android:声音播放错误。压缩问题?