非公式チュートリアル12 ハイドンの名によるメヌエット
モーリス・ラヴェル作曲の「ハイドンの名によるメヌエット」という曲がある。これは国民音楽協会という当時のフランスの作曲家の協会が、ハイドン没後100周年を記念して、ラヴェルを含む6人の作曲家に、ハイドンHaydnの名を音列に見立てて、その動機をもとにピアノ小品の作曲を委嘱したものである。ラヴェルの他は、ドビュッシー、デュカス、ダンディ、アーン、ヴィエルヌがそれぞれピアノ曲を作曲した(ヴィエルヌはオルガニストであり、オルガンでの演奏を想定していたと思われる)。とはいえラヴェルの曲が圧倒的に優れていた点は、Haydnの音列を逆行形や反行形も用いながら作曲したことであり、調性音楽(厳密に言えば旋法音楽とも言える)でありながらシェーンベルクら新ウィーン楽派の十二音技法のアイデアをも先取りするものであった。筆者(imahori)は作曲家としてはドビュッシーを第一に尊敬しているが、この曲集に限ってはラヴェルに軍配があがると思っている。
Haydnの音列は、以下のような法則によって導き出されている。まずアルファベットのテーブルを組む。
A | B | C | D | E | F | G |
H | I | G | K | L | M | N |
O | P | Q | R | S | T | U |
V | W | X | Y | Z |
これにより、2行目以降の文字は1列目の文字に置き換える。ただしHは、ドイツではシのナチュラルを意味するので、ここでは例外としてBと同様に扱う。そうすると、HAYDNという文字列はBADDGとなり、音名に読み替えるとシラレレソというメロディが導き出される。
今回のパッチは、このテーブルに基づき、任意の文字列と、それを音名変換させるためのchordを与えて、文字列によってchordを新たに生成することを目的とする。
まずメインパッチは2つの入力(文字列とchord)と1つの出力(chord)を持つサブパッチとする。(このサブパッチの名前は自由につけて良い。例示ではsur le nom de quelqu’un(誰かの名による)と命名した。)
文字列には"Haydn"を指定する。(先頭のみ大文字であることがミソである)
chordはスクリーンショットを参照のこと。テーブル最上段のA4 B4 C5 D5 E5 F5 G5 (6900 7100 7200 7400 7500 7600 7800) を指定してある。
ではそのサブパッチの中身を見てみよう。
まず左側input 0だが、omifとstringpにより、input 0に与えられた引数が文字列であるかどうかを確認している。
その次に string-downcase を指定し、文字列中のアルファベットを全て小文字に直している。これにより、大文字も小文字も含む文字列であっても、内部処理は全て小文字によって行われている。
次にomloopを見てみよう。
length, 1-, forloop の組み合わせは、これまでのチュートリアルに出てきたとおりである。
その次にcharを指定し、文字列からループごとのn番目の文字を参照している。例えば最初のループだと、forloopの出力は0から始まるので1番目のループなら0が指定され、先頭の0番目の文字(普通に数えると1番目)が参照される。
次にその文字がアルファベットであるかどうかをalpha-char-pによって判断している。もしアルファベットであれば(返り値がtであれば)、char-codeでその文字のアスキーコードを出力させている。そうでなければ、つまりアルファベット以外の文字であれば、nil(偽の値として使われるシンボル。これまでのチュートリアルにも出てきた)を返している。
それをcollectしてomloopがループするわけだが、最後にすべてのループが終わった後、collectのoutput 1(0から数えるので実質2番目のアウトプット)にremoveでnilを指定する。すると先ほどのアルファベット以外の文字だった場合にnilを返していたのが、ここで全て取り除かれる。
今度はomloop 1を見てみよう。
まずinput 0には、先ほどのomloopからの出力で、文字列の各文字のアスキーコードによる数値が入っている。アルファベット以外の文字の出力は取り除かれているから、ここの数値は全てaからzまでのいずれかの文字による数値である。
文字列a(#\aと指定する)のchar-codeを出力し、om-でその差を求めている。aは97であるから、例えばここにbが来ると98となり、98-97=1となり、aから数えて1の差があるということになる。
次にこの差を、与えられたchordのlengthで割る。アルファベットのテーブルを見てみると、1行には7列のアルファベットがあることがわかる。これをchordでラシドレミファソと指定しているのだが、そのlengthは7であるから、ここでは7が来る。(chordのlengthは可変である。後述。)
Haydnのhは例外だから後で処理するとして、aはそのまま1行目のa、次にyがテーブル上のdに来ることを知るためには、剰余(割り算のあまり)を出せば良い。yはアスキーコード113で、113-97=25, 25//7=3...4となり、4番目の列、つまりdとみなすことができる。
その例外のhの処理は、次のomifで行っている。char-codeで#\hを指定し、もしhであれば、強制的に11を返り値として出力するようにしている。そうでなければ、これから説明する次のセクションの返り値となる。
一方、chordに入力されている数値は、過去のチュートリアルで見てきたとおり、MIDIナンバーがセント単位の数値で与えられている(例:C4=6000)これを100で割り、さらに12で割ることで、オクターブに関係なく音名を把握することができる。例えばC4=6000なら6000/100//12=5...0となり、cとみなされる。
これを先ほどの剰余算の出力につなぐ。Haydnが(hの例外はすでに処理されているので)baddgとなるので、 (1 0 3 3 6) が出力されている。一方chordの (6900 7100 7200 7400 7500 7600 7800) は、12の剰余で (9 11 0 2 4 5 7) となっているから、これをomloopのループで順にnthで拾っていけば、LISPは0からものを数えるので1はリスト中の2番目、つまり11となり、次は0なのでリスト中の1番目つまり9となる・・・という具合で、したがって出力は (11 9 2 2 7) が得られる。
今度はsur le nom de quelqu’unのパッチに戻って見てみよう。今のomloop 1の出力を100倍し、 (1100 900 200 200 700) を得ている。
次にlist-minでリスト中の最低値を得る。ここでは6900がそれにあたる。これを1200で剰余算し、5...7で5番目のオクターブを得る。それに1200を掛けて6000となるので、(1100 900 200 200 700) にそれを足せば、 (7100 6900 6200 6200 6700) が得られる。
最後のomloop 2を見てみよう。これはlist-minで得られた数値よりも低い場合、強制的に1200を足して1オクターブ上げている。
これでパッチは完成である。Haydnの音列シラレレソが得られる。画像1のパッチの下部(出力結果)のchordをダブルクリックで開き、左下(デフォルトはchord)をorderにして、音の並びを確認してみよう。
ラヴェルは同じシステムを使って、師匠フォーレの誕生日を祝って作曲した、ヴァイオリンとピアノのための「ガブリエル・フォーレの名による子守唄」という曲も書いている。そこで文字列に "Gabriel Faure"と入力する。(正確にはFauréであり最後にアクサンテギュがつくのだが、ここでは処理の都合上割愛する。)苗字と名前の間にスペースが含まれているが、これはパッチの処理で「アルファベット以外の文字はnilを返す」としてちゃんとはじいてくれるはずだ。出力結果は「ソラシレシミミファラソレミ」となり、子守唄に使われたメロディと同一の音列が得られる。
もう一つ、このシステムによって作曲された曲がある。モーリス・デュリュフレ作曲、オルガンのための「アランの名による前奏曲とフーガ」である。デュリュフレはレクイエムで有名な作曲家であり、寡作だがオルガンや無伴奏コラールなどの教会音楽を残している。ここで名前が引用されているアランというのは、デュリュフレの盟友でありやはりオルガニスト・作曲家であり、第二次世界大戦で若くして戦死したジャン・アランのための追悼作品である。2013年に亡くなったフランスの代表的なオルガニスト、マリー=クレール・アランの兄にあたる。
この曲は実はラヴェルたちのものと微妙にテーブルが異なっていて、AからHまでを一列とする
A | B | C | D | E | F | G | H |
I | G | K | L | M | N | O | P |
Q | R | S | T | U | V | W | X |
Y | Z |
となる。
そこで、(この場合ラヴェルのテーブルをパッチ処理する際に用いたHの例外は考慮しなくても良いのだが、)パッチの右辺を「ラ、シ♭、ド、レ、ミ、ファ、ソ、シ(ナチュラル)」と指定してみる(画像1の右上に3つ並んだchordクラスの一番右)。オクターブはこの曲に倣ってA3から始める。
文字列に "Alain" を指定すると、「アランの名による前奏曲とフーガ」で用いられるのと同じく「ラレララファ」という音列が得られる。