前回ストリングスの実装をしました。楽器もそろったのでカノンを完成させたいと思います。
曲の分析と実装内容
今回はソースが長くなってしまったのでJavaのソースは記載しません。興味があればこちらをみてください。
曲の構成から決まるもの
カノンとは曲の形式を表す言葉で一つの旋律を他のパートが時間を遅らせて同じように演奏するものです。この主旋律をdux「導くもの」、遅れて演奏されるパートをcomes「同行するもの」と呼びます。この曲では二つのcomesがあります。
通奏低音のパートは2小節を一つの周期として延々と同じように繰り返されます。曲全体で28回、56小節繰り返され57小節目で終わります。
二つのcomesはそれぞれ2小節、4小節遅れて始まります。それぞれ遅れて始まるものの最後は一緒に終わるので一つ目のcomesは最後の2小節、二つ目は4小節省略されます。
これらのことからおよそ以下のような実装内容が決まります。
- 通奏低音のパートは繰り返しを28回行うfor文の中に記述される。
- 旋律はメソッド化されduxと二つのcomesの演奏時に呼び出される。
- 旋律用のメソッドはパートにより終了の仕方を変更する。
この3つ目の実装は以下のようにします。
メソッドにはインデックスをつけどのパートかわかるようにしておきます。duxは0、comesはそれぞれ1と2にします。
public static void playViolin(Player violin, int index)
通常の演奏ではインデックスは参照しませんが終了部で分岐させます。
if(index == 2){ //二つ目のcomesの終了処理 }else{ //duxと一つ目のcomesの演奏、2小節 if(index == 1){ //一つ目のcomesの終了処理 }else{ //duxの演奏、2小節 //duxの終了処理 } }
通奏低音については以前その部分だけ演奏することができているのでそのまま使います。
パッヘルベルのカノンと通奏低音(1)
パッヘルベルのカノンと通奏低音(2)
パッヘルベルのカノンと通奏低音(3)
音色について
通常は3つのバイオリンのパートで演奏されるのですが実際に鳴らしてみたところ音が混ざってしまいパニングして左右に振り分けても3つのパートを判別するのが困難になってしまいました。おそらく別々な場所にいることを表現するようなエフェクトがかかっていないためと思われます。
とりあえずの解決策としてcomesは最初に作った音色を変えました。
以下パニングを決めます。
- duxは中央0.5に設定する
- 一つ目のcomesは右寄り0.2にする
- 二つ目のcomesは左寄り0.8にする
- 通奏低音の低音部は中央少し左寄り0.6にする
- 通奏低音の和音部は中央少し右寄り0.4にする
音量は全体をみて適宜調整します。
曲想に従い決めるもの
元の譜面ではテンポの指定はありませんがおおよそ以下のように決めます。
- BPMは全体を通して43にする
- 最終小節の一つ前は遅くなるようにして最小BPM10にする
- 最終小節は25にする
あと通奏低音が延々と続くため単調になってしまうため一部休止する箇所をつけました。duxが速いパッセージを演奏し終わる部分です。通奏低音の繰り返しに一つ分岐を入れておきます。
for (int i = 0; i < 28; i++) { if(i == 11){ //2小節分の休止処理 continue; } //通常の演奏処理 }
演奏結果
では演奏結果です。オプティマイズもしたので曲の作成処理は90秒ほどで終わりました。
前回のバッハのプレリュードより複雑な曲を作ることができました。