Sonic Piで東方アレンジを作ってみた

98件のシェア(ちょっぴり話題の記事)

はじめに

突然ですが、皆さんはシューティングゲームが好きですか?私は好きです。大好きです。

シューティングゲームで最も記憶に残る瞬間はどこでしょう?

  • 「スターフォックス」で味方を助けてあげた場面?
  • 「ツインビー」で画面内の複数ベルをうまくパワーアップにできたとき?
  • 「エースコンバット」で徐々に名声が上がっていくところ?
  • 「グラディウス」でフルパワーアップしたとき?
  • 「Wolfenstein」で憎き悪人にトドメを刺すシーン?
  • 「東方妖々夢」の反魂蝶?
  • 「メタルギア」で間一髪敵を巻けた瞬間?
  • 「Hellsinker.」のめっちゃかっこいいWARNING画面?
  • 「バトルフィールド」で野良分隊だけどチームワークを感じられた瞬間?
  • 「ダライアスバースト」で捕鯨できたとき?
  • 「Titanfall」で一番早くタイタンを呼べた場面?
  • 「斑鳩」で完全に思い通りにパターンがキマったとき?

どれも素晴らしいゲームであり、いずれも他には代えがたい瞬間であります。

しかしながら、私の考えるシューティングゲームにおける最高の体験というのは、「音楽と場面がマッチしている」瞬間に他ならないと考えています。

例を以下に挙げます。

  • 「ナイトストライカー」のSTAGE Aに入る場面があります。説明不要ですね。
  • 「RefRain ~prism memories~」の2面も素晴らしいです。まずイントロであり、2面の表示が出るところであり、中ボスが登場する場面がとても音楽と合っています。
  • 「妖精大戦争」の3面で曲が1ループしてイントロからメロディに入る「テ・テ・テ・テ」というところでボスが出てくるシーンもなかなかいいです。
  • 「Undertale」の『とあるボス』の音楽はイントロからギターが入る瞬間、画面の演出と非常に合っていると思いませんか?

こういった音楽と場面の演出の合わせ技の境地が、「Rez」や「SPACE INVADERS EXTREME」であります。どちらも非常に素晴らしいゲームです。

さて、どのゲームも甲乙付けがたいですが、私の中で最も好きな場面を言うと、

「東方永夜抄」4面道中のBGM「永夜の報い」が一区切りついたところで、竹やぶを抜けて満月とボスが出てくる場面です。

特に有名でもないし、演出がすごく凝ってるというわけでもないですが、楽曲と展開も相まって最も記憶に残っており、またプレイするたびにいいなあと思う箇所であります。

というわけで前置きが長くなりましたが、この記事では「永夜の報い」のアレンジを作っていきたいと思います。

Sonic Piとは

単にアレンジを作るのでは面白くないので、Sonic Piを使って楽曲を作っていきましょう。

Sonic Piは、Rubyのプログラムコードによって音を鳴らして、曲が作れるシステムになります。

https://sonic-pi.net/

「The Live Coding Music Synth for Everyone」という説明通り、プログラムを書いたことがない人でも、簡単に曲が作れるように設計されているようです。

Sonic Piには日本語に翻訳されたチュートリアルも付属しており、それを見る限り確かにプログラミングにあまり精通していない人でも、チュートリアルを見ながら書けそうに思いました。

YoutTubeなどで見る限りでは、コード全体そのままで1曲とするよりかは、どんどんコードを書き換えてその都度評価していって、曲としていくというのが主流のようです。

プログラマのための音楽制作

では、Developers.IOを見てくれているおそらく大半の方、あるいは私のような、プログラミングはいくらかわかるけれど音楽制作についてはさっぱり、という人にはどうなのでしょう?

結論から言うと、それなりに楽しめながら、音を鳴らすことができます。

論より証拠でしょう、以下が私の作った「永夜の報い」アレンジです。

use_bpm 110

main_theme = [:c4, :f4, :g4, :bb4, :g4, :f4]*2 + [:d4, :eb4, :d4, :b3]
melo1_0 = [:gs5, :c5, :g5, :as4, :f5, :gs4]
melo1_1 = [:ds5, :g4, :gs4, :as4, :ds4, :as4, :gs4, :gs4, :ds4, :e4, :f4, :f4]
melo1_2 = [:as4, :ds5, :f5, :c5, :f5, :g5, :g5, :gs5]
melo1 = melo1_0 + melo1_1 + melo1_0 + melo1_2

live_loop :drums do
  ##| stop
  sample :drum_bass_hard
  sleep 1
  sample :drum_snare_hard, amp: 0.75
  sleep 1
end

live_loop :hihat do
  ##| stop
  sync :drums
  sample :drum_cymbal_closed, amp: 0.5
  sleep 0.25
end

live_loop :bass do
  stop
  ##| sync :drums
  use_synth :chipbass
  play_pattern_timed main_theme.take(4), [0.25], pitch: -24, amp: 0.5
end

live_loop :intro do
  stop
  ##| sync :drums
  use_synth :tech_saws
  play_pattern_timed main_theme, [0.25], amp: 0.5
end

live_loop :melo do
  stop
  sync :drums
  use_synth :zawa
  play_pattern_timed melo1, [0.5]*6+[0.25]*12+[0.5]*6+[0.25]*8, amp: 0.5, release: 3
end

上海アリス幻樂団「東方永夜抄 〜 Imperishable Night.」より「永夜の報い ~ Imperishable Night.」

明らかに途中ですし、4分の11拍子ではないのでズレていってるし、せっかくプログラマブルに色々できるのに何もしていないし、おそらくもっともっとうまくSonic Piを操る方法があると思います。

しかし…しかしながら…、これは明らかに「永夜の報い」です!少なくとも私にはそう聞こえます。

私は音楽制作の経験がありませんでしたが、Sonic Piのチュートリアルを行いながら、約1日でここまで仕上げられました。

コードはほぼRubyでそのまま書けるので、プログラマの方には特に説明はいらないかと思います。私はRubyをメインで使ったことはそんなにありませんでしたが、曲を書く時にRubyの機能をゴリゴリ使ったりするのはあまりないかと思うので、何かプログラムを書ける方であればすぐとっつけるかと思います。

特に複雑なことはしておらず、あとは非常にわかりやすいチュートリアルとドキュメントにすべて載っているので、そちらを参考にしてみてください。

おわりに

やってみた感想として、音楽制作はやはり難しいと思いましたが、その中にも喜びがあるというのを少し感じられました。

はじめは全く別な感じのを想定して作り始めましたが、最初から入っているサンプル音源もシンセも少ないし、それを思い通りの音にするというのも、かなり難しいことがわかりました。チュートリアルに書かれているADSRなどをいじりながらもっと鳴らしてみて、頭でちゃんと理解すれば、思い通りに音を出せるのかもわかりません。

そういった中で喜びを感じられたのは、全くのミスや偶然から、いい感じの音が出せたときにありました。

Sonic Piのチュートリアル内でも、「間違いはない、あるのはただ可能性だけ」との文言がありますが、まさにこの通りかと思います。

コードにより音楽を紡ぎ出す、というのは非常に興味深かったです。

ゴールデンウィークの自由研究にどうでしょうか、皆さんもぜひ試してみてください。