一些音樂基礎(小白教程)

其實, 我自己也是小白, 所以只能寫個小白教程。

下面是我從網上搜到的南山南吉他譜:

南山南

我們只需要管歌詞上面的那一行簡譜。注意到:

    • 節拍是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音節對應的半音如下:

音符半音階個數頻率

由此, 不難推出EqualTempList.

參考原文:MA模擬吉他彈奏南山南


推薦閱讀:
相关文章