diff --git a/osufs/osufs/osu_object_analyze/osu_object_includes.h b/osufs/osufs/osu_object_analyze/osu_object_includes.h
new file mode 100644
index 0000000000000000000000000000000000000000..62e97acd6204b55ce50077bce72629d85d03145a
--- /dev/null
+++ b/osufs/osufs/osu_object_analyze/osu_object_includes.h
@@ -0,0 +1,53 @@
+#ifndef OSU_OBJECT_INCLUDES_H_
+
+#define OSU_OBJECT_INCLUDES_H_
+
+#include<inttypes>
+
+typedef struct __attribute__((__packed__)) hit_circle_t{
+	//32 Byte
+	char type,
+	uint_16t x,y,
+	uint_32t start_timing,
+	uint_32t check_timing,
+	uint_32t disappear_timing,
+	//uint_32t end_timing,
+	uint_16t hit_radius,
+	uint_16t approach_radius,
+	uint_16t gradient_color1,
+	uint_16t gradient_color2,
+	uint_16t stroke_color,
+	uint_8t gradient_direction,
+	uint_32t reserved
+	
+}elem_hit_circle;
+
+typedef struct __attribute__((__packed__)) hit_circle_t{
+	//32 Byte
+	char type,
+	uint_16t x,y,
+	uint_32t start_timing,
+	uint_32t disappear_timing,
+	uint_16t radius,
+	uint_16t gradient_color1,
+	uint_16t gradient_color2,
+	uint_16t stroke_color,
+	uint_8t gradient_direction,
+	char padding[10]
+	
+}elem_spinner;
+
+/*typedef struct __attribute__((__packed__)) rect_slider_t{
+	char type;
+	uint_32t start_timing,
+	uint_32t check_timing,
+	uint_32t disappear_timing,
+	//uint_32t end_timing,
+	uint_16t hit_radius,
+	uint_16t approach_radius,
+	uint_16t x1,y1,x2,y2,x3,y3,x4,y4,
+	uint_8t gradient_direction,
+	uint_32t reserved
+}elem_rect_slider;*/
+
+#endif
\ No newline at end of file
diff --git a/osufs/osufs/osu_object_analyze/osu_object_parser.cpp b/osufs/osufs/osu_object_analyze/osu_object_parser.cpp
index 22df33a2461cf504de23de5e9f9b831bf6e1318c..2ed38e875739679afbaab619a38af3934cb05aaf 100644
--- a/osufs/osufs/osu_object_analyze/osu_object_parser.cpp
+++ b/osufs/osufs/osu_object_analyze/osu_object_parser.cpp
@@ -102,8 +102,11 @@ int osu_parse_hit_circle(vector<string>& v, elem_hit_circle* elemn,osu_song* son
 	sscanf(v[2],"%ld",&(elemn -> check_timing));
 	elemn -> start_timing = check_timing - ((osu_song->approach_rate*(-140))+1800);
 	elemn -> disappear_timing = check_timing + (200-(osu_song->difficulty)*10);
+	//TBD
+	//elemn -> end_timing
 	elemn -> hit_radius = 100 - (osu_song ->difficulty) * 4;
 	elemn -> approach_radius = 3*(elemn->hit_radius);
+	elemn -> approach_rate = (elemn->approach_radius-elemn->hit_radius)/(elemn->check_timing-elemn->start_timing);
 	elemn -> stroke_color = 0xFFFF;
 	
 }
diff --git a/software/osu_main_process/osu_draw.c b/software/osu_main_process/osu_draw.c
index cbae0efca2d6d362ed93fc7aa08f9ca6be983363..257139fa596a8ede231b38727804ff6235f87975 100644
--- a/software/osu_main_process/osu_draw.c
+++ b/software/osu_main_process/osu_draw.c
@@ -13,12 +13,13 @@ void osu_draw_frame(osu_session* global){
 			case 'h': // hit circle
 				osu_draw_hit_circle((global->draw_dynamic_queue)[temp_queue_end],global->current_time);
 				break;
+			case 's':
+				osu_draw_spin(draw_dynamic_queue[temp_queue_end]);
+				break;
 /*			case 'l':  // slider
 				osu_draw_slider(draw_dynamic_queue[temp_queue_end]);
 				break;
-			case 's':
-				osu_draw_spin(draw_dynamic_queue[temp_queue_end]);
-				break;*/
+			*/
 		}
 		--temp_queue_end;
 		temp_queue_end &= DRAW_QUEUE_SIZE_MODE;
@@ -35,6 +36,7 @@ void osu_draw_hit_circle(elem_hit_circle* circle,clock_t current_time){
 			circle->x,
 			circle->y,
 			circle->approach_radius,
+			4,
 			circle->gradient_color1
 			);
 		gl_circle(
@@ -46,11 +48,16 @@ void osu_draw_hit_circle(elem_hit_circle* circle,clock_t current_time){
 			circle->stroke_color, 
 			circle->gradient_direction
 			);
-				
+		gl_ring(
+			circle->x,
+			circle->y,
+			circle->hit_radius,
+			3,
+			0xFFFFFFFF
+			);
 			circle->approach_radius -= circle->approach_rate;
-		if (circle->approach_radius<0)
-			circle->approach_radius=0;
-	} else if (current_time < disappear_timing){
+
+	} else if (current_time < end_timing){
 		gl_circle(
 			circle->x,
 			circle->y,
diff --git a/software/osu_main_process/osu_process.c b/software/osu_main_process/osu_process.c
index 50f1709b05b755d56adf0cf95ed9e625873bc49f..81a9f27a2e29a51129f39013383fe294eeb61218 100644
--- a/software/osu_main_process/osu_process.c
+++ b/software/osu_main_process/osu_process.c
@@ -1,7 +1,7 @@
 #include "osu_process.h"
 
 void init_process(osu_session* global){
-	\
+	
 	global->draw_queue = malloc(sizeof(void*)*DRAW_QUEUE_SIZE);
 	global->buff = malloc(512);
 	global->play_timeline = malloc(65536);
@@ -26,20 +26,21 @@ void loading_process(osu_session* global){
 			*(global->play_timeline));
 	//beat map parsing
 	uint32_t* p_temp = *(global->play_timeline);
-
-	global->play_timeline_count = *((uint32_t*)p_temp);
-	global->play_timeline = malloc(4*(global->play_timeline_count));
-	//locate the real data address
-	++p_temp; 
 	if ((*p_temp)!= 0b01110010011001010110000101101100){
 		printf("parsing magic failed!");
 		return;
 	}
+	++p_temp; 
+	global->play_timeline_count = *((uint32_t*)p_temp);
+	global->play_timeline = malloc(4*(global->play_timeline_count));
+	//locate the real data address
+	
+	
 	++p_temp;
 	for (i=0;i<global->play_timeline_count;++i){
 		global->play_timeline[i] = p_temp;
 		//jump 32 bytes
-		p_temp+=((void*)p_temp + ELEMENT_LENGTH);
+		p_temp =((void*)p_temp + ELEMENT_LENGTH);
 	}
 }	
 
@@ -99,7 +100,7 @@ void osu_draw_queue_update(osu_session* global){
 	queue_temp_start = global->draw_dynamic_queue_start;
 	elem_hit_circle* element_temp_p = (global->draw_dynamic_queue)[queue_temp_start];
 	while (queue_temp_start!=global->draw_dynamic_queue_end){
-		if (global->current_time >= (element_temp_p->end_timing)){
+		if (global->current_time >= (element_temp_p->disappear_timing)){
 			//pop draw element from front
 			(global->draw_dynamic_queue)[queue_temp_start] = NULL;
 			++(global->draw_dynamic_queue_start);