7 min read

osu!taiko: Note Speed Mechanics

Table of Contents

Also posted on the osu! forums: https://osu.ppy.sh/community/forums/topics/1851087

Here is a description of how scroll speed works in osu!taiko. I couldn’t find this information elsewhere online so I did my own research. If you spot anything wrong with this then let me know.

In case it matters: this research was done as of November 2023 on the “classic” osu! client.

Calculation

đź’ˇ

The following section will list values in “pixels”, which assumes a 800x600 resolution. In the end all the pixel units cancel out, but e.g. for 1280x720 you want to multiply all “pixel” values by 720/600.

Here’s a reference image: Diagram marking measurements of various distances on the playfield

  • The typical scroll speed is 245 pixels/beat. This is calculated as 175 * 1.4 from the beatmap’s slider velocity setting. Most maps have their slider velocity at the default 1.4, but a small number of songs have set it differently, e.g. Yoru Naku Usagi wa Yume o Miru which has a base slider velocity of 1.6 => 175 * 1.6 = 280 pixels/beat. [1]
  • HR applies a 1.4 multiplier and scales by aspect ratio.
  • EZ applies a 0.8 multiplier. This is not affected by aspect ratio.
  • Finally BPM and inherited timing points affect scroll speed.
    • BPM is applied by multiplying by bpm/60, which converts from pixels/beat to pixels/second.
    • Inherited timing points apply their multiplier.

Picture indicating where the "slider velocity" setting is in the map editor

[1] Picture indicating where the “slider velocity” setting is in the map editor

The receptor is 165 pixels from the left of the screen. That makes the total playfield length 600*r - 165 pixels where r is your aspect ratio.

To get the overall reaction time, divide the playfield size (pixels) by the scroll speed (pixels/second) to get the number of seconds between a note being visible and it arriving at the receptor.

Here’s some example code representing the calculations.

def playfield_width(aspect_ratio):
    return 600 * aspect_ratio - 165

def scroll_rate(aspect_ratio, mod):
    if mod == "HR":
        return 245 * 1.4 * aspect_ratio / (4/3)
    elif mod == "EZ":
        return 245 * 0.8
    else:
        return 245

def reaction_time(aspect_ratio, mod, bpm, base_sv=1.4, inherited_sv=1):
    return playfield_width(aspect_ratio) / (scroll_rate(aspect_ratio, mod) * bpm/60 * base_sv/1.4 * inherited_sv)

Written out as mathematical formulas, with R being the aspect ratio (4/3 for 4:3, 16/9 for 16:9), B being the BPM, and assuming the normal 1.4x base slider velocity and 1x inherited velocity:

  • EZ: B/60 * (600*R-165) / 245 * 0.8
  • NM: B/60 * (600*R-165) / 245
  • HR: B/60 * (600*R-165) / (1029/4 * R)

Analysis

HR is easier on higher aspect ratios

What’s interesting is that higher aspect ratios on HR give slightly more reaction time. This is because the HUD is a fixed size, so the proportion of screen dedicated to the playfield also increases, an extra factor which isn’t accounted for in HR scaling.

  • bpm advantage factor vs. 4:3: (160 * r - 44)/(127 * r) where r is aspect ratio [2]
  • at 16:9 it’s 1.065x (about 10-15bpm)
  • at 21:9 it’s 1.11x (about 20-25bpm)
  • at 45:9 it’s 1.19x
  • asymptote is at 160/127 = 1.25x

However I’ve tried it and changing resolution won’t instantly make you read faster, mainly because of having to read at a different note spacing.

You can visually verify this by taking screenshots at different aspect ratios: more notes are visible at higher aspect ratios.

4:3
16:9
7.5 notes are visible at 4:3, while 8 notes (and some space after) are visible at 16:9.

[2] - wolfram link. Basically calculating the bpms at which the reaction times on 4:3 and aspect ratio r are equal.

Comparison with AR in osu!std

The formula for AR in seconds is (1200 - 750 * (ar-5)/5)/1000. Below are some tables comparing certain values of BPM and AR.

  • 200bpm HR = AR9.29 (4:3), AR9.05 (16:9)
  • 220bpm HR = AR9.63 (4:3), AR9.41 (16:9)
  • 240bpm HR = AR9.91 (4:3), AR9.71 (16:9)
  • at 4:3: AR9 = 259bpm or 185bpm HR, AR10 = 345bpm or 247bpm HR
  • at 16:9: AR9 = 368bpm or 197bpm HR, AR10 = 491bpm or 262bpm HR

Here is a desmos where you can play with the calculations: link.

4:316:9
NomodHRNomodHR
BPMmsARmsARmsARmsAR
180863.957.24617.108.891,408.163.61657.198.62
200777.557.82555.399.301,267.354.55591.479.06
220706.868.29504.909.631,152.135.32537.709.42
240647.968.68462.839.911,056.125.96492.899.71
260598.129.01427.2310.15974.886.50454.989.97
280555.399.30396.7110.36905.256.97422.4810.18
300518.379.54370.2610.53844.907.37394.3110.37
320485.979.76347.1210.69792.097.72369.6710.54
340457.389.95326.7010.82745.508.03347.9210.68
360431.9710.12308.5510.94704.088.31328.6010.81
380409.2410.27292.3111.05667.028.55311.3010.92
400388.7810.41277.7011.15633.678.78295.7411.03
4:316:9
ARmsBPM (NM)BPM (HR)BPM (NM)BPM (HR)
8750207.35148.10294.42157.73
8.2720215.99154.28306.69164.30
8.4690225.38160.98320.02171.44
8.6660235.62168.30334.57179.23
8.8630246.84176.32350.50187.77
9600259.18185.13368.03197.16
9.2570272.82194.87387.40207.53
9.4540287.98205.70408.92219.06
9.6510304.92217.80432.97231.95
9.8480323.98231.41460.03246.45
10450345.58246.84490.70262.88
10.2420370.26264.47525.75281.65
10.4390398.74284.82566.20303.32
10.6360431.97308.55613.38328.60
10.8330471.24336.60669.14358.47
11300518.37370.26736.05394.31