From 8315bab5ed45508aab28b311bd046ec896425718 Mon Sep 17 00:00:00 2001 From: Ozkan Sezer Date: Sat, 21 Oct 2017 09:04:55 +0300 Subject: [PATCH] remove broken DLS instruments support: it was never good enough. --- VisualC/timidity/timidity.vcxproj | 4 - Xcode-iOS/SDL_mixer.xcodeproj/project.pbxproj | 16 - Xcode/SDL_mixer.xcodeproj/project.pbxproj | 16 - timidity/dls1.h | 266 ---- timidity/dls2.h | 130 -- timidity/instrum.c | 8 - timidity/instrum_dls.c | 1254 ----------------- timidity/instrum_dls.h | 13 - timidity/playmidi.c | 3 +- timidity/timidity.c | 8 +- timidity/timidity.h | 9 +- 11 files changed, 3 insertions(+), 1724 deletions(-) delete mode 100644 timidity/dls1.h delete mode 100644 timidity/dls2.h delete mode 100644 timidity/instrum_dls.c delete mode 100644 timidity/instrum_dls.h diff --git a/VisualC/timidity/timidity.vcxproj b/VisualC/timidity/timidity.vcxproj index e8ff9677..07a7fb81 100644 --- a/VisualC/timidity/timidity.vcxproj +++ b/VisualC/timidity/timidity.vcxproj @@ -21,7 +21,6 @@ - @@ -32,10 +31,7 @@ - - - diff --git a/Xcode-iOS/SDL_mixer.xcodeproj/project.pbxproj b/Xcode-iOS/SDL_mixer.xcodeproj/project.pbxproj index ca11e9a8..eba2ebce 100755 --- a/Xcode-iOS/SDL_mixer.xcodeproj/project.pbxproj +++ b/Xcode-iOS/SDL_mixer.xcodeproj/project.pbxproj @@ -111,19 +111,15 @@ AAE883A51F973261007B6569 /* timidity.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE8838E1F97325E007B6569 /* timidity.h */; }; AAE883A61F973261007B6569 /* playmidi.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE8838F1F97325E007B6569 /* playmidi.h */; }; AAE883A71F973261007B6569 /* resample.c in Sources */ = {isa = PBXBuildFile; fileRef = AAE883901F97325E007B6569 /* resample.c */; }; - AAE883A81F973261007B6569 /* instrum_dls.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE883911F97325E007B6569 /* instrum_dls.h */; }; AAE883A91F973261007B6569 /* mix.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE883921F97325E007B6569 /* mix.h */; }; AAE883AA1F973261007B6569 /* options.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE883931F97325F007B6569 /* options.h */; }; AAE883AB1F973261007B6569 /* timidity.c in Sources */ = {isa = PBXBuildFile; fileRef = AAE883941F97325F007B6569 /* timidity.c */; }; AAE883AC1F973261007B6569 /* instrum.c in Sources */ = {isa = PBXBuildFile; fileRef = AAE883951F97325F007B6569 /* instrum.c */; }; AAE883AD1F973261007B6569 /* common.c in Sources */ = {isa = PBXBuildFile; fileRef = AAE883961F97325F007B6569 /* common.c */; }; - AAE883AE1F973261007B6569 /* dls1.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE883971F97325F007B6569 /* dls1.h */; }; AAE883AF1F973261007B6569 /* output.c in Sources */ = {isa = PBXBuildFile; fileRef = AAE883981F97325F007B6569 /* output.c */; }; - AAE883B01F973261007B6569 /* dls2.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE883991F97325F007B6569 /* dls2.h */; }; AAE883B11F973261007B6569 /* playmidi.c in Sources */ = {isa = PBXBuildFile; fileRef = AAE8839A1F97325F007B6569 /* playmidi.c */; }; AAE883B21F973261007B6569 /* readmidi.c in Sources */ = {isa = PBXBuildFile; fileRef = AAE8839B1F97325F007B6569 /* readmidi.c */; }; AAE883B31F973261007B6569 /* readmidi.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE8839C1F973260007B6569 /* readmidi.h */; }; - AAE883B41F973261007B6569 /* instrum_dls.c in Sources */ = {isa = PBXBuildFile; fileRef = AAE8839D1F973260007B6569 /* instrum_dls.c */; }; AAE883B51F973261007B6569 /* output.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE8839E1F973260007B6569 /* output.h */; }; AAE883B61F973261007B6569 /* resample.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE8839F1F973260007B6569 /* resample.h */; }; AAE883B71F973261007B6569 /* tables.c in Sources */ = {isa = PBXBuildFile; fileRef = AAE883A01F973260007B6569 /* tables.c */; }; @@ -237,19 +233,15 @@ AAE8838E1F97325E007B6569 /* timidity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timidity.h; sourceTree = ""; }; AAE8838F1F97325E007B6569 /* playmidi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = playmidi.h; sourceTree = ""; }; AAE883901F97325E007B6569 /* resample.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample.c; sourceTree = ""; }; - AAE883911F97325E007B6569 /* instrum_dls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instrum_dls.h; sourceTree = ""; }; AAE883921F97325E007B6569 /* mix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mix.h; sourceTree = ""; }; AAE883931F97325F007B6569 /* options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = options.h; sourceTree = ""; }; AAE883941F97325F007B6569 /* timidity.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = timidity.c; sourceTree = ""; }; AAE883951F97325F007B6569 /* instrum.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = instrum.c; sourceTree = ""; }; AAE883961F97325F007B6569 /* common.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = common.c; sourceTree = ""; }; - AAE883971F97325F007B6569 /* dls1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dls1.h; sourceTree = ""; }; AAE883981F97325F007B6569 /* output.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = output.c; sourceTree = ""; }; - AAE883991F97325F007B6569 /* dls2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dls2.h; sourceTree = ""; }; AAE8839A1F97325F007B6569 /* playmidi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = playmidi.c; sourceTree = ""; }; AAE8839B1F97325F007B6569 /* readmidi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = readmidi.c; sourceTree = ""; }; AAE8839C1F973260007B6569 /* readmidi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = readmidi.h; sourceTree = ""; }; - AAE8839D1F973260007B6569 /* instrum_dls.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = instrum_dls.c; sourceTree = ""; }; AAE8839E1F973260007B6569 /* output.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = output.h; sourceTree = ""; }; AAE8839F1F973260007B6569 /* resample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resample.h; sourceTree = ""; }; AAE883A01F973260007B6569 /* tables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tables.c; sourceTree = ""; }; @@ -350,10 +342,6 @@ children = ( AAE883961F97325F007B6569 /* common.c */, AAE8838C1F97325E007B6569 /* common.h */, - AAE883971F97325F007B6569 /* dls1.h */, - AAE883991F97325F007B6569 /* dls2.h */, - AAE8839D1F973260007B6569 /* instrum_dls.c */, - AAE883911F97325E007B6569 /* instrum_dls.h */, AAE883951F97325F007B6569 /* instrum.c */, AAE8838D1F97325E007B6569 /* instrum.h */, AAE883A21F973260007B6569 /* mix.c */, @@ -479,7 +467,6 @@ AA6442A1175B0E2500A2125A /* block.h in Headers */, AA6442A3175B0E2500A2125A /* codebook.h in Headers */, AAE883A41F973261007B6569 /* instrum.h in Headers */, - AAE883B01F973261007B6569 /* dls2.h in Headers */, AA6442A4175B0E2500A2125A /* codec_internal.h in Headers */, AAE406391F9609BD00EDAF53 /* music_mpg123.h in Headers */, AA6442A5175B0E2500A2125A /* config_types.h in Headers */, @@ -492,7 +479,6 @@ AAE883A61F973261007B6569 /* playmidi.h in Headers */, AAE4062D1F9609BD00EDAF53 /* music_modplug.h in Headers */, AAE883B81F973261007B6569 /* tables.h in Headers */, - AAE883A81F973261007B6569 /* instrum_dls.h in Headers */, AAE406401F9609BD00EDAF53 /* music_nativemidi.h in Headers */, AAE883A91F973261007B6569 /* mix.h in Headers */, AA6442C4175B0E5000A2125A /* mdct.h in Headers */, @@ -512,7 +498,6 @@ AA60219017653A9800662B9C /* modplug.h in Headers */, AAE406371F9609BD00EDAF53 /* music_ogg.h in Headers */, AA60219617653A9800662B9C /* tables.h in Headers */, - AAE883AE1F973261007B6569 /* dls1.h in Headers */, AAE406301F9609BD00EDAF53 /* music_wav.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -642,7 +627,6 @@ AA60218A17653A9800662B9C /* load_ult.cpp in Sources */, AA60218B17653A9800662B9C /* load_umx.cpp in Sources */, AAE4063F1F9609BD00EDAF53 /* music_ogg.c in Sources */, - AAE883B41F973261007B6569 /* instrum_dls.c in Sources */, AA60218C17653A9800662B9C /* load_wav.cpp in Sources */, AAE883AF1F973261007B6569 /* output.c in Sources */, AA60218D17653A9800662B9C /* load_xm.cpp in Sources */, diff --git a/Xcode/SDL_mixer.xcodeproj/project.pbxproj b/Xcode/SDL_mixer.xcodeproj/project.pbxproj index 51b997d9..9c32cc3b 100755 --- a/Xcode/SDL_mixer.xcodeproj/project.pbxproj +++ b/Xcode/SDL_mixer.xcodeproj/project.pbxproj @@ -58,19 +58,15 @@ AAE883771F97321E007B6569 /* timidity.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE883601F97321C007B6569 /* timidity.h */; }; AAE883781F97321E007B6569 /* playmidi.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE883611F97321C007B6569 /* playmidi.h */; }; AAE883791F97321E007B6569 /* resample.c in Sources */ = {isa = PBXBuildFile; fileRef = AAE883621F97321C007B6569 /* resample.c */; }; - AAE8837A1F97321E007B6569 /* instrum_dls.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE883631F97321C007B6569 /* instrum_dls.h */; }; AAE8837B1F97321E007B6569 /* mix.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE883641F97321C007B6569 /* mix.h */; }; AAE8837C1F97321E007B6569 /* options.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE883651F97321C007B6569 /* options.h */; }; AAE8837D1F97321E007B6569 /* timidity.c in Sources */ = {isa = PBXBuildFile; fileRef = AAE883661F97321C007B6569 /* timidity.c */; }; AAE8837E1F97321E007B6569 /* instrum.c in Sources */ = {isa = PBXBuildFile; fileRef = AAE883671F97321C007B6569 /* instrum.c */; }; AAE8837F1F97321E007B6569 /* common.c in Sources */ = {isa = PBXBuildFile; fileRef = AAE883681F97321D007B6569 /* common.c */; }; - AAE883801F97321E007B6569 /* dls1.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE883691F97321D007B6569 /* dls1.h */; }; AAE883811F97321E007B6569 /* output.c in Sources */ = {isa = PBXBuildFile; fileRef = AAE8836A1F97321D007B6569 /* output.c */; }; - AAE883821F97321E007B6569 /* dls2.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE8836B1F97321D007B6569 /* dls2.h */; }; AAE883831F97321E007B6569 /* playmidi.c in Sources */ = {isa = PBXBuildFile; fileRef = AAE8836C1F97321D007B6569 /* playmidi.c */; }; AAE883841F97321E007B6569 /* readmidi.c in Sources */ = {isa = PBXBuildFile; fileRef = AAE8836D1F97321D007B6569 /* readmidi.c */; }; AAE883851F97321E007B6569 /* readmidi.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE8836E1F97321D007B6569 /* readmidi.h */; }; - AAE883861F97321E007B6569 /* instrum_dls.c in Sources */ = {isa = PBXBuildFile; fileRef = AAE8836F1F97321D007B6569 /* instrum_dls.c */; }; AAE883871F97321E007B6569 /* output.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE883701F97321D007B6569 /* output.h */; }; AAE883881F97321E007B6569 /* resample.h in Headers */ = {isa = PBXBuildFile; fileRef = AAE883711F97321E007B6569 /* resample.h */; }; AAE883891F97321E007B6569 /* tables.c in Sources */ = {isa = PBXBuildFile; fileRef = AAE883721F97321E007B6569 /* tables.c */; }; @@ -160,19 +156,15 @@ AAE883601F97321C007B6569 /* timidity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = timidity.h; sourceTree = ""; }; AAE883611F97321C007B6569 /* playmidi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = playmidi.h; sourceTree = ""; }; AAE883621F97321C007B6569 /* resample.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = resample.c; sourceTree = ""; }; - AAE883631F97321C007B6569 /* instrum_dls.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = instrum_dls.h; sourceTree = ""; }; AAE883641F97321C007B6569 /* mix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mix.h; sourceTree = ""; }; AAE883651F97321C007B6569 /* options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = options.h; sourceTree = ""; }; AAE883661F97321C007B6569 /* timidity.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = timidity.c; sourceTree = ""; }; AAE883671F97321C007B6569 /* instrum.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = instrum.c; sourceTree = ""; }; AAE883681F97321D007B6569 /* common.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = common.c; sourceTree = ""; }; - AAE883691F97321D007B6569 /* dls1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dls1.h; sourceTree = ""; }; AAE8836A1F97321D007B6569 /* output.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = output.c; sourceTree = ""; }; - AAE8836B1F97321D007B6569 /* dls2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dls2.h; sourceTree = ""; }; AAE8836C1F97321D007B6569 /* playmidi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = playmidi.c; sourceTree = ""; }; AAE8836D1F97321D007B6569 /* readmidi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = readmidi.c; sourceTree = ""; }; AAE8836E1F97321D007B6569 /* readmidi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = readmidi.h; sourceTree = ""; }; - AAE8836F1F97321D007B6569 /* instrum_dls.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = instrum_dls.c; sourceTree = ""; }; AAE883701F97321D007B6569 /* output.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = output.h; sourceTree = ""; }; AAE883711F97321E007B6569 /* resample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resample.h; sourceTree = ""; }; AAE883721F97321E007B6569 /* tables.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = tables.c; sourceTree = ""; }; @@ -300,10 +292,6 @@ children = ( AAE883681F97321D007B6569 /* common.c */, AAE8835E1F97321C007B6569 /* common.h */, - AAE883691F97321D007B6569 /* dls1.h */, - AAE8836B1F97321D007B6569 /* dls2.h */, - AAE8836F1F97321D007B6569 /* instrum_dls.c */, - AAE883631F97321C007B6569 /* instrum_dls.h */, AAE883671F97321C007B6569 /* instrum.c */, AAE8835F1F97321C007B6569 /* instrum.h */, AAE883741F97321E007B6569 /* mix.c */, @@ -385,10 +373,8 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - AAE883801F97321E007B6569 /* dls1.h in Headers */, AAE405E31F9607C300EDAF53 /* music_fluidsynth.h in Headers */, AAE405EF1F9607C300EDAF53 /* music_smpeg.h in Headers */, - AAE8837A1F97321E007B6569 /* instrum_dls.h in Headers */, AAE405F31F9607C300EDAF53 /* music_mikmod.h in Headers */, AAE883781F97321E007B6569 /* playmidi.h in Headers */, AAE883771F97321E007B6569 /* timidity.h in Headers */, @@ -415,7 +401,6 @@ AAE405E61F9607C300EDAF53 /* music.h in Headers */, BE1FA8CD07AF96B2004B6283 /* SDL_mixer.h in Headers */, AAE405F51F9607C300EDAF53 /* music_ogg.h in Headers */, - AAE883821F97321E007B6569 /* dls2.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -604,7 +589,6 @@ AAE406021F9607C300EDAF53 /* music_cmd.c in Sources */, AAE405FB1F9607C300EDAF53 /* music_timidity.c in Sources */, AAE405F11F9607C300EDAF53 /* music.c in Sources */, - AAE883861F97321E007B6569 /* instrum_dls.c in Sources */, AAE8837E1F97321E007B6569 /* instrum.c in Sources */, AAE405F91F9607C300EDAF53 /* music_nativemidi.c in Sources */, AAE406031F9607C300EDAF53 /* music_mpg123.c in Sources */, diff --git a/timidity/dls1.h b/timidity/dls1.h deleted file mode 100644 index abc2075a..00000000 --- a/timidity/dls1.h +++ /dev/null @@ -1,266 +0,0 @@ -/*==========================================================================; -// -// dls1.h -// -// -// Description: -// -// Interface defines and structures for the Instrument Collection Form -// RIFF DLS. -// -// -// Written by Sonic Foundry 1996. Released for public use. -// -//=========================================================================*/ - -#ifndef _INC_DLS1 -#define _INC_DLS1 - -/*////////////////////////////////////////////////////////////////////////// -// -// -// Layout of an instrument collection: -// -// -// RIFF [] 'DLS ' [dlid,colh,INSTLIST,WAVEPOOL,INFOLIST] -// -// INSTLIST -// LIST [] 'lins' -// LIST [] 'ins ' [dlid,insh,RGNLIST,ARTLIST,INFOLIST] -// LIST [] 'ins ' [dlid,insh,RGNLIST,ARTLIST,INFOLIST] -// LIST [] 'ins ' [dlid,insh,RGNLIST,ARTLIST,INFOLIST] -// -// RGNLIST -// LIST [] 'lrgn' -// LIST [] 'rgn ' [rgnh,wsmp,wlnk,ARTLIST] -// LIST [] 'rgn ' [rgnh,wsmp,wlnk,ARTLIST] -// LIST [] 'rgn ' [rgnh,wsmp,wlnk,ARTLIST] -// -// ARTLIST -// LIST [] 'lart' -// 'art1' level 1 Articulation connection graph -// 'art2' level 2 Articulation connection graph -// '3rd1' Possible 3rd party articulation structure 1 -// '3rd2' Possible 3rd party articulation structure 2 .... and so on -// -// WAVEPOOL -// ptbl [] [pool table] -// LIST [] 'wvpl' -// [path], -// [path], -// LIST [] 'wave' [dlid,RIFFWAVE] -// LIST [] 'wave' [dlid,RIFFWAVE] -// LIST [] 'wave' [dlid,RIFFWAVE] -// LIST [] 'wave' [dlid,RIFFWAVE] -// LIST [] 'wave' [dlid,RIFFWAVE] -// -// INFOLIST -// LIST [] 'INFO' -// 'icmt' 'One of those crazy comments.' -// 'icop' 'Copyright (C) 1996 Sonic Foundry' -// -/////////////////////////////////////////////////////////////////////////*/ - - -/*///////////////////////////////////////////////////////////////////////// -// FOURCC's used in the DLS file -/////////////////////////////////////////////////////////////////////////*/ - -#define FOURCC_DLS mmioFOURCC('D','L','S',' ') -#define FOURCC_DLID mmioFOURCC('d','l','i','d') -#define FOURCC_COLH mmioFOURCC('c','o','l','h') -#define FOURCC_WVPL mmioFOURCC('w','v','p','l') -#define FOURCC_PTBL mmioFOURCC('p','t','b','l') -#define FOURCC_PATH mmioFOURCC('p','a','t','h') -#define FOURCC_wave mmioFOURCC('w','a','v','e') -#define FOURCC_LINS mmioFOURCC('l','i','n','s') -#define FOURCC_INS mmioFOURCC('i','n','s',' ') -#define FOURCC_INSH mmioFOURCC('i','n','s','h') -#define FOURCC_LRGN mmioFOURCC('l','r','g','n') -#define FOURCC_RGN mmioFOURCC('r','g','n',' ') -#define FOURCC_RGNH mmioFOURCC('r','g','n','h') -#define FOURCC_LART mmioFOURCC('l','a','r','t') -#define FOURCC_ART1 mmioFOURCC('a','r','t','1') -#define FOURCC_WLNK mmioFOURCC('w','l','n','k') -#define FOURCC_WSMP mmioFOURCC('w','s','m','p') -#define FOURCC_VERS mmioFOURCC('v','e','r','s') - -/*///////////////////////////////////////////////////////////////////////// -// Articulation connection graph definitions -/////////////////////////////////////////////////////////////////////////*/ - -/* Generic Sources */ -#define CONN_SRC_NONE 0x0000 -#define CONN_SRC_LFO 0x0001 -#define CONN_SRC_KEYONVELOCITY 0x0002 -#define CONN_SRC_KEYNUMBER 0x0003 -#define CONN_SRC_EG1 0x0004 -#define CONN_SRC_EG2 0x0005 -#define CONN_SRC_PITCHWHEEL 0x0006 - -/* Midi Controllers 0-127 */ -#define CONN_SRC_CC1 0x0081 -#define CONN_SRC_CC7 0x0087 -#define CONN_SRC_CC10 0x008a -#define CONN_SRC_CC11 0x008b - -/* Generic Destinations */ -#define CONN_DST_NONE 0x0000 -#define CONN_DST_ATTENUATION 0x0001 -#define CONN_DST_PITCH 0x0003 -#define CONN_DST_PAN 0x0004 - -/* LFO Destinations */ -#define CONN_DST_LFO_FREQUENCY 0x0104 -#define CONN_DST_LFO_STARTDELAY 0x0105 - -/* EG1 Destinations */ -#define CONN_DST_EG1_ATTACKTIME 0x0206 -#define CONN_DST_EG1_DECAYTIME 0x0207 -#define CONN_DST_EG1_RELEASETIME 0x0209 -#define CONN_DST_EG1_SUSTAINLEVEL 0x020a - -/* EG2 Destinations */ -#define CONN_DST_EG2_ATTACKTIME 0x030a -#define CONN_DST_EG2_DECAYTIME 0x030b -#define CONN_DST_EG2_RELEASETIME 0x030d -#define CONN_DST_EG2_SUSTAINLEVEL 0x030e - -#define CONN_TRN_NONE 0x0000 -#define CONN_TRN_CONCAVE 0x0001 - -typedef struct _DLSID { - ULONG ulData1; - USHORT usData2; - USHORT usData3; - BYTE abData4[8]; -} DLSID, FAR *LPDLSID; - -typedef struct _DLSVERSION { - DWORD dwVersionMS; - DWORD dwVersionLS; -} DLSVERSION, FAR *LPDLSVERSION; - - -typedef struct _CONNECTION { - USHORT usSource; - USHORT usControl; - USHORT usDestination; - USHORT usTransform; - LONG lScale; -} CONNECTION, FAR *LPCONNECTION; - - -/* Level 1 Articulation Data */ - -typedef struct _CONNECTIONLIST { - ULONG cbSize; /* size of the connection list structure */ - ULONG cConnections; /* count of connections in the list */ -} CONNECTIONLIST, FAR *LPCONNECTIONLIST; - - - -/*///////////////////////////////////////////////////////////////////////// -// Generic type defines for regions and instruments -/////////////////////////////////////////////////////////////////////////*/ - -typedef struct _RGNRANGE { - USHORT usLow; - USHORT usHigh; -} RGNRANGE, FAR * LPRGNRANGE; - -#define F_INSTRUMENT_DRUMS 0x80000000 - -typedef struct _MIDILOCALE { - ULONG ulBank; - ULONG ulInstrument; -} MIDILOCALE, FAR *LPMIDILOCALE; - -/*///////////////////////////////////////////////////////////////////////// -// Header structures found in an DLS file for collection, instruments, and -// regions. -/////////////////////////////////////////////////////////////////////////*/ - -#define F_RGN_OPTION_SELFNONEXCLUSIVE 0x0001 - -typedef struct _RGNHEADER { - RGNRANGE RangeKey; /* Key range */ - RGNRANGE RangeVelocity; /* Velocity Range */ - USHORT fusOptions; /* Synthesis options for this range */ - USHORT usKeyGroup; /* Key grouping for non simultaneous play */ - /* 0 = no group, 1 up is group */ - /* for Level 1 only groups 1-15 are allowed */ -} RGNHEADER, FAR *LPRGNHEADER; - -typedef struct _INSTHEADER { - ULONG cRegions; /* Count of regions in this instrument */ - MIDILOCALE Locale; /* Intended MIDI locale of this instrument */ -} INSTHEADER, FAR *LPINSTHEADER; - -typedef struct _DLSHEADER { - ULONG cInstruments; /* Count of instruments in the collection */ -} DLSHEADER, FAR *LPDLSHEADER; - -/*//////////////////////////////////////////////////////////////////////////// -// definitions for the Wave link structure -////////////////////////////////////////////////////////////////////////////*/ - -/* **** For level 1 only WAVELINK_CHANNEL_MONO is valid **** */ -/* ulChannel allows for up to 32 channels of audio with each bit position */ -/* specifiying a channel of playback */ - -#define WAVELINK_CHANNEL_LEFT 0x0001l -#define WAVELINK_CHANNEL_RIGHT 0x0002l - -#define F_WAVELINK_PHASE_MASTER 0x0001 - -typedef struct _WAVELINK { /* any paths or links are stored right after struct */ - USHORT fusOptions; /* options flags for this wave */ - USHORT usPhaseGroup; /* Phase grouping for locking channels */ - ULONG ulChannel; /* channel placement */ - ULONG ulTableIndex; /* index into the wave pool table, 0 based */ -} WAVELINK, FAR *LPWAVELINK; - -#define POOL_CUE_NULL 0xffffffffl - -typedef struct _POOLCUE { - ULONG ulOffset; /* Offset to the entry in the list */ -} POOLCUE, FAR *LPPOOLCUE; - -typedef struct _POOLTABLE { - ULONG cbSize; /* size of the pool table structure */ - ULONG cCues; /* count of cues in the list */ -} POOLTABLE, FAR *LPPOOLTABLE; - -/*//////////////////////////////////////////////////////////////////////////// -// Structures for the "wsmp" chunk -////////////////////////////////////////////////////////////////////////////*/ - -#define F_WSMP_NO_TRUNCATION 0x0001l -#define F_WSMP_NO_COMPRESSION 0x0002l - - -typedef struct _rwsmp { - ULONG cbSize; - USHORT usUnityNote; /* MIDI Unity Playback Note */ - SHORT sFineTune; /* Fine Tune in log tuning */ - LONG lAttenuation; /* Overall Attenuation to be applied to data */ - ULONG fulOptions; /* Flag options */ - ULONG cSampleLoops; /* Count of Sample loops, 0 loops is one shot */ -} WSMPL, FAR *LPWSMPL; - - -/* This loop type is a normal forward playing loop which is continually */ -/* played until the envelope reaches an off threshold in the release */ -/* portion of the volume envelope */ - -#define WLOOP_TYPE_FORWARD 0 - -typedef struct _rloop { - ULONG cbSize; - ULONG ulType; /* Loop Type */ - ULONG ulStart; /* Start of loop in samples */ - ULONG ulLength; /* Length of loop in samples */ -} WLOOP, FAR *LPWLOOP; - -#endif /*_INC_DLS1 */ diff --git a/timidity/dls2.h b/timidity/dls2.h deleted file mode 100644 index 30cec23a..00000000 --- a/timidity/dls2.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - - dls2.h - - Description: - - Interface defines and structures for the DLS2 extensions of DLS. - - - Written by Microsoft 1998. Released for public use. - -*/ - -#ifndef _INC_DLS2 -#define _INC_DLS2 - -/* - FOURCC's used in the DLS2 file, in addition to DLS1 chunks -*/ - -#define FOURCC_RGN2 mmioFOURCC('r','g','n','2') -#define FOURCC_LAR2 mmioFOURCC('l','a','r','2') -#define FOURCC_ART2 mmioFOURCC('a','r','t','2') -#define FOURCC_CDL mmioFOURCC('c','d','l',' ') -#define FOURCC_DLID mmioFOURCC('d','l','i','d') - -/* - Articulation connection graph definitions. These are in addition to - the definitions in the DLS1 header. -*/ - -/* Generic Sources (in addition to DLS1 sources. */ -#define CONN_SRC_POLYPRESSURE 0x0007 /* Polyphonic Pressure */ -#define CONN_SRC_CHANNELPRESSURE 0x0008 /* Channel Pressure */ -#define CONN_SRC_VIBRATO 0x0009 /* Vibrato LFO */ -#define CONN_SRC_MONOPRESSURE 0x000a /* MIDI Mono pressure */ - - -/* Midi Controllers */ -#define CONN_SRC_CC91 0x00db /* Reverb Send */ -#define CONN_SRC_CC93 0x00dd /* Chorus Send */ - - -/* Generic Destinations */ -#define CONN_DST_GAIN 0x0001 /* Same as CONN_DST_ ATTENUATION, but more appropriate terminology. */ -#define CONN_DST_KEYNUMBER 0x0005 /* Key Number Generator */ - -/* Audio Channel Output Destinations */ -#define CONN_DST_LEFT 0x0010 /* Left Channel Send */ -#define CONN_DST_RIGHT 0x0011 /* Right Channel Send */ -#define CONN_DST_CENTER 0x0012 /* Center Channel Send */ -#define CONN_DST_LEFTREAR 0x0013 /* Left Rear Channel Send */ -#define CONN_DST_RIGHTREAR 0x0014 /* Right Rear Channel Send */ -#define CONN_DST_LFE_CHANNEL 0x0015 /* LFE Channel Send */ -#define CONN_DST_CHORUS 0x0080 /* Chorus Send */ -#define CONN_DST_REVERB 0x0081 /* Reverb Send */ - -/* Vibrato LFO Destinations */ -#define CONN_DST_VIB_FREQUENCY 0x0114 /* Vibrato Frequency */ -#define CONN_DST_VIB_STARTDELAY 0x0115 /* Vibrato Start Delay */ - -/* EG1 Destinations */ -#define CONN_DST_EG1_DELAYTIME 0x020B /* EG1 Delay Time */ -#define CONN_DST_EG1_HOLDTIME 0x020C /* EG1 Hold Time */ -#define CONN_DST_EG1_SHUTDOWNTIME 0x020D /* EG1 Shutdown Time */ - - -/* EG2 Destinations */ -#define CONN_DST_EG2_DELAYTIME 0x030F /* EG2 Delay Time */ -#define CONN_DST_EG2_HOLDTIME 0x0310 /* EG2 Hold Time */ - - -/* Filter Destinations */ -#define CONN_DST_FILTER_CUTOFF 0x0500 /* Filter Cutoff Frequency */ -#define CONN_DST_FILTER_Q 0x0501 /* Filter Resonance */ - - -/* Transforms */ -#define CONN_TRN_CONVEX 0x0002 /* Convex Transform */ -#define CONN_TRN_SWITCH 0x0003 /* Switch Transform */ - - -/* Conditional chunk operators */ - #define DLS_CDL_AND 0x0001 /* X = X & Y */ - #define DLS_CDL_OR 0x0002 /* X = X | Y */ - #define DLS_CDL_XOR 0x0003 /* X = X ^ Y */ - #define DLS_CDL_ADD 0x0004 /* X = X + Y */ - #define DLS_CDL_SUBTRACT 0x0005 /* X = X - Y */ - #define DLS_CDL_MULTIPLY 0x0006 /* X = X * Y */ - #define DLS_CDL_DIVIDE 0x0007 /* X = X / Y */ - #define DLS_CDL_LOGICAL_AND 0x0008 /* X = X && Y */ - #define DLS_CDL_LOGICAL_OR 0x0009 /* X = X || Y */ - #define DLS_CDL_LT 0x000A /* X = (X < Y) */ - #define DLS_CDL_LE 0x000B /* X = (X <= Y) */ - #define DLS_CDL_GT 0x000C /* X = (X > Y) */ - #define DLS_CDL_GE 0x000D /* X = (X >= Y) */ - #define DLS_CDL_EQ 0x000E /* X = (X == Y) */ - #define DLS_CDL_NOT 0x000F /* X = !X */ - #define DLS_CDL_CONST 0x0010 /* 32-bit constant */ - #define DLS_CDL_QUERY 0x0011 /* 32-bit value returned from query */ - #define DLS_CDL_QUERYSUPPORTED 0x0012 /* Test to see if query is supported by synth */ - -/* - Loop and release -*/ - -#define WLOOP_TYPE_RELEASE 1 - -/* - WaveLink chunk -*/ - -#define F_WAVELINK_MULTICHANNEL 0x0002 - - -/* - DLSID queries for -*/ - -DEFINE_GUID(DLSID_GMInHardware, 0x178f2f24, 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); -DEFINE_GUID(DLSID_GSInHardware, 0x178f2f25, 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); -DEFINE_GUID(DLSID_XGInHardware, 0x178f2f26, 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); -DEFINE_GUID(DLSID_SupportsDLS1, 0x178f2f27, 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); -DEFINE_GUID(DLSID_SupportsDLS2, 0xf14599e5, 0x4689, 0x11d2, 0xaf, 0xa6, 0x0, 0xaa, 0x0, 0x24, 0xd8, 0xb6); -DEFINE_GUID(DLSID_SampleMemorySize, 0x178f2f28, 0xc364, 0x11d1, 0xa7, 0x60, 0x00, 0x00, 0xf8, 0x75, 0xac, 0x12); -DEFINE_GUID(DLSID_ManufacturersID, 0xb03e1181, 0x8095, 0x11d2, 0xa1, 0xef, 0x0, 0x60, 0x8, 0x33, 0xdb, 0xd8); -DEFINE_GUID(DLSID_ProductID, 0xb03e1182, 0x8095, 0x11d2, 0xa1, 0xef, 0x0, 0x60, 0x8, 0x33, 0xdb, 0xd8); -DEFINE_GUID(DLSID_SamplePlaybackRate, 0x2a91f713, 0xa4bf, 0x11d2, 0xbb, 0xdf, 0x0, 0x60, 0x8, 0x33, 0xdb, 0xd8); - -#endif /* _INC_DLS2 */ diff --git a/timidity/instrum.c b/timidity/instrum.c index 16d5737e..96354d00 100644 --- a/timidity/instrum.c +++ b/timidity/instrum.c @@ -26,7 +26,6 @@ #include "options.h" #include "common.h" #include "instrum.h" -#include "instrum_dls.h" #include "resample.h" #include "tables.h" @@ -260,8 +259,6 @@ static Instrument *load_instrument(MidiSong *song, char *name, int percussion, READ_LONG(sp->low_freq); READ_LONG(sp->high_freq); READ_LONG(sp->root_freq); - sp->low_vel = 0; - sp->high_vel = 127; SDL_RWseek(rw, 2, RW_SEEK_CUR); /* Why have a "root frequency" and then * "tuning"?? */ @@ -516,11 +513,6 @@ static int fill_bank(MidiSong *song, int dr, int b) { if (bank->instrument[i]==MAGIC_LOAD_INSTRUMENT) { - bank->instrument[i]=load_instrument_dls(song, dr, b, i); - if (bank->instrument[i]) - { - continue; - } if (!(bank->tone[i].name)) { SNDDBG(("No instrument mapped to %s %d, program %d%s\n", diff --git a/timidity/instrum_dls.c b/timidity/instrum_dls.c deleted file mode 100644 index 736e2070..00000000 --- a/timidity/instrum_dls.c +++ /dev/null @@ -1,1254 +0,0 @@ -/* - - TiMidity -- Experimental MIDI to WAVE converter - Copyright (C) 1995 Tuukka Toivonen - - This program is free software; you can redistribute it and/or modify - it under the terms of the Perl Artistic License, available in COPYING. - - instrum.h - - */ - -#include -#include - -#include "SDL.h" -#include "SDL_endian.h" -#include "SDL_rwops.h" - -#include "SDL.h" - -#include "timidity.h" -#include "options.h" -#include "instrum.h" -#include "tables.h" -#include "common.h" - -/*-------------------------------------------------------------------------*/ -/* * * * * * * * * * * * * * * * * load_riff.h * * * * * * * * * * * * * * */ -/*-------------------------------------------------------------------------*/ -typedef struct _RIFF_Chunk { - Uint32 magic; - Uint32 length; - Uint32 subtype; - Uint8 *data; - struct _RIFF_Chunk *child; - struct _RIFF_Chunk *next; -} RIFF_Chunk; - -extern RIFF_Chunk* LoadRIFF(SDL_RWops *src); -extern void FreeRIFF(RIFF_Chunk *chunk); -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*-------------------------------------------------------------------------*/ -/* * * * * * * * * * * * * * * * * load_riff.c * * * * * * * * * * * * * * */ -/*-------------------------------------------------------------------------*/ -#define RIFF 0x46464952 /* "RIFF" */ -#define LIST 0x5453494c /* "LIST" */ - -static RIFF_Chunk *AllocRIFFChunk() -{ - RIFF_Chunk *chunk = (RIFF_Chunk *)malloc(sizeof(*chunk)); - if ( !chunk ) { - SDL_Error(SDL_ENOMEM); - return NULL; - } - memset(chunk, 0, sizeof(*chunk)); - return chunk; -} - -static void FreeRIFFChunk(RIFF_Chunk *chunk) -{ - if ( chunk->child ) { - FreeRIFFChunk(chunk->child); - } - if ( chunk->next ) { - FreeRIFFChunk(chunk->next); - } - free(chunk); -} - -static int ChunkHasSubType(Uint32 magic) -{ - static Uint32 chunk_list[] = { - RIFF, LIST - }; - int i; - for ( i = 0; i < SDL_TABLESIZE(chunk_list); ++i ) { - if ( magic == chunk_list[i] ) { - return 1; - } - } - return 0; -} - -static int ChunkHasSubChunks(Uint32 magic) -{ - static Uint32 chunk_list[] = { - RIFF, LIST - }; - int i; - for ( i = 0; i < SDL_TABLESIZE(chunk_list); ++i ) { - if ( magic == chunk_list[i] ) { - return 1; - } - } - return 0; -} - -static void LoadSubChunks(RIFF_Chunk *chunk, Uint8 *data, Uint32 left) -{ - Uint8 *subchunkData; - Uint32 subchunkDataLen; - - while ( left > 8 ) { - RIFF_Chunk *child = AllocRIFFChunk(); - RIFF_Chunk *next, *prev = NULL; - for ( next = chunk->child; next; next = next->next ) { - prev = next; - } - if ( prev ) { - prev->next = child; - } else { - chunk->child = child; - } - - child->magic = (data[0] << 0) | - (data[1] << 8) | - (data[2] << 16) | - (data[3] << 24); - data += 4; - left -= 4; - child->length = (data[0] << 0) | - (data[1] << 8) | - (data[2] << 16) | - (data[3] << 24); - data += 4; - left -= 4; - child->data = data; - - if ( child->length > left ) { - child->length = left; - } - - subchunkData = child->data; - subchunkDataLen = child->length; - if ( ChunkHasSubType(child->magic) && subchunkDataLen >= 4 ) { - child->subtype = (subchunkData[0] << 0) | - (subchunkData[1] << 8) | - (subchunkData[2] << 16) | - (subchunkData[3] << 24); - subchunkData += 4; - subchunkDataLen -= 4; - } - if ( ChunkHasSubChunks(child->magic) ) { - LoadSubChunks(child, subchunkData, subchunkDataLen); - } - - data += child->length; - left -= child->length; - } -} - -RIFF_Chunk *LoadRIFF(SDL_RWops *src) -{ - RIFF_Chunk *chunk; - Uint8 *subchunkData; - Uint32 subchunkDataLen; - - /* Allocate the chunk structure */ - chunk = AllocRIFFChunk(); - - /* Make sure the file is in RIFF format */ - chunk->magic = SDL_ReadLE32(src); - chunk->length = SDL_ReadLE32(src); - if ( chunk->magic != RIFF ) { - SDL_SetError("Not a RIFF file"); - FreeRIFFChunk(chunk); - return NULL; - } - chunk->data = (Uint8 *)malloc(chunk->length); - if ( chunk->data == NULL ) { - SDL_Error(SDL_ENOMEM); - FreeRIFFChunk(chunk); - return NULL; - } - if ( SDL_RWread(src, chunk->data, chunk->length, 1) != 1 ) { - SDL_Error(SDL_EFREAD); - FreeRIFF(chunk); - return NULL; - } - subchunkData = chunk->data; - subchunkDataLen = chunk->length; - if ( ChunkHasSubType(chunk->magic) && subchunkDataLen >= 4 ) { - chunk->subtype = (subchunkData[0] << 0) | - (subchunkData[1] << 8) | - (subchunkData[2] << 16) | - (subchunkData[3] << 24); - subchunkData += 4; - subchunkDataLen -= 4; - } - if ( ChunkHasSubChunks(chunk->magic) ) { - LoadSubChunks(chunk, subchunkData, subchunkDataLen); - } - return chunk; -} - -void FreeRIFF(RIFF_Chunk *chunk) -{ - free(chunk->data); - FreeRIFFChunk(chunk); -} - -#ifdef TEST_MAIN_RIFF - -void PrintRIFF(RIFF_Chunk *chunk, int level) -{ - static char prefix[128]; - - if ( level == sizeof(prefix)-1 ) { - return; - } - if ( level > 0 ) { - prefix[(level-1)*2] = ' '; - prefix[(level-1)*2+1] = ' '; - } - prefix[level*2] = '\0'; - printf("%sChunk: %c%c%c%c (%d bytes)", prefix, - ((chunk->magic >> 0) & 0xFF), - ((chunk->magic >> 8) & 0xFF), - ((chunk->magic >> 16) & 0xFF), - ((chunk->magic >> 24) & 0xFF), chunk->length); - if ( chunk->subtype ) { - printf(" subtype: %c%c%c%c", - ((chunk->subtype >> 0) & 0xFF), - ((chunk->subtype >> 8) & 0xFF), - ((chunk->subtype >> 16) & 0xFF), - ((chunk->subtype >> 24) & 0xFF)); - } - printf("\n"); - if ( chunk->child ) { - printf("%s{\n", prefix); - PrintRIFF(chunk->child, level + 1); - printf("%s}\n", prefix); - } - if ( chunk->next ) { - PrintRIFF(chunk->next, level); - } - if ( level > 0 ) { - prefix[(level-1)*2] = '\0'; - } -} - -main(int argc, char *argv[]) -{ - int i; - for ( i = 1; i < argc; ++i ) { - RIFF_Chunk *chunk; - SDL_RWops *src = SDL_RWFromFile(argv[i], "rb"); - if ( !src ) { - fprintf(stderr, "Couldn't open %s: %s", argv[i], SDL_GetError()); - continue; - } - chunk = LoadRIFF(src); - if ( chunk ) { - PrintRIFF(chunk, 0); - FreeRIFF(chunk); - } else { - fprintf(stderr, "Couldn't load %s: %s\n", argv[i], SDL_GetError()); - } - SDL_RWclose(src); - } -} - -#endif // TEST_MAIN -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*-------------------------------------------------------------------------*/ -/* * * * * * * * * * * * * * * * * load_dls.h * * * * * * * * * * * * * * */ -/*-------------------------------------------------------------------------*/ -/* This code is based on the DLS spec version 1.1, available at: - http://www.midi.org/about-midi/dls/dlsspec.shtml -*/ - -/* Some typedefs so the public dls headers don't need to be modified */ -#define FAR -typedef Uint8 BYTE; -typedef Sint16 SHORT; -typedef Uint16 USHORT; -typedef Uint16 WORD; -typedef Sint32 LONG; -typedef Uint32 ULONG; -typedef Uint32 DWORD; -#define mmioFOURCC(A, B, C, D) \ - (((A) << 0) | ((B) << 8) | ((C) << 16) | ((D) << 24)) -#define DEFINE_GUID(A, B, C, E, F, G, H, I, J, K, L, M) - -#include "dls1.h" -#include "dls2.h" - -typedef struct _WaveFMT { - WORD wFormatTag; - WORD wChannels; - DWORD dwSamplesPerSec; - DWORD dwAvgBytesPerSec; - WORD wBlockAlign; - WORD wBitsPerSample; -} WaveFMT; - -typedef struct _DLS_Wave { - WaveFMT *format; - Uint8 *data; - Uint32 length; - WSMPL *wsmp; - WLOOP *wsmp_loop; -} DLS_Wave; - -typedef struct _DLS_Region { - RGNHEADER *header; - WAVELINK *wlnk; - WSMPL *wsmp; - WLOOP *wsmp_loop; - CONNECTIONLIST *art; - CONNECTION *artList; -} DLS_Region; - -typedef struct _DLS_Instrument { - const char *name; - INSTHEADER *header; - DLS_Region *regions; - CONNECTIONLIST *art; - CONNECTION *artList; -} DLS_Instrument; - -typedef struct _DLS_Data { - struct _RIFF_Chunk *chunk; - - Uint32 cInstruments; - DLS_Instrument *instruments; - - POOLTABLE *ptbl; - POOLCUE *ptblList; - DLS_Wave *waveList; - - const char *name; - const char *artist; - const char *copyright; - const char *comments; -} DLS_Data; - -extern DLS_Data* LoadDLS(SDL_RWops *src); -extern void FreeDLS(DLS_Data *chunk); -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*-------------------------------------------------------------------------*/ -/* * * * * * * * * * * * * * * * * load_dls.c * * * * * * * * * * * * * * */ -/*-------------------------------------------------------------------------*/ - -#define FOURCC_LIST 0x5453494c /* "LIST" */ -#define FOURCC_FMT 0x20746D66 /* "fmt " */ -#define FOURCC_DATA 0x61746164 /* "data" */ -#define FOURCC_INFO mmioFOURCC('I','N','F','O') -#define FOURCC_IARL mmioFOURCC('I','A','R','L') -#define FOURCC_IART mmioFOURCC('I','A','R','T') -#define FOURCC_ICMS mmioFOURCC('I','C','M','S') -#define FOURCC_ICMT mmioFOURCC('I','C','M','T') -#define FOURCC_ICOP mmioFOURCC('I','C','O','P') -#define FOURCC_ICRD mmioFOURCC('I','C','R','D') -#define FOURCC_IENG mmioFOURCC('I','E','N','G') -#define FOURCC_IGNR mmioFOURCC('I','G','N','R') -#define FOURCC_IKEY mmioFOURCC('I','K','E','Y') -#define FOURCC_IMED mmioFOURCC('I','M','E','D') -#define FOURCC_INAM mmioFOURCC('I','N','A','M') -#define FOURCC_IPRD mmioFOURCC('I','P','R','D') -#define FOURCC_ISBJ mmioFOURCC('I','S','B','J') -#define FOURCC_ISFT mmioFOURCC('I','S','F','T') -#define FOURCC_ISRC mmioFOURCC('I','S','R','C') -#define FOURCC_ISRF mmioFOURCC('I','S','R','F') -#define FOURCC_ITCH mmioFOURCC('I','T','C','H') - - -static void FreeRegions(DLS_Instrument *instrument) -{ - if ( instrument->regions ) { - free(instrument->regions); - } -} - -static void AllocRegions(DLS_Instrument *instrument) -{ - int datalen = (instrument->header->cRegions * sizeof(DLS_Region)); - FreeRegions(instrument); - instrument->regions = (DLS_Region *)malloc(datalen); - if ( instrument->regions ) { - memset(instrument->regions, 0, datalen); - } -} - -static void FreeInstruments(DLS_Data *data) -{ - if ( data->instruments ) { - Uint32 i; - for ( i = 0; i < data->cInstruments; ++i ) { - FreeRegions(&data->instruments[i]); - } - free(data->instruments); - } -} - -static void AllocInstruments(DLS_Data *data) -{ - int datalen = (data->cInstruments * sizeof(DLS_Instrument)); - FreeInstruments(data); - data->instruments = (DLS_Instrument *)malloc(datalen); - if ( data->instruments ) { - memset(data->instruments, 0, datalen); - } -} - -static void FreeWaveList(DLS_Data *data) -{ - if ( data->waveList ) { - free(data->waveList); - } -} - -static void AllocWaveList(DLS_Data *data) -{ - int datalen = (data->ptbl->cCues * sizeof(DLS_Wave)); - FreeWaveList(data); - data->waveList = (DLS_Wave *)malloc(datalen); - if ( data->waveList ) { - memset(data->waveList, 0, datalen); - } -} - -static void Parse_colh(DLS_Data *data, RIFF_Chunk *chunk) -{ - data->cInstruments = SDL_SwapLE32(*(Uint32 *)chunk->data); - AllocInstruments(data); -} - -static void Parse_insh(DLS_Data *data, RIFF_Chunk *chunk, DLS_Instrument *instrument) -{ - INSTHEADER *header = (INSTHEADER *)chunk->data; - header->cRegions = SDL_SwapLE32(header->cRegions); - header->Locale.ulBank = SDL_SwapLE32(header->Locale.ulBank); - header->Locale.ulInstrument = SDL_SwapLE32(header->Locale.ulInstrument); - instrument->header = header; - AllocRegions(instrument); -} - -static void Parse_rgnh(DLS_Data *data, RIFF_Chunk *chunk, DLS_Region *region) -{ - RGNHEADER *header = (RGNHEADER *)chunk->data; - header->RangeKey.usLow = SDL_SwapLE16(header->RangeKey.usLow); - header->RangeKey.usHigh = SDL_SwapLE16(header->RangeKey.usHigh); - header->RangeVelocity.usLow = SDL_SwapLE16(header->RangeVelocity.usLow); - header->RangeVelocity.usHigh = SDL_SwapLE16(header->RangeVelocity.usHigh); - header->fusOptions = SDL_SwapLE16(header->fusOptions); - header->usKeyGroup = SDL_SwapLE16(header->usKeyGroup); - region->header = header; -} - -static void Parse_wlnk(DLS_Data *data, RIFF_Chunk *chunk, DLS_Region *region) -{ - WAVELINK *wlnk = (WAVELINK *)chunk->data; - wlnk->fusOptions = SDL_SwapLE16(wlnk->fusOptions); - wlnk->usPhaseGroup = SDL_SwapLE16(wlnk->usPhaseGroup); - wlnk->ulChannel = SDL_SwapLE16(wlnk->ulChannel); - wlnk->ulTableIndex = SDL_SwapLE16(wlnk->ulTableIndex); - region->wlnk = wlnk; -} - -static void Parse_wsmp(DLS_Data *data, RIFF_Chunk *chunk, WSMPL **wsmp_ptr, WLOOP **wsmp_loop_ptr) -{ - Uint32 i; - WSMPL *wsmp = (WSMPL *)chunk->data; - WLOOP *loop; - wsmp->cbSize = SDL_SwapLE32(wsmp->cbSize); - wsmp->usUnityNote = SDL_SwapLE16(wsmp->usUnityNote); - wsmp->sFineTune = SDL_SwapLE16(wsmp->sFineTune); - wsmp->lAttenuation = SDL_SwapLE32(wsmp->lAttenuation); - wsmp->fulOptions = SDL_SwapLE32(wsmp->fulOptions); - wsmp->cSampleLoops = SDL_SwapLE32(wsmp->cSampleLoops); - loop = (WLOOP *)((Uint8 *)chunk->data + wsmp->cbSize); - *wsmp_ptr = wsmp; - *wsmp_loop_ptr = loop; - for ( i = 0; i < wsmp->cSampleLoops; ++i ) { - loop->cbSize = SDL_SwapLE32(loop->cbSize); - loop->ulType = SDL_SwapLE32(loop->ulType); - loop->ulStart = SDL_SwapLE32(loop->ulStart); - loop->ulLength = SDL_SwapLE32(loop->ulLength); - ++loop; - } -} - -static void Parse_art(DLS_Data *data, RIFF_Chunk *chunk, CONNECTIONLIST **art_ptr, CONNECTION **artList_ptr) -{ - Uint32 i; - CONNECTIONLIST *art = (CONNECTIONLIST *)chunk->data; - CONNECTION *artList; - art->cbSize = SDL_SwapLE32(art->cbSize); - art->cConnections = SDL_SwapLE32(art->cConnections); - artList = (CONNECTION *)((Uint8 *)chunk->data + art->cbSize); - *art_ptr = art; - *artList_ptr = artList; - for ( i = 0; i < art->cConnections; ++i ) { - artList->usSource = SDL_SwapLE16(artList->usSource); - artList->usControl = SDL_SwapLE16(artList->usControl); - artList->usDestination = SDL_SwapLE16(artList->usDestination); - artList->usTransform = SDL_SwapLE16(artList->usTransform); - artList->lScale = SDL_SwapLE32(artList->lScale); - ++artList; - } -} - -static void Parse_lart(DLS_Data *data, RIFF_Chunk *chunk, CONNECTIONLIST **conn_ptr, CONNECTION **connList_ptr) -{ - /* FIXME: This only supports one set of connections */ - for ( chunk = chunk->child; chunk; chunk = chunk->next ) { - Uint32 magic = (chunk->magic == FOURCC_LIST) ? chunk->subtype : chunk->magic; - switch(magic) { - case FOURCC_ART1: - case FOURCC_ART2: - Parse_art(data, chunk, conn_ptr, connList_ptr); - return; - } - } -} - -static void Parse_rgn(DLS_Data *data, RIFF_Chunk *chunk, DLS_Region *region) -{ - for ( chunk = chunk->child; chunk; chunk = chunk->next ) { - Uint32 magic = (chunk->magic == FOURCC_LIST) ? chunk->subtype : chunk->magic; - switch(magic) { - case FOURCC_RGNH: - Parse_rgnh(data, chunk, region); - break; - case FOURCC_WLNK: - Parse_wlnk(data, chunk, region); - break; - case FOURCC_WSMP: - Parse_wsmp(data, chunk, ®ion->wsmp, ®ion->wsmp_loop); - break; - case FOURCC_LART: - case FOURCC_LAR2: - Parse_lart(data, chunk, ®ion->art, ®ion->artList); - break; - } - } -} - -static void Parse_lrgn(DLS_Data *data, RIFF_Chunk *chunk, DLS_Instrument *instrument) -{ - Uint32 region = 0; - for ( chunk = chunk->child; chunk; chunk = chunk->next ) { - Uint32 magic = (chunk->magic == FOURCC_LIST) ? chunk->subtype : chunk->magic; - switch(magic) { - case FOURCC_RGN: - case FOURCC_RGN2: - if ( region < instrument->header->cRegions ) { - Parse_rgn(data, chunk, &instrument->regions[region++]); - } - break; - } - } -} - -static void Parse_INFO_INS(DLS_Data *data, RIFF_Chunk *chunk, DLS_Instrument *instrument) -{ - for ( chunk = chunk->child; chunk; chunk = chunk->next ) { - Uint32 magic = (chunk->magic == FOURCC_LIST) ? chunk->subtype : chunk->magic; - switch(magic) { - case FOURCC_INAM: /* Name */ - instrument->name = (char *)chunk->data; - break; - } - } -} - -static void Parse_ins(DLS_Data *data, RIFF_Chunk *chunk, DLS_Instrument *instrument) -{ - for ( chunk = chunk->child; chunk; chunk = chunk->next ) { - Uint32 magic = (chunk->magic == FOURCC_LIST) ? chunk->subtype : chunk->magic; - switch(magic) { - case FOURCC_INSH: - Parse_insh(data, chunk, instrument); - break; - case FOURCC_LRGN: - Parse_lrgn(data, chunk, instrument); - break; - case FOURCC_LART: - case FOURCC_LAR2: - Parse_lart(data, chunk, &instrument->art, &instrument->artList); - break; - case FOURCC_INFO: - Parse_INFO_INS(data, chunk, instrument); - break; - } - } -} - -static void Parse_lins(DLS_Data *data, RIFF_Chunk *chunk) -{ - Uint32 instrument = 0; - for ( chunk = chunk->child; chunk; chunk = chunk->next ) { - Uint32 magic = (chunk->magic == FOURCC_LIST) ? chunk->subtype : chunk->magic; - switch(magic) { - case FOURCC_INS: - if ( instrument < data->cInstruments ) { - Parse_ins(data, chunk, &data->instruments[instrument++]); - } - break; - } - } -} - -static void Parse_ptbl(DLS_Data *data, RIFF_Chunk *chunk) -{ - Uint32 i; - POOLTABLE *ptbl = (POOLTABLE *)chunk->data; - ptbl->cbSize = SDL_SwapLE32(ptbl->cbSize); - ptbl->cCues = SDL_SwapLE32(ptbl->cCues); - data->ptbl = ptbl; - data->ptblList = (POOLCUE *)((Uint8 *)chunk->data + ptbl->cbSize); - for ( i = 0; i < ptbl->cCues; ++i ) { - data->ptblList[i].ulOffset = SDL_SwapLE32(data->ptblList[i].ulOffset); - } - AllocWaveList(data); -} - -static void Parse_fmt(DLS_Data *data, RIFF_Chunk *chunk, DLS_Wave *wave) -{ - WaveFMT *fmt = (WaveFMT *)chunk->data; - fmt->wFormatTag = SDL_SwapLE16(fmt->wFormatTag); - fmt->wChannels = SDL_SwapLE16(fmt->wChannels); - fmt->dwSamplesPerSec = SDL_SwapLE32(fmt->dwSamplesPerSec); - fmt->dwAvgBytesPerSec = SDL_SwapLE32(fmt->dwAvgBytesPerSec); - fmt->wBlockAlign = SDL_SwapLE16(fmt->wBlockAlign); - fmt->wBitsPerSample = SDL_SwapLE16(fmt->wBitsPerSample); - wave->format = fmt; -} - -static void Parse_data(DLS_Data *data, RIFF_Chunk *chunk, DLS_Wave *wave) -{ - wave->data = chunk->data; - wave->length = chunk->length; -} - -static void Parse_wave(DLS_Data *data, RIFF_Chunk *chunk, DLS_Wave *wave) -{ - for ( chunk = chunk->child; chunk; chunk = chunk->next ) { - Uint32 magic = (chunk->magic == FOURCC_LIST) ? chunk->subtype : chunk->magic; - switch(magic) { - case FOURCC_FMT: - Parse_fmt(data, chunk, wave); - break; - case FOURCC_DATA: - Parse_data(data, chunk, wave); - break; - case FOURCC_WSMP: - Parse_wsmp(data, chunk, &wave->wsmp, &wave->wsmp_loop); - break; - } - } -} - -static void Parse_wvpl(DLS_Data *data, RIFF_Chunk *chunk) -{ - Uint32 wave = 0; - for ( chunk = chunk->child; chunk; chunk = chunk->next ) { - Uint32 magic = (chunk->magic == FOURCC_LIST) ? chunk->subtype : chunk->magic; - switch(magic) { - case FOURCC_wave: - if ( wave < data->ptbl->cCues ) { - Parse_wave(data, chunk, &data->waveList[wave++]); - } - break; - } - } -} - -static void Parse_INFO_DLS(DLS_Data *data, RIFF_Chunk *chunk) -{ - for ( chunk = chunk->child; chunk; chunk = chunk->next ) { - Uint32 magic = (chunk->magic == FOURCC_LIST) ? chunk->subtype : chunk->magic; - switch(magic) { - case FOURCC_IARL: /* Archival Location */ - break; - case FOURCC_IART: /* Artist */ - data->artist = (char *)chunk->data; - break; - case FOURCC_ICMS: /* Commisioned */ - break; - case FOURCC_ICMT: /* Comments */ - data->comments = (char *)chunk->data; - break; - case FOURCC_ICOP: /* Copyright */ - data->copyright = (char *)chunk->data; - break; - case FOURCC_ICRD: /* Creation Date */ - break; - case FOURCC_IENG: /* Engineer */ - break; - case FOURCC_IGNR: /* Genre */ - break; - case FOURCC_IKEY: /* Keywords */ - break; - case FOURCC_IMED: /* Medium */ - break; - case FOURCC_INAM: /* Name */ - data->name = (char *)chunk->data; - break; - case FOURCC_IPRD: /* Product */ - break; - case FOURCC_ISBJ: /* Subject */ - break; - case FOURCC_ISFT: /* Software */ - break; - case FOURCC_ISRC: /* Source */ - break; - case FOURCC_ISRF: /* Source Form */ - break; - case FOURCC_ITCH: /* Technician */ - break; - } - } -} - -DLS_Data *LoadDLS(SDL_RWops *src) -{ - RIFF_Chunk *chunk; - DLS_Data *data = (DLS_Data *)malloc(sizeof(*data)); - if ( !data ) { - SDL_Error(SDL_ENOMEM); - return NULL; - } - memset(data, 0, sizeof(*data)); - - data->chunk = LoadRIFF(src); - if ( !data->chunk ) { - FreeDLS(data); - return NULL; - } - - for ( chunk = data->chunk->child; chunk; chunk = chunk->next ) { - Uint32 magic = (chunk->magic == FOURCC_LIST) ? chunk->subtype : chunk->magic; - switch(magic) { - case FOURCC_COLH: - Parse_colh(data, chunk); - break; - case FOURCC_LINS: - Parse_lins(data, chunk); - break; - case FOURCC_PTBL: - Parse_ptbl(data, chunk); - break; - case FOURCC_WVPL: - Parse_wvpl(data, chunk); - break; - case FOURCC_INFO: - Parse_INFO_DLS(data, chunk); - break; - } - } - return data; -} - -void FreeDLS(DLS_Data *data) -{ - if ( data->chunk ) { - FreeRIFF(data->chunk); - } - FreeInstruments(data); - FreeWaveList(data); - free(data); -} - -#ifdef TEST_MAIN_DLS - -static const char *SourceToString(USHORT usSource) -{ - switch(usSource) { - case CONN_SRC_NONE: - return "NONE"; - case CONN_SRC_LFO: - return "LFO"; - case CONN_SRC_KEYONVELOCITY: - return "KEYONVELOCITY"; - case CONN_SRC_KEYNUMBER: - return "KEYNUMBER"; - case CONN_SRC_EG1: - return "EG1"; - case CONN_SRC_EG2: - return "EG2"; - case CONN_SRC_PITCHWHEEL: - return "PITCHWHEEL"; - case CONN_SRC_CC1: - return "CC1"; - case CONN_SRC_CC7: - return "CC7"; - case CONN_SRC_CC10: - return "CC10"; - case CONN_SRC_CC11: - return "CC11"; - case CONN_SRC_POLYPRESSURE: - return "POLYPRESSURE"; - case CONN_SRC_CHANNELPRESSURE: - return "CHANNELPRESSURE"; - case CONN_SRC_VIBRATO: - return "VIBRATO"; - case CONN_SRC_MONOPRESSURE: - return "MONOPRESSURE"; - case CONN_SRC_CC91: - return "CC91"; - case CONN_SRC_CC93: - return "CC93"; - default: - return "UNKNOWN"; - } -} - -static const char *TransformToString(USHORT usTransform) -{ - switch (usTransform) { - case CONN_TRN_NONE: - return "NONE"; - case CONN_TRN_CONCAVE: - return "CONCAVE"; - case CONN_TRN_CONVEX: - return "CONVEX"; - case CONN_TRN_SWITCH: - return "SWITCH"; - default: - return "UNKNOWN"; - } -} - -static const char *DestinationToString(USHORT usDestination) -{ - switch (usDestination) { - case CONN_DST_NONE: - return "NONE"; - case CONN_DST_ATTENUATION: - return "ATTENUATION"; - case CONN_DST_PITCH: - return "PITCH"; - case CONN_DST_PAN: - return "PAN"; - case CONN_DST_LFO_FREQUENCY: - return "LFO_FREQUENCY"; - case CONN_DST_LFO_STARTDELAY: - return "LFO_STARTDELAY"; - case CONN_DST_EG1_ATTACKTIME: - return "EG1_ATTACKTIME"; - case CONN_DST_EG1_DECAYTIME: - return "EG1_DECAYTIME"; - case CONN_DST_EG1_RELEASETIME: - return "EG1_RELEASETIME"; - case CONN_DST_EG1_SUSTAINLEVEL: - return "EG1_SUSTAINLEVEL"; - case CONN_DST_EG2_ATTACKTIME: - return "EG2_ATTACKTIME"; - case CONN_DST_EG2_DECAYTIME: - return "EG2_DECAYTIME"; - case CONN_DST_EG2_RELEASETIME: - return "EG2_RELEASETIME"; - case CONN_DST_EG2_SUSTAINLEVEL: - return "EG2_SUSTAINLEVEL"; - case CONN_DST_KEYNUMBER: - return "KEYNUMBER"; - case CONN_DST_LEFT: - return "LEFT"; - case CONN_DST_RIGHT: - return "RIGHT"; - case CONN_DST_CENTER: - return "CENTER"; - case CONN_DST_LEFTREAR: - return "LEFTREAR"; - case CONN_DST_RIGHTREAR: - return "RIGHTREAR"; - case CONN_DST_LFE_CHANNEL: - return "LFE_CHANNEL"; - case CONN_DST_CHORUS: - return "CHORUS"; - case CONN_DST_REVERB: - return "REVERB"; - case CONN_DST_VIB_FREQUENCY: - return "VIB_FREQUENCY"; - case CONN_DST_VIB_STARTDELAY: - return "VIB_STARTDELAY"; - case CONN_DST_EG1_DELAYTIME: - return "EG1_DELAYTIME"; - case CONN_DST_EG1_HOLDTIME: - return "EG1_HOLDTIME"; - case CONN_DST_EG1_SHUTDOWNTIME: - return "EG1_SHUTDOWNTIME"; - case CONN_DST_EG2_DELAYTIME: - return "EG2_DELAYTIME"; - case CONN_DST_EG2_HOLDTIME: - return "EG2_HOLDTIME"; - case CONN_DST_FILTER_CUTOFF: - return "FILTER_CUTOFF"; - case CONN_DST_FILTER_Q: - return "FILTER_Q"; - default: - return "UNKOWN"; - } -} - -static void PrintArt(const char *type, CONNECTIONLIST *art, CONNECTION *artList) -{ - Uint32 i; - printf("%s Connections:\n", type); - for ( i = 0; i < art->cConnections; ++i ) { - printf(" Source: %s, Control: %s, Destination: %s, Transform: %s, Scale: %d\n", - SourceToString(artList[i].usSource), - SourceToString(artList[i].usControl), - DestinationToString(artList[i].usDestination), - TransformToString(artList[i].usTransform), - artList[i].lScale); - } -} - -static void PrintWave(DLS_Wave *wave, Uint32 index) -{ - WaveFMT *format = wave->format; - if ( format ) { - printf(" Wave %u: Format: %hu, %hu channels, %u Hz, %hu bits (length = %u)\n", index, format->wFormatTag, format->wChannels, format->dwSamplesPerSec, format->wBitsPerSample, wave->length); - } - if ( wave->wsmp ) { - Uint32 i; - printf(" wsmp->usUnityNote = %hu\n", wave->wsmp->usUnityNote); - printf(" wsmp->sFineTune = %hd\n", wave->wsmp->sFineTune); - printf(" wsmp->lAttenuation = %d\n", wave->wsmp->lAttenuation); - printf(" wsmp->fulOptions = 0x%8.8x\n", wave->wsmp->fulOptions); - printf(" wsmp->cSampleLoops = %u\n", wave->wsmp->cSampleLoops); - for ( i = 0; i < wave->wsmp->cSampleLoops; ++i ) { - WLOOP *loop = &wave->wsmp_loop[i]; - printf(" Loop %u:\n", i); - printf(" ulStart = %u\n", loop->ulStart); - printf(" ulLength = %u\n", loop->ulLength); - } - } -} - -static void PrintRegion(DLS_Region *region, Uint32 index) -{ - printf(" Region %u:\n", index); - if ( region->header ) { - printf(" RangeKey = { %hu - %hu }\n", region->header->RangeKey.usLow, region->header->RangeKey.usHigh); - printf(" RangeVelocity = { %hu - %hu }\n", region->header->RangeVelocity.usLow, region->header->RangeVelocity.usHigh); - printf(" fusOptions = 0x%4.4hx\n", region->header->fusOptions); - printf(" usKeyGroup = %hu\n", region->header->usKeyGroup); - } - if ( region->wlnk ) { - printf(" wlnk->fusOptions = 0x%4.4hx\n", region->wlnk->fusOptions); - printf(" wlnk->usPhaseGroup = %hu\n", region->wlnk->usPhaseGroup); - printf(" wlnk->ulChannel = %u\n", region->wlnk->ulChannel); - printf(" wlnk->ulTableIndex = %u\n", region->wlnk->ulTableIndex); - } - if ( region->wsmp ) { - Uint32 i; - printf(" wsmp->usUnityNote = %hu\n", region->wsmp->usUnityNote); - printf(" wsmp->sFineTune = %hd\n", region->wsmp->sFineTune); - printf(" wsmp->lAttenuation = %d\n", region->wsmp->lAttenuation); - printf(" wsmp->fulOptions = 0x%8.8x\n", region->wsmp->fulOptions); - printf(" wsmp->cSampleLoops = %u\n", region->wsmp->cSampleLoops); - for ( i = 0; i < region->wsmp->cSampleLoops; ++i ) { - WLOOP *loop = ®ion->wsmp_loop[i]; - printf(" Loop %u:\n", i); - printf(" ulStart = %u\n", loop->ulStart); - printf(" ulLength = %u\n", loop->ulLength); - } - } - if ( region->art && region->art->cConnections > 0 ) { - PrintArt("Region", region->art, region->artList); - } -} - -static void PrintInstrument(DLS_Instrument *instrument, Uint32 index) -{ - printf("Instrument %u:\n", index); - if ( instrument->name ) { - printf(" Name: %s\n", instrument->name); - } - if ( instrument->header ) { - Uint32 i; - printf(" ulBank = 0x%8.8x\n", instrument->header->Locale.ulBank); - printf(" ulInstrument = %u\n", instrument->header->Locale.ulInstrument); - printf(" Regions: %u\n", instrument->header->cRegions); - for ( i = 0; i < instrument->header->cRegions; ++i ) { - PrintRegion(&instrument->regions[i], i); - } - } - if ( instrument->art && instrument->art->cConnections > 0 ) { - PrintArt("Instrument", instrument->art, instrument->artList); - } -}; - -void PrintDLS(DLS_Data *data) -{ - printf("DLS Data:\n"); - printf("cInstruments = %u\n", data->cInstruments); - if ( data->instruments ) { - Uint32 i; - for ( i = 0; i < data->cInstruments; ++i ) { - PrintInstrument(&data->instruments[i], i); - } - } - if ( data->ptbl && data->ptbl->cCues > 0 ) { - Uint32 i; - printf("Cues: "); - for ( i = 0; i < data->ptbl->cCues; ++i ) { - if ( i > 0 ) { - printf(", "); - } - printf("%u", data->ptblList[i].ulOffset); - } - printf("\n"); - } - if ( data->waveList ) { - Uint32 i; - printf("Waves:\n"); - for ( i = 0; i < data->ptbl->cCues; ++i ) { - PrintWave(&data->waveList[i], i); - } - } - if ( data->name ) { - printf("Name: %s\n", data->name); - } - if ( data->artist ) { - printf("Artist: %s\n", data->artist); - } - if ( data->copyright ) { - printf("Copyright: %s\n", data->copyright); - } - if ( data->comments ) { - printf("Comments: %s\n", data->comments); - } -} - -main(int argc, char *argv[]) -{ - int i; - for ( i = 1; i < argc; ++i ) { - DLS_Data *data; - SDL_RWops *src = SDL_RWFromFile(argv[i], "rb"); - if ( !src ) { - fprintf(stderr, "Couldn't open %s: %s", argv[i], SDL_GetError()); - continue; - } - data = LoadDLS(src); - if ( data ) { - PrintRIFF(data->chunk, 0); - PrintDLS(data); - FreeDLS(data); - } else { - fprintf(stderr, "Couldn't load %s: %s\n", argv[i], SDL_GetError()); - } - SDL_RWclose(src); - } -} - -#endif // TEST_MAIN -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*-------------------------------------------------------------------------*/ -/* * * * * * * * * * * * * * * * * instrum_dls.c * * * * * * * * * * * * * */ -/*-------------------------------------------------------------------------*/ - -DLS_Data *Timidity_LoadDLS(SDL_RWops *src) -{ - DLS_Data *patches = LoadDLS(src); - if (!patches) { - SNDDBG(("%s", SDL_GetError())); - } - return patches; -} - -void Timidity_FreeDLS(DLS_Data *patches) -{ - FreeDLS(patches); -} - -/* convert timecents to sec */ -static double to_msec(int timecent) -{ - if (timecent == 0x80000000 || timecent == 0) - return 0.0; - return 1000.0 * pow(2.0, (double)(timecent / 65536) / 1200.0); -} - -/* convert decipercent to {0..1} */ -static double to_normalized_percent(int decipercent) -{ - return ((double)(decipercent / 65536)) / 1000.0; -} - -/* convert from 8bit value to fractional offset (15.15) */ -static Sint32 to_offset(int offset) -{ - return (Sint32)offset << (7+15); -} - -/* calculate ramp rate in fractional unit; - * diff = 8bit, time = msec - */ -static Sint32 calc_rate(MidiSong *song, int diff, int sample_rate, double msec) -{ - double rate; - - if(msec < 6) - msec = 6; - if(diff == 0) - diff = 255; - diff <<= (7+15); - rate = ((double)diff / song->rate) * song->control_ratio * 1000.0 / msec; - return (Sint32)rate; -} - -static int load_connection(ULONG cConnections, CONNECTION *artList, USHORT destination) -{ - ULONG i; - int value = 0; - for (i = 0; i < cConnections; ++i) { - CONNECTION *conn = &artList[i]; - if(conn->usDestination == destination) { - // The formula for the destination is: - // usDestination = usDestination + usTransform(usSource * (usControl * lScale)) - // Since we are only handling source/control of NONE and identity - // transform, this simplifies to: usDestination = usDestination + lScale - if (conn->usSource == CONN_SRC_NONE && - conn->usControl == CONN_SRC_NONE && - conn->usTransform == CONN_TRN_NONE) - value += conn->lScale; - } - } - return value; -} - -static void load_region_dls(MidiSong *song, Sample *sample, DLS_Instrument *ins, Uint32 index) -{ - DLS_Region *rgn = &ins->regions[index]; - DLS_Wave *wave = &song->patches->waveList[rgn->wlnk->ulTableIndex]; - - sample->low_freq = freq_table[rgn->header->RangeKey.usLow]; - sample->high_freq = freq_table[rgn->header->RangeKey.usHigh]; - sample->root_freq = freq_table[rgn->wsmp->usUnityNote]; - sample->low_vel = rgn->header->RangeVelocity.usLow; - sample->high_vel = rgn->header->RangeVelocity.usHigh; - - sample->modes = MODES_16BIT; - sample->sample_rate = wave->format->dwSamplesPerSec; - sample->data_length = wave->length / 2; - sample->data = (sample_t *)safe_malloc(wave->length); - memcpy(sample->data, wave->data, wave->length); - if (rgn->wsmp->cSampleLoops) { - sample->modes |= (MODES_LOOPING|MODES_SUSTAIN); - sample->loop_start = rgn->wsmp_loop->ulStart / 2; - sample->loop_end = sample->loop_start + (rgn->wsmp_loop->ulLength / 2); - } - sample->volume = 1.0f; - - if (sample->modes & MODES_SUSTAIN) { - int value; - double attack, hold, decay, release; int sustain; - CONNECTIONLIST *art = NULL; - CONNECTION *artList = NULL; - - if (ins->art && ins->art->cConnections > 0 && ins->artList) { - art = ins->art; - artList = ins->artList; - } else { - art = rgn->art; - artList = rgn->artList; - } - - value = load_connection(art->cConnections, artList, CONN_DST_EG1_ATTACKTIME); - attack = to_msec(value); - value = load_connection(art->cConnections, artList, CONN_DST_EG1_HOLDTIME); - hold = to_msec(value); - value = load_connection(art->cConnections, artList, CONN_DST_EG1_DECAYTIME); - decay = to_msec(value); - value = load_connection(art->cConnections, artList, CONN_DST_EG1_RELEASETIME); - release = to_msec(value); - value = load_connection(art->cConnections, artList, CONN_DST_EG1_SUSTAINLEVEL); - sustain = (int)((1.0 - to_normalized_percent(value)) * 250.0); - value = load_connection(art->cConnections, artList, CONN_DST_PAN); - sample->panning = (int)((0.5 + to_normalized_percent(value)) * 127.0); - -/* -printf("%d, Rate=%d LV=%d HV=%d Low=%d Hi=%d Root=%d Pan=%d Attack=%f Hold=%f Sustain=%d Decay=%f Release=%f\n", index, sample->sample_rate, rgn->header->RangeVelocity.usLow, rgn->header->RangeVelocity.usHigh, sample->low_freq, sample->high_freq, sample->root_freq, sample->panning, attack, hold, sustain, decay, release); -*/ - - sample->envelope_offset[0] = to_offset(255); - sample->envelope_rate[0] = calc_rate(song, 255, sample->sample_rate, attack); - - sample->envelope_offset[1] = to_offset(250); - sample->envelope_rate[1] = calc_rate(song, 5, sample->sample_rate, hold); - - sample->envelope_offset[2] = to_offset(sustain); - sample->envelope_rate[2] = calc_rate(song, 255 - sustain, sample->sample_rate, decay); - - sample->envelope_offset[3] = to_offset(0); - sample->envelope_rate[3] = calc_rate(song, 5 + sustain, sample->sample_rate, release); - - sample->envelope_offset[4] = to_offset(0); - sample->envelope_rate[4] = to_offset(1); - - sample->envelope_offset[5] = to_offset(0); - sample->envelope_rate[5] = to_offset(1); - - sample->modes |= MODES_ENVELOPE; - } - - sample->data_length <<= FRACTION_BITS; - sample->loop_start <<= FRACTION_BITS; - sample->loop_end <<= FRACTION_BITS; -} - -Instrument *load_instrument_dls(MidiSong *song, int drum, int bank, int instrument) -{ - Instrument *inst; - Uint32 i; - DLS_Instrument *dls_ins; - - if (!song->patches) - return(NULL); - - drum = drum ? 0x80000000 : 0; - for (i = 0; i < song->patches->cInstruments; ++i) { - dls_ins = &song->patches->instruments[i]; - if ((dls_ins->header->Locale.ulBank & 0x80000000) == drum && - ((dls_ins->header->Locale.ulBank >> 8) & 0xFF) == bank && - dls_ins->header->Locale.ulInstrument == instrument) - break; - } - if (i == song->patches->cInstruments && !bank) { - for (i = 0; i < song->patches->cInstruments; ++i) { - dls_ins = &song->patches->instruments[i]; - if ((dls_ins->header->Locale.ulBank & 0x80000000) == drum && - dls_ins->header->Locale.ulInstrument == instrument) - break; - } - } - if (i == song->patches->cInstruments) { - SNDDBG(("Couldn't find %s instrument %d in bank %d\n", drum ? "drum" : "melodic", instrument, bank)); - return(NULL); - } - - inst = (Instrument *)safe_malloc(sizeof(*inst)); - inst->samples = dls_ins->header->cRegions; - inst->sample = (Sample *)safe_malloc(inst->samples * sizeof(*inst->sample)); - memset(inst->sample, 0, inst->samples * sizeof(*inst->sample)); -/* -printf("Found %s instrument %d in bank %d named %s with %d regions\n", drum ? "drum" : "melodic", instrument, bank, dls_ins->name, inst->samples); -*/ - for (i = 0; i < dls_ins->header->cRegions; ++i) { - load_region_dls(song, &inst->sample[i], dls_ins, i); - } - return(inst); -} diff --git a/timidity/instrum_dls.h b/timidity/instrum_dls.h deleted file mode 100644 index 2fb1fe9c..00000000 --- a/timidity/instrum_dls.h +++ /dev/null @@ -1,13 +0,0 @@ -/* - - TiMidity -- Experimental MIDI to WAVE converter - Copyright (C) 1995 Tuukka Toivonen - - This program is free software; you can redistribute it and/or modify - it under the terms of the Perl Artistic License, available in COPYING. - - instrum.h - - */ - -extern Instrument *load_instrument_dls(MidiSong *song, int drum, int bank, int instrument); diff --git a/timidity/playmidi.c b/timidity/playmidi.c index d16f34b6..ac1a8218 100644 --- a/timidity/playmidi.c +++ b/timidity/playmidi.c @@ -83,8 +83,7 @@ static void select_sample(MidiSong *song, int v, Instrument *ip, int vel) f=song->voice[v].orig_frequency; for (i=0; ilow_vel <= vel && sp->high_vel >= vel && - sp->low_freq <= f && sp->high_freq >= f) + if (sp->low_freq <= f && sp->high_freq >= f) { song->voice[v].sample=sp; return; diff --git a/timidity/timidity.c b/timidity/timidity.c index 104e3d62..e8487172 100644 --- a/timidity/timidity.c +++ b/timidity/timidity.c @@ -452,7 +452,7 @@ int Timidity_Init() return 0; } -MidiSong *Timidity_LoadDLSSong(SDL_RWops *rw, DLS_Patches *patches, SDL_AudioSpec *audio) +MidiSong *Timidity_LoadSong(SDL_RWops *rw, SDL_AudioSpec *audio) { MidiSong *song; int i; @@ -463,7 +463,6 @@ MidiSong *Timidity_LoadDLSSong(SDL_RWops *rw, DLS_Patches *patches, SDL_AudioSpe /* Allocate memory for the song */ song = (MidiSong *)safe_malloc(sizeof(*song)); memset(song, 0, sizeof(*song)); - song->patches = patches; for (i = 0; i < MAXBANK; i++) { @@ -554,11 +553,6 @@ MidiSong *Timidity_LoadDLSSong(SDL_RWops *rw, DLS_Patches *patches, SDL_AudioSpe return(song); } -MidiSong *Timidity_LoadSong(SDL_RWops *rw, SDL_AudioSpec *audio) -{ - return Timidity_LoadDLSSong(rw, NULL, audio); -} - void Timidity_FreeSong(MidiSong *song) { int i; diff --git a/timidity/timidity.h b/timidity/timidity.h index adb03498..0a9c57de 100644 --- a/timidity/timidity.h +++ b/timidity/timidity.h @@ -28,7 +28,7 @@ typedef Sint32 final_volume_t; typedef struct { Sint32 loop_start, loop_end, data_length, - sample_rate, low_vel, high_vel, low_freq, high_freq, root_freq; + sample_rate, low_freq, high_freq, root_freq; Sint32 envelope_rate[6], envelope_offset[6]; float @@ -105,9 +105,6 @@ typedef struct { void *next; } MidiEventList; -struct _DLS_Data; -typedef struct _DLS_Data DLS_Patches; - typedef struct { int playing; SDL_RWops *rw; @@ -115,7 +112,6 @@ typedef struct { Sint32 encoding; float master_volume; Sint32 amplification; - DLS_Patches *patches; ToneBank *tonebank[MAXBANK]; ToneBank *drumset[MAXBANK]; Instrument *default_instrument; @@ -154,9 +150,6 @@ extern int Timidity_Init(void); extern int Timidity_Init_NoConfig(void); extern void Timidity_SetVolume(MidiSong *song, int volume); extern int Timidity_PlaySome(MidiSong *song, void *stream, Sint32 len); -extern DLS_Patches *Timidity_LoadDLS(SDL_RWops *rw); -extern void Timidity_FreeDLS(DLS_Patches *patches); -extern MidiSong *Timidity_LoadDLSSong(SDL_RWops *rw, DLS_Patches *patches, SDL_AudioSpec *audio); extern MidiSong *Timidity_LoadSong(SDL_RWops *rw, SDL_AudioSpec *audio); extern void Timidity_Start(MidiSong *song); extern void Timidity_Seek(MidiSong *song, Uint32 ms);