SlideShare une entreprise Scribd logo
1  sur  39
Geekdrums/MusicEngine
を使った超速音楽同期ゲーム制作
まずはADX使わない版から
ADX版との違いは最後に解説します
採用事例(Unity+MusicEngine)
という名の宣伝
VOXQUARTER(仮題)
http://voxquest.tumblr.com/
鋭意開発中。MusicEngineForADXを利用。
MusicPong
http://unitygameuploader.jpn.org/game/1233.html
MusicEngineのサンプルとして付属
Space to go
http://www.ludumdare.com/compo/ludum-dare-29/?action=preview&uid=25923
LudumDare #29 オーディオ部門で1位獲得
ゲーム制作は速さが命
神ゲーだと思い込んでいる内に作り上げろ
本題
ということで、ライブラリを使おう(OR作ろう)
MusicEngineとは
Unity用スクリプト「Music.cs」のこと。 これだけ→
できること
「今何小節目の何拍目のどこ?」が簡単に取得できる
「音楽のここに合わせてこう動かして!」が簡単にできる
できないこと
波形に反応してかっこよく動かして!→vjkitとか使ってください
ゲームに合わせて音楽を変化させたい!→ADX2LEとか使ってください
「音楽に合わせたゲーム」
なら
めっちゃ速く作れる
サラマンダーより、ずっとはやい
早速ダウンロード
https://github.com/geekdrums/MusicEngine
Exampleの中にMusicPongがプロジェクトごと入ってます。
Music.csだけでもOK。
前提
音楽は自分で用意(orテンポや拍子は自分で調べる)
• 自動検出なんて、あるわけない
音楽はいつも1つ
• Music.○○という感じで、コードのどこからでもstaticな音楽情報にアクセスできる
• クロスフェードは甘え(そのうち実装するかも)
16分音符(※)=1mt がすべての基準
• Music.MusicalTimeは16分音符の長さを1.0としている
• ※3連符や8分音符など、任意の基準に(曲中でも)変更可能
MusicPongの作り方
Music Pong | UnityGameUploader
http://unitygameuploader.jpn.org/game/1233.html
企画
「よし、Pongまだ作ってないから次はMusicPongだな」
Pongを作る
ぽんっと
音楽を作る
さくっと(3日経過)
あと5ステップくらいで完成
はやい(確信)
Step1.Musicコンポーネントをつける
AudioSourceをつけたオブジェクトにMusic.csを追加。
自動的にデフォルトのセクション情報
(16分音符で4拍子、テンポ120)が挿入されます。
Note:
複数の曲を使う場合は、Music.Play( “name” )で曲を変更。
1サンプル目から曲が始まらない場合のみDelayTimeSamplesを指定。
Sections内のStartTimeSamplesは自動計算されます。
Tips1: Timing & Section
class Timing
• int bar; //何小節目の
• int beat; //何拍目の
• int unit; //16分音符何個目
Note: (0,0,0)からスタート。4拍子で16分音符で4小節の曲の最後は (3,3,3) になる。
class Music.Section
• int mtBeat_=4; //何mtで1拍とするか
• int mtBar_=16; //何mtで1小節とするか
• int Tempo_=120; //テンポ(=拍数/1分)
Note: 例えば7拍子を使いたい場合は、mtBeat=4ならmtBar=14にすれば良い。
準備完了。
システムオールグリーン
Step2.とりあえずクオンタイズする
 Music.QuantizePlay( AudioSource source, int transpose = 0 );
• 自動的にmt(=16分音符)に合わせて再生される。
• transposeは1で半音、12で1オクターブ。
↓Ball.csにて。壁やパドルの反射音をクオンタイズ&音程変更
クオンタイズ+音程。
これだけで気持ちいい
めっちゃ楽
Step3.音楽に合わせて演出する
Music.IsJustChangedBar()/...Beat()/...At(Timing)
小節ごと/拍ごと/任意のタイミングに来たフレームだけtrueになる
Field.csにて➔
背景色を切り替え
Music.isJustChanged
16分音符ごとに1フレームずつtrueになる Ball.csにて➔
ビーム時にボールを停止
かっこいい演出完成。
背景色変えるのはオススメ
Tips2: Just & Now
Music.Just : 拍がちょうどに来てから切り替わる
Music.Now : 「最も近い拍」を示すように(拍と拍の間で)切り替わる
Note: 何か「この拍になる直前に処理しておきたい!」という時とかにIsNowChanged系を使うと便利。
Step4.音楽に合わせてアニメーション
Music.MusicalTime / MusicalTimeFrom(Timing)
mt基準の時間を浮動小数で取得
↓Padddle.csにて。最初のバーが現れる演出
↓Beam.csにて。shotTimingに合わせてアニメーション。
Music.Seek(Timing) / SeekToSection(string name)
音楽の好きな箇所にシークすることができる。
Ball.csにて➔
ゲームオーバー判定
Music.CurrentSection
現在のセクション情報を取得
Field.csにて➔
セクションを状態遷移判定に使う
Step5.音楽に合わせてシーン遷移する
できた。
パーフェクトプレイするのめっちゃむずい
普通に作るより楽。
音楽がマスタータイマーになってくれる
Tips3: DebugText
インスペクタで設定→
現在のタイミング(0小節目の3拍目の3mt) 現在の音楽時間(1小節で16)
現在のセクション。0番目の”Start”セクションで、(0,0,0)から始まり、テンポは128
Note:音楽を途中で止めたりピッチ(再生速度)変えたりしても大丈夫。
その他の機能とか
Music.isFormerHalf //1mtの前半後半で切り替わる。Blinkアニメなどにも使える
Music.lagUnit //一番近いタイミングとの誤差を-0.5~0.5で返す。音ゲーなどに?
Music.IsJustChangedWhen(Predicate) //デリゲートを使って好きなタイミングを抽出できる
Timing operator < //if(Music.Just < timing)などで時間を比較できる(後の方が大きい)
Timing operator - // Music.Just – timing などで音楽時間を測れる。
ADX2LEと一緒に使う
真にインタラクティブな音楽のために
ダウンロード
https://github.com/geekdrums/MusicEngineForADX
サンプルは無いですごめんなさい。APIはUnity版と「だいたい」同じ(違いは後述)。
2014/7現在、ADX2LEをUnityで使うにはUnityProが必要です。
ADX2LEをUnityで使う方法は各自調べてください(既に使っている人向けに書きます)。
http://www.adx2le.com/download/index.html
ADX2LEを合わせて使う時の前提1
複雑な音楽の遷移や変化を織り交ぜるため、曲にはいくつか制限をつける。
• 1曲の中ではテンポ変更は無し、拍子変更も無し
• 曲にはブロックを1つ以上作る
• 必ずブロックぴったりで止まるキューを一番上のトラックに配置※
※ADX2LEのGetNumPlayedSamplesの仕様で、再生されているデータの中で最初に見つかったデータの現在のサンプ
ル数が返されるため。
ADX2LEを合わせて使う時の前提2
当たり前だけど、UnityのAudioSourceではなく
Cri Atom SourceをつけたオブジェクトにMusicをつける。
オブジェクト名は、CueNameと同じにしておくといいことがある
(後述するブロック情報の自動インポートが使える)。
テンポ変更などが無いので、mtBeat, mtBar, Tempoは
1曲につき1つずつのみ指定。
ブロックの名前と小節数をそれぞれ入力する必要がある。
Unity版との違い
(ADXの機能で)ブロック再生が Music.SettNextBlock( blockName or index ) で使える
• 曲をブロックという単位で分けて、ブロック間をサンプルレベルで音楽に同期させて遷移できる。
(ADXの機能で)Aisacが Music.SetAisac( index, value ) を呼び出すことで操作可能
• トラックごとの様々なパラメータを1つの値で同時に変化させることができる。
ブロック名を指定して途中から再生開始 Music.Play( MusicName, firstBlockName ) が可能
セクションという概念が無い(ブロックが変化するだけ)。
タイミングはすべてブロック中で何小節目か、を指す
• 例えば、introブロックの最初も次のブロックの最初も、Music.CurrentBlockが違うだけで
タイミングはどちらも(0,0,0)になる。
Seek関数が使えない(ブロック再生を使おう)。
おまじないの追加(必須)
Music.csの先頭のNoteにあるとおり
これが無いとコンパイル通らないので注意。
詳しくは以下を参照
http://www53.atwiki.jp/soundtasukeai/pages/22.html#id_6c095b2d
おまじないの追加(必要であれば)
Music.csの先頭から2番めのNoteにある通り
この関数をEditor/CriWare/CriAtom/CriAtomWindow.csに追加して、
Update Assets of CRI Atom Craftボタンを押すときの関数内から呼び出すと、
キュー名と同じ名前を持つMusicコンポーネントに
ブロックの情報が自動で反映されます。
おしまい

Contenu connexe

Tendances

Unity 3D game engine seminar
Unity 3D game engine  seminarUnity 3D game engine  seminar
Unity 3D game engine seminar
NikhilThorat15
 
UE5制作事例 “The Market of Light” ~Nanite/Lumenへの挑戦~
UE5制作事例 “The Market of Light” ~Nanite/Lumenへの挑戦~UE5制作事例 “The Market of Light” ~Nanite/Lumenへの挑戦~
UE5制作事例 “The Market of Light” ~Nanite/Lumenへの挑戦~
historia_Inc
 

Tendances (20)

CEDEC2016 「コントラスト」で考えるゲームデザイン・レベルデザイン
CEDEC2016 「コントラスト」で考えるゲームデザイン・レベルデザインCEDEC2016 「コントラスト」で考えるゲームデザイン・レベルデザイン
CEDEC2016 「コントラスト」で考えるゲームデザイン・レベルデザイン
 
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
【Unite Tokyo 2019】〈七つの大罪〉をゲームで!高品質グラフィックを具現化するための技法と開発最適化のご紹介
 
Unity 3D game engine seminar
Unity 3D game engine  seminarUnity 3D game engine  seminar
Unity 3D game engine seminar
 
ビジュアルスクリプティングで始めるUnity入門1日目 プレイヤーを動かそう
ビジュアルスクリプティングで始めるUnity入門1日目 プレイヤーを動かそうビジュアルスクリプティングで始めるUnity入門1日目 プレイヤーを動かそう
ビジュアルスクリプティングで始めるUnity入門1日目 プレイヤーを動かそう
 
【Unity道場】新しいPrefabワークフロー入門
【Unity道場】新しいPrefabワークフロー入門【Unity道場】新しいPrefabワークフロー入門
【Unity道場】新しいPrefabワークフロー入門
 
【Unity道場教育スペシャル】Cinemachineで教えるゲームの3つの大切なこと
【Unity道場教育スペシャル】Cinemachineで教えるゲームの3つの大切なこと【Unity道場教育スペシャル】Cinemachineで教えるゲームの3つの大切なこと
【Unity道場教育スペシャル】Cinemachineで教えるゲームの3つの大切なこと
 
ゲームデザイナーのためのキャラクター表現&コンセプトメイキング:抜粋版
ゲームデザイナーのためのキャラクター表現&コンセプトメイキング:抜粋版ゲームデザイナーのためのキャラクター表現&コンセプトメイキング:抜粋版
ゲームデザイナーのためのキャラクター表現&コンセプトメイキング:抜粋版
 
UnityのクラッシュをBacktraceでデバッグしよう!
UnityのクラッシュをBacktraceでデバッグしよう!UnityのクラッシュをBacktraceでデバッグしよう!
UnityのクラッシュをBacktraceでデバッグしよう!
 
Unityで音ゲーをつくる
Unityで音ゲーをつくるUnityで音ゲーをつくる
Unityで音ゲーをつくる
 
Unity introduction for programmers
Unity introduction for programmersUnity introduction for programmers
Unity introduction for programmers
 
若輩エンジニアから見たUniRxを利用したゲーム開発
若輩エンジニアから見たUniRxを利用したゲーム開発若輩エンジニアから見たUniRxを利用したゲーム開発
若輩エンジニアから見たUniRxを利用したゲーム開発
 
Cinemachineで見下ろし視点のカメラを作る
Cinemachineで見下ろし視点のカメラを作るCinemachineで見下ろし視点のカメラを作る
Cinemachineで見下ろし視点のカメラを作る
 
"有翼のフロイライン Wing of Darkness"と歩むUE4の世界
"有翼のフロイライン Wing of Darkness"と歩むUE4の世界"有翼のフロイライン Wing of Darkness"と歩むUE4の世界
"有翼のフロイライン Wing of Darkness"と歩むUE4の世界
 
Unity2018/2019における最適化事情
Unity2018/2019における最適化事情Unity2018/2019における最適化事情
Unity2018/2019における最適化事情
 
Unite2017 tokyo toonshadermaniax
Unite2017 tokyo toonshadermaniaxUnite2017 tokyo toonshadermaniax
Unite2017 tokyo toonshadermaniax
 
UE4で作成するUIと最適化手法
UE4で作成するUIと最適化手法UE4で作成するUIと最適化手法
UE4で作成するUIと最適化手法
 
UE5制作事例 “The Market of Light” ~Nanite/Lumenへの挑戦~
UE5制作事例 “The Market of Light” ~Nanite/Lumenへの挑戦~UE5制作事例 “The Market of Light” ~Nanite/Lumenへの挑戦~
UE5制作事例 “The Market of Light” ~Nanite/Lumenへの挑戦~
 
【Unite Tokyo 2018】ユニティちゃんトゥーンシェーダー2.0使いこなしスペシャル ~こだわりの活用法を紹介します!~
【Unite Tokyo 2018】ユニティちゃんトゥーンシェーダー2.0使いこなしスペシャル ~こだわりの活用法を紹介します!~【Unite Tokyo 2018】ユニティちゃんトゥーンシェーダー2.0使いこなしスペシャル ~こだわりの活用法を紹介します!~
【Unite Tokyo 2018】ユニティちゃんトゥーンシェーダー2.0使いこなしスペシャル ~こだわりの活用法を紹介します!~
 
【Unite Tokyo 2018】Audio機能の基礎と実装テクニック
【Unite Tokyo 2018】Audio機能の基礎と実装テクニック【Unite Tokyo 2018】Audio機能の基礎と実装テクニック
【Unite Tokyo 2018】Audio機能の基礎と実装テクニック
 
CEDEC2017 アーティストのためのリアルタイムシェーダー学習法
CEDEC2017 アーティストのためのリアルタイムシェーダー学習法CEDEC2017 アーティストのためのリアルタイムシェーダー学習法
CEDEC2017 アーティストのためのリアルタイムシェーダー学習法
 

Plus de Sho Iwamoto

ゲームデザインを改善/批評するための時間構造モデル「ワンダールクス」
ゲームデザインを改善/批評するための時間構造モデル「ワンダールクス」ゲームデザインを改善/批評するための時間構造モデル「ワンダールクス」
ゲームデザインを改善/批評するための時間構造モデル「ワンダールクス」
Sho Iwamoto
 
ゲームにおけるインタラクションのための音楽技術「MAGI」~瞬間、波形、重ねて~
ゲームにおけるインタラクションのための音楽技術「MAGI」~瞬間、波形、重ねて~ゲームにおけるインタラクションのための音楽技術「MAGI」~瞬間、波形、重ねて~
ゲームにおけるインタラクションのための音楽技術「MAGI」~瞬間、波形、重ねて~
Sho Iwamoto
 
About musicengine
About musicengineAbout musicengine
About musicengine
Sho Iwamoto
 
TeamVOXについて(BitSummit2014用メディアキット)
TeamVOXについて(BitSummit2014用メディアキット)TeamVOXについて(BitSummit2014用メディアキット)
TeamVOXについて(BitSummit2014用メディアキット)
Sho Iwamoto
 
インタラクティブミュージック研究会
インタラクティブミュージック研究会インタラクティブミュージック研究会
インタラクティブミュージック研究会
Sho Iwamoto
 

Plus de Sho Iwamoto (20)

重い音楽と軽い音楽 欧米と日本のゲーム音楽の違いについて
重い音楽と軽い音楽 欧米と日本のゲーム音楽の違いについて重い音楽と軽い音楽 欧米と日本のゲーム音楽の違いについて
重い音楽と軽い音楽 欧米と日本のゲーム音楽の違いについて
 
ScrapBoxについて - インタラクティブミュージック発表会2018
ScrapBoxについて - インタラクティブミュージック発表会2018ScrapBoxについて - インタラクティブミュージック発表会2018
ScrapBoxについて - インタラクティブミュージック発表会2018
 
インタラクティブミュージック発表会2018
インタラクティブミュージック発表会2018インタラクティブミュージック発表会2018
インタラクティブミュージック発表会2018
 
ゲームデザインを改善/批評するための時間構造モデル「ワンダールクス」
ゲームデザインを改善/批評するための時間構造モデル「ワンダールクス」ゲームデザインを改善/批評するための時間構造モデル「ワンダールクス」
ゲームデザインを改善/批評するための時間構造モデル「ワンダールクス」
 
SIG-Audio #14 GDC Audio報告会「最先端のInteractive Musicとその未来」
SIG-Audio #14 GDC Audio報告会「最先端のInteractive Musicとその未来」SIG-Audio #14 GDC Audio報告会「最先端のInteractive Musicとその未来」
SIG-Audio #14 GDC Audio報告会「最先端のInteractive Musicとその未来」
 
GDC2017 SIG-Audio報告会 番外編:サンフランシスコの朝食について
GDC2017 SIG-Audio報告会 番外編:サンフランシスコの朝食についてGDC2017 SIG-Audio報告会 番外編:サンフランシスコの朝食について
GDC2017 SIG-Audio報告会 番外編:サンフランシスコの朝食について
 
GDC2017 - Epic AND Interactive Music in 'Final Fantasy XV'
GDC2017 - Epic AND Interactive Music in 'Final Fantasy XV'GDC2017 - Epic AND Interactive Music in 'Final Fantasy XV'
GDC2017 - Epic AND Interactive Music in 'Final Fantasy XV'
 
ゲームにおけるインタラクションのための音楽技術「MAGI」~瞬間、波形、重ねて~
ゲームにおけるインタラクションのための音楽技術「MAGI」~瞬間、波形、重ねて~ゲームにおけるインタラクションのための音楽技術「MAGI」~瞬間、波形、重ねて~
ゲームにおけるインタラクションのための音楽技術「MAGI」~瞬間、波形、重ねて~
 
MusicEngine for Unity 2015/5/5 Update
MusicEngine for Unity 2015/5/5 UpdateMusicEngine for Unity 2015/5/5 Update
MusicEngine for Unity 2015/5/5 Update
 
MusicEngine for Unity/ADX2LE(English)
MusicEngine for Unity/ADX2LE(English)MusicEngine for Unity/ADX2LE(English)
MusicEngine for Unity/ADX2LE(English)
 
GDCスカラーシップに応募しよう!
GDCスカラーシップに応募しよう!GDCスカラーシップに応募しよう!
GDCスカラーシップに応募しよう!
 
GCS2014 Kawaz
GCS2014 KawazGCS2014 Kawaz
GCS2014 Kawaz
 
LudumDare
LudumDareLudumDare
LudumDare
 
About musicengine
About musicengineAbout musicengine
About musicengine
 
LudumDareとは
LudumDareとはLudumDareとは
LudumDareとは
 
About TeamVOX(for BitSummit2014)
About TeamVOX(for BitSummit2014)About TeamVOX(for BitSummit2014)
About TeamVOX(for BitSummit2014)
 
TeamVOXについて(BitSummit2014用メディアキット)
TeamVOXについて(BitSummit2014用メディアキット)TeamVOXについて(BitSummit2014用メディアキット)
TeamVOXについて(BitSummit2014用メディアキット)
 
インタラクティブミュージック研究会
インタラクティブミュージック研究会インタラクティブミュージック研究会
インタラクティブミュージック研究会
 
Gcs2013 im研
Gcs2013 im研Gcs2013 im研
Gcs2013 im研
 
project VQ3
project VQ3project VQ3
project VQ3
 

Music engineadx

Notes de l'éditeur

  1. さて、いよいよ僕が新しい音楽ゲームを生み出し続けている力の源と言えるこのMusicEngineについて、紹介させていただきます。 Geekdrumsともうします、よろしくお願いします。 まぁ、主にプログラマ向けの内容になりますが、こういったゲームを作る上での工夫とかも紹介していきますので、参考にしていただければと思います。
  2. で、解説に入る前にまずは、このエンジンで一体どんなことができるか、採用事例を紹介していきたいと思います。 このエンジン自体は古くはXNAの頃から開発していたものなんですが、現在はUnityに移植して長年使っているという感じで、 今から紹介するのはすべてUnityとこのエンジンを使って開発しています。
  3. まずはオクス。クオーターは仮タイトルでまだ正式タイトルが未定なんですが、鋭意開発中です。 これはCRIさんのADX2LEも組み込んで使わせて頂いています。 実はこのエンジン、Unity版とADX版あるんですが、前は1つのコードにしていたんですが整理する過程でやっぱり2つに分けたので、ADX版は近日公開予定です。 中身はほとんど同じ機能ですが、それにプラスしてADXの機能もアクセスしやすいように、という風になっています。
  4. そして本日解説する予定のMusicPong。 こちらはプロジェクトファイルごと全部MusicEngineのサンプルの中に入っていますので、どなたでもご覧いただけます。 ちなみに、使っている素材は音楽1つと効果音1つのみです。なんかこういうミニマルなのが最近得意になってきました。
  5. さらにSpace to go、この作品はLudumDareというオンラインゲームジャムにて2日間で1人で作成しました。 そしてありがたいことにAudio部門で1位を獲得できたわけですが、まぁこのゲームジャムは非常にレベルが高くてですね、 ほとんどの参加者が個人戦で1人で作ってて、どれも信じられないくらい出来がいい。このゲームも総合だと26位とかです。 一体どうやってそんなクオリティを出すにはどうするかというと、
  6. やっぱりそれには、速さが命です。 もちろん、スタートダッシュを決めるにはまずどんなゲームが作りたいかというネタは常に考えておく必要がありますが、 とにかくさっさと作らないと、脳内で動いている神ゲーが消えてしまわないうちに作るスピードが必要になってくるんですね。 まぁオクスみたいにめっちゃ長く作ってるのも自分はよくあるので何言ってんだってかんじですが、 それでも何か思いついた時に、いかに素早く実装できるか、という環境を作っておくことが非常に大切です。 なので
  7. 本題ですが、ライブラリを知って、使って、まぁ一番いいのは自分で作って、 自分のスタイルというものを作っていきましょうということです。 ゲームエンジンもそうですが、ライブラリを使うということはその哲学までも踏襲するという事になります。 なので、このMusicnEngineの使い方と一緒に、自分の音楽ゲームへの考え方も少しお伝えできればなと思います。
  8. さてそれでは中身なんですが、非常にシンプルで、ソースコード1つになっています。クラスはMusicとTimingの2つなんですがまとめちゃいました。 これを入れるだけでもう使えます。他の準備は一切いりません。 じゃあこれを使うと何ができるのか?はっきりいって、技術的にそんなに凄いことはできません。やればできるけど、 例えば、今何小節目の何拍目のどこなのか?まぁ計算すれば誰でもはじき出せます。でもこれが、テンポを指定するだけで簡単に取得できる。 同じように、そういった情報からアニメーションに必要な情報を簡単に取り出すことができる。 ゲームの進行の判定に使って音楽に合わせて動かすことも簡単。そんな感じです。 もし違うことがやりたければ、 例えば波形の情報をうまく使ってかっこよく動かしたい!という人はvjkitとか、あとはUnity標準でついてるGetSpectrumDataとか使えばいいと思います。 または、ゲームに合わせて音楽を変える、すなわちゲームの側は音楽の事を気にしないで、音楽の方が合わせて欲しい、のであればADX2LEなんかがいいと思います。 もちろんこれらは併用可能ですが、そうじゃなくて、
  9. 音楽を軸にして、音楽に合わせてゲームを作る なら めっちゃ速く作れる というのがこのライブラリの最大の特徴です。 まぁもちろん、全部を音楽に合わせる必要はないので、クオンタイズだけ使うとか、簡単な部分だけ使うことはできますし、 そういう工夫がぱぱっとできる、というのがウリです。
  10. では早速DLしてみましょう。 ExamplesにはMusicPongが入ってますが、自分でやる分にはコード1つでOKです。
  11. はい、それで、使うにあたっていくつか前提条件というか、前提知識というか。 まず1つ目、音楽は自分で用意しましょう、またはテンポや拍子は自分で調べましょう。市販の曲とかどっかから引っ張ってきた曲に勝手に合わせてくれるわけではありません。 自動検出なんて夢の技術が手近になれば話は違うかもしれませんが、現状は自分で作るなり調べるなりして、それを設定してください。 そして2つ目、音楽は常に一つだけ流れている、という前提です。まぁ言われてみればアタリマエではあるんですが、この前提を立てておくことで、 基本的にメンバーにはすべてMusic.なんとか、というStaticメンバでアクセスできるようにしてあります。速度最重視。クロスフェードなんて甘えです。 音楽が混ざるなんてことはぶれている証拠です。とも言ってられないのでそのうち実装するかもしれませんが。 そして3つ目、取得できる音楽情報はすべて16分音符が基準になっています。といっても、デフォルトがこれってだけで、 いつでも、曲中でも8分音符とか3連付とか6連付に変更できます。これをMusicalTimeの略でmtと呼んでいるんですが、 時間とかisJustChangedのフラグとか、このmtを基準に切り替わっています。
  12. それでは、MusicPongの作り方を見て行きましょう。 サンプルゲームということで、できるだけ簡単に作れるものをー、と思ったんですが、ちょっとライブコーディングではムリな感じになってしまいました。
  13. まずは企画を考えます。クオンタイズが使えてかつ進行を音楽に同期できて……とか、見せたいがために色々制約はあったんですが、 いろんなシンプルゲームを音楽に同期していくなかで、マインスイーパーとかブロック崩しはやったけど、まだPongやってなかったなってことで、 Pongを題材にしてみました。
  14. ということで、Pongを作ります。まぁプログラマなら一瞬ですね。ぽんっとできますね。 画像素材も1つも使っていません。UnityのPlaneを引き伸ばしただけですね。
  15. さてそして、今回のゲーム性も考慮して音楽を作ります。さくっと、と言いながら3日位悩んでました。 やっぱり、完全に音楽を主軸でゲームを作る場合、音楽がレベルデザインとか開始演出とかクリア演出すべてを包含していなければいけないので、 それを考えながら音楽を作るというのが、やっぱり何度やっても難しいです。 ちなみにちょっと曲のプロジェクトファイルも見てみましょうか。 まぁ開幕演出はこの棒が伸びてくるのやりたかったので決まってたんですが、 レベルデザインがですね……最初は徐々に驚かせながらパターンを増やしていく感じで、途中弾を速くしたいとも思っていたんで、 そこは一旦弾幕薄めにして、最後に変拍子を入れたいとも思ってたんで、あとは勢いですね。ちなみに、クリア演出の後にはゲームオーバーも一緒に入っています。 ゲームオーバーしたときはここに飛ばしているだけなんですね。
  16. さぁそして、曲ができてしまえばこっちのもの、あと5ステップくらいで完成します。めっちゃはやい。間違いない。 ということでいきましょう。 UnityとMusicEngineダウンロードしてある人は、Pongでは無いですが似たようなことは試せるので立ち上げてみましょう。
  17. Unity開いたら、あたためておいた音楽にMusic.csをふりかけます。 同時にやっている方は、サンプルの中にオクスのタイトル曲が入っているのでそれを使ってみてください。 すると、デフォルトのセクション情報が挿入されます。テンポ120の場合はこのままでOKです。 それで、あとは曲に応じて、テンポの他に拍子とか、セクションが変化する場合はセクションの情報を追加してほしいんですが、→一旦次のスライドに →戻ってきて こんな感じで、1曲を設定すればOKです。 複数の曲を使いたい場合は、PlayOnAwakeがついてるものには自動でアクセスできるようになるので、 その後曲を変更する場合はMusic.Playから変更してください。そうすると同様にその曲の情報にアクセスできます。 あと、基本的にないと思いたいですが、一応1サンプル目から曲が始まらないような、録音されたものとか使いたい場合は始まるタイミングをStartTimeSamplesに指定してください。 セクション内にもStartTimeSamplesってのがあるんですが、これはセクション情報入れたら自動計算されるので、気にする必要はありません
  18. ここでとても重要な基本クラスであるタイミングとセクションについて簡単に説明しておきます。 タイミングっていうのは、前提で言ったとおり16分音符が1つの単位になってるわけですが、内部の情報としてはこのように 何小節目の何拍目のいくつ目か、という情報になっています。Musicからこの情報を取ることもできますし、 自分でインスタンスを作ってこのタイミングで何をして、とか、さっきのセクションがここから始まります、という情報にも使います。 プログラマの方にはわかりやすいと思うのですが、すべて0スタートになっているので、最初は000で始まって、例えば4小節の最後は333になっています。 DAWを見ながら小節数打ち込む場合はちょっと注意という感じですかね。 次に、セクション情報ですが、要は拍子とテンポですね。これが一定の場合はセクションは1つで充分です。 まぁでも、セクションを判定に使いたい場合は同じ設定で開始タイミングを変えて自由にセクション情報を入れてもらって構いません。 最初のmtBeatっていうのが、1拍にいくつmtを入れるかという所なので、まぁ16ビートなら4ですね。3連符系であれば3とか6にしてもいいと思います。 まぁ1拍をどうとらえるかは人によるわけなので、テンポが指定しやすいように考えればいいと思います。 mtBarは1小節にmtがいくつ入るか、なので、mtBeatが4の場合、16にしたら4拍子、12にしたら3拍子になりますね。 変拍子はここを変えることで対応できて、例えば7拍子なら14にしておけば、最後の拍が半拍で終わって次の小節に行くような挙動になります。 データ的には必ず最後の拍が削られる感じになるので、4433で分けたいと思ってもそこは脳内変換でカバーしてください。
  19. これで準備OKです。さぁ
  20. じゃあ次に、とりあえずクオンタイズさせてみましょう。これだけでゲームが音楽的に、気持ちよくなります。 やり方は簡単で、audio.Playを呼ぶ代わりにMusic.QuantizePlayに渡すだけです。 これで自動的にmtに合わせて再生されます。あと急遽今回のゲームのために音程変更も入れました。 ただこれは短い音だと気にならないんですが、このオーディオソースのピッチをそのままいじってるので、多分長い音を連続でやると途中から音程が変わっちゃうかもしれない…… ですがまぁ、お手軽な方法としてお使いください。 Unity開いてる人は、pi.wavをダウンロードしてきて、鳴らしてみましょう。 効果音をつけたオブジェクトに、 if( Input.GetMouseButtonDown( 0 ) ) { Music.QuantizePlay(audio); } ってやってみると、クオンタイズのできあがりです。もしよければ音程変更も試してみましょう。 MusicPongではボールの音をクオンタイズしてますね。あと、地味に壁、天井、パドルで音程を変えています。 そのままだとドの音なので、天井は7半音上げてソにしています。
  21. という感じで、これだけで気持ちよくなりました。 まぁ、Pongはあまり連続してたくさん鳴るわけじゃないんで、これだけじゃ盛り上がらないんですけど、 それにしてもやっぱり、インタラクティブミュージックは低コストで効率いいなぁと思います。
  22. さてじゃあ次は、演出を音楽に同期させてみましょう。そこでめっちゃ使えるのが、このIsJustChanged系です。 一番よく使います。このためのライブラリだと言っても過言ではない。これは任意のタイミング、小節頭とか、拍とか、直接指定したり、Predicateを指定したりもできます。 MusicPongでは、例えば背景の色を切り替えたりしていますね。色は調整しましたが、わりとランダムに変えても楽しいです。 Unity開いてる人は、カメラに適当なスクリプトをつけて、 if( Music.IsJustChangedBar() ) { camera.backgroundColor = new Color( Random.Range(0.0f,1.0f), Random.Range(0.0f,1.0f), Random.Range(0.0f,1.0f) ); } とかやってみましょう。 MusicPongではこれを使って背景をバリバリ変えたりしてます。 あと、ボールからビームが出た瞬間にボールを一瞬止めてますが、これも音楽時間で管理してます。 別にここまで合わせなくてもいいんですが、整数で管理できるので割と楽です。
  23. こんな感じで、演出を音楽に合わせることができます。背景色変えるのは楽にかっこよくできてオススメ。
  24. ちなみに、さっきJustとか出てきましたが、実はMusicエンジンには2種類のタイミング情報が同時にあってですね、 Justともう一つ、Nowというのがあります。どういうことかというと、 Justはその名の通り、ジャストに来てから切り替わるんですが、 Nowは常に、一番近いタイミング、を指すようになっています。 図にするとこんな感じ。 音ゲー的なタイミング判定には必要かなーとか、あとは元々Justに処理が集中するのが怖かったので分散のために作ったんですが、 ちょうどこの拍に来てしまう前に登録しておきたい!とか、そういう時に使ったりしています。 まぁでも、基本的にJustで事足ります。
  25. そしてやはり、ゲームをかっこよく見せるのはアニメーションです。これがあるだけでグッとクオリティが上がりますし、音楽に合っているとさらにかっこいい。 そのために、MusicalTimeという値が取れるようになっています。これはまぁ、言ってしまえば時間を音楽時間に変換したものってだけなんですが、 タイミングを指定してこのタイミングから、またはこのタイミングまでどれくらい、っていう取り方もできます。mt基準なので、1小節で16増える、という感じですね。 MusicPongでも、開幕から棒が伸びるのをブオーンという音と一緒にやってますよね。ただ伸ばしてるだけなんですけど。あれ別にスキップできるんですけど、 あれがやりたくてPongを作ったと言っても過言ではない。あれがあると無いとでは天と地のさがあるんです。それこそPRESS STARTが点滅してるかしてないかの違いです。 あとは、ビームのアニメーションもshotTimingの前後1拍、4mt分の時間をスケールに使ってアニメーションしています。 まぁこの式は……僕のセンスの塊なのであまり解説はできませんが…… こんな感じで、もう完全にオリジナルのオシャレな音楽ゲームって感じになるわけですね。
  26. さて、そして最後は!音楽に合わせたシーン遷移です。 まぁ、普通にゲーム作ってもクリアジングルとかゲームオーバージングルとかシーンって必要になりますよね。 どうせなら音楽に合わせちゃったほうが楽じゃないですか。いや、本当に楽なんですよ。 ということで、音楽をシークする機能もつけました。セクションを作っておけば名前ですぐそのセクションに飛ぶこともできます。 MusicPongでは、ボールが下についたらGameOverにシークしているだけです。 おいしいのはですね、普通シーン遷移って面倒で、これを色んな所に通知しないとゲームがちゃんと動かないわけですが、 この場合音楽が全部のマスタータイマーになってくれるので、音楽の状態を見るだけで、フィールドの状態とか全部を簡単に制御できるんですね。 このスイッチ一発で処理を分けるだけ。 というわけで
  27. できた! なんかサンプルゲームのつもりが、意外とリスクとリターンがあって、ゲーム性の変化もあって、パーフェクトプレイ目指すのは意外と難しいという、面白いものができました。
  28. でも実際、普通にこういう演出入れてPongを作ることを考えたら、音楽に合わせるだけで大分楽に、カッコイイものができたなと思います。 ゲームデザイン的な制約は生まれますが、それをうまく使えばこんなに楽にゲームって作れるんですねー。
  29. 最後にもう一つTIPSを。 Justとかのデータが実際どういう挙動をしているのか、入力したセクションが正しく反映されているかは、デバッグテキストを指定することで確かめられます。 あの、もしなんかバグっぽかった場合もここで確かめてください。大体取ったはずですが……なんかアクロバットをすると何かが起こらないとは言えないので、、 ちなみに、Unityでピッチを下げたりしても正常に見れるので、ゆっくり見ることも可能です。一応逆再生でも動いていますが、もちろん保証はできませんw
  30. あと、今日は紹介しきれなかった機能も色々あります。 Music.isFormerHalfはブリンクアニメーションなどでよく使ってますね。ダメージ食らった時とか。 lagUnitはそのまま音ゲーとかの判定にも使えます。クオンタイズにも使ってますね。 あとは、JustChangedはPredicateも使えるので、条件に合ったタイミングだけど抜き出すことができます。 Timingはオペレーターを実装しているので、比較や引き算ができます。足し算はいらないというかセクションまたいだ時に定義不能なのでやめました。 なんか他にも使いやすくなるのがあれば、適宜実装していきたいなーと思います。オープンにしてありますので、是非みなさんのリクエストやコミットをお待ちしております。
  31. ということで、ありがとうございました。皆音楽ゲーム作りましょう!