diff --git a/osu.Game/Screens/Edit/Compose/Components/Timeline/TimelineBlueprintContainer.cs b/osu.Game/Screens/Edit/Compose/Components/Timeline/TimelineBlueprintContainer.cs
index a4083f58b6..578e945c64 100644
--- a/osu.Game/Screens/Edit/Compose/Components/Timeline/TimelineBlueprintContainer.cs
+++ b/osu.Game/Screens/Edit/Compose/Components/Timeline/TimelineBlueprintContainer.cs
@@ -16,6 +16,7 @@ using osu.Framework.Graphics.Containers;
 using osu.Framework.Graphics.Shapes;
 using osu.Framework.Input.Events;
 using osu.Framework.Utils;
+using osu.Game.Audio;
 using osu.Game.Graphics;
 using osu.Game.Rulesets.Edit;
 using osu.Game.Rulesets.Objects;
@@ -131,7 +132,8 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
 
         private void updateSamplePointContractedState()
         {
-            const double minimum_gap = 28;
+            const double absolute_minimum_gap = 31; // assumes single letter bank name for default banks
+            double minimumGap = absolute_minimum_gap;
 
             if (timeline == null || editorClock == null)
                 return;
@@ -153,9 +155,23 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
                 if (hitObject.GetEndTime() < editorClock.CurrentTime - timeline.VisibleRange / 2)
                     break;
 
+                foreach (var sample in hitObject.Samples)
+                {
+                    if (!HitSampleInfo.AllBanks.Contains(sample.Bank))
+                        minimumGap = Math.Max(minimumGap, absolute_minimum_gap + sample.Bank.Length * 3);
+                }
+
                 if (hitObject is IHasRepeats hasRepeats)
+                {
                     smallestTimeGap = Math.Min(smallestTimeGap, hasRepeats.Duration / hasRepeats.SpanCount() / 2);
 
+                    foreach (var sample in hasRepeats.NodeSamples.SelectMany(s => s))
+                    {
+                        if (!HitSampleInfo.AllBanks.Contains(sample.Bank))
+                            minimumGap = Math.Max(minimumGap, absolute_minimum_gap + sample.Bank.Length * 3);
+                    }
+                }
+
                 double gap = lastTime - hitObject.GetEndTime();
 
                 // If the gap is less than 1ms, we can assume that the objects are stacked on top of each other
@@ -167,7 +183,7 @@ namespace osu.Game.Screens.Edit.Compose.Components.Timeline
             }
 
             double smallestAbsoluteGap = ((TimelineSelectionBlueprintContainer)SelectionBlueprints).ContentRelativeToAbsoluteFactor.X * smallestTimeGap;
-            SamplePointContracted.Value = smallestAbsoluteGap < minimum_gap;
+            SamplePointContracted.Value = smallestAbsoluteGap < minimumGap;
         }
 
         private readonly Stack<HitObject> currentConcurrentObjects = new Stack<HitObject>();