diff --git a/source/InitState.hx b/source/InitState.hx
index 949b17930..96d94a8f5 100644
--- a/source/InitState.hx
+++ b/source/InitState.hx
@@ -1,5 +1,6 @@
 package;
 
+import charting.ChartingState;
 import flixel.addons.transition.FlxTransitionSprite.GraphicTransTileDiamond;
 import flixel.addons.transition.FlxTransitionableState;
 import flixel.addons.transition.TransitionData;
diff --git a/source/LatencyState.hx b/source/LatencyState.hx
index 9b8e75d1b..e4214577d 100644
--- a/source/LatencyState.hx
+++ b/source/LatencyState.hx
@@ -61,7 +61,7 @@ class LatencyState extends FlxState
 
 		noteGrp.forEach(function(daNote:Note)
 		{
-			daNote.y = (strumLine.y - (Conductor.songPosition - daNote.strumTime) * 0.45);
+			daNote.y = (strumLine.y - (Conductor.songPosition - daNote.data.strumTime) * 0.45);
 			daNote.x = strumLine.x + 30;
 
 			if (daNote.y < strumLine.y)
diff --git a/source/Main.hx b/source/Main.hx
index 0c219844c..fa3a0d43b 100644
--- a/source/Main.hx
+++ b/source/Main.hx
@@ -25,7 +25,7 @@ class Main extends Sprite
 	#if web
 	var framerate:Int = 60; // How many frames per second the game should run at.
 	#else
-	var framerate:Int = 144; // How many frames per second the game should run at.
+	var framerate:Int = 300; // How many frames per second the game should run at.
 
 	#end
 	var skipSplash:Bool = true; // Whether to skip the flixel splash screen that appears in release mode.
diff --git a/source/Note.hx b/source/Note.hx
index 12e3ea5e8..4b6f0c1f3 100644
--- a/source/Note.hx
+++ b/source/Note.hx
@@ -16,11 +16,15 @@ import polymod.format.ParseRules.TargetSignatureElement;
 
 class Note extends FlxSprite
 {
-	public var strumTime:Float = 0;
+	public var data:NoteData = {
+		strumTime: 0,
+		sustainLength: 0,
+		altNote: false,
+		noteData: 0
+	};
 
 	public var mustPress:Bool = false;
 	public var followsTime:Bool = true; // used if you want the note to follow the time shit!
-	public var noteData:Int = 0;
 	public var canBeHit:Bool = false;
 	public var tooLate:Bool = false;
 	public var wasGoodHit:Bool = false;
@@ -28,10 +32,8 @@ class Note extends FlxSprite
 
 	private var willMiss:Bool = false;
 
-	public var altNote:Bool = false;
 	public var invisNote:Bool = false;
 
-	public var sustainLength:Float = 0;
 	public var isSustainNote:Bool = false;
 
 	public var colorSwap:ColorSwap;
@@ -56,7 +58,7 @@ class Note extends FlxSprite
 	// anything below sick threshold is sick
 	public static var arrowColors:Array<Float> = [1, 1, 1, 1];
 
-	public function new(strumTime:Float, noteData:Int, ?prevNote:Note, ?sustainNote:Bool = false)
+	public function new(strumTime:Float = 0, noteData:Int, ?prevNote:Note, ?sustainNote:Bool = false)
 	{
 		super();
 
@@ -69,9 +71,9 @@ class Note extends FlxSprite
 		x += 50;
 		// MAKE SURE ITS DEFINITELY OFF SCREEN?
 		y -= 2000;
-		this.strumTime = strumTime;
+		data.strumTime = strumTime;
 
-		this.noteData = noteData;
+		data.noteData = noteData;
 
 		var daStage:String = PlayState.curStage;
 
@@ -185,7 +187,7 @@ class Note extends FlxSprite
 
 			if (prevNote.isSustainNote)
 			{
-				switch (prevNote.noteData)
+				switch (prevNote.data.noteData)
 				{
 					case 0:
 						prevNote.animation.play('purplehold');
@@ -218,7 +220,7 @@ class Note extends FlxSprite
 
 	public function updateColors():Void
 	{
-		colorSwap.update(arrowColors[noteData]);
+		colorSwap.update(arrowColors[data.noteData]);
 	}
 
 	override function update(elapsed:Float)
@@ -235,15 +237,15 @@ class Note extends FlxSprite
 			}
 			else
 			{
-				if (!pastHalfWay && strumTime <= Conductor.songPosition)
+				if (!pastHalfWay && data.strumTime <= Conductor.songPosition)
 				{
 					pastHalfWay = true;
 					noteSpeedMulti *= 2;
 				}
 
-				if (strumTime > Conductor.songPosition - HIT_WINDOW)
+				if (data.strumTime > Conductor.songPosition - HIT_WINDOW)
 				{ // * 0.5 if sustain note, so u have to keep holding it closer to all the way thru!
-					if (strumTime < Conductor.songPosition + (HIT_WINDOW * (isSustainNote ? 0.5 : 1)))
+					if (data.strumTime < Conductor.songPosition + (HIT_WINDOW * (isSustainNote ? 0.5 : 1)))
 						canBeHit = true;
 				}
 				else
@@ -257,7 +259,7 @@ class Note extends FlxSprite
 		{
 			canBeHit = false;
 
-			if (strumTime <= Conductor.songPosition)
+			if (data.strumTime <= Conductor.songPosition)
 				wasGoodHit = true;
 		}
 
@@ -268,3 +270,11 @@ class Note extends FlxSprite
 		}
 	}
 }
+
+typedef NoteData =
+{
+	var strumTime:Float;
+	var noteData:Int;
+	var sustainLength:Float;
+	var altNote:Bool;
+}
diff --git a/source/PlayState.hx b/source/PlayState.hx
index cc4075232..6824a0507 100644
--- a/source/PlayState.hx
+++ b/source/PlayState.hx
@@ -2,6 +2,7 @@ package;
 
 import Section.SwagSection;
 import SongLoad.SwagSong;
+import charting.ChartingState;
 import flixel.FlxCamera;
 import flixel.FlxObject;
 import flixel.FlxSprite;
@@ -1586,12 +1587,12 @@ class PlayState extends MusicBeatState
 		{
 			for (songNotes in section.sectionNotes)
 			{
-				var daStrumTime:Float = songNotes[0];
-				var daNoteData:Int = Std.int(songNotes[1] % 4);
+				var daStrumTime:Float = songNotes.strumTime;
+				var daNoteData:Int = Std.int(songNotes.noteData % 4);
 
 				var gottaHitNote:Bool = section.mustHitSection;
 
-				if (songNotes[1] > 3)
+				if (songNotes.noteData > 3)
 					gottaHitNote = !section.mustHitSection;
 
 				var oldNote:Note;
@@ -1601,11 +1602,11 @@ class PlayState extends MusicBeatState
 					oldNote = null;
 
 				var swagNote:Note = new Note(daStrumTime, daNoteData, oldNote);
-				swagNote.sustainLength = songNotes[2];
-				swagNote.altNote = songNotes[3];
+				swagNote.data.sustainLength = songNotes.sustainLength;
+				swagNote.data.altNote = songNotes.altNote;
 				swagNote.scrollFactor.set(0, 0);
 
-				var susLength:Float = swagNote.sustainLength;
+				var susLength:Float = swagNote.data.sustainLength;
 
 				susLength = susLength / Conductor.stepCrochet;
 				unspawnNotes.push(swagNote);
@@ -1646,7 +1647,7 @@ class PlayState extends MusicBeatState
 
 	function sortNotes(order:Int = FlxSort.ASCENDING, Obj1:Note, Obj2:Note)
 	{
-		return FlxSort.byValues(order, Obj1.strumTime, Obj2.strumTime);
+		return FlxSort.byValues(order, Obj1.data.strumTime, Obj2.data.strumTime);
 	}
 
 	// ^ These two sorts also look cute together ^
@@ -2117,7 +2118,7 @@ class PlayState extends MusicBeatState
 			}
 		}
 
-		while (unspawnNotes[0] != null && unspawnNotes[0].strumTime - Conductor.songPosition < 1800 / SongLoad.getSpeed())
+		while (unspawnNotes[0] != null && unspawnNotes[0].data.strumTime - Conductor.songPosition < 1800 / SongLoad.getSpeed())
 		{
 			var dunceNote:Note = unspawnNotes[0];
 			notes.add(dunceNote);
@@ -2144,7 +2145,8 @@ class PlayState extends MusicBeatState
 				var strumLineMid = strumLine.y + Note.swagWidth / 2;
 
 				if (daNote.followsTime)
-					daNote.y = (Conductor.songPosition - daNote.strumTime) * (0.45 * FlxMath.roundDecimal(SongLoad.getSpeed(), 2) * daNote.noteSpeedMulti);
+					daNote.y = (Conductor.songPosition - daNote.data.strumTime) * (0.45 * FlxMath.roundDecimal(SongLoad.getSpeed(),
+						2) * daNote.noteSpeedMulti);
 
 				if (PreferencesMenu.getPref('downscroll'))
 				{
@@ -2188,12 +2190,12 @@ class PlayState extends MusicBeatState
 							altAnim = '-alt';
 					}
 
-					if (daNote.altNote)
+					if (daNote.data.altNote)
 						altAnim = '-alt';
 
 					if (!daNote.isSustainNote)
 					{
-						switch (Math.abs(daNote.noteData))
+						switch (Math.abs(daNote.data.noteData))
 						{
 							case 0:
 								dad.playAnim('singLEFT' + altAnim, true);
@@ -2427,7 +2429,7 @@ class PlayState extends MusicBeatState
 
 		var healthMulti:Float = 1;
 
-		if (daNote.noteData >= 0)
+		if (daNote.data.noteData >= 0)
 			healthMulti *= 0.033;
 		else
 			healthMulti *= 0.002;
@@ -2461,7 +2463,7 @@ class PlayState extends MusicBeatState
 		if (isSick)
 		{
 			var noteSplash:NoteSplash = grpNoteSplashes.recycle(NoteSplash);
-			noteSplash.setupNoteSplash(daNote.x, daNote.y, daNote.noteData);
+			noteSplash.setupNoteSplash(daNote.x, daNote.y, daNote.data.noteData);
 			// new NoteSplash(daNote.x, daNote.y, daNote.noteData);
 			grpNoteSplashes.add(noteSplash);
 		}
@@ -2736,7 +2738,7 @@ class PlayState extends MusicBeatState
 		{
 			notes.forEachAlive(function(daNote:Note)
 			{
-				if (daNote.isSustainNote && daNote.canBeHit && daNote.mustPress && holdArray[daNote.noteData])
+				if (daNote.isSustainNote && daNote.canBeHit && daNote.mustPress && holdArray[daNote.data.noteData])
 					goodNoteHit(daNote);
 			});
 		}
@@ -2756,17 +2758,18 @@ class PlayState extends MusicBeatState
 			{
 				if (daNote.canBeHit && daNote.mustPress && !daNote.tooLate && !daNote.wasGoodHit)
 				{
-					if (directionList.contains(daNote.noteData))
+					if (directionList.contains(daNote.data.noteData))
 					{
 						for (coolNote in possibleNotes)
 						{
-							if (coolNote.noteData == daNote.noteData && Math.abs(daNote.strumTime - coolNote.strumTime) < 10)
+							if (coolNote.data.noteData == daNote.data.noteData
+								&& Math.abs(daNote.data.strumTime - coolNote.data.strumTime) < 10)
 							{ // if it's the same note twice at < 10ms distance, just delete it
 								// EXCEPT u cant delete it in this loop cuz it fucks with the collection lol
 								dumbNotes.push(daNote);
 								break;
 							}
-							else if (coolNote.noteData == daNote.noteData && daNote.strumTime < coolNote.strumTime)
+							else if (coolNote.data.noteData == daNote.data.noteData && daNote.data.strumTime < coolNote.data.strumTime)
 							{ // if daNote is earlier than existing note (coolNote), replace
 								possibleNotes.remove(coolNote);
 								possibleNotes.push(daNote);
@@ -2777,20 +2780,20 @@ class PlayState extends MusicBeatState
 					else
 					{
 						possibleNotes.push(daNote);
-						directionList.push(daNote.noteData);
+						directionList.push(daNote.data.noteData);
 					}
 				}
 			});
 
 			for (note in dumbNotes)
 			{
-				FlxG.log.add("killing dumb ass note at " + note.strumTime);
+				FlxG.log.add("killing dumb ass note at " + note.data.strumTime);
 				note.kill();
 				notes.remove(note, true);
 				note.destroy();
 			}
 
-			possibleNotes.sort((a, b) -> Std.int(a.strumTime - b.strumTime));
+			possibleNotes.sort((a, b) -> Std.int(a.data.strumTime - b.data.strumTime));
 
 			if (perfectMode)
 				goodNoteHit(possibleNotes[0]);
@@ -2803,7 +2806,7 @@ class PlayState extends MusicBeatState
 				}
 				for (coolNote in possibleNotes)
 				{
-					if (pressArray[coolNote.noteData])
+					if (pressArray[coolNote.data.noteData])
 						goodNoteHit(coolNote);
 				}
 			}
@@ -2909,10 +2912,10 @@ class PlayState extends MusicBeatState
 			if (!note.isSustainNote)
 			{
 				combo += 1;
-				popUpScore(note.strumTime, note);
+				popUpScore(note.data.strumTime, note);
 			}
 
-			switch (note.noteData)
+			switch (note.data.noteData)
 			{
 				case 0:
 					boyfriend.playAnim('singLEFT', true);
@@ -2926,7 +2929,7 @@ class PlayState extends MusicBeatState
 
 			playerStrums.forEach(function(spr:FlxSprite)
 			{
-				if (Math.abs(note.noteData) == spr.ID)
+				if (Math.abs(note.data.noteData) == spr.ID)
 				{
 					spr.animation.play('confirm', true);
 				}
diff --git a/source/Section.hx b/source/Section.hx
index f153da54f..e1fc84f5e 100644
--- a/source/Section.hx
+++ b/source/Section.hx
@@ -1,8 +1,10 @@
 package;
 
+import Note.NoteData;
+
 typedef SwagSection =
 {
-	var sectionNotes:Array<Dynamic>;
+	var sectionNotes:Array<NoteData>;
 	var lengthInSteps:Int;
 	var typeOfSection:Int;
 	var mustHitSection:Bool;
diff --git a/source/SongLoad.hx b/source/SongLoad.hx
index e5ccd7146..c7bfa7477 100644
--- a/source/SongLoad.hx
+++ b/source/SongLoad.hx
@@ -77,14 +77,18 @@ class SongLoad
 			diff = SongLoad.curDiff;
 
 		var songShit:Array<SwagSection> = [];
-		switch (diff)
+
+		if (songData != null)
 		{
-			case 'easy':
-				songShit = songData.notes.easy;
-			case 'normal':
-				songShit = songData.notes.normal;
-			case 'hard':
-				songShit = songData.notes.hard;
+			switch (diff)
+			{
+				case 'easy':
+					songShit = songData.notes.easy;
+				case 'normal':
+					songShit = songData.notes.normal;
+				case 'hard':
+					songShit = songData.notes.hard;
+			}
 		}
 
 		return songShit;
@@ -109,6 +113,22 @@ class SongLoad
 		return speedShit;
 	}
 
+	public static function getDefaultSwagSong():SwagSong
+	{
+		return {
+			song: 'Test',
+			notes: {easy: [], normal: [], hard: []},
+			bpm: 150,
+			needsVoices: true,
+			player1: 'bf',
+			player2: 'dad',
+			speed: {easy: 1, normal: 1, hard: 1},
+			validScore: false,
+			voiceList: ["BF", "BF-pixel"],
+			extraNotes: []
+		};
+	}
+
 	public static function parseJSONshit(rawJson:String):SwagSong
 	{
 		var swagShit:SwagSong = cast Json.parse(rawJson).song;
diff --git a/source/TitleState.hx b/source/TitleState.hx
index e5271ed6a..114d2c245 100644
--- a/source/TitleState.hx
+++ b/source/TitleState.hx
@@ -278,8 +278,6 @@ class TitleState extends MusicBeatState
 
 	override function update(elapsed:Float)
 	{
-		// trace(FlxG.renderBlit);
-
 		#if HAS_PITCH
 		if (FlxG.keys.pressed.UP)
 			FlxG.sound.music.pitch += 0.5 * elapsed;
diff --git a/source/ChartingState.hx b/source/charting/ChartingState.hx
similarity index 90%
rename from source/ChartingState.hx
rename to source/charting/ChartingState.hx
index 92098668c..92d9434ee 100644
--- a/source/ChartingState.hx
+++ b/source/charting/ChartingState.hx
@@ -1,6 +1,7 @@
-package;
+package charting;
 
 import Conductor.BPMChangeEvent;
+import Note.NoteData;
 import Section.SwagSection;
 import SongLoad.SwagSong;
 import dsp.FFT;
@@ -29,6 +30,7 @@ import flixel.ui.FlxSpriteButton;
 import flixel.util.FlxColor;
 import haxe.CallStack.StackItem;
 import haxe.Json;
+import haxe.Serializer;
 import lime.media.AudioBuffer;
 import lime.utils.Assets;
 import lime.utils.Int16Array;
@@ -80,7 +82,7 @@ class ChartingState extends MusicBeatState
 	/*
 	 * WILL BE THE CURRENT / LAST PLACED NOTE
 	**/
-	var curSelectedNote:Array<Dynamic>;
+	var curSelectedNote:NoteData;
 
 	var tempBpm:Float = 0;
 
@@ -130,18 +132,7 @@ class ChartingState extends MusicBeatState
 			_song = PlayState.SONG;
 		else
 		{
-			_song = {
-				song: 'Test',
-				notes: {easy: [], normal: [], hard: []},
-				bpm: 150,
-				needsVoices: true,
-				player1: 'bf',
-				player2: 'dad',
-				speed: {easy: 1, normal: 1, hard: 1},
-				validScore: false,
-				voiceList: ["BF", "BF-pixel"],
-				extraNotes: []
-			};
+			_song = SongLoad.songData = SongLoad.getDefaultSwagSong();
 		}
 
 		FlxG.mouse.visible = true;
@@ -166,7 +157,8 @@ class ChartingState extends MusicBeatState
 		strumLine = new FlxSprite(0, 50).makeGraphic(Std.int(GRID_SIZE * 8), 4);
 		add(strumLine);
 
-		dummyArrow = new FlxSprite().makeGraphic(GRID_SIZE, GRID_SIZE);
+		dummyArrow = new FlxSprite().makeGraphic(GRID_SIZE, GRID_SIZE, 0xFFCC2288);
+		dummyArrow.alpha = 0.3;
 		add(dummyArrow);
 
 		var tabs = [
@@ -320,9 +312,10 @@ class ChartingState extends MusicBeatState
 		{
 			for (i in 0...SongLoad.getSong()[curSection].sectionNotes.length)
 			{
-				var note = SongLoad.getSong()[curSection].sectionNotes[i];
-				note[1] = (note[1] + 4) % 8;
-				SongLoad.getSong()[curSection].sectionNotes[i] = note;
+				var note:Note = new Note(0, 0);
+				note.data = SongLoad.getSong()[curSection].sectionNotes[i];
+				note.data.noteData = (note.data.noteData + 4) % 8;
+				SongLoad.getSong()[curSection].sectionNotes[i] = note.data;
 				updateGrid();
 			}
 		});
@@ -529,7 +522,7 @@ class ChartingState extends MusicBeatState
 			}
 			else if (wname == 'note_susLength')
 			{
-				curSelectedNote[2] = nums.value;
+				curSelectedNote.sustainLength = nums.value;
 				updateGrid();
 			}
 			else if (wname == 'section_bpm')
@@ -562,11 +555,25 @@ class ChartingState extends MusicBeatState
 			{
 				daBPM = SongLoad.getSong()[i].bpm;
 			}
-			daPos += 4 * (1000 * 60 / daBPM);
+			daPos += 4 * sectionCalc(daBPM);
 		}
 		return daPos;
 	}
 
+	function measureStartTime():Float
+	{
+		var daBPM:Float = _song.bpm;
+		var daPos:Float = sectionStartTime();
+
+		daPos = Math.floor(FlxG.sound.music.time / sectionCalc(daBPM)) * sectionCalc(daBPM);
+		return daPos;
+	}
+
+	function sectionCalc(bpm:Float)
+	{
+		return (1000 * 60 / bpm);
+	}
+
 	var p1Muted:Bool = false;
 	var p2Muted:Bool = false;
 
@@ -687,24 +694,13 @@ class ChartingState extends MusicBeatState
 						{
 							if (FlxG.mouse.overlaps(note))
 							{
-								if (FlxG.keys.pressed.CONTROL)
-								{
-									selectNote(note);
-								}
-								else
-								{
-									trace('tryin to delete note...');
-									deleteNote(note);
-								}
+								selectNote(note);
 							}
 						});
 					}
 					else
 					{
-						if (FlxG.mouse.x > gridBG.x
-							&& FlxG.mouse.x < gridBG.x + gridBG.width
-							&& FlxG.mouse.y > gridBG.y
-							&& FlxG.mouse.y < gridBG.y + (GRID_SIZE * SongLoad.getSong()[curSection].lengthInSteps))
+						if (FlxG.mouse.overlaps(gridBG))
 						{
 							FlxG.log.add('added note');
 							addNote();
@@ -714,10 +710,22 @@ class ChartingState extends MusicBeatState
 			}
 		}
 
-		if (FlxG.mouse.x > gridBG.x
-			&& FlxG.mouse.x < gridBG.x + gridBG.width
-			&& FlxG.mouse.y > gridBG.y
-			&& FlxG.mouse.y < gridBG.y + (GRID_SIZE * SongLoad.getSong()[curSection].lengthInSteps))
+		if (FlxG.mouse.pressedRight)
+		{
+			if (FlxG.mouse.overlaps(curRenderedNotes))
+			{
+				curRenderedNotes.forEach(function(note:Note)
+				{
+					if (FlxG.mouse.overlaps(note))
+					{
+						trace('tryin to delete note...');
+						deleteNote(note);
+					}
+				});
+			}
+		}
+
+		if (FlxG.mouse.overlaps(gridBG))
 		{
 			dummyArrow.x = Math.floor(FlxG.mouse.x / GRID_SIZE) * GRID_SIZE;
 			if (FlxG.keys.pressed.SHIFT)
@@ -786,10 +794,12 @@ class ChartingState extends MusicBeatState
 
 			if (FlxG.keys.justPressed.R)
 			{
-				if (FlxG.keys.pressed.SHIFT)
-					resetSection(true);
+				if (FlxG.keys.pressed.CONTROL)
+					resetSection(BEGINNING);
+				else if (FlxG.keys.pressed.SHIFT)
+					resetSection(MEASURE);
 				else
-					resetSection();
+					resetSection(SECTION);
 			}
 
 			if (FlxG.mouse.wheel != 0)
@@ -909,11 +919,8 @@ class ChartingState extends MusicBeatState
 	{
 		if (curSelectedNote != null)
 		{
-			if (curSelectedNote[2] != null)
-			{
-				curSelectedNote[2] += value;
-				curSelectedNote[2] = Math.max(curSelectedNote[2], 0);
-			}
+			curSelectedNote.sustainLength += value;
+			curSelectedNote.sustainLength = Math.max(curSelectedNote.sustainLength, 0);
 		}
 
 		updateNoteUI();
@@ -924,14 +931,9 @@ class ChartingState extends MusicBeatState
 	{
 		if (curSelectedNote != null)
 		{
-			if (curSelectedNote[3] != null)
-			{
-				trace('ALT NOTE SHIT');
-				curSelectedNote[3] = !curSelectedNote[3];
-				trace(curSelectedNote[3]);
-			}
-			else
-				curSelectedNote[3] = true;
+			trace('ALT NOTE SHIT');
+			curSelectedNote.altNote = !curSelectedNote.altNote;
+			trace(curSelectedNote.altNote);
 		}
 	}
 
@@ -954,20 +956,24 @@ class ChartingState extends MusicBeatState
 		return curStep;
 	}
 
-	function resetSection(songBeginning:Bool = false):Void
+	function resetSection(songBeginning:SongResetType = SECTION):Void
 	{
 		updateGrid();
 
 		FlxG.sound.music.pause();
 		vocals.pause();
 
-		// Basically old shit from changeSection???
-		FlxG.sound.music.time = sectionStartTime();
-
-		if (songBeginning)
+		switch (songBeginning)
 		{
-			FlxG.sound.music.time = 0;
-			curSection = 0;
+			case SECTION:
+				// Basically old shit from changeSection???
+				FlxG.sound.music.time = sectionStartTime();
+			case BEGINNING:
+				FlxG.sound.music.time = 0;
+				curSection = 0;
+			case MEASURE:
+				FlxG.sound.music.time = measureStartTime(); // Math.floor(FlxG.mouse.y / GRID_SIZE) * GRID_SIZE
+			default:
 		}
 
 		vocals.time = FlxG.sound.music.time;
@@ -1014,12 +1020,13 @@ class ChartingState extends MusicBeatState
 	{
 		var daSec = FlxMath.maxInt(curSection, sectionNum);
 
-		for (note in SongLoad.getSong()[daSec - sectionNum].sectionNotes)
+		for (noteShit in SongLoad.getSong()[daSec - sectionNum].sectionNotes)
 		{
-			var strum = note[0] + Conductor.stepCrochet * (SongLoad.getSong()[daSec].lengthInSteps * sectionNum);
+			var strum = noteShit.strumTime + Conductor.stepCrochet * (SongLoad.getSong()[daSec].lengthInSteps * sectionNum);
 
-			var copiedNote:Array<Dynamic> = [strum, note[1], note[2]];
-			SongLoad.getSong()[daSec].sectionNotes.push(copiedNote);
+			var copiedNote:Note = new Note(strum, noteShit.noteData);
+			copiedNote.data.sustainLength = noteShit.sustainLength;
+			SongLoad.getSong()[daSec].sectionNotes.push(copiedNote.data);
 		}
 
 		updateGrid();
@@ -1066,7 +1073,7 @@ class ChartingState extends MusicBeatState
 	function updateNoteUI():Void
 	{
 		if (curSelectedNote != null)
-			stepperSusLength.value = curSelectedNote[2];
+			stepperSusLength.value = curSelectedNote.sustainLength;
 	}
 
 	function updateGrid():Void
@@ -1091,7 +1098,7 @@ class ChartingState extends MusicBeatState
 			curRenderedSustains.remove(curRenderedSustains.members[0], true);
 		}
 
-		var sectionInfo:Array<Dynamic> = SongLoad.getSong()[curSection].sectionNotes;
+		var sectionInfo:Array<NoteData> = SongLoad.getSong()[curSection].sectionNotes;
 
 		if (SongLoad.getSong()[curSection].changeBPM && SongLoad.getSong()[curSection].bpm > 0)
 		{
@@ -1124,12 +1131,12 @@ class ChartingState extends MusicBeatState
 
 		for (i in sectionInfo)
 		{
-			var daNoteInfo = i[1];
-			var daStrumTime = i[0];
-			var daSus = i[2];
+			var daNoteInfo = i.noteData;
+			var daStrumTime = i.strumTime;
+			var daSus = i.sustainLength;
 
 			var note:Note = new Note(daStrumTime, daNoteInfo % 4);
-			note.sustainLength = daSus;
+			note.data.sustainLength = daSus;
 			note.setGraphicSize(GRID_SIZE, GRID_SIZE);
 			note.updateHitbox();
 			note.x = Math.floor(daNoteInfo * GRID_SIZE);
@@ -1167,7 +1174,7 @@ class ChartingState extends MusicBeatState
 
 		for (i in SongLoad.getSong()[curSection].sectionNotes)
 		{
-			if (i.strumTime == note.strumTime && i.noteData % 4 == note.noteData)
+			if (i.strumTime == note.data.strumTime && i.noteData % 4 == note.data.noteData)
 			{
 				curSelectedNote = SongLoad.getSong()[curSection].sectionNotes[swagNum];
 			}
@@ -1183,7 +1190,7 @@ class ChartingState extends MusicBeatState
 	{
 		for (i in SongLoad.getSong()[curSection].sectionNotes)
 		{
-			if (i[0] == note.strumTime && i[1] % 4 == note.noteData)
+			if (i.strumTime == note.data.strumTime && i.noteData % 4 == note.data.noteData)
 			{
 				var placeIDK:Int = Std.int(((Math.floor(dummyArrow.y / GRID_SIZE) * GRID_SIZE)) / 40);
 
@@ -1253,13 +1260,16 @@ class ChartingState extends MusicBeatState
 		FlxG.sound.play(Paths.sound('pianoStuff/piano-00' + Std.string((bullshit % 8) + 1)), FlxG.random.float(0.3, 0.6));
 		// trace('bullshit $bullshit'); // trace(Math.floor(dummyArrow.y / GRID_SIZE) * GRID_SIZE);
 
-		SongLoad.getSong()[curSection].sectionNotes.push([noteStrum, noteData, noteSus, noteAlt]);
+		var daNewNote:Note = new Note(noteStrum, noteData);
+		daNewNote.data.sustainLength = noteSus;
+		daNewNote.data.altNote = noteAlt;
+		SongLoad.getSong()[curSection].sectionNotes.push(daNewNote.data);
 
 		curSelectedNote = SongLoad.getSong()[curSection].sectionNotes[SongLoad.getSong()[curSection].sectionNotes.length - 1];
 
 		if (FlxG.keys.pressed.CONTROL)
 		{
-			SongLoad.getSong()[curSection].sectionNotes.push([noteStrum, (noteData + 4) % 8, noteSus, noteAlt]);
+			// SongLoad.getSong()[curSection].sectionNotes.push([noteStrum, (noteData + 4) % 8, noteSus, noteAlt]);
 		}
 
 		trace(noteStrum);
@@ -1331,15 +1341,14 @@ class ChartingState extends MusicBeatState
 
 	function loadAutosave():Void
 	{
-		PlayState.SONG = SongLoad.parseJSONshit(FlxG.save.data.autosave);
+		PlayState.SONG = FlxG.save.data.autosave;
 		FlxG.resetState();
 	}
 
 	function autosaveSong():Void
 	{
-		FlxG.save.data.autosave = Json.stringify({
-			"song": _song
-		});
+		FlxG.save.data.autosave = _song;
+		trace(FlxG.save.data.autosave);
 		FlxG.save.flush();
 	}
 
@@ -1408,3 +1417,10 @@ class ChartingState extends MusicBeatState
 		FlxG.log.error("Problem saving Level data");
 	}
 }
+
+enum SongResetType
+{
+	BEGINNING;
+	MEASURE; // not sure if measure is 1/4 of a "SECTION" which is definitely a... bar.. right? its nerd shit whatever
+	SECTION;
+}