2017年7月31日月曜日

ヤニス・クセナキス「音楽と建築」復刊記念〜グリッサンド群を操作するプログラム〜

ヤニス・クセナキスという作曲家をご存知ですか?現代音楽や電子音楽,ヒーリング・ミュージックといったジャンルの音楽に興味のある方はご存知だと思います.


とても神経質そうな,絶妙な表情をしていますが,実は彼は生まれ故郷のギリシャで反政府運動に関わり,その時の闘争で左目を失っています.このことが彼の表情の印象に影響しているのだと思います.ちなみに,彼は酒に酔うと左目の義眼を人前で外して驚かせる癖があったそうです.

彼はフランス亡命後,ル・コルビジェ事務所で建築家として働きました.その後,建築家としての仕事と並行して作曲も行うようになり,オリヴィエ・メシアンの素で作曲を学ぶようになります.その際メシアンに「君は建築家だから数学を知っている.なぜそれを応用しないのか?数学を知っていれば伝統的な作曲技法の修練はあってもなくても同じではないか?」と言われ(メシアンは「トータル・セリエリズム」という非常に厳格な作曲技法を考案し,主にヨーロッパでの現代音楽の創作がシステマティックになっていくきっかけを作った作曲家の一人です.),作曲にも数学を応用するようになります.

彼のそうした作曲理論は,その後の電子音楽やコンピュータ音楽に大きな影響を与えることになります.また,彼が開発した作曲のためのコンピュータ・プログラム「UPIC」は,まだコンピュータで音響を扱うなんて発想がなかった時期に,手書きの図形から音響を生成する,非常に先駆的なプログラムでした.

あまりいい写真がなかったので,最近のUPIC

彼が自分の創作に通底する思想と論理をまとめ,彼の作曲の弟子であった高橋悠治が日本語に訳した書籍「音楽と建築」は,彼の創作のアイデアについて知ることができる格好の資料でしたが,長らく廃刊となっており,中古でしか手に入れることができませんでした.私は,神戸のとあるアートスペースの片隅の,古い芸術関連の本が雑然と並べられた本棚の中に入っているのを見たのが唯一この本を見かけた機会でした.

そんな「音楽と建築」がこの度復刊されました.



私は本文をちゃんと読んだのはこの復刊によって手に入れてからが初めてでした.彼が何を考えて数学を音楽に応用していたか,非常によくわかります.

私は別にクセナキスやクセナキス界隈とは何の関わりもないので,今回の復刊を「記念」する義理はないのですが,折角のタイミングですので,クセナキスっぽい音響構造を作り出すプログラムをMaxで作ってみました.このプログラムは,以前私がツイキャスで配信しながら作ったものを発展させたものです.

彼が数学を応用した作品の中で,初期の有名な作品はデビュー作「Metastasis」と「Pithoprakta」でしょう.これらの作品の「楽譜」が以下です.



こうした作品群で彼が行ったのは,グリッサンド(連続的に音の高さが変化する演奏法.トロンボーンによるそれが有名だろう.)する無数の音群を制御することによって複雑な音構造を浮かび上がらせることでした.それは,Metastasisの構想の中にも見ることができます.



一つ一つのグリッサンドは直線的に支持されています.こうした直線的なグリッサンドする音が様々な長さ・タイミングで重なり合うことで,曲線的な,複雑な構造を形作っています.こうした音響をMaxで作り出します.

多くの音を個別に制御するテクニックは,Maxのpoly~オブジェクトが使えます.poly~オブジェクトの使い方が今回のプログラムの鍵になります.

まずは,この構造をつくるプログラムを作ってみましょう.


まずは,poly~の中身になるパッチを作ります.上の画像を見ると,25個の異なるピッチの音が同じ時刻にスタートして,それぞれ異なる長さで同じピッチに向かってグリッサンドしています.到達地点のピッチを(今回のプログラムでは)4000Hzとすると,line~オブジェクトを使ってこのようになります.親パッチからin 1へスタート時の周波数が,in 2へグリッサンドの時間が入力されます.グリッサンドが終わると音が消えます.


このパッチがpoly~オブジェクトで呼ばれることで,同じプログラムが同時に動作することになります.

親パッチを見てみましょう.


poly~の数を25にして,先ほど作成したパッチを25個生成します.


25個生成したパッチの中で任意のパッチのインレットにデータを入力するには

target [パッチの番号(1〜n)]

 というメッセージに続けてデータを入力します.

例えば,

target 10

200

という順でメッセージを送れば,パッチ(10)に200という整数を入力したことになります.上のパッチでは,グリッサンド開始時の周波数と,グリッサンド時間を入力値としていますので,これらを別々にリストとして決定して,リストの全要素をバラバラに送ると同時に(Maxのリストは一括で入力されます),それぞれの要素が入力される前に "target [パッチの番号(=1から始まるリストのインデックス)]"を挿入すれば,リストで決定した値がpoly~で複数生成したそれぞれのパッチに送れることになります.

そのようなデータの入力体系を作るのがこの部分.



Maxを使ったことがある方は,この部分の上半分,Multisliderでリストが生成されていることはだいたいお分かりだと思います.ちなみに,初期値として,0Hzから4000Hzの少し下あたりまでを線形に増やしていくようなリストをuziとthreshで自動生成しています.肝は下半分.iterとaccumが肝心です.まず,Multisliderからリストが出力されると,accumに"set 0"が送られ,accumの内部変数が0で初期化されます.(MaxのRight to Left Orderはご存知ですよね?)
次にリストがiterに入ります.iterはリストの全要素を一つずつ別のメッセージとして出力するオブジェクトです.今回は25個の浮動小数点数からなるリストを入力していますから,一回iterにリストが入るたびに25回の浮動小数点数の出力がされます.この時,accumの第2インレットに1を入力します.この入力によってaccumの内部変数が1追加されました.先ほど0で初期化したので,内部変数は1になりました.その後,accumの第1インレットにbangを入力します.これによって内部変数の値をアウトレットから出力します.
ところで,iterによって一つの浮動小数点数に分けられたデータは,既にpackに到着しています.(よく見ると,packに向かうラインの方がaccumに向かうラインよりも右側にありますね?)このタイミングで先ほど発生したbangによってaccumから内部変数の値が出力されると

[accumの内部変数] [iterによって分けられたリストの1要素]

というリストがpackから出力されます.これが"target $1,$2"を通り,$1と$2がリストのそれぞれの要素で代入されて出力されることになります.この処理はiterによってリストの要素の個数回繰り返されます.その度にaccumの内部変数には1が加算されるので,iterがリストの要素を出力する毎にtargetの後の数字が一つずつ増えていくことになるのです.

今は,グリッサンド開始時の周波数の決定を行いました.全く同様の方法で,グリッサンドの時間を決定します.

こうして作ったパッチの,"s trigger"に入力しているButtonをクリックすると


スペクトログラムで計測すると,あの画像っぽい構造が現れました.

この構造は,上の画像のようなリストの与え方をしたからです.従って,Multisliderを操作してリストの値を変更すると,現れる構造も変化します.



さて,ここで,操作できる要素を更に増やしてみましょう.以下の4つを独立して決定できるようにします.

・グリッサンド開始時の周波数
・グリッサンド終了時の周波数
・グリッサンドにかかる時間
・グリッサンドの開始時刻

これらを操作するために,poly~のパッチを以下のように変更します.これまでハードコーディングしていた上記に該当する部分をインレットからの入力値に置き換えるます.また,親パッチから送られるトリガーにdelayを挟むことで,グリッサンドの開始に独立した遅延時間が発生するようにします.



それぞれの値を先述の方法で与えるようにします.


これによって更に色々なグリッサンドの構造が作れるようになります.




クセナキスの楽譜で見そうな構造が沢山できます.

このように多くの直線を多重して曲線的な構造を浮かび上がらせることができるということは,音楽や音響に関わらず,クリエイティブ・コーディングに携わる者は改めて再確認したいことであると思います.これ自体は,曲線の接戦の傾きを求める微分そのものであると同時に,コンピュータで曲線を表現する最も基本的なテクニックです.

いかがでしょうたでしょうか?こうしたグリッサンドを多重した音響は先述のソフトウェアUPICで作ることができます.しかし,「音楽と建築」を読むと,UPICによる作曲は直感的な一方,今回取り上げたような方法の方がよりクセナキスの初期における理論を反映できるインタフェースのように思います.クセナキスは統計力学の知見から無数のグリッサンドする音群を操作するというアイデアを導入しました.それぞれの音をグリッサンドのピッチ差とグリッサンドの時間を要素とする一次元ベクトルで表現し,ピアノや一般の管楽器のようなグリッサンドしない音は開始時と終了時のピッチ差がない特殊な場合と考え,全ての音楽がこの方法で実装できるとしました.そして,この音群のベクトルの要素それぞれが確率的に決定できるという方向へ拡張されます.(この考えが彼の中期以降に増えてくる篩法を応用した作曲理論に繋がります.)

2017年7月3日月曜日

Karplus-Strong合成 初歩的なギター音の物理シミュレーション

シンセサイザの合成方式に,物理モデル音源という方式があるのをご存知でしょうか?(というより,シンセサイザの合成方式,いくつ挙げることができますか?)

名前から想像がつくと思いますが,手本にする音源(楽器である場合がほとんど)の発音原理を物理的にシミュレーションする方式です.この方式を初めてシンセサイザとして実装したのがヤマハです.



論理的に考えれば,この方式によってかなりリアルな音が得られそうな気がしますが,実際言うほどリアルな音は得られず(業界では分析が足りなかったと言われています),その後同社が物理モデル音源を前面に推した商品を出すことは無くなりました.しかし,エレクトーン等で管楽器の息遣いも含んだ質感のサウンドを演出したりするために使われるなど,物理モデル音源は今や電子楽器ではあって当たり前の技術となりました.

Rolandが数年前発表したV-Pianoは,ピアノの弦の振動からハンマー反響板に至るまで全ての要素をシミュレーションするだけでなく,パラメータ調整によって様々な物理的状態のピアノを作り出すことができます.


こうした物理モデル音源の名器達は,人間の優れた英知とそれを実装するに足る半導体の進歩によって可能になったものです.こうした物理的な分析に基づく音源合成は,1983年に発表されたKarplus-Strong合成が最初です.この合成法は,考案者の名前が元になっていて,KarplusさんとStrongさんによって考案されたことがわかります.Strongさんは何やら強そうです.

Karplus-Strong合成は,撥弦のシミュレーションです.「撥弦」とは,弦をはじく演奏法の事です.恐らく,この演奏法を使う最も知名度のある楽器はギターで,Karplus-Strong合成自体,撥弦の中でも「エレクトリック・ギター」のシミュレーションと紹介されることもあります.物理的にシミュレーションするというと,非常に難しそうな印象を受けますが,Karplus-Strong合成は,非常に簡単に作ることができます.まず,弦の振動について考えてみます.

皆さん既にご存知のように,音というのは振動現象です.音源の振動が波として空気を伝わって(例えば)耳まで届いて私たちは音を聞く訳です.波が伝わっていくもののことを「媒質」と言います.今の音の説明の場合,空気が媒質となっている訳です.ところで,この音の正体たる振動を伝える媒質は,空気に限らないことが知られています.例えば水や木の板等,振動を伝える媒質は空気以外にもたくさんあります.例えば,こういうものも媒質になります.

これ,学校にありませんでしたか?ウェーブマシーンと呼ばれる実験装置です.魚の骨のように,たくさんの棒が一本の軸で繋がっていて,棒の間を波が伝わっていきます.ここで重要なのは,「繋がっている」ということです.物凄く雑に言ってしまえば,それが何であれ,繋がっていれば,よほど凝集されていない限り,振動を伝える媒質として機能します.ですから,こんな風に「繋がった」物も波を伝える媒質になる訳です.


もう何が言いたいか分かりますね.私たちは弦の振動について考えるとき,大雑把に「弦が振動する」と考えてしまうかもしれません.でも,弦をはじく時のことを考えてみると,弦を指やピックで弾くとき,はじかれているのは,弦全体の局所的な部分です.そのときの振動が,弦という媒質を伝わって,やがて弦全体が振動するようになるのです.

この時,具体的にどのような現象が起きるのかを知るために,弦の振動をシミュレーションで図示してみましょう.

媒質を伝わる波の様子は,波動方程式


\[\frac{\partial^2u}{{\partial}t^2}=c^2\frac{\partial^2u}{{\partial}x^2}\]

で表現できます.この方程式をFDTD法で計算します.

尚,このシミュレーションは,神戸市立工業高等専門学校長谷芳樹准教授がwebで研究成果の一部を公開している

FDTD Simulation Movie & Demo

を参考にしました.上記ページで紹介されているのは2次元以上の波動方程式ですが,媒質の違いによって速度が変化する様子等が分かりやすく実装されているので非常に勉強になります.私のような現代のゆとり世代にも馴染みやすいツールで実装されているのも非常にありがたいです.

とりあえずやってみます.尚,上記の式では,減衰が考慮されていません.弦に限ったことではありませんが,現実的な環境で物が振動する時,何かが(地球上では大抵空気)抵抗となって,振動が時間の経過とともに減衰していきます.今回のシミュレーションでは,無理やり減衰をつけました.厳密な物理的解析に基づく結果ではありませんが,何が起きているか視覚的に伝われば幸いです.


何やら弦が振動してるっぽい動きをしてますね.初期状態(シミュレーション開始時点で弦がどういう形をしていたか)によって振動の仕方が様々に変化します.



ただ,これではよく分からないので,初期状態での変位(波の盛り上がり)をもう少し局所的にしてみます.

お分かりいただけますでしょうか?中央付近で発生した波が弦の左右へ伝わっていきます.山が両端まで到達したら,進行方向を逆にして跳ね返ってきます.跳ね返った波はいずれ再び中央付近へ戻ることになります.そして中央付近へ戻ったらまた両端まで伝わっていく・・・これを何度も繰り返しているのが弦の振動です.これを弦全体ではなく中央付近のみに注目して考えると,同じ波が両端の反射によって何度も到達することになります.この,同じ波が何度も到達する様子をシミュレーションしたのが,Karplus-Strong合成です.

MaxでKarplus-Strong合成をやってみましょう.

まず,撥弦を作ります.撥弦という動作は,弦にほんの一瞬だけ力学的刺激を与える行為だと考えることができます.ですから,パルスでこそないものの,パルスのような短い時間で変化する信号が適しています.


3 msだけ持続するホワイトノイズを撥弦とします.この時点でButtonをクリックすると,そのままですが,非常に時間の短いノイズが聞こえると思います.

次に撥弦によって弦に与えた刺激が,両端の跳ね返りによって何度も到達する様子をシミュレーションします.これは,ディレイを使います.

Maxのディレイのためのオブジェクトtapin~とtapout~は,tapin~のアーギュメントによって,ディレイの最大時間(ディレイのために確保するメモリ容量)を変えられます.今回はそんなに長いディレイタイムは必要としないので,100(ms)としておきます.「何度も到達する」訳なので,ディレイにフィードバックもかけます.とりあえず,ゲインは0.99にしておきます.

この画像のようにディレイタイムを10.msにして,Buttonをクリックするとどうでしょうか?先ほどのノイズがディレイとフィードバックによって何度も繰り返されているのがわかると思います.ここで更にディレイタイムを短くすると,徐々にピッチがはっきりと感じられると思います.勘の良い方はお気づきと思いますが,3msのノイズが周期的に繰り返されることによって,音源がノイズであったにもかかわらずピッチが生じているのです.これがKarplus-Strong合成です.

最後に,KSliderもつけて,少しばかり演奏インフェースっぽくしてみましょう.MIDIのNote Numberから周波数へはmtofで変換することができます.周波数からmsへの変換は,1000msに何回振動するかというのが周波数の定義なのですから,1000を周波数で割り算すれば求めることができます.



いかがでしょうか?物理モデリングといってもかなりシンプルに実装できることがわかります.初歩的な物理モデリングといえば,Karplus-Strong合成が最も有名ですが,実はこの考え方を応用したかなりたくさんの種類の物理モデリング音源が提案されています.色々な場所でサンプルとして見かけることができますから,ぜひ探してみてください.

※番外編

tapout~で設定するディレイタイムはsignalとして入力することで,「連続的」にディレイタイムを変化させることが出来ます.これを利用することで,チョーキングやビブラートのような効果を作ることが出来ます.