Tapping Efficiency in osu!phd is described as how efficient your technique for tapping is, but physical technique cannot be measured as we only have the results of that technique: your score. So, osu!at focuses on the result of good Tapping Efficiency: Long Stream Endurance.
As Tapping Efficiency implements the StrainSkill abstract class, it’s very simple and easy to create strain dependent on bpm.
We can increment TotalCurPP by Math.Clamp(0,x.BPM/180,1) so that a minimum of 1/4th 180 bpm speed time is required to move it forward and all circles under that timeframe simply give it time to decrease a bit.
The only reason this is an equation rather than incrementing it by one every circle is to prevent having a solid border between notes considered a stream and notes that aren’t (ex. instead of 150bpm is allowed but 140bpm is banned, 150 is allowed and 140’s value is just less than 150’s value)
TotalCurPP += Math.Clamp(
(curHit.StartTime - lastHit.StartTime)/(SharedMethods.ToMS(180))
0,
1)
$$ S_{trainLen} = \text{StrainSkill.GetAppliedStrain()} $$
Although being able to stream 1000 notes is more impressive than being able to stream 500, the scaling of difficulty between the two are not linear, it’s more logarithmic.
Being able to burst 3 circles and being able to stream 20 notes is a very large difficulty gap compared to streaming 30 notes and streaming 33 notes, which also follows the pattern of a logarithmic curve.
This logarithmic-type scaling of improvement is due to the increase in technique efficiency that occurs over time: once you can tap at a certain speed for 10 seconds without problems, 30 seconds would end up being nearly like nothing changed.
With that in mind, the equation ends up looking like this: