aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_midi/gmf.cpp
diff options
context:
space:
mode:
authorJean-Francois Mauguit <jfmauguit@mac.com>2024-09-24 09:03:25 -0400
committerGitHub <noreply@github.com>2024-09-24 09:03:25 -0400
commitbab614c421ed7ae329d26bf028c4a3b1d2450f5a (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Plugins/Input/in_midi/gmf.cpp
parent4bde6044fddf053f31795b9eaccdd2a5a527d21f (diff)
parent20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (diff)
downloadwinamp-bab614c421ed7ae329d26bf028c4a3b1d2450f5a.tar.gz
Merge pull request #5 from WinampDesktop/community
Merge to main
Diffstat (limited to 'Src/Plugins/Input/in_midi/gmf.cpp')
-rw-r--r--Src/Plugins/Input/in_midi/gmf.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/Src/Plugins/Input/in_midi/gmf.cpp b/Src/Plugins/Input/in_midi/gmf.cpp
new file mode 100644
index 00000000..0065e60f
--- /dev/null
+++ b/Src/Plugins/Input/in_midi/gmf.cpp
@@ -0,0 +1,27 @@
+#include "main.h"
+#include "cvt.h"
+
+bool is_gmf(const BYTE* p,size_t s)
+{
+ return s>0x20 && *(DWORD*)p==_rv('GMF\x01');
+}
+
+bool load_gmf(MIDI_file * mf,const BYTE* buf,size_t siz)
+{
+ grow_buf wb;
+ wb.write_dword(_rv('MThd'));
+ wb.write_dword(_rv(6));
+ MIDIHEADER h={0x000,0x100,0xC000};
+ wb.write(&h,6);
+ wb.write_dword(_rv('MTrk'));
+ int tempo=100000*rev16(*(WORD*)(buf+4));
+ wb.write_dword(rev32(siz-9+8+3));//MTrk size
+ BYTE tempo_event[8]={0,0xFF,0x51,0x03,(BYTE)((tempo>>16)&0xFF),(BYTE)((tempo>>8)&0xFF),(BYTE)(tempo&0xFF),0};
+ wb.write(tempo_event,8);
+ wb.write(buf+8,siz-9);
+ wb.write("\xFF\x2F\x00",3);
+ mf->size = wb.get_size();
+ mf->data = (BYTE*)wb.finish();
+
+ return !!mf->data;
+}