private IEnumerable <Issue> GetIssue(HitObject hitObject, double time, float volume, bool isActive = false) { volume = GetActualVolume(volume); if (volume > 20) { // Volumes greater than 20% are usually audible. yield break; } bool isHead = time.AlmostEqual(hitObject.time); string timestamp = isHead ? Timestamp.Get(hitObject) : Timestamp.Get(time); string partName = hitObject.GetPartName(time).ToLower().Replace("body", "tick"); if (isActive) { if (isHead) { if (volume <= 10) { yield return(new Issue(GetTemplate("Warning Volume"), hitObject.beatmap, timestamp, volume, partName)); } else { yield return(new Issue(GetTemplate("Minor Volume"), hitObject.beatmap, timestamp, volume, partName)); } } else { // Must be a slider reverse, mappers rarely map these to nothing. if (volume <= 10) { yield return(new Issue(GetTemplate("Passive Reverse"), hitObject.beatmap, timestamp, volume, partName)); } } } else if (volume <= 10) { // Must be a slider tail or similar, these are often silenced intentionally. yield return(new Issue(GetTemplate("Passive"), hitObject.beatmap, timestamp, volume, partName)); } }