music engineadx

39
Geekdrums/MusicEngine を使った超速音楽同期ゲーム制作

Upload: sho-iwamoto

Post on 02-Jul-2015

324 views

Category:

Documents


8 download

TRANSCRIPT

Page 1: Music engineadx

Geekdrums/MusicEngineを使った超速音楽同期ゲーム制作

Page 2: Music engineadx

まずはADX使わない版からADX版との違いは最後に解説します

Page 3: Music engineadx

採用事例(Unity+MusicEngine)という名の宣伝

Page 4: Music engineadx

VOXQUARTER(仮題)http://voxquest.tumblr.com/

鋭意開発中。MusicEngineForADXを利用。

Page 5: Music engineadx

MusicPonghttp://unitygameuploader.jpn.org/game/1233.html

MusicEngineのサンプルとして付属

Page 6: Music engineadx

Space to gohttp://www.ludumdare.com/compo/ludum-dare-29/?action=preview&uid=25923

LudumDare #29 オーディオ部門で1位獲得

Page 7: Music engineadx

ゲーム制作は速さが命神ゲーだと思い込んでいる内に作り上げろ

Page 8: Music engineadx

本題ということで、ライブラリを使おう (OR作ろう)

Page 9: Music engineadx

MusicEngineとはUnity用スクリプト「Music.cs」のこと。 これだけ→

できること

「今何小節目の何拍目のどこ?」が簡単に取得できる

「音楽のここに合わせてこう動かして!」が簡単にできる

できないこと

波形に反応してかっこよく動かして!→vjkitとか使ってください

ゲームに合わせて音楽を変化させたい!→ADX2LEとか使ってください

Page 10: Music engineadx

「音楽に合わせたゲーム」なら

めっちゃ速く作れるサラマンダーより、ずっとはやい

Page 11: Music engineadx

早速ダウンロードhttps://github.com/geekdrums/MusicEngine

Exampleの中にMusicPongがプロジェクトごと入ってます。

Music.csだけでもOK。

Page 12: Music engineadx

前提音楽は自分で用意(orテンポや拍子は自分で調べる)• 自動検出なんて、あるわけない

音楽はいつも1つ• Music.○○という感じで、コードのどこからでもstaticな音楽情報にアクセスできる

• クロスフェードは甘え(そのうち実装するかも)

16分音符(※)=1mt がすべての基準• Music.MusicalTimeは16分音符の長さを1.0としている

• ※3連符や8分音符など、任意の基準に(曲中でも)変更可能

Page 13: Music engineadx

MusicPongの作り方Music Pong | UnityGameUploader http://unitygameuploader.jpn.org /game/1233.html

Page 14: Music engineadx

企画「よし、Pongまだ作ってないから次はMusicPongだな」

Page 15: Music engineadx

Pongを作るぽんっと

Page 16: Music engineadx

音楽を作るさくっと(3日経過)

Page 17: Music engineadx

あと5ステップくらいで完成はやい(確信)

Page 18: Music engineadx

Step1.MusicコンポーネントをつけるAudioSourceをつけたオブジェクトにMusic.csを追加。自動的にデフォルトのセクション情報

(16分音符で4拍子、テンポ120)が挿入されます。

Note:

複数の曲を使う場合は、Music.Play( “name” )で曲を変更。

1サンプル目から曲が始まらない場合のみDelayTimeSamplesを指定。

Sections内のStartTimeSamplesは自動計算されます。

Page 19: Music engineadx

Tips1: Timing & Sectionclass 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にすれば良い。

Page 20: Music engineadx

準備完了。システムオールグリーン

Page 21: Music engineadx

Step2.とりあえずクオンタイズするMusic.QuantizePlay( AudioSource source, int transpose = 0 );• 自動的にmt(=16分音符)に合わせて再生される。

• transposeは1で半音、12で1オクターブ。

↓Ball.csにて。壁やパドルの反射音をクオンタイズ&音程変更

Page 22: Music engineadx

クオンタイズ+音程。これだけで気持ちいいめっちゃ楽

Page 23: Music engineadx

Step3.音楽に合わせて演出するMusic.IsJustChangedBar()/...Beat()/...At(Timing)小節ごと/拍ごと/任意のタイミングに来たフレームだけtrueになる

Field.csにて➔

背景色を切り替え

Music.isJustChanged16分音符ごとに1フレームずつtrueになる Ball.csにて➔

ビーム時にボールを停止

Page 24: Music engineadx

かっこいい演出完成。背景色変えるのはオススメ

Page 25: Music engineadx

Tips2: Just & NowMusic.Just : 拍がちょうどに来てから切り替わる

Music.Now : 「最も近い拍」を示すように(拍と拍の間で)切り替わる

Note: 何か「この拍になる直前に処理しておきたい!」という時とかにIsNowChanged系を使うと便利。

Page 26: Music engineadx

Step4.音楽に合わせてアニメーションMusic.MusicalTime / MusicalTimeFrom(Timing)mt基準の時間を浮動小数で取得

↓Padddle.csにて。最初のバーが現れる演出

↓Beam.csにて。shotTimingに合わせてアニメーション。

Page 27: Music engineadx

Music.Seek(Timing) / SeekToSection(string name)音楽の好きな箇所にシークすることができる。

Ball.csにて➔

ゲームオーバー判定

Music.CurrentSection現在のセクション情報を取得

Field.csにて➔

セクションを状態遷移判定に使う

Step5.音楽に合わせてシーン遷移する

Page 28: Music engineadx

できた。パーフェクトプレイするのめっちゃむずい

Page 29: Music engineadx

普通に作るより楽。音楽がマスタータイマーになってくれる

Page 30: Music engineadx

Tips3: DebugTextインスペクタで設定→

現在のタイミング(0小節目の3拍目の3mt) 現在の音楽時間(1小節で16)

現在のセクション。0番目の”Start”セクションで、(0,0,0)から始まり、テンポは128

Note:音楽を途中で止めたりピッチ(再生速度)変えたりしても大丈夫。

Page 31: Music engineadx

その他の機能とかMusic.isFormerHalf //1mtの前半後半で切り替わる。Blinkアニメなどにも使える

Music.lagUnit //一番近いタイミングとの誤差を-0.5~0.5で返す。音ゲーなどに?

Music.IsJustChangedWhen(Predicate) //デリゲートを使って好きなタイミングを抽出できる

Timing operator < //if(Music.Just < timing)などで時間を比較できる(後の方が大きい)

Timing operator - // Music.Just – timing などで音楽時間を測れる。

Page 32: Music engineadx

ADX2LEと一緒に使う真にインタラクティブな音楽のために

Page 33: Music engineadx

ダウンロードhttps://github.com/geekdrums/MusicEngineForADX

サンプルは無いですごめんなさい。APIはUnity版と「だいたい」同じ(違いは後述)。

2014/7現在、ADX2LEをUnityで使うにはUnityProが必要です。

ADX2LEをUnityで使う方法は各自調べてください(既に使っている人向けに書きます)。

http://www.adx2le.com/download/index.html

Page 34: Music engineadx

ADX2LEを合わせて使う時の前提1複雑な音楽の遷移や変化を織り交ぜるため、曲にはいくつか制限をつける。• 1曲の中ではテンポ変更は無し、拍子変更も無し

• 曲にはブロックを1つ以上作る

• 必ずブロックぴったりで止まるキューを一番上のトラックに配置※

※ADX2LEのGetNumPlayedSamplesの仕様で、再生されているデータの中で最初に見つかったデータの現在のサンプル数が返されるため。

Page 35: Music engineadx

ADX2LEを合わせて使う時の前提2当たり前だけど、UnityのAudioSourceではなく

Cri Atom SourceをつけたオブジェクトにMusicをつける。

オブジェクト名は、CueNameと同じにしておくといいことがある(後述するブロック情報の自動インポートが使える)。

テンポ変更などが無いので、mtBeat, mtBar, Tempoは1曲につき1つずつのみ指定。

ブロックの名前と小節数をそれぞれ入力する必要がある。

Page 36: Music engineadx

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関数が使えない(ブロック再生を使おう)。

Page 37: Music engineadx

おまじないの追加(必須)Music.csの先頭のNoteにあるとおり

これが無いとコンパイル通らないので注意。

詳しくは以下を参照

http://www53.atwiki.jp/soundtasukeai/pages/22.html#id_6c095b2d

Page 38: Music engineadx

おまじないの追加(必要であれば)Music.csの先頭から2番めのNoteにある通り

この関数をEditor/CriWare/CriAtom/CriAtomWindow.csに追加して、

Update Assets of CRI Atom Craftボタンを押すときの関数内から呼び出すと、

キュー名と同じ名前を持つMusicコンポーネントに

ブロックの情報が自動で反映されます。

Page 39: Music engineadx

おしまい