diff --git a/source/Note.hx b/source/Note.hx
index d979f75a6..9659ad3c0 100644
--- a/source/Note.hx
+++ b/source/Note.hx
@@ -1,9 +1,12 @@
 package;
 
+import flixel.FlxG;
 import flixel.FlxSprite;
 import flixel.graphics.frames.FlxAtlasFrames;
 import flixel.math.FlxMath;
 import flixel.util.FlxColor;
+import flixel.util.FlxTimer;
+import shaderslmfao.ColorSwap;
 
 using StringTools;
 
@@ -101,6 +104,17 @@ class Note extends FlxSprite
 				setGraphicSize(Std.int(width * 0.7));
 				updateHitbox();
 				antialiasing = true;
+
+				var colorSwap = new ColorSwap();
+
+				// shader = colorSwap.shader;
+
+				// colorSwap.colorToReplace = 0xFFF9393F;
+				// colorSwap.newColor = 0xFF00FF00;
+
+				// color = FlxG.random.color();
+				// color.saturation *= 4;
+				// replaceColor(0xFFC1C1C1, FlxColor.RED);
 		}
 
 		switch (noteData)
diff --git a/source/shaderslmfao/ColorSwap.hx b/source/shaderslmfao/ColorSwap.hx
new file mode 100644
index 000000000..4d2eac78e
--- /dev/null
+++ b/source/shaderslmfao/ColorSwap.hx
@@ -0,0 +1,90 @@
+package shaderslmfao;
+
+import flixel.system.FlxAssets.FlxShader;
+import flixel.util.FlxColor;
+
+class ColorSwap
+{
+	public var shader(default, null):ColorSwapShader;
+	public var colorToReplace(default, set):FlxColor;
+	public var newColor(default, set):FlxColor;
+
+	public function new():Void
+	{
+		shader = new ColorSwapShader();
+		shader.colorOld.value = [];
+		shader.colorNew.value = [];
+	}
+
+	function set_colorToReplace(color:FlxColor):FlxColor
+	{
+		colorToReplace = color;
+
+		shader.colorOld.value[0] = color.red;
+		shader.colorOld.value[1] = color.green;
+		shader.colorOld.value[2] = color.blue;
+
+		return color;
+	}
+
+	function set_newColor(color:FlxColor):FlxColor
+	{
+		newColor = color;
+
+		shader.colorNew.value[0] = color.red;
+		shader.colorNew.value[1] = color.green;
+		shader.colorNew.value[2] = color.blue;
+
+		return color;
+	}
+}
+
+class ColorSwapShader extends FlxShader
+{
+	@:glFragmentSource('
+        #pragma header
+
+        uniform vec3 colorOld;
+        uniform vec3 colorNew;
+        uniform float u_time;
+
+        vec3 normalizeColor(vec3 color)
+        {
+            return vec3(
+                color[0] / 255.0,
+                color[1] / 255.0,
+                color[2] / 255.0
+            );
+        }
+
+        vec3 hueShift(vec3 color, float hue) {
+            const vec3 k = vec3(0.57735, 0.57735, 0.57735);
+            float cosAngle = cos(hue);
+            return vec3(color * cosAngle + cross(k, color) * sin(hue) + k * dot(k, color) * (1.0 - cosAngle));
+        }
+
+
+        void main()
+        {
+            vec4 pixel = texture2D(bitmap, openfl_TextureCoordv);
+
+            vec3 eps = vec3(0.02, 0.02, 0.02);
+
+            vec3 colorOldNormalized = normalizeColor(colorOld);
+            vec3 colorNewNormalized = normalizeColor(colorNew);
+
+            if (all(greaterThanEqual(pixel, vec4(colorOldNormalized - eps, 1.0)) ) && all(lessThanEqual(pixel, vec4(colorOldNormalized + eps, 1.0)) )
+            )
+            {
+                pixel = vec4(hueShift(colorOldNormalized, 0.7), 1.0);
+            }
+
+            gl_FragColor = pixel;
+        }
+
+    ')
+	public function new()
+	{
+		super();
+	}
+}