diff --git a/osu.Game/Screens/Edit/BindableBeatDivisor.cs b/osu.Game/Screens/Edit/BindableBeatDivisor.cs
index aa8e202e22..f1b97571bd 100644
--- a/osu.Game/Screens/Edit/BindableBeatDivisor.cs
+++ b/osu.Game/Screens/Edit/BindableBeatDivisor.cs
@@ -154,12 +154,15 @@ namespace osu.Game.Screens.Edit
///
/// The 0-based beat index.
/// The beat divisor.
+ /// The list of valid divisors which can be chosen from. Assumes ordered from low to high.
/// The applicable divisor.
- public static int GetDivisorForBeatIndex(int index, int beatDivisor)
+ public static int GetDivisorForBeatIndex(int index, int beatDivisor, int[] validDivisors = null)
{
+ validDivisors ??= PREDEFINED_DIVISORS;
+
int beat = index % beatDivisor;
- foreach (int divisor in PREDEFINED_DIVISORS)
+ foreach (int divisor in validDivisors)
{
if ((beat * divisor) % beatDivisor == 0)
return divisor;
diff --git a/osu.Game/Screens/Edit/Compose/Components/BeatDivisorControl.cs b/osu.Game/Screens/Edit/Compose/Components/BeatDivisorControl.cs
index 04cc736e7d..2dd5791943 100644
--- a/osu.Game/Screens/Edit/Compose/Components/BeatDivisorControl.cs
+++ b/osu.Game/Screens/Edit/Compose/Components/BeatDivisorControl.cs
@@ -401,13 +401,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
int largestDivisor = beatDivisor.ValidDivisors.Value.Presets.Max();
for (int tickIndex = 0; tickIndex <= largestDivisor; tickIndex++)
{
- int divisor = largestDivisor;
- // Find lowest divisor that the tick fits into
- foreach (int validDivisor in beatDivisor.ValidDivisors.Value.Presets)
- {
- if (divisor > validDivisor && (tickIndex * validDivisor) % largestDivisor == 0)
- divisor = validDivisor;
- }
+ int divisor = BindableBeatDivisor.GetDivisorForBeatIndex(tickIndex, largestDivisor, (int[])beatDivisor.ValidDivisors.Value.Presets);
bool isSolidTick = divisor * (largestDivisor - tickIndex) == largestDivisor;
AddInternal(new Tick(isSolidTick, divisor)