diff --git a/osu.Game.Rulesets.Mania.Tests/ManiaColumnTypeTest.cs b/osu.Game.Rulesets.Mania.Tests/ManiaColumnTypeTest.cs
new file mode 100644
index 0000000000..40a6e1fdae
--- /dev/null
+++ b/osu.Game.Rulesets.Mania.Tests/ManiaColumnTypeTest.cs
@@ -0,0 +1,50 @@
+// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using System.Collections.Generic;
+using osu.Game.Rulesets.Mania.Beatmaps;
+using NUnit.Framework;
+
+namespace osu.Game.Rulesets.Mania.Tests
+{
+    [TestFixture]
+    public class ManiaColumnTypeTest
+    {
+        [TestCase(new[]
+        {
+            ColumnType.Special
+        }, 1)]
+        [TestCase(new[]
+        {
+            ColumnType.Odd,
+            ColumnType.Even,
+            ColumnType.Even,
+            ColumnType.Odd
+        }, 4)]
+        [TestCase(new[]
+        {
+            ColumnType.Odd,
+            ColumnType.Even,
+            ColumnType.Odd,
+            ColumnType.Special,
+            ColumnType.Odd,
+            ColumnType.Even,
+            ColumnType.Odd
+        }, 7)]
+        public void Test(IEnumerable<ColumnType> expected, int columns)
+        {
+            var definition = new StageDefinition
+            {
+                Columns = columns
+            };
+            var results = getResults(definition);
+            Assert.AreEqual(expected, results);
+        }
+
+        private IEnumerable<ColumnType> getResults(StageDefinition definition)
+        {
+            for (var i = 0; i < definition.Columns; i++)
+                yield return definition.GetTypeOfColumn(i);
+        }
+    }
+}
diff --git a/osu.Game.Rulesets.Mania/Beatmaps/ColumnType.cs b/osu.Game.Rulesets.Mania/Beatmaps/ColumnType.cs
new file mode 100644
index 0000000000..8f904530bc
--- /dev/null
+++ b/osu.Game.Rulesets.Mania/Beatmaps/ColumnType.cs
@@ -0,0 +1,12 @@
+// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+namespace osu.Game.Rulesets.Mania.Beatmaps
+{
+    public enum ColumnType
+    {
+        Even,
+        Odd,
+        Special
+    }
+}
diff --git a/osu.Game.Rulesets.Mania/Beatmaps/StageDefinition.cs b/osu.Game.Rulesets.Mania/Beatmaps/StageDefinition.cs
index dff7cb72ce..2557f2acdf 100644
--- a/osu.Game.Rulesets.Mania/Beatmaps/StageDefinition.cs
+++ b/osu.Game.Rulesets.Mania/Beatmaps/StageDefinition.cs
@@ -1,6 +1,7 @@
 // Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
 // See the LICENCE file in the repository root for full licence text.
 
+using System;
 using osu.Game.Rulesets.Mania.UI;
 
 namespace osu.Game.Rulesets.Mania.Beatmaps
@@ -21,5 +22,19 @@ namespace osu.Game.Rulesets.Mania.Beatmaps
         /// <param name="column">The 0-based column index.</param>
         /// <returns>Whether the column is a special column.</returns>
         public bool IsSpecialColumn(int column) => Columns % 2 == 1 && column == Columns / 2;
+
+        /// <summary>
+        /// Get the type of column given a column index.
+        /// </summary>
+        /// <param name="column">The 0-based column index.</param>
+        /// <returns>The type of the column.</returns>
+        public ColumnType GetTypeOfColumn(int column)
+        {
+            if (IsSpecialColumn(column))
+                return ColumnType.Special;
+
+            int distanceToEdge = Math.Min(column, (Columns - 1) - column);
+            return distanceToEdge % 2 == 0 ? ColumnType.Odd : ColumnType.Even;
+        }
     }
 }
diff --git a/osu.Game.Rulesets.Mania/UI/Column.cs b/osu.Game.Rulesets.Mania/UI/Column.cs
index 9e0e2c157e..141718ef5e 100644
--- a/osu.Game.Rulesets.Mania/UI/Column.cs
+++ b/osu.Game.Rulesets.Mania/UI/Column.cs
@@ -16,6 +16,7 @@ using osu.Game.Rulesets.Mania.UI.Components;
 using osu.Game.Rulesets.UI.Scrolling;
 using osu.Game.Skinning;
 using osuTK;
+using osu.Game.Rulesets.Mania.Beatmaps;
 
 namespace osu.Game.Rulesets.Mania.UI
 {
@@ -66,22 +67,24 @@ namespace osu.Game.Rulesets.Mania.UI
 
         public override Axes RelativeSizeAxes => Axes.Y;
 
-        private bool isSpecial;
+        private ColumnType columnType;
 
-        public bool IsSpecial
+        public ColumnType ColumnType
         {
-            get => isSpecial;
+            get => columnType;
             set
             {
-                if (isSpecial == value)
+                if (columnType == value)
                     return;
 
-                isSpecial = value;
+                columnType = value;
 
-                Width = isSpecial ? special_column_width : COLUMN_WIDTH;
+                Width = IsSpecial ? special_column_width : COLUMN_WIDTH;
             }
         }
 
+        public bool IsSpecial => columnType == ColumnType.Special;
+
         public Color4 AccentColour { get; set; }
 
         protected override IReadOnlyDependencyContainer CreateChildDependencies(IReadOnlyDependencyContainer parent)
diff --git a/osu.Game.Rulesets.Mania/UI/ManiaStage.cs b/osu.Game.Rulesets.Mania/UI/ManiaStage.cs
index bd21663c4e..9edb384753 100644
--- a/osu.Game.Rulesets.Mania/UI/ManiaStage.cs
+++ b/osu.Game.Rulesets.Mania/UI/ManiaStage.cs
@@ -1,10 +1,8 @@
 // Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
 // See the LICENCE file in the repository root for full licence text.
 
-using System;
 using System.Collections.Generic;
 using System.Linq;
-using osu.Framework.Allocation;
 using osu.Framework.Graphics;
 using osu.Framework.Graphics.Containers;
 using osu.Framework.Graphics.Shapes;
@@ -40,8 +38,12 @@ namespace osu.Game.Rulesets.Mania.UI
 
         private readonly Container topLevelContainer;
 
-        private List<Color4> normalColumnColours = new List<Color4>();
-        private Color4 specialColumnColour;
+        private readonly Dictionary<ColumnType, Color4> columnColours = new Dictionary<ColumnType, Color4>
+        {
+            { ColumnType.Even, new Color4(6, 84, 0, 255) },
+            { ColumnType.Odd, new Color4(94, 0, 57, 255) },
+            { ColumnType.Special, new Color4(0, 48, 63, 255) }
+        };
 
         public override bool ReceivePositionalInputAt(Vector2 screenSpacePos) => Columns.Any(c => c.ReceivePositionalInputAt(screenSpacePos));
 
@@ -126,11 +128,12 @@ namespace osu.Game.Rulesets.Mania.UI
 
             for (int i = 0; i < definition.Columns; i++)
             {
-                var isSpecial = definition.IsSpecialColumn(i);
+                var columnType = definition.GetTypeOfColumn(i);
                 var column = new Column(firstColumnIndex + i)
                 {
-                    IsSpecial = isSpecial,
-                    Action = { Value = isSpecial ? specialColumnStartAction++ : normalColumnStartAction++ }
+                    ColumnType = columnType,
+                    AccentColour = columnColours[columnType],
+                    Action = { Value = columnType == ColumnType.Special ? specialColumnStartAction++ : normalColumnStartAction++ }
                 };
 
                 AddColumn(column);
@@ -196,38 +199,6 @@ namespace osu.Game.Rulesets.Mania.UI
             });
         }
 
-        [BackgroundDependencyLoader]
-        private void load()
-        {
-            normalColumnColours = new List<Color4>
-            {
-                new Color4(94, 0, 57, 255),
-                new Color4(6, 84, 0, 255)
-            };
-
-            specialColumnColour = new Color4(0, 48, 63, 255);
-
-            // Set the special column + colour + key
-            foreach (var column in Columns)
-            {
-                if (!column.IsSpecial)
-                    continue;
-
-                column.AccentColour = specialColumnColour;
-            }
-
-            var nonSpecialColumns = Columns.Where(c => !c.IsSpecial).ToList();
-
-            // We'll set the colours of the non-special columns in a separate loop, because the non-special
-            // column colours are mirrored across their centre and special styles mess with this
-            for (int i = 0; i < Math.Ceiling(nonSpecialColumns.Count / 2f); i++)
-            {
-                Color4 colour = normalColumnColours[i % normalColumnColours.Count];
-                nonSpecialColumns[i].AccentColour = colour;
-                nonSpecialColumns[nonSpecialColumns.Count - 1 - i].AccentColour = colour;
-            }
-        }
-
         protected override void Update()
         {
             // Due to masking differences, it is not possible to get the width of the columns container automatically