diff --git a/source/funkin/Conductor.hx b/source/funkin/Conductor.hx
index 590e066a4..a9290dc16 100644
--- a/source/funkin/Conductor.hx
+++ b/source/funkin/Conductor.hx
@@ -1,5 +1,6 @@
 package funkin;
 
+import flixel.util.FlxSignal;
 import funkin.SongLoad.SwagSong;
 import funkin.play.song.Song.SongDifficulty;
 import funkin.play.song.SongData.ConductorTimeChange;
@@ -18,12 +19,12 @@ class Conductor
 	 * The list of time changes in the song.
 	 * There should be at least one time change (at the beginning of the song) to define the BPM.
 	 */
-	private static var timeChanges:Array<ConductorTimeChange> = [];
+	private static var timeChanges:Array<SongTimeChange> = [];
 
 	/**
 	 * The current time change.
 	 */
-	private static var currentTimeChange:ConductorTimeChange;
+	private static var currentTimeChange:SongTimeChange;
 
 	/**
 	 * The current position in the song in milliseconds.
@@ -81,12 +82,15 @@ class Conductor
 		return currentStep;
 	}
 
+	public static var beatHit(default, null):FlxSignal = new FlxSignal();
+	public static var stepHit(default, null):FlxSignal = new FlxSignal();
+
 	public static var lastSongPos:Float;
 	public static var visualOffset:Float = 0;
 	public static var audioOffset:Float = 0;
 	public static var offset:Float = 0;
 
-	public function new()
+	private function new()
 	{
 	}
 
@@ -120,8 +124,30 @@ class Conductor
 	 */
 	public static function update(songPosition:Float)
 	{
-		Conductor.songPosition = songPosition;
-		Conductor.bpm = Conductor.getLastBPMChange().bpm;
+		var oldBeat = currentBeat;
+		var oldStep = currentStep;
+
+		songPosition = songPosition;
+		bpm = Conductor.getLastBPMChange().bpm;
+
+		for (i in 0...timeChanges.length)
+		{
+			if (songPosition >= timeChanges[i].songTime)
+				currentTimeChange = timeChanges[i];
+
+			if (songPosition < timeChanges[i].songTime)
+				break;
+		}
+
+		currentStep = (currentTimeChange.beatTime * 4) + (songPosition - currentTimeChange.songTime) / stepCrochet;
+		currentBeat = Math.floor(currentStep / 4);
+
+		// FlxSignals are really cool.
+		if (currentStep != oldStep)
+			stepHit.dispatch();
+
+		if (currentBeat != oldBeat)
+			beatHit.dispatch();
 	}
 
 	public static function mapBPMChanges(song:SwagSong)
@@ -157,23 +183,24 @@ class Conductor
 
 		timeChanges = [];
 
-		for (songTimeChange in timeChanges)
+		for (currentTimeChange in timeChanges)
 		{
-			var prevTimeChange:ConductorTimeChange = timeChanges.length == 0 ? null : timeChanges[timeChanges.length - 1];
-			var currentTimeChange:ConductorTimeChange = cast songTimeChange;
+			var prevTimeChange:SongTimeChange = timeChanges.length == 0 ? null : timeChanges[timeChanges.length - 1];
 
-			if (prevTimeChange != null)
-			{
-				var deltaTime:Float = currentTimeChange.timeStamp - prevTimeChange.timeStamp;
-				var deltaSteps:Int = Math.round(deltaTime / (60 / prevTimeChange.bpm) * 1000 / 4);
+			/*
+				if (prevTimeChange != null)
+				{
+					var deltaTime:Float = currentTimeChange.timeStamp - prevTimeChange.timeStamp;
+					var deltaSteps:Int = Math.round(deltaTime / (60 / prevTimeChange.bpm) * 1000 / 4);
 
-				currentTimeChange.stepTime = prevTimeChange.stepTime + deltaSteps;
-			}
-			else
-			{
-				// We know the time and steps of this time change is 0, since this is the first time change.
-				currentTimeChange.stepTime = 0;
-			}
+					currentTimeChange.stepTime = prevTimeChange.stepTime + deltaSteps;
+				}
+				else
+				{
+					// We know the time and steps of this time change is 0, since this is the first time change.
+					currentTimeChange.stepTime = 0;
+				}
+			 */
 
 			timeChanges.push(currentTimeChange);
 		}
diff --git a/source/funkin/MusicBeatState.hx b/source/funkin/MusicBeatState.hx
index 5f4fdcf49..3967017ac 100644
--- a/source/funkin/MusicBeatState.hx
+++ b/source/funkin/MusicBeatState.hx
@@ -115,37 +115,16 @@ class MusicBeatState extends FlxUIState
 		FlxG.resetState();
 	}
 
-	private function updateBeat():Void
-	{
-		curBeat = Math.floor(curStep / 4);
-	}
-
-	private function updateCurStep():Void
-	{
-		var lastChange:BPMChangeEvent = {
-			stepTime: 0,
-			songTime: 0,
-			bpm: 0
-		}
-		for (i in 0...Conductor.bpmChangeMap.length)
-		{
-			if (Conductor.songPosition >= Conductor.bpmChangeMap[i].songTime)
-				lastChange = Conductor.bpmChangeMap[i];
-		}
-
-		curStep = lastChange.stepTime + Math.floor((Conductor.songPosition - lastChange.songTime) / Conductor.stepCrochet);
-	}
-
 	public function stepHit():Bool
 	{
-		var event = new SongTimeScriptEvent(ScriptEvent.SONG_STEP_HIT, curBeat, curStep);
+		var event = new SongTimeScriptEvent(ScriptEvent.SONG_STEP_HIT, Conductor.currentBeat, Conductor.currentStep);
 
 		dispatchEvent(event);
 
 		if (event.eventCanceled)
 			return false;
 
-		if (curStep % 4 == 0)
+		if (Conductor.currentStep % 4 == 0)
 			beatHit();
 
 		return true;
@@ -153,7 +132,7 @@ class MusicBeatState extends FlxUIState
 
 	public function beatHit():Bool
 	{
-		var event = new SongTimeScriptEvent(ScriptEvent.SONG_BEAT_HIT, curBeat, curStep);
+		var event = new SongTimeScriptEvent(ScriptEvent.SONG_BEAT_HIT, Conductor.currentBeat, Conductor.currentStep);
 
 		dispatchEvent(event);
 
diff --git a/source/funkin/play/song/SongData.hx b/source/funkin/play/song/SongData.hx
index 04d3d2305..601051970 100644
--- a/source/funkin/play/song/SongData.hx
+++ b/source/funkin/play/song/SongData.hx
@@ -709,113 +709,6 @@ abstract SongTimeChange(RawSongTimeChange)
 	}
 }
 
-abstract ConductorTimeChange(RawConductorTimeChange)
-{
-	public function new(timeStamp:Float, beatTime:Int, bpm:Float, timeSignatureNum:Int = 4, timeSignatureDen:Int = 4, beatTuplets:Array<Int>)
-	{
-		this = {
-			t: timeStamp,
-			b: beatTime,
-			bpm: bpm,
-			n: timeSignatureNum,
-			d: timeSignatureDen,
-			bt: beatTuplets,
-			st: 0.0
-		}
-	}
-
-	public var timeStamp(get, set):Float;
-
-	public function get_timeStamp():Float
-	{
-		return this.t;
-	}
-
-	public function set_timeStamp(value:Float):Float
-	{
-		return this.t = value;
-	}
-
-	public var beatTime(get, set):Int;
-
-	public function get_beatTime():Int
-	{
-		return this.b;
-	}
-
-	public function set_beatTime(value:Int):Int
-	{
-		return this.b = value;
-	}
-
-	public var bpm(get, set):Float;
-
-	public function get_bpm():Float
-	{
-		return this.bpm;
-	}
-
-	public function set_bpm(value:Float):Float
-	{
-		return this.bpm = value;
-	}
-
-	public var timeSignatureNum(get, set):Int;
-
-	public function get_timeSignatureNum():Int
-	{
-		return this.n;
-	}
-
-	public function set_timeSignatureNum(value:Int):Int
-	{
-		return this.n = value;
-	}
-
-	public var timeSignatureDen(get, set):Int;
-
-	public function get_timeSignatureDen():Int
-	{
-		return this.d;
-	}
-
-	public function set_timeSignatureDen(value:Int):Int
-	{
-		return this.d = value;
-	}
-
-	public var beatTuplets(get, set):Array<Int>;
-
-	public function get_beatTuplets():Array<Int>
-	{
-		if (Std.isOfType(this.bt, Int))
-		{
-			return [this.bt];
-		}
-		else
-		{
-			return this.bt;
-		}
-	}
-
-	public function set_beatTuplets(value:Array<Int>):Array<Int>
-	{
-		return this.bt = value;
-	}
-
-	public var stepTime(get, set):Float;
-
-	public function get_stepTime():Float
-	{
-		return this.st;
-	}
-
-	public function set_stepTime(value:Float):Float
-	{
-		return this.st = value;
-	}
-}
-
 enum abstract SongTimeFormat(String) from String to String
 {
 	var TICKS = "ticks";