# I've pretty much figured out Taiko pp

So for the past few days I've been looking through the open-sourced Taiko pp algorithms, and I've basically figured it out. Here's how it works....:

Taiko pp is composed of Strain, Accuracy and a final multiplier.

Strain Value:
* Take the higher of 1 or the (Star Rating/0.0075)
* Multiply by 5
* Subtract 4
* Square it
* Divide by 100,000
Length bonus: Take the lower of 1 or (the number of circles/1500), multiply by 0.1 and add 1
Multiply current strain value by this amount

Then multiply by 0.985^misses
Combo: Take your combo and square root it, then divide by the square root of the full combo. Compare this to 1 and take the lower value.
Multiply strain by this combo value.
Multiply by 1.025 for Hidden
Multiply by (1.05 x Length bonus) for Flashlight
Then multiply by accuracy (as a %)

Accuracy Value:
Take the 300 hit window and call this HitWindow300 (This is where the OD comes in, and is basically where the effect of HR/EZ takes place)

Accuracy Value = (150/HitWindow300) ^ 1.1
Multiply by accuracy to the power of 15 (out of 1, e.g. for 98% accuracy you’d do 0.98 to the power of 15)
Multiply by 22

Take (number of circles/1500) to the power of 0.3. Compare to 1.15, take the lower value
Multiply your Accuracy value by this amount

Formula for actual accuracy percentage:
(Amount of 100s * 150) + (Amount of 300s * 300) / (number of circles * 300)
(Not exactly relevant since you get this from the game anyway)

Total pp:
Multiplier on all plays: 1.10

Multiply this by the following amounts for these mods:
NoFail: 0.90x
Hidden: 1.10x

Final formula: ((StrainValue ^ 1.1) + (AccuracyValue ^ 1.1)) ^ (1.0 / 1.1) * Multiplier

I made a very simple calculator for this in JavaScript (so it'll run in any decent browser) - you can find that here.

The weirdest thing I found though, was the misses. What I expected to happen was that it would use your max combo and compare that to the map's maximum combo. Your combo is actually calculated as the maximum combo minus the number of misses. So if you got 3 misses on a 1000 combo map, that's actually calculated as you scoring 997/1000 combo, regardless of where you had those misses. _yu68 should actually have gotten 580pp for his Technonationalism play since his max combo was 762/1149. He had 3 misses, and it only comes out to 680pp if you calculate this as 1146/1149.

Another example of this is on Uta - despite tuengsocool getting about 650 combo less than XK2238, he only gets slightly less pp because of the slightly lower accuracy - since they both got 4 misses, they both calculate as 3503/3507.

"Number of circles" isn't correct in convert maps - the number of circles shown in osu! is for Standard mode, so it won't be the same number in Taiko. You'll have to input the maximum combo there instead.
Your combo - As I said in the previous paragraph, you'd have to input this as max combo minus misses for it to match up with the real values. I really don't know why.
Values can differ very slightly because the Star Rating in osu! is rounded to two decimal places; for example, what shows as a 6.86 star map in osu! can actually be anywhere between 6.855 and 6.865 stars, so there may be a very slight discrepancy there.

I don't know if anyone cares, but hopefully this post is useful
May I host it on my website? You will be credited for that awesome work.
This is very accurate, nicely done
Good job, that shows some work behind the pp system in taiko and gives us something else to look at.

#### _Gezo_ wrote:

May I host it on my website? You will be credited for that awesome work.
Sure
Another thing I would like to point out is that I made an OD table some time ago. It would be useful as they all contain the "300" values and follow a formula for EZ and HR, and values are multiplied by their factor with DT and HT. It will be much easier to use for this aspect. Instead of constantly looking for what 7+DT+HR is, or 3+EZ+DT, or 5.5 being inaccurate, the program will get the values on their own.

#### _Gezo_ wrote:

Another thing I would like to point out is that I made an OD table some time ago. It would be useful as they all contain the "300" values and follow a formula for EZ and HR, and values are multiplied by their factor with DT and HT. It will be much easier to use for this aspect. Instead of constantly looking for what 7+DT+HR is, or 3+EZ+DT, or 5.5 being inaccurate, the program will get the values on their own.
That sounds fantastic! Where can I get it?
https://www.dropbox.com/s/kaqumg6u91yt6 ... D.pdf?dl=0

There are different formulas but yeah I'll probably try to figure them out again
Update 1.1: I removed the "your combo" box, because of the way Taiko calculates pp, this value can be calculated from the number of misses. Same download link as before. (Also means one less box to fill in :p)
I love you

#### _Gezo_ wrote:

https://www.dropbox.com/s/kaqumg6u91yt6hh/ULTIMATE%20OD%20TABLE%20FIXED.pdf?dl=0

There are different formulas but yeah I'll probably try to figure them out again
I tried to figure out the formulas and came up with this:

https://www.dropbox.com/s/p3v6p1oxbqge5 ... .xlsx?dl=0

Maybe try it (?)
.
I've finally figured out the formulas in a clean way (these are on the spreadsheet as well):
`NM OD:    Initial OD		EZ OD:	OD/2HR OD:	OD*1.4DT OD:    ROUND(OD/1.5+5.5) TO 2 DECIMALS		HT OD:    ROUND(OD/0.75-5.5) TO 2 DECIMALSEZ+DT OD: ROUND(EZ OD/1.5+5.5) TO 2 DECIMALSHR+DT OD: ROUND(HR OD/1.5+5.5) TO 2 DECIMALSEZ+HT OD: ROUND(EZ OD/0.75-5.5) TO 2 DECIMALSHR+HT OD: ROUND(HR OD/0.75-5.5) TO 2 DECIMALS300 Hit window: ROUND(49.5-(OD/0.5)*1.5) TO 1 DECIMAL	`
Hope it helps

EDIT: Here's the new and better (???) taiko pp calculator (automated 300 hit window calculation based off _Gezo_'s od table): https://www.dropbox.com/s/52mikcnntehqn ... .html?dl=0
Wow, great job. Thank you for sharing this with us.

#### Pohm wrote:

I've finally figured out the formulas in a clean way (these are on the spreadsheet as well):
`NM OD:    Initial OD		EZ OD:	OD/2HR OD:	OD*1.4DT OD:    ROUND(OD/1.5+5.5) TO 2 DECIMALS		HT OD:    ROUND(OD/0.75-5.5) TO 2 DECIMALSEZ+DT OD: ROUND(EZ OD/1.5+5.5) TO 2 DECIMALSHR+DT OD: ROUND(HR OD/1.5+5.5) TO 2 DECIMALSEZ+HT OD: ROUND(EZ OD/0.75-5.5) TO 2 DECIMALSHR+HT OD: ROUND(HR OD/0.75-5.5) TO 2 DECIMALS300 Hit window: ROUND(49.5-(OD/0.5)*1.5) TO 1 DECIMAL	`
Hope it helps

EDIT: Here's the new and better (???) taiko pp calculator (automated 300 hit window calculation based off _Gezo_'s od table): https://www.dropbox.com/s/52mikcnntehqn ... .html?dl=0
Sweet! I thought DT was just the 300 hit window times 2/3, and HT was the 300 hit window times 4/3. I figured out the 300 hit window as 49.5-(3*OD) (edit: actually, that's the exact same as yours, because dividing by 0.5 is equal to multiplying by 2, and then that times 1.5 is 3), but both your formula and mine return OD6.5 as 30 ms, when it's in fact 29.5. This is just about the only thing I've been stuck on.
I'm a bit late to the party, but I've recently picked back up on my Taiko pp calculator and I remember failing to find a clean formula to calculate the hitwindow from the OD. What I did instead was hard code specific decimals to subtract from the hit window. Actually, have a look at the function I wrote:
`private double GetHitWindow300(){    string ODstr = map.GetTag("Difficulty", "OverallDifficulty");    if(ODstr.Length > 3)        throw new Exception("Error, OD has more than one decimal place");    double OD = Convert.ToDouble(ODstr);    if(((int)mods & (int)Modifiers.HardRock) > 0)        OD *= 1.4;    else if(((int)mods & (int)Modifiers.Easy) > 0)        OD *= 0.5;    OD = Dewlib.Clamp(OD, 0, 10);    //Calculate the integer part of OD first, then modify later based on the decimal    double window = 49.5 - 3 * Math.Floor(OD);    //If OD has a decimal place    if(OD % 1 != 0)    {        //Avoid precision bugs - round to one decimal place        double ODdecimal = Math.Round(OD - Math.Floor(OD), 1);        if(0.1 <= ODdecimal && ODdecimal <= 0.3)            window -= 1;        else if(0.4 <= ODdecimal && ODdecimal <= 0.6)            window -= 2;        else if(0.7 <= ODdecimal && ODdecimal <= 0.9)            window -= 3;    }    if(((int)mods & (int)Modifiers.DoubleTime) > 0 || ((int)mods & (int)Modifiers.Nightcore) > 0)        window /= 1.5;    else if(((int)mods & (int)Modifiers.HalfTime) > 0)        window /= 0.75;    return window;}`
If anyone needs an explanation I can explain it, but yea, OD is weird when it comes to decimals...
Fixed the broken OD calculations by everyone, made some checkboxes pretty, made the calculation realtime, added a nice hosted domain.

I might add input validation and more CSS later.

http://pp.mon.im/

#### montymintypie wrote:

Fixed the broken OD calculations by everyone, made some checkboxes pretty, made the calculation realtime, added a nice hosted domain.

I might add input validation and more CSS later.

http://pp.mon.im/
Awesome :0!!
...Do you mind if I copy your OD calculation function? It's much cleaner than my implementation haha. I'll give credit if you're ok with it.
Nice, thanks!

By the way, it looks like you forgot to clamp od after applying the multiplier from HR/EZ

http://puu.sh/rixFO/7e3a6e8060.jpg