簡體   English   中英

使用C程序解析MIDI文件時出現問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM