Initial community commit
This commit is contained in:
parent
537bcbc862
commit
fc06254474
16440 changed files with 4239995 additions and 2 deletions
48
Src/Plugins/Input/in_midi/cmf.cpp
Normal file
48
Src/Plugins/Input/in_midi/cmf.cpp
Normal file
|
@ -0,0 +1,48 @@
|
|||
#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;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue