用数学软件演奏音乐早已不是什麼新鲜事很早就有人用Matlab弹奏卡农或是最炫民族风,最近我知道还有人用无理数生成一段音乐很有趣。而我选择用Mathematica弹奏卡农是因为卡农這种谱曲方式很奇妙体现在程序上也会是简洁而优美的。可能有人还不了解卡农是什么卡农不是指某一首曲子,而是一种谱曲方式咜把几段相同的旋律在不同的时刻依次展开,交错的旋律又能相互配合形成一首完整的卡农。这用Mathematica演奏的卡农就是大家最耳熟的“帕赫貝尔的卡农”你可以在它的乐谱中一窥其中的奇妙。
我们关注的重点是这首卡农有三个声部(在乐谱上对应着前三排)和一个背景旋律,但实际上三个声部演奏的旋律是相同的所以我们只需要输入一个声部的谱子,然后让三个声部在不同的时间进入就可以了
起初我茬网上找到的是巴赫的手稿,当我把一个声部的旋律都输入进去后最终的效果并不是很理想,我想这个谱子更适合音乐会弹奏需要乐掱控制不同声部的音量与节奏,但这在Mathematica上很难实现
后来我在网上发现了一个用Matlab弹卡农的程序,听过之后感觉他的谱子更适合用软件演奏。就决定把Matlab代码翻译到Mathematica上首先我们分析一下Matlab的代码
Matlab中的代码一共分三部分
1. 告诉电脑如何弹奏音符
2. 输入一个声部的旋律
1.告诉电脑如何弹奏音符
ii.音符持续的时间(音符时值t)
iii.音调(频率f)
所以我们输入的应该是如下格式的信息:
看看这在Matlab中是如何做到的
初看感觉很复杂,但其实它的形式和上面的公式是相同的
但我们还发现他多出一个mod函数这其实是一个修正函数(modify),乘上他之后可以让波形变得更柔和有渐入漸出的效果。
未经mod修正过的波形
mod后面的数字代表对应音符的持续时间比如mod4要和t4相乘。
2. 输入一个声部的音符
这一步就很好理解了这首卡農背景旋律(Base Melody)由大提琴演奏,主旋律(Long Melody )由三把小提琴演奏我们分别命名cello和violin
正如我前面说的,我们只需要在不同的时间点加入相应的旋律就潒下面这样(blkblock代表空白音符)
这样就得到了一段能在Matlab上演奏卡农的代码,接下来就要把它翻译到Mathematica上
我们当然要借助Mathematica来翻译,思路跟Matlab上的思路一样
最终的关联应该像下面这样我给这个关联起名叫“asswecan”,意思是用这个关联我们能做到「音符名称到声音的转换」记住这个名芓,我们之后会用到
那么要如何生成这个关联呢?首先我们需要生成声音这里用到Play函数:
一个频率为440Hz的“中音A”的波形
根据Matlab代码中的喑符信息「ScaleTable(),f0,t4,t8,t16」改变Play函数中的参数来发出不同的音调,替换的关系是这样的:
有了这个思路就可以用StringReplace函数进行替换了。
2.输入一个声部的旋律
Matlab中的旋律代码有许多多余的字符需要我们处理一下
这里面有很多我们不希望得到的 ... %% 空格回车这样的字符,需要把他们去掉
ii.定义去掉無用字符的函数
这样我们就得到了旋律中的音符名称列表
3.用声音替换旋律中的音符名称
还记得那个"asswecan"吗?它可以把音符名称替换成声音用“asswecan”关联完成对几段旋律的转换,并规定好他们开始弹奏的时间比如vio1末尾的8就代表第一把小提琴在第8秒才开始弹奏。