玩弄Mathematica的乐器演奏功能
其实Mathematica和Matlab对数学处理上的功能都很强大,但其实我觉得它们的侧重点还是不一样的,比如对于物理系的孩子来说,计算研究那些Mathematica基本完爆Mathlab不知道多少条街,但是,对于搞信号或者算法的孩子来说,matlab里面很多内置的工具是Mathematica所无法取代的,所以其实是看人的啦。。。
在我一直看来,Matlab是一门工具,而Mathematica就是一个玩具般的存在,里面的各种功能总是让我玩得乐此不疲;因为Matlab里面你要实现什么,就中规中矩的去实现就是了,但是mathematica里面纯函数的存在,还有各式各样的奇怪的函数,交互上完全的人性化,所以可以有很多种玩法。。。【嘛~虽然最近搬砖过程中我有很刻意的取用mathematica来完成Matlab的工作,比如前阵子的那个AR谱分析的研究】。。。
然后,今天,唉,别提了,暴君的老婆菲特和另外一个女人”合体”了,搞到杭州下了差不多24个小时的雨,学校基本都被淹了,Especially紫金港那边,呵呵,所以呢,去不了实验室搬砖啦,于是就在宿舍玩mathematica,前阵子就有这个计划,mathematica的演奏音乐功能。。。
说起演奏音乐这个东西,其实我本科第一次发现mathematica很好玩,就是在于发现了这个功能,可能有些人知道,以前有人网上发不过一篇文章,用Matlab来演奏音乐,当时比较火的两个版本一个是《卡农》,一个就是《月亮之上》,但是这个原理是用matlab直接播放不同频率的声音,然后拼起来,但是不管怎么样,这个也比我不知道多少年前写的用汇编来驱动电脑蜂鸣器演奏音乐的那个强很多,毕竟至少matlab可以多声道(诶?还是应该叫多声部?)合奏,对吧。。。但是matlab这种输出很单一频率的演奏还是不够完美,我们希望的就是可以演奏出像钢琴弹出来的音色那种,某QQ同学曾告诉过我,这个叫做谐音列!!大概。。。是吧。。。
出来的结果就是:【我输出的是MID,然后用软件转的MP3,时间比较短的后面会多一倍的时间的空白,请别在意。。如果遇到音乐空间无法正常使用,请F5,如果还不行,重新读这一行。。】
[audio:http://kylen314.com/wp-content/uploads/2013/10/a.mp3|titles=Piano]而且把Piano换成Violin还可以改变音色成小提琴~
[audio:http://kylen314.com/wp-content/uploads/2013/10/a1.mp3|titles=Violin]mathematica里面内置了估计又100种左右的音色,具体请自行查找关于SoundNote的信息。
另外还不止这些,它除了可以输出超低音C-1到高音B9,还可以输出半音那种东西,像上面写的C#,Cb这些,所以只要稍微有点了解音乐乐谱和mathematica的话,就可以拿它来演出音乐了~
为了方便后面的演奏,我们需要写个简单的函数先,可以输出从指定的一个音,比如说C4,往上数或者往下数n个音的那个音符,比如C4+7=C5,C4+1=D4,C4-1=B3这种:
mathematica code
接下来我们可以先小试牛刀一下,输出一个”一闪一闪亮晶晶”来玩一下:
mathematica code
结果就是:
[audio:http://kylen314.com/wp-content/uploads/2013/10/a2.mp3|titles=一闪一闪亮晶晶~]
然后,我翻了一下以前汇编驱动蜂鸣器的那个文件夹,里面有以前给那个东西读的一些乐谱,那些乐谱是这样子的,A,B,C,D,E分别对应DO,RE,MI,FA,SO…所以只要写一个简单的转换程序,就可以输出啦:
mathematica code
[audio:http://kylen314.com/wp-content/uploads/2013/10/a3.mp3|titles=蝶恋]或者还可以输出杰伦的《安静》,
[audio:http://kylen314.com/wp-content/uploads/2013/10/a31.mp3|titles=安静]上面其实还是很不够完善,为什么呢?因为每个音和暂停那个音的持续时间都是相同的,所以输出来的结果就很像棒读的一样,所以我们要继续加强!!
比如说下面这个我是在网上找到的卡农的简谱的一部分,【QQ同学不愧是在星海音乐厅出演过指挥的同学啊!!我去请教他的时候,就给他看了前几个音符,他就说”诶?这不是卡农么?”,算了,反正当年在他家他也几乎表演过听一遍然后就演奏出来的本领,所以我也见怪不怪了。。】
像这个每个小节变化多样的,一会儿快一会儿慢的,不同音节持续时间不一样,这种能够完全演奏出来就很像实际演出的了,如果做出来,我们就可以随便改变乐器,或者添加别的来做合奏什么的了,是吧,这么想想,我还有点小激动~好吧,搞笑的。。
这个要怎么实现呢?我想了一下,利用mathematica里面的list,比如一个{}里面的东西就是一个小节,如果里面要继续细分音节的话,那么就是花括号套花括号就是了,不断嵌套下去,同一层花括号里面的音节持续时间是一样的,所以每个音节最后持续的时间就取决于他在或括号那科树中所在的层数以及那一个花括号里面还有几个别的音节,不知道我说明白没,反正最后要做的乐谱就是这样一个形式:【可能乐谱有些小地方抄错了,如果发现,请帮忙指正。。】
kanong = { {10, "-", 9, "-"}, {8, "-", 7, "-"}, {6, "-", 5, "-"}, {6, "-", 7, "-"}, {8, "-", 7, "-"}, {6, "-", 5, "-"}, {4, "-", 3, "-"}, {4, "-", 2, "-"}, {{8, 7, 8, 1}, {0, 5, 2, 3}}, {{1, 8, 7, 6}, {7, 10, 12, 13}}, {{11, 10, 9, 11}, {11, 10, 8, 7}}, {{6, 5, 4, 3}, {2, 4, 3, 2}}, {{1, 2, 3, 4}, {5, 2, 5, 4}}, {{3, 6, 5, 4}, {5, 4, 3, 2}}, {{1, -1, 6, 7}, {8, 7, 6, 5}}, {{4, 3, 2, 6}, {5, 6, 5, 4}}, {3, 10, 9, "-"}, {8, "-", 9, "-"}, {8, 10, 9, 11}, {{12, {10, 11}}, {12, {10, 11}}, {12, 5, 6, 7}, {8, 9, 10, 11}}, {{10, {8, 9}}, {10, {3, 4}}, {5, 6, 5, 4}, {5, 3, 4, 5}}, {{4, {6, 5}}, {4, {3, 2}}, {3, 2, 1, 2}, {3, 4, 5, 6}}, {{4, {6, 5}}, {6, {7, 8}}, {5, 6, 7, 8}, {9, 10, 11, 12}}, {{10, {8, 9}}, {10, {9, 8}}, {9, 7, 8, 9}, {10, 9, 8, 7}}, {{8, {6, 7}}, {8, {1, 2}}, {3, 4, 3, 2}, {3, 8, 7, 8}}, {{6, {8, 7}}, {6, {5, 4}}, {5, 4, 3, 4}, {5, 6, 7, 1}}, {{6, {8, 7}}, {8, {7, 6}}, {7, 8, 9, 8}, {7, 8, 6, 7}}, {{9, 3, 4, 3}, {2, 9, 10, 9}}, {{8, 3, 1, 6}, {5, -2, -3, -2}}, {{-1, 6, 7, 6}, {7, -2, -3, -2}}, {{-1, 6, 5, 6}, {7, 7, 6, 7}}, {{1, 8, 9, 8}, {7, 0, 1, 0}}, {{-1, 6, 5, 6}, {7, 0, 3, 2}}, {{1, 8, 9, 11}, {10, 3, 5, 10}}, {{8, 11, 10, 11}, {9, 5, 4, 5}}, {{3, {8, 7}}, {8, 3}, {5, {5, 6}}, {7, 5}}, {{3, {8, 9}}, {10, 8}, {10, {10, 9}}, {8, 7}}, {{3, {7, 8}}, {10, 8}, {10, {10, 9}}, {8, 7}}, {{6, {6, 5}}, {6, 7}, {8, {10, 9}}, {8, 10}}, {{4, {1, 7}}, {6, 6}, {5, 2}, {5, 5}}, {3, 10, {10, 11}, {10, 9}}, {8, 8, {8, 9}, {8, 7}}, {6, "-", 8, "-"}, {{{8, 7}, {6, 7}}, {5, {5}}}, {{5, {5}}, {{5, 6}, {5, 4}}}, {{3, {3}}, {{3, 4}, {3, 2}}}, {{{8, 7}, {6, 7}}, {5, {5}}}, {4, 8, 7, 7}, {12, "-", 5, 4}, {10, "-", 10, 9}, {8, "-", "-", 1}, {8, "-", 7, "-"}, {8, 1, 0, 7}, {6, -1, -2, 5}, {4, 11, 10, 3}, {2, 6, 2, 8}, {9, 3, 2, 8}, {8, 1, 0, 7}, {6, 13, 12, 5}, {4, 8, 5, 8}, {9, "-", "-", "-"} };
mathematica code
最后演出效果就是:
[audio:http://kylen314.com/wp-content/uploads/2013/10/a4.mp3|titles=卡农]
其实上面所说的都只是一个演示,有想象力的话可以做出各种大合奏出来,因为mathematica里面List里面并列的话就是同时播放,而且加上音量控制的话,搞不好可以弄个简易的交响乐呢。。。
而且看得懂乐谱的人可以自己做自己喜欢的乐曲的演奏和变种,而像我这种音乐战五渣的人只懂得看简谱,找不到简谱我就没辙了,最喜欢的就是上面那种卡农的简谱了,清晰明了易推倒,哦不,是易懂,而且你在网上可以找到很多ACG纯数字的”简谱”,比如BadApple,鸟之诗,炮姐OP之类的,都是用1,2,3,#,!,小数点什么的来表示高音低音半音的,你很容易就写出一些”解码”的代码来,我今天写了一些,但是发现因为节奏上不清晰的缘故,就是播出来就和上面的《蝶恋》啊,《安静》啊什么的一样,棒读,懂?所以说嘛,最好还是上面卡农那种简谱,战五渣最爱~
好吧,以上!
【完】
本文内容遵从CC版权协议,转载请注明出自http://www.kylen314.com
浙大小学弟路过,同Mathematica爱好者……
好玩~_~