其實, 我自己也是小白, 所以只能寫個小白教程。
南山南
我們只需要管歌詞上面的那一行簡譜。注意到:
1 2 3 4 5 6 7
do re mi fa so la si
多 來 米 發 梭 拉 西
上面就是我們需要的音樂基本知識, 其實是很簡單的。
MatheMatica中有個SoundNote函數, 可以表示和指定音高相同的一個音符。例如, 南山南中第一個音符6(下劃線打不出來), 用MA表示為
SoundNote
6
SoundNote[9,60/68/2,"Guitar"]
9
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}};
EqualTempList = {0, 2, 4, 5, 7, 9, 11, 12, 14, 16, 17, 19, 21, 23, 24};
0
2
12
於是要得到中音6, 我們只需取EqualTempList的第6個元素即可。
EqualTempList
儘管MA內置了標準的SoundNote演奏函數, 但是我們的數據並不標準, 例如Melody中有些是一個數字(八分音符), 有些是數列(其他時值)。我們用下面的函數來標準化
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
第二個If判斷音符是否為[Infinity], 如果是, 則該音表示空音(不發聲), 這時用SoundNote[None, mt*StandardT]來表示時長為mt的空音。
[Infinity]
SoundNote[None, mt*StandardT]
mt
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}]]
所謂的一個高八度的音就是頻率是原來音2倍的那個音, 例如高八度的C, 簡譜記為1頭上加點, 的頻率就是880Hz.而所謂的十二平均律就是說把一個八度平均分成12分(等比地), 每一份就是一個半音。 於是我們很容易得到一個八度中, 12個半音的頻率。 例如中音C與高音C這個八度, 其頻率表為
所謂的一個高八度的音就是頻率是原來音2倍的那個音, 例如高八度的C, 簡譜記為1頭上加點, 的頻率就是880Hz.
八度頻率根據7音節的半音/全音(即兩個半音)關係, 我們就得到, C調7音節對應的半音如下:
八度頻率
音符半音階個數頻率
由此, 不難推出EqualTempList.
參考原文:MA模擬吉他彈奏南山南