【问题标题】:Audio programming, generating an harmony音频编程,产生和声
【发布时间】:2011-09-17 18:46:16
【问题描述】:

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


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

使用 XNA,我使用了同一个音频文件的多个 SoundEffectInstance(如钢琴的 D4 音符),每个都有不同的 Pitch 值;音高值最多可以上升或下降一个八度。

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

我很难相信tonematrix只使用了一个“简单的正弦波合成器”,因为声音非常丰富,当它们混合在一起时,它们总是会产生和谐的音调,而简单的正弦波总是听起来很难看对我来说是人造的。

我在创造和声方面有什么不好的方法吗?您知道tonematrix 使用的正弦波到底发生了什么吗?

【问题讨论】:

  • 您是否将音高设置为 12 个半音以外的任何值?
  • NAudio中,频率都是440hz的倍数。在XNA中,音高间隔(-1 1)分为17个音,所以应该有正常音,8个上半音和8个下半音,填满上下八度。跨度>

标签: c# xna audio frequency synthesizer


【解决方案1】:

我碰巧能回答你的音乐问题,但这类问题最好在https://music.stackexchange.com/ 上提问。

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

你会发现它并没有使用正弦波,而是实际上使用ADSR envelope 来在开始时给它一个令人愉悦的“冲击”,在结束时给它(假的)“回声”。这很容易实现,因为您只需要调制幅度。

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

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

XNA 的内置音高转换并不是很适合这项任务。你确定你使用了正确的值来调整它吗?

【讨论】:

  • 看起来 XNA SoundEffect 不是一个好的选择,即使对于原型来说也是如此,因为 Play 方法似乎非常繁重,并且应该开始一起播放的声音实际上在它们之间有延迟。我要将所有信息应用到 NAudio 流或 DynamicSoundEffectInstance,感谢您提供的各种提示和信息。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    相关资源
    最近更新 更多