Day 14: 人工智慧在音乐领域的应用 (AI作曲-演算法基础概念)

接下来的几天我们会比较详细的介绍几个演算法是如何运用在作曲上,但在我们开始进入演算法作曲之前,我们要先来做一些基本观念的建设以及对於基本的参数设定做一些介绍。
https://ithelp.ithome.com.tw/upload/images/20210928/20140556rSF81RU72Z.png

针对问题定义演算法参数

首先我们来复习一下前面介绍的吃泡面演算法步骤:
吹含吸舔抠

  1. 买泡面/找出家里有的泡面
  2. 撕开包装
  3. 加入调味料
  4. 倒入热水
  5. 盖着等三分钟 (具体时间依照你想要的面体软硬调整)
  6. 吃泡面

以上是一个演算法的基本步骤,就如同我们前面几天介绍的各种AI有趣的演算法的基础一般。
那我们今天要来聊的就是,如果我们要把这些演算法套到特定的领域/应用上(例如AI作曲),那麽我们要如何先针对问题来做一些定义以及参数的设定。

我们一样以吃泡面演算法来当作范例:
首先,我们已经有了基本的泡面演算法,那麽我们希望用这个泡面演算法达成一个特别的目标,例如:
我希望吃到软硬度适中的康师父排骨酥桶面里面还要有颗卤蛋
供参
(里面有黑人我知道QQ)

那麽我们就要针对演算法去做一些定义,例如在:
第一个步骤时,我们就不能随便买/找一包泡面,而是一定要找到康师父排骨酥桶面 ;
第二个步骤撕开包装,基本上没有任何影响 ;
第三个步骤加入调味料的时候,因为我们一定要吃到卤蛋,所以这个步骤一定要注意里面有没有卤蛋,有的话最好,没有的话自己加 ;
https://ithelp.ithome.com.tw/upload/images/20210928/20140556RkGqS1KwxD.jpg
第四个步骤倒入热水,不影响 ;
第五个步骤,由於我们的目标是吃到软硬度适中的面,所以我们必须要设定好泡面要加盖後等多久,具体到底要等多久就看每个人自己心里的那把尺 ;
https://ithelp.ithome.com.tw/upload/images/20210928/201405563MDWBn8l2r.png
第六个步骤,依照设定的目标吃到软硬度适中的康师父排骨酥桶面里面还要有颗卤蛋,目标成功达成。

AI作曲怎麽定义与设定参数

终於可以准备进入正题了
https://ithelp.ithome.com.tw/upload/images/20210928/20140556lZ8HbV5wLr.jpg

首先我们要先把作曲这件事情放进演算法里面,因此我们必须要给电脑一个可以用来 表达音乐/音符/旋律的定义 (Representation) ; 并且要告诉电脑我们的 目标 是什麽,例如我们想要好听的音乐? 我们想要中国风的音乐? 我们想要难听的音乐?
(这部份很复杂,我们後面会在针对如何告诉电脑什麽是 好听的音乐 做详细的说明)
今天我们先把目标定为 希望产生出一组包含八个音符且里面没有任何一个音符是重复的 ; 此外,也要针对演算法里面的 运作方法 (Opertor) 去做特别的设定(就像我们对於要吃到软硬适中的面的话,就要去特别调整加盖等待的时间)。

我们拿前几天讲解过的爬山法 (Hill Climbing) 来当例子:
首先我们先告诉电脑音乐长什麽样子,我们可以用数字的方式来对於每一个音符做对应,而范围限定在两个八度,例如我们从中音的Do开始,把它设定为0 ; 而每往上一个半音,就增加1,以此类推,在最高音的部份会来到24,可以参考下面的对应图。
https://ithelp.ithome.com.tw/upload/images/20210928/20140556t9E6IepNru.png

那麽我们在初始化 (Initialization) 的时候,我们先乱数随机产生一组八个音符当作起始位置,例如
https://ithelp.ithome.com.tw/upload/images/20210928/201405569GcDhlIjZS.jpg
对应到五线谱上就是
https://ithelp.ithome.com.tw/upload/images/20210928/20140556XRmziHnWyi.jpg

而我们的运作方法 (Opertor),在这里要设定的就是每次可以移动到的邻居的距离,我们把它设定为八个音符中照顺序选择後把该音符随机转换成另一个音符
因次我们初始的音符[0, 0, 3, 7, 12, 10, 12, 4],产生了以下了八组邻居:
产生出来第1 组邻居[3, 0, 3, 7, 12, 10, 12, 4] => (第1个音符由0随机转换成3)
产生出来第2 组邻居[0, 8, 3, 7, 12, 10, 12, 4] => (第2个音符由0随机转换成8)
产生出来第3 组邻居[0, 0, 9, 7, 12, 10, 12, 4] => (第3个音符由3随机转换成9)
产生出来第4 组邻居[0, 0, 3, 6, 12, 10, 12, 4] => (第4个音符由7随机转换成6)
产生出来第5 组邻居[0, 0, 3, 7, 20, 10, 12, 4] => (第5个音符由12随机转换成20)
产生出来第6 组邻居[0, 0, 3, 7, 12, 12, 12, 4] => (第6个音符由10随机转换成12)
产生出来第7 组邻居[0, 0, 3, 7, 12, 10, 18, 4] => (第7个音符由12随机转换成18)
产生出来第8 组邻居[0, 0, 3, 7, 12, 10, 12, 7] => (第8个音符由4随机转换成7)

接着我们依照我们定义好的目标希望产生出一组包含八个音符且里面没有任何一个音符是重复的去计算初始音符的状态以及八组邻居的状态,由於我们希望得到的是完全没有重复音符的八个音符,因此我们只要把重复音符越多的部份当成缺点来计算就好(目标让分数为0,表示0重复音符),故我们可以得到
初始音符: [0, 0, 3, 7, 12, 10, 12, 4] => 分数(状态)为4分 (4重复音符)
1 邻居: [3, 0, 3, 7, 12, 10, 12, 4] => 分数(状态)为4分 (4重复音符)
2 邻居: [0, 8, 3, 7, 12, 10, 12, 4] => 分数(状态)为2分 (2重复音符)
3 邻居: [0, 0, 9, 7, 12, 10, 12, 4] => 分数(状态)为4分 (4重复音符)
4 邻居: [0, 0, 3, 6, 12, 10, 12, 4] => 分数(状态)为4分 (4重复音符)
5 邻居: [0, 0, 3, 7, 20, 10, 12, 4] => 分数(状态)为2分 (2重复音符)
6 邻居: [0, 0, 3, 7, 12, 12, 12, 4] => 分数(状态)为5分 (5重复音符)
7 邻居: [0, 0, 3, 7, 12, 10, 18, 4] => 分数(状态)为2分 (2重复音符)
8 邻居: [0, 0, 3, 7, 12, 10, 12, 7] => 分数(状态)为6分 (6重复音符)

由於目标是希望分数为0分,因此跟初始状态的4分相比,
邻居2号、5号以及7号是最好的结果 (2分) ;
邻居1号、3号以及4号分数持平 (4分) ;
而最惨的就是8号了,里面都没洗乾净还有沱屎 6个重复音符根本可谓恶邻中的恶邻。
https://ithelp.ithome.com.tw/upload/images/20210928/20140556JlHNDqbzjz.jpg

2号、5号以及7号一样好的情况下,我们可以随意选择其中一组当作新的状态,接着再持续重复以上的步骤,直到我们找到一组个音符都没有重复的状态 (0分)为止。
https://ithelp.ithome.com.tw/upload/images/20210928/20140556CJfmY0CetO.jpg

至於好不好听呢,由於我们的目标并非要产生好听的音乐,而是单纯的只要没有任何音符重复就好,因此出来的音乐好不好听就不是这次实验的重点。

那麽今天花了很长的篇幅(超过五千字了= =+)来介绍我们在音乐演算法之间要如何去做对应,希望能先藉由简单的爬山法来让大家理解整个运作的状态,当然爬山法并不适合来做音乐作曲,也不是主流会运用在音乐上的演算法,但是看在它简单易懂的分上,拿出来当作范例跟大家做介绍。

那麽明天开始,就来讲讲几个主流的演算法到底是怎麽实做音乐作曲的。或是放弃


<<:  从 JavaScript 角度学 Python(28) - 闭包(Closure)

>>:  [从0到1] C#小乳牛 练成基础程序逻辑 Day 14 - if else 条件判断 ?:运算子

[DAY 08]环境建置 : 软件(3)

前言 今天比较像是补充说明一下一些软件上的可以注意的点,基本上经过了软件(1) 跟软件(2) 之後,...

[Cmoney 菁英软件工程师战斗营] IOS APP 菜鸟开发笔记(2)

前言 从上周末开始到周三,除了学习老师教的观察者模式(Observer Pattern)和几种排序方...

系统和应用软件提供安全保证- 通用标准(Common Criteria)

-通用标准评估 TCSEC 在 DoD 中用於评估受信任的计算机系统。它适用於整个计算机系统,而不...

Day-28 轻松使用Excel生成乱数并排名

今日练习档 ԅ( ¯་། ¯ԅ) 今日的内容是要带大家认识如何使用Excel判断最大值和最小值,以及...

Day 3 - 基本资料型态、输入、基本运算式

大家好,我是长风青云。今天是铁人赛第三天,也是中秋连假第一天。 youtube影片在上字幕的部分,後...