StepManiaで譜面を作る時、途中でBPMを倍にしたり半分にしたりするギミックを
入れたことのある人は多いんじゃないでしょうか?
やり方は普通、Edit画面でF7かF8を押してBPMを変更するのが普通だと思うんですが、
F7/F8だけでBPMを大幅に変更するのは正直面倒です。
BPMを変更したい箇所で1回だけBPM変更キーを押して
譜面ファイルをテキストエディタでBPMを書き換えるのもアリだと思いますが、
できればEdit画面上で一発でBPMを倍にしたり半分にしたりしたいものです。
そこで、「SHIFT+F7でBPM半減、SHIFT+F8でBPM倍増」をできるように
プログラムを改造してみたいと思います。実は結構簡単です。俺でもできるし。
ScreenEdit.hの編集
134行目あたり、列挙型変数EditButton内の
EDIT_BUTTON_BPM_DOWN,
の下に以下を追加
1 2 |
EDIT_BUTTON_BPM_HALF, EDIT_BUTTON_BPM_TWICE, |
ScreenEdit.cppの編集
221行目あたり、
name_to_edit_button[“BPM_DOWN”]= EDIT_BUTTON_BPM_DOWN;
の下に以下を追加
1 2 |
name_to_edit_button["BPM_TWICE"] = EDIT_BUTTON_BPM_TWICE; name_to_edit_button["BPM_HALF"] = EDIT_BUTTON_BPM_HALF; |
361行目あたり、InitEditMappingsメソッド内の
m_EditMappingsDeviceInput.button[EDIT_BUTTON_BPM_DOWN][0] = DeviceInput(DEVICE_KEYBOARD, KEY_F7);
の下に以下を追加
1 2 3 |
m_EditMappingsDeviceInput.button[EDIT_BUTTON_BPM_HALF][0] = DeviceInput(DEVICE_KEYBOARD, KEY_F7); m_EditMappingsDeviceInput.hold[EDIT_BUTTON_BPM_HALF][0] = DeviceInput(DEVICE_KEYBOARD, KEY_LSHIFT); m_EditMappingsDeviceInput.hold[EDIT_BUTTON_BPM_HALF][1] = DeviceInput(DEVICE_KEYBOARD, KEY_RSHIFT); |
m_EditMappingsDeviceInput.button[EDIT_BUTTON_BPM_UP][0] = DeviceInput(DEVICE_KEYBOARD, KEY_F8);
の下に以下を追加
1 2 3 |
m_EditMappingsDeviceInput.button[EDIT_BUTTON_BPM_TWICE][0] = DeviceInput(DEVICE_KEYBOARD, KEY_F8); m_EditMappingsDeviceInput.hold[EDIT_BUTTON_BPM_TWICE][0] = DeviceInput(DEVICE_KEYBOARD, KEY_LSHIFT); m_EditMappingsDeviceInput.hold[EDIT_BUTTON_BPM_TWICE][1] = DeviceInput(DEVICE_KEYBOARD, KEY_RSHIFT); |
2379行目あたり、
case EDIT_BUTTON_BPM_UP:
case EDIT_BUTTON_BPM_DOWN:
ブロックを変更
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
case EDIT_BUTTON_BPM_UP: case EDIT_BUTTON_BPM_DOWN: case EDIT_BUTTON_BPM_TWICE: case EDIT_BUTTON_BPM_HALF: { float fBPM = GetAppropriateTiming().GetBPMAtBeat( GetBeat() ); float fDelta; switch( EditB ) { DEFAULT_FAIL( EditB ); case EDIT_BUTTON_BPM_UP: fDelta = +0.020f; break; case EDIT_BUTTON_BPM_DOWN: fDelta = -0.020f; break; case EDIT_BUTTON_BPM_TWICE: fDelta = +(fBPM); break; case EDIT_BUTTON_BPM_HALF: fDelta = -(fBPM / 2); break; } if (EditB == EDIT_BUTTON_BPM_UP || EditB == EDIT_BUTTON_BPM_DOWN) { if (EditIsBeingPressed(EDIT_BUTTON_ADJUST_FINE)) { fDelta /= 20; // .001 bpm } else if (input.type == IET_REPEAT) { if (INPUTFILTER->GetSecsHeld(input.DeviceI) < 1.0f) fDelta *= 10; else fDelta *= 40; } } float fNewBPM = fBPM + fDelta; if(fNewBPM > 0.0f) { GetAppropriateTimingForUpdate().AddSegment(BPMSegment(GetRow(), fNewBPM)); } (fDelta>0 ? m_soundValueIncrease : m_soundValueDecrease).Play(true); SetDirty( true ); } return true; |
以上の修正を行ってビルドすれば完成です。
一応動作するのが確認できるように動画を作りました。
どうでしょう、思ったより簡単だったと思います。
というかなんでこの機能ないのか不思議に思えるくらい使える機能だと思うんですがね…
今回はプログラムのソースをいじって機能を追加しましたが、
もしかしてluaとか使ってこういう機能も追加できるんでしょうか?
StepMania5はluaで何でもできちゃうイメージがあるんですが…
そもそもScreenEdit.hやScreenEdit.cppはどこにありますか?
ソースファイルの中を検索すればすぐ見つかるのですが、
そのような質問をされているということは、Themeの修正などで対応できると勘違いなさっていると思われます。
確かにこの記事だけだとそうとられてもしょうがない内容になってしまってますね…申し訳ないです。