音的性質(於電腦內)數據化的商榷(一)
本文刊載於武漢樂學院學報《黃鐘》1999-1、2期
音的性質(於電腦內)數據化的商榷(一)
── 音高、音調、音程、音長
這裡所指的"音的性質",是指人耳對音所生的客觀感受與反應而言。如:音之高低、音之長短、音之音色、音之強弱....等。
這些性質,在電腦資訊中,自然都是以數據(或說數位)的型態,來模擬、記錄、轉換的。Midi的本義,其實就是就是這種數據化的『標準』之一。
筆者因為立願從事古琴譜之電腦翻譯、抄製與出版,又須兼及一般樂譜與工尺譜的繕製,因此不得不自行設計轉譜程式,經近十年來的研思與改進,自然也自行發展出一套標準,相信與Midi雷同的可能性極少,願在此先對音高、音調、音長部份加以披露,以就教同好!
---導言---
有的系統把樂音資訊,當作一般文書資料來看待。如以”.5 ─ ─ “表示「三拍的高音So」之類。這種方式太過原始,不利於資料的再處理與轉化,又很浪費記憶體。
本身也無法適應音樂的要求。
我們心目中的樂音資訊是數據化的。他以數位的方式,存儲於電腦主記憶體及輔助記憶體內,當我們要運用他時,才透過程式內的公式來轉化、翻譯,並以我們所須要的各種型態出現。
現在所稱的Midi就類同於此種觀念。
---音高、音調部份---
我們設計音高在電腦數據中的表示法時,有幾個問題是要加以考量的:除須顧及音程之不規則性之外(如自然音階中,有些鄰音是全音,有些卻是半音,si-Do移調時就不能是Fa-So而應是#Fa-So之類),還須顧及不同音域,及(臨時及調性)#、b記號的表示法,及在運算及轉(調)換(算)之方便性問題。
第一種可想到的設計,是把Do定為0、Re定為2、Mi定為4、Fa定為5、So定為7、La定為9、Si定為11,之類。即半音間之數據差一,全音間之數據差二。但0(Do)與2(Re)之間的1,究應為#Do呢?還是bRe呢?在這個問題有答案之前,全音之數據兩倍於半音之數據的這種設計,意義就不大。因此我們不須考慮這種設計。
第二種設計,是參考簡譜,把Do定為1、Re定為2、Mi定為3、Fa定為4、So定為5、La定為6、Si定為7之類。即無論半音全音,數據均差一,不必管其鄰音音程之不同。至於#、b號,則採用每音另配屬一個記憶體作為旗號的辦法,遇有符號,則通知此旗號易幟,當然也就可以表示bb、b、%、#、X、及『無』,等六種臨時或調性符號了。這種辦法要用到兩個以上的位元組,(高低八度若再用一位元組,就須三個位元組以上)所用的位元組(Bytes),本身又未充分利用。因此音符越多,浪費就越大。且轉調、移調時如何簡便的變換#b號呢?這也是大問題之一!
幾經研思,我採取的第三種設計,則完全放棄音列式的級進表示法,而改採五度環的表示法,如下:
|
bb |
bb |
bb |
bb |
bb |
bb |
bb |
b |
b |
b |
b |
b |
b |
b |
|
|
|
|
|
|
|
# |
# |
# |
# |
# |
# |
# |
X |
X |
X |
X |
X |
X |
X |
音 高 |
Fa |
Do |
So |
Re |
La |
Mi |
Si |
Fa |
Do |
So |
Re |
La |
Mi |
Si |
Fa |
Do |
So |
Re |
La |
Mi |
Si |
Fa |
Do |
So |
Re |
La |
Mi |
Si |
Fa |
Do |
So |
Re |
La |
Mi |
Si |
數據代值 |
-15 |
-14 |
-13 |
-12 |
-11 |
-10 |
-9 |
-8 |
-7 |
-6 |
-5 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
這種設計,八度內的35個(包括各種異名同律位音)含升降符號音,每一音皆可有明確定義的數據代值。(──最大數據與最小數據,差34。)
我們若用-15到+19,這些整數數據代值來代表音高,則程式該如何轉換這些代值,為音樂上的音名呢?如何轉調呢?
可以透過我們所設計的,下面這三個公式:
公式甲:基本音名(無升降號)=〔(代值(有升降號) X 4)+1〕/7的餘數
譬如 La=6,即=〔(代值3X4)+1〕/7=13/7之餘數 6
如 Si=7,即=〔(代值5X4)+1〕/7=21/7之餘數 7
21/7之餘數本為0,可見餘數若小或等於0,必須加上7,方合我們的須
要,
由此bSo=5,即=〔(代值-6 X4)+1〕/7 =-23 /7之餘數=-2+7
bbRe=2,即=〔(代值-12 X4)+1〕/7 =-47 /7之餘數=-5+7
#So=5,即=〔(代值8 X4)+1〕/7 =33/7之餘數5
公式乙: 當 -15 <=代值<= -9 有一 『bb』符號
當 - 8 <=代值<= -2 有一 『 b』符號
當 - 1 <=代值<= 5 無 符號
當 6 <=代值<= 12 有一 『 #』符號
當 13 <=代值<= 19 有一 『 X』符號
公式丙: 移高五度調(多一升記號,或少一降記號的調)只要將代值全減一。
移低五度調(多一降記號,或少一升記號的調)只要將代值全加一。
移高二度調(多兩升記號,或少兩降記號的調)只要將代值全減二。
移低二度調(多兩降記號,或少兩升記號的調)只要將代值全加二。
移高六度調(多三升記號,或少三降記號的調)只要將代值全減三。
移低六度調(多三降記號,或少三升記號的調)只要將代值全加三。
:::::::::::::::::::::::::::::
依此類推,升降號可自動調整...........................。
移高五度調後,原音名必轉化為低五度了;移低五度調後,原音名必轉化為高五度了。
這是移高五度,要減一,移高二度要減二....;
這是移低五度,要加一,移低二度要加二....,剛好反相的原理。
這種五度環的對應表示法,有此三公式來處理之後,相對於一般的鄰音列對應法,應是簡捷又方便許多的。
不過這種表示法,代值是有正負值的,電腦處裡有正負之數值時,必須浪費一個位元來表示正負符號。我們為了節約位元,以便可只用一位元組,就能同時表示音名與音域,最好將代值再全改為正數。
我們預備只用5個位元來處理音高代值,(三個位元來處理音域)。則因2^5=32 < 35。因此我們必須放棄上述五度環的頭尾三音(bbFa、xMi與xSi─反正這三音本也就是絕少用到的!)則35-3=32,才能剛好可用五個位元來表達。1 Byte 有八位元,基本音名只用掉五個,如此省下的三位元(8-5=3),我們才可以用來表達(2^3=8)八個八度的音域(見後所述)。
總之這種作法的目的,是為了節約位元,使基本音名、#b符號、音域等三個有關音高與音調的音性,可以只用一個Byte的數位,就全得以表達清楚!對這個只有正數,不用負數的資料變數(記憶體)型態,我們則可以透過加上 Unsigned (以C語言為例)修飾詞的辦法,來通知電腦,取消正負號,如此就可以達到多一位元來運用之目的。
修正後的代值如下:
|
bb |
bb |
bb |
bb |
bb |
bb |
bb |
b |
b |
b |
b |
b |
b |
b |
|
|
|
|
|
|
|
# |
# |
# |
# |
# |
# |
# |
X |
X |
X |
X |
X |
X |
X |
音 高 |
Fa |
Do |
So |
Re |
La |
Mi |
Si |
Fa |
Do |
So |
Re |
La |
Mi |
Si |
Fa |
Do |
So |
Re |
La |
Mi |
Si |
Fa |
Do |
So |
Re |
La |
Mi |
Si |
Fa |
Do |
So |
Re |
La |
Mi |
Si |
數據代值 |
放棄 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
放棄 |
放棄 |
修正公式甲:基本音名(無升降符號)=〔(代值(有升降符號) X 4)+1〕/7的餘數。公式甲,基本上並無改變,只是少了餘數小於0時之處理。(餘數若等於0,就直接轉換為7)。更形簡單!由此公式可知:
代值為 0、 7、14、21、28除七之餘數為0者,基本音名為Do(1);
代值為 2、 9、16、23、30除七之餘數為2者,基本音名為 Re(2);
代值為 4、11、18、25 除七之餘數為4者,基本音名為 Mi(3);
代值為 6、13、20、27 除七之餘數為6者,基本音名為 Fa(4);
代值為1、 8、15、22、29 除七之餘數為1者,基本音名為 So(5);
代值為3、10、17、24、31 除七之餘數為3者,基本音名為 La(6);
代值為5、12、19、26 除七之餘數為5者,基本音名為 Si(7);
下面談到移調時,我們還會運用到此規則。
修正公式乙: 當 0 <=代值<= 5 有一 『bb』符號
當 6 <=代值<= 12 有一 『 b』符號
當 13 <=代值<= 19 無 符號
當 20 <=代值<= 26 有一 『 #』符號
當 27 <=代值<= 31 有一 『 X』符號
公式丙不變: 移為高五度調,只要將代值全減一。
移為低五度調,只要將代值全加一。
依此類推,升降號可自動調整
現在,八度內之七個基本音已可用一Byte 的數據代值來處理了,我們再來研討高低八度如何表示的問題?依自然數級進法,即:
Do定為1、Re定為2、....Si定為7、
. . .
Do定為8、Re定為9...Si定為14、
:
Do定為15....之類的辦法,
高一八度數據值就要+7,
低一八度就要-7。
若音域為八個八度,則最大數與最小數差56。
這種方法顯然不適於我們採用。我們因為已兼顧#b號的關係,一個八度內數據代值已差32,則高低八度不能只加減7,而最少要加減32。(前面我們已將八度內之異名同律位基本音,由35個縮減為32個)。
電腦記憶體的一Byte,有八個位元,我們既已將前五位元(2^5=32個數位)來表示八度內之32個異名同律位音,則剩下的三個位元,正可以表達(2^3=8)八個八度。用自然數來說,就是每升降八度要加減32。但對二進位的(後三)位元來說,則升降八度,只要加減1而已。下面是用用位元來表示之對應情形:
二進位 十進位
後三位元值 自然數
大字二組 = 000 00000 000 = 0 + 0 x 32 = 0
大字一組 = 001 00000 001 = 1 + 1 x 32 = 32
大字 組 = 010 00000 010 = 2 + 2 x 32 = 64
小字 組 = 011 00000 011 = 3 + 3 x 32 = 96
小字一組 = 100 00000 100 = 4 + 4 x 32 = 128
小字二組 = 101 00000 101 = 5 + 5 x 32 = 160
小字三組 = 110 00000 110 = 6 + 6 x 32 = 192
小字四組 = 111 00000 111 = 7 + 7 x 32 = 224
程式如何分別讀取一個位元組的後三位元,及前五位元,又分別轉換成音域及基本音名呢?辦法很多!我個人所採的辦法是:
1、讀取前五位元值時:用 000 11111 (即十進位之 31) 與代值 作 AND 之運算,
XXX XXXXX
AND 000 11111
-------------------------------------
000 XXXXX
可得到前五位元十進位值0 - 31(含升降號之代值)
(即相當於,取代值除以32之餘數)乘4後加1,再除以7,即為基本音名(無升降號)代值1-7。
2、讀取後三位元值時:用 111 00000 (即十進位之224) 與代值 作 AND 之運算,
XXX XXXXX
AND 111 00000
-------------------------------------
XXX 00000
可得到 後三位元十進位 0 - 224除以32 後即為音域代值 0 - 7 (即相當於,取代值除以32之商數)
------移調時對音域的影響部份------
以平移為高五度調為例,五度轉換後,有四音名(1234),必須轉化為低八度,如下:
#
. . . .
原 音 名 5 6 71 2 3 4
.
平移為高五度調後之音名 1 2 34 5 6 71
-------------------------------------------------------------------
以平移為高大二度調為例,二度轉換後,有一音名(1),必須轉化為低八度,如下:
# #.
原 音 名 2 3 45 6 7 1
.
平移為高二度調後之音名 1 2 34 5 6 71
-------------------------------------------------------------------
以平移為低五度調為例,五度轉換後,有四音名(4567),必須轉化為高八度,如下:
b
原 音 名 4 5 67 1 2 3
. . ..
.
平移為低五度調後之音名 1 2 34 5 6 71
----------------------------------------------------------------------
以平移為低大二度調為例,二度轉換後,有一音名(7),必須轉化為高八度,如下:
b b
原 音 名 7 1 23 4 5 6
. .
.
平移為低二度調後之音名 1 2 34 5 6 71
----------------------------------------------------------------------
歸納後,應如下所示:
CCCCCCCCCCCCCC CCCCCCCCCCCCCC
調調調調調調調調調調調調調調 調調調調調調調調調調調調調調
移移移移移移移移移移移移移移 移移移移移移移移移移移移移移
為為為為為為為為為為為為為為 為為為為為為為為為為為為為為
b b #b b b b b #b b b
CDDEEFFGGAABBC CDDEEFFGGAABBC
調調調調調調調調調調調調調調 調調調調調調調調調調調調調調
-------------- --------------
523416614325 523416614325
b#b#b#b#b#b# b#b#b#b#b#b#
記記記記記記記記記記記記 記記記記記記記記記記記記
號號號號號號號號號號號號 號號號號號號號號號號號號
-------------- --------------
應降低八度(代值減32)之音 應升高八度(代值加32)之音
-------------- --------------
Do Do Do Do Do Do Si Si Si Si Si Si
Re Re Re Re Re La La La La La
Mi Mi Mi Mi So So So So
Fa Fa Fa Fa Fa 4
So So Mi Mi
La Re
-------------- --------------
代 值 除 七 之 餘 數 為 代 值 除 七 之 餘 數 為
-------------- --------------
0 0 0 0 0 0
1 1 1 1 1 1
2 2 2 2 2 2
3 3 3 3 3 3
4 4 4 4 4 4
5 5 5 5 5 5
6 6 6 6 6 6
-------------- --------------
由上表可知:
C調移為bD調(5b記號)時,應先將原Si、La、So、Fa、Mi、Re六音升高八度,再轉換。
換句話說,必須通知電腦(程式)原代值除七之餘數,為1、2、3、4、5、6者,除要加減平移之代值(此處為減五──因兩調差五降記號)之外,還要將代值再加32 。
C調移為 B調(5#記號)時,應先將原La、So、Fa、Mi、Re、Do六音降低八度,再轉換。
換句話說,必須通知電腦(程式)原代值除七之餘數,為6、0、1、2、3、4者,除要加減平移之代值(此處為加五──因兩調差五升記號)之外,還要將代值再減32 。
餘類推。
以後我們會談到,翻譯古琴譜時,會計算各空絃之音高(程)代值+徽位之音高(程) 代值(+泛音之音高(程)代值)。通常會超過好幾個八度,我們其實可以用更簡便的方法來應付此種音名轉換時,對音域的影響。
以Do(1)為例,其五度為So(5),在同一八度內。代值只要加1,無須再加音域值(3 2);
. .
以So(5)為例,其五度為Re(2),在高一八度上。代值就要加1後,再加音域值(32) 。
公式丁:
也就是說:無論升高幾度(八度內)後,基本音名也變大的(如5>1),可知就在同一八度內,無須加32;無論升高幾度(八度內)後,基本音名反變小的(如2>5),可知必在高一八度上,須再加32。
反之:無論降低幾度(八度內)後,基本音名也變小的(如1<5),可知就在同一八度內,無須減32;無論降高幾度(八度內)後,基本音名反變大的(如5>2),可知必在低一八度下,須再減32。
而基本音名之值,則可用修正公式甲:
基本音名(無升降符號)=〔(代值(有升降符號) X 4)+1〕/7的餘數, (餘數若等於0,就直接轉換為7)先行計算出後,再作比較及處理。
---音程、和絃部份---
電腦製譜的第一步,面臨的就是音符輸入問題。基本旋律的輸入,無疑是無論如何,都難以省略減免的。但和絃部份既有樂理規則可尋,則和絃之實音我們就希望能不必一一輸入, 而期盼能改採只用和絃記號通知電腦(程式),就能自行完成輸入的方式。如此才更能充分 發揮電腦的人工智慧,減免不必要的枯燥工作。
早期鋼琴譜,及現行的吉它譜,就是採用只記和絃名稱,不必記出和絃實音之制度的!
音程與和絃如何設計呢?
上述五度環上具升降符號音(由0至31)之代值,因為是一種一對一的嚴格對應函數,洽是一組值得採用的數據。
譬如純五度音程,其代值差必為一。反之代值差為一者,又必為純五度音程。
再如大二度音程,其代值差必為二。反之代值差為二者,又必為大二度音程。
再如小二度(自然半音)音程,其代值差必為五。反之代值差為五者,又必為小二度音程。
而增一度(變化半音)音程,其代值差必為七。反之代值差為七者,又必為增一度音程。
我們可由此觀察出原位大三和絃(如Do/Mi/So)之代值(此例為14/18/15),中音與低音之代值差(A值)為四,高音與低音之代值差(B值)為一。現在我們就可以(四/一)來代稱大三和絃之原位了。此值我把它叫作和絃的『AB值』。其中A值是中音與低音的代值差;B值是高音與低音的代值差。合稱『AB值』。
我們可以進一步發現,只要三音之組合,其『AB值』為(四/一)的,都是大三和絃原位。只要是原位大三和絃其『AB值』又必是(四/一)。
同理我們可求出各基本三和弦之『AB值』,如下:
大三和絃原位之 『AB值』:( 四/ 一)如 (Do/Mi/ So)之(14/18/15)
小三和絃原位之 『AB值』:(負三/ 一)如 (Mi/So/ Si)之(18/15/19)
增三和絃原位之 『AB值』:( 四/ 八) 如 (So/Si/#Re)之(15/19/23)
減三和絃原位之 『AB值』:(負三/負六)如 (Si/Re/ Fa)之(19/16/13)
大三和絃第一轉位之『AB值』:(負三/負四)如 (Mi/ So/Do)之(18/15/14)
小三和絃第一轉位之『AB值』:( 四/ 三)如 (So/ Si/Mi)之(15/19/18)
增三和絃第一轉位之『AB值』:( 四/負四) 如 (Si/#Re/So)之(19/23/15)
減三和絃第一轉位之『AB值』:(負三/ 三)如 (Re/ Fa/Si)之(16/13/19)
大三和絃第二轉位之『AB值』:(負一/ 三)如 ( So/Do/Mi)之(15/14/18)
小三和絃第二轉位之『AB值』:(負一/負四)如 ( Si/Mi/So)之(19/18/15)
增三和絃第二轉位之『AB值』:(負八/負四) 如 (#Re/So/Si)之(23/15/19)
減三和絃第二轉位之『AB值』:( 六/ 三)如 ( Fa/Si/Re)之(13/19/16)
原位、第一轉位、第二轉位之『AB值』應有下列關系,可供我們核對:
設原位之A值為X,B值為Y,則第一轉位之A值為Y-X;B值為 -X;
設原位之A值為X,B值為Y,則第二轉位之A值為 -Y;B值為X-Y。
有了上面這份對照表,我們就可以在已輸入低音後,用再通知電腦(程式),各三和絃之中音與高音,和低音之代值差(音程)各是多少的辦法,讓電腦自行輸入完整的和絃。
至此我們還不滿足,我們還希望再建立起其它的常用和絃,尤其是七和絃的 『AB值』對照表,因為七和絃的輸入工作比三和絃更繁複、枯燥而易錯。更須要發揮電腦的人工智慧。
下面是我們整理出來的,已可供電腦運用的,其它各常用(七)和弦之『AB值』對照表:
降上主音增六和弦之『AB值』:( 四/ 十) 如 (bRe/ Fa/ Si)之( 9/13/19)
拿波列頓六和絃之『AB值』:(負三/負四) 如 ( Fa/bLa/bRe)之(13/10/ 9)
屬音變體(小)三和絃之『AB值』:(負三/ 一) 如 ( So/bSi/ Re)之(15/12/16)
降下中音增六和弦之『AB值』:( 四/ 十) 如 (bLa/ Do/#Fa)之(10/14/20)
降導音變體(小)三和絃之『AB值』:(負三/ 一) 如 (bSi/bRe/ Fa)之(12/ 9/13)
主音變體七和弦之『AB值』:( 四/ 一/負二) 如 ( Do/ Mi/ So/bSi)之(14 /18/15/12)
降上主音四音增六和弦之『AB值』:( 四/ 一/ 十) 如 (bRe/ Fa/bLa/ Si)之( 9 /13/10/19)
降上主音四音增六和弦之『AB值』:( 四/ 六/ 十) 如 (bRe/ Fa/ So/ Si)之( 9 /13/15/19)
上主音變體七和弦之『AB值』:( 四/ 一/負二) 如 ( Re/#Fa/ La/ Do)之(16 /20/17/14)
上主音減三小七和弦之『AB值』:(負三/負六/負二) 如 ( Re/ Fa/bLa/ Do)之(16 /13/10/14)
下屬音大三和弦加小七之『AB值』:( 四/ 一/負二) 如 ( Fa/ La/ Do/ Mi)之(13 /17/14/11)
下屬(大)七和絃之『AB值』:( 四/ 一/ 五) 如 ( Fa/ La/ Do/ Mi)之(13 /17/14/18)
屬七和絃之『AB值』:( 四/ 一/負二) 如 ( So/ Si/ Re/ Fa)之(15 /19/16/13)
屬音減五小七變體和弦之『AB值』:(負三/負六/負二) 如 ( So/bSi/bRe/ Fa)之(15 /12/ 9/13)
降下中音四音增六和弦之『AB值』:( 四/ 一/ 十) 如 (bLa/ Do/bMi/#Fa)之(10 /14/11/20)
降下中音增六和弦之『AB值』:( 四/ 六/ 十) 如 (bLa/ Do/ Re/#Fa)之(10 /14/16/20)
小七和絃之『AB值』:(負三/ 一/負二) 如 ( La/ Do/ Mi/ So)之(17 /14/18/15)
下中音減三小七和弦之『AB值』:(負三/負六/負二) 如 ( La/ Do/bMi/ So)之(17 /14/11/15)
降導音大三小七和絃之『AB值』:( 四/ 一/ 五) 如 (bSi/ Re/ Fa/ La)之(12 /16/13/17)
導音七和弦之『AB值』:(負三/負六/負二) 如 ( Si/ Re/ Fa/ La)之(19 /16/13/17)
導音變體七和弦之『AB值』:( 四/ 一/負二) 如 ( Si/#Re/#Fa/ La)之(19 /23/20/17)
---音長部份---
音長的數據設計,牽涉到附點與雙附點,附點音符拍長要加一半,雙附點要再加四分之一,這正是一種二進位的體系。不但如此,其它音符的原始設計,以電腦的觀點來看,其實也都是二進位式的,譬如:
全音符之拍長,等於二分音符的兩倍;
二分音符之拍長,等於四分音符的兩倍;
四分音符之拍長,等於八分音符的兩倍;
八分音符之拍長,等於16分音符的兩倍;
16分音符之拍長,等於32分音符的兩倍;
32分音符之拍長,等於64分音符的兩倍。
所以音長代值正適用於,採二進位之位元,來對應處理,是我們很容意想到的,以下是其對應表:
數據代值 對應位元圖 音符種類 拍 長
-------- ---------- -------- ------
128 1000 0000 全音符 四 拍
64 0100 0000 二分音符 二 拍
32 0010 0000 四分音符 一 拍
16 0001 0000 八分音符 1/2 拍
8 0000 1000 16分音符 1/4 拍
4 0000 0100 32分音符 1/8 拍
2 0000 0010 64分音符 1/16拍
1 0000 0001 128分音符 1/32拍
192 1100 0000 附點 全音符 六 拍
96 0110 0000 附點二分音符 三 拍
48 0011 0000 附點四分音符 3/2 拍
24 0001 1000 附點八分音符 3/4 拍
12 0000 1100 附點16分音符 3/8 拍
6 0000 0110 附點32分音符 3/16拍
3 0000 0011 附點64分音符 3/32拍
224 1110 0000 雙附點 全音符 七 拍
112 0111 0000 雙附點二分音符 7/2 拍
56 0011 1000 雙附點四分音符 7/4 拍
28 0001 1100 雙附點八分音符 7/8 拍
14 0000 1110 雙附點16分音符 7/16拍
7 0000 0111 雙附點32分音符 7/32拍
以自然數排序後,整理如下:
224 1110 0000 雙附點 全音符 七 拍
192 1100 0000 附點 全音符 六 拍
128 1000 0000 全音符 四 拍
112 0111 0000 雙附點二分音符 7/2 拍
96 0110 0000 附點二分音符 三 拍
64 0100 0000 二分音符 二 拍
56 0011 1000 雙附點四分音符 7/4 拍
48 0011 0000 附點四分音符 3/2 拍
32 0010 0000 四分音符 一 拍
28 0001 1100 雙附點八分音符 7/8 拍
24 0001 1000 附點八分音符 3/4 拍
16 0001 0000 八分音符 1/2 拍
14 0000 1110 雙附點16分音符 7/16拍
12 0000 1100 附點16分音符 3/8 拍
8 0000 1000 16分音符 1/4 拍
7 0000 0111 雙附點32分音符 7/32拍
6 0000 0110 附點32分音符 3/16拍
4 0000 0100 32分音符 1/8 拍
3 0000 0011 附點64分音符 3/32拍
2 0000 0010 64分音符 1/16拍
1 0000 0001 128分音符 1/32拍
由上表可知,音長代值之範圍,係由1至224,若只用位元組中之七個位元來表示,則因 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0 =127 ,所以是不夠的。仍必須採用,放棄 第八位元表示正負數(拍長並無負數!)的作法,用 Unsigned 修飾詞,以增加一位元,用全 一Byte中八位元的方式,來處理拍長代值。
公式戊:拍長與代值之間的關係規則是:代值 = (拍長 X 32) 。
也就是說我們存在電腦中的拍長代值是實際拍長的32倍。我們若直接用拍長值存入電腦,則1/32=0.03152,並非整數,而電腦處理非整數較慢,記憶體也會造成浪費。這是我們以拍長值之32倍,為拍長數據代值,作數位存取的原因。
這種專用後三位元來代表音域,前五位元代表音名,另以一Byte代表音長的辦法,均參考了電腦記憶體以位元為處理單位的二進位特性。我們知道電腦對位元式的運算,快於對自然數的運算。資料較龐大時,如何節約記憶體,也是音樂電腦數據化的重要考量點,這是我們不怕麻煩,屢用公式轉換代值,以便參用位元特性,來設計音性數據值的主要兩個原因。
當我們要把拍長全乘以二(或除以二)時,只要將代表拍長的位元組,其中之資料左移 (或右移)一次。當我們要將音域提高八度(或降低八度),只要將代表音高的位元組,後三位元之資料加一(或減一)一次。當我們要平移高五度(或低五度)時,只要將代表音高的位元組 ,前五位元之資料減一(或加一)一次,依此類推。
以十進位數來說,就是:
1:拍長代值,由1-224。拍子延長一倍,代值乘以2;拍子縮小一倍,代值除以2。
2:音名代值,由0-31 。音名升高五度,代值加以1;音名降低五度,代值減以1。
音名升高二度,代值加以2;音名降低五度,代值減以2。
餘類退推。
3:音域代值,由0-7,音域提高八度,代值加以32;音域降低八度,代值減以32。
無論升高幾度,基本音名反變低者,必已進入高八度,代值須再加以32;
無論降低幾度,基本音名反變高者,必已進入低八度,代值須再減以32。
.
音的性質(於電腦內)數據化的商榷(二) ─古琴譜音高之翻譯部份
內容提要:
文本介紹用電腦程式,翻譯古琴譜之基本原理。琴譜中與音高翻譯有關之訊息是調序、絃序、徽位、使用泛音與否。本文介紹一公式,可由此四參數,計算出音高。最後描述此程式的操作方法與流程。
關 鍵 詞:電腦音樂 古琴譜翻譯
空絃之音高計算公式
用電腦翻譯古琴譜之音高時,要計算(各調各)空絃之音高、徽位之音高、泛音之音高。
其中以空絃之音高計算公式最為複雜。所幸我們終於找到了幾個公式。
古琴有『琴譜五調』之說,因為以古琴(最低)的第一絃來看,只有為宮、為商、為角 、為徵、為羽五種調子。故也有只稱為宮調、商調、角調、徵調、羽調等五調的。
若以含固定音高觀念的律調名來看,『琴譜五調』究屬何調?則因琴派的不同,(有的以黃鐘調為徵調、有的以仲呂調為徵調),就有多種系統。
但我們分析起來,古琴的基本轉調法只有兩種:
(一)、以慢宮為角法,轉高五度調;
(二)、以緊角為宮法,轉低五度調。
若以F調為基本調,則︰
以慢宮為角法,可轉出 C、G、D、A四調;
以緊角為宮法,可轉出bB、bE、bA、bD四調;
各家之『琴譜五調』必包括在此九調之內。各調之調序編號,及各絃各調之音名如校︰
各琴調空絃音位對應表:
基
緊角法四調 本 慢宮法四調
┌──────┐ 調 ┌──────┐
調 序 0 1 2 3 4 5 6 7 8
調 高 bD bA bE bB F C G D A
調 式 宮 角 羽 商 徵 宮 角 羽 商
調 調 雕 調 調 調 調 調 調
----------------------------------------------------------------------------------
第一絃(C絃) 1 3 6 2 5 1 3 6 2
第二絃(D絃) 2 5 1 3 6 2 5 1 3
第三絃(F絃) 3 6 2 5 1 3 6 2 5
第四絃(G絃) 5 1 3 6 2 5 1 3 6
第五絃(A絃) 6 2 5 1 3 6 2 5 1
第六絃(C絃) 1 3 6 2 5 1 3 6 2
第七絃(D絃) 2 5 1 3 6 2 5 1 3
我們現僅以第一絃各調之唱名,與調序之關係來看,可知有如下之關係:
調 序 0 1 2 3 4 5 6 7 8
--------------------------------------------------------------------------------
第一絃(C絃)唱名1 3 6 2 5 1 3 6 2
唱名代碼 14 18 17 16 15 14 18 17 16
故第一絃之唱名代碼必=(10-調序)%5的餘數+14
以第二絃各調之音名,與調序之關係來看,可知有如下之關係:
調 序 0 1 2 3 4 5 6 7 8
-------------------------------------------------------------------------------
第二絃(C絃) 2 5 1 3 6 2 5 1 3
唱名代碼 16 15 14 18 17 16 15 14 18
故第二絃之唱名代碼必=(12-調序)%5的餘數+14
同理第三絃之唱名代碼必=(14-調序)%5的餘數+14
同理第四絃之唱名代碼必=(16-調序)%5的餘數+14
同理第五絃之唱名代碼必=(18-調序)%5的餘數+14
同理第六絃 同第一絃唱名代碼高八度。 42-
同理第七絃 同第二絃唱名代碼高八度。 44-
此五公式形式全同,只有第一個被減數不同,被減數與絃序之關係如下:
絃 序 一 二 三 四 五
------------------------------------------------ (第六、七絃?)
被減數 10 12 14 16 18
可見被減數 = 8 + 2 x ( 絃序 )
= 2 x ( 4 + 絃序 )
因此,此五公式實可合併為一公式,如下:
唱名代碼 ={〔2 x ( 4 + 絃序 )〕- 調序 }% 5 的餘數 + 14
若以X表示唱名代碼、D表示調序、S表示絃序,此公式為︰
公式己 : X =[(( 2 x ( 4 + S )) - D ) % 5 ] + 14
以第五絃(A絃、絃序為5)為例,A調時(調序為8)其空絃音名代碼,經計算為
唱名代碼 ={〔2 X ( 4 + 5 )〕- 8 }% 5 的餘數 + 14
={〔2 X 9〕- 8 }% 5 的餘數 + 14
={18 - 8 }% 5 的餘數 + 14
={10 }% 5 的餘數 + 14
= 0 + 14
= 14 (為宮,即Do的代碼) 洽合於上述之各琴調空絃音位對應表。
再以第二絃(D絃、絃序為2)為例,D調時(調序為7)其空絃音名代碼,經計算為
唱名代碼 ={〔2 X ( 4 + 2 )〕- 7 }% 5 的餘數 + 14
={〔2 X 6 〕- 7 }% 5 的餘數 + 14
={ 12 - 7 }% 5 的餘數 + 14
= 5 % 5 的餘數 + 14
= 0 + 14
= 14 (仍為宮,即Do的代碼) 亦洽合於上述之各琴調空絃音位對應表。
基本音名之值,與唱名代碼之關係,即修正公式甲:
基本音名=〔(唱名代碼X4)+1〕%7的餘數,(餘數若等於0,就直接轉換為7)。
公式庚:各調各絃之基本音名=[(唱名代碼 X 4 ) + 1 ] % 7 的餘數,
={{[ 2X (4+絃序) - 調序 ] % 5 的餘數 + 14 } X 4 + 1 }% 7 的餘數, (餘數若等於0,就直接轉換為7)。
以上就是可以被電腦運算的,計算古琴空絃音高,與調序、絃序間關係的通用公式。 (高八度絃,還要參考公式丁加以32!)
完整的各調、各絃之音名代碼,應如下所示:
調 序 0 1 2 3 4 5 6 7 8
調 高 bD bA bE bB F C G D A
調 式 宮 角 羽 商 徵 宮 角 羽 商
調 調 調 調 調 調 調 調 調
--------------------------------------------------------------------------------
第 1絃(C絃)代碼 0 4 3 2 1 0 4 3 2
第 2絃(D絃)代碼 2 1 32 4 3 2 1 32 4
第 3絃(F絃)代碼 4 3 34 1 32 4 3 34 1
第 4絃(G絃)代碼 1 32 36 3 34 1 32 36 3
第 5絃(A絃)代碼 3 34 33 32 36 3 34 33 32
第 6絃(C絃)代碼 32 36 35 34 33 32 36 35 34
第 7絃(D絃)代碼 34 33 64 36 35 34 33 64 36
以上,是以Do為0之代碼,以bbDo為0時,Do之代碼則為14,上表須修正為
調 序 0 1 2 3 4 5 6 7 8
調 高 bD bA bE bB F C G D A
調 式 宮 角 羽 商 徵 宮 角 羽 商
調 調 調 調 調 調 調 調 調
---------------------------------------------------------------------------------------
第 1絃(C絃)代碼 14 18 17 16 15 14 18 17 16
第 2絃(D絃)代碼 16 15 46 18 17 16 15 46 18
第 3絃(F絃)代碼 18 17 48 15 46 18 17 48 15
第 4絃(G絃)代碼 15 46 50 17 48 15 46 50 17
第 5絃(A絃)代碼 17 48 47 46 50 17 48 47 46
第 6絃(C絃)代碼 46 50 49 48 47 46 50 49 48
第 7絃(D絃)代碼 48 47 48 50 49 48 47 78 50
由琴譜來辨調,實務上有其複雜性。姑暫不論各琴譜,其自身律說、調說、轉調法、多有錯誤,且不能自圓其說。只以大要而論,彼此間最少就有六種體系:有一調高可有多調主者;有調主與調高成固定結合者(有一絃為宮,叫宮調者;也有三絃為宮,叫宮調者);有以三絃為黃鐘正調者,又有以一絃為黃鐘正調者。
如<梅庵琴譜>似是有調高又有調主的了,但又曰:"僅言音(調主)而不言調(調高)者,可推求而知之─僅言宮,可知其為黃鐘調(三絃為宮)..."。可知它實是調主與調高成固定結合的體系,並以三絃黃鐘.宮為正調,且三絃為宮叫宮調。
而<研易習琴齋琴譜>載:"中呂均,以三絃為宮,故名正調"。而正調本身又有宮音、商音、角音、徵音、羽音等曲目,可知它是一調高可有多調主,調高與調主並不成固定結合的體系,且以三絃仲呂.宮為正調。與<梅庵琴譜>完全不同。
許多琴譜之琴曲,只言『商音』、『商意』....,而未附說明。則不能得知其所屬體系 ,究是本調之商音,還是低五度調(或高大三度調)之商音,而商(調主)又是否為第一絃或第三絃?
這時,我們可能須要將同一琴譜作多種嘗試,以便觀查出其所屬體系。
調序改變時,音代值可以很方便的轉換,這是我們用電腦譯譜的目的之一,也是我們採用音代值的原因之一。
透過術以上公式,就可以作到了!
我們理想中的作法,是將左手指法代碼、右手指法代碼、絃位代碼、徽位代碼等琴譜的原始資料輸入、存入電腦,只有在輸出時,才透過調序的設定,輸出全部或部分的音名及譜字,以節約記憶體及時間。故須要探討音高與調序、絃位、徽位、泛音之關係公式。
古琴的譜字之上半段由左手符號(指法、徽位)組成,下半段由右手符號(指法、絃位)組成。則不但要與左手指法代碼、右手指法代碼產生關聯,還要考慮上下半段各由兩個造型組而成之邏輯性設計。
徽位之音高計算公式
下面,我們將研討古琴各音位(徽位)之音高表示法:
古琴雖只有十三個徽位,實際音位則遠超過於此,理論上最多應可有37個,其音名與所應增加之音名代值如下:
序號 |
4 |
11 |
6 |
1 |
8 |
3 |
10 |
5 |
0 |
7 |
2 |
9 |
16 |
23 |
18 |
13 |
20 |
15 |
22 |
17 |
12 |
19 |
14 |
21 |
28 |
35 |
30 |
25 |
32 |
27 |
34 |
29 |
24 |
31 |
26 |
33 |
35 |
|
音 程 |
|
|
|
|
|
|
|
|
|
|
|
|
高 |
高 |
高 |
高 |
高 |
高 |
高 |
高 |
高 |
高 |
高 |
高 |
倍 高 |
倍 高 |
倍 高 |
倍 高 |
倍 高 |
倍 高 |
倍 高 |
倍 高 |
倍 高 |
倍 高 |
倍 高 |
倍 高 |
倍倍 高 |
|
純 一 度 |
增 一 度 |
大 二 度 |
小 三 度 |
大 三 度 |
純 四 度 |
增 四 度 |
純 五 度 |
小 六 度 |
大 六 度 |
小 七 度 |
大 七 度 |
純 八 度 |
增 一 度 |
大 二 度 |
小 三 度 |
大 三 度 |
純 四 度 |
增 四 度 |
純 五 度 |
小 六 度 |
大 六 度 |
小 七 度 |
大 七 度 |
純 八 度 |
增 一 度 |
大 二 度 |
小 三 度 |
大 三 度 |
純 四 度 |
增 四 度 |
純 五 度 |
小 六 度 |
大 六 度 |
小 七 度 |
大 七 度 |
純 八 度 |
||
徽 位 |
空 絃 |
|
十 三 徽 一 分 |
十 二 徽 |
十 徽 八 分 |
十 徽 |
九 徽 五 分 |
九 徽 |
八 徽 半 |
七 徽 九 分 |
七 徽 六 分 |
七 徽 三 分 |
七 徽 |
六 徽 八 分 |
六 徽 半 |
六 徽 二 分 |
五 徽 九 分 |
五 徽 六 分 |
五 徽 三 分 |
五 徽 |
四 徽 八 分 |
四 徽 六 分 |
四 徽 四 分 |
四 徽 二 分 |
四 徽 |
三 徽 八 分 |
三 徽 半 |
三 徽 二 分 |
二 徽 九 分 |
二 徽 六 分 |
二 徽 三 分 |
二 徽 |
一 徽 八 分 |
一 徽 六 分 |
一 徽 四 分 |
一 徽 二 分 |
一 徽 |
|
應增 代值 |
0 |
7 |
2卜 |
-3 |
4 |
-1 |
6 |
1 |
-4 |
3 |
-2 |
5 |
32 |
39 |
34 |
29 |
36 |
31 |
38 |
33 |
28 |
35 |
30 |
37 |
64 |
71 |
66 |
61 |
68 |
63 |
70 |
65 |
60 |
67 |
62 |
69 |
96 |
|
以所加代值大小排序,則如下所示:
序號 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
音 程 |
|
|
|
|
|
|
|
|
|
|
|
|
高 |
高 |
高 |
高 |
高 |
高 |
高 |
高 |
高 |
高 |
高 |
高 |
倍 高 |
倍 高 |
倍 高 |
倍 高 |
倍 高 |
倍 高 |
倍 高 |
倍 高 |
倍 高 |
倍 高 |
倍 高 |
倍 高 |
倍倍 高 |
小 六 度 |
小 三 度 |
小 七 度 |
純 四 度 |
純 一 度 |
純 五 度 |
大 二 度 |
大 六 度 |
大 三 度 |
大 七 度 |
增 四 度 |
增 一 度 |
小 六 度 |
小 三 度 |
小 七 度 |
純 四 度 |
純 八 度 |
純 五 度 |
大 二 度 |
大 六 度 |
大 三 度 |
大 七 度 |
增 四 度 |
增 一 度 |
小 六 度 |
小 三 度 |
小 七 度 |
純 四 度 |
純 八 度 |
純 五 度 |
大 二 度 |
大 六 度 |
大 三 度 |
大 七 度 |
增 四 度 |
憎 一 度 |
純 八 度 | |
徽 位 |
八 徽 半 |
十 二 徽 |
七 徽 六 分 |
十 徽 |
空 絃 |
九 徽 |
十 三 徽 一 分 |
七 徽 九 分 |
十 徽 八 分 |
七 徽 三 分 |
九 徽 五 分 |
|
四 徽 八 分 |
六 徽 二 分 |
四 徽 四 分 |
五 徽 六 分 |
七 徽 |
五 徽 |
六 徽 半 |
四 徽 六 分 |
五 徽 九 分 |
四 徽 二 分 |
五 徽 三 分 |
六 徽 八 分 |
一 徽 八 分 |
三 徽 二 分 |
一 徽 四 分 |
二 徽 六 分 |
四 徽 |
二 徽 |
三 徽 半 |
一 徽 六 分 |
二 徽 九 分 |
一 徽 二 分 |
二 徽 三 分 |
三 徽 八 分 |
一 徽 |
應增 代值 |
-4 |
-3 |
-2 |
-1 |
0 |
1 |
2卜 |
3 |
4 |
5 |
6 |
7 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
96 |
由上表可知,若x是徽位的序號,y是各徽位應加之代值,則
公式辛:y=( H - 4 ) + ( 20 * (H % 12) )
,但要注意,是否超過八度?須參考前述公式丁---移調時對音域的影響部份--先用音名之比較法,若超過八度,須再加以32。(古琴之唱名連七自然音及含#、b號各五個的變化半音在內,共只有17個,可更進一步簡化為16個)。
泛音之音高計算公式
理論上,古琴之十三個徽位上,皆可用左手之浮按法彈得泛音。其徽位若在空絃之x等分處,則音高為空絃之x倍,對照表如下:
徽名 |
13 |
12 |
11 |
十 |
九 |
八 |
七 |
六 |
五 |
四 |
三 |
二 |
一 |
絃 位 |
7 |
5 |
4 |
3 |
2 |
3 |
1 |
2 |
1 |
1 |
1 |
1 |
1 |
8 |
6 |
5 |
4 |
3 |
5 |
2 |
5 |
3 |
4 |
5 |
6 |
8 | |
實 音 |
|
小 三 |
大 三 |
純 四 |
純 五 |
大 六 |
倍 純 八 |
倍大 三 |
倍純 五 |
倍倍純 八 |
倍倍大 三 |
倍倍純 五 |
倍倍倍純 八 |
代值 |
|
-3 |
4 |
-1 |
1 |
3 |
32 |
36 |
33 |
64 |
68 |
65 |
96 |
泛音 |
|
|
|
|
|
|
|
|
|
|
|
|
|
代值 |
96 |
65 |
68 |
64 |
33 |
68 |
32 |
68 |
33 |
64 |
68 |
65 |
96 |
代值差 |
□ |
68 |
64 |
65 |
32 |
65 |
0 |
32 |
0 |
0 |
0 |
0 |
0 |
可知泛音奏法,只有六個徽位與實音所得音不同,採用泛音奏法時,只要在下列六徽位上,加以調整即可:(公式壬)
1、第六徽、第九徽,應再加以32。
2、第十一徽,應再加以64。
3、第八徽、第十徽,應再加以65。
4、第十二徽,應再加以68。
5、第十三徽,應為96(按音演奏時,無洽當十三徽之音位)。
6、須參考前述---移調時對音域的影響部份--之公式丁,遇有超過八度者,仍須再加32。
完整的古琴音高翻譯公式
我們心目中理想的古琴翻譯公式,應為由調序、絃序、徽位三者為參數,計算出音程代值,再用由此三註標構成之三維陣列,通知電腦,其基本公式癸,由公式戊及公式辛合成,如下:(還要參考公式丁、公式壬)
其中D為調序(0->8)、S為絃序(1->7)、H為徽序(1->36)。
F[D][S][H] =[(( 2 x ( 4 + S ))- D ) % 5 + 14 ] + [(H - 4 ) + ( 20 * ( H % 12 ) )]
這個公式,用人工來算,當然是很不方便的,但高速計算正是計算機的基本功能,我們用微電腦翻譯琴譜,必須利用此長處,若只以一一預先列舉計算結果的方式,來設計此種琴譜翻譯程式,則不但佔用大量不必浪費的記憶體,設計起來也冗長而無趣!
-
关于
的论文
-
没有相关论文