先月は、Sonic PiでMinecraftのコーディングの素晴らしい世界に小旅行しましたが、また音楽的なものに戻りましょう。今日は、コードの凄い力を使って、クラシックのオペラ作品を21世紀に持ち込んでみましょう。
タイムマシンに乗って1875年に遡ってみましょう。ビゼーという作曲家が、彼の最後のオペラ作品となるカルメンを書き上げました。不運なことに、その作品は、多くの刺激的で破壊的な新しい音楽作品と同じように、あまりに奇抜でまた普通でないために、当初人々には全く好かれませんでした。そして残念なことに、その作品が国際的に多大な成功を収め、歴史上、最も有名で頻繁に公演されるオペラの1つになる10年前にビゼーは亡くなってしまいました。この悲劇に共感して、カルメンのメインテーマの1つを取り上げ、現代を生きる多くの人々にとって、あまりに奇抜でまた普通でない形式の音楽 - ライブコーディングされた音楽に変換してみましょう!
このチュートリアルでカルメンの全体をライブコーディングしようとするのは少し難しいので、最も有名な部分 - ハバネラのベースラインに着目しましょう。
もしあなたが楽譜について学んでいなかったら、これは全く読めないでしょう。しかし、プログラマとして楽譜を見ると、それはプログラミングコードの別な形式と捉えることができます。つまり楽譜は、コンピュータの代わりに演奏者に対する指示を表していると言えます。したがって我々は楽譜を解読する方法を理解する必要があります。
音符は、左から右に、ちょうどこの雑誌の単語と同じように並んでいますが、それぞれ異なる高さの位置を持っています。楽譜上の高さは、音符のピッチ(音程)を表しています。 つまり、楽譜上高い位置にあるものほど、音符のピッチは高くなります。
Sonic Piでのピッチの変更方法は既に知っているはずです。play 75
やplay 80
といったように数値を使ったり、play :E
やplay :F
といったように音名を使ったりできます。楽譜の上下の位置は、それぞれ特定の音名を表しています。便利な対応表を見てみましょう。
楽譜はとても表現力豊かなコードで、多くのことを伝達できます。したがって、楽譜がどの音符を演奏するかについてのみならず、音符をいつ演奏しないかについて伝達していても、それほど驚くことではないでしょう。これは、プログラミングにおいてはnil
とかnull
(値の無いこと)と同じ考え方です。言い換えると、音符を演奏しないことは、音符が無いことに似ていると言えるでしょう。
楽譜をよく見ると、演奏する音符を表す点と線の記号と、休符を表す曲がりくねった記号との組合せであることが分かると思います。Sonic Piにはとても便利な休符の表現として:r
が用意されていて、play :r
を実行するとSonic Piは無音を演奏するのです! これはまた、play :rest
やplay nil
やplay false
とも書くことができ、これらはみな休符を表す同じ方法です。
楽譜を解読するのに学習する最後の内容は、音符のタイミングです。元の楽譜では、音符同士を繋げる細い線、連桁(beam)と呼ばれているものを見ることができるでしょう。2つ目の音符では2つの連桁があり、これは16分の1拍だけ音が持続することを意味しています。その他の音符は1つの連桁を持っていて、それは8分の1拍だけ音が持続することを意味しています。休符は2つの曲がりくねった連桁を持っていて、これもまた16分の1拍を表しています。
新しいことを探索したり解読したりするときに役立つコツは、全てを可能な限り似たものにし、それらの関係やパターンを見出すことです。たとえば、元の楽譜を純粋に16分で記述し直すと、音符と休符の良い感じのシークエンスに変わるでしょう。
ハバネラのベースラインをSonic Piに翻訳する準備ができました。音符と休符をリングにコード化しましょう。
(ring :d, :r, :r, :a, :f5, :r, :a, :r)
どんな音がするか聞いてみましょう。ライブループに入れて、チックでリングを循環するようにしましょう。
live_loop :habanera do
play (ring :d, :r, :r, :a, :f5, :r, :a, :r).tick
sleep 0.25
end
すばらしい。スピーカーから一瞬でそれと分かるリフが活動的に鳴り始めたと思います。ここまで辿り着くのに多くの苦労がありましたが、その価値はありました。やったね!
ベースラインが出来たので、オペラのシーンの背景音を再生成してみましょう。試してみるシンセの1つは、:blade
です。これは、80年代スタイルのムーディーなリードシンセです。そのシンセを:d
の音で開始し、スライサーとリバーブに渡すようにしてみましょう。
live_loop :habanera do
use_synth :fm
use_transpose -12
play (ring :d, :r, :r, :a, :f5, :r, :a, :r).tick
sleep 0.25
end
with_fx :reverb do
live_loop :space_light do
with_fx :slicer, phase: 0.25 do
synth :blade, note: :d, release: 8, cutoff: 100, amp: 2
end
sleep 8
end
end
では、ベースラインの:a
と:f5
を他の音に変えてみてください。注意すべきは、Stop
を叩く必要はないということです。音楽が演奏されている最中に、だたコードを変更してRun
を再度叩いてください。そして、スライサーのphase:
オプションを、0.5
や0.75
や1
といった異なる値にしてみてください。
最後に全てのアイデアを組合せて、ハバネラの新しいリミックスを作ってみましょう。もう1つのベースラインがコメントアウトされていることに気が付いたかもしれません。新しいBufferにこれらをタイプしたら、Run
を叩いて曲を聞いてみてください。そして、Stop
を叩かずに、2行目のベースラインをコメントを解除して、#
を削除し、Run
を再度叩いてみてください。なんと凄いのでしょう! では、あなた自身でこのコードを弄って楽しんでください。
use_debug false
bizet_bass = (ring :d, :r, :r, :a, :f5, :r, :a, :r)
#bizet_bass = (ring :d, :r, :r, :Bb, :g5, :r, :Bb, :r)
with_fx :reverb, room: 1, mix: 0.3 do
live_loop :bizet do
with_fx :slicer, phase: 0.125 do
synth :blade, note: :d4, release: 8,
cutoff: 100, amp: 1.5
end
16.times do
tick
play bizet_bass.look, release: 0.1
play bizet_bass.look - 12, release: 0.3
sleep 0.125
end
end
end
live_loop :ind do
sample :loop_industrial, beat_stretch: 1,
cutoff: 100, rate: 1
sleep 1
end
live_loop :drums do
sample :bd_haus, cutoff: 110
synth :beep, note: 49, attack: 0,
release: 0.1
sleep 0.5
end