从头开始创建DSP系统
|
我喜欢电子音乐,并且对所有的音高都很感兴趣。
我在库的Stack Overflow上发现了许多有用的问题,这些库可用于播放音频,过滤器等。但是我真正好奇的是实际上发生了什么:如何在效果和振荡器之间传递数据?我已经对dsp的数学方面进行了研究,但我怀疑问题的结局已被搁置,但我不确定要使用哪种缓冲系统等。最终目标是使效果的简单对象层次结构和通过彼此之间的数据(如果我最终不尽全力尝试实现它,则可能使用多线程)。它不会成为下一个Propellerhead原因,但我对它的工作方式很感兴趣,这比起最终产品的生产,更是一种练习。
目前,我使用.net和C#,并且最近学习了F#(这可能会或可能不会导致一些有趣的数据处理方式),但是如果这些方式不适合我,我可以在必要时学习其他系统。
问题是:使用缓冲区通过程序获取大量信号数据的最佳方法是什么?例如,使用队列,数组,链接列表等会更好吗?每次将效果应用到系统或只是编辑缓冲区中的值时,是否应该使样本不可变并创建一组新的数据?我应该有一个调度程序/线程池样式的对象来组织传递数据,或者效果函数应该直接在彼此之间传递数据?
谢谢。
编辑:另一个相关的问题是然后我将如何使用Windows API播放此数组?我真的不想使用DirectShow,因为微软现在已经让它死了
EDIT2:感谢您的所有答案。看完所有技术后,我将使用XNA 4(我花了一段时间浏览互联网并找到了说明操作方法的网站)或NAudio输出音乐...不确定哪种,取决于先进程度该系统最终被存在。当C#5.0发布时,我将使用其异步功能在此之上创建效果体系结构。我几乎都平等地使用了每个人的答案,所以现在我很难确定谁应该提供赏金给...
没有找到相关结果
已邀请:
8 个回复
鞘垒飘
audioChannel是围绕非托管float *缓冲区的包装。 您可能将样本存储在不可变数组中。然后,当您要播放它们时,将数据复制到输出缓冲区中(如果需要,可以更改频率)并在此缓冲区中执行效果。请注意,您可以使用多个输出缓冲区(或通道)并在最后对它们求和。 编辑 我知道两种播放数组的低级方法:Windows API中的DirectSound和WaveOut。使用DirectSound的C#示例。 WaveOut的C#示例。但是,您可能更喜欢使用外部高级库,例如NAudio。 NAudio对于.NET音频操作很方便-请参阅此博客文章,以向音频卡发送正弦波。您可以看到它们也使用了float数组,这是我的建议(如果您使用字节进行计算,最终会在声音中产生很多混叠)。
脾萌
糕泰灌
妊辽剁茧
坍锭嘉韭蓝
绵扇寸访
焙恍挝厂熄
荒劫娇噬