music engineadx
TRANSCRIPT
Geekdrums/MusicEngineを使った超速音楽同期ゲーム制作
まずはADX使わない版からADX版との違いは最後に解説します
採用事例(Unity+MusicEngine)という名の宣伝
MusicPonghttp://unitygameuploader.jpn.org/game/1233.html
MusicEngineのサンプルとして付属
Space to gohttp://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 & 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にすれば良い。
準備完了。システムオールグリーン
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.isJustChanged16分音符ごとに1フレームずつtrueになる Ball.csにて➔
ビーム時にボールを停止
かっこいい演出完成。背景色変えるのはオススメ
Tips2: Just & NowMusic.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コンポーネントに
ブロックの情報が自動で反映されます。
おしまい