1. はじめに

1
2007 年 8 月 7 日

グリッサンド音の作成について
新潟工科大学 情報電子工学科 竹野茂治

はじめに

1

音は、コンピュータ上ではデジタルデータとして保存されていて、そのルールはかなりシンプルなものなので、単純な音のデータなら容易に作成することができる。
ここでは、その音のデータ形式の概念を簡単に述べ、その上で「グリッサンド音」を作成するにはどうしたらいいかを、数学的に考察してみることにする。

音のデジタルデータ

2

音には、音階、音量、音色などの色々な要素がある。また、音は複数の音が重なっている場合でも、我々はそれを複数の音の重なりであると認識できる。
同じく波動現象である光にも、色の種類、色の明るさ、色の鮮やかさなどの要素があるが、色は複数の色が重なると、我々はそれを複数の色とは認識せずに、それを合成した一つの色としか認識できない。これは光と音の認識の違いの特徴的なところで、音の方はそれにより和音や合奏、そして複数の楽器編成による音楽というものが成立することになっている。
一方、音楽を記録する場合、大編成のオーケストラのスコア (総譜) のようにこの楽器はこの音、この楽器はこの音、のように記録する方式1 では、楽器編成によりデータ量が変わり、また、同じ曲でも演奏者毎の微妙な演奏の違いを再現することは難しい。
よって、レコードや CD も含め通常の記録方式は、実際の音の波動の物理的な表現である空気中の波の振幅を時系列毎に保存する、という方法を取っている。これは、スコアを記録する方式に比べてデータ量ははるかに大きくなる。
コンピュータで使用されるデジタル音声データ (WAV, AU, AIFF などの形式) の場合もこの後者の方式で、物理的な振幅を電気信号の振幅に置き換え、それを時間と振幅1

MIDI はこのような記録方式を取っている。

2. 音のデジタルデータ

2に関してデジタル化 (標本化と量子化) をしたものであり、数千、あるいは数万分の 1秒毎に、その音の波動の振幅を整数値 (8bit あるいは 16bit の整数) として順に保存している。
逆に言えば、sin x などの単純な振動関数を用いてこのような振動のデータを作り出せば、比較的容易にデジタル音声データを自作することができる。
例えば、

y = f1 (t) = A sin 2πht (0 ≤ t ≤ T )(1)という関数 (A, h は正の定数) は、周期が 1/h、すなわち周波数 (= 1 秒間の振動数)が h であるような周期関数なので、これは周波数が h Hz である音波振動に対応する。
これを、1/44100 秒毎に、-32767∼32767 の範囲の整数値として出力すれば、いわゆるlinear PCM データとなる。そのようなものを生成する C 言語で書けば、例えば以下のようになる。

#include <stdio.h>#include <stdlib.h>#include <math.h>int main(void){
double T=3.0;/* 3 秒のデータ */double h=440.0; /* 440Hz の音 */double vol=0.7; /* 70% のボリューム */double sample=44100.0; /* 標本化周波数 44100Hz */double t,y;short int z;/* -32767~32767 の整数 */for(t=0.0; t<=T; t+=1.0/sample){y=vol*sin(2.0*M_PI*h*t); /* M_PI=円周率 (in math.h) */z=32767*y;putchar(z&0x00ff);/* 下位 8 bit を出力 */putchar((z>>8)&0x00ff); /* 上位 8 bit を出力 */}return 0;}

3. 音階と周波数の関係

3

音階と周波数の関係

3

弦楽器を考えればわかると思うが、短かく、強く張った弦ほど高い音が出る。これは、そのような弦の方が速く振動し、その振動が空気を伝わるからである。つまり、高い音程は速い振動に、低い音程は遅い振動に対応する。
それに対し、音量は、2 節のプログラムにあるように振幅の大きさ、すなわち式 (1) のA に対応し、また音色は波の形に対応する。(1) のような三角関数による音は単純な、純粋な音で、実際の楽器の音はより複雑な振動波形になっている。
ギターなどの弦楽器を引く人はわかるだろうが、倍の周波数 (半分の弦の長さ) にすると丁度 1 オクターブ上の音程の音になる。よって、4 倍の周波数は 2 オクターブ上の音になる。1 オクターブの中には、半音間隔で、
ド、ド ] (= レ [)、レ、レ ] (= ミ [)、ミ、ファ、ファ] (= ソ [)、ソ、ソ ] (= ラ [)、ラ、ラ ] (= シ [)、シ、ドと、12 個の間隔がある (ミとファ、シとドは半音しか離れていない)。各音程の周波数は、1 オクターブ (12 半音上) 上がる毎に周波数が倍になるように、音階に対して等比数列的に増えていく2 。例えば、ド、ド ]、レ、. . . の音の周波数を a0 , a1 , a2 ,. . . とし、この等比数列の公比を r とすると、

a12 = a0 r12 = 2a0√であるから、r12 = 2 より r = 12 2, よって、
an = a0 rn = a0 2n/12(2)となる。
通常音階の基準音として使用されるラの音 (時報の最初の 3 つの音の音程) は、440Hz付近の音が使われているようである。よって、

a9 = 440 = a0 29/12 = a0 23/42

これは厳密には平均律音階の場合。純正律音階やピタゴラス音階では、等比数列とは微妙に異なる。

4. グリッサンド音

4より、

a0 = 440 · 2−3/4 = 261.63Hzとなる。これに 21/12 = 1.05946 · · · を順にかけることで以下が得られる。

a0 = 261.63Hz (ド),a3 = 311.13Hz (レ ]),a6 = 369.99Hz (ファ),a9 = 440.00Hz (ラ),a12 = 523.25Hz (ド)a1 = 277.18Hz (ド ]),a4 = 329.63Hz (ミ),a7 = 392.00Hz (ソ),a10 = 466.16Hz (ラ ]),a2 = 293.66Hz (レ),a5 = 349.23Hz (ファ]),a8 = 415.30Hz (ソ ]),a11 = 493.88Hz (シ),このように、音階を一定に上げる (下げる) には、周波数を等比数列的に上げる (下げる) 必要があることに注意する。

グリッサンド音

4

グリッサンド (ポルタメントととも言う) とは、音程を連続的に変化させる奏法のことを言う。これは、ピアノ、クラリネット、トランペットのように中途半端な音を出せな
い (出しにくい) 楽器では難しいが3 、トロンボーンやバイオリンなどでは可能な、特別な奏法である。
例えば、グリッサンドでなく、半音ずつ音階の音を t0 秒毎に一定に上げて行くには、

y = f2 (t)A sin 2πa0 t A sin 2π{a1 (t − t0 ) + t0 a0 }=  A sin 2π{a2 (t − 2t0 ) + t0 a0 + t0 a1 }



 ...


A sin 2π{aN (t − N t0 ) + t0 a0 + · · · + t0 aN −1 }(0 ≤ t < t0 ),(t0 ≤ t < 2t0 )(2t0 ≤ t < 3t0 )(3)(N t0 ≤ t < (N + 1)t0 )のようにすればよい。なお、sin の中に t0 a0 , t0 a0 + t0 a1 ,. . . のように残してあるのは、t に関して連続関数にするためのものである。
この (3) の sin の中の 2π 以外の部分を f3 (t) (すなわち f2 (t) = A sin 2πf3 (t)) とすると、この f3 (t) は、折れ線のグラフになる。
3ガーシュインの「ラプソディー・イン・ブルー」には、冒頭にクラリネットのポルタメントから始まる有名なフレーズがあるから、少なくともクラリネットでは不可能なわけではないらしい。

4. グリッサンド音

5f3 (t)PSfrag replacementst 0 a0 + t 0 a1
t 0 a00

tt0

2t0

3t04t0

図 1: f3 (t) のグラフ

しかし、この場合は t0 秒毎に音程が一つずつ上がっていくだけで、連続的に音程が変化するグリッサンドにはなっていない。連続に音程を変化させるには、この折れ線を滑らかなグラフにすればよい。
この関数 f3 (t) を t で微分すると、微分は関数の傾きを意味するから、そのグラフは図2 のように階段関数となる。このグラフを見るとわかるが、この導関数 f30 (t) は f2 (t)の音の周波数を表しているようである。まずこの事実について説明しておく。
今、増加関数 g1 (t) (g10 (t) > 0) に対して g2 (t) をg2 (t) = A sin 2πg1 (t)(4)とするとき、この g2 (t) の t = t1 での周波数を考えてみる。周波数とは 1 秒あたりの波の数であり、t = t1 から t = t1 + ∆t の間での波数は、2πg1 (t1 + ∆t) − 2πg1 (t1 )= g1 (t1 + ∆t) − g1 (t1 )2πであり、よってこれを ∆t で割った

g1 (t1 + ∆t) − g1 (t1 )∆t(5)4. グリッサンド音

6f30 (t)PSfrag replacements
a3a2a1a00tt02t03t04t0

図 2: 導関数 f30 (t) のグラフ

が 1 秒あたりの波数、すなわち g2 (t) のこの ∆t 秒間の平均的な周波数となる。この(5) の式を ∆t → 0 としたものが丁度 t = t1 での周波数となるが、微分の定義より、その極限はg1 (t1 + ∆t) − g1 (t1 )= g10 (t1 )∆→0∆tlimとなる。つまり、g1 (t) の微分係数 g10 (t) は確かに g2 (t) の周波数を表すことがわかる。
今、音程の周波数 an に対して、音程と同様に一定に増加する添え字 n を音程を数値化したもの、すなわち下のドを 0、ド ] を 1 のように見ることにすれば、

log an = log a0 rn = log a0 + n log rなので、n=log an − log a0log rとなり、この数値化された音程 x と周波数 a の間の関係は、

x = s(a) =log a − log a0,log r

a = h(x) = a0 rx(6)4. グリッサンド音7と書けることになる。s は周波数を音程に変える関数、h は逆に音程を周波数に変える関数となる。
最初 (t = 0) の周波数が a で, t = T のときの周波数が b であり、その間一定に音程が変化するような (4) の形の関数を考えてみることにする。
上の考察により g2 (t) の周波数は g10 (t) であるので、g1 が満たすべき条件は、

g10 (0) = a,g10 (T ) = b(7)および音程 s(g10 (t)) が一定に変化、すなわち直線的に変化することである。

s(a) = p, s(b) = q とすると、s(g10 (t)) は t = 0 から t = T にかけて p から q に直線的に変化することになるので、
s(g10 (t)) = p +t
(q − p)Tと書けることになる。よって、

log g10 (t) − log a0t= p + (q − p),
log r
T


t0
log g1 (t) = log a0 + p + (q − p) log r
Tより、g10 (t) は、

g10 (t) = a0 rp+(q−p)t/T(8)となる。ここで、

a = h(p) = a0 rp ,b = h(q) = a0 rq

より、

g10 (t)= a0 r(1−t/T )p tq/T

= a1−t/T bt/Tr

p 1−t/T= a0 (r )q t/T(r )

= a0

aa0

1−t/Tba0!t/T

5. 最後に8となるので、結局

g10 (t) = aba!t/T(9)と書けることになる。これを積分すれば、

g1 (t) =Zbaa!t/T

dt = aT

1blog
aba!t/T+Cとなり、g1 (t) では定数差は特に意味を持たないので、C = 0 とし、また b/a を R と書くことにすれば、

g1 (t) =aT t/TR
log R(10)と書けることになる。よって、

g2 (t) = A sin 2π

aT t/TRlog R(11)が、グリッサンドを生成する関数だということになるが、もちろん、sin の代わりに周期が 1 の別の関数 α(x) を使って、

aT t/Tg2 (t) = α
Rlog R!

(12)としてもよい。これは、(11) とは別の音色のグリッサンド関数となる。

5

最後にこのグリッサンド生成関数 (12) は、実際にこれを実装したプログラム sndglis を、yomiという名前のフリーソフトに付属して公開している ([1])。
また、この考え方を発展させると、音を連続的に上下に変動させることも可能で、それにより、例えば任意の数学的なグラフの見た目を音程を使って表現することもできる。

5. 最後に

9

例えば、y = f (x) (x1 ≤ x ≤ x2 , y1 ≤ y ≤ y2 ) のグラフを、y1 が音程 p、y2 が音程 qに対応するように、T 秒間の音で表すとすると、適当に平行移動や縮尺を行って、
 s(g10 (t)) = f (x2 − x1 )

tq−p+ x1 − y1+pT
y2 − y 1とすればよいから、この右辺を g3 (t) と書くことにすれば、g10 (t) = a0 rg3 (t)となる。しかし、一般の f (x) に対しては、この右辺は簡単には積分できないので、一般の f (x) を厳密に音程で表現することは難しい。
ただ、コンピュータで関数のグラフを書くときは、通常は曲線として書くのではなく、数百分の 1 位に分割して、目ではわからないくらいの細かい折れ線で近似して書いているので、そのような分点のデータを使えば、個々の折れ線を (12) によるグリッサンドで表すことで、近似的な表現は可能である。
実際にそのようなことを行うプログラムも、yomi の中に tbl2snd という名前で含まれている。これは、gnuplot という有名なグラフプロットソフトの作成する table データという折れ線の分点データを利用し、そこから上の方法でグリッサンド音データを作成するプログラムである。サンプルは、[3] にあるので、詳しくはそちらを参照されたい。
グリッサンドは、音程を単純に一定に上げていくだけであるが、そのような波の生成は簡単なようで、実は微分や積分が関係する、意外に難しい話であることがわかったであろうか。逆に、こういったところにも微積分の考え方が必要になるということを知ってもらえれば、本稿はそれなりに意味があるのではないかと思う。

参考文献[1] 日本語読み上げソフト yomi の WWW ページ
http://takeno.iee.niit.ac.jp/~shige/unix/yomi/yomi.html[2] グリッサンド音生成ツール sndglis のサンプル
http://takeno.iee.niit.ac.jp/~shige/unix/yomi/yomi.html#sndglis-sample

5. 最後に[3] gnuplot グラフの音声化ツール tbl2snd のサンプル
http://takeno.iee.niit.ac.jp/~shige/unix/yomi/yomi.html#tbl2snd-sample

10