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.

Normalize all timing points to this tempo:

Input

Output




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.

SVs to copy

Put the timing points you want to duplicate here.

Offsets input

This box takes one of the formats below as valid inputs:

  • A list of offsets in ms in ascending order, each offset in one line (most straightforward but requires some pre-processing on your side). Example.
  • A list of notes, either copied from beatmaps in x,x,x,x,x,x format or from osu! in 00:50:000 (x|x,x|x,x|x,...) format (easiest to do). Notes that have the same offset will be automatically detected so you can copy a chord but the script would still use only one offset. Example. Also you can choose whether to count end points of LNs or not. Note that this option is only available for x,x,x,x,x,x format. Example 2.
  • A special format: "mode, start offset, end offset, parameter" without the quotes where mode is a string "@n" or "@i", again, without the quotes. If mode is "@n", then parameter is the number of stuttering SVs. If mode is "i", then parameter is the duration of one whole series of stuttering SVs. In other words, \(parameter_n\times parameter_i = end - start\). Be careful with rounding errors caused when you use mode "@i". Mode "@n" is recommended. Example.

Take notice not to put any extra space, new lines, or any invalid characters at the start of your input. Strictly follow the formats given.

Offsets input box for any tool below this point also follows the same formats.

Count LN end points as offsets

Output




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:

\(v_a:\)
\(T_a:\)

Use fraction instead of fixed time duration for \(T_a\)

\(v_b:\)
\(T_b:\)

Use fraction instead of fixed time duration for \(T_b\)

Overall rate[?] (optional):

Final SV (optional, not affected by scale):

Other timing point details[?] (optional):

Offsets input

Count LN end points as offsets

Output




Advanced features



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!

SV rules in one SV cycle

A function that takes in one arguments: the duration of a cycle, and returns an array of size n where each element in the array is an array of size 2, the first element being the offset of the timing point, the second element being the SV speed in \([0.01,10]\). Below are some examples:

  • Fast then slow, normalized.
  • Slow then fast, normalized.
  • Constant stuttering but it gets faster over time.
  • Notes teleporting in but they go closer to the judgment line over time.
  • Slow then super fast.

Extra parameters

It's likely you have no need for all the extra parameters. Click the above header, that "Extra parameters" text to hide everything inside or click the header of each part to hide/show only that parameter.

Any function from this point down has the same formats: takes in two arguments and returns the value of whatever the name of the function is. The two arguments are offset from the first timing point given and the duration of the whole segment that you're gonna create SVs for (in other words, the difference between the first and the last timing points given). Both arguments are in ms. The time parameter is in \([0,duration)\).

Let's call \(f(t)\) the value returned by a function \(f\) at time \(t\). If you tick the checkbox "Use only one value for a cycle", all timing points in one cycle will use \(f(t_i)\) where \(t_i\) is the start of the i-th cycle. Else, each timing point at time \(t\) will use a separate value \(f(t)\).

SV scale

All timing points will be scaled by this rate. Useful when you want to make, let's say, the whole segment gradually faster.


Use only one value for a cycle:

Meter

Return an integer. Read here for more info.


Use only one value for a cycle:

Sample set

Return an integer. Read here for more info.


Use only one value for a cycle:

Sample index

Return an integer. Read here for more info.


Use only one value for a cycle:

Volume

Return an integer. Read here for more info.


Use only one value for a cycle:

Kiai

Return 0 or 1. Read here for more info.


Use only one value for a cycle:

Final SV (optional, not affected by scale):

Offsets input

Count LN end points as offsets

Output




Even more advanced features



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.

SV rules in one SV cycle

Some examples:

  • Make it rain barlines.
  • Make barlines fly to the beat.

Extra parameters

SV scale


Use only one value for a cycle:

Meter


Use only one value for a cycle:

Sample set


Use only one value for a cycle:

Sample index


Use only one value for a cycle:

Volume


Use only one value for a cycle:

Kiai


Use only one value for a cycle:

Main BPM:

Final SV (optional but recommended to put 1 here[?]):

Offsets input

Count LN end points as offsets

Output




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.

SV rules

A function that takes in two arguments: the list of offsets and the main BPM, returns a list of TimingPoint objects. The list of offsets is, as you might be familliar with already, an array of float. You can create a TimingPoint object by calling

You can put in null for any parameters you don't need and it will automatically use a default value.

Please read the wiki to understand which parameter does what work. Though I doubt you need to do so once you're here. Some examples:

  • Example 1.
  • Example 2.
  • Example 3.
  • Example 4.
  • Example 5 (computationally heavy).

Main BPM:

Offsets input

Count LN end points as offsets

Output




Author: Влади́мир Пу́тин
Special thanks to zardoru and SV changes tools as this project was inspired by their tools.
Font generated by flaticon.com. Under CC: Elegant Themes