From a8283ffdd67976be6a5e177b34341693d55513c5 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 20 Feb 2018 20:50:01 +0100 Subject: [PATCH] - something can be heard. This doesn't pipe the audio through OpenAL yet but the fundamentals for further progress are done. --- .../music_timiditypp_mididevice.cpp | 74 +++++++++++++++---- src/sound/timiditypp/common.cpp | 11 ++- src/sound/timiditypp/configfile.cpp | 2 + src/sound/timiditypp/controls.h | 21 +----- src/sound/timiditypp/instrum.cpp | 8 +- src/sound/timiditypp/playmidi.cpp | 6 +- src/sound/timiditypp/readmidi.cpp | 2 +- src/sound/timiditypp/sysdep.h | 13 ---- 8 files changed, 73 insertions(+), 64 deletions(-) diff --git a/src/sound/mididevices/music_timiditypp_mididevice.cpp b/src/sound/mididevices/music_timiditypp_mididevice.cpp index b744e9652..c1a5c2a21 100644 --- a/src/sound/mididevices/music_timiditypp_mididevice.cpp +++ b/src/sound/mididevices/music_timiditypp_mididevice.cpp @@ -44,11 +44,15 @@ #include "version.h" #include "tmpfileplus.h" #include "m_misc.h" +#include "v_text.h" + +#include "timiditypp/timidity.h" +#include "timiditypp/instrum.h" class TimidityPPMIDIDevice : public SoftSynthMIDIDevice { TArray midi; - FString CurrentConfig; + static TimidityPlus::Instruments *instruments; public: TimidityPPMIDIDevice(const char *args); ~TimidityPPMIDIDevice(); @@ -67,9 +71,10 @@ protected: void HandleLongEvent(const uint8_t *data, int len); void ComputeOutput(float *buffer, int len); }; +TimidityPlus::Instruments *TimidityPPMIDIDevice::instruments; // Config file to use -CVAR(String, timidity_config, "", CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +CVAR(String, timidity_config, "timidity.cfg", CVAR_ARCHIVE | CVAR_GLOBALCONFIG) // added because Timidity's output is rather loud. CUSTOM_CVAR (Float, timidity_mastervolume, 1.0f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) @@ -101,14 +106,19 @@ TimidityPPMIDIDevice::TimidityPPMIDIDevice(const char *args) { if (args == NULL || *args == 0) args = timidity_config; - if (CurrentConfig.CompareNoCase(args) != 0) + if (instruments != nullptr && !instruments->checkConfig(args)) { - // reload instruments - // if (!reload_inst()) CurrentConfig = ""; + delete instruments; } - if (CurrentConfig.IsNotEmpty()) + instruments = new TimidityPlus::Instruments; + if (!instruments->load(args)) { - //Renderer = new TimidityPlus::Player(timidity_frequency, args); + delete instruments; + instruments = nullptr; + } + if (instruments != nullptr) + { + //Renderer = new TimidityPlus::Player(timidity_frequency, instruments); } } @@ -136,11 +146,19 @@ TimidityPPMIDIDevice::~TimidityPPMIDIDevice () // //========================================================================== +namespace TimidityPlus +{ + int load_midi_file(FileReader *fr, TimidityPlus::Instruments *inst); + void run_midi(int samples); + void timidity_close(); +} + bool TimidityPPMIDIDevice::Preprocess(MIDIStreamer *song, bool looping) { // Write MIDI song to temporary file song->CreateSMF(midi, looping ? 0 : 1); - return midi.Size() > 0; + MemoryReader fr((char*)&midi[0], midi.Size()); + return !TimidityPlus::load_midi_file(&fr, instruments); } //========================================================================== @@ -148,21 +166,16 @@ bool TimidityPPMIDIDevice::Preprocess(MIDIStreamer *song, bool looping) // TimidityPPMIDIDevice :: Open // //========================================================================== -namespace TimidityPlus -{ - int load_midi_file(FileReader *fr); - void run_midi(int samples); - void timidity_close(); -} int TimidityPPMIDIDevice::Open(MidiCallback callback, void *userdata) { + // No instruments loaded means we cannot play... + if (instruments == nullptr) return 0; + int ret = OpenStream(2, 0, callback, userdata); if (ret == 0) { //Renderer->Reset(); - MemoryReader fr((char*)&midi[0], midi.Size()); - return !TimidityPlus::load_midi_file(&fr); } return ret; } @@ -217,8 +230,10 @@ void TimidityPPMIDIDevice::HandleLongEvent(const uint8_t *data, int len) void TimidityPPMIDIDevice::ComputeOutput(float *buffer, int len) { + Printf("Committing slice\n"); TimidityPlus::run_midi(len / 8); // bytes to samples memset(buffer, len, 0); // to do + Printf("Done\n"); //Renderer->ComputeOutput(buffer, len); } @@ -242,3 +257,30 @@ MIDIDevice *CreateTimidityPPMIDIDevice(const char *args) { return new TimidityPPMIDIDevice(args); } + + +void TimidityPlus::ctl_cmsg(int type, int verbosity_level, const char *fmt, ...) +{ + if (verbosity_level >= VERB_DEBUG) return; // Don't waste time on diagnostics. + + va_list args; + va_start(args, fmt); + FString msg; + msg.VFormat(fmt, args); + va_end(args); + + switch (type) + { + case CMSG_ERROR: + Printf(TEXTCOLOR_RED "%s\n", msg.GetChars()); + break; + + case CMSG_WARNING: + Printf(TEXTCOLOR_YELLOW "%s\n", msg.GetChars()); + break; + + case CMSG_INFO: + DPrintf(DMSG_SPAMMY, "%s\n", msg.GetChars()); + break; + } +} \ No newline at end of file diff --git a/src/sound/timiditypp/common.cpp b/src/sound/timiditypp/common.cpp index 5345dcd1d..90bd184ef 100644 --- a/src/sound/timiditypp/common.cpp +++ b/src/sound/timiditypp/common.cpp @@ -134,7 +134,6 @@ double flt_rand() PathList::PathList() { - paths.push_back("./"); } /* This adds a directory to the path list */ @@ -234,9 +233,11 @@ std::pair PathList::openFile(const char *name, bool i s += '/'; } s += name; - auto fr = tryOpenPath(name, ismainfile); + auto fr = tryOpenPath(s.c_str(), ismainfile); if (fr!= nullptr) return std::make_pair(fr, s); } + auto fr = tryOpenPath(name, ismainfile); + if (fr != nullptr) return std::make_pair(fr, name); } else { @@ -254,13 +255,11 @@ std::pair PathList::openFile(const char *name, bool i int PathList::isAbsPath(const char *name) { - if (name[0] == '/') - return 1; + if (name[0] == '/') return 1; #ifdef _WIN32 /* [A-Za-z]: (for Windows) */ - if (isalpha(name[0]) && name[1] == ':') - return 1; + if (isalpha(name[0]) && name[1] == ':') return 1; #endif /* _WIN32 */ return 0; } diff --git a/src/sound/timiditypp/configfile.cpp b/src/sound/timiditypp/configfile.cpp index 043aaca43..20c2b5c8b 100644 --- a/src/sound/timiditypp/configfile.cpp +++ b/src/sound/timiditypp/configfile.cpp @@ -29,6 +29,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "common.h" #include "instrum.h" #include "quantity.h" +#include "cmdlib.h" @@ -646,6 +647,7 @@ int Instruments::read_config_file(const char *name, int self, int allow_missing_ if (!self) { basedir = strdup_mblock(&varbuf, tf->filename.c_str()); + FixPathSeperator((char*)basedir); sep = (char*)strrchr(basedir, '/'); } else diff --git a/src/sound/timiditypp/controls.h b/src/sound/timiditypp/controls.h index 180d924f9..d82f0a0ba 100644 --- a/src/sound/timiditypp/controls.h +++ b/src/sound/timiditypp/controls.h @@ -51,27 +51,8 @@ inline bool RC_IS_SKIP_FILE(int rc) return ((rc) == RC_QUIT || (rc) == RC_ERROR || (rc) == RC_STOP || (rc) == RC_TUNE_END); } -inline void ctl_cmsg(int type, int verbosity_level, const char *fmt, ...) -{ - /* todo: - CMSG_ERROR: I_Error(...) - CMSG_WARNING, VERB_NORMAL: Printf(TEXTCOLOR_YELLOW - CMSG_WARNING, VERB_VERBOSE: DPrintf(DMSG_SPAMMY - - CMSG_INFO, VERB_DEBUG/VERB_NOISY: ignore - -/* -#ifdef _WIN32 - char buf[1024]; - va_list args; - va_start(args, fmt); - vsprintf(buf, fmt, args); - va_end(args); - I_DebugPrint(buf); -#endif -*/ -} +void ctl_cmsg(int type, int verbosity_level, const char *fmt, ...); } diff --git a/src/sound/timiditypp/instrum.cpp b/src/sound/timiditypp/instrum.cpp index 41652323a..ca9a08fbe 100644 --- a/src/sound/timiditypp/instrum.cpp +++ b/src/sound/timiditypp/instrum.cpp @@ -54,7 +54,7 @@ Instruments::Instruments() bool Instruments::load(const char *config) { - if (read_config_file(config, 0, 0, true)) + if (read_config_file(config, 0, 0, true) == RC_OK) { init_load_soundfont(); set_default_instrument(); @@ -617,13 +617,10 @@ Instrument *Instruments::load_gus_instrument(char *name, ToneBank *bank, int dr, } /* Open patch file */ if (!(tf = open_file(name, false, pathlist))) { -#ifdef PATCH_EXT_LIST int name_len, ext_len; - static const char *patch_ext[] = PATCH_EXT_LIST; -#endif + static const char *patch_ext[] = { ".pat", 0 }; noluck = 1; -#ifdef PATCH_EXT_LIST name_len = (int)strlen(name); /* Try with various extensions */ for (i = 0; patch_ext[i]; i++) { @@ -641,7 +638,6 @@ Instrument *Instruments::load_gus_instrument(char *name, ToneBank *bank, int dr, } } } -#endif } if (noluck) { ctl_cmsg(CMSG_ERROR, VERB_NORMAL, diff --git a/src/sound/timiditypp/playmidi.cpp b/src/sound/timiditypp/playmidi.cpp index a846cee1d..dc4633047 100644 --- a/src/sound/timiditypp/playmidi.cpp +++ b/src/sound/timiditypp/playmidi.cpp @@ -1855,6 +1855,7 @@ void Player::finish_note(int i) void Player::set_envelope_time(int ch, int val, int stage) { val = val & 0x7F; +#if 0 switch(stage) { case EG_ATTACK: /* Attack */ //ctl_cmsg(CMSG_INFO,VERB_NOISY,"Attack Time (CH:%d VALUE:%d)", ch, val); @@ -1868,6 +1869,7 @@ void Player::set_envelope_time(int ch, int val, int stage) default: //ctl_cmsg(CMSG_INFO,VERB_NOISY,"? Time (CH:%d VALUE:%d)", ch, val); } +#endif channel[ch].envelope_rate[stage] = val; } @@ -3382,8 +3384,8 @@ void Player::process_sysex_event(int ev, int ch, int val, int b) case 0x23: /* Insertion Effect ON/OFF */ if(!opt_insertion_effect) {break;} if(channel[ch].insertion_effect != val) { - if(val) {//ctl_cmsg(CMSG_INFO,VERB_NOISY,"EFX ON (CH:%d)",ch);} - else {//ctl_cmsg(CMSG_INFO,VERB_NOISY,"EFX OFF (CH:%d)",ch);} + //if(val) {//ctl_cmsg(CMSG_INFO,VERB_NOISY,"EFX ON (CH:%d)",ch);} + //else {//ctl_cmsg(CMSG_INFO,VERB_NOISY,"EFX OFF (CH:%d)",ch);} } channel[ch].insertion_effect = val; break; diff --git a/src/sound/timiditypp/readmidi.cpp b/src/sound/timiditypp/readmidi.cpp index 8a931b8be..4e9bd77ad 100644 --- a/src/sound/timiditypp/readmidi.cpp +++ b/src/sound/timiditypp/readmidi.cpp @@ -1562,7 +1562,7 @@ int load_midi_file(FileReader *fr, TimidityPlus::Instruments *inst) void Player::run_midi(int samples) { auto time = current_event->time + samples; - while (current_event->time < samples) + while (current_event->time < time) { if (play_event(current_event) != RC_OK) return; diff --git a/src/sound/timiditypp/sysdep.h b/src/sound/timiditypp/sysdep.h index e948c8bdb..7ecd63dda 100644 --- a/src/sound/timiditypp/sysdep.h +++ b/src/sound/timiditypp/sysdep.h @@ -71,19 +71,6 @@ typedef struct _ChannelBitMask # define TIM_FSCALENEG(a,b) ((a) * (1.0 / (double)(1<<(b)))) -#ifdef _WIN32 -#undef PATCH_EXT_LIST -#define PATCH_EXT_LIST { ".pat", 0 } - -#endif - - -#define PATH_SEP '/' -#define PATH_STRING "/" -#define IS_PATH_SEP(c) ((c) == PATH_SEP) -#define NLS "\n" - - #ifndef M_PI #define M_PI 3.14159265358979323846 #endif /* M_PI */