[英]Issues parsing a MIDI file with a C program
我正在為一個類編寫MIDI文件解析器。 我正在逐字節讀取值,然后將它們分配給結構中的變量。
這是有問題的代碼:
unsigned long deltatime = 0;
unsigned long totaltime = 0;
unsigned char *sbyte = (unsigned char *)malloc(sizeof(unsigned char));
unsigned char meta_e;
printf("\nTrack %d\n", i+1);
n = 0;
while (n<track[i].length)
{
sbyte[0] = 0;
t += ReadVarLen(track[i].data, n, &deltatime);
n += t;
totaltime += deltatime;
if (t == 0) n++;
memcpy(sbyte, &(track[i].data[n]), sizeof(unsigned char));
printf("%lu\t %lu %.2X ",totaltime, deltatime, *sbyte);
if (*sbyte >= 0xFF)
{
unsigned long length = 0;
unsigned char *dta;
meta_e = track[i].data[++n];
printf("%.2X ", meta_e);
n += ReadVarLen(track[i].data, ++n, &length);
printf("%.2lX ", length);
dta = (char *)malloc(sizeof(char) * length);
memcpy(dta, &(track[i].data[++n]), length);
for (j=0;j<length;j++) {printf("%.2X ",dta[j]);}
n += length;
printf("\n");
}
if ((*sbyte >= 0x80) && (*sbyte < 0xF0))
{
if ((*sbyte >= 0x80) && (*sbyte < 0x90)) {
unsigned char *midi_e;
midi_e = (char *)malloc(sizeof(char) * 2);
memcpy(midi_e, &(track[i].data[++n]), 2);
for (i=0;i<2;i++) printf("%.2X ",midi_e[i]);
n += 2;
printf("\n");
}
if ((*sbyte >= 0x90) && (*sbyte < 0xA0)) {
char *midi_e;
midi_e = (char *)malloc(sizeof(char) * 2);
memcpy(midi_e, &(track[i].data[++n]), 2);
for (i=0;i<2;i++) printf("%.2X ",midi_e[i]);
n += 2;
printf("\n");
}
if ((*sbyte >= 0xA0) && (*sbyte < 0xB0)) {
char *midi_e;
midi_e = (char *)malloc(sizeof(char) * 2);
memcpy(midi_e, &(track[i].data[++n]), 2);
for (i=0;i<2;i++) printf("%.2X ",midi_e[i]);
n += 2;
printf("\n");
}
if ((*sbyte >= 0xB0) && (*sbyte < 0xC0)) {
char *midi_e;
midi_e = (char *)malloc(sizeof(char) * 2);
memcpy(midi_e, &(track[i].data[++n]), 2);
for (i=0;i<2;i++) printf("%.2X ",midi_e[i]);
n += 2;
printf("\n");
}
if ((*sbyte >= 0xC0) && (*sbyte < 0xD0)) {
char *midi_e;
midi_e = (char *)malloc(sizeof(char));
memcpy(midi_e, &(track[i].data[++n]),1);
printf("%.2X ",midi_e[0]);
n++;
printf("\n");
}
if ((*sbyte >= 0xD0) && (*sbyte < 0xE0)) {
char *midi_e;
midi_e = (char *)malloc(sizeof(char));
memcpy(midi_e, &(track[i].data[++n]), 1);
printf("%.2X ",midi_e[0]);
n++;
printf("\n");
}
if ((*sbyte >= 0xE0) && (*sbyte < 0xF0)) {
char *midi_e;
midi_e = (char *)malloc(sizeof(char) * 2);
memcpy(midi_e, &(track[i].data[++n]), 2);
for (i=0;i<2;i++) printf("%.2X ",midi_e[i]);
n += 2;
printf("\n");
}
}
}
}
我的輸出如下所示:
Track 1
0 0 FF 01 27 43 6F 6D 70 6F 73 65 64 20 41 6E 64 20 53 65 71 75 65 6E 63 65 64 20 42 79 20 4D 69 63 68 61 65 6C 20 53 68 69 72 6B
0 0 FF 54 05 00 00 00 00 00
0 0 FF 51 03 07 A1 20
0 0 FF 58 04 04 02 18 08
0 0 FF 59 02 00 00
0 0 FF 2F 00
Track 2
0 0 FF 21 01 00
0 0 FF 20 01 03
0 0 B3 07 7F
0 0 C7 05
1800 1800 08 1808 8 97 4D 50
問題的倒數第二行是問題。 它應該是:
0 0 C3 44 81
根據十六進制轉換器工具,我曾經檢查示例MIDI文件。
我逐字節打印了緩沖區,它還說該值應該是C3而不是C7。 似乎只有將緩沖區的值分配給變量sbyte時,它才會更改(從我的角度來看這是莫名其妙的),變為0xC7。
當您到達以下其中一行時,它開始出錯:
for (i=0;i<2;i++) printf("%.2X ",midi_e[i]);
問題是您已經在循環外使用變量i
索引了音軌,因此您不想在此處更改其值。 也許改用j
?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.