overcoming granular limitations of the stepmania editor

Above is one of the charts i’m more proud of from DSR Squared, a refined version of some earlier attempts at the BPM speed up/freeze effect i’ve used in a few other historical charts. Someone had asked about the details of the construction of the chart to which i gave a brief answer as it was in the middle of the tourney. This is the more complete answer which explains how a fundamental flaw with the stepmania step editor engine makes this more difficult than it should be and how to work around this flaw.

I can’t take credit for this technique – this was all Tyler.

The problem: The timing window for hitting an ITG “Fantastic” or a DDR “Marvelous” or “Perfect” is measured in milliseconds. However, the stepmania step editor can only measure absolute time at a grain of centiseconds and a BPM at a grain of hundredths. For charts with no or very few BPM changes or pauses this is merely an inconvenience, but for charts that make heavy use of BPM change and pause effects, this can create significant changes to the sync of the Fantastic window in relation to the audio, particularly if the “convert BPM to pause” feature is used (which should be never).

Example: Suppose you have a song at 144 BPM and you want to have the equivalent of a quarter note (a crotchet for those in the UK) of pause somewhere in the middle of the song. A single quarter note of pause at that tempo is 0.4166666… seconds. If you use the “convert BPM to pause” feature of stepmania, it translates this to 0.42 seconds (rounding up). Again, if used once this isn’t necessarily a big deal, but if used several times, the timing window for being “on” shifts drastically since each iteration will offset the sync by 4ms. After five times of doing this, what was previously a spot on Fantastic is now an early excellent.

Solution: Know where all of your key beats will fall in absolute time.

Start by creating a “template” stepchart that has no pauses in it. After ensuring that the sync through the entire song is to your liking, identify the areas of the stepchart where you plan on putting a pause. For all of these areas, choose the eighth/quaver or quarter/crotchet note after the intended pause and record its “Current Second” on a notepad. Once you have identified all of these key beats, manually put in all of the pauses and make small adjustments when necessary to ensure that all of the key beats still fall on the correct “Current Second”. Typically this means adjusting pauses by one centisecond here and there.

It’s important to note that you should find all of your key beats and record them from the very beginning as opposed to finding just the next relevant key beat and adjusting the BPM and/or pause at that moment and then moving to the next one. The reason for this is because whenever you make adjustments to your BPM or pauses and then key in on the “Current Second”, this is still rounded to the nearest centisecond and over time can still create a sync error. When i first wrote Smooth Criminal, i did it the wrong way first – i found my first speed up/pause area, recorded the “Current Second”, wrote in the code, and moved to the next one. Because of this, the end of the chart ended up being maybe 30-40 ms off of its original sync. Checking the key beats over the entire chart from scratch, i ended up having to make quite a few pause adjustments to get it to be on, moving about every fifth pause from 22 centiseconds to 23 centiseconds.

I found it easiest to write in the pauses and BPM shifts directly in the .sm file rather than mess with the fussy F7/F8/F9/F10 method of the stepmania editor. It involved me having both open, typing in what i needed in the .sm file, “reloading from disk” in the stepmania editor, and then double-checking that the “Current Second”s fell where they were supposed to.

That’s pretty much it.

Leave a Reply!