Osu Mania SV tool box
Preface
Technical stuff
Below are some technicalities on how SV works. You can skip all the details and trial-and-error to find the suitable values for your SVs. But understanding the underlying mechanism will allow you to be more creative with SVs.
First, mania SVs are sequential SVs, unlike taiko SVs, which means if note A comes before note B, you will always see A before B, no matter what you do. On the other hand in taiko, you can have a note from the end of the beatmap hanging around on the screen right from the beginning.
There is only one main tempo for a beatmap which usually belongs to the longest timing point segment. [?]
A beat is about \(\frac {4.375 \times slider\_velocity \times scroll\_speed \times osu\_height}{main\_bpm}\) long in pixels.[?]
Basic understanding of the .osu format, especially the timing points will help.
Disclaimer
I take no responsibility or liability for any damages arising from use of any tools provided here. Also there will be a lot of rounding errors but they won't affect your map.
Note
Some of the input boxes in these tools follow very strict formats. Please read the instructions first before attempting to use them. If you see nothing in your output box after you press any buttons, there's high chance you forgot to fill some boxes or you filled incorrectly. Only boxes that are explicitly said to be optional can be ignored.
Normalize / Remove SVs
Description
You are recommended to normalize right after you finish timing a song as normalization will remove all SVs in the process. Normalization scales a segment of timing points to have the same scroll speed as the given tempo. If no tempo is given, the tool will attempt to auto-detect the main BPM.
SVs copier
Description
This tool will duplicate a segment of timing points to all offsets given. Please ensure that you will not create any unwanted side effects that could happen due to the SV segment having too long duration or the offsets given are too dense.
Stuttering SVs
Description
Stuttering SVs are a series of speedup then slowdown or slowdown then speedup, and optionally, 1.0x speed at last.
Usually you need to normalize stuttering SVs. For example, if A and B are 120 pixels apart at 1.0x speed, they still need to be 120 px aparts after you apply the SVs. However, you can be creative and break this rule. Your choice.
There are four points of interest in a series of stuttering SVs: the start point (speedup or slowdown), the transition point (slowdown or speedup), the normalize point (1.0x), the end point. These four points respectively are at offset \(t_1\), \(t_2\), \(t_3\), \(t_4\). Let \(T_a=t_2-t_1\) and \(T_b=t_3-t_2\) be the amount of time that you speedup or slowdown, \(v_a\) and \(v_b\) be the speedup or slowdown slider velocity (if a is speedup then b must be slowdown and vice versa). Then the apparent length of the \(t_1 \rightarrow t_3\) segment is $$T_a\times v_a + T_b\times v_b$$ Therefore, if you want to normalize the stuttering SVs,$$T_a\times v_a + T_b\times v_b = T_a+T_b$$
In the form below, fill in the speedup / slowdown speed for \(v_a\) and \(v_b\) as a decimal in \([0.01,10]\), the time duration for \(T_a\) and \(T_b\) in ms if you don't tick the checkbox. If you use both checkboxes, \(T_a\) and \(T_b\) take a decimal in \((0,1)\) and \(T_a+T_b\leq 1\). If you use only one checkbox, I don't know what will happen. You're free to try.
Fill \(T_a\) or \(T_b\) with -1 to make \(T_a+T_b=t_4-t_1\).
Values for some common effects:
- Fast then slow, normalized.
- Slow then fast, normalized.
- Constant stuttering.
- A wild note appear!
- Slow then super fast.
Generalized SV tool for inherited timing points
Description
This is the generalized version of stuttering SVs. Instead of fixed value, you will provide your own rules for each and every single value needed to create an inherited timing point. This tool is very similar to zardoru's Arbitrary math function for cyclical SV tool. All of your rules need to be written in javascript. You can see some maths stuff you can do with javascript here. It's not hard to use! Also please ensure that all functions have a valid return value on the time domain. That means if you don't know what to do with a box, leave it as an empty box will mess up everything!
More technical stuff
The tools here might or might not work as I myself don't really understand uninherited timing points.
Before we start, let's take a look at this formulae: $$\frac {4.375 \times slider\_velocity \times scroll\_speed \times osu\_height}{main\_bpm}$$ This is the apparent length of a beat, measured in pixels. Assume the slider velocity to be 1, then a beat because one beatmap can only have one main BPM. Why does this matter? A barline appears at every measure. Also, a new uninherited timing point creates a barline except when it's less than 2ms apart from the last uninherited timing point[?]. Knowing the formulae, therefore, allows you to calculate exactly where you want a new barline to be.
A common technique with uninherited timing points is to put a long 0 BPM segment followed by a high BPM segment to create visual effects. Try using the below SV to see what happens.
One thing that you need pay extra caution to is that any segment of high BPM, about 6 million BPM, even if very short, can easily freeze osu!, especially if you open it in Editor Mode. Even if it doesn't, you will be stucked with very high RAM usage by osu! until you reset the game. This map in particular cleared my osu settings for some unknown reasons.
Generalized SV tool for uninherited timing points
Description
Exactly the same as Generalized SV tool for inherited timing points. The only new thing is now a main tempo has to be declared.
Ultimate SV tool
Description
You now have complete control over what to return, what not. My role is only to provide you with the list of offsets and a format for you to create timing points.