音频编程,产生和谐

时间:2011-06-18 13:09:34

标签: c# xna audio frequency synthesizer

我正在尝试开发一个类似于C#中tonematrix的应用程序。我首先尝试使用.net和NAudio库,现在我正在尝试使用XNA,但似乎所有我能得到的都是一种杂音。


使用 NAudio ,我将生成8个不同频率的简单正弦波,从(440hz * 1)到(440hz * 8)不等。

使用 XNA ,我正在使用相同音频文件的多个SoundEffectInstance(如钢琴的D4音符),每个音调具有不同的音高值;音高值可以上升或下降最大八度。

在这两种情况下,当声音重叠时,我会得到噪音而不是音乐。也许我弄错了,这不是混合不同音高/频率的声音的问题。

我发现很难相信音频矩阵只使用“简单的正弦波合成器”,因为声音非常丰富,当它们混合在一起时,它们总是产生谐波调谐,而简单的正弦波总是听起来很丑陋对我来说是人为的。

我创造和声的方法不好吗?您是否知道tonematrix使用的正弦波究竟发生了什么?

2 个答案:

答案 0 :(得分:2)

我碰巧能够回答你的音乐问题,但https://music.stackexchange.com/可能会更好地提出这些问题。

首先是规模。这些东西通常使用pentatonic scales(来自维基百科:“任何这样的音阶可以以任何顺序或组合播放而不会发生冲突”)。根据评论,您链接的示例使用从A到A的D Major Pentatonic。

你会发现它没有使用直线正弦波,但事实上正在使用ADSR envelope在开始时给它带来令人愉悦的“冲击”,并在最后使用(假)“回声”。这很容易实现,因为您只需要调制振幅。

据我所知,将波形混合在一起时没有做任何特别的事情。有可能是简单的添加。

至于实施方式,如果您有一种生成正弦波的方法,而不是尝试对样本进行俯仰移位,为什么不使用DynamicSoundEffectInstance并将其输入正弦波?

XNA的内置音高变换并不适合这项任务。你确定你正在使用正确的值进行调整吗?

答案 1 :(得分:1)

如果您使用与输入相同频率的倍数,则每个正弦波将比其他正弦波高一个八度。将这样的8个正弦波加在一起会在混合波形中产生一些非常高的峰值,因此您需要确保应用限制或减小整体音量以免引起失真。没有看到你的代码,很难肯定,但这可能是你的噪音的一部分原因。