123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- #include "main.h"
- #include "cvt.h"
- bool is_cmf(const BYTE* buf,size_t s)
- {
- return s>0x20 && *(DWORD*)buf == _rv('CTMF');
- }
- static BYTE tempodat[7]={0,0xFF,0x51,0x03,0,0,0};
- bool load_cmf(MIDI_file * mf,const BYTE* ptr,size_t sz)
- {
- if (sz < 14)
- return 0;
- WORD music_offset = *(WORD*)(ptr+8);
- if ((size_t)music_offset > sz)
- return 0;
- const BYTE* _t=ptr+music_offset;
- size_t total_size=sz - music_offset;
- mf->size=14+8+7+total_size;
- BYTE* _pt=(BYTE*)malloc(mf->size);
- if (!_pt) return 0;
- mf->data=_pt;
- *(DWORD*)_pt=_rv('MThd');
- _pt+=4;
- *(DWORD*)_pt=_rv(6);
- _pt+=4;
- *(WORD*)_pt=0;
- _pt+=2;
- *(WORD*)_pt=0x0100;
- _pt+=2;
- *(WORD*)_pt=rev16(*(WORD*)(ptr+10));
- _pt+=2;
- *(DWORD*)_pt=_rv('MTrk');
- _pt+=4;
- *(DWORD*)_pt=rev32(total_size+7);
- _pt+=4;
- DWORD tm=(DWORD)(48000000/(*(WORD*)(ptr+12)));
- tempodat[4]=(BYTE)((tm>>16)&0xFF);
- tempodat[5]=(BYTE)((tm>>8)&0xFF);
- tempodat[6]=(BYTE)(tm&0xFF);
- memcpy(_pt,tempodat,7);
- _pt+=7;
- memcpy(_pt,_t,total_size);
- return 1;
- }
|