Hogyan olvassak be midi fájlt? Bővebben lent.
Tegnap egész estig tanulmányoztam a fejléctől kezdve de elakadtam egy résznél, és vannak számomra értetlen részek.
Pl.: Létrehoztam egy 1 Track-os fájlt, de mégis a fájlban a bitek azt mondják, hogy 2db csatorna van benne. A másik, beteszem ide a programom, ami annyit tud eddig, hogy beolvassa a fájl fejlécét, elkezdi a Track olvasását. De nem tudom a chunk_size utáni részt értelmezni, mert mindenhol különböző hosszúságú. A cél az lenne, hogy egy táblázatban, 2D tömbben bennelegyen az összes track, mikor indul meddig tart miylen freqvencián. körübelül. Végsőcél hogy a felhasználó majd beállítja a track-ok sorrendjét. Pl.: fuvola,gitár,zongora,dob és a program sound(int freq, int delay); parancsal játsza le, és ha 2 vagy több hangnak kellene megszólalnia, a legelső sorrendú hang játszódik le, ha nincs akkor a 2. és így. Körülbelül ehhez szeretnék útmutatást minimum. A program:
/**********************************************
FORRAS
Program by: Ryu 2012
***********************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
FILE * Input = fopen ("test.mid","rb");
char midi_chunk_ID[5],midi_track_chunk_ID[5];
int midi_bit=0;
int midi_chunk_size=0,midi_temp=0,midi_track_dik;
int midi_format_type=0,midi_number_of_tracks=0,midi_time_division=0;
int midi_track_t[65535],midi_track_chunk_size=0;//1. oszlop ID, 2. oszlop méret
int midi_file=0;
//bit:0-3
for(midi_bit=0;midi_bit<4;midi_bit++)fread (&midi_chunk_ID[midi_bit], 1, 1, Input);
midi_chunk_ID[midi_bit]=0;
printf("CHUNK_ID: %s\n",midi_chunk_ID);
if(strcmp(midi_chunk_ID,"MThd"))return -1;
//bit:4-7
for(midi_bit=0;midi_bit<4;midi_bit++){
fread (&midi_temp, 1, 1, Input);
midi_chunk_size+=midi_temp;
}
printf("CHUNK_SIZE: %d\n",midi_chunk_size);
if(midi_chunk_size!=6) return -1;
//bit:8-9
for(midi_bit=0;midi_bit<2;midi_bit++){
fread (&midi_temp, 1, 1, Input);
midi_format_type+=midi_temp;
}
printf("FORMAT_TYPE: %d\n",midi_format_type);
if(midi_format_type<0 || midi_format_type>2)return -2;
for(midi_bit=0;midi_bit<2;midi_bit++){
fread (&midi_temp, 1, 1, Input);
midi_number_of_tracks+=midi_temp;
}
midi_number_of_tracks--;
printf("NUMBER_OF_TRACKS: %d\n",midi_number_of_tracks);
fread (&midi_temp, 1, 1, Input);
midi_temp=midi_temp<<8;
fread (&midi_time_division, 1, 1, Input);
midi_time_division+=midi_temp;
printf("TIME_DIVISION: %d\n",midi_time_division);
midi_temp=0;
for(midi_track_dik=1;midi_track_dik<=midi_number_of_tracks;midi_track_dik++){
printf("[%d]TRACK: \n\r",midi_track_dik);
for(midi_bit=0;midi_bit<4;midi_bit++)fread (&midi_track_chunk_ID[midi_bit], 1, 1, Input);
midi_track_chunk_ID[midi_bit]=0;
printf(" CHUNK_ID: %s\n",midi_track_chunk_ID);
if(strcmp(midi_track_chunk_ID,"MTrk"))return -1;
fread (&midi_temp, 1, 1, Input);
midi_track_chunk_size+=(midi_temp<<32);
fread (&midi_temp, 1, 1, Input);
midi_track_chunk_size+=(midi_temp<<16);
fread (&midi_temp, 1, 1, Input);
midi_track_chunk_size+=(midi_temp<<8);
fread (&midi_temp, 1, 1, Input);
midi_track_chunk_size+=(midi_temp);
midi_track_t[midi_track_dik]=midi_track_chunk_size;
printf(" CHUNK_SIZE: %d\n\r",midi_track_t[midi_track_dik]);
}
fclose (Input);
getchar();
return 0;
}
Te lehetsz az első, aki segít a kérdezőnek!
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!