一个创建简单和弦进行的算法

8
我正在制作一个程序,它可以生成基于C大调音阶的随机简单旋律,并且基于一个随机化的基本和弦进行生成。
从这个音阶中产生4个三和弦的和弦进行通常听起来不太好。有没有好的方法可以生成4个三和弦的和弦进行?
我需要一种方法来生成一个听起来不错或还算可以的和弦进行,但是我不想简单地从现有的和弦进行池中随机选择一个。我仍然希望程序能够自动生成这四个三和弦,并使用一些简单的算法来确保生成的进行听起来合理。
请注意:这个问题不是我的之前关于创建旋律创作算法的重复问题。这是关于找到一种生成和弦进行的方法。生成旋律是一个不同的主题。
谢谢你的帮助。
编辑:知道一个三和弦是否与另一个三和弦相邻听起来还不错的一般指导方针也将非常好。

1
如果是我,我会使用马尔科夫链来确定某些和弦跟随其他和弦的概率更高,这样就不会完全随机。此外,有一些基本提示可以在Music.SE的一个答案中找到。 - Geobits
我看到您想要一种算法方法来完成这个任务,但有时在过程中加入反馈循环会非常有帮助。比如说,如果您生成了一个不喜欢的进展 - 如果在运行程序时,您可以提供这个反馈(以某种方式存储),并让它影响下一代,那么您就可以避免使用一组已知的进展。 - Raja
4个回答

3
听起来你需要分阶段进行:
首先,从这个键的所有可能性中随机生成一个三和弦
其次,应用一个或多个过滤器来消除那些听起来不好的(*)
继续做下去,直到你有4个通过所有过滤器的三和弦。
我认为这个解决方案也许会很愉快地工作——你可以逐渐建立一系列的过滤器,每个过滤器都做一件简单的事情——但是组合在一起,你逐渐找出了定义“良好”的东西。
(*) “听起来好”是相对于前面的三和弦(如果有的话)而定义的,并且这就是你可以写如下过滤器的地方:
- 三和弦的根音是否符合相对于前一个根音的逻辑模式?例如: - 简单上升 - 简单下降 - 以第三个为单位上升 - 等等。 - 这个三和弦的音符至少与前一个三和弦有一个共同的音符吗? - 跳跃从前一个三和弦开始是否“小于”某个给定的阈值?这样可以避免在整个音阶上突然跳跃。可以通过将三和弦的MIDI音符值相加并与以前的音符值进行比较来简单实现。

谢谢你的回答。问题是,所有大调音阶中的七个三和弦都听起来“不错”。它们都是简单的和弦,听起来很好。我的挑战是找到一种方法,使得连续播放四个三和弦时听起来不错。如果你在回答中所指的是在每个和弦之后检查它是否在前一个和弦之后听起来“不错”,那么这正是我的问题。我不知道如何做到这一点。 - user3150201
问题在于你的电脑也不知道。有些程序是通过读取大量音乐数据库进行训练的,有些是由开发人员根据“听起来不错”的权重进行评估的,有些则是通过众包投票方法得出的。没有一种确切的方法可以让计算机知道什么听起来“好”,因为这完全是主观的,需要你告诉它。 - Geobits
@user3150201 抱歉我表达不够清晰 - 这些过滤器会考虑到前面的三和弦进行 - 我在编辑中添加了示例。 - millhouse

1
您可以查看以下论文:

使用Schenkerian分析和和弦空间的概念生成音乐

以及和弦进行的概率模型

但是,这个主题可以很复杂。例如,假设准确而紧凑地表示音乐信号是大规模基于内容的音乐应用(如音乐内容管理和近似音频检测)的关键组成部分。
在这种情况下,您正在处理C大调音阶,它长这样:
C - D - E - F - G - A - B

具有间隔的

C - STEP - D - STEP - E - HALF STEP - F - STEP - G - STEP - A - STEP - B - HALF STEP - C - 

现在,和弦是由音符之间的距离形成的,例如:
C major chord is formed by C-E-G
D minor chord is formed by D-F-A
E minor chord is formed by E-G-B
F major chord is formed by F-A-C
G major chord is formed by G-B-D
A minor chord is formed by A-C-E
B dim   chord is formed by B-D-F

您描述的问题尽管在这个领域进行了许多研究,但目前还没有得到很好的解决。例如,可以查看其他论文,其中建议基于和弦进行对音乐信号进行中级摘要。因此,基于监督学习模型从音乐信号识别出和弦进行,并通过局部探测n个最佳候选项来提高识别准确性。
因此,您可以调查和弦进行的属性,然后从探测到的和弦进行中计算直方图作为音乐信号的摘要。然后,通过基于和弦进行的摘要,您可以描述音乐信号的谐波进行和音结构。
但是如何做呢?嗯,您需要音乐数据集(> 70,000首歌曲?),以便检索相关信息...

1
我承认我没有完全理解你写的内容 :) 但是基本上我理解的是,你建议让程序扫描大量的进展,并创建类似于它所学习的那些进展的进展? - user3150201
是的,因为它学习模拟人类学习和弦进行的方式,假设你只给它重金属进展,那么在生成新的进展时,你的程序将具有一些金属风格...基本上你训练它并分类进展,比如,我喜欢这个和弦进行,所以分配一个1,如果你不喜欢,你分配0。最后你会有几个带有0或1的和弦进行。 - edgarmtze

0

实际上这是一个非常有趣的问题。

我认为还需要考虑和理解一件事情:你想用你的和弦进行表达什么(即:表达)?我假设你想用你的旋律和支持的和弦进行表达“有意义的东西”。

现在,“有意义的东西”不是一个确切的术语。个人认为,这个术语应该描述为整体的、完整的、像一个短篇小说。它可以只有四个和弦,但它应该讲述一些故事,并且应该构成一个完整的故事。如果我们接受这一点,那么我会说你的四个和弦应该从开始到结束“引导”,并且我们应该“感觉”到最后一个和弦就像是“故事”的满意结局(解决方案)。

困难的部分是对于每个人来说,“令人满意的”,“体面的”等术语可能意味着完全不同的事情,对你来说令人满意的可能对另一个人来说并不令人满意。尽管在音乐理论中有一些基本的指导方针(在答案和评论中提供了链接),这些指导方针经过了数百年的音乐大师的测试,所以我想你应该尝试一些这些提示。


0
定义C大调的七个常规三和弦,将它们分别放入7个独立的三维向量中。然后使用随机生成器选择4个和弦,指定是否允许重复和弦。如果希望进行“更时髦”的进行,则使用七级和弦和扩展/变化音。对于此版本,您需要4个向量用于7级和弦,5个向量用于9级和弦,6个向量用于11级和弦,以及7个向量用于13级和弦。如果您首先将音阶定义为从C到B的7个向量,那么您实际上可以通过简单地在音阶周围循环并提取每个其他音符来生成所有这些和弦,类似于它们的定义方式。您仍然必须指定循环何时终止,否则您将获得一个无法听到的无限和弦。Python和许多其他编程语言都有一个实际库来处理不同的频率,因此如果您使用特定频率定义每个音符,就可以使用此程序来编写旋律、和声和整个乐章。

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接