diff options
| -rw-r--r-- | muse/ChangeLog | 8 | ||||
| -rw-r--r-- | muse/plugins/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | muse/plugins/doublechorus/doublechorusmodel.h | 18 | ||||
| -rw-r--r-- | muse/plugins/pandelay/CMakeLists.txt | 33 | ||||
| -rw-r--r-- | muse/plugins/pandelay/ladspapandelay.cpp | 95 | ||||
| -rw-r--r-- | muse/plugins/pandelay/ladspapandelay.h | 55 | ||||
| -rw-r--r-- | muse/plugins/pandelay/pandelay.cpp | 167 | ||||
| -rw-r--r-- | muse/plugins/pandelay/pandelaymodel.cpp | 142 | ||||
| -rw-r--r-- | muse/plugins/pandelay/pandelaymodel.h | 84 | ||||
| -rw-r--r-- | muse/synti/deicsonze/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | muse/synti/deicsonze/deicsonze.cpp | 200 | ||||
| -rw-r--r-- | muse/synti/deicsonze/deicsonze.h | 45 | ||||
| -rw-r--r-- | muse/synti/deicsonze/deicsonzegui.cpp | 254 | ||||
| -rw-r--r-- | muse/synti/deicsonze/deicsonzegui.h | 24 | ||||
| -rw-r--r-- | muse/synti/deicsonze/deicsonzegui.ui | 1417 | ||||
| -rw-r--r-- | muse/synti/deicsonze/deicsonzeplugin.cpp | 82 | ||||
| -rw-r--r-- | muse/synti/deicsonze/deicsonzeplugin.h | 1 | 
17 files changed, 1926 insertions, 703 deletions
diff --git a/muse/ChangeLog b/muse/ChangeLog index 6612d080..16350ec4 100644 --- a/muse/ChangeLog +++ b/muse/ChangeLog @@ -1,3 +1,11 @@ +06.01 (ng) +      - added panDelay plugin FX +      - added panDelay in DeicsOnze + +*********************** +* Happy new year 2007 * +*********************** +	  29.12 (ng)        - fixed sync LFO Deicsonze        - update II miditracker (not working yet) diff --git a/muse/plugins/CMakeLists.txt b/muse/plugins/CMakeLists.txt index e62f25ad..1293902f 100644 --- a/muse/plugins/CMakeLists.txt +++ b/muse/plugins/CMakeLists.txt @@ -18,5 +18,5 @@  #  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  #============================================================================= -subdirs( freeverb doublechorus ) +subdirs( freeverb doublechorus pandelay ) diff --git a/muse/plugins/doublechorus/doublechorusmodel.h b/muse/plugins/doublechorus/doublechorusmodel.h index 6dc7f3ac..40ce9f3f 100644 --- a/muse/plugins/doublechorus/doublechorusmodel.h +++ b/muse/plugins/doublechorus/doublechorusmodel.h @@ -49,15 +49,15 @@ class DoubleChorusModel {    DoubleChorusModel(unsigned long samplerate);    ~DoubleChorusModel(); -  void	processMix(long numsamples); -  void	processReplace(long numsamples); -  void	setPan1(float value); -  void	setLFOFreq1(float value); -  void	setDepth1(float value); -  void	setPan2(float value); -  void	setLFOFreq2(float value); -  void	setDepth2(float value); -  void  setDryWet(float value); +  void processMix(long numsamples); +  void processReplace(long numsamples); +  void setPan1(float value); +  void setLFOFreq1(float value); +  void setDepth1(float value); +  void setPan2(float value); +  void setLFOFreq2(float value); +  void setDepth2(float value); +  void setDryWet(float value);    float	getPan1();    float	getLFOFreq1();    float	getDepth1(); diff --git a/muse/plugins/pandelay/CMakeLists.txt b/muse/plugins/pandelay/CMakeLists.txt new file mode 100644 index 00000000..5ebb08a0 --- /dev/null +++ b/muse/plugins/pandelay/CMakeLists.txt @@ -0,0 +1,33 @@ +#============================================================================= +#  MusE +#  Linux Music Editor +#  $Id:$ +# +#  Copyright (C) 2002-2006 by Werner Schweer and others +# +#  This program is free software; you can redistribute it and/or modify +#  it under the terms of the GNU General Public License version 2. +# +#  This program is distributed in the hope that it will be useful, +#  but WITHOUT ANY WARRANTY; without even the implied warranty of +#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +#  GNU General Public License for more details. +# +#  You should have received a copy of the GNU General Public License +#  along with this program; if not, write to the Free Software +#  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +#============================================================================= + +add_library ( pandelay SHARED +      pandelay.cpp ladspapandelay.cpp pandelaymodel.cpp +      ) + +# tell cmake to name the target pandelay.so instead of +# libpandelay.so +# +set_target_properties (pandelay +      PROPERTIES PREFIX "" +      #COMPILE_FLAGS "-O3" +      ) + +install_targets ( /lib/${MusE_INSTALL_NAME}/plugins pandelay) diff --git a/muse/plugins/pandelay/ladspapandelay.cpp b/muse/plugins/pandelay/ladspapandelay.cpp new file mode 100644 index 00000000..8c1caa20 --- /dev/null +++ b/muse/plugins/pandelay/ladspapandelay.cpp @@ -0,0 +1,95 @@ +//=========================================================================== +// +//    ladspapandelay +// +//    Version 0.0.1 +// +// +// +// +//  Copyright (c) 2006 Nil Geisweiller +// +// +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +// 02111-1307, USA or point your web browser to http://www.gnu.org. +//=========================================================================== + +#include "ladspapandelay.h" + +//--------------------------------------------------------- +//     PanDelay +//--------------------------------------------------------- + +LADSPAPanDelay::LADSPAPanDelay(unsigned long samplerate)  +  : PanDelayModel(samplerate) { +  //TODO init param  +} + +LADSPAPanDelay::~LADSPAPanDelay() { +} + +//--------------------------------------------------------- +//   activate +//--------------------------------------------------------- + +void LADSPAPanDelay::activate() { +  *port[4] = param[0]; +  *port[5] = param[1]; +  *port[6] = param[2]; +  *port[7] = param[3]; +  *port[8] = param[4]; +} + +void LADSPAPanDelay::updateParameters() { +  if (param[0] != *port[4]) { +    param[0] = *port[4]; +    setDelayTime(param[0]); +  } +  if (param[1] != *port[5]) { +    param[1] = *port[5]; +    setFeedback(param[1]); +  } +  if (param[2] != *port[6]) { +    param[2] = *port[6]; +    setPanLFOFreq(param[2]); +  } +  if (param[3] != *port[7]) { +    param[3] = *port[7]; +    setPanLFODepth(param[3]); +  } +  if (param[4] != *port[8]) { +    param[4] = *port[8]; +    setDryWet(param[4]); +  } +} + +//--------------------------------------------------------- +//   processReplace +//--------------------------------------------------------- + +void LADSPAPanDelay::processReplace(long n) { +  updateParameters(); +  PanDelayModel::processReplace(port[0], port[1], port[2], port[3], n); +} + +//--------------------------------------------------------- +//   processMix +//--------------------------------------------------------- + +void LADSPAPanDelay::processMix(long n) { +  updateParameters(); +  PanDelayModel::processMix(port[0], port[1], port[2], port[3], n); +} diff --git a/muse/plugins/pandelay/ladspapandelay.h b/muse/plugins/pandelay/ladspapandelay.h new file mode 100644 index 00000000..1918895c --- /dev/null +++ b/muse/plugins/pandelay/ladspapandelay.h @@ -0,0 +1,55 @@ +//=========================================================================== +// +//    ladspapandelay +// +//    Version 0.0.1 +// +// +// +// +//  Copyright (c) 2006 Nil Geisweiller +// +// +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +// 02111-1307, USA or point your web browser to http://www.gnu.org. +//=========================================================================== + +#ifndef __LADSPAPANDELAY_H +#define __LADSPAPANDELAY_H + +#include "pandelaymodel.h" +#include "../../muse/ladspa.h" + +#define NBRPARAM 5 + +class LADSPAPanDelay : public PanDelayModel { + private: + + public: +  LADSPAPanDelay(unsigned long samplerate); +  ~LADSPAPanDelay(); + +  LADSPA_Data* port[NBRPARAM + 4]; +  float param[NBRPARAM]; + +  void updateParameters(); +  void processMix(long numsamples); +  void processReplace(long numsamples); + +  void activate(); +}; + +#endif diff --git a/muse/plugins/pandelay/pandelay.cpp b/muse/plugins/pandelay/pandelay.cpp new file mode 100644 index 00000000..401e03af --- /dev/null +++ b/muse/plugins/pandelay/pandelay.cpp @@ -0,0 +1,167 @@ +//========================================================= +//  PanDelay for MusE +//   +//  (C) Copyright 2006 Nil Geisweiller +//========================================================= + +#include "ladspapandelay.h" +#include <stdio.h> + +//--------------------------------------------------------- +//   instantiate pandelay +//    Construct a new plugin instance. +//--------------------------------------------------------- + +LADSPA_Handle instantiate(const LADSPA_Descriptor* /*Descriptor*/, +			  unsigned long samplerate) +{ +  return new LADSPAPanDelay(samplerate); +} + +//--------------------------------------------------------- +//   connect PortTo pandelay +//    Connect a port to a data location. +//--------------------------------------------------------- + +void connect(LADSPA_Handle Instance, unsigned long port, +	     LADSPA_Data* data) +{ +  ((LADSPAPanDelay*)Instance)->port[port] = data; +} + +//--------------------------------------------------------- +//   activate +//--------------------------------------------------------- + +void activate(LADSPA_Handle instance) +{ +  ((LADSPAPanDelay*)instance)->activate(); +} + +//--------------------------------------------------------- +//   deactivate +//--------------------------------------------------------- + +void deactivate(LADSPA_Handle /*Instance*/) +{ +} + +//--------------------------------------------------------- +//   run pandelay +//--------------------------------------------------------- + +void run(LADSPA_Handle Instance, unsigned long n) +{ +  ((LADSPAPanDelay*)Instance)->processReplace(n); +} + +//--------------------------------------------------------- +//   runAdding pandelay +//    *ADD* the output to the output buffer. +//--------------------------------------------------------- + +void runAdding(LADSPA_Handle Instance, unsigned long n) +{ +  ((LADSPAPanDelay*)Instance)->processMix(n); +} + +//--------------------------------------------------------- +//   set pandelay RunAddingGain +//--------------------------------------------------------- + +void setGain(LADSPA_Handle /*Instance*/, LADSPA_Data /*Gain*/) +{ +  printf("TEST setGain\n"); +  //      ((LADSPAPanDelay*)Instance)->m_fRunAddingGain = Gain; +} + +//--------------------------------------------------------- +//   cleanup pandelay +//--------------------------------------------------------- + +void cleanup(LADSPA_Handle Instance) +{ +  delete (LADSPAPanDelay*)Instance; +} + +static const char* portNames[] = { +  "Input (Left)", +  "Input (Right)", +  "Output (Left)", +  "Output (Right)", +  "Delay Time (ms)", +  "Feedback", +  "Pan LFO Freq", +  "Pan LFO Depth", +  "Dry/Wet" +}; + +LADSPA_PortDescriptor portDescriptors[] = { +  LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO, +  LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO, +  LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, +  LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO, +  LADSPA_PORT_INPUT  | LADSPA_PORT_CONTROL, +  LADSPA_PORT_INPUT  | LADSPA_PORT_CONTROL, +  LADSPA_PORT_INPUT  | LADSPA_PORT_CONTROL, +  LADSPA_PORT_INPUT  | LADSPA_PORT_CONTROL, +  LADSPA_PORT_INPUT  | LADSPA_PORT_CONTROL +}; + +LADSPA_PortRangeHint portRangeHints[] = { +  { 0, 0.0, 0.0 }, +  { 0, 0.0, 0.0 }, +  { 0, 0.0, 0.0 }, +  { 0, 0.0, 0.0 }, +  { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_DEFAULT_LOW, MINDELAYTIME, MAXDELAYTIME }, +  { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_DEFAULT_HIGH, -1.0, 1.0 }, +  { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_LOGARITHMIC | LADSPA_HINT_DEFAULT_HIGH, MINFREQ, MAXFREQ }, +  { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_DEFAULT_HIGH,  0.0, 1.0 }, +  { LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_DEFAULT_MIDDLE, 0.0, 1.0 } +}; + +LADSPA_Descriptor descriptor = { +  1052, +  "pandelay", +  LADSPA_PROPERTY_HARD_RT_CAPABLE, +  "PanDelay", +  "Nil Geisweiller", +  "GPL", +  NBRPARAM + 4, +  portDescriptors, +  portNames, +  portRangeHints, +  0,                // impl. data +  instantiate, +  connect, +  activate, +  run, +  runAdding, +  setGain, +  deactivate, +  cleanup +}; + +//--------------------------------------------------------- +//   _init +//    called automatically when the plugin library is first +//    loaded. +//--------------------------------------------------------- +void _init() { +} + +//--------------------------------------------------------- +//   _fini +//    called automatically when the library is unloaded. +//--------------------------------------------------------- +void _fini() { +} + +//--------------------------------------------------------- +//   ladspa_descriptor +//    Return a descriptor of the requested plugin type. +//--------------------------------------------------------- +const LADSPA_Descriptor* ladspa_descriptor(unsigned long i) { +  return (i == 0) ? &descriptor : 0; +} + diff --git a/muse/plugins/pandelay/pandelaymodel.cpp b/muse/plugins/pandelay/pandelaymodel.cpp new file mode 100644 index 00000000..b3ce16a7 --- /dev/null +++ b/muse/plugins/pandelay/pandelaymodel.cpp @@ -0,0 +1,142 @@ +//=========================================================================== +// +//    PanDelay, panoramic rotating delay +// +//    version 0.0.1 +// +//    pandelaymodel.cpp +// +// +//  Copyright (c) 2006 Nil Geisweiller +// +// +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +// 02111-1307, USA or point your web browser to http://www.gnu.org. +//=========================================================================== + +#include "pandelaymodel.h" + +PanDelayModel::PanDelayModel(int samplerate) { +  for(int i = 0; i < MAXBUFFERLENGTH; i++) { +    _leftBuffer[i] = 0.0; +    _rightBuffer[i] = 0.0; +  } +  _bufferPointer = 0; +  _inc = 0.0; +  _l = 1.0; +  _r = 1.0; + +  _samplerate = samplerate; +  setPanDelay(); +} + +PanDelayModel::~PanDelayModel() { +} + +void PanDelayModel::setSamplerate(int sr) { +  _samplerate = sr; +  setPanDelay(); +} + +void PanDelayModel::setDelayTime(float dt) { +  if(dt < MINDELAYTIME) _delayTime = MINDELAYTIME; +  else if(dt > MAXDELAYTIME) _delayTime = MAXDELAYTIME; +  else _delayTime = dt; +  setPanDelay(); +} + +void PanDelayModel::setFeedback(float fb) { +  _feedback = fb; +  setPanDelay(); +} + +void PanDelayModel::setPanLFOFreq(float pf) { +  _panLFOFreq = pf; +  setPanDelay(); +} + +void PanDelayModel::setPanLFODepth(float pd) { +  _panLFODepth = pd; +  setPanDelay(); +} + +void PanDelayModel::setDryWet(float dw) { +  _dryWet = dw; +} + +void PanDelayModel::setPanDelay() { +  float numLFOSample = (1.0/_panLFOFreq) * (float)_samplerate; +  _inc = 2.0 / numLFOSample; +  _delaySampleSize = (int)(_delayTime * (float)_samplerate); +  _lBound = 1.0 - _panLFODepth; +  _rBound = 1.0 + _panLFODepth; +} + +void PanDelayModel::processMix(float* leftSamplesIn, float* rightSamplesIn, +			       float* leftSamplesOut, float* rightSamplesOut, +			       unsigned n) { +  float ls, rs, p; +  p = 1.0 - _dryWet; +  for(unsigned i = 0; i < n; i++) { +    //read buffer +    ls = _leftBuffer[_bufferPointer]; +    rs = _rightBuffer[_bufferPointer]; +    //write buffer +    _leftBuffer[_bufferPointer] *= _feedback; +    _leftBuffer[_bufferPointer] += leftSamplesIn[i]; +    _rightBuffer[_bufferPointer] *= _feedback; +    _rightBuffer[_bufferPointer] += rightSamplesIn[i]; +    //write out +    leftSamplesOut[i] += _l * _dryWet * ls + p * leftSamplesIn[i]; +    rightSamplesOut[i] += _r * _dryWet * rs + p * rightSamplesIn[i]; +    //update _bufferPointer +    _bufferPointer++; +    _bufferPointer%=_delaySampleSize; +    //update _l _r +    _r += _inc; +    _l -= _inc; +    //update _inc +    if(_r > _rBound || _r < _lBound) _inc = -_inc; +  } +} + +void PanDelayModel::processReplace(float* leftSamplesIn, float* rightSamplesIn, +				   float* leftSamplesOut, +				   float* rightSamplesOut, unsigned n) { +  float ls, rs, p; +  p = 1.0 - _dryWet; +  for(unsigned i = 0; i < n; i++) { +    //read buffer +    ls = _leftBuffer[_bufferPointer]; +    rs = _rightBuffer[_bufferPointer]; +    //write buffer +    _leftBuffer[_bufferPointer] *= _feedback; +    _leftBuffer[_bufferPointer] += leftSamplesIn[i]; +    _rightBuffer[_bufferPointer] *= _feedback; +    _rightBuffer[_bufferPointer] += rightSamplesIn[i]; +    //write out +    leftSamplesOut[i] = _l * _dryWet * ls + p * leftSamplesIn[i]; +    rightSamplesOut[i] = _r * _dryWet * rs + p * rightSamplesIn[i]; +    //update _bufferPointer +    _bufferPointer++; +    _bufferPointer%=_delaySampleSize; +    //update _l _r +    _r += _inc; +    _l -= _inc; +    //update _inc +    if(_r > _rBound || _r < _lBound) _inc = -_inc; +  } +} diff --git a/muse/plugins/pandelay/pandelaymodel.h b/muse/plugins/pandelay/pandelaymodel.h new file mode 100644 index 00000000..ed4255e2 --- /dev/null +++ b/muse/plugins/pandelay/pandelaymodel.h @@ -0,0 +1,84 @@ +//=========================================================================== +// +//    PanDelay, panoramic rotating delay +// +//    version 0.0.1 +// +//    pandelaymodel.h +// +// +//  Copyright (c) 2006 Nil Geisweiller +// +// +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +// 02111-1307, USA or point your web browser to http://www.gnu.org. +//=========================================================================== + +#ifndef __PANDELAYMODEL_H +#define __PANDELAYMODEL_H + +#include <math.h> + +#define MAXBUFFERLENGTH 192000 +#define MINFREQ 0.1 //in Hz +#define MAXFREQ 10.0 //in Hz +#define MINDELAYTIME 0.01 //in second +#define MAXDELAYTIME 2.0 //in second + +#define NBRPARAM 5 + +class PanDelayModel { + private: +  int _samplerate; + +  float _delayTime; +  float _feedback; +  float _panLFOFreq; +  float _panLFODepth; +  float _dryWet; //0.0 : dry, 1.0 : wet + +  int _delaySampleSize; +  float _lBound; +  float _rBound; +  float _inc; +  float _l; +  float _r; + +  float _leftBuffer[MAXBUFFERLENGTH]; +  float _rightBuffer[MAXBUFFERLENGTH]; +  int _bufferPointer; + + public: +  PanDelayModel(int samplerate); +  ~PanDelayModel(); +   +  void setSamplerate(int sr); +  void setDelayTime(float dt); +  void setFeedback(float dt); +  void setPanLFOFreq(float pf); +  void setPanLFODepth(float pd); +  void setDryWet(float dw); +  void setPanDelay(); + +  void processMix(float* leftInSamples, float* rightInSamples, +		  float* leftOutSamples, float* rightOutSamples, +		  unsigned n); +  void processReplace(float* leftInSamples, float* rightInSamples, +		      float* leftOutSamples, float* rightOutSamples, +		      unsigned n); +}; + +#endif /* __PANDELAYMODEL_H */ diff --git a/muse/synti/deicsonze/CMakeLists.txt b/muse/synti/deicsonze/CMakeLists.txt index 63a88744..6f0d0e4e 100644 --- a/muse/synti/deicsonze/CMakeLists.txt +++ b/muse/synti/deicsonze/CMakeLists.txt @@ -39,7 +39,7 @@ target_link_libraries( deicsonze synti )  #  set_target_properties ( deicsonze      PROPERTIES PREFIX "" -   #COMPILE_FLAGS "-O3 -include ${PROJECT_BINARY_DIR}/all-pic.h" +   #COMPILE_FLAGS "-O2 -include ${PROJECT_BINARY_DIR}/all-pic.h"     COMPILE_FLAGS "-include ${PROJECT_BINARY_DIR}/all-pic.h"     ) diff --git a/muse/synti/deicsonze/deicsonze.cpp b/muse/synti/deicsonze/deicsonze.cpp index dbbba68f..660c41e4 100644 --- a/muse/synti/deicsonze/deicsonze.cpp +++ b/muse/synti/deicsonze/deicsonze.cpp @@ -89,15 +89,21 @@ DeicsOnze::DeicsOnze() : Mess(2) {    tempInputChorus = (float**) malloc(sizeof(float*)*NBRFXINPUTS);    for(int i = 0; i < NBRFXINPUTS; i++)      tempInputChorus[i] = (float*) malloc(sizeof(float*)*MAXFXBUFFERSIZE); -  tempInputReverb = (float**) malloc(sizeof(float*)*NBRFXINPUTS); -  for(int i = 0; i < NBRFXINPUTS; i++) -    tempInputReverb[i] = (float*) malloc(sizeof(float*)*MAXFXBUFFERSIZE);    tempOutputChorus = (float**) malloc(sizeof(float*)*NBRFXOUTPUTS);    for(int i = 0; i < NBRFXOUTPUTS; i++)      tempOutputChorus[i] = (float*) malloc(sizeof(float*)*MAXFXBUFFERSIZE); +  tempInputReverb = (float**) malloc(sizeof(float*)*NBRFXINPUTS); +  for(int i = 0; i < NBRFXINPUTS; i++) +    tempInputReverb[i] = (float*) malloc(sizeof(float*)*MAXFXBUFFERSIZE);    tempOutputReverb = (float**) malloc(sizeof(float*)*NBRFXOUTPUTS);    for(int i = 0; i < NBRFXOUTPUTS; i++)      tempOutputReverb[i] = (float*) malloc(sizeof(float*)*MAXFXBUFFERSIZE); +  tempInputDelay = (float**) malloc(sizeof(float*)*NBRFXINPUTS); +  for(int i = 0; i < NBRFXINPUTS; i++) +    tempInputDelay[i] = (float*) malloc(sizeof(float*)*MAXFXBUFFERSIZE); +  tempOutputDelay = (float**) malloc(sizeof(float*)*NBRFXOUTPUTS); +  for(int i = 0; i < NBRFXOUTPUTS; i++) +    tempOutputDelay[i] = (float*) malloc(sizeof(float*)*MAXFXBUFFERSIZE);    srand(time(0));   // initialize random number generator @@ -123,14 +129,17 @@ DeicsOnze::DeicsOnze() : Mess(2) {    //FX    _pluginIReverb = NULL; -  _pluginIChorus = NULL;    initPluginReverb(plugins.find("freeverb", "freeverb1")); +  _pluginIChorus = NULL;    initPluginChorus(plugins.find("doublechorus", "doublechorus1")); +  _pluginIDelay = NULL; +  initPluginDelay(plugins.find("pandelay", "pandelay"));    //Filter    _dryFilter = new LowFilter();    _chorusFilter = new LowFilter();    _reverbFilter = new LowFilter(); +  _delayFilter = new LowFilter();    //Load configuration    QString defaultConf = (QString(getenv("HOME")) + QString("/." DEICSONZESTR ".dco")); @@ -173,6 +182,13 @@ DeicsOnze::DeicsOnze() : Mess(2) {    dataChorusRet[1]=(unsigned char)getChorusReturn();    MidiEvent evChorusRet(0,ME_SYSEX,(const unsigned char*)dataChorusRet, 2);    _gui->writeEvent(evChorusRet);     +  unsigned char *dataDelayRet = new unsigned char[2]; +  dataDelayRet[0]=SYSEX_DELAYRETURN; +  dataDelayRet[1]=(unsigned char)getDelayReturn(); +  //printf("DELAY RET = %d, REVERB RET = %d\n", +  //getDelayReturn(), getReverbReturn()); +  MidiEvent evDelayRet(0,ME_SYSEX,(const unsigned char*)dataDelayRet, 2); +  _gui->writeEvent(evDelayRet);        //update font size    unsigned char *dataFontSize = new unsigned char[2];    dataFontSize[0]=SYSEX_FONTSIZE; @@ -199,12 +215,16 @@ DeicsOnze::~DeicsOnze()    //dealloc temp buffers chorus and reverb    for(int i = 0; i < NBRFXINPUTS; i++) free(tempInputChorus[i]);    free(tempInputChorus); -  for(int i = 0; i < NBRFXINPUTS; i++) free(tempInputReverb[i]); -  free(tempInputReverb);    for(int i = 0; i < NBRFXOUTPUTS; i++) free(tempOutputChorus[i]);    free(tempOutputChorus); +  for(int i = 0; i < NBRFXINPUTS; i++) free(tempInputReverb[i]); +  free(tempInputReverb);    for(int i = 0; i < NBRFXOUTPUTS; i++) free(tempOutputReverb[i]);    free(tempOutputReverb); +  for(int i = 0; i < NBRFXINPUTS; i++) free(tempInputDelay[i]); +  free(tempInputDelay); +  for(int i = 0; i < NBRFXOUTPUTS; i++) free(tempOutputDelay[i]); +  free(tempOutputDelay);  }  //--------------------------------------------------------- @@ -248,6 +268,7 @@ void DeicsOnze::setSampleRate(int sr) {    _dryFilter->setSamplerate(sr);    _chorusFilter->setSamplerate(sr);    _reverbFilter->setSamplerate(sr); +  _delayFilter->setSamplerate(sr);    setQuality(_global.quality);  } @@ -518,6 +539,8 @@ void DeicsOnze::initGlobal() {    _global.chorusReturn = level2amp(INITFXRETURN);    _global.isReverbActivated = false;    _global.reverbReturn = level2amp(INITFXRETURN); +  _global.isDelayActivated = false; +  _global.delayReturn = level2amp(INITFXRETURN);    initChannels();  } @@ -542,6 +565,7 @@ void DeicsOnze::initChannel(int c) {    _global.channel[c].isLastNote = false;    _global.channel[c].chorusAmount = 0.0;    _global.channel[c].reverbAmount = 0.0; +  _global.channel[c].delayAmount = 0.0;    applyChannelAmp(c);    initVoices(c);  } @@ -748,6 +772,12 @@ void DeicsOnze::setChannelReverb(int c, int r) {  void DeicsOnze::setChannelChorus(int c, int val) {    _global.channel[c].chorusAmount = (float)lowlevel2amp(val);  } +//---------------------------------------------------------------- +// setChannelDelay +//---------------------------------------------------------------- +void DeicsOnze::setChannelDelay(int c, int val) { +  _global.channel[c].delayAmount = (float)lowlevel2amp(val); +}  //----------------------------------------------------------------  // setChorusReturn @@ -764,6 +794,13 @@ void DeicsOnze::setReverbReturn(int val) {  }  //---------------------------------------------------------------- +// setDelayReturn +//---------------------------------------------------------------- +void DeicsOnze::setDelayReturn(int val) { +  _global.delayReturn = 2.0*(float)level2amp(val); //beware MAXFXRETURN==255 +} + +//----------------------------------------------------------------  // getNbrVoices  //----------------------------------------------------------------  int DeicsOnze::getNbrVoices(int c) const { @@ -845,6 +882,12 @@ int DeicsOnze::getChannelChorus(int c) const {    return(amp2lowlevel(_global.channel[c].chorusAmount));  }  //---------------------------------------------------------------- +// getChannelDelay +//---------------------------------------------------------------- +int DeicsOnze::getChannelDelay(int c) const { +  return(amp2lowlevel(_global.channel[c].delayAmount)); +} +//----------------------------------------------------------------  // getChorusReturn  //----------------------------------------------------------------  int DeicsOnze::getChorusReturn() const { @@ -856,6 +899,12 @@ int DeicsOnze::getChorusReturn() const {  int DeicsOnze::getReverbReturn() const {    return(amp2level(_global.reverbReturn/2.0));  } +//---------------------------------------------------------------- +// getReverbReturn +//---------------------------------------------------------------- +int DeicsOnze::getDelayReturn() const { +  return(amp2level(_global.delayReturn/2.0)); +}  //----------------------------------------------------------------  // setLfo @@ -1022,6 +1071,7 @@ void DeicsOnze::setQuality(Quality q) {    _dryFilter->setCutoff(_global.deiSampleRate/4.0);    _reverbFilter->setCutoff(_global.deiSampleRate/4.0);    _chorusFilter->setCutoff(_global.deiSampleRate/4.0); +  _delayFilter->setCutoff(_global.deiSampleRate/4.0);  }  //----------------------------------------------------------------- @@ -2238,6 +2288,7 @@ void DeicsOnze::getInitData(int* length, const unsigned char** data) {      buffer[NUM_CHANNEL_RELEASE + c] = (unsigned char) getChannelRelease(c);      buffer[NUM_CHANNEL_REVERB + c] = (unsigned char) getChannelReverb(c);      buffer[NUM_CHANNEL_CHORUS + c] = (unsigned char) getChannelChorus(c);     +    buffer[NUM_CHANNEL_DELAY + c] = (unsigned char) getChannelDelay(c);          buffer[NUM_CURRENTPROG + c] = (unsigned char) _preset[c]->prog;      buffer[NUM_CURRENTLBANK + c] =        (unsigned char) _preset[c]->_subcategory->_lbank; @@ -2273,6 +2324,7 @@ void DeicsOnze::getInitData(int* length, const unsigned char** data) {  	    MAXSTRLENGTHBACKGROUNDPIXPATH);    }    //FX +  //reverb    buffer[NUM_IS_REVERB_ON]=(unsigned char)_global.isReverbActivated;    buffer[NUM_REVERB_RETURN]=(unsigned char)getReverbReturn();    buffer[NUM_REVERB_PARAM_NBR]= @@ -2283,6 +2335,7 @@ void DeicsOnze::getInitData(int* length, const unsigned char** data) {    strncpy((char*)&buffer[NUM_REVERB_LABEL],  	  _pluginIReverb->plugin()->label().toLatin1().data(),  	  MAXSTRLENGTHFXLABEL); +  //chorus    buffer[NUM_IS_CHORUS_ON]=(unsigned char)_global.isChorusActivated;    buffer[NUM_CHORUS_RETURN]=(unsigned char)getChorusReturn();    buffer[NUM_CHORUS_PARAM_NBR]= @@ -2293,6 +2346,9 @@ void DeicsOnze::getInitData(int* length, const unsigned char** data) {    strncpy((char*)&buffer[NUM_CHORUS_LABEL],  	  _pluginIChorus->plugin()->label().toLatin1().data(),  	  MAXSTRLENGTHFXLABEL); +  //delay +  buffer[NUM_IS_DELAY_ON]=(unsigned char)_global.isDelayActivated; +  buffer[NUM_DELAY_RETURN]=(unsigned char)getDelayReturn();    //save FX parameters    //reverb    for(int i = 0; i < _pluginIReverb->plugin()->parameter(); i++) { @@ -2306,6 +2362,12 @@ void DeicsOnze::getInitData(int* length, const unsigned char** data) {  		   + sizeof(float)*_pluginIReverb->plugin()->parameter()  		   + sizeof(float)*i], &val, sizeof(float));    } +  //delay +  buffer[NUM_DELAY_TIME] = (unsigned char)getDelayTime(); +  buffer[NUM_DELAY_FEEDBACK] = (unsigned char)getDelayFeedback(); +  buffer[NUM_DELAY_LFO_FREQ] = (unsigned char)getDelayLFOFreq(); +  buffer[NUM_DELAY_LFO_DEPTH] = (unsigned char)getDelayLFODepth(); +    //save set data    for(int i = NUM_CONFIGLENGTH  	+ sizeof(float)*_pluginIReverb->plugin()->parameter() @@ -2402,6 +2464,12 @@ void DeicsOnze::parseInitData(int length, const unsigned char* data) {  	evChChorus(0, c, ME_CONTROLLER,  		   CTRL_CHORUS_SEND, data[NUM_CHANNEL_CHORUS + c]);        _gui->writeEvent(evChChorus);       +      //channel delay +      setChannelDelay(c, data[NUM_CHANNEL_DELAY + c]); +      MidiEvent  +	evChDelay(0, c, ME_CONTROLLER, +		  CTRL_VARIATION_SEND, data[NUM_CHANNEL_DELAY + c]); +      _gui->writeEvent(evChDelay);            }      //load configuration      _saveConfig = (bool)data[NUM_SAVECONFIG]; @@ -2533,6 +2601,49 @@ void DeicsOnze::parseInitData(int length, const unsigned char* data) {      MidiEvent evSysexBuildCho(0,ME_SYSEX,  			      (const unsigned char*)&dataBuildCho, 1);      _gui->writeEvent(evSysexBuildCho); +    //delay +    _global.isDelayActivated = (bool)data[NUM_IS_DELAY_ON]; +    unsigned char *dataDelayAct = new unsigned char[2]; +    dataDelayAct[0]=SYSEX_DELAYACTIV; +    dataDelayAct[1]=(unsigned char)_global.isDelayActivated; +    MidiEvent evDelayAct(0,ME_SYSEX,(const unsigned char*)dataDelayAct, 2); +    _gui->writeEvent(evDelayAct);     +    setDelayReturn((int)data[NUM_DELAY_RETURN]); +    unsigned char *dataDelayRet = new unsigned char[2]; +    dataDelayRet[0]=SYSEX_DELAYRETURN; +    dataDelayRet[1]=(unsigned char)getDelayReturn(); +    MidiEvent evDelayRet(0,ME_SYSEX,(const unsigned char*)dataDelayRet, 2); +    _gui->writeEvent(evDelayRet);     +    //initPluginDelay(plugins.find("pandelay", "pandelay")); +    setDelayTime((int)data[NUM_DELAY_TIME]); +    char dataDelayTime[2]; +    dataDelayTime[0] = SYSEX_DELAYTIME; +    dataDelayTime[1] = (unsigned char)getDelayTime(); +    MidiEvent evSysexDelayTime(0,ME_SYSEX, +			       (const unsigned char*)dataDelayTime, 2); +    _gui->writeEvent(evSysexDelayTime); +    setDelayFeedback((int)data[NUM_DELAY_FEEDBACK]); +    char dataDelayFeedback[2]; +    dataDelayFeedback[0] = SYSEX_DELAYFEEDBACK; +    dataDelayFeedback[1] = (unsigned char)getDelayFeedback(); +    MidiEvent evSysexDelayFeedback(0,ME_SYSEX, +				   (const unsigned char*)dataDelayFeedback, 2); +    _gui->writeEvent(evSysexDelayFeedback); +    setDelayLFOFreq((int)data[NUM_DELAY_LFO_FREQ]); +    char dataDelayLFOFreq[2]; +    dataDelayLFOFreq[0] = SYSEX_DELAYLFOFREQ; +    dataDelayLFOFreq[1] = (unsigned char)getDelayLFOFreq(); +    MidiEvent evSysexDelayLFOFreq(0,ME_SYSEX, +				  (const unsigned char*)dataDelayLFOFreq, 2); +    _gui->writeEvent(evSysexDelayLFOFreq); +    setDelayLFODepth((int)data[NUM_DELAY_LFO_DEPTH]); +    char dataDelayLFODepth[2]; +    dataDelayLFODepth[0] = SYSEX_DELAYLFODEPTH; +    dataDelayLFODepth[1] = (unsigned char)getDelayLFODepth(); +    MidiEvent evSysexDelayLFODepth(0,ME_SYSEX, +				   (const unsigned char*)dataDelayLFODepth, 2); +    _gui->writeEvent(evSysexDelayLFODepth); +          //load set      FILE* tmp;      char* tmpname; @@ -2750,6 +2861,13 @@ bool DeicsOnze::sysex(int length, const unsigned char* data, bool fromGui) {        _gui->writeEvent(evSysex);      }      break;        +  case SYSEX_DELAYACTIV: +    _global.isDelayActivated = (bool)data[1]; +    if(!fromGui) { +      MidiEvent evSysex(0, ME_SYSEX, data, length); +      _gui->writeEvent(evSysex); +    } +    break;    case SYSEX_CHORUSRETURN:      setChorusReturn((int)data[1]);      if(!fromGui) { @@ -2764,6 +2882,13 @@ bool DeicsOnze::sysex(int length, const unsigned char* data, bool fromGui) {        _gui->writeEvent(evSysex);      }      break; +  case SYSEX_DELAYRETURN: +    setDelayReturn((int)data[1]); +    if(!fromGui) { +      MidiEvent evSysex(0, ME_SYSEX, data, length); +      _gui->writeEvent(evSysex); +    } +    break;    case SYSEX_SELECTREVERB:      Plugin* pluginReverb;      memcpy(&pluginReverb, &data[1], sizeof(Plugin*)); @@ -2774,6 +2899,34 @@ bool DeicsOnze::sysex(int length, const unsigned char* data, bool fromGui) {      memcpy(&pluginChorus, &data[1], sizeof(Plugin*));      initPluginChorus(pluginChorus);      break; +  case SYSEX_DELAYTIME: +    setDelayTime((int)data[1]); +    if(!fromGui) { +      MidiEvent evSysex(0, ME_SYSEX, data, length); +      _gui->writeEvent(evSysex); +    } +    break;     +  case SYSEX_DELAYFEEDBACK: +    setDelayFeedback((int)data[1]); +    if(!fromGui) { +      MidiEvent evSysex(0, ME_SYSEX, data, length); +      _gui->writeEvent(evSysex); +    } +    break;     +  case SYSEX_DELAYLFOFREQ: +    setDelayLFOFreq((int)data[1]); +    if(!fromGui) { +      MidiEvent evSysex(0, ME_SYSEX, data, length); +      _gui->writeEvent(evSysex); +    } +    break;     +  case SYSEX_DELAYLFODEPTH: +    setDelayLFODepth((int)data[1]); +    if(!fromGui) { +      MidiEvent evSysex(0, ME_SYSEX, data, length); +      _gui->writeEvent(evSysex); +    } +    break;        default:      break;    } @@ -3359,6 +3512,13 @@ bool DeicsOnze::setController(int ch, int ctrl, int val, bool fromGui) {  	_gui->writeEvent(ev);        }        break; +    case CTRL_VARIATION_SEND: +      setChannelDelay(ch, val); +      if(!fromGui) { +	MidiEvent ev(0,ch, ME_CONTROLLER, CTRL_VARIATION_SEND, val); +	_gui->writeEvent(ev); +      } +      break;      case CTRL_SUSTAIN:        setSustain(ch, val);        break; @@ -3792,6 +3952,8 @@ void DeicsOnze::process(float** buffer, int offset, int n) {        _global.lastInputRightChorusSample = 0.0;        _global.lastInputLeftReverbSample = 0.0;        _global.lastInputRightReverbSample = 0.0; +      _global.lastInputLeftDelaySample = 0.0; +      _global.lastInputRightDelaySample = 0.0;        //per channel        for(int c = 0; c < NBRCHANNELS; c++) {  	tempChannelOutput = 0.0; @@ -4054,6 +4216,12 @@ void DeicsOnze::process(float** buffer, int offset, int n) {  	    _global.lastInputRightReverbSample += tempChannelRightOutput *  	      _global.channel[c].reverbAmount;  	  } +	  if(_global.isDelayActivated) { +	    _global.lastInputLeftDelaySample += tempChannelLeftOutput * +	      _global.channel[c].delayAmount; +	    _global.lastInputRightDelaySample += tempChannelRightOutput * +	      _global.channel[c].delayAmount; +	  }  	  tempLeftOutput += tempChannelLeftOutput;  	  tempRightOutput += tempChannelRightOutput;  	} @@ -4072,6 +4240,10 @@ void DeicsOnze::process(float** buffer, int offset, int n) {        tempInputReverb[0][i] = _global.lastInputLeftReverbSample;        tempInputReverb[1][i] = _global.lastInputRightReverbSample;      }     +    if(_global.isDelayActivated) { +      tempInputDelay[0][i] = _global.lastInputLeftDelaySample; +      tempInputDelay[1][i] = _global.lastInputRightDelaySample; +    }          _global.qualityCounter++;      _global.qualityCounter %= _global.qualityCounterTop; @@ -4097,7 +4269,7 @@ void DeicsOnze::process(float** buffer, int offset, int n) {      //apply Filter      if(_global.filter) _reverbFilter->process(tempOutputReverb[0],  					      tempOutputReverb[1], n); -    //apply Chorus +    //apply Reverb      _pluginIReverb->apply(n, 2, tempInputReverb, tempOutputReverb);      for(int i = 0; i < n; i++) {        leftOutput[i] += @@ -4106,6 +4278,20 @@ void DeicsOnze::process(float** buffer, int offset, int n) {  	tempOutputReverb[1][i] * _global.reverbReturn * _global.masterVolume;      }    } +  //Delay +  if(_global.isDelayActivated) { +    //apply Filter +    if(_global.filter) _delayFilter->process(tempOutputDelay[0], +					     tempOutputDelay[1], n); +    //apply Delay +    _pluginIDelay->apply(n, 2, tempInputDelay, tempOutputDelay); +    for(int i = 0; i < n; i++) { +      leftOutput[i] += +	tempOutputDelay[0][i] * _global.delayReturn * _global.masterVolume; +      rightOutput[i] += +	tempOutputDelay[1][i] * _global.delayReturn * _global.masterVolume; +    } +  }  } diff --git a/muse/synti/deicsonze/deicsonze.h b/muse/synti/deicsonze/deicsonze.h index 6102eb34..4bc49b16 100644 --- a/muse/synti/deicsonze/deicsonze.h +++ b/muse/synti/deicsonze/deicsonze.h @@ -149,6 +149,13 @@  #define SYSEX_BUILDGUICHORUS 85  #define SYSEX_FILTER 90  #define FILTERSTR "Filter" +#define SYSEX_DELAYACTIV 91 +#define SYSEX_DELAYRETURN 92 +#define SYSEX_DELAYTIME 93 +#define SYSEX_DELAYFEEDBACK 94 +#define SYSEX_DELAYLFOFREQ 95 +#define SYSEX_DELAYLFODEPTH 96 +  //REVERB PARAMETERS  #define DEFAULTVOL 200 @@ -165,7 +172,8 @@ enum {    NUM_CHANNEL_RELEASE = NUM_CHANNEL_ATTACK + NBRCHANNELS + 1,    NUM_CHANNEL_REVERB = NUM_CHANNEL_RELEASE + NBRCHANNELS + 1,    NUM_CHANNEL_CHORUS = NUM_CHANNEL_REVERB + NBRCHANNELS + 1,   -  NUM_CURRENTPROG = NUM_CHANNEL_CHORUS + NBRCHANNELS + 1, +  NUM_CHANNEL_DELAY = NUM_CHANNEL_CHORUS + NBRCHANNELS + 1, +  NUM_CURRENTPROG = NUM_CHANNEL_DELAY + NBRCHANNELS + 1,    NUM_CURRENTLBANK = NUM_CURRENTPROG + NBRCHANNELS + 1,    NUM_CURRENTHBANK = NUM_CURRENTLBANK + NBRCHANNELS + 1,    NUM_NBRVOICES  = NUM_CURRENTHBANK + NBRCHANNELS + 1, @@ -200,7 +208,13 @@ enum {    NUM_CHORUS_PARAM_NBR,    NUM_CHORUS_LIB,    NUM_CHORUS_LABEL = NUM_CHORUS_LIB + MAXSTRLENGTHFXLIB + 1, -  NUM_CONFIGLENGTH = NUM_CHORUS_LABEL + MAXSTRLENGTHFXLABEL + 1 +  NUM_IS_DELAY_ON = NUM_CHORUS_LABEL + MAXSTRLENGTHFXLABEL + 1, +  NUM_DELAY_RETURN, +  NUM_DELAY_TIME, +  NUM_DELAY_FEEDBACK, +  NUM_DELAY_LFO_FREQ, +  NUM_DELAY_LFO_DEPTH, +  NUM_CONFIGLENGTH = NUM_DELAY_LFO_DEPTH + 1  };  class DeicsOnzeGui; @@ -370,6 +384,7 @@ struct Channel {    //FX    float chorusAmount; //between 0.0 and 1.0    float reverbAmount; //between 0.0 and 1.0 +  float delayAmount; //between 0.0 and 1.0  };  //--------------------------------------------------------- @@ -396,11 +411,15 @@ struct Global {    float lastInputRightChorusSample;    float lastInputLeftReverbSample;    float lastInputRightReverbSample; +  float lastInputLeftDelaySample; +  float lastInputRightDelaySample;    Channel channel[NBRCHANNELS];    bool isChorusActivated;    float chorusReturn;    bool isReverbActivated;    float reverbReturn; +  bool isDelayActivated; +  float delayReturn;  };  //--------------------------------------------------------- @@ -419,9 +438,11 @@ class DeicsOnze : public Mess {   public:    float** tempInputChorus; -  float** tempInputReverb;    float** tempOutputChorus; +  float** tempInputReverb;    float** tempOutputReverb; +  float** tempInputDelay; +  float** tempOutputDelay;    float* getSinusWaveTable(); @@ -441,19 +462,31 @@ class DeicsOnze : public Mess {    //FX    PluginI* _pluginIReverb;    PluginI* _pluginIChorus; +  PluginI* _pluginIDelay;    void initPluginReverb(Plugin*);    void initPluginChorus(Plugin*); +  void initPluginDelay(Plugin*);    void setReverbParam(int i, double val); -  void setChorusParam(int i, double val);    double getReverbParam(int i); +  void setChorusParam(int i, double val);    double getChorusParam(int i); +  void setDelayTime(int val); //0-255 +  void setDelayFeedback(int val); //0-255 +  void setDelayLFOFreq(int val); //0-255 +  void setDelayLFODepth(int val); //0-255 +  void setDelayDryWet(int val); //0-255 +  int getDelayTime(); +  int getDelayFeedback(); +  int getDelayLFOFreq(); +  int getDelayLFODepth();    //Filter    LowFilter* _dryFilter;    LowFilter* _chorusFilter;    LowFilter* _reverbFilter; +  LowFilter* _delayFilter;    mutable MidiPatch _patch;    mutable int _numPatchProg; //used by getPatchInfo @@ -507,8 +540,10 @@ class DeicsOnze : public Mess {    void setChannelRelease(int c, int r);    void setChannelReverb(int c, int r);    void setChannelChorus(int c, int val); +  void setChannelDelay(int c, int val);    void setChorusReturn(int val);    void setReverbReturn(int val); +  void setDelayReturn(int val);    bool getChannelEnable(int c) const;    int getNbrVoices(int c) const;    int getMasterVol(void) const; @@ -522,8 +557,10 @@ class DeicsOnze : public Mess {    int getChannelRelease(int c) const;    int getChannelReverb(int c) const;    int getChannelChorus(int c) const; +  int getChannelDelay(int c) const;    int getChorusReturn(void) const;    int getReverbReturn(void) const; +  int getDelayReturn(void) const;    void setPitchBendCoef(int c, int val);    void setModulation(int c, int val); //TODO check between setChannelModulation    void setSustain(int c, int val); diff --git a/muse/synti/deicsonze/deicsonzegui.cpp b/muse/synti/deicsonze/deicsonzegui.cpp index 25089b75..364ba5c2 100644 --- a/muse/synti/deicsonze/deicsonzegui.cpp +++ b/muse/synti/deicsonze/deicsonzegui.cpp @@ -32,6 +32,7 @@  #include "config.h"  #include "plugin.h"  #include "plugingui.h" +#include "plugins/pandelay/pandelaymodel.h"  #include "deicsonzegui.h" @@ -216,8 +217,8 @@ DeicsOnzeGui::DeicsOnzeGui(DeicsOnze* deicsOnze)  	  this, SLOT(setLfoAmpSens(int)));    connect(transposeSlider, SIGNAL(valueChanged(int)),  	  this, SLOT(setTranspose(int))); -  connect(channelDetuneSlider, SIGNAL(valueChanged(int)), -	  this, SLOT(setChannelDetune(int))); +  //connect(channelDetuneSlider, SIGNAL(valueChanged(int)), +  //  this, SLOT(setChannelDetune(int)));    connect(algorithmComboBox, SIGNAL(activated(int)),  	  this, SLOT(setAlgorithm(int)));    connect(pitchBendRangeSlider, SIGNAL(valueChanged(int)), @@ -256,8 +257,8 @@ DeicsOnzeGui::DeicsOnzeGui(DeicsOnze* deicsOnze)  	  this, SLOT(setAtPitchBias(int)));    connect(atEgBiasSpinBox, SIGNAL(valueChanged(int)),  	  this, SLOT(setAtEgBias(int))); -  connect(reverbSpinBox, SIGNAL(valueChanged(int)), -	  this, SLOT(setReverbRate(int))); +  //connect(reverbSpinBox, SIGNAL(valueChanged(int)), +  //  this, SLOT(setReverbRate(int)));    connect(polyMonoComboBox, SIGNAL(activated(int)),  	  this, SLOT(setPolyMode(int)));    connect(PortFingerFullComboBox, SIGNAL(activated(int)), @@ -355,6 +356,29 @@ DeicsOnzeGui::DeicsOnzeGui(DeicsOnze* deicsOnze)  	  this, SLOT(setWaveForm3(int)));    connect(WaveForm4ComboBox, SIGNAL(activated(int)),  	  this, SLOT(setWaveForm4(int))); +  //PanDelay +  connect(delayActivCheckBox, SIGNAL(toggled(bool)), this,  +	  SLOT(setActivDelay(bool))); +  connect(delayReturnSlider, SIGNAL(valueChanged(int)), this, +	  SLOT(setDelayReturn(int))); +  connect(chDelaySlider, SIGNAL(valueChanged(int)), this, +	  SLOT(setChannelDelay(int))); +  connect(delayTimeSlider, SIGNAL(valueChanged(int)), this, +	  SLOT(setDelayTime(int))); +  connect(delayTimeFloatentry, SIGNAL(valueChanged(double, int)), this, +	  SLOT(setDelayTime(double))); +  connect(delayFeedbackSlider, SIGNAL(valueChanged(int)), this, +	  SLOT(setDelayFeedback(int))); +  connect(delayFeedbackFloatentry, SIGNAL(valueChanged(double, int)), this, +	  SLOT(setDelayFeedback(double))); +  connect(delayPanLFOFreqSlider, SIGNAL(valueChanged(int)), this, +	  SLOT(setDelayPanLFOFreq(int))); +  connect(delayPanLFOFreqFloatentry, SIGNAL(valueChanged(double, int)), this, +	  SLOT(setdelayPanLFOFreq(double))); +  connect(delayPanLFODepthSlider, SIGNAL(valueChanged(int)), this, +	  SLOT(setDelayPanLFODepth(int))); +  connect(delayPanLFODepthFloatentry, SIGNAL(valueChanged(double, int)), this, +	  SLOT(setDelayPanLFODepth(double)));    //category subcategory preset    connect(categoryListView,  	  SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), @@ -783,10 +807,10 @@ void DeicsOnzeGui::setTextColor(const QColor & c) {    DetWaveEGS4GroupBox->setPalette(p);    sensitivity4groupBox->setPalette(p);    transposeGroupBox->setPalette(p); -  detuneGroupBox->setPalette(p); -  footSWGroupBox->setPalette(p); +  //detuneGroupBox->setPalette(p); +  //footSWGroupBox->setPalette(p);    pitchBendRangeGroupBox->setPalette(p); -  reverbGroupBox->setPalette(p); +  //reverbGroupBox->setPalette(p);    modeGroupBox->setPalette(p);    portamentoGroupBox->setPalette(p);    colorGroupBox->setPalette(p); @@ -803,6 +827,12 @@ void DeicsOnzeGui::setTextColor(const QColor & c) {    channelChorusGroupBox->setPalette(p);    parametersChorusGroupBox->setPalette(p);    fontSizeGroupBox->setPalette(p); +  delayTimeGroupBox->setPalette(p); +  delayFeedbackGroupBox->setPalette(p); +  delayPanLFOGroupBox->setPalette(p); +  delayPanDepthGroupBox->setPalette(p); +  delayReturnGroupBox->setPalette(p); +  channelDelayGroupBox->setPalette(p);  }  void DeicsOnzeGui::setBackgroundColor(const QColor & c) { @@ -848,10 +878,10 @@ void DeicsOnzeGui::setEditTextColor(const QColor & c) {    DetWaveEGS4GroupBox->setPalette(p);    sensitivity4groupBox->setPalette(p);    transposeGroupBox->setPalette(p); -  detuneGroupBox->setPalette(p); -  footSWGroupBox->setPalette(p); +  //detuneGroupBox->setPalette(p); +  //footSWGroupBox->setPalette(p);    pitchBendRangeGroupBox->setPalette(p); -  reverbGroupBox->setPalette(p); +  //reverbGroupBox->setPalette(p);    modeGroupBox->setPalette(p);    portamentoGroupBox->setPalette(p);    colorGroupBox->setPalette(p); @@ -910,10 +940,10 @@ void DeicsOnzeGui::setEditBackgroundColor(const QColor & c) {    DetWaveEGS4GroupBox->setPalette(p);    sensitivity4groupBox->setPalette(p);    transposeGroupBox->setPalette(p); -  detuneGroupBox->setPalette(p); -  footSWGroupBox->setPalette(p); +  //detuneGroupBox->setPalette(p); +  //footSWGroupBox->setPalette(p);    pitchBendRangeGroupBox->setPalette(p); -  reverbGroupBox->setPalette(p); +  //reverbGroupBox->setPalette(p);    modeGroupBox->setPalette(p);    portamentoGroupBox->setPalette(p);    colorGroupBox->setPalette(p); @@ -1401,7 +1431,7 @@ void DeicsOnzeGui::processEvent(const MidiEvent& ev) {        case CTRL_FIXRANGE+3*DECAPAR2: updateFIXRANGE(3, val); break;        case CTRL_OSW+3*DECAPAR2: updateOSW(3, val); break;        case CTRL_SHFT+3*DECAPAR2: updateSHFT(3, val); break; -      case CTRL_REVERBRATE: updateReverbRate(val); break; +      case CTRL_REVERBRATE: /*updateReverbRate(val);*/ break;        case CTRL_FCPITCH: updateFcPitch(val); break;        case CTRL_FCAMPLITUDE: updateFcAmplitude(val); break;        case CTRL_CHANNELENABLE: @@ -1416,6 +1446,7 @@ void DeicsOnzeGui::processEvent(const MidiEvent& ev) {        case CTRL_RELEASE_TIME: updateRelease(val); break;        case CTRL_CHORUS_SEND: updateChannelChorus(val); break;        case CTRL_REVERB_SEND: updateChannelReverb(val); break; +      case CTRL_VARIATION_SEND: updateChannelDelay(val); break;        case CTRL_MODULATION: updateModulation(val); break;        case CTRL_PROGRAM :	  	int hbank = (val & 0xff0000) >> 16; @@ -1473,6 +1504,24 @@ void DeicsOnzeGui::processEvent(const MidiEvent& ev) {      case SYSEX_CHORUS2DEPTH :        updateDepthChorus2((int)data[1]);        break;*/ +    case SYSEX_DELAYACTIV : +      updateDelayActiv((bool)data[1]); +      break; +    case SYSEX_DELAYRETURN : +      updateDelayReturn((int)data[1]); +      break; +    case SYSEX_DELAYTIME : +      updateDelayTime((int) data[1]); +      break; +    case SYSEX_DELAYFEEDBACK : +      updateDelayFeedback((int) data[1]); +      break; +    case SYSEX_DELAYLFOFREQ : +      updateDelayPanLFOFreq((int) data[1]); +      break; +    case SYSEX_DELAYLFODEPTH : +      updateDelayPanLFODepth((int) data[1]); +      break;      case SYSEX_QUALITY :        updateQuality((int)data[1]);        break; @@ -2541,7 +2590,8 @@ void DeicsOnzeGui::setModulationKnob(double val) {  		 (int)(val*(double)MAXMODULATION));  }  void DeicsOnzeGui::setDetuneKnob(double val) { -  channelDetuneSlider->setValue((int)((2.0*val-1.0)*(double)MAXCHANNELDETUNE)); +  //channelDetuneSlider->setValue((int)((2.0*val-1.0)*(double)MAXCHANNELDETUNE)); +  setChannelDetune((int)((2.0*val-1.0)*(double)MAXCHANNELDETUNE));  }  void DeicsOnzeGui::setAttackKnob(double val) {    sendController(_currentChannel, CTRL_ATTACK_TIME, @@ -2935,6 +2985,86 @@ void DeicsOnzeGui::setWaveForm4(int w) {      sendController(_currentChannel, CTRL_OSW+3*DECAPAR2, w);  }  //-------------------------------------------------------------- +// set delay +//-------------------------------------------------------------- +void DeicsOnzeGui::setActivDelay(bool a) { +  unsigned char* message = new unsigned char[2]; +  message[0]=SYSEX_DELAYACTIV; +  message[1]=(unsigned char)a; +  sendSysex(message, 2); +} +void DeicsOnzeGui::setDelayReturn(int r) { +  unsigned char* message = new unsigned char[2]; +  message[0]=SYSEX_DELAYRETURN; +  message[1]=(unsigned char)r; +  sendSysex(message, 2); +} +void DeicsOnzeGui::setChannelDelay(int d) { +  sendController(_currentChannel, CTRL_VARIATION_SEND, (unsigned char)d); +} +void DeicsOnzeGui::setDelayTime(int t) { +  unsigned char* message = new unsigned char[2]; +  message[0]=SYSEX_DELAYTIME; +  message[1]=(unsigned char)t; +  sendSysex(message, 2); +  updateDelayTime(t); +} +void DeicsOnzeGui::setDelayTime(double t) { +  int it = (int)(((t - MINDELAYTIME) / (MAXDELAYTIME - MINDELAYTIME))*255.0); +  unsigned char* message = new unsigned char[2]; +  message[0]=SYSEX_DELAYTIME; +  message[1]=(unsigned char)it; +  sendSysex(message, 2); +  updateDelayTime(it); +}  +void DeicsOnzeGui::setDelayFeedback(int f) { +  unsigned char* message = new unsigned char[2]; +  message[0]=SYSEX_DELAYFEEDBACK; +  message[1]=(unsigned char)f; +  sendSysex(message, 2); +  updateDelayFeedback(f); +} +void DeicsOnzeGui::setDelayFeedback(double f) { +  int idf = (int)(f*128.0+128.0); +  unsigned char* message = new unsigned char[2]; +  message[0]=SYSEX_DELAYFEEDBACK; +  message[1]=(unsigned char)idf; +  sendSysex(message, 2); +  updateDelayFeedback(idf); +} +void DeicsOnzeGui::setDelayPanLFOFreq(int pf) { +  unsigned char* message = new unsigned char[2]; +  message[0]=SYSEX_DELAYLFOFREQ; +  message[1]=(unsigned char)pf; +  sendSysex(message, 2); +  updateDelayPanLFOFreq(pf); +} +void DeicsOnzeGui::setDelayPanLFOFreq(double pf) { +  int ipf = (int)(((pf - MINFREQ) / (MAXFREQ - MINFREQ))*255.0); +  unsigned char* message = new unsigned char[2]; +  message[0]=SYSEX_DELAYLFOFREQ; +  message[1]=(unsigned char)ipf; +  sendSysex(message, 2); +  updateDelayPanLFOFreq(ipf); +} +void DeicsOnzeGui::setDelayPanLFODepth(int pd) { +  unsigned char* message = new unsigned char[2]; +  message[0]=SYSEX_DELAYLFODEPTH; +  message[1]=(unsigned char)pd; +  sendSysex(message, 2); +  updateDelayPanLFODepth(pd); +} +void DeicsOnzeGui::setDelayPanLFODepth(double pd) { +  int ipd = (int)(pd*255.0); +  unsigned char* message = new unsigned char[2]; +  message[0]=SYSEX_DELAYLFODEPTH; +  message[1]=(unsigned char)ipd; +  sendSysex(message, 2); +  updateDelayPanLFODepth(ipd); +} + + +//--------------------------------------------------------------  // setSet  //  Display the set, that is the category list  //-------------------------------------------------------------- @@ -3039,6 +3169,8 @@ void DeicsOnzeGui::setEnabledPreset(bool b) {      Op3Tab->setEnabled(b);      Op4Tab->setEnabled(b);      FunctionsTab->setEnabled(b); +    chorusTab->setEnabled(b); +    reverbTab->setEnabled(b);      _enabledPreset=b;    } @@ -3163,6 +3295,60 @@ void DeicsOnzeGui::updateLadspaChorusLineEdit(QString s) {    selectLadspaChorusLineEdit->blockSignals(false);  } +void DeicsOnzeGui::updateDelayActiv(bool a) { +  delayActivCheckBox->blockSignals(true); +  delayActivCheckBox->setChecked(a);		 +  delayActivCheckBox->blockSignals(false); +} +void DeicsOnzeGui::updateChannelDelay(int r) { +  chDelaySlider->blockSignals(true); +  chDelaySlider->setValue(r); +  chDelaySlider->blockSignals(false); +  chDelaySpinBox->blockSignals(true); +  chDelaySpinBox->setValue(r); +  chDelaySpinBox->blockSignals(false); +} +void DeicsOnzeGui::updateDelayReturn(int r) { +  delayReturnSlider->blockSignals(true); +  delayReturnSlider->setValue(r); +  delayReturnSlider->blockSignals(false); +} +void DeicsOnzeGui::updateDelayPanLFOFreq(int plf) { +  delayPanLFOFreqSlider->blockSignals(true); +  delayPanLFOFreqSlider->setValue(plf); +  delayPanLFOFreqSlider->blockSignals(false); +  delayPanLFOFreqFloatentry->blockSignals(true); +  delayPanLFOFreqFloatentry->setValue(MINFREQ + (MAXFREQ - MINFREQ) +				      *((float)plf/255.0)); +  delayPanLFOFreqFloatentry->blockSignals(false); +} +void DeicsOnzeGui::updateDelayTime(int dt) { +  delayTimeSlider->blockSignals(true); +  delayTimeSlider->setValue(dt); +  delayTimeSlider->blockSignals(false); +  delayTimeFloatentry->blockSignals(true); +  delayTimeFloatentry->setValue(MINDELAYTIME + +				(MAXDELAYTIME - MINDELAYTIME) +				*((float)dt/255.0)); +  delayTimeFloatentry->blockSignals(false); +} +void DeicsOnzeGui::updateDelayFeedback(int df) { +  delayFeedbackSlider->blockSignals(true); +  delayFeedbackSlider->setValue(df); +  delayFeedbackSlider->blockSignals(false); +  delayFeedbackFloatentry->blockSignals(true); +  delayFeedbackFloatentry->setValue((float)(df - 128)/128.0); +  delayFeedbackFloatentry->blockSignals(false); +} +void DeicsOnzeGui::updateDelayPanLFODepth(int dpd) { +  delayPanLFODepthSlider->blockSignals(true); +  delayPanLFODepthSlider->setValue(dpd); +  delayPanLFODepthSlider->blockSignals(false); +  delayPanLFODepthFloatentry->blockSignals(true); +  delayPanLFODepthFloatentry->setValue((float)dpd/255.0); +  delayPanLFODepthFloatentry->blockSignals(false); +} +  void DeicsOnzeGui::applyFontSize(int fs) {    QFont f = font();    f.setPointSize(fs); @@ -3317,14 +3503,14 @@ void DeicsOnzeGui::updateAtEgBias(int val) {    atEgBiasSlider->setValue(val);    atEgBiasSlider->blockSignals(false);  } -void DeicsOnzeGui::updateReverbRate(int val) { -  reverbSpinBox->blockSignals(true); -  reverbSpinBox->setValue(val); -  reverbSpinBox->blockSignals(false); -  reverbSlider->blockSignals(true); -  reverbSlider->setValue(val); -  reverbSlider->blockSignals(false); -} +//void DeicsOnzeGui::updateReverbRate(int val) { +  //reverbSpinBox->blockSignals(true); +  //reverbSpinBox->setValue(val); +  //reverbSpinBox->blockSignals(false); +  //reverbSlider->blockSignals(true); +  //reverbSlider->setValue(val); +  //reverbSlider->blockSignals(false); +//}  //Envelope  void DeicsOnzeGui::updateAR(int op, int val) {      Eg* _eg=&(_deicsOnze->_preset[_currentChannel]->eg[op]); @@ -3910,7 +4096,7 @@ void DeicsOnzeGui::updateFIXRANGE(int op, int val) {  	case 0:  	    Freq1SpinBox->blockSignals(true);  	    Freq1SpinBox->setValue(val/100); -                         //val/100 because it is still a coarse display +	    //val/100 because it is still a coarse display  	    Freq1SpinBox->blockSignals(false);  	    break;  	case 1: @@ -3983,21 +4169,21 @@ void DeicsOnzeGui::updateSHFT(int op, int val) {  }  void DeicsOnzeGui::updateChannelDetune(int val) {    updateChannelDetuneKnob(val); -  updateChannelDetuneSlider(val); +  //updateChannelDetuneSlider(val);  }  void DeicsOnzeGui::updateChannelDetuneKnob(int val) {    detuneKnob->blockSignals(true);    detuneKnob->setValue((((double)val)/((double)MAXCHANNELDETUNE))/2.0+0.5);    detuneKnob->blockSignals(false);  } -void DeicsOnzeGui::updateChannelDetuneSlider(int val) { -  channelDetuneSlider->blockSignals(true); -  channelDetuneSlider->setValue(val); -  channelDetuneSlider->blockSignals(false); -  channelDetuneSpinBox->blockSignals(true); -  channelDetuneSpinBox->setValue(val); -  channelDetuneSpinBox->blockSignals(false); -} +//void DeicsOnzeGui::updateChannelDetuneSlider(int val) { +  //channelDetuneSlider->blockSignals(true); +  //channelDetuneSlider->setValue(val); +  //channelDetuneSlider->blockSignals(false); +  //channelDetuneSpinBox->blockSignals(true); +  //channelDetuneSpinBox->setValue(val); +  //channelDetuneSpinBox->blockSignals(false); +//}  void DeicsOnzeGui::updateChannelVolume(int val) {    channelVolumeKnob->blockSignals(true);    channelVolumeKnob->setValue(((double)val)/(double)MAXCHANNELVOLUME); @@ -4159,7 +4345,7 @@ void DeicsOnzeGui::updatePreset(Preset* p) {      updateAtAmplitude(p->function.atAmplitude);      updateAtPitchBias(p->function.atPitchBias);      updateAtEgBias(p->function.atEgBias); -    updateReverbRate(p->function.reverbRate); +    //updateReverbRate(p->function.reverbRate);      updatePOLYMODE((int)p->function.mode);      updatePORTAMODE((int)p->function.portamento);      updatePORTATIME((int)p->function.portamentoTime); diff --git a/muse/synti/deicsonze/deicsonzegui.h b/muse/synti/deicsonze/deicsonzegui.h index 18a28929..fbbdaccd 100644 --- a/muse/synti/deicsonze/deicsonzegui.h +++ b/muse/synti/deicsonze/deicsonzegui.h @@ -31,6 +31,7 @@  #define __DEICSONZEGUI_H  #include "deicsonze.h" +  #include "deicsonzepreset.h"  #include "ui_deicsonzegui.h"  #include "libsynti/gui.h" @@ -332,6 +333,18 @@ class DeicsOnzeGui : public QDialog, public Ui::DeicsOnzeGuiBase, public MessGui      void setWaveForm2(int);      void setWaveForm3(int);      void setWaveForm4(int); +    //Delay +    void setActivDelay(bool); +    void setDelayReturn(int); +    void setChannelDelay(int); +    void setDelayTime(int); +    void setDelayTime(double); +    void setDelayFeedback(int); +    void setDelayFeedback(double); +    void setDelayPanLFOFreq(int); +    void setDelayPanLFOFreq(double); +    void setDelayPanLFODepth(int); +    void setDelayPanLFODepth(double);      //category subcategory preset      void setSet(void); //display the set, that is the category list      void setCategory(Category*); @@ -365,6 +378,13 @@ class DeicsOnzeGui : public QDialog, public Ui::DeicsOnzeGuiBase, public MessGui      void updateReverbReturn(int r);      void updateLadspaReverbLineEdit(QString s);      void updateLadspaChorusLineEdit(QString s); +    void updateDelayActiv(bool a); +    void updateChannelDelay(int r); +    void updateDelayReturn(int r); +    void updateDelayPanLFOFreq(int plf); +    void updateDelayTime(int dt); +    void updateDelayFeedback(int df); +    void updateDelayPanLFODepth(int dpd);      void addPluginCheckBox(int index, QString text, bool toggled,  			   QWidget* parent, QGridLayout* grid, bool isReverb);      void addPluginIntSlider(int index, QString text, double min, double max, @@ -414,7 +434,7 @@ class DeicsOnzeGui : public QDialog, public Ui::DeicsOnzeGuiBase, public MessGui      void updateAtAmplitude(int val);      void updateAtPitchBias(int val);      void updateAtEgBias(int val); -    void updateReverbRate(int val); +    //void updateReverbRate(int val);      //update envelope      void updateAR(int op, int val);      void updateD1R(int op, int val); @@ -452,7 +472,7 @@ class DeicsOnzeGui : public QDialog, public Ui::DeicsOnzeGuiBase, public MessGui      void updateSHFT(int op, int val);      void updateChannelDetune(int val);      void updateChannelDetuneKnob(int val); -    void updateChannelDetuneSlider(int val); +    //void updateChannelDetuneSlider(int val);      void updateChannelVolume(int val);      void updateCategoryName(QString cn, bool enable);      void updateSubcategoryName(QString sn, bool enable); diff --git a/muse/synti/deicsonze/deicsonzegui.ui b/muse/synti/deicsonze/deicsonzegui.ui index 0c9be940..d649195c 100644 --- a/muse/synti/deicsonze/deicsonzegui.ui +++ b/muse/synti/deicsonze/deicsonzegui.ui @@ -6,8 +6,8 @@     <rect>      <x>0</x>      <y>0</y> -    <width>740</width> -    <height>590</height> +    <width>672</width> +    <height>522</height>     </rect>    </property>    <property name="windowTitle" > @@ -26,233 +26,6 @@     <property name="spacing" >      <number>6</number>     </property> -   <item rowspan="3" row="0" column="4" > -    <widget class="QGroupBox" name="channelCtrlGroupBox" > -     <property name="minimumSize" > -      <size> -       <width>96</width> -       <height>16</height> -      </size> -     </property> -     <property name="title" > -      <string>Channel Ctrl</string> -     </property> -     <layout class="QGridLayout" > -      <property name="margin" > -       <number>9</number> -      </property> -      <property name="spacing" > -       <number>6</number> -      </property> -      <item row="2" column="0" > -       <widget class="Awl::VolKnob" name="channelPanKnob" > -        <property name="cursor" > -         <cursor>13</cursor> -        </property> -        <property name="minValue" > -         <double>0.000000000000000</double> -        </property> -        <property name="maxValue" > -         <double>1.000000000000000</double> -        </property> -        <property name="lineStep" > -         <double>0.100000000000000</double> -        </property> -        <property name="pageStep" > -         <double>0.200000000000000</double> -        </property> -        <property name="log" > -         <bool>false</bool> -        </property> -       </widget> -      </item> -      <item row="13" column="0" > -       <widget class="QLabel" name="releaseLabel" > -        <property name="frameShape" > -         <enum>QFrame::StyledPanel</enum> -        </property> -        <property name="text" > -         <string>Release</string> -        </property> -        <property name="alignment" > -         <set>Qt::AlignCenter</set> -        </property> -       </widget> -      </item> -      <item row="12" column="0" > -       <widget class="Awl::Knob" name="releaseKnob" > -        <property name="minimumSize" > -         <size> -          <width>32</width> -          <height>32</height> -         </size> -        </property> -        <property name="cursor" > -         <cursor>13</cursor> -        </property> -       </widget> -      </item> -      <item row="11" column="0" > -       <widget class="QLabel" name="attackTimeLabel" > -        <property name="frameShape" > -         <enum>QFrame::StyledPanel</enum> -        </property> -        <property name="text" > -         <string>Attack</string> -        </property> -        <property name="alignment" > -         <set>Qt::AlignCenter</set> -        </property> -       </widget> -      </item> -      <item row="10" column="0" > -       <widget class="Awl::Knob" name="attackKnob" > -        <property name="minimumSize" > -         <size> -          <width>32</width> -          <height>32</height> -         </size> -        </property> -        <property name="cursor" > -         <cursor>13</cursor> -        </property> -       </widget> -      </item> -      <item row="9" column="0" > -       <widget class="QLabel" name="detuneLabel" > -        <property name="frameShape" > -         <enum>QFrame::StyledPanel</enum> -        </property> -        <property name="text" > -         <string>Detune</string> -        </property> -        <property name="alignment" > -         <set>Qt::AlignCenter</set> -        </property> -       </widget> -      </item> -      <item row="8" column="0" > -       <widget class="Awl::Knob" name="detuneKnob" > -        <property name="minimumSize" > -         <size> -          <width>32</width> -          <height>32</height> -         </size> -        </property> -        <property name="cursor" > -         <cursor>13</cursor> -        </property> -       </widget> -      </item> -      <item row="7" column="0" > -       <widget class="QLabel" name="brightnessLabel" > -        <property name="frameShape" > -         <enum>QFrame::StyledPanel</enum> -        </property> -        <property name="text" > -         <string>Brightness</string> -        </property> -        <property name="alignment" > -         <set>Qt::AlignCenter</set> -        </property> -       </widget> -      </item> -      <item row="6" column="0" > -       <widget class="Awl::Knob" name="brightnessKnob" > -        <property name="minimumSize" > -         <size> -          <width>32</width> -          <height>32</height> -         </size> -        </property> -        <property name="cursor" > -         <cursor>13</cursor> -        </property> -       </widget> -      </item> -      <item row="5" column="0" > -       <widget class="QLabel" name="modulationLabel" > -        <property name="frameShape" > -         <enum>QFrame::StyledPanel</enum> -        </property> -        <property name="text" > -         <string>Modulation</string> -        </property> -        <property name="alignment" > -         <set>Qt::AlignCenter</set> -        </property> -       </widget> -      </item> -      <item row="4" column="0" > -       <widget class="Awl::Knob" name="modulationKnob" > -        <property name="minimumSize" > -         <size> -          <width>32</width> -          <height>32</height> -         </size> -        </property> -        <property name="cursor" > -         <cursor>13</cursor> -        </property> -       </widget> -      </item> -      <item row="3" column="0" > -       <widget class="QLabel" name="channelPanLabel" > -        <property name="frameShape" > -         <enum>QFrame::StyledPanel</enum> -        </property> -        <property name="text" > -         <string>Pan</string> -        </property> -        <property name="alignment" > -         <set>Qt::AlignCenter</set> -        </property> -       </widget> -      </item> -      <item row="1" column="0" > -       <widget class="QLabel" name="channelVolumeLabel" > -        <property name="frameShape" > -         <enum>QFrame::StyledPanel</enum> -        </property> -        <property name="text" > -         <string>Volume</string> -        </property> -        <property name="alignment" > -         <set>Qt::AlignCenter</set> -        </property> -       </widget> -      </item> -      <item row="0" column="0" > -       <widget class="Awl::Knob" name="channelVolumeKnob" > -        <property name="minimumSize" > -         <size> -          <width>32</width> -          <height>32</height> -         </size> -        </property> -        <property name="cursor" > -         <cursor>13</cursor> -        </property> -        <property name="maxValue" > -         <double>1.000000000000000</double> -        </property> -        <property name="lineStep" > -         <double>0.100000000000000</double> -        </property> -        <property name="pageStep" > -         <double>0.200000000000000</double> -        </property> -        <property name="scaleSize" > -         <number>270</number> -        </property> -        <property name="markSize" > -         <number>6</number> -        </property> -       </widget> -      </item> -     </layout> -    </widget> -   </item>     <item row="2" column="0" colspan="4" >      <widget class="QTabWidget" name="deicsOnzeTabWidget" >       <property name="sizePolicy" > @@ -4185,7 +3958,298 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin         <property name="spacing" >          <number>6</number>         </property> -       <item row="0" column="0" colspan="3" > +       <item row="2" column="0" colspan="2" > +        <widget class="QGroupBox" name="delayTimeGroupBox" > +         <property name="maximumSize" > +          <size> +           <width>16777215</width> +           <height>80</height> +          </size> +         </property> +         <property name="title" > +          <string>Delay Time (ms) </string> +         </property> +         <layout class="QGridLayout" > +          <property name="margin" > +           <number>9</number> +          </property> +          <property name="spacing" > +           <number>6</number> +          </property> +          <item row="0" column="1" > +           <widget class="Awl::FloatEntry" name="delayTimeFloatentry" > +            <property name="maximumSize" > +             <size> +              <width>48</width> +              <height>16777215</height> +             </size> +            </property> +            <property name="minValue" > +             <double>0.010000000000000</double> +            </property> +            <property name="maxValue" > +             <double>2.000000000000000</double> +            </property> +           </widget> +          </item> +          <item row="0" column="0" > +           <widget class="QSlider" name="delayTimeSlider" > +            <property name="cursor" > +             <cursor>13</cursor> +            </property> +            <property name="whatsThis" > +             <string>Channel Chorus</string> +            </property> +            <property name="maximum" > +             <number>255</number> +            </property> +            <property name="orientation" > +             <enum>Qt::Horizontal</enum> +            </property> +           </widget> +          </item> +         </layout> +        </widget> +       </item> +       <item row="2" column="3" colspan="2" > +        <widget class="QGroupBox" name="delayPanDepthGroupBox" > +         <property name="maximumSize" > +          <size> +           <width>16777215</width> +           <height>80</height> +          </size> +         </property> +         <property name="title" > +          <string>Delay Pan Depth</string> +         </property> +         <layout class="QGridLayout" > +          <property name="margin" > +           <number>9</number> +          </property> +          <property name="spacing" > +           <number>6</number> +          </property> +          <item row="0" column="1" > +           <widget class="Awl::FloatEntry" name="delayPanLFODepthFloatentry" > +            <property name="maximumSize" > +             <size> +              <width>48</width> +              <height>16777215</height> +             </size> +            </property> +           </widget> +          </item> +          <item row="0" column="0" > +           <widget class="QSlider" name="delayPanLFODepthSlider" > +            <property name="cursor" > +             <cursor>13</cursor> +            </property> +            <property name="whatsThis" > +             <string>Channel Chorus</string> +            </property> +            <property name="maximum" > +             <number>255</number> +            </property> +            <property name="orientation" > +             <enum>Qt::Horizontal</enum> +            </property> +           </widget> +          </item> +         </layout> +        </widget> +       </item> +       <item row="2" column="2" > +        <widget class="QGroupBox" name="delayFeedbackGroupBox" > +         <property name="maximumSize" > +          <size> +           <width>16777215</width> +           <height>80</height> +          </size> +         </property> +         <property name="title" > +          <string>Delay Feedback</string> +         </property> +         <layout class="QGridLayout" > +          <property name="margin" > +           <number>9</number> +          </property> +          <property name="spacing" > +           <number>6</number> +          </property> +          <item row="0" column="1" > +           <widget class="Awl::FloatEntry" name="delayFeedbackFloatentry" > +            <property name="maximumSize" > +             <size> +              <width>48</width> +              <height>16777215</height> +             </size> +            </property> +            <property name="minValue" > +             <double>-1.000000000000000</double> +            </property> +           </widget> +          </item> +          <item row="0" column="0" > +           <widget class="QSlider" name="delayFeedbackSlider" > +            <property name="cursor" > +             <cursor>13</cursor> +            </property> +            <property name="whatsThis" > +             <string>Channel Chorus</string> +            </property> +            <property name="maximum" > +             <number>255</number> +            </property> +            <property name="orientation" > +             <enum>Qt::Horizontal</enum> +            </property> +           </widget> +          </item> +         </layout> +        </widget> +       </item> +       <item row="1" column="3" colspan="2" > +        <widget class="QGroupBox" name="delayPanLFOGroupBox" > +         <property name="maximumSize" > +          <size> +           <width>16777215</width> +           <height>80</height> +          </size> +         </property> +         <property name="title" > +          <string>Delay Pan LFO Freq</string> +         </property> +         <layout class="QGridLayout" > +          <property name="margin" > +           <number>9</number> +          </property> +          <property name="spacing" > +           <number>6</number> +          </property> +          <item row="0" column="0" > +           <widget class="QSlider" name="delayPanLFOFreqSlider" > +            <property name="cursor" > +             <cursor>13</cursor> +            </property> +            <property name="whatsThis" > +             <string>Channel Chorus</string> +            </property> +            <property name="maximum" > +             <number>255</number> +            </property> +            <property name="orientation" > +             <enum>Qt::Horizontal</enum> +            </property> +           </widget> +          </item> +          <item row="0" column="1" > +           <widget class="Awl::FloatEntry" name="delayPanLFOFreqFloatentry" > +            <property name="maximumSize" > +             <size> +              <width>48</width> +              <height>16777215</height> +             </size> +            </property> +            <property name="minValue" > +             <double>0.100000000000000</double> +            </property> +            <property name="maxValue" > +             <double>10.000000000000000</double> +            </property> +           </widget> +          </item> +         </layout> +        </widget> +       </item> +       <item row="1" column="0" colspan="2" > +        <widget class="QGroupBox" name="delayReturnGroupBox" > +         <property name="maximumSize" > +          <size> +           <width>16777215</width> +           <height>80</height> +          </size> +         </property> +         <property name="title" > +          <string>Delay On/Off, Return Level</string> +         </property> +         <layout class="QGridLayout" > +          <property name="margin" > +           <number>9</number> +          </property> +          <property name="spacing" > +           <number>6</number> +          </property> +          <item row="0" column="0" > +           <widget class="QCheckBox" name="delayActivCheckBox" > +            <property name="cursor" > +             <cursor>13</cursor> +            </property> +            <property name="text" > +             <string>On</string> +            </property> +           </widget> +          </item> +          <item row="0" column="1" > +           <widget class="QSlider" name="delayReturnSlider" > +            <property name="maximum" > +             <number>255</number> +            </property> +            <property name="value" > +             <number>128</number> +            </property> +            <property name="orientation" > +             <enum>Qt::Horizontal</enum> +            </property> +           </widget> +          </item> +         </layout> +        </widget> +       </item> +       <item row="1" column="2" > +        <widget class="QGroupBox" name="channelDelayGroupBox" > +         <property name="maximumSize" > +          <size> +           <width>16777215</width> +           <height>80</height> +          </size> +         </property> +         <property name="title" > +          <string>Delay Ch Send Level </string> +         </property> +         <layout class="QGridLayout" > +          <property name="margin" > +           <number>9</number> +          </property> +          <property name="spacing" > +           <number>6</number> +          </property> +          <item row="0" column="1" > +           <widget class="QSpinBox" name="chDelaySpinBox" > +            <property name="maximum" > +             <number>127</number> +            </property> +           </widget> +          </item> +          <item row="0" column="0" > +           <widget class="QSlider" name="chDelaySlider" > +            <property name="cursor" > +             <cursor>13</cursor> +            </property> +            <property name="whatsThis" > +             <string>Channel Chorus</string> +            </property> +            <property name="maximum" > +             <number>127</number> +            </property> +            <property name="orientation" > +             <enum>Qt::Horizontal</enum> +            </property> +           </widget> +          </item> +         </layout> +        </widget> +       </item> +       <item row="0" column="0" colspan="5" >          <widget class="QTabWidget" name="controlTabWidget" >           <property name="currentIndex" >            <number>0</number> @@ -4868,139 +4932,7 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin           </widget>          </widget>         </item> -       <item row="1" column="0" colspan="3" > -        <widget class="QGroupBox" name="detuneGroupBox" > -         <property name="title" > -          <string>Detune</string> -         </property> -         <layout class="QHBoxLayout" > -          <property name="margin" > -           <number>10</number> -          </property> -          <property name="spacing" > -           <number>6</number> -          </property> -          <item> -           <widget class="QSlider" name="channelDetuneSlider" > -            <property name="cursor" > -             <cursor>13</cursor> -            </property> -            <property name="toolTip" > -             <string>Detune</string> -            </property> -            <property name="minimum" > -             <number>-63</number> -            </property> -            <property name="maximum" > -             <number>63</number> -            </property> -            <property name="pageStep" > -             <number>1</number> -            </property> -            <property name="orientation" > -             <enum>Qt::Horizontal</enum> -            </property> -           </widget> -          </item> -          <item> -           <widget class="QSpinBox" name="channelDetuneSpinBox" > -            <property name="toolTip" > -             <string>Detune</string> -            </property> -            <property name="maximum" > -             <number>63</number> -            </property> -            <property name="minimum" > -             <number>-61</number> -            </property> -           </widget> -          </item> -         </layout> -        </widget> -       </item> -       <item row="2" column="0" > -        <widget class="QGroupBox" name="footSWGroupBox" > -         <property name="title" > -          <string>Foot Switch</string> -         </property> -         <layout class="QHBoxLayout" > -          <property name="margin" > -           <number>10</number> -          </property> -          <property name="spacing" > -           <number>6</number> -          </property> -          <item> -           <widget class="QComboBox" name="footSWComboBox" > -            <property name="enabled" > -             <bool>false</bool> -            </property> -            <item> -             <property name="text" > -              <string>Sustain</string> -             </property> -            </item> -            <item> -             <property name="text" > -              <string>Portamento</string> -             </property> -            </item> -           </widget> -          </item> -         </layout> -        </widget> -       </item> -       <item row="2" column="1" > -        <widget class="QGroupBox" name="pitchBendRangeGroupBox" > -         <property name="title" > -          <string>Pitch Bend Range</string> -         </property> -         <layout class="QHBoxLayout" > -          <property name="margin" > -           <number>10</number> -          </property> -          <property name="spacing" > -           <number>6</number> -          </property> -          <item> -           <widget class="QSlider" name="pitchBendRangeSlider" > -            <property name="cursor" > -             <cursor>13</cursor> -            </property> -            <property name="toolTip" > -             <string>Pitch Bend Range</string> -            </property> -            <property name="minimum" > -             <number>0</number> -            </property> -            <property name="maximum" > -             <number>12</number> -            </property> -            <property name="pageStep" > -             <number>1</number> -            </property> -            <property name="value" > -             <number>0</number> -            </property> -            <property name="orientation" > -             <enum>Qt::Horizontal</enum> -            </property> -           </widget> -          </item> -          <item> -           <widget class="QSpinBox" name="pitchBendRangeSpinBox" > -            <property name="toolTip" > -             <string>Pitch Bend Range</string> -            </property> -            <property name="maximum" > -             <number>12</number> -            </property> -           </widget> -          </item> -         </layout> -        </widget> -       </item> -       <item row="3" column="1" colspan="2" > +       <item row="3" column="1" colspan="3" >          <widget class="QGroupBox" name="portamentoGroupBox" >           <property name="title" >            <string>Potamento</string> @@ -5092,13 +5024,10 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin           </layout>          </widget>         </item> -       <item row="2" column="2" > -        <widget class="QGroupBox" name="reverbGroupBox" > -         <property name="enabled" > -          <bool>false</bool> -         </property> +       <item row="3" column="4" > +        <widget class="QGroupBox" name="pitchBendRangeGroupBox" >           <property name="title" > -          <string>Reverb</string> +          <string>Pitch Bend Range</string>           </property>           <layout class="QHBoxLayout" >            <property name="margin" > @@ -5108,37 +5037,37 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin             <number>6</number>            </property>            <item> -           <widget class="QSlider" name="reverbSlider" > +           <widget class="QSlider" name="pitchBendRangeSlider" >              <property name="cursor" >               <cursor>13</cursor>              </property>              <property name="toolTip" > -             <string>Detune</string> +             <string>Pitch Bend Range</string>              </property>              <property name="minimum" >               <number>0</number>              </property>              <property name="maximum" > -             <number>7</number> +             <number>12</number>              </property>              <property name="pageStep" >               <number>1</number>              </property> +            <property name="value" > +             <number>0</number> +            </property>              <property name="orientation" >               <enum>Qt::Horizontal</enum>              </property>             </widget>            </item>            <item> -           <widget class="QSpinBox" name="reverbSpinBox" > +           <widget class="QSpinBox" name="pitchBendRangeSpinBox" >              <property name="toolTip" > -             <string>Detune</string> +             <string>Pitch Bend Range</string>              </property>              <property name="maximum" > -             <number>7</number> -            </property> -            <property name="minimum" > -             <number>0</number> +             <number>12</number>              </property>             </widget>            </item> @@ -5919,6 +5848,233 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin       </widget>      </widget>     </item> +   <item rowspan="3" row="0" column="4" > +    <widget class="QGroupBox" name="channelCtrlGroupBox" > +     <property name="minimumSize" > +      <size> +       <width>96</width> +       <height>16</height> +      </size> +     </property> +     <property name="title" > +      <string>Channel Ctrl</string> +     </property> +     <layout class="QGridLayout" > +      <property name="margin" > +       <number>9</number> +      </property> +      <property name="spacing" > +       <number>6</number> +      </property> +      <item row="2" column="0" > +       <widget class="Awl::VolKnob" name="channelPanKnob" > +        <property name="cursor" > +         <cursor>13</cursor> +        </property> +        <property name="minValue" > +         <double>0.000000000000000</double> +        </property> +        <property name="maxValue" > +         <double>1.000000000000000</double> +        </property> +        <property name="lineStep" > +         <double>0.100000000000000</double> +        </property> +        <property name="pageStep" > +         <double>0.200000000000000</double> +        </property> +        <property name="log" > +         <bool>false</bool> +        </property> +       </widget> +      </item> +      <item row="13" column="0" > +       <widget class="QLabel" name="releaseLabel" > +        <property name="frameShape" > +         <enum>QFrame::StyledPanel</enum> +        </property> +        <property name="text" > +         <string>Release</string> +        </property> +        <property name="alignment" > +         <set>Qt::AlignCenter</set> +        </property> +       </widget> +      </item> +      <item row="12" column="0" > +       <widget class="Awl::Knob" name="releaseKnob" > +        <property name="minimumSize" > +         <size> +          <width>32</width> +          <height>32</height> +         </size> +        </property> +        <property name="cursor" > +         <cursor>13</cursor> +        </property> +       </widget> +      </item> +      <item row="11" column="0" > +       <widget class="QLabel" name="attackTimeLabel" > +        <property name="frameShape" > +         <enum>QFrame::StyledPanel</enum> +        </property> +        <property name="text" > +         <string>Attack</string> +        </property> +        <property name="alignment" > +         <set>Qt::AlignCenter</set> +        </property> +       </widget> +      </item> +      <item row="10" column="0" > +       <widget class="Awl::Knob" name="attackKnob" > +        <property name="minimumSize" > +         <size> +          <width>32</width> +          <height>32</height> +         </size> +        </property> +        <property name="cursor" > +         <cursor>13</cursor> +        </property> +       </widget> +      </item> +      <item row="9" column="0" > +       <widget class="QLabel" name="detuneLabel" > +        <property name="frameShape" > +         <enum>QFrame::StyledPanel</enum> +        </property> +        <property name="text" > +         <string>Detune</string> +        </property> +        <property name="alignment" > +         <set>Qt::AlignCenter</set> +        </property> +       </widget> +      </item> +      <item row="8" column="0" > +       <widget class="Awl::Knob" name="detuneKnob" > +        <property name="minimumSize" > +         <size> +          <width>32</width> +          <height>32</height> +         </size> +        </property> +        <property name="cursor" > +         <cursor>13</cursor> +        </property> +       </widget> +      </item> +      <item row="7" column="0" > +       <widget class="QLabel" name="brightnessLabel" > +        <property name="frameShape" > +         <enum>QFrame::StyledPanel</enum> +        </property> +        <property name="text" > +         <string>Brightness</string> +        </property> +        <property name="alignment" > +         <set>Qt::AlignCenter</set> +        </property> +       </widget> +      </item> +      <item row="6" column="0" > +       <widget class="Awl::Knob" name="brightnessKnob" > +        <property name="minimumSize" > +         <size> +          <width>32</width> +          <height>32</height> +         </size> +        </property> +        <property name="cursor" > +         <cursor>13</cursor> +        </property> +       </widget> +      </item> +      <item row="5" column="0" > +       <widget class="QLabel" name="modulationLabel" > +        <property name="frameShape" > +         <enum>QFrame::StyledPanel</enum> +        </property> +        <property name="text" > +         <string>Modulation</string> +        </property> +        <property name="alignment" > +         <set>Qt::AlignCenter</set> +        </property> +       </widget> +      </item> +      <item row="4" column="0" > +       <widget class="Awl::Knob" name="modulationKnob" > +        <property name="minimumSize" > +         <size> +          <width>32</width> +          <height>32</height> +         </size> +        </property> +        <property name="cursor" > +         <cursor>13</cursor> +        </property> +       </widget> +      </item> +      <item row="3" column="0" > +       <widget class="QLabel" name="channelPanLabel" > +        <property name="frameShape" > +         <enum>QFrame::StyledPanel</enum> +        </property> +        <property name="text" > +         <string>Pan</string> +        </property> +        <property name="alignment" > +         <set>Qt::AlignCenter</set> +        </property> +       </widget> +      </item> +      <item row="1" column="0" > +       <widget class="QLabel" name="channelVolumeLabel" > +        <property name="frameShape" > +         <enum>QFrame::StyledPanel</enum> +        </property> +        <property name="text" > +         <string>Volume</string> +        </property> +        <property name="alignment" > +         <set>Qt::AlignCenter</set> +        </property> +       </widget> +      </item> +      <item row="0" column="0" > +       <widget class="Awl::Knob" name="channelVolumeKnob" > +        <property name="minimumSize" > +         <size> +          <width>32</width> +          <height>32</height> +         </size> +        </property> +        <property name="cursor" > +         <cursor>13</cursor> +        </property> +        <property name="maxValue" > +         <double>1.000000000000000</double> +        </property> +        <property name="lineStep" > +         <double>0.100000000000000</double> +        </property> +        <property name="pageStep" > +         <double>0.200000000000000</double> +        </property> +        <property name="scaleSize" > +         <number>270</number> +        </property> +        <property name="markSize" > +         <number>6</number> +        </property> +       </widget> +      </item> +     </layout> +    </widget> +   </item>     <item rowspan="2" row="0" column="1" >      <widget class="Awl::VolKnob" name="masterVolKnob" >       <property name="minimumSize" > @@ -5928,7 +6084,7 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin        </size>       </property>       <property name="value" > -      <double>-28.009242824902255</double> +      <double>-31.287818861687722</double>       </property>       <property name="minValue" >        <double>0.000000000000000</double> @@ -7037,15 +7193,20 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin   <layoutdefault spacing="6" margin="11" />   <customwidgets>    <customwidget> -   <class>Awl::VolKnob</class> -   <extends>Awl::Knob</extends> -   <header>awl/volknob.h</header> -  </customwidget> -  <customwidget>     <class>Awl::Knob</class>     <extends>QWidget</extends>     <header>awl/knob.h</header>    </customwidget> +  <customwidget> +   <class>Awl::FloatEntry</class> +   <extends>QLineEdit</extends> +   <header>awl/floatentry.h</header> +  </customwidget> +  <customwidget> +   <class>Awl::VolKnob</class> +   <extends>Awl::Knob</extends> +   <header>awl/volknob.h</header> +  </customwidget>   </customwidgets>   <tabstops>    <tabstop>deicsOnzeTabWidget</tabstop> @@ -7177,12 +7338,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>445</x> -     <y>170</y> +     <x>110</x> +     <y>115</y>      </hint>      <hint type="destinationlabel" > -     <x>606</x> -     <y>173</y> +     <x>110</x> +     <y>115</y>      </hint>     </hints>    </connection> @@ -7193,12 +7354,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>606</x> -     <y>173</y> +     <x>110</x> +     <y>115</y>      </hint>      <hint type="destinationlabel" > -     <x>445</x> -     <y>170</y> +     <x>110</x> +     <y>115</y>      </hint>     </hints>    </connection> @@ -7209,12 +7370,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>252</x> -     <y>270</y> +     <x>110</x> +     <y>115</y>      </hint>      <hint type="destinationlabel" > -     <x>304</x> -     <y>273</y> +     <x>110</x> +     <y>115</y>      </hint>     </hints>    </connection> @@ -7225,12 +7386,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>304</x> -     <y>273</y> +     <x>110</x> +     <y>115</y>      </hint>      <hint type="destinationlabel" > -     <x>252</x> -     <y>270</y> +     <x>110</x> +     <y>115</y>      </hint>     </hints>    </connection> @@ -7241,12 +7402,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>252</x> -     <y>301</y> +     <x>110</x> +     <y>115</y>      </hint>      <hint type="destinationlabel" > -     <x>304</x> -     <y>304</y> +     <x>110</x> +     <y>115</y>      </hint>     </hints>    </connection> @@ -7257,12 +7418,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>304</x> -     <y>304</y> +     <x>110</x> +     <y>115</y>      </hint>      <hint type="destinationlabel" > -     <x>252</x> -     <y>301</y> +     <x>110</x> +     <y>115</y>      </hint>     </hints>    </connection> @@ -7273,12 +7434,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>304</x> -     <y>335</y> +     <x>110</x> +     <y>115</y>      </hint>      <hint type="destinationlabel" > -     <x>194</x> -     <y>332</y> +     <x>110</x> +     <y>115</y>      </hint>     </hints>    </connection> @@ -7289,12 +7450,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>304</x> -     <y>366</y> +     <x>110</x> +     <y>115</y>      </hint>      <hint type="destinationlabel" > -     <x>194</x> -     <y>363</y> +     <x>110</x> +     <y>115</y>      </hint>     </hints>    </connection> @@ -7305,12 +7466,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>194</x> -     <y>394</y> +     <x>110</x> +     <y>115</y>      </hint>      <hint type="destinationlabel" > -     <x>304</x> -     <y>397</y> +     <x>110</x> +     <y>115</y>      </hint>     </hints>    </connection> @@ -7321,12 +7482,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>304</x> -     <y>397</y> +     <x>110</x> +     <y>115</y>      </hint>      <hint type="destinationlabel" > -     <x>194</x> -     <y>394</y> +     <x>110</x> +     <y>115</y>      </hint>     </hints>    </connection> @@ -7337,12 +7498,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>194</x> -     <y>425</y> +     <x>110</x> +     <y>115</y>      </hint>      <hint type="destinationlabel" > -     <x>304</x> -     <y>428</y> +     <x>110</x> +     <y>115</y>      </hint>     </hints>    </connection> @@ -7353,12 +7514,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>304</x> -     <y>428</y> +     <x>110</x> +     <y>115</y>      </hint>      <hint type="destinationlabel" > -     <x>194</x> -     <y>425</y> +     <x>110</x> +     <y>115</y>      </hint>     </hints>    </connection> @@ -7369,12 +7530,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>194</x> -     <y>332</y> +     <x>110</x> +     <y>115</y>      </hint>      <hint type="destinationlabel" > -     <x>304</x> -     <y>335</y> +     <x>110</x> +     <y>115</y>      </hint>     </hints>    </connection> @@ -8425,12 +8586,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>240</x> -     <y>207</y> +     <x>262</x> +     <y>163</y>      </hint>      <hint type="destinationlabel" > -     <x>607</x> -     <y>210</y> +     <x>515</x> +     <y>166</y>      </hint>     </hints>    </connection> @@ -8441,12 +8602,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>607</x> -     <y>210</y> +     <x>515</x> +     <y>166</y>      </hint>      <hint type="destinationlabel" > -     <x>240</x> -     <y>207</y> +     <x>262</x> +     <y>163</y>      </hint>     </hints>    </connection> @@ -8457,12 +8618,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>240</x> -     <y>329</y> +     <x>262</x> +     <y>209</y>      </hint>      <hint type="destinationlabel" > -     <x>596</x> -     <y>332</y> +     <x>504</x> +     <y>212</y>      </hint>     </hints>    </connection> @@ -8473,12 +8634,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>596</x> -     <y>332</y> +     <x>504</x> +     <y>212</y>      </hint>      <hint type="destinationlabel" > -     <x>240</x> -     <y>329</y> +     <x>262</x> +     <y>209</y>      </hint>     </hints>    </connection> @@ -8489,12 +8650,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>596</x> -     <y>439</y> +     <x>504</x> +     <y>258</y>      </hint>      <hint type="destinationlabel" > -     <x>240</x> -     <y>442</y> +     <x>262</x> +     <y>255</y>      </hint>     </hints>    </connection> @@ -8505,44 +8666,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>240</x> -     <y>442</y> +     <x>262</x> +     <y>255</y>      </hint>      <hint type="destinationlabel" > -     <x>596</x> -     <y>439</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>channelDetuneSpinBox</sender> -   <signal>valueChanged(int)</signal> -   <receiver>channelDetuneSlider</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> -    </hint> -    <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>channelDetuneSlider</sender> -   <signal>valueChanged(int)</signal> -   <receiver>channelDetuneSpinBox</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> -    </hint> -    <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>504</x> +     <y>258</y>      </hint>     </hints>    </connection> @@ -8553,12 +8682,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>485</x> +     <y>484</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>537</x> +     <y>487</y>      </hint>     </hints>    </connection> @@ -8569,44 +8698,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> -    </hint> -    <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>reverbSlider</sender> -   <signal>valueChanged(int)</signal> -   <receiver>reverbSpinBox</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> -    </hint> -    <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>reverbSpinBox</sender> -   <signal>valueChanged(int)</signal> -   <receiver>reverbSlider</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>537</x> +     <y>487</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>485</x> +     <y>484</y>      </hint>     </hints>    </connection> @@ -8617,12 +8714,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>329</x> +     <y>484</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>381</x> +     <y>487</y>      </hint>     </hints>    </connection> @@ -8633,12 +8730,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>381</x> +     <y>487</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>329</x> +     <y>484</y>      </hint>     </hints>    </connection> @@ -8649,12 +8746,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8665,12 +8762,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8681,12 +8778,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8697,12 +8794,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8713,12 +8810,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8729,12 +8826,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8745,12 +8842,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8761,12 +8858,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8777,12 +8874,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8793,12 +8890,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8809,12 +8906,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8825,12 +8922,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8841,12 +8938,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8857,12 +8954,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8873,12 +8970,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8889,12 +8986,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8905,12 +9002,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8921,12 +9018,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8937,12 +9034,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8953,12 +9050,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8969,12 +9066,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -8985,12 +9082,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>121</x> +     <y>149</y>      </hint>     </hints>    </connection> @@ -9017,12 +9114,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>486</x> +     <y>150</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>538</x> +     <y>153</y>      </hint>     </hints>    </connection> @@ -9033,12 +9130,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>110</x> -     <y>115</y> +     <x>538</x> +     <y>153</y>      </hint>      <hint type="destinationlabel" > -     <x>110</x> -     <y>115</y> +     <x>486</x> +     <y>150</y>      </hint>     </hints>    </connection> @@ -9081,12 +9178,12 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>203</x> -     <y>163</y> +     <x>110</x> +     <y>115</y>      </hint>      <hint type="destinationlabel" > -     <x>287</x> -     <y>171</y> +     <x>110</x> +     <y>115</y>      </hint>     </hints>    </connection> @@ -9097,12 +9194,44 @@ Wave form 8 = <i>if <b>t</b>&#060 pi then sin(2*<b>t</b>)*sin     <slot>setValue(int)</slot>     <hints>      <hint type="sourcelabel" > -     <x>270</x> -     <y>156</y> +     <x>110</x> +     <y>115</y> +    </hint> +    <hint type="destinationlabel" > +     <x>110</x> +     <y>115</y> +    </hint> +   </hints> +  </connection> +  <connection> +   <sender>chDelaySlider</sender> +   <signal>valueChanged(int)</signal> +   <receiver>chDelaySpinBox</receiver> +   <slot>setValue(int)</slot> +   <hints> +    <hint type="sourcelabel" > +     <x>302</x> +     <y>339</y>      </hint>      <hint type="destinationlabel" > -     <x>169</x> -     <y>157</y> +     <x>344</x> +     <y>343</y> +    </hint> +   </hints> +  </connection> +  <connection> +   <sender>chDelaySpinBox</sender> +   <signal>valueChanged(int)</signal> +   <receiver>chDelaySlider</receiver> +   <slot>setValue(int)</slot> +   <hints> +    <hint type="sourcelabel" > +     <x>346</x> +     <y>329</y> +    </hint> +    <hint type="destinationlabel" > +     <x>278</x> +     <y>329</y>      </hint>     </hints>    </connection> diff --git a/muse/synti/deicsonze/deicsonzeplugin.cpp b/muse/synti/deicsonze/deicsonzeplugin.cpp index 8788d152..5d882ff5 100644 --- a/muse/synti/deicsonze/deicsonzeplugin.cpp +++ b/muse/synti/deicsonze/deicsonzeplugin.cpp @@ -84,6 +84,46 @@ void DeicsOnze::initPluginChorus(Plugin* pluginChorus) {    _gui->writeEvent(evSysex);  } +void DeicsOnze::initPluginDelay(Plugin* pluginDelay) { +  if(_pluginIDelay) delete(_pluginIDelay); +  _pluginIDelay = new PluginI(NULL); + +  _pluginIDelay->initPluginInstance(pluginDelay, 2); + +  for(int i = 0; i < pluginDelay->parameter(); i++) { +    Ctrl* c = new Ctrl(); +    c->setCurVal((float)pluginDelay->defaultValue(i)); +    _pluginIDelay->setControllerList(c); +    //setChorusParam(i, pluginDelay->defaultValue(i)); +  } +  setDelayDryWet(255); +   +  char dataDelayTime[2]; +  dataDelayTime[0] = SYSEX_DELAYTIME; +  dataDelayTime[1] = (unsigned char)getDelayTime(); +  MidiEvent evSysexDelayTime(0,ME_SYSEX, +			     (const unsigned char*)dataDelayTime, 2); +  _gui->writeEvent(evSysexDelayTime); +  char dataDelayFeedback[2]; +  dataDelayFeedback[0] = SYSEX_DELAYFEEDBACK; +  dataDelayFeedback[1] = (unsigned char)getDelayFeedback(); +  MidiEvent evSysexDelayFeedback(0,ME_SYSEX, +				 (const unsigned char*)dataDelayFeedback, 2); +  _gui->writeEvent(evSysexDelayFeedback); +  char dataDelayLFOFreq[2]; +  dataDelayLFOFreq[0] = SYSEX_DELAYLFOFREQ; +  dataDelayLFOFreq[1] = (unsigned char)getDelayLFOFreq(); +  MidiEvent evSysexDelayLFOFreq(0,ME_SYSEX, +				(const unsigned char*)dataDelayLFOFreq, 2); +  _gui->writeEvent(evSysexDelayLFOFreq); +  char dataDelayLFODepth[2]; +  dataDelayLFODepth[0] = SYSEX_DELAYLFODEPTH; +  dataDelayLFODepth[1] = (unsigned char)getDelayLFODepth(); +  MidiEvent evSysexDelayLFODepth(0,ME_SYSEX, +				 (const unsigned char*)dataDelayLFODepth, 2); +  _gui->writeEvent(evSysexDelayLFODepth);  +} +  void DeicsOnze::setReverbParam(int index, double val) {    _pluginIReverb->controller(index)->setCurVal((float)val);  } @@ -290,7 +330,7 @@ void DeicsOnzeGui::setReverbCheckBox(double v, int i) {  //of the parameter because it sends a double and does not  //change any thing  void DeicsOnzeGui::setChorusCheckBox(double v, int i) { - float f = (float)v; +  float f = (float)v;    unsigned char* message = new unsigned char[2+sizeof(float)];    message[0]=SYSEX_CHORUSPARAM;    if(i<256) { @@ -355,3 +395,43 @@ void DeicsOnzeGui::updateChorusFloatEntry(double v, int i) {      _chorusFloatEntryVector[i]->blockSignals(false);    }  } + +//------------------------------------------------------------- +// set Delay +//------------------------------------------------------------- +void DeicsOnze::setDelayTime(int val) { +  float res = MINDELAYTIME + (MAXDELAYTIME - MINDELAYTIME)*((float)val/255.0); +  _pluginIDelay->controller(0)->setCurVal(res); +} +int DeicsOnze::getDelayTime() { +  float dtf = _pluginIDelay->controller(0)->curVal().f; +  return (int)(((dtf - MINDELAYTIME) / (MAXDELAYTIME - MINDELAYTIME))*255.0); +} +void DeicsOnze::setDelayFeedback(int val) { +  float res = (float)(val - 128)/128.0; +  _pluginIDelay->controller(1)->setCurVal(res); +} +int DeicsOnze::getDelayFeedback() { +  float dtf = _pluginIDelay->controller(1)->curVal().f; +  return (int)(dtf*128.0+128.0); +} +void DeicsOnze::setDelayLFOFreq(int val) { +  float res = MINFREQ + (MAXFREQ - MINFREQ)*((float)val/255.0); +  _pluginIDelay->controller(2)->setCurVal(res); +} +int DeicsOnze::getDelayLFOFreq() { +  float dtf = _pluginIDelay->controller(2)->curVal().f; +  return (int)(((dtf - MINFREQ) / (MAXFREQ - MINFREQ))*255.0); +} +void DeicsOnze::setDelayLFODepth(int val) { +  float res = (float)val/255.0; +  _pluginIDelay->controller(3)->setCurVal(res);   +} +int DeicsOnze::getDelayLFODepth() { +  float dtd = _pluginIDelay->controller(3)->curVal().f; +  return (int)(dtd*255.0); +} +void DeicsOnze::setDelayDryWet(int val) { +  float res = (float)val/255.0; +  _pluginIDelay->controller(4)->setCurVal(res); +} diff --git a/muse/synti/deicsonze/deicsonzeplugin.h b/muse/synti/deicsonze/deicsonzeplugin.h index a6b2aa45..d9527e23 100644 --- a/muse/synti/deicsonze/deicsonzeplugin.h +++ b/muse/synti/deicsonze/deicsonzeplugin.h @@ -32,6 +32,7 @@  #include "deicsonze.h"  #include "deicsonzegui.h" +#include "plugins/pandelay/pandelaymodel.h"  class DeicsOnze;  class DeicsOnzeGui;  | 
