09 ディアトニックによる即興
今回はディアトニック(いわゆるドレミファソラシからなる7音)を使ってメロディ、コード、ベースの各パートからなる即興的な調性音楽を作る。出力は前回触れたvoiceおよびpolyを用いる。
早速順を追って解説して行こう。
まず最初にchordで「ドレミファソラシ」(C4, D4, E4, F4, G4, A4, B4)を用意する。(ブロックを忘れずに!)
まず最初にchordで「ドレミファソラシ」(C4, D4, E4, F4, G4, A4, B4)を用意する。(ブロックを忘れずに!)
その下にomloopを用意する。以下の画像を見てみよう。
length, 1-, forloopを応用する方法は、これまでにも触れた通りである。今回は和音の数だけループの回数が必要で、その回数を参照する。
和音そのものもやはり参照するが、和音の中の1音ずつを参照する必要は無いので、ここではnthと組み合わせたりlistloopを使う必要は無い。
和音そのものもやはり参照するが、和音の中の1音ずつを参照する必要は無いので、ここではnthと組み合わせたりlistloopを使う必要は無い。
左のrotateはこれまでにも触れた通り、リストの並び順を変更するものである。
その下のomloop 1を見てみよう。
その下のomloop 1を見てみよう。
ここでは最初の音と次の音(ただしlistloopの最初には最初の音が来る)を比べて、最初の音の方が高い場合は、次の音を1オクターヴ上げている。そうでなければ元のオクターヴのまま返す。
これによって、いわゆる7つの教会旋法(モード。それぞれイオニア、ドリア、フリギア、リディア、ミクソリティア、エオリア、ロクリア)のリストが生成される。
これによって、いわゆる7つの教会旋法(モード。それぞれイオニア、ドリア、フリギア、リディア、ミクソリティア、エオリア、ロクリア)のリストが生成される。
先ほどのomloopに戻ろう。右側のom//は7で割った結果のあまりが6である場合をomifに求めている。
これはあまり6に相当するのがロクリア旋法(シドレミファソラ)で、後ほど作る5度のベースラインがロクリアの場合は減5度(シ・ファ)になるのを防ぐため、ファを+200でソにし、ソを-200でファにして、ファとソの順番を入れ替えている。
これによってベースラインの生成は短6度(シ・ソ)になり、協和度は和らぐ。
これはあまり6に相当するのがロクリア旋法(シドレミファソラ)で、後ほど作る5度のベースラインがロクリアの場合は減5度(シ・ファ)になるのを防ぐため、ファを+200でソにし、ソを-200でファにして、ファとソの順番を入れ替えている。
これによってベースラインの生成は短6度(シ・ソ)になり、協和度は和らぐ。
ここまでをcollectに入れてループさせている。
メインパッチに戻ろう。arithm-serでは0から11までの数値をリスト化している。
これをpermut-random(ワンスモード)で順番を入れ替えている。これは後で移調に用いるが、ソの順番をランダムで決めているのである。
これをpermut-random(ワンスモード)で順番を入れ替えている。これは後で移調に用いるが、ソの順番をランダムで決めているのである。
次のomloop 2の中身を見てみよう。
input 0には先ほど生成した7つの教会旋法が入力されている。これを0ないし5のいずれかをnth-randomに選ばせてrotateさせる。0が来た場合は変わらないが、5が来た場合はエオリアが先頭に来る。つまり全体のオーダーは短調になる。
次に続く一連の過程は、いわゆるコード進行を決めている。ここではI度から始まり、途中経過はランダムにまかせ、最後はV度、I度の順に終わるように出来ている。左のfirst、右のfifth、そして最後にまたfirstを繋いでx-appendでまとめているのが、その流れである。
これだといわゆる常識的な和声進行から見れば理論的には間違いだらけだが、一応ある程度は体裁の整ったものとして聴ける。
これだといわゆる常識的な和声進行から見れば理論的には間違いだらけだが、一応ある程度は体裁の整ったものとして聴ける。
ではその中間にあるomloop 3を見てみよう。
ここではlistloopとnthを組み合わせただけの単純なものである。メインパッチ上であればmapcarを組み合わせた方が処理が早いが、omloop内でさらにループを組む場合は、この方が確実に処理を行える。
リストには (1 2 3 5 6) を与えている。LISPは0からものを数えるので、ここではそれぞれII, III, IV, VI, VII度の各和音に相当する教会旋法を抽出している。
これをpermut-randomに入れることによって、中間でのランダムなコード進行を与えている。
これらをx-appendに入れれば、最初はI度、途中はランダムで、最後はV, Iで解決する。
リストには (1 2 3 5 6) を与えている。LISPは0からものを数えるので、ここではそれぞれII, III, IV, VI, VII度の各和音に相当する教会旋法を抽出している。
これをpermut-randomに入れることによって、中間でのランダムなコード進行を与えている。
これらをx-appendに入れれば、最初はI度、途中はランダムで、最後はV, Iで解決する。
omloop 2に戻ろう。右側のlistloopには、移調のオーダーが入っている。これをom* 100およびom+を用いて、先ほどのコード進行にそれぞれ数値を足す。これを移調オーダーの数だけループさせれば、12半音階それぞれの調でのコード進行が決定される。
メインパッチに戻ろう。
ここでflatを作成し、>キーでオプションのinputを出し、1を与えて外側の括弧を1つ外す。
この状態で試しにchord-seqを作成しinput 1にflatのoutputを代入してみると、コード進行がどのように行われているのかを確認することが出来る。
ここでflatを作成し、>キーでオプションのinputを出し、1を与えて外側の括弧を1つ外す。
この状態で試しにchord-seqを作成しinput 1にflatのoutputを代入してみると、コード進行がどのように行われているのかを確認することが出来る。
では次のomloop 4を見てみよう。
左側はそれぞれのコードの並び順を替えている。これは後でメロディ及びコードパートの生成に用いる。
右側はfirstとfifthによってそれぞれI度とV度を抽出している。これはベースラインに常に五度の空虚和音(パワーコード)を与えている。(先ほど説明した通り、ロクリアの場合は和音のオーダーを入れ替えてあるので、短6度が来るようになる。)
さらにom-で2400を与え、2オクターヴ下に下げている。
さらにom-で2400を与え、2オクターヴ下に下げている。
collectは2つ用意する。
eachTimeとfinallyはそれぞれ >キーでオプションのinputを出し、outputを2つ用意し、それぞれのcollectからの出力を繋ぐ。
eachTimeとfinallyはそれぞれ >キーでオプションのinputを出し、outputを2つ用意し、それぞれのcollectからの出力を繋ぐ。
メインパッチに戻ろう。
ここまでは処理の固まりはそれぞれループさせる必要があったので、いくつかのomloopごとに処理がまとまっているが、次はサブパッチを用意してそれぞれの処理をまとめる。
ここでは3つのサブパッチを作成する。それぞれメロディ、コード、ベースを作成し、それぞれchord-seqを経由したのちvoiceにまとめる。
似たような処理ではあるが3つとも微妙に異なる。
似たような処理ではあるが3つとも微妙に異なる。
まずはメロディのサブパッチについて見てみよう。
サブパッチ左上のアイコンをクリックしてinputを用意する。
inputにはomloop 4のoutput 0を繋ぐ。ここにはランダムに並び替えられたコードが来る。
これのfirstを取ってlengthを見ると和音の音数7が入っているはずである。これを元にリズムを生成する。
生成すべき小節数は8*12=96個ある。この8という数は先ほどのコード進行の生成時に、I-x-x-x-x-x-V-Iという並びにしたためにIが2回反復されるので、7より1つ増えているためである。12は最初にarithm-serで作成した0-11までの移調の数である。
この96個分の拍子のそれぞれ分子7と分母8をrepeat-nで繰り返せば良い(ここでは常に7/8とする)。
メロディは常に8分音符を与えることとする。8分音符1個ずつが7個並んでリズムを作成するので、冒頭に7を置き、その後に1を7回繰り返したリストをrepeat-nで作成し、それらをlistでまとめる。このlistの出力結果は (7 (1 1 1 1 1 1 1)) となる。さらにそれをrepeat-nで96回繰り返すが、このrepeat-nによって外側に余計な括弧が1つ増えてしまうため、flatでオプションを出して1を与え、外側の括弧1つ分だけを除去する。
これら3つの出力をpulsemakerに入れる。
voiceを用意し、input 1に繋ぐ。
inputにはomloop 4のoutput 0を繋ぐ。ここにはランダムに並び替えられたコードが来る。
これのfirstを取ってlengthを見ると和音の音数7が入っているはずである。これを元にリズムを生成する。
生成すべき小節数は8*12=96個ある。この8という数は先ほどのコード進行の生成時に、I-x-x-x-x-x-V-Iという並びにしたためにIが2回反復されるので、7より1つ増えているためである。12は最初にarithm-serで作成した0-11までの移調の数である。
この96個分の拍子のそれぞれ分子7と分母8をrepeat-nで繰り返せば良い(ここでは常に7/8とする)。
メロディは常に8分音符を与えることとする。8分音符1個ずつが7個並んでリズムを作成するので、冒頭に7を置き、その後に1を7回繰り返したリストをrepeat-nで作成し、それらをlistでまとめる。このlistの出力結果は (7 (1 1 1 1 1 1 1)) となる。さらにそれをrepeat-nで96回繰り返すが、このrepeat-nによって外側に余計な括弧が1つ増えてしまうため、flatでオプションを出して1を与え、外側の括弧1つ分だけを除去する。
これら3つの出力をpulsemakerに入れる。
voiceを用意し、input 1に繋ぐ。
対して右側は、これまで用いて来たchord-seqと同じ内容である。ここではom+ 1200で1オクターヴ上げている。また後で音色を変更するようにmidiチャンネルに (1) を括弧付きのリストとして与えておこう。
ここでのchord-seqでの情報はchordリストおよびmidiチャンネルの両方が必要であるため、output 0から出力し、voiceのinput 2に入力する。(voiceのinput 2は、chord-seqのoutput 0およびoutput 1のいずれのフォーマットも入力可能である。)
サブパッチ左上のアイコンをクリックしてinputをもう一つ用意し、voiceのinput 3に繋ぐ。
ver. 6.7現在ではサブパッチ内でinputを新たに用意すると、アイコン上では1と表示されるものの、名前の表記は自動的にinput 2となる。これはLISPの0から数える原則に沿っておらず、本チュートリアルの呼称としても紛らわしいので、手動でinput 1に名前を変更しておこう。
ver. 6.7現在ではサブパッチ内でinputを新たに用意すると、アイコン上では1と表示されるものの、名前の表記は自動的にinput 2となる。これはLISPの0から数える原則に沿っておらず、本チュートリアルの呼称としても紛らわしいので、手動でinput 1に名前を変更しておこう。
同じようにサブパッチのoutputを用意し、voiceのoutput 0から繋いで出力する。
では次のサブパッチを見てみよう。ここではコードを生成する。
リズム形成の部分は先ほどとほぼ同じである。コードは1つの和音を8分音符7つ分(二重付点4分音符)伸ばすので、pulsemakerのinput 2にくる3つめのrepeat-nは、ここでは他の2つのrepeat-nと同じように、単純に1を繰り返せば良い。
問題は右側である。ここではom- 1200でiオクターヴ下げたのち、omloop 5に繋いでいる。
実はこのomloopは、画像を見てお分かりの通り、omloop 6との二重ループになっている。
omloop 6の中身を見てみよう。
ここでは前のomloop 4によってランダムソートされたコードが来ている。その各音をlistloopで抽出する。
km-randomでは-1から1までの数、つまり -1 0 1 のいずれかがランダムで出力される。
これにom* 1200およびom+を通すことによって、和音の各音はそれぞれオクターヴ下、変化無し、オクターヴ上のいずれかに置き換えられる。
これによって、教会旋法として与えられた音階そのものの房状和音の各音が「転回」される。つまり和音は常にディアトニック全ての音を含みながら、その全ての音程は上下に様々な幅をもつことになる。
km-randomでは-1から1までの数、つまり -1 0 1 のいずれかがランダムで出力される。
これにom* 1200およびom+を通すことによって、和音の各音はそれぞれオクターヴ下、変化無し、オクターヴ上のいずれかに置き換えられる。
これによって、教会旋法として与えられた音階そのものの房状和音の各音が「転回」される。つまり和音は常にディアトニック全ての音を含みながら、その全ての音程は上下に様々な幅をもつことになる。
このような和音はラヴェル以降さまざまな音楽で見られる。これはポップスやそれに近いニューエイジの音楽シーンにも見られ、日本のここ30年ほどの例で言えば坂本龍一、久石譲、吉松隆のような作曲家たちの作風にも多く見られる響きとなるわけである。
以上がこのコードパートを決定するサブパッチの概要であるが、chord-seqのmidiチャンネルに(2)を与えるのを忘れずに。
ベースラインのサブパッチは、概要としては全く先の2つの例と同じものである。しかしインプットは3つ用意し(先述の通り名前は手動で変更しておくこと)、これのinput 1には先ほどのomloop 4のoutput 1から繋ぐ。
chord-seqのmidiチャンネルには(3)を与える。
chord-seqのmidiチャンネルには(3)を与える。
3つのパッチのそれぞれinput 1(ベースラインはinput 2)には、テンポの数値を入力する。
これら3つのサブパッチをlistでまとめ、最後にpolyのinput 1に繋いで出力する。
このpolyをevaluateするごとに、それぞれのランダムのファンクションが働いて再生結果は変わる。
再生して問題が無ければ、今回のパッチは完成である。
再生して問題が無ければ、今回のパッチは完成である。
ただしせっかく作ったのだから、気に入った出力を保存してみたい。
その前に、気に入った出力があったら、そこでpolyをブロックしておく。これをしないと、後述するsave-as-midiまたはexport-musicxmlをevaluateすると、polyまで再びevaluateされることになり、せっかく気に入った出力が再度のevaluateによって変わってしまうので注意!
保存の方法は2つある。まずはpolyの中身をウィンドウで開いた状態で、メニューのfile > export で midiまたはmusic xmlを選ぶ方法である。これだと確実に出力できる。
他の方法としてはパッチ内に保存用のファンクションを作成してevaluateすることができる。(保存対象のクラスのブロックは必須。)
まずは伝統的なmidiデータとしての保存である。これはsave-as-midiを用いる。input 0にはpolyを、input 1にはファイル名を入力する。
まずは伝統的なmidiデータとしての保存である。これはsave-as-midiを用いる。input 0にはpolyを、input 1にはファイル名を入力する。
この際、unique-pathnameというファンクションを使い、outfileと組み合わせると、より確実である。
input 0にはoutfileを繋げる。input 1には先頭名(プレフィクス)をダブルクォーテーションで囲んだ文字列で、input 2には拡張子(ここではmid)をやはりダブルクォーテーションで囲って入力する。
こうすると、同じファイル名があっても自動的に番号がつけられて別々のファイルとして保存される。
保存先に指定したoutfileの出力先は、ワークスペースのフォルダの中のout-filesが指定される。(これはアプリケーション設定で変更可能である。)
input 0にはoutfileを繋げる。input 1には先頭名(プレフィクス)をダブルクォーテーションで囲んだ文字列で、input 2には拡張子(ここではmid)をやはりダブルクォーテーションで囲って入力する。
こうすると、同じファイル名があっても自動的に番号がつけられて別々のファイルとして保存される。
保存先に指定したoutfileの出力先は、ワークスペースのフォルダの中のout-filesが指定される。(これはアプリケーション設定で変更可能である。)
もう一つはmusic xmlデータとしての保存である。これはexport-musicxmlを用いる。これを使うと、小節線などのpolyのデザインをそのままFinaleやSibeliusで読み込めるようになる。
以前はsave-as-etfというファンクションがあり、これは今でも存在するが、これの出力はFinaleの古い規格であるため、現在はmusic xmlを使う方が推奨される。
以前はsave-as-etfというファンクションがあり、これは今でも存在するが、これの出力はFinaleの古い規格であるため、現在はmusic xmlを使う方が推奨される。
それぞれ出力したファイルをアップロードしておいたので、各自参照して頂きたい。
(ダウンロード時にファイル名が上手く取得できないようなので、手動で改名して下さい)
(ダウンロード時にファイル名が上手く取得できないようなので、手動で改名して下さい)
参照
非公式チュートリアル 前後
添付ファイル
- diatonic1.mid
- diatonic1.xml
- Unofficial-tutorial09-1.png
- Unofficial-tutorial09-10.png
- Unofficial-tutorial09-11.png
- Unofficial-tutorial09-12.png
- Unofficial-tutorial09-13.png
- Unofficial-tutorial09-14.png
- Unofficial-tutorial09-15.png
- Unofficial-tutorial09-2.png
- Unofficial-tutorial09-3.png
- Unofficial-tutorial09-4.png
- Unofficial-tutorial09-5.png
- Unofficial-tutorial09-6.png
- Unofficial-tutorial09-7.png
- Unofficial-tutorial09-8.png
- Unofficial-tutorial09-9.png
- Unofficial-tutorial09.png