analysemidi.c 5.61 KB
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

//char oct1[2]="\0";
//char octb[2]="\0";

//compare si 2 octets sont egaux
int compareoctet(char a[2], char b[2]){
	int bo =1, i=0, cpt=0;
	while (i<2)
	{
		if(a[i] == b[i])	
			cpt++;	
		i++;
	}
	if(cpt != 2) bo=0;
	return bo;
}

//converti l'octet passé en parametre en decimal
int convertion(char a[2])
{
	int l = 0;
	if (a[0] == '1') l = l + 1*16;
	if (a[0] == '2') l = l + 2*16;
	if (a[0] == '3') l = l + 3*16;
	if (a[0] == '4') l = l + 4*16;
	if (a[0] == '5') l = l + 5*16;
	if (a[0] == '6') l = l + 6*16;
	if (a[0] == '7') l = l + 7*16;
	if (a[0] == '8') l = l + 8*16;
	if (a[0] == '9') l = l + 9*16;
	if (a[0] == 'a') l = l + 10*16;
	if (a[0] == 'b') l = l + 11*16;
	if (a[0] == 'c') l = l + 12*16;
	if (a[0] == 'd') l = l + 13*16;
	if (a[0] == 'e') l = l + 14*16;
	if (a[0] == 'f') l = l + 15*16;

	if (a[1] == '1') l = l + 1;
        if (a[1] == '2') l = l + 2;
        if (a[1] == '3') l = l + 3;
        if (a[1] == '4') l = l + 4;
        if (a[1] == '5') l = l + 5;
        if (a[1] == '6') l = l + 6;
        if (a[1] == '7') l = l + 7;
        if (a[1] == '8') l = l + 8;
        if (a[1] == '9') l = l + 9;
        if (a[1] == 'a') l = l + 10;
        if (a[1] == 'b') l = l + 11;
        if (a[1] == 'c') l = l + 12;
        if (a[1] == 'd') l = l + 13;
        if (a[1] == 'e') l = l + 14;
        if (a[1] == 'f') l = l + 15;

	return l;


}

void recuperer2octets(FILE* fd,char oct1[2], char octb[2])
{

	char mot[4];
	//char oct1[2]="\0";
	//char octb[2]="\0";



	fscanf(fd, "%s", mot);


	int i = 0;
	for(i=0;i<2;i++)
		{
			oct1[i]=mot[i];
			octb[i]=mot[i+2];

		}
	octb[2]='\0';
	oct1[2]='\0';
	//printf("oct1= %s  \n oct2= %s \n",oct1, octb);


}

void recuperer(FILE *fd, char oct1[2], char octb[2]){
	//TEST HEADER

		//Fichier MIDI ?
	recuperer2octets(fd,oct1,octb);
        if((compareoctet(oct1,"4d\0")) && (compareoctet(octb,"54\0"))) { printf("Fichier MIDI détecté.\n");}
	recuperer2octets(fd,oct1,octb);

		//Longueur
	recuperer2octets(fd,oct1,octb);
	int longueur=0;
	longueur=convertion(oct1);
	longueur=longueur + convertion(octb);
	recuperer2octets(fd,oct1,octb);
	longueur=longueur + convertion(oct1);
	longueur=longueur + convertion(octb);
	printf("taille header = %d \n",longueur);

		//format
	recuperer2octets(fd,oct1,octb);
	if(compareoctet(octb,"00\0")) printf("le format est : single track\n");
	if(compareoctet(octb,"01\0")) printf("le format est : multiple track\n");
	if(compareoctet(octb,"02\0")) printf("le format est : multiple song\n");

	 	//nbre de gros morceaux
	recuperer2octets(fd,oct1,octb);
	int n = 0;
	n=convertion(oct1);
	n= n + convertion(octb);
	printf("le nombre de gros morceaux est : %d \n", n);
	
		//nbre de tick/beat
	recuperer2octets(fd,oct1,octb);
	int ticks = 0;
	ticks = convertion(oct1);
	ticks = ticks + convertion(octb);
	printf("nombre de ticks/beat = %d \n",ticks);
	

	//Dans un morceau RECUPERATION DE LA TAILLE DE LA CHANSON à partir du Mrtk
	recuperer2octets(fd,oct1,octb);
	if ((compareoctet(oct1,"4d\0")) && (compareoctet(octb,"54\0"))) 
		{
			printf("morceau?\n");
			recuperer2octets(fd,oct1,octb);
			if ((compareoctet(oct1,"72\0")) && compareoctet(octb,"6b\0")) { printf("oui\n");}
			recuperer2octets(fd,oct1,octb);
			int longueur_track = convertion(oct1) *16*16*16*16*16*16;
			longueur_track = longueur_track + convertion(octb)*16*16*16*16;
			recuperer2octets(fd,oct1,octb);
			longueur_track = longueur_track + convertion(oct1)*16*16;
			longueur_track = longueur_track + convertion(octb);
			printf("la longueur du morceau est de : %d octets \n", longueur_track);
		}

		//Track event
	//si c'est un meta evenement (commence par 00FF)
	// le 00 est en fait un timing et peut etre separe en 2 octets pour a voir un timing plus grd ! 
	recuperer2octets(fd,oct1,octb);
	int time = convertion(oct1);
	if (oct1 >= 128)
	{
		time=(time-8*16)*16*16+convertion(octb);
		printf("delta time evenement = %d \n");
	}
	if ((compareoctet(octb,"ff\0")))
		{
			printf("meta evenement : \n");
			recuperer2octets(fd,oct1,octb);
			if(compareoctet(oct1,"00\0"))
				{printf("le numéro de la sequence est: \n");}
			if(compareoctet(oct1,"01\0"))
                                {printf("evenement text \n");}
			if(compareoctet(oct1,"02\0"))
                                {printf("copyright notice\n");}
			if(compareoctet(oct1,"03\0"))
                                {printf("sequence or track name \n");}
			if(compareoctet(oct1,"04\0"))
                                {printf("instrument name \n");}
			if(compareoctet(oct1,"05\0"))
                                {printf("lyric text \n");}
			if(compareoctet(oct1,"06\0"))
                                {printf("marker text \n");}
			if(compareoctet(oct1,"07\0"))
                                {printf("cue point \n");}
			if(compareoctet(oct1,"20\0"))
                                {printf("MIDI channel \n");}
			if(compareoctet(oct1,"2f\0"))
                                {printf("end of track \n");}
			if(compareoctet(oct1,"51\0"))
                                {printf("tempo setting \n");}
			if(compareoctet(oct1,"54\0"))
                                {printf("SMPTE offset \n");}
			if(compareoctet(oct1,"58\0"))
                                {printf("Time signature \n");}
			if(compareoctet(oct1,"59\0"))
                                {printf("Key signature \n");}
			if(compareoctet(oct1,"7f\0"))
                                {printf("Sequencer specific event \n");}



		}
		
	      
}

int main()
{	
	char oct1[2]="\0";
	char octb[2]="\0";

	FILE* fd;
	fd=fopen("hexa3.txt","r");
	recuperer(fd, oct1, octb);
	//recuperer2octets(fd);
	//recuperer2octets(fd);
//	fclose(fd);	
	return 0;

}