Kezdőoldal » Számítástechnika » Programozás » Hogyan olvassak be midi...

Hogyan olvassak be midi fájlt? Bővebben lent.

Figyelt kérdés

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

[link]

[link]

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;

}



2012. máj. 5. 13:35
Sajnos még nem érkezett válasz a kérdésre.
Te lehetsz az első, aki segít a kérdezőnek!

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!