additive synthesis(加算合成)とは音色を作り出すための音響合成の技法の一種です。楽器の音色はパーシャルと倍音から構成されており、それらが様々なバランスでスペクトルの時間的な変化を起こすことにより形作られます。加算合成とはそのようなパーシャルの時間的変化をエミュレートした音響合成の方法です。加算合成は理論上ありとあらゆる音響を合成することが可能ですが、生楽器のようなダイナミックな音色を作り出すには膨大な計算量が必要となるため、20世紀の電子音楽の世界ではこの加算合成に変わるさまざまな音響合成が開発されました。音響合成や電子音を用いない現代音楽の分野でもircamのスペクトラルな書法を利用する作曲家を始め、加算合成という発想は20世紀後半の音楽に多大な影響を与えました。
市販されている加算合成方式のシンセサイザー
市販のシンセサイザーとしては1996年に発表されたKAWAIのK5000というシリーズが唯一加算合成方式でシンセシスを行う音源を搭載しています。
RTcmixにおける加算合成Wavetable
正弦波の波形
RTcmixでは加算合成をウェブテーブルを利用してシミュレートします。max/mspの[cycle~]オブジェクトもこれと同じ方式で加算合成をシミュレートしますが、maxの場合はテーブルが512に固定されているため解像度はRTmixのそれよりも制限されています。これがしばしばmaxは音が悪いといわれている原因の一つです。RTcmixにおける加算合成インストゥルメントWavetableでは倍音構成をmakegen2に書き込むことで音色の原型波が決定されます。もちろんアンプリチュードエンベロープやピッチなども音色を決定する際に重要な影響を及ぼすパラメータです。
以下のコードは倍音を全く含まない正弦波(サインウェーブ)による音響合成です。
rtsetparams(44100, 2) load("WAVETABLE") makegen(1, 7, 2000, 0, 1000,1, 1000, 0) makegen(2, 10, 1000, 1) WAVETABLE(0, 8, 25000, 8.00, 0.5) WAVETABLE(3, 11, 25000, 8.07, 0.3) WAVETABLE(6, 14, 25000, 9.04, 0.8) WAVETABLE(9, 17, 25000, 8.11, 0.6)
音源
加算合成で矩形波(スクエアウェーブ)を合成する
矩形波の波形
次に倍音を加算し矩形波を生み出すコードを見てみましょう
rtsetparams(44100, 2) load("WAVETABLE") makegen(1, 7, 2000, 0, 1000,1, 1000, 0) makegen(2, 10, 1000, 1,0,1/3,0,1/5,0,1/7,0,1/9,0,1/11) WAVETABLE(0, 8, 25000, 8.00, 0.5) WAVETABLE(3, 11, 25000, 8.07, 0.3) WAVETABLE(6, 14, 25000, 9.04, 0.8) WAVETABLE(9, 17, 25000, 8.11, 0.6)
矩形波はその名の通り四角い箱のような形をした波形です。クラリネットの波形はこれに近く、基音と奇数倍音だけが含まれ、第n倍音の音波の振幅は1/nという数学的特性を持っています。この規則を利用して加算合成によって矩形波を合成したのが上のコードです。makegen2の中身が正弦波を生成するコードとは異なっています。
音源
加算合成でノコギリ波を合成する
ノコギリ波の波形
次に倍音を加算しノコギリ波を生み出すコードを見てみましょう
rtsetparams(44100, 2) load("WAVETABLE") makegen(1, 7, 2000, 0, 1000,1, 1000, 0) makegen(2, 10, 1000, 1,0,1/3,0,1/5,0,1/7,0,1/9,0,1/11) WAVETABLE(0, 8, 25000, 8.00, 0.5) WAVETABLE(3, 11, 25000, 8.07, 0.3) WAVETABLE(6, 14, 25000, 9.04, 0.8) WAVETABLE(9, 17, 25000, 8.11, 0.6)
ノコギリ波は波形が鋸の歯のようになっているので、この名がついています。ヴァイオリンや金管楽器の波形はこれに近く、鋸歯状波には基音とすべての倍音を含んだ音です。
高い倍音ほど振幅(音量)が漸減し、第n倍音の振幅は基音の振幅の1/nという数学的な特徴を持っています。
音源
応用
以上の合成波形はあまり加算合成の利点を生かした音色とは言えません。更にダイナミックに倍音構成が変化する音響を考えてみましょう
rtsetparams(44100, 2) load("WAVETABLE") makegen(1, 7, 2000, 0, 70,1, 930, 0) makegen(2, 10, 1000, 1) srand() for (start = 0; start < 32; start = start + 0.11) { freq = random() * 500 + 35 for (i = 0; i < 3; i = i+1) { WAVETABLE(start, 0.4, 7000, freq, 0) WAVETABLE(start+random()*0.1, 0.4, 7000, freq+(random()*7), 1) if (start > 5.5) { makegen(2, 10, 1000, 1, random(),random(),random(),random(),random(),random(),random(),random(), random(),random(),random()) freq = freq + 125 } if (start > 10.5) { makegen(2, 10, 1000, 1, random(), random(),0,0,0,0,0,0,0,0,random()) freq = freq + 100 } if (start > 15.5) { makegen(2, 10, 1000, 1, random(), random(),random(),0.2,0.110,0.1,0,0.3,0.1) freq = random() * 50 + 20 } if (start > 20.5) { makegen(2, 10, 1000, 1, random(), random(),random(),random(),random(),random(),random(),random(),random()) freq = freq +1325 } if (start > 25.5) { makegen(2, 10, 1000, 1, random(), random(),random(),random(),random(),random(), random(),random(),random(),random(),random()) freq = random()*1000 +525 } } }
上記のコードではループが回るごとに倍音構成がランダムに変化するアルゴリズムになっています。生楽器よりも複雑な音響を生み出すことが可能なことが推測できるでしょう。コンピュータの音響合成は生楽器の代用というネガティブな使用法だけではなく、生楽器にはなし得ない音響を生み出すというポジティブな考え方で自身の作品に利用していくことが、これからの時代の作曲家にはますます求められていくでしょう。人間が得意な部分は人間、コンピュータが得意な部分はコンピュータに処理を分散させ、人間とコンピュータ計算の共同作業で一つの音楽を作り出すことは今では当たり前になりましたが、一昔前では考えられなかったことです。
Youtube
RTcmix,音響プログラミング参考文献