diff options
Diffstat (limited to 'muse2/synti/simpledrums2')
| -rw-r--r-- | muse2/synti/simpledrums2/common.h | 5 | ||||
| -rw-r--r-- | muse2/synti/simpledrums2/common_defs.h | 8 | ||||
| -rw-r--r-- | muse2/synti/simpledrums2/simpledrums.cpp | 319 | ||||
| -rw-r--r-- | muse2/synti/simpledrums2/simpledrums.h | 12 | ||||
| -rw-r--r-- | muse2/synti/simpledrums2/simpledrumsgui.cpp | 202 | ||||
| -rw-r--r-- | muse2/synti/simpledrums2/simpledrumsgui.h | 43 | ||||
| -rw-r--r-- | muse2/synti/simpledrums2/ssplugin.cpp | 1 | ||||
| -rw-r--r-- | muse2/synti/simpledrums2/ssplugin.h | 1 | ||||
| -rw-r--r-- | muse2/synti/simpledrums2/ssplugingui.cpp | 33 | ||||
| -rw-r--r-- | muse2/synti/simpledrums2/ssplugingui.h | 19 | 
10 files changed, 495 insertions, 148 deletions
| diff --git a/muse2/synti/simpledrums2/common.h b/muse2/synti/simpledrums2/common.h index e4763540..f31ca7ce 100644 --- a/muse2/synti/simpledrums2/common.h +++ b/muse2/synti/simpledrums2/common.h @@ -16,11 +16,11 @@  #define SS_VERSIONSTRING "1.0" -#define SS_DEBUG        0 +#define SS_DEBUG        0     #define SS_DEBUG_INIT   0  #define SS_TRACE_FUNC   0  #define SS_DEBUG_MIDI   0 -#define SS_DEBUG_LADSPA 0 +#define SS_DEBUG_LADSPA 0     #define SS_DEBUG_STATE  0  #define SS_DBG(string) if (SS_DEBUG) fprintf(stderr, "%s:%d:%s: %s\n", __FILE__ , __LINE__ , __PRETTY_FUNCTION__, string); @@ -34,6 +34,7 @@  #define SS_DBG_LADSPA2(string1, string2) if (SS_DEBUG_LADSPA) fprintf(stderr, "%s:%d:%s: %s: %s\n", __FILE__ , __LINE__ , __PRETTY_FUNCTION__, string1, string2);  #define SS_SYSEX_INIT_DATA_VERSION           1 +#define SS_SYSEX_EFFECT_INIT_DATA_VERSION    2   // Added Jun 15 2011. Original value was SS_SYSEX_INIT_DATA_VERSION (1). p4.0.27 Tim.   #define SS_NR_OF_CHANNELS                   16  #define SS_AUDIO_CHANNELS                    2 diff --git a/muse2/synti/simpledrums2/common_defs.h b/muse2/synti/simpledrums2/common_defs.h new file mode 100644 index 00000000..b3745a1d --- /dev/null +++ b/muse2/synti/simpledrums2/common_defs.h @@ -0,0 +1,8 @@ +#ifndef __SIMPLEDRUMS_UNIQUE_ID_H +#define __SIMPLEDRUMS_UNIQUE_ID_H + +// Make sure this number is unique among all the MESS synths. +#define SIMPLEDRUMS_UNIQUE_ID      4 + +#endif + diff --git a/muse2/synti/simpledrums2/simpledrums.cpp b/muse2/synti/simpledrums2/simpledrums.cpp index f14a0627..80f61102 100644 --- a/muse2/synti/simpledrums2/simpledrums.cpp +++ b/muse2/synti/simpledrums2/simpledrums.cpp @@ -5,6 +5,7 @@  //  //  // Author: Mathias Lundgren <lunar_shuttle@users.sf.net>, (C) 2004 +//  Contributer: (C) Copyright 2011 Tim E. Real (terminator356 at users.sourceforge.net)  //  // Copyright: See COPYING file that comes with this distribution  // @@ -14,6 +15,7 @@  #include "muse/midi.h"  //#include "libsynti/mpevent.h"  #include "muse/mpevent.h"    +//#include "common_defs.h"  #include "simpledrums.h"  #include <samplerate.h> @@ -82,6 +84,9 @@ SimpleSynth::SimpleSynth(int sr)        SS_samplerate = sr;        SS_initPlugins(); +      initBuffer  = 0; +      initLen     = 0; +              simplesynth_ptr = this;        master_vol = 100.0 / SS_MASTER_VOLUME_QUOT;        master_vol_ctrlval = 100; @@ -203,6 +208,9 @@ SimpleSynth::~SimpleSynth()        {        SS_TRACE_IN +      if(gui)         +        delete gui;  // p4.0.27 +                // Cleanup channels and samples:        SS_DBG("Cleaning up sample data");        for (int i=0; i<SS_NR_OF_CHANNELS; i++) { @@ -233,9 +241,21 @@ SimpleSynth::~SimpleSynth()        SS_DBG("Deleting process buffer");        delete[] processBuffer[0];        delete[] processBuffer[1]; +      if (initBuffer) +      { +            SS_DBG("Deleting init buffer"); +            delete [] initBuffer; +      }              SS_TRACE_OUT        } +int SimpleSynth::oldMidiStateHeader(const unsigned char** data) const  +{ +  unsigned char const d[2] = {MUSE_SYNTH_SYSEX_MFG_ID, SIMPLEDRUMS_UNIQUE_ID}; +  *data = &d[0]; +  return 2;  +} +          //---------------------------------------------------------  //   nativeGuiVisible  /*! @@ -299,7 +319,8 @@ bool SimpleSynth::playNote(int /*channel*/, int pitch, int velo)                    }              else {                    //Note off: -                  if (channels[ch].noteoff_ignore) { +                  ///if (channels[ch].noteoff_ignore) { +                  if (!channels[ch].noteoff_ignore) {     // p4.0.27                          if (SS_DEBUG_MIDI) {                                printf("Note off on channel %d\n", ch);                                } @@ -497,8 +518,17 @@ bool SimpleSynth::setController(int channel, int id, int val, bool /*fromGui*/)      \return false for ok, true for not ok  */  //--------------------------------------------------------- -bool SimpleSynth::sysex(int /*len*/, const unsigned char* data) +bool SimpleSynth::sysex(int len, const unsigned char* d) +      { +      if(len < 3 || d[0] != MUSE_SYNTH_SYSEX_MFG_ID  +          || d[1] != SIMPLEDRUMS_UNIQUE_ID)         { +        if (SS_DEBUG_MIDI) +          printf("MusE SimpleDrums: Unknown sysex header\n"); +        return false; +      } +       +      const unsigned char* data = d + 2;        SS_TRACE_IN        int cmd = data[0];        switch (cmd) { @@ -565,20 +595,23 @@ bool SimpleSynth::sysex(int /*len*/, const unsigned char* data)                    {                    int initdata_len = 0;                    const byte* tmp_initdata = NULL; -                  byte* event_data = NULL; +                  ///byte* event_data = NULL;                    getInitData(&initdata_len, &tmp_initdata); -                  int totlen = initdata_len + 1; - -                  event_data = new byte[initdata_len + 1]; -                  event_data[0] = SS_SYSEX_SEND_INIT_DATA; -                  memcpy(event_data + 1, tmp_initdata, initdata_len); -                  delete[] tmp_initdata; -                  tmp_initdata = NULL; - -                  MidiPlayEvent ev(0, 0, ME_SYSEX, event_data, totlen); +                  ///int totlen = initdata_len + 1; + +                  ///event_data = new byte[initdata_len + 1]; +                  ///event_data[0] = SS_SYSEX_SEND_INIT_DATA; +                  *((byte*)(tmp_initdata) + 1) = SS_SYSEX_SEND_INIT_DATA;    // Re-use the synth ID byte as the command byte. +                   +                  ///memcpy(event_data + 1, tmp_initdata, initdata_len); +                  ///delete[] tmp_initdata; +                  ///tmp_initdata = NULL; + +                  ///MidiPlayEvent ev(0, 0, ME_SYSEX, event_data, totlen); +                  MidiPlayEvent ev(0, 0, ME_SYSEX, tmp_initdata + 1, initdata_len - 1);  // Strip MFG ID.                    gui->writeEvent(ev); -                  delete[] event_data; +                  ///delete[] event_data;                    break;                    } @@ -639,7 +672,7 @@ const MidiPatch* SimpleSynth::getPatchInfo(int index, const MidiPatch* patch) co      \return 0 when done, otherwise return next desired controller index   */  //--------------------------------------------------------- -int SimpleSynth::getControllerInfo(int index, const char** name, int* controller, int* min, int* max) +int SimpleSynth::getControllerInfo(int index, const char** name, int* controller, int* min, int* max, int* initval) const        {        SS_TRACE_IN        if (index >= SS_NR_OF_CONTROLLERS) { @@ -652,7 +685,9 @@ int SimpleSynth::getControllerInfo(int index, const char** name, int* controller        *min = controllers[index].min;        *max = controllers[index].max; -      if (SS_DEBUG_MIDI) { +      *initval = 0;                // p4.0.27 FIXME NOTE TODO     +       +      if (SS_DEBUG_MIDI) {                 printf("setting controller info: index %d name %s controller %d min %d max %d\n", index, *name, *controller, *min, *max);              }        SS_TRACE_OUT @@ -660,6 +695,31 @@ int SimpleSynth::getControllerInfo(int index, const char** name, int* controller        }  //--------------------------------------------------------- +//   processMessages +//   Called from host always, even if output path is unconnected. +//--------------------------------------------------------- + +void SimpleSynth::processMessages() +{ +      //Process messages from the gui +      while (gui->fifoSize()) { +            MidiPlayEvent ev = gui->readEvent(); +            if (ev.type() == ME_SYSEX) { +                  sysex(ev.len(), ev.data()); +                  sendEvent(ev); +                  } +            else if (ev.type() == ME_CONTROLLER) { +                  setController(ev.channel(), ev.dataA(), ev.dataB(), true); +                  sendEvent(ev); +                  } +            else { +                  if (SS_DEBUG) +                        printf("SimpleSynth::process(): unknown event, type: %d\n", ev.type()); +                  } +            } +} + +//---------------------------------------------------------  //   process  /*!      \fn SimpleSynth::process @@ -671,6 +731,7 @@ int SimpleSynth::getControllerInfo(int index, const char** name, int* controller  //---------------------------------------------------------  void SimpleSynth::process(float** out, int offset, int len)        { +      /*        //Process messages from the gui        while (gui->fifoSize()) {              MidiPlayEvent ev = gui->readEvent(); @@ -687,7 +748,8 @@ void SimpleSynth::process(float** out, int offset, int len)                          printf("SimpleSynth::process(): unknown event, type: %d\n", ev.type());                    }              } - +      */ +              if (synth_state == SS_RUNNING) {        //Temporary mix-doubles @@ -843,6 +905,19 @@ bool SimpleSynth::init(const char* name)        }  //--------------------------------------------------------- +// getInitBuffer +//--------------------------------------------------------- +void SimpleSynth::setupInitBuffer(int len) +{ +  if (len > initLen) { +        if (initBuffer) +              delete [] initBuffer; +        initBuffer = new byte[len]; +        initLen = len;     +        } +} + +//---------------------------------------------------------  /*!      \fn SimpleSynth::getInitData      \brief Data for reinitialization of SimpleSynth when loading project @@ -850,7 +925,8 @@ bool SimpleSynth::init(const char* name)      \param data - data that is sent as a sysex to the synth on reload of project   */  //--------------------------------------------------------- -void SimpleSynth::getInitData(int* n, const unsigned char** data) +//void SimpleSynth::getInitData(int* n, const unsigned char** data) const +void SimpleSynth::getInitData(int* n, const unsigned char** data)         {        SS_TRACE_IN        // Calculate length of data @@ -877,7 +953,10 @@ void SimpleSynth::getInitData(int* n, const unsigned char** data)                    int labelnamelen = plugin->label().size() + 2;                    len+=(namelen + labelnamelen); -                  len+=3; //1 byte for nr of parameters, 1 byte for return gain, 1 byte for effect on/off +                  ///len+=3; //1 byte for nr of parameters, 1 byte for return gain, 1 byte for effect on/off +                  // p4.0.27 Tim. +                  len+=6; //4 bytes for nr of parameters, 1 byte for return gain, 1 byte for effect on/off +                                      len+=sendEffects[i].nrofparameters; // 1 byte for each parameter value                    }              else { @@ -885,17 +964,29 @@ void SimpleSynth::getInitData(int* n, const unsigned char** data)                    }              } +      len += 2;  // For header. +        // First, SS_SYSEX_INIT_DATA -      byte* buffer = new byte[len]; -      memset(buffer, 0, len); -      buffer[0] = SS_SYSEX_INIT_DATA; -      buffer[1] = SS_SYSEX_INIT_DATA_VERSION; +       +      ///byte* buffer = new byte[len]; +      setupInitBuffer(len); +       +      memset(initBuffer, 0, len); +      //initBuffer[0] = SS_SYSEX_INIT_DATA; +      //initBuffer[1] = SS_SYSEX_INIT_DATA_VERSION; +      initBuffer[0] = MUSE_SYNTH_SYSEX_MFG_ID; +      initBuffer[1] = SIMPLEDRUMS_UNIQUE_ID; +      initBuffer[2] = SS_SYSEX_INIT_DATA; +      initBuffer[3] = SS_SYSEX_INIT_DATA_VERSION;        if (SS_DEBUG_INIT) {              printf("Length of init data: %d\n", len); -            printf("buffer[0] - SS_SYSEX_INIT_DATA: %d\n", SS_SYSEX_INIT_DATA); -            printf("buffer[1] - SS_SYSEX_INIT_DATA_VERSION: %d\n", SS_SYSEX_INIT_DATA_VERSION); +            //printf("initBuffer[0] - SS_SYSEX_INIT_DATA: %d\n", SS_SYSEX_INIT_DATA); +            //printf("initBuffer[1] - SS_SYSEX_INIT_DATA_VERSION: %d\n", SS_SYSEX_INIT_DATA_VERSION); +            printf("initBuffer[2] - SS_SYSEX_INIT_DATA: %d\n", SS_SYSEX_INIT_DATA); +            printf("initBuffer[3] - SS_SYSEX_INIT_DATA_VERSION: %d\n", SS_SYSEX_INIT_DATA_VERSION);              } -      int i = 2; +      //int i = 2; +      int i = 4;        // All channels:        // 0       - volume ctrlval (0-127)        // 1       - pan (0-127) @@ -905,71 +996,75 @@ void SimpleSynth::getInitData(int* n, const unsigned char** data)        // 8       - len of filename, n        // 9 - 9+n - filename        for (int ch=0; ch<SS_NR_OF_CHANNELS; ch++) { -            buffer[i]   = (byte) channels[ch].volume_ctrlval; -            buffer[i+1] = (byte) channels[ch].pan; -            buffer[i+2] = (byte) channels[ch].noteoff_ignore; -            buffer[i+3] = (byte) channels[ch].channel_on; -            buffer[i+4] = (byte) round(channels[ch].sendfxlevel[0] * 127.0); -            buffer[i+5] = (byte) round(channels[ch].sendfxlevel[1] * 127.0); -            buffer[i+6] = (byte) round(channels[ch].sendfxlevel[2] * 127.0); -            buffer[i+7] = (byte) round(channels[ch].sendfxlevel[3] * 127.0); +            initBuffer[i]   = (byte) channels[ch].volume_ctrlval; +            initBuffer[i+1] = (byte) channels[ch].pan; +            initBuffer[i+2] = (byte) channels[ch].noteoff_ignore; +            initBuffer[i+3] = (byte) channels[ch].channel_on; +            initBuffer[i+4] = (byte) round(channels[ch].sendfxlevel[0] * 127.0); +            initBuffer[i+5] = (byte) round(channels[ch].sendfxlevel[1] * 127.0); +            initBuffer[i+6] = (byte) round(channels[ch].sendfxlevel[2] * 127.0); +            initBuffer[i+7] = (byte) round(channels[ch].sendfxlevel[3] * 127.0);              if (SS_DEBUG_INIT) {                    printf("Channel %d:\n", ch); -                  printf("buffer[%d] - channels[ch].volume_ctrlval = \t%d\n", i, channels[ch].volume_ctrlval); -                  printf("buffer[%d] - channels[ch].pan = \t\t%d\n", i+1, channels[ch].pan); -                  printf("buffer[%d] - channels[ch].noteoff_ignore = \t%d\n", i+2, channels[ch].noteoff_ignore ); -                  printf("buffer[%d] - channels[ch].channel_on = \t%d\n", i+3, channels[ch].channel_on); +                  printf("initBuffer[%d] - channels[ch].volume_ctrlval = \t%d\n", i, channels[ch].volume_ctrlval); +                  printf("initBuffer[%d] - channels[ch].pan = \t\t%d\n", i+1, channels[ch].pan); +                  printf("initBuffer[%d] - channels[ch].noteoff_ignore = \t%d\n", i+2, channels[ch].noteoff_ignore ); +                  printf("initBuffer[%d] - channels[ch].channel_on = \t%d\n", i+3, channels[ch].channel_on);                    for (int j= i+4; j < i+8; j++) { -                        printf("buffer[%d] - channels[ch].sendfxlevel[%d]= \t%d\n", j, j-i-4, (int)round(channels[ch].sendfxlevel[j-i-4] * 127.0)); +                        printf("initBuffer[%d] - channels[ch].sendfxlevel[%d]= \t%d\n", j, j-i-4, (int)round(channels[ch].sendfxlevel[j-i-4] * 127.0));                          }                    }              if (channels[ch].sample) {                    int filenamelen = strlen(channels[ch].sample->filename.c_str()) + 1; -                  buffer[i+8] = (byte) filenamelen; -                  memcpy((buffer+(i+9)), channels[ch].sample->filename.c_str(), filenamelen); +                  initBuffer[i+8] = (byte) filenamelen; +                  memcpy((initBuffer+(i+9)), channels[ch].sample->filename.c_str(), filenamelen);                    if (SS_DEBUG_INIT) { -                        printf("buffer[%d] - filenamelen: %d\n", i+8, filenamelen); -                        printf("buffer[%d] - buffer[%d] - filename: ", (i+9), (i+9) + filenamelen - 1); +                        printf("initBuffer[%d] - filenamelen: %d\n", i+8, filenamelen); +                        printf("initBuffer[%d] - initBuffer[%d] - filename: ", (i+9), (i+9) + filenamelen - 1);                          for (int j = i+9; j< i+9+filenamelen; j++) { -                              printf("%c",buffer[j]); +                              printf("%c",initBuffer[j]);                                }                          printf("\n");                          }                    i+= (SS_NR_OF_CHANNEL_CONTROLLERS + 1 + filenamelen);                    }              else { -                  buffer[i+8] = SS_NO_SAMPLE; +                  initBuffer[i+8] = SS_NO_SAMPLE;                    if (SS_DEBUG_INIT) { -                        printf("buffer[%d]: SS_NO_SAMPLE: - %d\n", i+8, SS_NO_SAMPLE); +                        printf("initBuffer[%d]: SS_NO_SAMPLE: - %d\n", i+8, SS_NO_SAMPLE);                          }                    i+= (SS_NR_OF_CHANNEL_CONTROLLERS + 1);                    }              }        if (SS_DEBUG_INIT) { -            printf("buffer[%d]: Master vol: - %d\n", i, master_vol_ctrlval); +            printf("initBuffer[%d]: Master vol: - %d\n", i, master_vol_ctrlval);              } -      buffer[i] = master_vol_ctrlval; -      *(data) = buffer; *n = len; +      initBuffer[i] = master_vol_ctrlval; +      *(data) = initBuffer; *n = len;        i++;        //Send effects: -      buffer[i] = SS_SYSEX_INIT_DATA_VERSION; //Just for check +       +      ///initBuffer[i] = SS_SYSEX_INIT_DATA_VERSION; //Just for check +      // Jun 10 2011. Bumped version up from 1 (with its own ID). p4.0.27 Tim +      initBuffer[i] = SS_SYSEX_EFFECT_INIT_DATA_VERSION;   //Just for check      +              if (SS_DEBUG_INIT) { -            printf("buffer[%d]: Control value, SS_SYSEX_INIT_DATA_VERSION\n", i); +            printf("initBuffer[%d]: Control value, SS_SYSEX_EFFECT_INIT_DATA_VERSION = %d\n", i, SS_SYSEX_EFFECT_INIT_DATA_VERSION);              }        i++;        for (int j=0; j<SS_NR_OF_SENDEFFECTS; j++) {              if (sendEffects[j].plugin) {                    int labelnamelen = sendEffects[j].plugin->label().size() + 1; -                  buffer[i] = labelnamelen; -                  memcpy((buffer+i+1), sendEffects[j].plugin->label().toLatin1().constData(), labelnamelen); +                  initBuffer[i] = labelnamelen; +                  memcpy((initBuffer+i+1), sendEffects[j].plugin->label().toLatin1().constData(), labelnamelen);                    if (SS_DEBUG_INIT) { -                        printf("buffer[%d] - labelnamelen: %d\n", i, labelnamelen); -                        printf("buffer[%d] - buffer[%d] - filename: ", (i+1), (i+1) + labelnamelen - 1); +                        printf("initBuffer[%d] - labelnamelen: %d\n", i, labelnamelen); +                        printf("initBuffer[%d] - initBuffer[%d] - filename: ", (i+1), (i+1) + labelnamelen - 1);                          for (int k = i+1; k < i+1+labelnamelen; k++) { -                              printf("%c",buffer[k]); +                              printf("%c",initBuffer[k]);                                }                          printf("\n");                          } @@ -977,45 +1072,55 @@ void SimpleSynth::getInitData(int* n, const unsigned char** data)                    i+=(labelnamelen + 1);                    int namelen = sendEffects[j].plugin->lib().size() + 1; -                  buffer[i] = namelen; -                  memcpy((buffer+i+1), sendEffects[j].plugin->lib().toLatin1().constData(), namelen); +                  initBuffer[i] = namelen; +                  memcpy((initBuffer+i+1), sendEffects[j].plugin->lib().toLatin1().constData(), namelen);                    if (SS_DEBUG_INIT) { -                        printf("buffer[%d] - libnamelen : %d\n", i, namelen); -                        printf("buffer[%d] - buffer[%d] - filename: ", (i+1), (i+1) + namelen - 1); +                        printf("initBuffer[%d] - libnamelen : %d\n", i, namelen); +                        printf("initBuffer[%d] - initBuffer[%d] - filename: ", (i+1), (i+1) + namelen - 1);                          for (int k = i+1; k < i+1+namelen; k++) { -                              printf("%c",buffer[k]); +                              printf("%c",initBuffer[k]);                                }                          printf("\n");                          }                    i+=(namelen + 1); -                  buffer[i]=sendEffects[j].nrofparameters; +                  ///initBuffer[i]=sendEffects[j].nrofparameters; +                  // Jun 10 2011. Changed to 32 bit. p4.0.27 Tim. +                  *((unsigned*)&initBuffer[i]) = sendEffects[j].nrofparameters;                    if (SS_DEBUG_INIT) { -                        printf("buffer[%d]: sendEffects[%d].nrofparameters=%d\n", i, j, buffer[i]); +                        printf("initBuffer[%d]: sendEffects[%d].nrofparameters=%d\n", i, j, *((unsigned*)&initBuffer[i])); +                        } +                  ///i++; +                  i+=4; + +                  initBuffer[i]=sendEffects[j].retgain_ctrlval; +                  if (SS_DEBUG_INIT) { +                        printf("initBuffer[%d]: sendEffects[%d].retgain_ctrlval=%d\n", i, j, initBuffer[i]);                          }                    i++; -                  buffer[i]=sendEffects[j].retgain_ctrlval; +                  // Jun 10 2011. This one was missing. p4.0.27 Tim. +                  initBuffer[i] = sendEffects[j].state;                    if (SS_DEBUG_INIT) { -                        printf("buffer[%d]: sendEffects[%d].retgain_ctrlval=%d\n", i, j, buffer[i]); +                        printf("initBuffer[%d]: sendEffects[%d].state=%d\n", i, j, initBuffer[i]);                          }                    i++;                    for (int k=0; k<sendEffects[j].nrofparameters; k++) {                          //TODO: Convert to 127-scale -                        buffer[i] = sendEffects[j].plugin->getGuiControlValue(k); +                        initBuffer[i] = sendEffects[j].plugin->getGuiControlValue(k);                          if (SS_DEBUG_INIT) { -                              printf("buffer[%d]: sendEffects[%d].parameterval[%d]=%d\n", i, j, k, buffer[i]); +                              printf("initBuffer[%d]: sendEffects[%d].parameterval[%d]=%d\n", i, j, k, initBuffer[i]);                                }                          i++;                          }                    }              // No plugin loaded:              else { -                  buffer[i] = SS_NO_PLUGIN; +                  initBuffer[i] = SS_NO_PLUGIN;                    if (SS_DEBUG_INIT) { -                        printf("buffer[%d]: SS_NO_PLUGIN\n", i); +                        printf("initBuffer[%d]: SS_NO_PLUGIN\n", i);                          }                    i++;                    } @@ -1118,11 +1223,15 @@ void SimpleSynth::parseInitData(const unsigned char* data)        ptr++;        // Effects: -      if (*(ptr) != SS_SYSEX_INIT_DATA_VERSION) { -            fprintf(stderr, "Error loading init data - control byte not found. Skipping...\n"); +      ///if (*(ptr) != SS_SYSEX_INIT_DATA_VERSION) { +      int effver = *(ptr); +      if (effver < 1 || effver > SS_SYSEX_EFFECT_INIT_DATA_VERSION) { +            //if (SS_DEBUG_INIT) +              fprintf(stderr, "Error loading init data - effect init version is from future or too old. Skipping...\n");              SS_TRACE_OUT              return;              } +              ptr++;        for (int i=0; i<SS_NR_OF_SENDEFFECTS; i++) { @@ -1149,9 +1258,14 @@ void SimpleSynth::parseInitData(const unsigned char* data)                    initSendEffect(i, libnametmp.c_str(), labelnametmp.c_str());                    //initSendEffect(0, "cmt", "freeverb3"); -                  byte params = *(ptr); -                  byte retgain = *(ptr+1); -                  ptr+=2; +                  ///byte params = *(ptr); +                  unsigned params = (effver < 2) ? *(ptr) : *((unsigned*)ptr);   // p4.0.27 +                  ptr+= (effver < 2) ? 1 : 4; +                   +                  ///byte retgain = *(ptr+1); +                  ///ptr+=2; +                  byte retgain = *(ptr);                                     // p4.0.27 +                  ptr++;                    sendEffects[i].nrofparameters = params; @@ -1161,7 +1275,19 @@ void SimpleSynth::parseInitData(const unsigned char* data)                    MidiPlayEvent ev(0, 0, 0, ME_CONTROLLER, SS_PLUGIN_RETURNLEVEL_CONTROLLER(i), retgain);                    gui->writeEvent(ev); -                  for (int j=0; j<params; j++) { +                  // Jun 10 2011. This one was missing. p4.0.27 Tim. +                  if(effver >= 2) +                  { +                    if (SS_DEBUG_INIT) +                        printf("buffer[%ld] - sendeffect[%d] state=%d\n", long(ptr-data), i, *(ptr)); +                    sendEffects[i].state = (SS_SendFXState) *(ptr); +                    MidiPlayEvent ev(0, 0, 0, ME_CONTROLLER, SS_PLUGIN_ONOFF_CONTROLLER(i), sendEffects[i].state); +                    gui->writeEvent(ev); +                    ptr++; +                  }   +                   +                  ///for (int j=0; j<params; j++) { +                  for (unsigned j=0; j<params; j++) {                        if (SS_DEBUG_INIT){                            //wilyfoobar-2011-02-13                            // arg2 :pointer diifference might be 64 bit (long long)  on 64 bit machine,  this requires cast to long @@ -1481,16 +1607,23 @@ void SimpleSynth::guiSendSampleLoaded(bool success, int ch, const char* filename        {        SS_TRACE_IN        int len = strlen(filename) + 3; //2 + filenamelen + 1; +      //int len = strlen(filename) + 3 + 2; //2 + filenamelen + 1, + 2 for header;        byte out[len]; +      //out[0] = MUSE_SYNTH_SYSEX_MFG_ID; +      //out[1] = SIMPLEDRUMS_UNIQUE_ID;        if (success) {              out[0] = SS_SYSEX_LOAD_SAMPLE_OK; +            //out[2] = SS_SYSEX_LOAD_SAMPLE_OK;              }        else {              out[0] = SS_SYSEX_LOAD_SAMPLE_ERROR; +            //out[2] = SS_SYSEX_LOAD_SAMPLE_ERROR;              }        out[1] = ch; +      //out[3] = ch;        memcpy(out+2, filename, strlen(filename)+1); +      //memcpy(out+4, filename, strlen(filename)+1);        MidiPlayEvent ev(0, 0, ME_SYSEX, out, len);        gui->writeEvent(ev);        SS_TRACE_OUT @@ -1504,8 +1637,13 @@ void SimpleSynth::guiSendError(const char* errorstring)        {        SS_TRACE_IN        byte out[strlen(errorstring)+2]; +      //byte out[strlen(errorstring)+4]; +      //out[0] = MUSE_SYNTH_SYSEX_MFG_ID; +      //out[1] = SIMPLEDRUMS_UNIQUE_ID;        out[0] = SS_SYSEX_ERRORMSG; +      //out[2] = SS_SYSEX_ERRORMSG;        memcpy(out+1, errorstring, strlen(errorstring) +1); +      //memcpy(out+3, errorstring, strlen(errorstring) +1);        SS_TRACE_OUT        } @@ -1590,15 +1728,24 @@ bool SimpleSynth::initSendEffect(int id, QString lib, QString name)                    //TODO: cleanup if failed                    }              } +              //Notify gui -      int len = 3; +      ///int len = 3; +      int len = 2 + 4;  // Char is not enough for many plugins. Was causing crash. Changed to 32 bits. p4.0.27 Tim. +      //int len = 5;          byte out[len];        out[0] = SS_SYSEX_LOAD_SENDEFFECT_OK;        out[1] = id; +      //out[0] = MUSE_SYNTH_SYSEX_MFG_ID; +      //out[1] = SIMPLEDRUMS_UNIQUE_ID; +      //out[2] = SS_SYSEX_LOAD_SENDEFFECT_OK; +      //out[3] = id;        int j=0;        for (iPlugin i = plugins.begin(); i!=plugins.end(); i++, j++) {              if ((*i)->lib() == plugin->lib() && (*i)->label() == plugin->label()) { -                  out[2] = j; +                  ///out[2] = j; +                  //out[4] = j; +                  *((unsigned*)(out + 2)) = j;                    MidiPlayEvent ev(0, 0, ME_SYSEX, out, len);                    gui->writeEvent(ev);                    } @@ -1638,9 +1785,15 @@ void SimpleSynth::cleanupPlugin(int id)        sendEffects[id].plugin = 0;        byte d[2]; +      //byte d[4];        d[0] = SS_SYSEX_CLEAR_SENDEFFECT_OK;        d[1] = id; +      //d[0] = MUSE_SYNTH_SYSEX_MFG_ID; +      //d[1] = SIMPLEDRUMS_UNIQUE_ID; +      //d[2] = SS_SYSEX_CLEAR_SENDEFFECT_OK; +      //d[3] = id;        MidiPlayEvent ev(0, 0, ME_SYSEX, d, 2); +      //MidiPlayEvent ev(0, 0, ME_SYSEX, d, 4);        gui->writeEvent(ev);        SS_TRACE_OUT        } @@ -1694,11 +1847,19 @@ void SimpleSynth::guiUpdateFxParameter(int fxid, int param, float val)              }        byte d[4]; +      //byte d[6];        d[0] = SS_SYSEX_SET_PLUGIN_PARAMETER_OK;        d[1] = fxid;        d[2] = param;        d[3] = intval; +      //d[0] = MUSE_SYNTH_SYSEX_MFG_ID; +      //d[1] = SIMPLEDRUMS_UNIQUE_ID; +      //d[2] = SS_SYSEX_SET_PLUGIN_PARAMETER_OK; +      //d[3] = fxid; +      //d[4] = param; +      //d[5] = intval;        MidiPlayEvent ev(0, 0, ME_SYSEX, d, 4); +      //MidiPlayEvent ev(0, 0, ME_SYSEX, d, 6);        gui->writeEvent(ev);        SS_TRACE_OUT        } @@ -1742,9 +1903,15 @@ void SimpleSynth::guiNotifySampleCleared(int ch)        {        SS_TRACE_IN        byte d[2]; +      //byte d[4];        d[0] = SS_SYSEX_CLEAR_SAMPLE_OK;        d[1] = (byte) ch; +      //d[0] = MUSE_SYNTH_SYSEX_MFG_ID; +      //d[1] = SIMPLEDRUMS_UNIQUE_ID; +      //d[2] = SS_SYSEX_CLEAR_SAMPLE_OK; +      //d[3] = (byte) ch;        MidiPlayEvent ev(0, 0, ME_SYSEX, d, 2); +      //MidiPlayEvent ev(0, 0, ME_SYSEX, d, 4);        gui->writeEvent(ev);        SS_TRACE_OUT        } diff --git a/muse2/synti/simpledrums2/simpledrums.h b/muse2/synti/simpledrums2/simpledrums.h index 58a5945e..f0339d6a 100644 --- a/muse2/synti/simpledrums2/simpledrums.h +++ b/muse2/synti/simpledrums2/simpledrums.h @@ -5,6 +5,7 @@  //  //  // Author: Mathias Lundgren <lunar_shuttle@users.sf.net>, (C) 2004 +//  Contributer: (C) Copyright 2011 Tim E. Real (terminator356 at users.sourceforge.net)  //  // Copyright: See COPYING file that comes with this distribution  // @@ -15,6 +16,7 @@  #include <sndfile.h>  #include "libsynti/mess.h"  #include "common.h" +#include "common_defs.h"  //#include "libsynti/mpevent.h"  #include "muse/mpevent.h"     #include "simpledrumsgui.h" @@ -124,11 +126,15 @@ class SimpleSynth : public Mess        virtual bool sysex(int arg1, const unsigned char* arg2);        virtual const char* getPatchName(int arg1, int arg2, int arg3) const;        virtual const MidiPatch* getPatchInfo(int arg1, const MidiPatch* arg2) const; -      virtual int getControllerInfo(int arg1, const char** arg2, int* arg3, int* arg4, int* arg5); +      virtual int getControllerInfo(int arg1, const char** arg2, int* arg3, int* arg4, int* arg5, int* arg6) const; +      virtual void processMessages();        virtual void process(float** data, int offset, int len);        //virtual void showGui(bool arg1);        virtual void showNativeGui(bool arg1); +      ///virtual void getInitData(int*, const unsigned char**) const;        virtual void getInitData(int*, const unsigned char**); +      // This is only a kludge required to support old songs' midistates. Do not use in any new synth. +      virtual int oldMidiStateHeader(const unsigned char** data) const;        bool init(const char* name);        void guiSendSampleLoaded(bool success, int ch, const char* filename);        void guiSendError(const char* errorstring); @@ -139,6 +145,10 @@ class SimpleSynth : public Mess  private:        SimpleSynthGui* gui; +      byte* initBuffer; +      int initLen; +      void setupInitBuffer(int len); +              SS_Channel channels[SS_NR_OF_CHANNELS];        SS_Controller controllers[SS_NR_OF_CONTROLLERS];        bool setController(int channel, int id, int val, bool fromGui); diff --git a/muse2/synti/simpledrums2/simpledrumsgui.cpp b/muse2/synti/simpledrums2/simpledrumsgui.cpp index f90c1da8..7d314565 100644 --- a/muse2/synti/simpledrums2/simpledrumsgui.cpp +++ b/muse2/synti/simpledrums2/simpledrumsgui.cpp @@ -5,6 +5,7 @@  //  //  // Author: Mathias Lundgren <lunar_shuttle@users.sf.net>, (C) 2004 +//  Contributer: (C) Copyright 2011 Tim E. Real (terminator356 at users.sourceforge.net)  //  // Copyright: See COPYING file that comes with this distribution  // @@ -19,6 +20,7 @@  #include <QLineEdit>  #include <QMessageBox> +#include "common_defs.h"  #include "simpledrumsgui.h"  //#include "libsynti/mpevent.h"  #include "muse/mpevent.h"    @@ -85,10 +87,16 @@ SimpleSynthGui* simplesynthgui_ptr;   */  QChannelSlider::QChannelSlider(Qt::Orientation orientation, int ch, QWidget* parent)        : QSlider(orientation, parent) -      { -      channel = ch; -      } +{ +    channel = ch; +} +void QChannelSlider::sliderChange(SliderChange change) +{ +  QSlider::sliderChange(change); +  if(change == QAbstractSlider::SliderValueChange) +    emit valueChanged(channel, value());   +}  /*!      \fn QChannelSlider::getChannel() @@ -110,6 +118,7 @@ void QChannelSlider::setChannel(int ch)  /*!      \fn QChannelSlider::setValue(int val)   */ +/*  void QChannelSlider::setValue(int val)        {        val = (val > 127 ? 127 : val); @@ -117,10 +126,32 @@ void QChannelSlider::setValue(int val)        QSlider::setValue(val);        emit valueChanged(channel, val);        } +*/ + +QInvertedSlider::QInvertedSlider(Qt::Orientation o, QWidget* parent) +         : QSlider(o, parent)  +{ +  setInvertedAppearance(true);    // p4.0.27  +} + +void QInvertedSlider::sliderChange(SliderChange change) +{ +  QSlider::sliderChange(change); +  if(change == QAbstractSlider::SliderValueChange) +    emit invertedValueChanged(value());   +} + +QInvertedChannelSlider::QInvertedChannelSlider(Qt::Orientation o, int channel, QWidget* parent) +         : QChannelSlider(o, channel, parent) +{ +  setInvertedAppearance(true);    // p4.0.27  +  //setInvertedControls(true); +}  /*!      \fn QInvertedChannelSlider::setValue(int val)   */ +/*  void QInvertedChannelSlider::setValue(int val)        {        int inverted = this->maximum() - val; @@ -129,10 +160,12 @@ void QInvertedChannelSlider::setValue(int val)        QSlider::setValue(val);        emit valueChanged(channel, inverted);        } +*/  /*!      \fn QInvertedSlider::setValue(int val)   */ +/*  void QInvertedSlider::setValue(int val)        {        int inverted = this->maximum() - val; @@ -141,7 +174,7 @@ void QInvertedSlider::setValue(int val)        emit invertedValueChanged(inverted);        QSlider::setValue(val);        } - +*/  /*!      \fn QChannelCheckbox::QChannelCheckbox(QWidget* parent, int ch) @@ -194,11 +227,20 @@ QChannelDial::QChannelDial(QWidget* parent, int ch, int fxid)  /*!      \fn QChannelSlider::setValue(int val)   */ +/*  void QChannelDial::setValue(int val)        {        QDial::setValue(val);        emit valueChanged(channel, sendfxid, val);        } +*/ + +void QChannelDial::sliderChange(SliderChange change) +{ +  QDial::sliderChange(change); +  if(change == QAbstractSlider::SliderValueChange) +    emit valueChanged(channel, sendfxid, value());   +}  /*!      \fn SimpleSynthGui::SimpleSynthGui() @@ -236,10 +278,16 @@ SimpleSynthGui::SimpleSynthGui()              inchnlLayout->addWidget(onOff[i]);              connect(onOff[i], SIGNAL(channelState(int, bool)), SLOT(channelOnOff(int, bool))); -            volumeSliders[i] = new QInvertedChannelSlider(Qt::Vertical, i, channelButtonGroups[i]); +            ///volumeSliders[i] = new QInvertedChannelSlider(Qt::Vertical, i, channelButtonGroups[i]); +            // By Tim. p4.0.27 Inverted was not correct type. Maybe was work in progress, rest of code was not converted yet?  +            volumeSliders[i] = new QChannelSlider(Qt::Vertical, i, channelButtonGroups[i]); +                          volumeSliders[i]->setMinimum(SS_VOLUME_MIN_VALUE);              volumeSliders[i]->setMaximum(SS_VOLUME_MAX_VALUE); -            volumeSliders[i]->setValue(SS_VOLUME_MAX_VALUE - SS_VOLUME_DEFAULT_VALUE); +             +            ///volumeSliders[i]->setValue(SS_VOLUME_MAX_VALUE - SS_VOLUME_DEFAULT_VALUE); +            volumeSliders[i]->setValue(SS_VOLUME_DEFAULT_VALUE);  // p4.0.27 +              //            volumeSliders[i]->setMinimumSize(SS_VOLSLDR_WIDTH, SS_VOLSLDR_LENGTH);              volumeSliders[i]->setToolTip("Volume, channel " + QString::number(i + 1));  //            setMinimumSize(SS_VOLSLDR_WIDTH, SS_VOLSLDR_LENGTH); @@ -310,13 +358,22 @@ SimpleSynthGui::SimpleSynthGui()        QVBoxLayout* mbgLayout = new QVBoxLayout(masterButtonGroup);        mbgLayout->setAlignment(Qt::AlignCenter);  //      masterButtonGroup->setMinimumSize(SS_BTNGRP_WIDTH, SS_BTNGRP_HEIGHT); -      masterSlider = new QInvertedSlider(Qt::Vertical, masterButtonGroup); +       +      ///masterSlider = new QInvertedSlider(Qt::Vertical, masterButtonGroup); +      // By Tim. p4.0.27 Inverted was not correct type. Maybe was work in progress, rest of code was not converted yet?  +      masterSlider = new QSlider(Qt::Vertical, masterButtonGroup); +              masterSlider->setToolTip("Master volume");        mbgLayout->addWidget(masterSlider);        masterSlider->setRange(0, 127); -      masterSlider->setValue(SS_VOLUME_MAX_VALUE - (int)(SS_MASTERVOL_DEFAULT_VALUE*SS_VOLUME_MAX_VALUE)); +       +      ///masterSlider->setValue(SS_VOLUME_MAX_VALUE - (int)(SS_MASTERVOL_DEFAULT_VALUE*SS_VOLUME_MAX_VALUE)); +      masterSlider->setValue((int)(SS_MASTERVOL_DEFAULT_VALUE*SS_VOLUME_MAX_VALUE)); // p4.0.27 +        //      masterSlider->setMinimumSize(SS_MASTERSLDR_WIDTH, SS_MASTERSLDR_HEIGHT); -      connect(masterSlider, SIGNAL(invertedValueChanged(int)), SLOT(masterVolChanged(int))); + +      ///connect(masterSlider, SIGNAL(invertedValueChanged(int)), SLOT(masterVolChanged(int))); +      connect(masterSlider, SIGNAL(valueChanged(int)), SLOT(masterVolChanged(int)));  // p4.0.27        //Main groupbox        mainGroupBox = new QGroupBox(this); @@ -435,7 +492,10 @@ void SimpleSynthGui::processEvent(const MidiPlayEvent& ev)                    switch(id) {                          case SS_CHANNEL_CTRL_VOLUME:                                volumeSliders[ch]->blockSignals(true); -                              volumeSliders[ch]->setValue(SS_VOLUME_MAX_VALUE - val); +                               +                              ///volumeSliders[ch]->setValue(SS_VOLUME_MAX_VALUE - val); +                              volumeSliders[ch]->setValue(val);   // p4.0.27 +                                                              volumeSliders[ch]->blockSignals(false);                                break; @@ -479,7 +539,10 @@ void SimpleSynthGui::processEvent(const MidiPlayEvent& ev)              else if (id >= SS_FIRST_MASTER_CONTROLLER && id <= SS_LAST_MASTER_CONTROLLER) {                    if (id == SS_MASTER_CTRL_VOLUME) {                          masterSlider->blockSignals(true); -                        masterSlider->setValue(SS_MASTERVOL_MAX_VALUE - val); +                         +                        ///masterSlider->setValue(SS_MASTERVOL_MAX_VALUE - val); +                        masterSlider->setValue(val);   // p4.0.27 +                                                  masterSlider->blockSignals(false);                          }                    } @@ -495,6 +558,13 @@ void SimpleSynthGui::processEvent(const MidiPlayEvent& ev)                          SS_PluginFront* pf = pluginGui->getPluginFront((unsigned)fxid);                          pf->setRetGain(val);                          } +                  // Plugin on/off: +                  else if (cmd == SS_PLUGIN_ONOFF) {      // p4.0.27 +                        if (SS_DEBUG_MIDI) +                              printf("SimpleSynthGui::processEvent - fx onoff received: fxid: %d val: %d\n", fxid, val); +                        SS_PluginFront* pf = pluginGui->getPluginFront((unsigned)fxid); +                        pf->setOnOff(val); +                        }                    }              }              // @@ -502,6 +572,7 @@ void SimpleSynthGui::processEvent(const MidiPlayEvent& ev)              //              else if (ev.type() == ME_SYSEX) {                    byte* data = ev.data(); +                  //byte* data = d + 2;                    int cmd = *data;                    switch (cmd) {                          case SS_SYSEX_LOAD_SAMPLE_OK: { @@ -549,7 +620,8 @@ void SimpleSynthGui::processEvent(const MidiPlayEvent& ev)                                      }                                int fxid = *(data+1);                                SS_PluginFront* pf = pluginGui->getPluginFront((unsigned)fxid); -                              pf->updatePluginValue(*(data+2)); +                              ///pf->updatePluginValue(*(data+2)); +                              pf->updatePluginValue(  *((unsigned*)(data+2)) );     // p4.0.27                                break;                                } @@ -711,13 +783,20 @@ void SimpleSynthGui::loadSampleDialogue(int channel)              if (SS_DEBUG)                    printf("lastDir = %s\n", lastDir.toLatin1().constData()); -            int l = filename.length() + 4; +            //int l = filename.length() + 4; +            int l = filename.length() + 6;              byte d[l]; -            d[0] = SS_SYSEX_LOAD_SAMPLE; -            d[1] = (byte) channel; -            d[2] = (byte) filename.length(); -            memcpy(d+3, filename.toLatin1().constData(), filename.length()+1); +            //d[0] = SS_SYSEX_LOAD_SAMPLE; +            //d[1] = (byte) channel; +            //d[2] = (byte) filename.length(); +            d[0] = MUSE_SYNTH_SYSEX_MFG_ID; +            d[1] = SIMPLEDRUMS_UNIQUE_ID; +            d[2] = SS_SYSEX_LOAD_SAMPLE; +            d[3] = (byte) channel; +            d[4] = (byte) filename.length(); +            //memcpy(d+3, filename.toLatin1().constData(), filename.length()+1); +            memcpy(d+5, filename.toLatin1().constData(), filename.length()+1);              sendSysex(d, l);              }        } @@ -730,10 +809,16 @@ void SimpleSynthGui::loadSampleDialogue(int channel)  void SimpleSynthGui::clearSample(int ch)        {        if (sampleNameLineEdit[ch]->text().length() > 0) { //OK, we've got a live one here -            byte d[2]; -            d[0] = SS_SYSEX_CLEAR_SAMPLE; -            d[1] = (byte) ch; -            sendSysex(d, 2); +            //byte d[2]; +            byte d[4]; +            //d[0] = SS_SYSEX_CLEAR_SAMPLE; +            //d[1] = (byte) ch; +            d[0] = MUSE_SYNTH_SYSEX_MFG_ID; +            d[1] = SIMPLEDRUMS_UNIQUE_ID; +            d[2] = SS_SYSEX_CLEAR_SAMPLE; +            d[3] = (byte) ch; +            //sendSysex(d, 2); +            sendSysex(d, 4);              sampleNameLineEdit[ch]->setText("");              }        } @@ -751,12 +836,19 @@ void SimpleSynthGui::displayPluginGui()   */  void SimpleSynthGui::loadEffectInvoked(int fxid, QString lib, QString label)        { -      int l = 4 + lib.length() + label.length(); +      //int l = 4 + lib.length() + label.length(); +      int l = 6 + lib.length() + label.length();        byte d[l]; -      d[0] = SS_SYSEX_LOAD_SENDEFFECT; -      d[1] = (byte) fxid; -      memcpy (d+2, lib.toLatin1().constData(), lib.length()+1); -      memcpy (d+3+lib.length(), label.toLatin1().constData(), label.length()+1); +      //d[0] = SS_SYSEX_LOAD_SENDEFFECT; +      //d[1] = (byte) fxid; +      d[0] = MUSE_SYNTH_SYSEX_MFG_ID; +      d[1] = SIMPLEDRUMS_UNIQUE_ID; +      d[2] = SS_SYSEX_LOAD_SENDEFFECT; +      d[3] = (byte) fxid; +      //memcpy (d+2, lib.toLatin1().constData(), lib.length()+1); +      //memcpy (d+3+lib.length(), label.toLatin1().constData(), label.length()+1); +      memcpy (d+4, lib.toLatin1().constData(), lib.length()+1); +      memcpy (d+5+lib.length(), label.toLatin1().constData(), label.length()+1);        sendSysex(d, l);        } @@ -784,10 +876,16 @@ void SimpleSynthGui::toggleEffectOnOff(int fxid, int state)   */  void SimpleSynthGui::clearPlugin(int fxid)        { -      byte d[2]; -      d[0] = SS_SYSEX_CLEAR_SENDEFFECT; -      d[1] = fxid; -      sendSysex(d, 2); +      //byte d[2]; +      byte d[4]; +      //d[0] = SS_SYSEX_CLEAR_SENDEFFECT; +      //d[1] = fxid; +      d[0] = MUSE_SYNTH_SYSEX_MFG_ID; +      d[1] = SIMPLEDRUMS_UNIQUE_ID; +      d[2] = SS_SYSEX_CLEAR_SENDEFFECT; +      d[3] = fxid; +      //sendSysex(d, 2); +      sendSysex(d, 4);        } @@ -796,13 +894,19 @@ void SimpleSynthGui::clearPlugin(int fxid)   */  void SimpleSynthGui::effectParameterChanged(int fxid, int parameter, int val)        { -      //printf("Gui: effectParameterChanged: %d %d %d\n", fxid, parameter, val); -      int len = 4; +      //int len = 4; +      int len = 6;        byte d[len]; -      d[0] = SS_SYSEX_SET_PLUGIN_PARAMETER; -      d[1] = (byte) fxid; -      d[2] = (byte) parameter; -      d[3] = (byte) val; +      //d[0] = SS_SYSEX_SET_PLUGIN_PARAMETER; +      //d[1] = (byte) fxid; +      //d[2] = (byte) parameter; +      //d[3] = (byte) val; +      d[0] = MUSE_SYNTH_SYSEX_MFG_ID; +      d[1] = SIMPLEDRUMS_UNIQUE_ID; +      d[2] = SS_SYSEX_SET_PLUGIN_PARAMETER; +      d[3] = (byte) fxid; +      d[4] = (byte) parameter; +      d[5] = (byte) val;        sendSysex(d, len);        } @@ -826,7 +930,9 @@ void SimpleSynthGui::aboutButtonClicked()        {        QString caption = "SimpleDrums ver";        caption+= SS_VERSIONSTRING; -      QString text = caption + "\n\n(C) Copyright 2000-2004 Mathias Lundgren (lunar_shuttle@users.sf.net), Werner Schweer\nPublished under the GNU Public License"; +      ///QString text = caption + "\n\n(C) Copyright 2000-2004 Mathias Lundgren (lunar_shuttle@users.sf.net), Werner Schweer\nPublished under the GNU Public License"; +      QString text = caption + "\n\n(C) Copyright 2000-2004 Mathias Lundgren (lunar_shuttle@users.sf.net), Werner Schweer\n" +                               "Fixes/mods: (C) Copyright 2011 Tim E. Real (terminator356@users.sf.net)\nPublished under the GNU Public License";        QMessageBox* msgBox = new QMessageBox(caption, text, QMessageBox::NoIcon,              QMessageBox::Ok, Qt::NoButton, Qt::NoButton, this);        msgBox->exec(); @@ -851,8 +957,12 @@ void SimpleSynthGui::loadSetup()                    if (theFile.read((char*)&initdata_len, sizeof(initdata_len)) == -1)                       success = false; -                  byte* init_data = new byte[initdata_len]; -                  if (theFile.read((char*)(init_data), initdata_len) == -1) +                  ///byte* init_data = new byte[initdata_len]; +                  byte* init_data = new byte[initdata_len + 2];   // 2 for MFG ID and synth ID.  +                  init_data[0] = MUSE_SYNTH_SYSEX_MFG_ID; +                  init_data[1] = SIMPLEDRUMS_UNIQUE_ID; +                  //if (theFile.read((char*)(init_data), initdata_len) == -1) +                  if (theFile.read((char*)(init_data + 2), initdata_len) == -1)                       success = false;                    if (!success) { @@ -862,7 +972,8 @@ void SimpleSynthGui::loadSetup()                          delete msgBox;                          }                    else { -                        sendSysex(init_data, initdata_len); +                        ///sendSysex(init_data, initdata_len); +                        sendSysex(init_data, initdata_len + 2);                          }                    delete[] init_data; @@ -883,9 +994,14 @@ void SimpleSynthGui::saveSetup()        if (filename != QString::null) {              lastSavedProject = filename; -            byte d[1]; -            d[0] = SS_SYSEX_GET_INIT_DATA; -            sendSysex(d, 1); // Makes synth send gui initdata, where rest of the saving takes place +            //byte d[1]; +            byte d[3]; +            //d[0] = SS_SYSEX_GET_INIT_DATA; +            d[0] = MUSE_SYNTH_SYSEX_MFG_ID; +            d[1] = SIMPLEDRUMS_UNIQUE_ID; +            d[2] = SS_SYSEX_GET_INIT_DATA; +            //sendSysex(d, 1); // Makes synth send gui initdata, where rest of the saving takes place +            sendSysex(d, 3); // Makes synth send gui initdata, where rest of the saving takes place              }        } diff --git a/muse2/synti/simpledrums2/simpledrumsgui.h b/muse2/synti/simpledrums2/simpledrumsgui.h index be8c492d..af32e432 100644 --- a/muse2/synti/simpledrums2/simpledrumsgui.h +++ b/muse2/synti/simpledrums2/simpledrumsgui.h @@ -5,6 +5,7 @@  //  //  // Author: Mathias Lundgren <lunar_shuttle@users.sf.net>, (C) 2004 +//  Contributer: (C) Copyright 2011 Tim E. Real (terminator356 at users.sourceforge.net)  //  // Copyright: See COPYING file that comes with this distribution  // @@ -37,18 +38,19 @@ class QChannelSlider: public QSlider     Q_OBJECT     public: -      QChannelSlider(Qt::Orientation, int ch, QWidget* paren = 0); +      QChannelSlider(Qt::Orientation, int ch, QWidget* parent = 0);        int getChannel();        void setChannel(int ch); -   public slots: -      virtual void setValue(int val); +   ///public slots: +   ///   virtual void setValue(int val);     signals:        void valueChanged(int channel, int value); - +        protected:        int channel; +      virtual void sliderChange(SliderChange change);        };  //-------------------------------------- @@ -58,14 +60,17 @@ class QInvertedSlider : public QSlider     {     Q_OBJECT     public: -      QInvertedSlider(Qt::Orientation o, QWidget* parent = 0) -         : QSlider(o, parent) {} +      QInvertedSlider(Qt::Orientation o, QWidget* parent = 0); +         ///: QSlider(o, parent) {} -   public slots: -      virtual void setValue(int val); +   ///public slots: +   ///   virtual void setValue(int val);     signals:        void invertedValueChanged(int value); +    +   protected: +      virtual void sliderChange(SliderChange change);         };  //-------------------------------------- @@ -75,11 +80,10 @@ class QInvertedChannelSlider : public QChannelSlider     {     Q_OBJECT     public: -      QInvertedChannelSlider(Qt::Orientation o, int channel, QWidget* parent = 0) -         : QChannelSlider(o, channel, parent) {}; +      QInvertedChannelSlider(Qt::Orientation o, int channel, QWidget* parent = 0); -   public slots: -      virtual void setValue(int val); +   ///public slots: +   ///   virtual void setValue(int val);     }; @@ -138,12 +142,13 @@ class QChannelDial : public QDial     signals:        void valueChanged(int channel, int fxid, int val); -   public slots: -      virtual void setValue(int val); +   ///public slots: +   ///   virtual void setValue(int val);     protected:        int channel;        int sendfxid; +      virtual void sliderChange(SliderChange change);         };  //-------------------------------------- @@ -160,7 +165,10 @@ class SimpleSynthGui : public QDialog, public Ui::SimpleDrumsGuiBase, public Mes        QGroupBox* channelButtonGroups[SS_NR_OF_CHANNELS];        QGroupBox*           masterButtonGroup;        QGroupBox*              mainGroupBox; -      QInvertedChannelSlider* volumeSliders[SS_NR_OF_CHANNELS]; +       +      ///QInvertedChannelSlider* volumeSliders[SS_NR_OF_CHANNELS]; +      QChannelSlider*         volumeSliders[SS_NR_OF_CHANNELS];       // p4.0.27 Tim. Inverted not correct. Was WIP?  +              QChannelSlider*         panSliders[SS_NR_OF_CHANNELS];        QChannelCheckbox*       onOff[SS_NR_OF_CHANNELS];        QChannelCheckbox*       nOffIgnore[SS_NR_OF_CHANNELS]; @@ -168,7 +176,10 @@ class SimpleSynthGui : public QDialog, public Ui::SimpleDrumsGuiBase, public Mes        QChannelButton*         clearSampleButton[SS_NR_OF_CHANNELS];        QLabel*                 nOffLabel[SS_NR_OF_CHANNELS];        QLineEdit*              sampleNameLineEdit[SS_NR_OF_CHANNELS]; -      QInvertedSlider*        masterSlider; +       +      ///QInvertedSlider*        masterSlider; +      QSlider*                masterSlider;                          // p4.0.27 Tim. Inverted not correct. Was WIP?  +              QChannelDial*           sendFxDial[SS_NR_OF_CHANNELS][SS_NR_OF_SENDEFFECTS];        QPushButton*            openPluginsButton; diff --git a/muse2/synti/simpledrums2/ssplugin.cpp b/muse2/synti/simpledrums2/ssplugin.cpp index 9d32b2c3..75559a8f 100644 --- a/muse2/synti/simpledrums2/ssplugin.cpp +++ b/muse2/synti/simpledrums2/ssplugin.cpp @@ -6,6 +6,7 @@  //  //  (C) Copyright 2000 Werner Schweer (ws@seh.de)  // Additions/modifications: Mathias Lundgren <lunar_shuttle@users.sf.net>, (C) 2004 +//                          (C) Copyright 2011 Tim E. Real (terminator356 at users.sourceforge.net)  // Copyright: See COPYING file that comes with this distribution  //  // diff --git a/muse2/synti/simpledrums2/ssplugin.h b/muse2/synti/simpledrums2/ssplugin.h index 64e80921..8750753b 100644 --- a/muse2/synti/simpledrums2/ssplugin.h +++ b/muse2/synti/simpledrums2/ssplugin.h @@ -6,6 +6,7 @@  //  //  (C) Copyright 2000 Werner Schweer (ws@seh.de)  // Additions/modifications: Mathias Lundgren <lunar_shuttle@users.sf.net>, (C) 2004 +//                          (C) Copyright 2011 Tim E. Real (terminator356 at users.sourceforge.net)  // Copyright: See COPYING file that comes with this distribution  //  // diff --git a/muse2/synti/simpledrums2/ssplugingui.cpp b/muse2/synti/simpledrums2/ssplugingui.cpp index d52d3a8f..31ac3ac4 100644 --- a/muse2/synti/simpledrums2/ssplugingui.cpp +++ b/muse2/synti/simpledrums2/ssplugingui.cpp @@ -5,6 +5,7 @@  //  //  // Author: Mathias Lundgren <lunar_shuttle@users.sf.net>, (C) 2004 +//  Contributer: (C) Copyright 2011 Tim E. Real (terminator356 at users.sourceforge.net)  //  // Copyright: See COPYING file that comes with this distribution  // @@ -56,18 +57,24 @@ SS_PluginChooser::SS_PluginChooser(QWidget* parent)              }        connect(okButton, SIGNAL(pressed()), SLOT(okPressed()));        connect(cancelButton, SIGNAL(pressed()), SLOT(cancelPressed())); -      connect(effectsListView, SIGNAL(selectionChanged(QTreeWidgetItem*)), SLOT(selectionChanged(QTreeWidgetItem*))); -      connect(effectsListView, SIGNAL(doubleClicked(QTreeWidgetItem*)), SLOT(doubleClicked(QTreeWidgetItem*))); +       +      //connect(effectsListView, SIGNAL(selectionChanged(QTreeWidgetItem*)), SLOT(selectionChanged(QTreeWidgetItem*))); +      //connect(effectsListView, SIGNAL(doubleClicked(QTreeWidgetItem*)), SLOT(doubleClicked(QTreeWidgetItem*))); +      connect(effectsListView, SIGNAL(itemSelectionChanged()), SLOT(selectionChanged()));                            // p4.0.27 +      connect(effectsListView, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), SLOT(doubleClicked(QTreeWidgetItem*)));  // +              SS_TRACE_OUT        }  /*!      \fn SS_PluginChooser::selectionChanged(QListViewItem* item)   */ -void SS_PluginChooser::selectionChanged(QTreeWidgetItem* item) +//void SS_PluginChooser::selectionChanged(QTreeWidgetItem* item) +void SS_PluginChooser::selectionChanged()        {        SS_TRACE_IN -      selectedItem  = item; +      //selectedItem  = item; +      selectedItem = effectsListView->currentItem();          SS_TRACE_OUT        } @@ -95,9 +102,10 @@ void SS_PluginChooser::cancelPressed()  /*!      \fn SS_PluginChooser::doubleClicked(QListViewItem* item)   */ -void SS_PluginChooser::doubleClicked(QTreeWidgetItem* /*item*/) +void SS_PluginChooser::doubleClicked(QTreeWidgetItem* item)        {        SS_TRACE_IN +      selectedItem = item;    // p4.0.27 Tim        selectedPlugin = findSelectedPlugin();        SS_TRACE_OUT        done(QDialog::Accepted); @@ -109,6 +117,8 @@ void SS_PluginChooser::doubleClicked(QTreeWidgetItem* /*item*/)  LadspaPlugin* SS_PluginChooser::findSelectedPlugin()        {        SS_TRACE_IN +      if(!selectedItem)        // p4.0.27 Tim +        return 0;        LadspaPlugin* selected = 0;        for (iPlugin i=plugins.begin(); i != plugins.end(); i++) {              if ((*i)->name() == selectedItem->text(SS_PLUGINCHOOSER_NAMECOL)) @@ -299,7 +309,7 @@ void SS_PluginFront::updatePluginValue(unsigned k)              }        iPlugin i; -      for (i = plugins.begin(); j != k; i++, j++); +      for (i = plugins.begin(); j != k; i++, j++) ;        plugin = (LadspaPlugin*) *(i);        setPluginName(plugin->label());        outGainSlider->setEnabled(true); @@ -307,7 +317,7 @@ void SS_PluginFront::updatePluginValue(unsigned k)        expandButton->setEnabled(true);        pluginName->setEnabled(true);        onOff->setEnabled(true); -      onOff->setChecked(true); +      ///onOff->setChecked(true);        SS_TRACE_OUT        } @@ -359,6 +369,15 @@ void SS_PluginFront::setRetGain(int val)        }  /*! +    \fn SS_PluginFront::setOnOff(bool val) + */ +void SS_PluginFront::setOnOff(bool val) +      { +      onOff->blockSignals(true); +      onOff->setChecked(val); +      onOff->blockSignals(false); +      } +/*!      \fn SS_PluginFront::expandButtonPressed()   */  void SS_PluginFront::expandButtonPressed() diff --git a/muse2/synti/simpledrums2/ssplugingui.h b/muse2/synti/simpledrums2/ssplugingui.h index 3d77ecf0..99951d01 100644 --- a/muse2/synti/simpledrums2/ssplugingui.h +++ b/muse2/synti/simpledrums2/ssplugingui.h @@ -5,6 +5,7 @@  //  //  // Author: Mathias Lundgren <lunar_shuttle@users.sf.net>, (C) 2004 +//  Contributer: (C) Copyright 2011 Tim E. Real (terminator356 at users.sourceforge.net)  //  // Copyright: See COPYING file that comes with this distribution  // @@ -83,11 +84,21 @@ class SS_ParameterSlider : public QSlider, public SS_ParameterWidget        virtual void setParamValue(int val) { SS_TRACE_IN setValue(val); SS_TRACE_OUT} -   public slots: -      virtual void setValue(int val) { SS_TRACE_IN QSlider::setValue(val); emit valueChanged(fxid, parameter, val); SS_TRACE_OUT } +   ///public slots: +   ///   virtual void setValue(int val) { SS_TRACE_IN QSlider::setValue(val); emit valueChanged(fxid, parameter, val); SS_TRACE_OUT }     signals:        void valueChanged(int id, int param, int val); +    +   protected: +      virtual void sliderChange(SliderChange change)   // p4.0.27 Tim +      {  +        SS_TRACE_IN  +        QSlider::sliderChange(change); +        if(change == QAbstractSlider::SliderValueChange) +          emit valueChanged(fxid, parameter, value());   +        SS_TRACE_OUT +      }         };  typedef std::list<SS_ParameterWidget*>           SS_ParameterWidgetList; @@ -110,7 +121,8 @@ class SS_PluginChooser : public QDialog, Ui::SS_PluginChooserBase     private slots:        void okPressed();        void cancelPressed(); -      void selectionChanged(QTreeWidgetItem* item); +      ///void selectionChanged(QTreeWidgetItem* item); +      void selectionChanged();        void doubleClicked(QTreeWidgetItem* item);     private: @@ -154,6 +166,7 @@ class SS_PluginFront : public QGroupBox        void clearPluginDisplay();        void setParameterValue(int param, int val);        void setRetGain(int val); +      void setOnOff(bool val);     protected:        virtual QSize sizeHint() const; | 
