1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
//#ifdef __MINGW32__
//typedef struct vswprintf {} swprintf;
//#endif
#include <cstdio>
#include <vector>
#include <stdio.h>
static void LoadMiles(const char* fn)
{
FILE* fp = std::fopen(fn, "rb");
if(!fp)
{
std::fprintf(stderr, "ERROR: Can't open %s file!", fn);
return;
}
std::fseek(fp, 0, SEEK_END);
std::vector<unsigned char> data(ftell(fp));
std::rewind(fp);
size_t got = std::fread(&data[0], 1, data.size(), fp);
std::fclose(fp);
if(got == 0)
{
std::fprintf(stderr, "ERROR: Can't read %s file!", fn);
return;
}
for(unsigned a=0; a<500; ++a)
{
unsigned gmnumber = data[a*6+0];
unsigned gmnumber2 = data[a*6+1];
unsigned offset = *(unsigned*)&data[a*6+2];
if(gmnumber == 0xFF) break;
//int gmno = gmnumber2==0x7F ? gmnumber+0x80 : gmnumber;
unsigned length = data[offset] + data[offset+1]*256;
//signed char notenum = data[offset+2];
std::printf("%02X %02X ", gmnumber,gmnumber2); //, offset);
for(unsigned b=0; b<length; ++b)
{
if(b > 3 && (b-3)%11 == 0) std::printf("\n ");
std::printf("%02X ", data[offset+b]);
}
std::printf("\n");
}
}
int main(int argc, const char* const* argv)
{
if(argc < 2)
{
std::printf("Usage: \n"
" %s filename.opl\n"
"or:\n"
" %s filename.opl\n"
"\n", argv[0], argv[0]);
return 1;
}
LoadMiles(argv[1]);
}
|