From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/Plugins/Input/in_midi/mus.cpp | 184 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 Src/Plugins/Input/in_midi/mus.cpp (limited to 'Src/Plugins/Input/in_midi/mus.cpp') diff --git a/Src/Plugins/Input/in_midi/mus.cpp b/Src/Plugins/Input/in_midi/mus.cpp new file mode 100644 index 00000000..18aeb4f4 --- /dev/null +++ b/Src/Plugins/Input/in_midi/mus.cpp @@ -0,0 +1,184 @@ +#include "main.h" +#include "cvt.h" + +bool is_mus(const BYTE* buf,size_t s) +{ + if (s>0x20 && *(DWORD*)buf == '\x1ASUM') + { + int ofs = ((WORD*)buf)[3]; + int n_ins = ((WORD*)buf)[6]; + if (ofs>=16+(n_ins<<1) && ofs<16+(n_ins<<2) && ofs=9) ch++; + switch(score[x]&0x70) + { + case 0: //release note + ev.b[0]=0x80|ch; + ev.b[1]=score[x+1]; + ev.b[2]=0;//vols[ch]; + AddEvent(ev.dw,3); + x+=2; + break; + case 0x10: //play note + ev.b[0]=0x90|ch; + ev.b[1]=score[x+1]&0x7F; + if (score[x+1]&0x80) + { + vols[ch]=score[x+2]; + x+=3; + } + else + { + x+=2; + } + ev.b[2]=vols[ch]; + AddEvent(ev.dw,3); + break; + case 0x20: //pitch wheel + ev.b[0]=0xE0|ch; + ev.b[1]=0; + ev.b[2]=score[x+1]>>1; + AddEvent(ev.dw,3); + x+=2; + break; + case 0x30: //system event + if (score[x+1]>=10 && score[x+1]<=14) + { + ev.b[0]=0xB0|ch; + ev.b[1]=controllers[score[x+1]]; + ev.b[2]=1; + AddEvent(ev.dw,3); + x+=2; + break; + } + else return 0; + case 0x40: //change controller + if (score[x+1]) + { + if (score[x+1]<10) + { + ev.b[0]=0xB0|ch; + ev.b[1]=controllers[score[x+1]]; + ev.b[2]=score[x+2]; + AddEvent(ev.dw,3); + x+=3; + } + else return 0; + } + else + { + ev.b[0]=0xC0|ch; + ev.b[1]=score[x+2]; + AddEvent(ev.dw,2); + x+=3; + }; + break; + case 0x50: + case 0x70: + case 0x60: + return 0; + } + if (abort) return 0; + if (t) + { + DWORD dt=0; + do + { + dt = (dt<<7) + (score[x]&0x7F); + } while(score[x++]&0x80); + ct+=dt; + } + } + + out.write_dword(0x002FFF00); + out.write_dword_ptr(rev32(out.get_size()-(ts_ofs+4)),ts_ofs); + + mf->size = out.get_size(); + mf->data = (BYTE*)out.finish(); + return !!mf->data; +} + +bool load_mus(MIDI_file* mf,const BYTE* ptr,size_t sz) +{ + MUS_cvt c; + return c.run(mf,ptr,sz); +} \ No newline at end of file -- cgit