MA模拟吉他弹奏南山南

一些音乐基础(小白教程)

其实, 我自己也是小白, 所以只能写个小白教程。

  1. 认识简谱
    下面是我从网上搜到的南山南吉他谱:


    南山南

    我们只需要管歌词上面的那一行简谱。注意到:

    • 节拍是4/4拍. 我直接引用Wiki的详细解释:

      分母表示拍子的时值也就是说用几分音符来当一拍,如2/4代表用四分音符代表一拍,每一小节有两拍。分子代表每一小节有多少拍子,前面说过了2/4拍就是以四分音符为一拍,一小节有两拍,3/4以四分音符为一拍,每小节有三拍……读法是先读分子,再读分母,比如2/4叫二四拍,3/4叫三四拍,6/8叫六八拍。

    • 数字表示音符:

      在简谱中,记录音的高低和长短的符号,叫做音符。而用来表示这些音的高低的符号,是用七个阿拉伯数字作为标记,它们的写法是:
      1 2 3 4 5 6 7
      读法为
      do re mi fa so la si
      多 来 米 发 梭 拉 西
      音符是和音高紧密相连的,没有一个不带音高的音符。我们通过在音符上方或者下方加点来表示高/低八度的音。

    • 数字下的下划线或者后面的加点表示该音符的时值

      表示音乐的长短需要有一个相对固定的时间概念。简谱里将音符分为全音符、二分音符、四分音符、十六分音符、三十二分音符在这几个音符里面最重要的是四分音符,它是一个基本参照度量长度,即四分音符为一拍。这里一拍的概念是一个相对时间度量单位。一拍的长度没有限制,可以是1秒 也可以市2秒或半秒。假如一拍是一秒的长度,那么二拍就是两秒;一拍定为半秒的话,两拍就是一秒的长度。一旦这个基础的一拍定下来,那么比一拍长或短的符号就相对容易了。
       用一条横线“—”在四分音符的右面或下面来标注,以此来定义该音符的长短。下面列出了常用音符和它们的长度标记:

    • 演奏速度=68. 这个理解为1分钟弹奏68拍.

上面就是我们需要的音乐基本知识, 其实是很简单的。

MA中音的表示

MatheMatica中有个SoundNote函数, 可以表示和指定音高相同的一个音符。例如, 南山南中第一个音符6(下划线打不出来), 用MA表示为
SoundNote[9,60/68/2,"Guitar"]
这里, 需要解释的东西有点多了:

  • 第一个参数9, 表示距离距中央 C 9 个半音的音, 它恰好是6(这需要用到十二平均律, 见附录)
  • 第二个参数表示该音符的时值(单位是秒):加了一个下划线表示的是半拍, 而演奏速度为68拍每分钟, 故半拍占了60/68/2
  • 第三个参数表示的是演奏乐器, 我们设置为吉他; 其他常见乐器有"Piano", "Violin"

简谱的参数化

由上面的表示, 我们知道简谱中的一个音可以用两个参数表示出来. 由于4/4拍中有很多八分音符, 故我们将八分音符的时长定义为单位1(主要是减少书写). 这样, 参数化后的简谱为
Melody = {6, 6, 6, {4, 1/2}, {4, 1/2}, {6, 1/2}, {10, 3/2}, {9, 2}, {10, 2}, 9, 5, {8, 2}, {\[Infinity], 2}, {\[Infinity], 2}, {4, 1/2}, {4, 1/2}, 4, {3, 1/2}, {3, 1/2}, 2, {2, 1/2}, {2, 1/2}, 2, 5, 2, {3, 3}, {\[Infinity], 3}, {5, 1/2}, {5, 1/2}};
如前所述, 我们需要将音符映射为距离中央C的半音个数。这很简单, 首先定义七音阶所对应的半音
EqualTempList = {0, 2, 4, 5, 7, 9, 11, 12, 14, 16, 17, 19, 21, 23, 24};
这里, 0表示中央C, 也即中音1. 2表示中音2, 12 表示高音1(简谱里头上加点), 依次类推.

于是要得到中音6, 我们只需取EqualTempList的第6个元素即可。

演奏函数的标准化

尽管MA内置了标准的SoundNote演奏函数, 但是我们的数据并不标准, 例如Melody中有些是一个数字(八分音符), 有些是数列(其他时值)。我们用下面的函数来标准化

StandardT=60/68/2;
MelodyToSound[lis_] := Module[{m, mt},
  If[
   ListQ[lis],
   m = lis[[1]]; mt = lis[[2]],
   m = lis; mt = 1];
  
  If[m == \[Infinity],
   SoundNote[None, mt*StandardT],
   SoundNote[EqualTempList[[m]], mt*StandardT, "Guitar"]]
  ]

第一个If判断是否传入的参数为数列, 如果是, 则将第一个参数映射为音符, 第二个参数映射为对应的时值。 否则, 设置时值为1.

第二个If判断音符是否为\[Infinity], 如果是, 则该音表示空音(不发声), 这时用SoundNote[None, mt*StandardT]来表示时长为mt的空音。

完整的MA代码

Melody = {6, 6, 
   6, {4, 1/2}, {4, 1/2}, {6, 1/2}, {10, 3/2}, {9, 2}, {10, 2}, 9, 
   5, {8, 2}, {\[Infinity], 2}, {\[Infinity], 2}, {4, 1/2}, {4, 1/2}, 
   4, {3, 1/2}, {3, 1/2}, 2, {2, 1/2}, {2, 1/2}, 2, 5, 
   2, {3, 3}, {\[Infinity], 3}, {5, 1/2}, {5, 1/2}};
StandardT = 60/68/2;
MelodyToSound[lis_] := Module[{m, mt},
  If[ListQ[lis], m = lis[[1]]; mt = lis[[2]], m = lis; mt = 1;];
  If[m == \[Infinity],
   SoundNote[None, mt*StandardT],
   SoundNote[EqualTempList[[m]], mt*StandardT, "Guitar"]]
  ]
Sound[MelodyToSound[#] & /@ Melody]// EmitSound

完整的演示音频可以在SoundCloud试听。

附录:十二平均律

还记得在前面我说过数字上方或者下方加点来表示高八度/低八度的音吗?那么具体是怎么回事呢?
首先, 我们所说的音的高低其实是其频率决定的, 例如中音C的频率国际标准定义为440Hz, 即1秒钟震荡440次。我们用正弦波可以非常方便的表示出来:
Sound[Play[Sin[440*2Pi t],{t,0,1}]]
上面的代码表示播放440赫兹的正弦波1秒。

所谓的一个高八度的音就是频率是原来音2倍的那个音, 例如高八度的C, 简谱记为1头上加点, 的频率就是880Hz.

而所谓的十二平均律就是说把一个八度平均分成12分(等比地), 每一份就是一个半音。 于是我们很容易得到一个八度中, 12个半音的频率。 例如中音C与高音C这个八度, 其频率表为


八度频率

根据7音节的半音/全音(即两个半音)关系, 我们就得到, C调7音节对应的半音如下:

音符 半音阶个数 频率
1 0 440
2 2 494
3 4 554
4 5 587
5 7 659
6 9 740
7 11 831

由此, 不难推出EqualTempList.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容