diff options
Diffstat (limited to 'attic/muse2-oom/muse2/synti/organ')
| -rw-r--r-- | attic/muse2-oom/muse2/synti/organ/CMakeLists.txt | 90 | ||||
| -rw-r--r-- | attic/muse2-oom/muse2/synti/organ/organ.cpp | 716 | ||||
| -rw-r--r-- | attic/muse2-oom/muse2/synti/organ/organ.h | 198 | ||||
| -rw-r--r-- | attic/muse2-oom/muse2/synti/organ/organgui.cpp | 185 | ||||
| -rw-r--r-- | attic/muse2-oom/muse2/synti/organ/organgui.h | 45 | ||||
| -rw-r--r-- | attic/muse2-oom/muse2/synti/organ/organguibase.ui | 1351 | 
6 files changed, 0 insertions, 2585 deletions
| diff --git a/attic/muse2-oom/muse2/synti/organ/CMakeLists.txt b/attic/muse2-oom/muse2/synti/organ/CMakeLists.txt deleted file mode 100644 index 0d8dda90..00000000 --- a/attic/muse2-oom/muse2/synti/organ/CMakeLists.txt +++ /dev/null @@ -1,90 +0,0 @@ -#============================================================================= -#  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. -#============================================================================= - -## -## Expand Qt macros in source files -## -QT4_WRAP_CPP ( organ_mocs -      organgui.h -      ) - -## -## UI files -## -file (GLOB organ_ui_files -      organguibase.ui -      ) -QT4_WRAP_UI ( organ_uis ${organ_ui_files} ) - -## -## List of source files to compile -## -file (GLOB organ_source_files -      organ.cpp -      organgui.cpp -      # reverb.cpp -      # routing.cpp -      ) - -## -## Define target -## -add_library ( organ SHARED -      ${PROJECT_SOURCE_DIR}/muse/xml.cpp -      ${organ_source_files} -      ${organ_mocs} -      ${organ_uis} -      ) - -## -## Append to the list of translations -## -set (FILES_TO_TRANSLATE -      ${FILES_TO_TRANSLATE} -      ${organ_source_files} -      ${organ_ui_files} -      CACHE INTERNAL "" -      ) - -# - tell cmake to name target organ.so instead of -#   liborgan.so -# - use precompiled header files -# -set_target_properties ( organ -      PROPERTIES PREFIX "" -      COMPILE_FLAGS "-fvisibility=hidden -O2 -include ${PROJECT_BINARY_DIR}/all-pic.h" -      ) - -## -## Linkage -## -target_link_libraries(organ -      synti -      # awl -      ${QT_LIBRARIES} -      ) - -## -## Install location -## -install( TARGETS organ -      DESTINATION ${MusE_SYNTHI_DIR} -      ) - diff --git a/attic/muse2-oom/muse2/synti/organ/organ.cpp b/attic/muse2-oom/muse2/synti/organ/organ.cpp deleted file mode 100644 index 1aa87742..00000000 --- a/attic/muse2-oom/muse2/synti/organ/organ.cpp +++ /dev/null @@ -1,716 +0,0 @@ -//========================================================= -//  MusE -//  Linux Music Editor -//  $Id: organ.cpp,v 1.15.2.8 2009/12/06 10:05:00 terminator356 Exp $ -// -//  Parts of this file taken from: -//      Organ - Additive Organ Synthesizer Voice -//      Copyright (c) 1999, 2000 David A. Bartold -// -//  (C) Copyright 2001-2004 Werner Schweer (ws@seh.de) -//========================================================= - -#include <cmath> -#include <stdio.h> - -#include "muse/midi.h" -//#include "libsynti/mpevent.h" -#include "muse/mpevent.h"    - -#include "organ.h" -#include "organgui.h" - -//#define ORGAN_DEBUG - -SynthCtrl Organ::synthCtrl[] = { -      { "harm0",     HARM0,          0 }, -      { "harm1",     HARM1,          0 }, -      { "harm2",     HARM2,          0 }, -      { "harm3",     HARM3,          0 }, -      { "harm4",     HARM4,          0 }, -      { "harm5",     HARM5,          0 }, -      { "attackLo",  ATTACK_LO,     20 }, -      { "decayLo",   DECAY_LO,      20 }, -      { "sustainLo", SUSTAIN_LO,     0 }, -      { "releaseLo", RELEASE_LO,    20 }, -      { "attackHi",  ATTACK_HI,     10 }, -      { "decayHi",   DECAY_HI,      10 }, -      { "sustainHi", SUSTAIN_HI,     0 }, -      { "releaseHi", RELEASE_HI,    10 }, -      { "brass",     BRASS,          1 }, -      { "flute",     FLUTE,          1 }, -      { "reed",      REED,           1 }, -      { "velocity",  VELO,           0 }, -      // next controller not send as init data -      { "volume",    CTRL_VOLUME,  100 }, -      }; - -static int NUM_CONTROLLER = sizeof(Organ::synthCtrl)/sizeof(*(Organ::synthCtrl)); -static int NUM_INIT_CONTROLLER = NUM_CONTROLLER - 1; - -float* Organ::sine_table; -float* Organ::g_triangle_table; -float* Organ::g_pulse_table; -int Organ::useCount = 0; -double Organ::cb2amp_tab[MAX_ATTENUATION]; -unsigned Organ::freq256[128]; - -//--------------------------------------------------------- -//   cb2amp -//    convert centibel to amplification (0 - 96dB) -//--------------------------------------------------------- - -double Organ::cb2amp(int cb) -      { -      if (cb < 0) -            return 1.0; -      if (cb >= MAX_ATTENUATION) -            return 0.0; -      return cb2amp_tab[cb]; -      } - -//--------------------------------------------------------- -//   Organ -//--------------------------------------------------------- - -Organ::Organ(int sr) -   : Mess(1) -      { -      idata = new int[NUM_CONTROLLER]; -      setSampleRate(sr); -      gui = 0; - -      ++useCount; -      if (useCount > 1) -            return; - -      // centibels to amplitude conversion -      for (int i = 0; i < MAX_ATTENUATION; i++) -            cb2amp_tab[i] = pow(10.0, double(i) / -200.0); - -      for (int i = 0; i < 128; ++i) { -            double freq = 8.176 * exp(double(i)*log(2.0)/12.0); -            freq256[i]  = (int) (freq * ((double) RESOLUTION) / sr * 256.0); -            } -      int size  = RESOLUTION; -      int half  = size / 2; -      int slope = size / 10; -      int i; - -      // Initialize sine table. -      sine_table = new float[size]; -      for (i = 0; i < size; i++) -            sine_table[i] = sin ((i * 2.0 * M_PI) / size) / 6.0; - -      // Initialize triangle table. -      g_triangle_table = new float[size]; -      for (i = 0; i < half; i++) -            g_triangle_table[i] = (4.0 / size * i - 1.0) / 6.0; -      for (; i < size; i++) -            g_triangle_table[i] = (4.0 / size * (size - i) - 1.0) / 6.0; - -      // Initialize pulse table. -      g_pulse_table = new float[size]; -      for (i = 0; i < slope; i++) -            g_pulse_table[i] = (((double) -i) / slope) / 6.0; -      for (; i < half - slope; i++) -            g_pulse_table[i] = -1.0 / 6.0; -      for (; i < half + slope; i++) -            g_pulse_table[i] = (((double) i - half) / slope) / 6.0; -      for (; i < size - slope; i++) -            g_pulse_table[i] = 1.0 / 6.0; -      for (; i < size; i++) -            g_pulse_table[i] = (((double) size - i) / slope) / 6.0; -      } - -//--------------------------------------------------------- -//   ~Organ -//--------------------------------------------------------- - -Organ::~Organ() -      { -      if (gui) -            delete gui; -      delete idata; -      --useCount; -      if (useCount == 0) { -            delete[] g_pulse_table; -            delete[] g_triangle_table; -            delete[] sine_table; -            } -      } - -//--------------------------------------------------------- -//   table_pos -//--------------------------------------------------------- - -static inline float table_pos (float* table, unsigned long freq_256, unsigned *accum) -      { -      *accum += freq_256; -      while (*accum >= RESOLUTION * 256) -            *accum -= RESOLUTION * 256; -      return table[*accum >> 8]; -      } - -//--------------------------------------------------------- -//   init -//--------------------------------------------------------- - -bool Organ::init(const char* name) -      { -      gui = new OrganGui; -      gui->setWindowTitle(QString(name)); -      gui->show(); - -      for (int i = 0; i < NUM_CONTROLLER; ++i) -            setController(0, synthCtrl[i].num, synthCtrl[i].val); - -      for (int i = 0; i < VOICES; ++i) -            voices[i].isOn = false; -      return false; -      } - -//--------------------------------------------------------- -//   processMessages -//   Called from host always, even if output path is unconnected. -//--------------------------------------------------------- - -void Organ::processMessages() -{ -  //Process messages from the gui -  // -  //  get and process all pending events from the -  //  synthesizer GUI -  // -  while (gui->fifoSize())  -  { -    MidiPlayEvent ev = gui->readEvent(); -    if (ev.type() == ME_CONTROLLER)  -    { -      // process local? -      setController(ev.dataA(), ev.dataB()); -      sendEvent(ev); -    } -    else -      printf("Organ::process(): unknown event\n"); -  } -} -   -//--------------------------------------------------------- -//   process -//   Called from host, ONLY if output path is connected. -//--------------------------------------------------------- - -void Organ::process(float** ports, int offset, int sampleCount) -      { -      /* -      // -      //  get and process all pending events from the -      //  synthesizer GUI -      // -      while (gui->fifoSize()) { -            MidiPlayEvent ev = gui->readEvent(); -            if (ev.type() == ME_CONTROLLER) { -                  // process local? -                  setController(ev.dataA(), ev.dataB()); -                  sendEvent(ev); -                  } -            else -                  printf("Organ::process(): unknown event\n"); -            } -      */ -       -      float* buffer = *ports + offset; -      for (int i = 0; i < VOICES; ++i) { -            Voice* v = &voices[i]; -            if (!v->isOn) -                  continue; -            double vol = velo ? v->velocity : 1.0; -            vol *= volume; - -            unsigned freq_256 = freq256[v->pitch]; -            unsigned* harm0_accum = &(v->harm0_accum); -            unsigned* harm1_accum = &(v->harm1_accum); -            unsigned* harm2_accum = &(v->harm2_accum); -            unsigned* harm3_accum = &(v->harm3_accum); -            unsigned* harm4_accum = &(v->harm4_accum); -            unsigned* harm5_accum = &(v->harm5_accum); - -            unsigned long freq_256_harm2, freq_256_harm3; -            unsigned long freq_256_harm4, freq_256_harm5; - -            float* reed_table  = reed  ? g_pulse_table    : sine_table; -            float* flute_table = flute ? g_triangle_table : sine_table; - -            unsigned freq_256_harm0 = freq_256 / 2; -            unsigned freq_256_harm1 = freq_256; - -            if (brass) { -                  freq_256_harm2 = freq_256       * 2; -                  freq_256_harm3 = freq_256_harm2 * 2; -                  freq_256_harm4 = freq_256_harm3 * 2; -                  freq_256_harm5 = freq_256_harm4 * 2; -                  for (int i = 0; i < sampleCount; i++) { -                        int a1=0, a2=0;	//prevent compiler warning: unitialized usage of vars a1 & a2 -                        switch(v->state1) { -                              case ATTACK: -                                    if (v->envL1.step(&a1)) -                                          break; -                                    v->state1 = DECAY; -                              case DECAY: -                                    if (v->envL2.step(&a1)) -                                          break; -                                    v->state1 = SUSTAIN; -                              case SUSTAIN: -                                    a1 = sustain0; -                                    break; -                              case RELEASE: -                                    if (v->envL3.step(&a1)) -                                          break; -                                    v->state1 = OFF; -                                    a1 = MAX_ATTENUATION; -                                    break; -                              } -                        switch(v->state2) { -                              case ATTACK: -                                    if (v->envH1.step(&a2)) -                                          break; -                                    v->state2 = DECAY; -                              case DECAY: -                                    if (v->envH2.step(&a2)) -                                          break; -                                    v->state2 = SUSTAIN; -                              case SUSTAIN: -                                    a2 = sustain1; -                                    break; -                              case RELEASE: -                                    if (v->envH3.step(&a2)) -                                          break; -                                    v->state2 = OFF; -                                    a1 = MAX_ATTENUATION; -                                    break; -                              } -                        if (v->state1 == OFF && v->state2 == OFF) { -                              v->isOn = false; -                              break; -                              } -                        buffer[i] += -                            (table_pos (sine_table, freq_256_harm0, harm0_accum) * harm0 -                           + table_pos (sine_table, freq_256_harm1, harm1_accum) * harm1 -                           + table_pos (reed_table, freq_256_harm2, harm2_accum) * harm2) -                              * cb2amp(a1) * vol -                           + (table_pos (sine_table,  freq_256_harm3, harm3_accum) * harm3 -                           +  table_pos (flute_table, freq_256_harm4, harm4_accum) * harm4 -                           +  table_pos (flute_table, freq_256_harm5, harm5_accum) * harm5) -                             * cb2amp(a2) * vol; -                        } -                  } -            else { -                  freq_256_harm2 = freq_256 * 3 / 2; -                  freq_256_harm3 = freq_256 * 2; -                  freq_256_harm4 = freq_256 * 3; -                  freq_256_harm5 = freq_256_harm3 * 2; -                  for (int i = 0; i < sampleCount; i++) { -                        int a1=0, a2=0;//prevent compiler warning: unitialized usage of vars a1 & a2 -                        switch(v->state1) { -                              case ATTACK: -                                    if (v->envL1.step(&a1)) -                                          break; -                                    v->state1 = DECAY; -                              case DECAY: -                                    if (v->envL2.step(&a1)) -                                          break; -                                    v->state1 = SUSTAIN; -                              case SUSTAIN: -                                    a1 = sustain0; -                                    break; -                              case RELEASE: -                                    if (v->envL3.step(&a1)) -                                          break; -                                    v->state1 = OFF; -                                    a1 = MAX_ATTENUATION; -                                    break; -                              } -                        switch(v->state2) { -                              case ATTACK: -                                    if (v->envH1.step(&a2)) -                                          break; -                                    v->state2 = DECAY; -                              case DECAY: -                                    if (v->envH2.step(&a2)) -                                          break; -                                    v->state2 = SUSTAIN; -                              case SUSTAIN: -                                    a2 = sustain1; -                                    break; -                              case RELEASE: -                                    if (v->envH3.step(&a2)) -                                          break; -                                    v->state2 = OFF; -                                    a1 = MAX_ATTENUATION; -                                    break; -                              } -                        if (v->state1 == OFF && v->state2 == OFF) { -                              v->isOn = false; -                              break; -                              } -                        buffer[i] += -                           (table_pos (sine_table, freq_256_harm0, harm0_accum) * harm0 -                           + table_pos (sine_table, freq_256_harm1, harm1_accum) * harm1 -                           + table_pos (sine_table, freq_256_harm2, harm2_accum) * harm2) -                              * cb2amp(a1) * vol -                           + (table_pos (reed_table, freq_256_harm3, harm3_accum) * harm3 -                           + table_pos (sine_table, freq_256_harm4,  harm4_accum) * harm4 -                           + table_pos (flute_table, freq_256_harm5, harm5_accum) * harm5) -                             * cb2amp(a2) * vol; -                        } -                  } -            } -      } - -//--------------------------------------------------------- -//   playNote -//--------------------------------------------------------- - -bool Organ::playNote(int channel, int pitch, int velo) -      { -      if (velo == 0) { -            noteoff(channel, pitch); -            return false; -            } -      for (int i = 0; i < VOICES; ++i) { -            if (voices[i].isOn) -                  continue; -            voices[i].isOn     = true; -            voices[i].pitch    = pitch; -            voices[i].channel  = channel; -            // velo is never 0 -            voices[i].velocity = cb2amp(int(200 * log10((127.0 * 127)/(velo*velo)))); -            voices[i].state1 = ATTACK; -            voices[i].state2 = ATTACK; -            voices[i].envL1.set(attack0,  MAX_ATTENUATION, 0); -            voices[i].envL2.set(decay0,   MAX_ATTENUATION, sustain0); -            voices[i].envL3.set(release0, sustain0, MAX_ATTENUATION); - -            voices[i].envH1.set(attack1,  MAX_ATTENUATION, 0); -            voices[i].envH2.set(decay1,   MAX_ATTENUATION, sustain1); -            voices[i].envH3.set(release1, sustain1, MAX_ATTENUATION); - -            voices[i].harm0_accum = 0; -            voices[i].harm1_accum = 0; -            voices[i].harm2_accum = 0; -            voices[i].harm3_accum = 0; -            voices[i].harm4_accum = 0; -            voices[i].harm5_accum = 0; -            return false; -            } -      printf("organ: voices overflow!\n"); -      return false; -      } - -//--------------------------------------------------------- -//   noteoff -//--------------------------------------------------------- - -void Organ::noteoff(int channel, int pitch) -      { -      bool found = false; -      for (int i = 0; i < VOICES; ++i) { -            if (voices[i].isOn && (voices[i].pitch == pitch) -               && (voices[i].channel == channel)) { -                  found = true; -                  voices[i].state1 = RELEASE; -                  voices[i].state2 = RELEASE; -                  } -            } -      if (!found) -            printf("Organ: noteoff %d:%d not found\n", channel, pitch); -      } - -//--------------------------------------------------------- -//   setController -//--------------------------------------------------------- - -void Organ::setController(int ctrl, int data) -      { -      int sr = sampleRate(); -       -      // Changed By T356. -      // Because of muse's auto-bias controllers, some of these negative-range  -      //  controls need to apply the auto-bias correction. -       -      switch (ctrl) { -            case HARM0: -                  //harm0 = cb2amp(-data); -                  harm0 = cb2amp(-data + 8192); -                  break; -            case HARM1: -                  //harm1 = cb2amp(-data); -                  harm1 = cb2amp(-data + 8192); -                  break; -            case HARM2: -                  //harm2 = cb2amp(-data); -                  harm2 = cb2amp(-data + 8192); -                  break; -            case HARM3: -                  //harm3 = cb2amp(-data); -                  harm3 = cb2amp(-data + 8192); -                  break; -            case HARM4: -                  //harm4 = cb2amp(-data); -                  harm4 = cb2amp(-data + 8192); -                  break; -            case HARM5: -                  //harm5 = cb2amp(-data); -                  harm5 = cb2amp(-data + 8192); -                  break; -            case ATTACK_LO:   // maxval -> 500msec -                  attack0 = (data * sr) / 1000; -                  break; -            case DECAY_LO:    // maxval -> 5000msec -                  decay0 = (data * sr) / 1000; -                  break; -            case SUSTAIN_LO: -                  //sustain0 = -data; -                  sustain0 = -data + 8192; -                  break; -            case RELEASE_LO: -                  release0 = (data * sr) / 1000; -                  break; -            case ATTACK_HI: -                  attack1 = (data * sr) / 1000; -                  break; -            case DECAY_HI: -                  decay1 =  (data * sr) / 1000; -                  break; -            case SUSTAIN_HI: -                  //sustain1 = -data; -                  sustain1 = -data + 8192; -                  break; -            case RELEASE_HI: -                  release1 = (data * sr) / 1000; -                  break; -            case BRASS: -                  brass = data; -                  break; -            case FLUTE: -                  flute = data; -                  break; -            case REED: -                  reed  = data; -                  break; -            case VELO: -                  velo = data; -                  break; -            case CTRL_VOLUME: -                  data &= 0x7f; -                  volume = data == 0 ? 0.0 : cb2amp(int(200 * log10((127.0 * 127)/(data*data)))); -                  break; -            case CTRL_ALL_SOUNDS_OFF: -                  for (int i = 0; i < VOICES; ++i) -                        voices[i].isOn = false; -                  break; -            case CTRL_RESET_ALL_CTRL: -                  for (int i = 0; i < NUM_CONTROLLER; ++i) -                        setController(0, synthCtrl[i].num, synthCtrl[i].val); -                  break; -            default: -                  fprintf(stderr, "Organ:set unknown Ctrl 0x%x to 0x%x\n", ctrl, data); -                  return; -            } -      for (int i = 0; i < NUM_CONTROLLER; ++i) { -            if (synthCtrl[i].num == ctrl) { -                  synthCtrl[i].val = data; -                  break; -                  } -            } -      } - -//--------------------------------------------------------- -//   setController -//--------------------------------------------------------- - -bool Organ::setController(int channel, int ctrl, int data) -      { -      setController(ctrl, data); - -      switch (ctrl) { -            case HARM0: -            case HARM1: -            case HARM2: -            case HARM3: -            case HARM4: -            case HARM5: -            case ATTACK_LO: -            case DECAY_LO: -            case SUSTAIN_LO: -            case RELEASE_LO: -            case ATTACK_HI: -            case DECAY_HI: -            case SUSTAIN_HI: -            case RELEASE_HI: -            case BRASS: -            case FLUTE: -            case REED: -            case VELO: -                  { -                  MidiPlayEvent ev(0, 0, channel, ME_CONTROLLER, ctrl, data); -                  #ifdef ORGAN_DEBUG -                  fprintf(stderr, "OrganGui:setController before gui->writeEvent ctrl:%d data:%d\n", ctrl, data); -                  #endif -             -                  gui->writeEvent(ev); -                  } -                  break; -            default: -                  break; -            } -      return false; -      } - -//--------------------------------------------------------- -//   sysex -//--------------------------------------------------------- - -bool Organ::sysex(int n, const unsigned char* data) -      { -      #ifdef ORGAN_DEBUG -      printf("Organ: sysex\n"); -      #endif -      if (unsigned(n) != (NUM_INIT_CONTROLLER * sizeof(int))) { -            printf("Organ: unknown sysex\n"); -            return false; -            } -      int* s = (int*) data; -      for (int i = 0; i < NUM_INIT_CONTROLLER; ++i) { -            int val = *s++; -            #ifdef ORGAN_DEBUG -            printf("Organ: sysex before setController num:%d val:%d\n", synthCtrl[i].num, val); -            #endif -            setController(0, synthCtrl[i].num, val); -            } -      return false; -      } - -//--------------------------------------------------------- -//   getInitData -//--------------------------------------------------------- - -void Organ::getInitData(int* n, const unsigned char**p) const -      { -      int* d = idata; -      for (int i = 0; i < NUM_INIT_CONTROLLER; ++i) -            *d++ = synthCtrl[i].val; -      *n = NUM_INIT_CONTROLLER * sizeof(int); // sizeof(idata); -      *p = (unsigned char*)idata; -      } - -//--------------------------------------------------------- -//   MESS -//--------------------------------------------------------- - -//--------------------------------------------------------- -//   getControllerInfo -//--------------------------------------------------------- - -int Organ::getControllerInfo(int id, const char** name, int* controller, -   int* min, int* max, int* initval) const -      { -      if (id >= NUM_CONTROLLER) -            return 0; -      *controller = synthCtrl[id].num; -      *name       = synthCtrl[id].name; -      *initval    = synthCtrl[id].val; -       -      if(synthCtrl[id].num == CTRL_VOLUME) -      { -        *min = 0; -        *max = 127; -      } -      else -        gui->getControllerMinMax(id,min,max); -       -      //*min        = 0; -      //*max        = 128*128-1; -      return ++id; -      } - -//--------------------------------------------------------- -//   guiVisible -//--------------------------------------------------------- - -bool Organ::guiVisible() const -      { -      return gui->isVisible(); -      } - -//--------------------------------------------------------- -//   showGui -//--------------------------------------------------------- - -void Organ::showGui(bool val) -      { -      gui->setVisible(val); -      } - -//--------------------------------------------------------- -//   getGeometry -//--------------------------------------------------------- - -void Organ::getGeometry(int* x, int* y, int* w, int* h) const -      { -      QPoint pos(gui->pos()); -      QSize size(gui->size()); -      *x = pos.x(); -      *y = pos.y(); -      *w = size.width(); -      *h = size.height(); -      } - -//--------------------------------------------------------- -//   setGeometry -//--------------------------------------------------------- - -void Organ::setGeometry(int x, int y, int w, int h) -      { -      gui->resize(QSize(w, h)); -      gui->move(QPoint(x, y)); -      } - -//--------------------------------------------------------- -//   instantiate -//    construct a new synthesizer instance -//--------------------------------------------------------- - -static Mess* instantiate(int sr, QWidget*, QString* /*projectPathPtr*/, const char* name) -      { -      Organ* synth = new Organ(sr); -      if (synth->init(name)) { -            delete synth; -            synth = 0; -            } -      return synth; -      } - -//--------------------------------------------------------- -//   msynth_descriptor -//    Return a descriptor of the requested plugin type. -//--------------------------------------------------------- - -extern "C" { -      static MESS descriptor = { -            "Organ", -            "Organ based on David A. Bartold's LADSPA plugin", -            "0.1",      // version string -            MESS_MAJOR_VERSION, MESS_MINOR_VERSION, -            instantiate, -            }; -      // We must compile with -fvisibility=hidden to avoid namespace -      // conflicts with global variables. -      // Only visible symbol is "mess_descriptor". -      // (TODO: all plugins should be compiled this way) -   -      __attribute__ ((visibility("default"))) -      const MESS* mess_descriptor() { return &descriptor; } -      } - diff --git a/attic/muse2-oom/muse2/synti/organ/organ.h b/attic/muse2-oom/muse2/synti/organ/organ.h deleted file mode 100644 index 308646e1..00000000 --- a/attic/muse2-oom/muse2/synti/organ/organ.h +++ /dev/null @@ -1,198 +0,0 @@ -//========================================================= -//  MusE -//  Linux Music Editor -//  $Id: organ.h,v 1.5.2.3 2009/11/19 04:20:33 terminator356 Exp $ -// -//  Parts of this file taken from: -//      Organ - Additive Organ Synthesizer Voice -//      Copyright (c) 1999, 2000 David A. Bartold -// -//  (C) Copyright 2001-2004 Werner Schweer (ws@seh.de) -//========================================================= - -#ifndef __ORGAN_H__ -#define __ORGAN_H__ - -#include "muse/midictrl.h" -#include "libsynti/mess.h" - -#define RESOLUTION   (16384*2) -#define VOICES          128    // max polyphony - -class OrganGui; - -static const int MAX_ATTENUATION = 960; - -enum EnvelopeState { -      ATTACK, -      DECAY, -      SUSTAIN, -      RELEASE, -      OFF -      }; - -//--------------------------------------------------------- -//   Envelope -//--------------------------------------------------------- - -struct Envelope { -      int ticks;        // len of segment -      int error, delta, schritt; -      int y, yinc; - -      void set(int t, int y1, int y2) { -            ticks   = t; -            y       = y1; -            int dy  = y2 - y1; -            int dx  = t; -            error   = -dx; -            schritt = 2*dx; -            if (dy < 0) { -                  yinc = -1; -                  delta = -2 * dy; -                  } -            else { -                  yinc = 1; -                  delta   = 2 * dy; -                  } -            } - -      // return false on envelope end -      bool step(int* a) { -            *a = y; -            if (ticks == 0) -                  return false; -            error += delta; -            while (error > 0) { -                  y += yinc; -                  error -= schritt; -                  } -            --ticks; -            return true; -            } -      }; - -static const int HARM0      =  0 + CTRL_RPN14_OFFSET; -static const int HARM1      =  1 + CTRL_RPN14_OFFSET; -static const int HARM2      =  2 + CTRL_RPN14_OFFSET; -static const int HARM3      =  3 + CTRL_RPN14_OFFSET; -static const int HARM4      =  4 + CTRL_RPN14_OFFSET; -static const int HARM5      =  5 + CTRL_RPN14_OFFSET; -static const int ATTACK_LO  =  6 + CTRL_RPN14_OFFSET; -static const int DECAY_LO   =  7 + CTRL_RPN14_OFFSET; -static const int SUSTAIN_LO =  8 + CTRL_RPN14_OFFSET; -static const int RELEASE_LO =  9 + CTRL_RPN14_OFFSET; -static const int ATTACK_HI  = 10 + CTRL_RPN14_OFFSET; -static const int DECAY_HI   = 11 + CTRL_RPN14_OFFSET; -static const int SUSTAIN_HI = 12 + CTRL_RPN14_OFFSET; -static const int RELEASE_HI = 13 + CTRL_RPN14_OFFSET; -static const int BRASS      = 14 + CTRL_RPN14_OFFSET; -static const int FLUTE      = 15 + CTRL_RPN14_OFFSET; -static const int REED       = 16 + CTRL_RPN14_OFFSET; -static const int VELO       = 17 + CTRL_RPN14_OFFSET; - -//--------------------------------------------------------- -//   SynthCtrl -//--------------------------------------------------------- - -struct SynthCtrl { -      const char* name; -      int num; -      int val; -      }; - -//--------------------------------------------------------- -//   Voice -//--------------------------------------------------------- - -struct Voice { -      bool isOn; -      int pitch; -      int channel; - -      double velocity; - -      int state1, state2; -      Envelope envL1, envL2, envL3; -      Envelope envH1, envH2, envH3; - -      unsigned harm0_accum; -      unsigned harm1_accum; -      unsigned harm2_accum; -      unsigned harm3_accum; -      unsigned harm4_accum; -      unsigned harm5_accum; -      }; - -//--------------------------------------------------------- -//   Preset -//--------------------------------------------------------- - -struct Preset { -      char* name; -      bool brass, flute, reed; -      int attack0, attack1; -      int release0, release1; -      int decay0, decay1; -      double harm0, harm1, harm2, harm3, harm4, harm5; -      bool velo; -      }; - -//--------------------------------------------------------- -//   Organ -//--------------------------------------------------------- - -class Organ : public Mess { -      static int useCount; - -      static double cb2amp_tab[MAX_ATTENUATION]; -      static unsigned freq256[128]; -      static double cb2amp(int cb); - -      int* idata;  // buffer for init data - -      bool brass, flute, reed; -      int attack0, attack1; -      int release0, release1; -      int decay0, decay1;        // ticks -      int sustain0, sustain1;    // centibel -      bool velo; -      double volume; - -      double harm0, harm1, harm2, harm3, harm4, harm5; - -      Voice voices[VOICES]; - -      static float* sine_table; -      static float* g_triangle_table; -      static float* g_pulse_table; - -      void noteoff(int channel, int pitch); -      void setController(int ctrl, int val); - - -      OrganGui* gui; - -   public: -      virtual void processMessages(); -      virtual void process(float**, int, int); -      virtual bool playNote(int channel, int pitch, int velo); -      virtual bool setController(int channel, int ctrl, int val); - -      virtual int getControllerInfo(int, const char**, int*, int*, int*, int*) const; -      virtual void getInitData(int*, const unsigned char**) const; - -      virtual bool guiVisible() const; -      virtual void showGui(bool); -      virtual bool hasGui() const { return true; } -      virtual void getGeometry(int* x, int* y, int* w, int* h) const; -      virtual void setGeometry(int x, int y, int w, int h); -      virtual bool sysex(int, const unsigned char*); -      static SynthCtrl synthCtrl[]; -      Organ(int sampleRate); -      ~Organ(); -      bool init(const char* name); -      }; - -#endif - diff --git a/attic/muse2-oom/muse2/synti/organ/organgui.cpp b/attic/muse2-oom/muse2/synti/organ/organgui.cpp deleted file mode 100644 index 9b763fd6..00000000 --- a/attic/muse2-oom/muse2/synti/organ/organgui.cpp +++ /dev/null @@ -1,185 +0,0 @@ -//========================================================= -//  MusE -//  Linux Music Editor -//  $Id: organgui.cpp,v 1.16.2.3 2009/11/16 04:30:46 terminator356 Exp $ -// -//    This is a simple GUI implemented with QT for -//    organ software synthesizer. -// -//  (C) Copyright 2001-2004 Werner Schweer (ws@seh.de) -//========================================================= - -#include <unistd.h> -#include <stdlib.h> -#include <list> - -#include <QCheckBox> -#include <QSignalMapper> -#include <QSlider> -#include <QSocketNotifier> -#include <QSpinBox> - -#include "organgui.h" -#include "muse/midi.h" -#include "muse/midictrl.h" - -//#define ORGANGUI_DEBUG - -//--------------------------------------------------------- -//   OrganGui -//--------------------------------------------------------- - -OrganGui::OrganGui() -   : QWidget(0, Qt::Window), MessGui() -      { -      QSocketNotifier* s = new QSocketNotifier(readFd, QSocketNotifier::Read); -      connect(s, SIGNAL(activated(int)), SLOT(readMessage(int))); - -      dctrl[0]  = SynthGuiCtrl(p1,  lcd1,  SynthGuiCtrl::SLIDER); -      dctrl[1]  = SynthGuiCtrl(p2,  lcd2,  SynthGuiCtrl::SLIDER); -      dctrl[2]  = SynthGuiCtrl(p3,  lcd3,  SynthGuiCtrl::SLIDER); -      dctrl[3]  = SynthGuiCtrl(p4,  lcd4,  SynthGuiCtrl::SLIDER); -      dctrl[4]  = SynthGuiCtrl(p5,  lcd5,  SynthGuiCtrl::SLIDER); -      dctrl[5]  = SynthGuiCtrl(p6,  lcd6,  SynthGuiCtrl::SLIDER); -      dctrl[6]  = SynthGuiCtrl(p7,  lcd7,  SynthGuiCtrl::SLIDER); -      dctrl[7]  = SynthGuiCtrl(p8,  lcd8,  SynthGuiCtrl::SLIDER); -      dctrl[8]  = SynthGuiCtrl(p9,  lcd9,  SynthGuiCtrl::SLIDER); -      dctrl[9]  = SynthGuiCtrl(p10, lcd10, SynthGuiCtrl::SLIDER); -      dctrl[10] = SynthGuiCtrl(p11, lcd11, SynthGuiCtrl::SLIDER); -      dctrl[11] = SynthGuiCtrl(p12, lcd12, SynthGuiCtrl::SLIDER); -      dctrl[12] = SynthGuiCtrl(p13, lcd13, SynthGuiCtrl::SLIDER); -      dctrl[13] = SynthGuiCtrl(p14, lcd14, SynthGuiCtrl::SLIDER); -      dctrl[14] = SynthGuiCtrl(sw1,    0,  SynthGuiCtrl::SWITCH); -      dctrl[15] = SynthGuiCtrl(sw3,    0,  SynthGuiCtrl::SWITCH); -      dctrl[16] = SynthGuiCtrl(sw2,    0,  SynthGuiCtrl::SWITCH); -      dctrl[17] = SynthGuiCtrl(sw4,    0,  SynthGuiCtrl::SWITCH); - -      map = new QSignalMapper(this); -      for (int i = 0; i < NUM_GUI_CONTROLLER; ++i) { -            map->setMapping(dctrl[i].editor, i); -            if (dctrl[i].type == SynthGuiCtrl::SLIDER) -                  connect((QSlider*)(dctrl[i].editor), SIGNAL(valueChanged(int)), map, SLOT(map())); -            else if (dctrl[i].type == SynthGuiCtrl::SWITCH) -                  connect((QCheckBox*)(dctrl[i].editor), SIGNAL(toggled(bool)), map, SLOT(map())); -            } -      connect(map, SIGNAL(mapped(int)), this, SLOT(ctrlChanged(int))); - -      // work around for probable QT/WM interaction bug. -      // for certain window managers, e.g xfce, this window is -      // is displayed although not specifically set to show(); -      // bug: 2811156  	 Softsynth GUI unclosable with XFCE4 (and a few others) -      show(); -      hide(); -      } - -//--------------------------------------------------------- -//   ctrlChanged -//--------------------------------------------------------- - -void OrganGui::ctrlChanged(int idx) -      { -      SynthGuiCtrl* ctrl = &dctrl[idx]; -      int val = 0; -      if (ctrl->type == SynthGuiCtrl::SLIDER) { -            QSlider* slider = (QSlider*)(ctrl->editor); -            val = slider->value(); -            // By T356. Apply auto-bias center value. -            if(slider->minimum() < 0) -              val += 8192; -            } -      else if (ctrl->type == SynthGuiCtrl::SWITCH) { -            val = ((QCheckBox*)(ctrl->editor))->isChecked(); -            } -      sendController(0, idx + CTRL_RPN14_OFFSET, val); -      } - -//--------------------------------------------------------- -//   getControllerInfo -//    return min max values for controllers -//--------------------------------------------------------- -int OrganGui::getControllerMinMax(int id, int* min, int* max) const -      { -      if (id >= NUM_GUI_CONTROLLER) -            return 0; - -      const SynthGuiCtrl* ctrl = (const SynthGuiCtrl*)&dctrl[id]; -      //int val = 0; -      if (ctrl->type == SynthGuiCtrl::SLIDER) { -            QSlider* slider = (QSlider*)(ctrl->editor); -            *max = slider->maximum(); -            *min = slider->minimum(); -            //val = (slider->value() * 16383 + max/2) / max; -             -            //val = 16383 + 1/2  -            } -      else if (ctrl->type == SynthGuiCtrl::SWITCH) { -            //val = ((QCheckBox*)(ctrl->editor))->isOn(); -            *min=0; -            *max=1; -            } -      return ++id; -      } - -//--------------------------------------------------------- -//   setParam -//    set param in gui -//--------------------------------------------------------- - -void OrganGui::setParam(int param, int val) -      { -      #ifdef ORGANGUI_DEBUG -      fprintf(stderr, "OrganGui:setParam param:%d val:%d\n", param, val); -      #endif -       -      param &= 0xfff; -      if (param >= int(sizeof(dctrl)/sizeof(*dctrl))) { -            fprintf(stderr, "OrganGui: set unknown Ctrl 0x%x to 0x%x\n", param, val); -            return; -            } -      SynthGuiCtrl* ctrl = &dctrl[param]; -      ctrl->editor->blockSignals(true); -      if (ctrl->type == SynthGuiCtrl::SLIDER) { -            QSlider* slider = (QSlider*)(ctrl->editor); -//             int max = slider->maximum(); -//             if(val < 0) val = (val * max + 8191) / 16383 - 1; -//             else val = (val * max + 8191) / 16383; -             -            // By T356. Apply auto-bias center value. -            if(slider->minimum() < 0) -              val -= 8192; -             -            #ifdef ORGANGUI_DEBUG -            fprintf(stderr, "OrganGui:setParam setting slider val:%d\n", val); -            #endif -             -            slider->setValue(val); -            if (ctrl->label) -                  ((QSpinBox*)(ctrl->label))->setValue(val); -            } -      else if (ctrl->type == SynthGuiCtrl::SWITCH) { -            ((QCheckBox*)(ctrl->editor))->setChecked(val); -            } -      ctrl->editor->blockSignals(false); -      } - -//--------------------------------------------------------- -//   processEvent -//--------------------------------------------------------- - -void OrganGui::processEvent(const MidiPlayEvent& ev) -      { -      if (ev.type() == ME_CONTROLLER) -            setParam(ev.dataA(), ev.dataB()); -      else -            printf("OrganGui::illegal event type received\n"); -      } - -//--------------------------------------------------------- -//   readMessage -//--------------------------------------------------------- - -void OrganGui::readMessage(int) -      { -      MessGui::readMessage(); -      } - diff --git a/attic/muse2-oom/muse2/synti/organ/organgui.h b/attic/muse2-oom/muse2/synti/organ/organgui.h deleted file mode 100644 index f246198d..00000000 --- a/attic/muse2-oom/muse2/synti/organ/organgui.h +++ /dev/null @@ -1,45 +0,0 @@ -//========================================================= -//  MusE -//  Linux Music Editor -//  $Id: organgui.h,v 1.6.2.1 2005/12/29 23:33:50 spamatica Exp $ -// -//  (C) Copyright 2001-2004 Werner Schweer (ws@seh.de) -//========================================================= - -#ifndef __ORGANGUI_H__ -#define __ORGANGUI_H__ - -#include "ui_organguibase.h" -#include "organ.h" -#include "libsynti/gui.h" -//#include "libsynti/mpevent.h" -#include "muse/mpevent.h"    - -class QWidget; -class QSignalMapper; - -#define NUM_GUI_CONTROLLER 18 - -//--------------------------------------------------------- -//   OrganGui -//--------------------------------------------------------- - -class OrganGui : public QWidget, public Ui::OrganGuiBase, public MessGui { -      Q_OBJECT - -      QSignalMapper* map; -      SynthGuiCtrl dctrl[NUM_GUI_CONTROLLER]; -      void setParam(int, int); - -   private slots: -      void ctrlChanged(int idx); -      void readMessage(int); - -   public: -      virtual void processEvent(const MidiPlayEvent&); -      int getControllerMinMax(int id, int* min, int* max) const; -      OrganGui(); -      }; - -#endif - diff --git a/attic/muse2-oom/muse2/synti/organ/organguibase.ui b/attic/muse2-oom/muse2/synti/organ/organguibase.ui deleted file mode 100644 index d3ed5c5f..00000000 --- a/attic/muse2-oom/muse2/synti/organ/organguibase.ui +++ /dev/null @@ -1,1351 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>OrganGuiBase</class> - <widget class="QWidget" name="OrganGuiBase"> -  <property name="geometry"> -   <rect> -    <x>0</x> -    <y>0</y> -    <width>534</width> -    <height>366</height> -   </rect> -  </property> -  <property name="sizePolicy"> -   <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> -    <horstretch>0</horstretch> -    <verstretch>0</verstretch> -   </sizepolicy> -  </property> -  <property name="windowTitle"> -   <string>MusE: Organ</string> -  </property> -  <layout class="QGridLayout"> -   <property name="margin"> -    <number>4</number> -   </property> -   <property name="spacing"> -    <number>6</number> -   </property> -   <item row="1" column="0"> -    <widget class="QGroupBox" name="GroupBox1"> -     <property name="sizePolicy"> -      <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> -       <horstretch>0</horstretch> -       <verstretch>0</verstretch> -      </sizepolicy> -     </property> -     <property name="title"> -      <string>Drawbars</string> -     </property> -     <layout class="QGridLayout"> -      <property name="margin"> -       <number>6</number> -      </property> -      <property name="spacing"> -       <number>2</number> -      </property> -      <item row="0" column="0"> -       <widget class="QLabel" name="TextLabel1"> -        <property name="text"> -         <string>16'</string> -        </property> -        <property name="wordWrap"> -         <bool>false</bool> -        </property> -       </widget> -      </item> -      <item row="3" column="0"> -       <widget class="QLabel" name="TextLabel4"> -        <property name="text"> -         <string>4'</string> -        </property> -        <property name="wordWrap"> -         <bool>false</bool> -        </property> -       </widget> -      </item> -      <item row="4" column="0"> -       <widget class="QLabel" name="TextLabel5"> -        <property name="text"> -         <string>2 2/3'</string> -        </property> -        <property name="wordWrap"> -         <bool>false</bool> -        </property> -       </widget> -      </item> -      <item row="5" column="0"> -       <widget class="QLabel" name="TextLabel6"> -        <property name="text"> -         <string>2'</string> -        </property> -        <property name="wordWrap"> -         <bool>false</bool> -        </property> -       </widget> -      </item> -      <item row="2" column="0"> -       <widget class="QLabel" name="TextLabel2"> -        <property name="text"> -         <string>5 1/3'</string> -        </property> -        <property name="wordWrap"> -         <bool>false</bool> -        </property> -       </widget> -      </item> -      <item row="1" column="0"> -       <widget class="QLabel" name="TextLabel3"> -        <property name="text"> -         <string>8'</string> -        </property> -        <property name="wordWrap"> -         <bool>false</bool> -        </property> -       </widget> -      </item> -      <item row="1" column="2"> -       <widget class="QSlider" name="p2"> -        <property name="minimum"> -         <number>-960</number> -        </property> -        <property name="maximum"> -         <number>0</number> -        </property> -        <property name="pageStep"> -         <number>1</number> -        </property> -        <property name="orientation"> -         <enum>Qt::Horizontal</enum> -        </property> -        <property name="tickPosition"> -         <enum>QSlider::NoTicks</enum> -        </property> -        <property name="tickInterval"> -         <number>10</number> -        </property> -       </widget> -      </item> -      <item row="2" column="2"> -       <widget class="QSlider" name="p3"> -        <property name="minimum"> -         <number>-960</number> -        </property> -        <property name="maximum"> -         <number>0</number> -        </property> -        <property name="pageStep"> -         <number>1</number> -        </property> -        <property name="orientation"> -         <enum>Qt::Horizontal</enum> -        </property> -        <property name="tickPosition"> -         <enum>QSlider::NoTicks</enum> -        </property> -        <property name="tickInterval"> -         <number>10</number> -        </property> -       </widget> -      </item> -      <item row="3" column="2"> -       <widget class="QSlider" name="p4"> -        <property name="minimum"> -         <number>-960</number> -        </property> -        <property name="maximum"> -         <number>0</number> -        </property> -        <property name="pageStep"> -         <number>1</number> -        </property> -        <property name="orientation"> -         <enum>Qt::Horizontal</enum> -        </property> -        <property name="tickPosition"> -         <enum>QSlider::NoTicks</enum> -        </property> -        <property name="tickInterval"> -         <number>10</number> -        </property> -       </widget> -      </item> -      <item row="4" column="2"> -       <widget class="QSlider" name="p5"> -        <property name="minimum"> -         <number>-960</number> -        </property> -        <property name="maximum"> -         <number>0</number> -        </property> -        <property name="pageStep"> -         <number>1</number> -        </property> -        <property name="orientation"> -         <enum>Qt::Horizontal</enum> -        </property> -        <property name="tickPosition"> -         <enum>QSlider::NoTicks</enum> -        </property> -        <property name="tickInterval"> -         <number>10</number> -        </property> -       </widget> -      </item> -      <item row="5" column="2"> -       <widget class="QSlider" name="p6"> -        <property name="minimum"> -         <number>-960</number> -        </property> -        <property name="maximum"> -         <number>0</number> -        </property> -        <property name="pageStep"> -         <number>1</number> -        </property> -        <property name="orientation"> -         <enum>Qt::Horizontal</enum> -        </property> -        <property name="tickPosition"> -         <enum>QSlider::NoTicks</enum> -        </property> -        <property name="tickInterval"> -         <number>10</number> -        </property> -       </widget> -      </item> -      <item row="0" column="2"> -       <widget class="QSlider" name="p1"> -        <property name="sizePolicy"> -         <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> -          <horstretch>0</horstretch> -          <verstretch>0</verstretch> -         </sizepolicy> -        </property> -        <property name="minimum"> -         <number>-960</number> -        </property> -        <property name="maximum"> -         <number>0</number> -        </property> -        <property name="pageStep"> -         <number>1</number> -        </property> -        <property name="orientation"> -         <enum>Qt::Horizontal</enum> -        </property> -        <property name="tickPosition"> -         <enum>QSlider::NoTicks</enum> -        </property> -        <property name="tickInterval"> -         <number>10</number> -        </property> -       </widget> -      </item> -      <item row="0" column="1"> -       <widget class="QSpinBox" name="lcd1"> -        <property name="minimum"> -         <number>-960</number> -        </property> -        <property name="maximum"> -         <number>0</number> -        </property> -       </widget> -      </item> -      <item row="1" column="1"> -       <widget class="QSpinBox" name="lcd2"> -        <property name="minimum"> -         <number>-960</number> -        </property> -        <property name="maximum"> -         <number>0</number> -        </property> -        <property name="singleStep"> -         <number>10</number> -        </property> -       </widget> -      </item> -      <item row="2" column="1"> -       <widget class="QSpinBox" name="lcd3"> -        <property name="minimum"> -         <number>-960</number> -        </property> -        <property name="maximum"> -         <number>0</number> -        </property> -        <property name="singleStep"> -         <number>10</number> -        </property> -       </widget> -      </item> -      <item row="3" column="1"> -       <widget class="QSpinBox" name="lcd4"> -        <property name="minimum"> -         <number>-960</number> -        </property> -        <property name="maximum"> -         <number>0</number> -        </property> -        <property name="singleStep"> -         <number>10</number> -        </property> -       </widget> -      </item> -      <item row="4" column="1"> -       <widget class="QSpinBox" name="lcd5"> -        <property name="minimum"> -         <number>-960</number> -        </property> -        <property name="maximum"> -         <number>0</number> -        </property> -        <property name="singleStep"> -         <number>10</number> -        </property> -       </widget> -      </item> -      <item row="5" column="1"> -       <widget class="QSpinBox" name="lcd6"> -        <property name="minimum"> -         <number>-960</number> -        </property> -        <property name="maximum"> -         <number>0</number> -        </property> -        <property name="singleStep"> -         <number>10</number> -        </property> -       </widget> -      </item> -     </layout> -    </widget> -   </item> -   <item row="1" column="1"> -    <widget class="QGroupBox" name="GroupBox4"> -     <property name="sizePolicy"> -      <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> -       <horstretch>0</horstretch> -       <verstretch>0</verstretch> -      </sizepolicy> -     </property> -     <property name="title"> -      <string>Envelope Hi</string> -     </property> -     <layout class="QGridLayout"> -      <property name="margin"> -       <number>11</number> -      </property> -      <property name="spacing"> -       <number>2</number> -      </property> -      <item row="4" column="0"> -       <widget class="QLabel" name="TextLabel14"> -        <property name="text"> -         <string>Release</string> -        </property> -        <property name="wordWrap"> -         <bool>false</bool> -        </property> -       </widget> -      </item> -      <item row="2" column="0" rowspan="2"> -       <widget class="QLabel" name="TextLabel13"> -        <property name="text"> -         <string>Sustain</string> -        </property> -        <property name="wordWrap"> -         <bool>false</bool> -        </property> -       </widget> -      </item> -      <item row="1" column="0"> -       <widget class="QLabel" name="TextLabel12"> -        <property name="text"> -         <string>Decay</string> -        </property> -        <property name="wordWrap"> -         <bool>false</bool> -        </property> -       </widget> -      </item> -      <item row="0" column="0"> -       <widget class="QLabel" name="TextLabel11"> -        <property name="sizePolicy"> -         <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> -          <horstretch>0</horstretch> -          <verstretch>0</verstretch> -         </sizepolicy> -        </property> -        <property name="text"> -         <string>Attack</string> -        </property> -        <property name="wordWrap"> -         <bool>false</bool> -        </property> -       </widget> -      </item> -      <item row="4" column="2"> -       <widget class="QSlider" name="p14"> -        <property name="maximum"> -         <number>500</number> -        </property> -        <property name="pageStep"> -         <number>1</number> -        </property> -        <property name="orientation"> -         <enum>Qt::Horizontal</enum> -        </property> -        <property name="tickPosition"> -         <enum>QSlider::NoTicks</enum> -        </property> -        <property name="tickInterval"> -         <number>50</number> -        </property> -       </widget> -      </item> -      <item row="2" column="2"> -       <widget class="QSlider" name="p13"> -        <property name="minimum"> -         <number>-960</number> -        </property> -        <property name="maximum"> -         <number>0</number> -        </property> -        <property name="pageStep"> -         <number>1</number> -        </property> -        <property name="orientation"> -         <enum>Qt::Horizontal</enum> -        </property> -        <property name="tickPosition"> -         <enum>QSlider::NoTicks</enum> -        </property> -        <property name="tickInterval"> -         <number>10</number> -        </property> -       </widget> -      </item> -      <item row="1" column="2"> -       <widget class="QSlider" name="p12"> -        <property name="maximum"> -         <number>5000</number> -        </property> -        <property name="pageStep"> -         <number>1</number> -        </property> -        <property name="orientation"> -         <enum>Qt::Horizontal</enum> -        </property> -        <property name="tickPosition"> -         <enum>QSlider::NoTicks</enum> -        </property> -        <property name="tickInterval"> -         <number>500</number> -        </property> -       </widget> -      </item> -      <item row="0" column="1"> -       <widget class="QSpinBox" name="lcd11"> -        <property name="sizePolicy"> -         <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> -          <horstretch>0</horstretch> -          <verstretch>0</verstretch> -         </sizepolicy> -        </property> -        <property name="suffix"> -         <string>ms</string> -        </property> -        <property name="maximum"> -         <number>500</number> -        </property> -       </widget> -      </item> -      <item row="0" column="2"> -       <widget class="QSlider" name="p11"> -        <property name="sizePolicy"> -         <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> -          <horstretch>0</horstretch> -          <verstretch>0</verstretch> -         </sizepolicy> -        </property> -        <property name="maximum"> -         <number>500</number> -        </property> -        <property name="pageStep"> -         <number>1</number> -        </property> -        <property name="orientation"> -         <enum>Qt::Horizontal</enum> -        </property> -        <property name="tickPosition"> -         <enum>QSlider::NoTicks</enum> -        </property> -        <property name="tickInterval"> -         <number>50</number> -        </property> -       </widget> -      </item> -      <item row="1" column="1"> -       <widget class="QSpinBox" name="lcd12"> -        <property name="sizePolicy"> -         <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> -          <horstretch>0</horstretch> -          <verstretch>0</verstretch> -         </sizepolicy> -        </property> -        <property name="suffix"> -         <string>ms</string> -        </property> -        <property name="maximum"> -         <number>5000</number> -        </property> -       </widget> -      </item> -      <item row="2" column="1"> -       <widget class="QSpinBox" name="lcd13"> -        <property name="sizePolicy"> -         <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> -          <horstretch>0</horstretch> -          <verstretch>0</verstretch> -         </sizepolicy> -        </property> -        <property name="suffix"> -         <string>cB</string> -        </property> -        <property name="minimum"> -         <number>-960</number> -        </property> -        <property name="maximum"> -         <number>0</number> -        </property> -       </widget> -      </item> -      <item row="3" column="1" rowspan="2"> -       <widget class="QSpinBox" name="lcd14"> -        <property name="sizePolicy"> -         <sizepolicy hsizetype="Preferred" vsizetype="Fixed"> -          <horstretch>0</horstretch> -          <verstretch>0</verstretch> -         </sizepolicy> -        </property> -        <property name="suffix"> -         <string>ms</string> -        </property> -        <property name="maximum"> -         <number>500</number> -        </property> -       </widget> -      </item> -     </layout> -    </widget> -   </item> -   <item row="0" column="1"> -    <widget class="QGroupBox" name="GroupBox2"> -     <property name="sizePolicy"> -      <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> -       <horstretch>0</horstretch> -       <verstretch>0</verstretch> -      </sizepolicy> -     </property> -     <property name="title"> -      <string>Envelope Lo</string> -     </property> -     <property name="alignment"> -      <set>Qt::AlignLeading</set> -     </property> -     <layout class="QGridLayout"> -      <property name="margin"> -       <number>11</number> -      </property> -      <property name="spacing"> -       <number>2</number> -      </property> -      <item row="0" column="0"> -       <widget class="QLabel" name="TextLabel7"> -        <property name="text"> -         <string>Attack</string> -        </property> -        <property name="wordWrap"> -         <bool>false</bool> -        </property> -       </widget> -      </item> -      <item row="1" column="0"> -       <widget class="QLabel" name="TextLabel8"> -        <property name="text"> -         <string>Decay</string> -        </property> -        <property name="wordWrap"> -         <bool>false</bool> -        </property> -       </widget> -      </item> -      <item row="2" column="0"> -       <widget class="QLabel" name="TextLabel9"> -        <property name="text"> -         <string>Sustain</string> -        </property> -        <property name="wordWrap"> -         <bool>false</bool> -        </property> -       </widget> -      </item> -      <item row="3" column="0"> -       <widget class="QLabel" name="TextLabel10"> -        <property name="text"> -         <string>Release</string> -        </property> -        <property name="wordWrap"> -         <bool>false</bool> -        </property> -       </widget> -      </item> -      <item row="0" column="2"> -       <widget class="QSlider" name="p7"> -        <property name="sizePolicy"> -         <sizepolicy hsizetype="Expanding" vsizetype="Fixed"> -          <horstretch>0</horstretch> -          <verstretch>0</verstretch> -         </sizepolicy> -        </property> -        <property name="minimumSize"> -         <size> -          <width>80</width> -          <height>0</height> -         </size> -        </property> -        <property name="maximum"> -         <number>500</number> -        </property> -        <property name="pageStep"> -         <number>1</number> -        </property> -        <property name="orientation"> -         <enum>Qt::Horizontal</enum> -        </property> -        <property name="tickPosition"> -         <enum>QSlider::NoTicks</enum> -        </property> -        <property name="tickInterval"> -         <number>50</number> -        </property> -       </widget> -      </item> -      <item row="1" column="2"> -       <widget class="QSlider" name="p8"> -        <property name="maximum"> -         <number>5000</number> -        </property> -        <property name="pageStep"> -         <number>1</number> -        </property> -        <property name="orientation"> -         <enum>Qt::Horizontal</enum> -        </property> -        <property name="tickPosition"> -         <enum>QSlider::NoTicks</enum> -        </property> -        <property name="tickInterval"> -         <number>500</number> -        </property> -       </widget> -      </item> -      <item row="2" column="2"> -       <widget class="QSlider" name="p9"> -        <property name="minimum"> -         <number>-960</number> -        </property> -        <property name="maximum"> -         <number>0</number> -        </property> -        <property name="pageStep"> -         <number>1</number> -        </property> -        <property name="orientation"> -         <enum>Qt::Horizontal</enum> -        </property> -        <property name="tickPosition"> -         <enum>QSlider::NoTicks</enum> -        </property> -        <property name="tickInterval"> -         <number>10</number> -        </property> -       </widget> -      </item> -      <item row="3" column="2"> -       <widget class="QSlider" name="p10"> -        <property name="maximum"> -         <number>500</number> -        </property> -        <property name="pageStep"> -         <number>1</number> -        </property> -        <property name="orientation"> -         <enum>Qt::Horizontal</enum> -        </property> -        <property name="tickPosition"> -         <enum>QSlider::NoTicks</enum> -        </property> -        <property name="tickInterval"> -         <number>50</number> -        </property> -       </widget> -      </item> -      <item row="0" column="1"> -       <widget class="QSpinBox" name="lcd7"> -        <property name="sizePolicy"> -         <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> -          <horstretch>0</horstretch> -          <verstretch>0</verstretch> -         </sizepolicy> -        </property> -        <property name="suffix"> -         <string>ms</string> -        </property> -        <property name="maximum"> -         <number>500</number> -        </property> -       </widget> -      </item> -      <item row="1" column="1"> -       <widget class="QSpinBox" name="lcd8"> -        <property name="sizePolicy"> -         <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> -          <horstretch>0</horstretch> -          <verstretch>0</verstretch> -         </sizepolicy> -        </property> -        <property name="suffix"> -         <string>ms</string> -        </property> -        <property name="maximum"> -         <number>5000</number> -        </property> -       </widget> -      </item> -      <item row="2" column="1"> -       <widget class="QSpinBox" name="lcd9"> -        <property name="sizePolicy"> -         <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> -          <horstretch>0</horstretch> -          <verstretch>0</verstretch> -         </sizepolicy> -        </property> -        <property name="suffix"> -         <string>cB</string> -        </property> -        <property name="minimum"> -         <number>-960</number> -        </property> -        <property name="maximum"> -         <number>0</number> -        </property> -        <property name="value"> -         <number>0</number> -        </property> -       </widget> -      </item> -      <item row="3" column="1"> -       <widget class="QSpinBox" name="lcd10"> -        <property name="sizePolicy"> -         <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> -          <horstretch>0</horstretch> -          <verstretch>0</verstretch> -         </sizepolicy> -        </property> -        <property name="suffix"> -         <string>ms</string> -        </property> -        <property name="maximum"> -         <number>500</number> -        </property> -       </widget> -      </item> -     </layout> -    </widget> -   </item> -   <item row="0" column="0"> -    <layout class="QHBoxLayout"> -     <item> -      <widget class="QLabel" name="TextLabel1_2"> -       <property name="sizePolicy"> -        <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> -         <horstretch>0</horstretch> -         <verstretch>0</verstretch> -        </sizepolicy> -       </property> -       <property name="font"> -        <font> -         <pointsize>48</pointsize> -        </font> -       </property> -       <property name="text"> -        <string>O-1</string> -       </property> -       <property name="alignment"> -        <set>Qt::AlignCenter</set> -       </property> -       <property name="wordWrap"> -        <bool>false</bool> -       </property> -      </widget> -     </item> -     <item> -      <widget class="QGroupBox" name="GroupBox3"> -       <property name="sizePolicy"> -        <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> -         <horstretch>0</horstretch> -         <verstretch>0</verstretch> -        </sizepolicy> -       </property> -       <property name="title"> -        <string>Oscillator</string> -       </property> -       <layout class="QVBoxLayout"> -        <property name="spacing"> -         <number>2</number> -        </property> -        <property name="margin"> -         <number>11</number> -        </property> -        <item> -         <widget class="QCheckBox" name="sw1"> -          <property name="sizePolicy"> -           <sizepolicy hsizetype="Preferred" vsizetype="Minimum"> -            <horstretch>0</horstretch> -            <verstretch>0</verstretch> -           </sizepolicy> -          </property> -          <property name="text"> -           <string>Brass</string> -          </property> -         </widget> -        </item> -        <item> -         <widget class="QCheckBox" name="sw2"> -          <property name="sizePolicy"> -           <sizepolicy hsizetype="Preferred" vsizetype="Minimum"> -            <horstretch>0</horstretch> -            <verstretch>0</verstretch> -           </sizepolicy> -          </property> -          <property name="text"> -           <string>Reed</string> -          </property> -         </widget> -        </item> -        <item> -         <widget class="QCheckBox" name="sw3"> -          <property name="sizePolicy"> -           <sizepolicy hsizetype="Preferred" vsizetype="Minimum"> -            <horstretch>0</horstretch> -            <verstretch>0</verstretch> -           </sizepolicy> -          </property> -          <property name="text"> -           <string>Flute</string> -          </property> -         </widget> -        </item> -        <item> -         <spacer name="spacer1"> -          <property name="orientation"> -           <enum>Qt::Vertical</enum> -          </property> -          <property name="sizeType"> -           <enum>QSizePolicy::Expanding</enum> -          </property> -          <property name="sizeHint" stdset="0"> -           <size> -            <width>20</width> -            <height>20</height> -           </size> -          </property> -         </spacer> -        </item> -        <item> -         <widget class="QCheckBox" name="sw4"> -          <property name="text"> -           <string>Velocity</string> -          </property> -         </widget> -        </item> -       </layout> -      </widget> -     </item> -    </layout> -   </item> -  </layout> - </widget> - <layoutdefault spacing="6" margin="11"/> - <tabstops> -  <tabstop>p1</tabstop> -  <tabstop>p3</tabstop> -  <tabstop>p2</tabstop> -  <tabstop>p4</tabstop> -  <tabstop>p5</tabstop> -  <tabstop>p6</tabstop> -  <tabstop>p7</tabstop> -  <tabstop>p8</tabstop> -  <tabstop>p9</tabstop> -  <tabstop>p10</tabstop> -  <tabstop>p11</tabstop> -  <tabstop>p12</tabstop> -  <tabstop>p13</tabstop> -  <tabstop>p14</tabstop> -  <tabstop>sw1</tabstop> -  <tabstop>sw2</tabstop> -  <tabstop>sw3</tabstop> - </tabstops> - <resources/> - <connections> -  <connection> -   <sender>p11</sender> -   <signal>valueChanged(int)</signal> -   <receiver>lcd11</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>p12</sender> -   <signal>valueChanged(int)</signal> -   <receiver>lcd12</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>p13</sender> -   <signal>valueChanged(int)</signal> -   <receiver>lcd13</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>p14</sender> -   <signal>valueChanged(int)</signal> -   <receiver>lcd14</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>p7</sender> -   <signal>valueChanged(int)</signal> -   <receiver>lcd7</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>p8</sender> -   <signal>valueChanged(int)</signal> -   <receiver>lcd8</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>p9</sender> -   <signal>valueChanged(int)</signal> -   <receiver>lcd9</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>p10</sender> -   <signal>valueChanged(int)</signal> -   <receiver>lcd10</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>p1</sender> -   <signal>valueChanged(int)</signal> -   <receiver>lcd1</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>p2</sender> -   <signal>valueChanged(int)</signal> -   <receiver>lcd2</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>p3</sender> -   <signal>valueChanged(int)</signal> -   <receiver>lcd3</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>p4</sender> -   <signal>valueChanged(int)</signal> -   <receiver>lcd4</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>p5</sender> -   <signal>valueChanged(int)</signal> -   <receiver>lcd5</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>p6</sender> -   <signal>valueChanged(int)</signal> -   <receiver>lcd6</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>lcd1</sender> -   <signal>valueChanged(int)</signal> -   <receiver>p1</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>lcd2</sender> -   <signal>valueChanged(int)</signal> -   <receiver>p2</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>lcd3</sender> -   <signal>valueChanged(int)</signal> -   <receiver>p3</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>lcd4</sender> -   <signal>valueChanged(int)</signal> -   <receiver>p4</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>lcd5</sender> -   <signal>valueChanged(int)</signal> -   <receiver>p5</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>lcd6</sender> -   <signal>valueChanged(int)</signal> -   <receiver>p6</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>lcd7</sender> -   <signal>valueChanged(int)</signal> -   <receiver>p7</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>lcd8</sender> -   <signal>valueChanged(int)</signal> -   <receiver>p8</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>lcd9</sender> -   <signal>valueChanged(int)</signal> -   <receiver>p9</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>lcd10</sender> -   <signal>valueChanged(int)</signal> -   <receiver>p10</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>lcd11</sender> -   <signal>valueChanged(int)</signal> -   <receiver>p11</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>lcd12</sender> -   <signal>valueChanged(int)</signal> -   <receiver>p12</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>lcd13</sender> -   <signal>valueChanged(int)</signal> -   <receiver>p13</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>lcd14</sender> -   <signal>valueChanged(int)</signal> -   <receiver>p14</receiver> -   <slot>setValue(int)</slot> -   <hints> -    <hint type="sourcelabel"> -     <x>20</x> -     <y>20</y> -    </hint> -    <hint type="destinationlabel"> -     <x>20</x> -     <y>20</y> -    </hint> -   </hints> -  </connection> - </connections> -</ui> | 
