diff options
Diffstat (limited to 'attic/muse2-oom/muse2/synti/fluidsynth')
| -rw-r--r-- | attic/muse2-oom/muse2/synti/fluidsynth/CMakeLists.txt | 106 | ||||
| -rw-r--r-- | attic/muse2-oom/muse2/synti/fluidsynth/README.txt | 45 | ||||
| -rw-r--r-- | attic/muse2-oom/muse2/synti/fluidsynth/TODO | 13 | ||||
| -rw-r--r-- | attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth.qrc | 8 | ||||
| -rw-r--r-- | attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth0.png | bin | 1195 -> 0 bytes | |||
| -rw-r--r-- | attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth1.png | bin | 7252 -> 0 bytes | |||
| -rw-r--r-- | attic/muse2-oom/muse2/synti/fluidsynth/fluidsynthgui.cpp | 837 | ||||
| -rw-r--r-- | attic/muse2-oom/muse2/synti/fluidsynth/fluidsynthgui.h | 228 | ||||
| -rw-r--r-- | attic/muse2-oom/muse2/synti/fluidsynth/fluidsynthguibase.ui | 559 | ||||
| -rw-r--r-- | attic/muse2-oom/muse2/synti/fluidsynth/fluidsynti.cpp | 1325 | ||||
| -rw-r--r-- | attic/muse2-oom/muse2/synti/fluidsynth/fluidsynti.h | 151 | 
11 files changed, 0 insertions, 3272 deletions
| diff --git a/attic/muse2-oom/muse2/synti/fluidsynth/CMakeLists.txt b/attic/muse2-oom/muse2/synti/fluidsynth/CMakeLists.txt deleted file mode 100644 index 930d12d5..00000000 --- a/attic/muse2-oom/muse2/synti/fluidsynth/CMakeLists.txt +++ /dev/null @@ -1,106 +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 ( fluidsynth_mocs -      fluidsynthgui.h -      ) - -## -## UI files -## -file (GLOB fluidsynth_ui_files -      fluidsynthguibase.ui -      ) -QT4_WRAP_UI ( fluidsynth_uis ${fluidsynth_ui_files} ) - -## -## Resource files -## -QT4_ADD_RESOURCES (fluidsynth_qrc_files -      fluidsynth.qrc -      ) - -## -## List of source files to compile -## -file (GLOB fluidsynth_source_files -      fluidsynti.cpp  -      fluidsynthgui.cpp -      ) - -## -## Define target -## -add_library ( fluidsynth SHARED  -      ${fluidsynth_source_files} -      ${fluidsynth_mocs} -      ${fluidsynth_uis} -      ${fluidsynth_qrc_files} -      ) - -## -## Append to the list of translations -## -set (FILES_TO_TRANSLATE  -      ${FILES_TO_TRANSLATE} -      ${fluidsynth_source_files} -      ${fluidsynth_ui_files} -      CACHE INTERNAL "" -      ) - -## -## Compilation flags and target name -## -# - tell cmake to name target fluidsynth.so instead of  -#   libfluidsynth.so -# - use precompiled header files -# -set_target_properties ( fluidsynth  -      PROPERTIES PREFIX "" -      COMPILE_FLAGS "-fvisibility=hidden -include ${PROJECT_BINARY_DIR}/all-pic.h" -      LINK_FLAGS "${FLUIDSYN_LDFLAGS}"   # "-lfluidsynth" -      ) - - -## -## Linkage -## -target_link_libraries(fluidsynth -      synti -      ${QT_LIBRARIES} -      # Can't do this here, since FLUIDSYN_LIBRARIES evaluates  -      # to 'fluidsynth', the same name as our target. -      # ${FLUIDSYN_LIBRARIES} -      # Try giving full path:  Nope, path is empty! -      #${FLUIDSYN_LIBRARY_DIRS}/${FLUIDSYN_LIBRARIES} -      ) - -## -## Install location -## -install( TARGETS fluidsynth  -      DESTINATION ${MusE_SYNTHI_DIR} -      ) -install( FILES README.txt TODO -      DESTINATION ${MusE_DOC_DIR}/fluidsynth/ -      ) diff --git a/attic/muse2-oom/muse2/synti/fluidsynth/README.txt b/attic/muse2-oom/muse2/synti/fluidsynth/README.txt deleted file mode 100644 index 7764edb6..00000000 --- a/attic/muse2-oom/muse2/synti/fluidsynth/README.txt +++ /dev/null @@ -1,45 +0,0 @@ -README.txt ----------- - -Graphical frontend and built-in softsynth (MusE Experimental Soft Synth) for MusE, based on Fluidsynth -(http://www.fluidsynth.org). - -Features: ---------- -- Loading/unloading of soundfonts -- Easy control of fluidsynth's send effects and their parameters -- Mapping of soundfonts to fluidsynth channels -- Stores all settings in the current project file and automatically loads all effect parameters, -  soundfonts, channel settings and presets when re-opening the project. -- Makes it possible to use several soundfonts in one single fluidsynth instance (thereby reducing CPU usage since they share -  the same send effects) - - -Changelog/History ------------------ -040524 -- Err... Fount out that this changelog is neglected. See ../../Changelog.txt instead. -031019 -- Bugfixes and changes in storing/retrieving init parameters (Mathias Lundgren) -031009 -- Unloading of soundfonts works (Mathias Lundgren) -- Last dir stored in project-file (Mathias Lundgren) -- Ordinary controller-events enabled (Mathias Lundgren) -031008 -- Mapping of soundfonts to fluidchannels and selection of patches implemented. (Mathias Lundgren) -- Permanent storage of channels & patches. Extended GUI. (Mathias Lundgren) -031002 -- Various communication problems fixed between GUI and client (Mathias Lundgren) -- Storage of synth parameters and soundfonts enabled (Mathias Lundgren/Robert Jonsson) - -0309xx -- Problem with loading of soundfonts resulting in Jack timeout fixed by moving loading of soundfonts to separate thread. (Robert Jonsson) - -Original code written by Robert Ham (no information about the history of his work) - - -Known problems/TODO: --------------------------------------------------------------- -* Turning on the chorus and/or modifying chorus parameters locks the client. -* Illegal chorus parameters can be sent to fluidsynth. -* Drum patches (lbank=128) not implemented yet diff --git a/attic/muse2-oom/muse2/synti/fluidsynth/TODO b/attic/muse2-oom/muse2/synti/fluidsynth/TODO deleted file mode 100644 index e941e1e9..00000000 --- a/attic/muse2-oom/muse2/synti/fluidsynth/TODO +++ /dev/null @@ -1,13 +0,0 @@ - TODO - -o preset loading/saving -o configuration loading/saving -o soundfont information display -o remembering the last directory that was dealt with -o change gui<->synth communication to nrpns - - DONE - -o get all controllers working -o soundfont stack operations -o patch name retrieval diff --git a/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth.qrc b/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth.qrc deleted file mode 100644 index eda2c6ee..00000000 --- a/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth.qrc +++ /dev/null @@ -1,8 +0,0 @@ -<!DOCTYPE RCC> -<RCC version="1.0"> -   <qresource> -      <file>fluidsynth0.png</file> -      <file>fluidsynth1.png</file>       -   </qresource> -</RCC> - diff --git a/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth0.png b/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth0.pngBinary files differ deleted file mode 100644 index 2cb25b54..00000000 --- a/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth0.png +++ /dev/null diff --git a/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth1.png b/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth1.pngBinary files differ deleted file mode 100644 index 58ca0e61..00000000 --- a/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth1.png +++ /dev/null diff --git a/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynthgui.cpp b/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynthgui.cpp deleted file mode 100644 index 343391f8..00000000 --- a/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynthgui.cpp +++ /dev/null @@ -1,837 +0,0 @@ -/* - * MusE FLUID Synth softsynth plugin - * - * Copyright (C) 2004 Mathias Lundgren (lunar_shuttle@users.sourcforge.net) - * - * $Id: fluidsynthgui.cpp,v 1.13.2.2 2009/08/12 20:47:01 spamatica Exp $ - * - */ - -#include "fluidsynthgui.h" -#include "fluidsynti.h" - -#include <QFileDialog> -#include <QIcon> -#include <QLabel> -#include <QMenu> -#include <QSocketNotifier> -#include <QTableWidgetItem> -#include <QTreeWidgetItem> - -#include "muse/midi.h" -#include "icons.h" - - - /* -#include "muse/debug.h" -#include <iomanip> -#include <qtooltip.h> -#include <qapplication.h> -#include <qlistbox.h> -#define MUSE_FLUID_DEBUG      false -*/ - -FluidSynthGui::FluidSynthGui() -      : MessGui() -      { -      setWindowIcon(QIcon(":/fluidsynth0.png")); -      setupUi(this); -      channelListView->setRowCount(FS_MAX_NR_OF_CHANNELS); -      channelListView->setSelectionMode(QAbstractItemView::SingleSelection); -      QLabel *fluidLabel = new QLabel; -      fluidLabel->setPixmap(QIcon(":/fluidsynth1.png").pixmap(124, 45)); -      FluidGrid->addWidget(fluidLabel, 2, 1, Qt::AlignHCenter); - -      ChorusType->setItemIcon(0, QIcon(*sineIcon)); -      ChorusType->setItemIcon(1, QIcon(*sawIcon)); - -      //Connect socketnotifier to fifo -      QSocketNotifier* s = new QSocketNotifier(readFd, QSocketNotifier::Read); -      connect(s, SIGNAL(activated(int)), SLOT(readMessage(int))); -      connect (Push, SIGNAL (clicked()), SLOT(loadClicked())); - -      lastdir = ""; -       -      ReverbFrame->setEnabled(true); -      ChorusFrame->setEnabled(true); - -      if (!FS_DEBUG) -            dumpInfoButton->hide(); - -      //Init reverb sliders: -      /*ReverbRoomSize->setValue((int)(16383*FS_PREDEF_REVERB_ROOMSIZE)); -      ReverbDamping->setValue((int)(16383*FS_PREDEF_REVERB_DAMPING)); -      ReverbWidth->setValue((int)(16383*FS_PREDEF_REVERB_WIDTH));*/ - -      connect(Gain, SIGNAL(valueChanged(int)), SLOT(changeGain(int))); -      connect(dumpInfoButton	, SIGNAL(clicked()), SLOT(dumpInfo())); -      connect(channelListView, SIGNAL(itemClicked(QTableWidgetItem*)), -         this, SLOT(channelItemClicked(QTableWidgetItem*))); - -      connect(Reverb, SIGNAL (toggled(bool)), SLOT(toggleReverb(bool))); -      connect(ReverbLevel, SIGNAL (valueChanged (int)), SLOT(changeReverbLevel(int))); -      connect(ReverbRoomSize, SIGNAL (valueChanged (int)), SLOT(changeReverbRoomSize(int))); -      connect(ReverbDamping, SIGNAL (valueChanged (int)), SLOT(changeReverbDamping(int))); -      connect(ReverbWidth, SIGNAL (valueChanged (int)), SLOT(changeReverbWidth(int))); - -      connect (Pop, SIGNAL (clicked()), SLOT(popClicked())); -      connect(sfListView, SIGNAL(itemClicked(QTreeWidgetItem*, int)), -	 this, SLOT(sfItemClicked(QTreeWidgetItem*, int))); -      connect(Chorus, SIGNAL (toggled (bool)), SLOT(toggleChorus (bool))); -      connect(ChorusNumber, SIGNAL (valueChanged (int)), SLOT(changeChorusNumber (int))); -      connect(ChorusType, SIGNAL (activated (int)), SLOT(changeChorusType (int))); -      connect(ChorusSpeed, SIGNAL (valueChanged (int)), SLOT(changeChorusSpeed (int))); -      connect(ChorusDepth, SIGNAL (valueChanged (int)), SLOT(changeChorusDepth (int))); -      connect(ChorusLevel, SIGNAL (valueChanged (int)), SLOT(changeChorusLevel (int))); -/* -      _notifier = new QSocketNotifier(0, QSocketNotifier::Read); -      connect(_notifier, SIGNAL(activated(int)), SLOT(readData(int))); - -      //Setup the ListView -      sfListView->setColumnWidthMode(MUSE_FLUID_ID_COL,QListView::Maximum); -      sfListView->setColumnWidthMode(MUSE_FLUID_SFNAME_COL,QListView::Maximum); - -      sfListView->setColumnAlignment(MUSE_FLUID_ID_COL,AlignHCenter); -      sfListView->setSorting(MUSE_FLUID_ID_COL,true); -      channelListView->setColumnAlignment(MUSE_FLUID_CHANNEL_COL,AlignHCenter); - -      _currentlySelectedFont = -1; //No selected font to start with -      //  The GUI-process is killed every time the window is shut, -         //  need to get all parameters from the synth - -      requestAllParameters(); - -      */ - -      //Clear channels -      for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) -            channels[i] = FS_UNSPECIFIED_ID; - -      // 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(); -      } - -FluidSynthGui::~FluidSynthGui() -      { -      /* -      delete _notifier; -      */ -      } - -void FluidSynthGui::toggleReverb(bool on)         { sendController(0, FS_REVERB_ON, on); } -void FluidSynthGui::changeReverbLevel(int val)    { sendController(0, FS_REVERB_LEVEL, val); } -void FluidSynthGui::changeReverbRoomSize(int val) { sendController(0, FS_REVERB_ROOMSIZE, val); } -void FluidSynthGui::changeReverbWidth(int val)    { sendController(0, FS_REVERB_WIDTH, val); } -void FluidSynthGui::changeReverbDamping(int val)  { sendController(0, FS_REVERB_DAMPING, val); } - -void FluidSynthGui::toggleChorus(bool val)        { sendController(0, FS_CHORUS_ON, val); } -void FluidSynthGui::changeChorusNumber(int val)   { sendController(0, FS_CHORUS_NUM, val); } -void FluidSynthGui::changeChorusType(int val)     { sendController(0, FS_CHORUS_TYPE, val); } -void FluidSynthGui::changeChorusSpeed(int val)    { sendController(0, FS_CHORUS_SPEED, val); } -void FluidSynthGui::changeChorusDepth(int val)    { sendController(0, FS_CHORUS_DEPTH, val); } -void FluidSynthGui::changeChorusLevel(int val)    { sendController(0, FS_CHORUS_LEVEL, val); } - -      /* - -void FluidSynthGui::pushClicked() -      { -      const QString& fns = Filename->text(); -      if (fns.isEmpty()) -            return; -      const char * fn = fns.toLatin1(); - -      int datalen = strlen(fn) + 3; -      unsigned char data [datalen]; -      data[0] = MUSE_FLUID_SOUNDFONT_PUSH; -      data[1] = MUSE_FLUID_UNSPECIFIED_ID; //This makes the client choose next available external id -      memcpy(data + 2, fn, strlen(fn) + 1 ); //Store filename -      sendSysex(data, datalen); -      data[0] = MUSE_FLUID_GUI_REQ_SOUNDFONTS; //For simplicity's sake, just get all the soundfont data again. -      sendSysex(data, 1); -      printf("Gui sent Sysex.\n"); - -      return; -      } -      */ - -void FluidSynthGui::loadClicked() -      { -	QString filename = QFileDialog::getOpenFileName(this,  -                                                      tr("Choose soundfont"),  -                                                      lastdir,  -                                                      QString("*.[Ss][Ff]2")); - -      if (filename != QString::null) { -            int lastslash = filename.lastIndexOf('/'); -            lastdir = filename.left(lastslash); - -            sendLastdir(lastdir); -            sendLoadFont(filename); -            } -      } - -//--------------------------------------------------------- -//   sendLastdir -//   Send the last dir-value to the client -//--------------------------------------------------------- - -void FluidSynthGui::sendLastdir(QString dir) -      { -      int l = dir.length()+2; -      byte data[l]; -      data[0] = FS_LASTDIR_CHANGE; -      memcpy(data+1, dir.toLatin1(), dir.length()+1); -      sendSysex(data,l); -      } - -//--------------------------------------------------------- -//   sendLoadFont -//   Tell the client to load a font with first available id -//--------------------------------------------------------- - -void FluidSynthGui::sendLoadFont(QString filename) -      { -      int l = filename.length()+3; -      byte data[l]; -      data[0] = FS_PUSH_FONT; -      data[1] = FS_UNSPECIFIED_ID; -      memcpy(data+2, filename.toLatin1(), filename.length()+1); -      sendSysex(data,l); -      } - -//--------------------------------------------------------- -//   processEvent -//--------------------------------------------------------- - -void FluidSynthGui::processEvent(const MidiPlayEvent& ev) -      { -      //Sysexes sent from the client -      if (ev.type() == ME_SYSEX) { -            byte* data = ev.data(); -            switch (*data) { -                  case FS_LASTDIR_CHANGE: -                        lastdir = QString((const char*)data+1); -                        break; -                  case FS_ERROR: { -                        char* msg = (char*) (data+1); -                         -                        printf("Muse: fluidsynth error: %s\n", msg); -                         -                        break; -                        } -                  case FS_SEND_SOUNDFONTDATA: { -                        int chunk_len; -                        int filename_len; - -                        int count = (int)*(data+1); //Number of elements -                        byte* cp = data+2; //Point to beginning of first chunk -                        sfListView->clear(); //Clear the listview -                        stack.clear(); //Clear the stack since we're starting over again - -                        while (count) { -                              FluidGuiSoundFont font; -                              filename_len = strlen((const char*)cp) + 1; -                              font.name = (const char*)cp; -                              font.id = *(cp + filename_len); -                              chunk_len = filename_len + FS_SFDATALEN; -                              stack.push_front(font); -                              cp += chunk_len; //Move to next chunk -                              count--; -                              } -                        updateSoundfontListView(); -                        updateChannelListView(); -                        break; -                        } -                  case FS_SEND_CHANNELINFO: { -                        byte* chptr = (data+1); -                        for (int i=0; i< FS_MAX_NR_OF_CHANNELS; i++) { -                              byte id = *chptr; -                              byte channel = *(chptr+1); -                              channels[channel] = id; -                              chptr+=2; -                              } -                        updateChannelListView(); - -                        break; -                        } -                  case FS_SEND_DRUMCHANNELINFO: { -                        byte* drumchptr = (data+1); -                        for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) { -                              drumchannels[i] = *drumchptr; -                              drumchptr++; -                              } -                        updateChannelListView(); -                        break; -                        } -                  default: -                        if (FS_DEBUG) -                              printf("FluidSynthGui::processEvent() : Unknown Sysex received: %d\n", ev.type()); -                        break; -                  } -            } -            //Controllers sent from the client: -      else -            if(ev.type() == ME_CONTROLLER) { -                  int id = ev.dataA(); -                  int val = ev.dataB(); -                  switch (id) { -                        case FS_GAIN: { -                              bool sb = Gain->signalsBlocked(); -                              Gain->blockSignals(true); -                              // Update Gain-slider without causing it to respond to it's own signal (and send another msg to the synth) -                              Gain->setValue(val); -                              Gain->blockSignals(sb); -                              break; -                              } -                        case FS_REVERB_ON: { -                              bool sb = Reverb->signalsBlocked(); -                              Reverb->blockSignals(true); -                              Reverb->setChecked(val); -                              Reverb->blockSignals(sb); -                              break; -                              } -                        case FS_REVERB_LEVEL: { -                              bool sb = ReverbLevel->signalsBlocked(); -                              ReverbLevel->blockSignals(true); -                              ReverbLevel->setValue(val); -                              ReverbLevel->blockSignals(sb); -                              break; -                              } -                        case FS_REVERB_DAMPING: { -                              bool sb = ReverbDamping->signalsBlocked(); -                              ReverbDamping->blockSignals(true); -                              ReverbDamping->setValue(val); -                              ReverbDamping->blockSignals(sb); -                              break; -                              } -                        case FS_REVERB_ROOMSIZE: { -                              bool sb = ReverbRoomSize->signalsBlocked(); -                              ReverbRoomSize->blockSignals(true); -                              ReverbRoomSize->setValue(val); -                              ReverbRoomSize->blockSignals(sb); -                              break; -                              } -                        case FS_REVERB_WIDTH: { -                              bool sb = ReverbWidth->signalsBlocked(); -                              ReverbWidth->blockSignals(true); -                              ReverbWidth->setValue(val); -                              ReverbWidth->blockSignals(sb); -                              break; -                              } -                        case FS_CHORUS_ON: { -                              Chorus->blockSignals(true); -                              Chorus->setChecked(val); -                              Chorus->blockSignals(false); -                              break; -                              } -                        case FS_CHORUS_SPEED: { -                              ChorusSpeed->blockSignals(true); -                              ChorusSpeed->setValue(val); -                              ChorusSpeed->blockSignals(false); -                              break; -                              } -                        case FS_CHORUS_NUM: { -                              ChorusNumber->blockSignals(true); -                              ChorusNumber->setValue(val); -                              ChorusNumber->blockSignals(false); -                              break; -                              } -                        case FS_CHORUS_TYPE: { -                              ChorusType->blockSignals(true); -                              ChorusType->setCurrentIndex(val); -                              ChorusType->blockSignals(false); -                              break; -                              } -                        case FS_CHORUS_DEPTH: { -                              ChorusDepth->blockSignals(true); -                              ChorusDepth->setValue(val); -                              ChorusDepth->blockSignals(false); -                              break; -                              } -                        case FS_CHORUS_LEVEL: { -                              ChorusLevel->blockSignals(true); -                              ChorusLevel->setValue(val); -                              ChorusLevel->blockSignals(false); -                              break; -                              } -                        default: -                              if (FS_DEBUG) -                                    printf("FluidSynthGui::processEvent() : Unknown controller sent to gui: %x\n",id); -                              break; -                        } -                  } -      else -            if (FS_DEBUG) -                  printf("FluidSynthGui::processEvent - unknown event of type %dreceived from synth.\n", ev.type()); -      } - -//--------------------------------------------------------- -//   readMessage -//--------------------------------------------------------- -void FluidSynthGui::readMessage(int) -      { -      MessGui::readMessage(); -      } - -//--------------------------------------------------------- -//   updateChannels -//--------------------------------------------------------- -void FluidSynthGui::updateChannelListView() -      { -      if (FS_DEBUG) -            printf("FluidSynthGui::updateChannelListView\n"); -      channelListView->clearContents(); -      for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) { -            QString chanstr, sfidstr, drumchanstr; - -            //Soundfont id string: -            if (channels[i] == FS_UNSPECIFIED_ID) -                  sfidstr = "unspecified"; -            else -                  sfidstr = getSoundFontName(channels[i]); -            //Channel string: -            chanstr = QString::number(i+1); -            if (chanstr.length()==1) -                  chanstr = "0" + chanstr; - -            //Drumchan string: -            if (drumchannels[i]) -                  drumchanstr = "Yes"; -            else -                  drumchanstr = "No"; - -	    QTableWidgetItem* chan_ = new QTableWidgetItem(chanstr); -	    channelListView->setItem(i, FS_CHANNEL_COL, chan_); -	    QTableWidgetItem* sfid_ = new QTableWidgetItem(QIcon(*buttondownIcon), sfidstr); -	    channelListView->setItem(i, FS_SF_ID_COL, sfid_); -	    QTableWidgetItem* drum_ = new QTableWidgetItem(QIcon(*buttondownIcon), drumchanstr); -	    channelListView->setItem(i, FS_DRUM_CHANNEL_COL, drum_); -            } -      channelListView->resizeColumnsToContents(); -      } - -//--------------------------------------------------------- -//   updateSoundfontListView -//--------------------------------------------------------- -void FluidSynthGui::updateSoundfontListView() -      { -      sfListView->clear(); //Clear the listview -      for (std::list<FluidGuiSoundFont>::iterator it = stack.begin(); it != stack.end(); it++) { -            QTreeWidgetItem* qlvNewItem = new QTreeWidgetItem(sfListView); -            QString qsid = QString("%1").arg(it->id); -            qlvNewItem->setText(FS_ID_COL, qsid); -            qlvNewItem->setText(FS_SFNAME_COL, QString(it->name)); -            sfListView->addTopLevelItem(qlvNewItem); -            } -      sfListView->sortItems(1, Qt::AscendingOrder); -      } - -//--------------------------------------------------------- -//   changeGain -//--------------------------------------------------------- -void FluidSynthGui::changeGain(int value) -      { -      sendController(0, FS_GAIN, value); -      } - - -//--------------------------------------------------------- -//   dumpInfoButton -//--------------------------------------------------------- -void FluidSynthGui::dumpInfo() -      { -      byte data[1]; -      data[0] = FS_DUMP_INFO; -      sendSysex(data, 1); -      } - -//--------------------------------------------------------- -//   getSoundFontName -//--------------------------------------------------------- - -QString FluidSynthGui::getSoundFontName(int id) -      { -      QString name = NULL; -      for (std::list<FluidGuiSoundFont>::iterator it = stack.begin(); it != stack.end(); it++) { -            if (id == it->id) { -                  name = it->name; -                  continue; -                  } -            } -      return name; -      } - -//--------------------------------------------------------- -//   channelItemClicked -// change channel parameters like soundfont / drumchannel on/off -//--------------------------------------------------------- - -void FluidSynthGui::channelItemClicked(QTableWidgetItem* item)   -      { -      int col = item->column(); -      int row = item->row(); - -      if (col == FS_SF_ID_COL) { -            QMenu* popup = new QMenu(this); -            QPoint ppt = channelListView->visualItemRect(item).bottomLeft(); -            QTableWidget* listView = item->tableWidget(); -            ppt += QPoint(listView->horizontalHeader()->sectionPosition(col), listView->horizontalHeader()->height()); -            ppt = listView->mapToGlobal(ppt); - -            int i = 0; -            for (std::list<FluidGuiSoundFont>::reverse_iterator it = stack.rbegin(); it != stack.rend(); it++) { -                  i++; -                  /*byte* d = (byte*) it->name.toLatin1(); -                  for (int i=0; i<96; i++) { -                        if (i%16 == 0) -                              printf("%x:",(i+d)); - -                        printf("%x ",*(d-48+i)); - -                        if (i%16 == 15) -                              printf("\n"); -                        } -                  for (int i=0; i<96; i++) { -                        if (i%16 == 0) -                              printf("%x:",(i+d-48)); - -                        printf("%c ",*(d-48+i)); - -                        if (i%16 == 15) -                              printf("\n"); -                        } -                  printf("\n\n");*/ -                  QAction* act1 = popup->addAction(it->name); -		  act1->setData(i); -                  } -            int lastindex = i+1; -            QAction *lastaction = popup->addAction("unspecified"); -	    lastaction->setData(lastindex); -            QAction * act = popup->exec(ppt, 0); -            if (act) { -	          int index = act->data().toInt(); -                  byte sfid; -                  QString fontname; -                  if (index == lastindex) { -                        sfid = FS_UNSPECIFIED_ID; -                        fontname = "unspecified";	//Actually, it's not possible to reset fluid-channels as for now, -                        } //so this is just a dummy that makes the synth block any events for the channel -                  else { -                        sfid = getSoundFontId(act->text()); -                        fontname = getSoundFontName(sfid); -                        } -                  //byte channel = atoi(item->text().toLatin1()) - 1; -                  byte channel = row; -                  sendChannelChange(sfid, channel); -                  item->setText(fontname); -                  } -            delete popup; -         } -         // Drumchannel column: -      else if (col == FS_DRUM_CHANNEL_COL) { -            QMenu* popup = new QMenu(this); -            QPoint ppt = channelListView->visualItemRect(item).bottomLeft(); -            QTableWidget* listView = item->tableWidget(); -            ppt += QPoint(listView->horizontalHeader()->sectionPosition(col), listView->horizontalHeader()->height()); -            ppt = listView->mapToGlobal(ppt); -	    QAction * yes = popup->addAction("Yes"); -	    yes->setData(1); -            QAction * no = popup->addAction("No"); -	    no->setData(0); -            //byte channel = atoi(item->text().toLatin1()) - 1; -            byte channel = row; - -            QAction * act2 = popup->exec(ppt, 0); -	    if (act2) { -	          int index = act2->data().toInt(); -		  if (index != drumchannels[channel]) { -		        sendDrumChannelChange(index, channel); -                        drumchannels[channel] = index; -                        item->setText(index == 0 ? "No" : "Yes" ); -                        } -	          } -            delete popup; -            } -      } - -//--------------------------------------------------------- -//   getSoundFontId -//--------------------------------------------------------- - -int FluidSynthGui::getSoundFontId(QString q) -      { -      int id = -1; -      for (std::list<FluidGuiSoundFont>::iterator it = stack.begin(); it != stack.end(); it++) { -            if (q == it->name) -                  id = it->id; -            } -      return id; -      } - -//--------------------------------------------------------- -//   sendChannelChange -// Tell the client to set a soundfont to a specific fluid channel -//--------------------------------------------------------- - -void FluidSynthGui::sendChannelChange(byte font_id, byte channel) -      { -      byte data[3]; -      data[0] = FS_SOUNDFONT_CHANNEL_SET; -      data[1] = font_id; -      data[2] = channel; -      sendSysex(data, 3); -      } - -//--------------------------------------------------------- -//   sendDrumChannelChange -// Tell the client to set a specific channel to drum channel (equiv to midichan 10) -//--------------------------------------------------------- -void FluidSynthGui::sendDrumChannelChange(byte onoff, byte channel) -      { -      byte data[3]; -      data[0] = FS_DRUMCHANNEL_SET; -      data[1] = onoff; -      data[2] = channel; -      sendSysex(data, 3); -      if (FS_DEBUG) -            printf("Sent FS_DRUMCHANNEL_SET for channel %d, status: %d\n", channel, onoff); -      } - -void FluidSynthGui::popClicked() -      { -      byte data[2]; -      data[0] = FS_SOUNDFONT_POP; -      data[1] = currentlySelectedFont; -      sendSysex(data,2); -      } - -void FluidSynthGui::sfItemClicked(QTreeWidgetItem* item, int /*col*/) -      { -      if (item != 0) { -            currentlySelectedFont = atoi(item->text(FS_ID_COL).toLatin1().constData()); -            Pop->setEnabled(true); -            } -      else { -            currentlySelectedFont = -1; -            Pop->setEnabled(false); -            } -      } - -#if 0 - - - -void FluidSynthGui::readData (int fd) -      { -      unsigned char buffer[512]; -      int n = ::read(fd, buffer, 512); -//      dataInput(buffer, n); -      } - - - -void FluidSynthGui::changeReverbRoomSize (int value) { -	sendParameterChange(MUSE_FLUID_PARAMETER_REVERB, -				"roomsize", value); -} - -void FluidSynthGui::changeReverbDamping (int value) { -	sendParameterChange(MUSE_FLUID_PARAMETER_REVERB, -				"damping", value); -} - -void FluidSynthGui::changeReverbWidth (int value) { -	sendParameterChange(MUSE_FLUID_PARAMETER_REVERB, -				"width", value); -} - - -void FluidSynthGui::changeChorusNumber (int value) { -	sendParameterChange(MUSE_FLUID_PARAMETER_CHORUS, -				"number", value); -} - -void FluidSynthGui::changeChorusType (int value) { -	sendParameterChange(MUSE_FLUID_PARAMETER_CHORUS, -				"type", value); -} - -void FluidSynthGui::changeChorusSpeed (int value) { -	sendParameterChange(MUSE_FLUID_PARAMETER_CHORUS, -				"speed", value); //TODO: Right now illegal values may be sent. -				//Make sure they stay within fluidsynths legal boundaries (0.29-5Hz) dunno what that is in doubles -				//This might be the case for the other chorus parameters as well -} - -void FluidSynthGui::changeChorusDepth (int value) { -	sendParameterChange(MUSE_FLUID_PARAMETER_CHORUS, -				"depth", value); -} - -void FluidSynthGui::changeChorusLevel (int value) { -	sendParameterChange(MUSE_FLUID_PARAMETER_CHORUS, -				"level", value); -} - - -void FluidSynthGui::sysexReceived(unsigned char const * data, int len) -      { -      char * cp; -      double * dp; -      //std::cerr << "FluidSynthGui, sysexReceived: " << (int) *data << std::endl; -      switch (*data) { -            case MUSE_FLUID_CLIENT_SEND_PARAMETER: -                  cp = (char *) (data + 2); -                  dp = (double *) (data + strlen (cp) + 3); -                  setParameter ((int) *(data+1), cp, *dp); -                  break; - -            case MUSE_FLUID_GAIN_GET: -                  dp = (double *) (data + 1); -                  Gain->setValue ((int) (*dp * 12.8)); -                  break; - -            case MUSE_FLUID_CLIENT_LASTDIR_CHANGE: { -                  if (*(char*)(data+1) != MUSE_FLUID_UNSPECIFIED_LASTDIR) -                        _lastDir = QString((char*)(data+1)); -                  else -                        _lastDir=""; -            } - -            default: -            break; -      } -      } - - - - - - - -void FluidSynthGui::requestAllParameters () { -      unsigned char data[1]; - -      //data[0] = MUSE_FLUID_ADVGUI_GET; -      //sendSysex (data, 1); -      dbgMsg("Requesting all parameters!\n"); -      sendParameterRequest (MUSE_FLUID_PARAMETER_REVERB, "on"); -      sendParameterRequest (MUSE_FLUID_PARAMETER_REVERB, "roomsize"); -      sendParameterRequest (MUSE_FLUID_PARAMETER_REVERB, "damping"); -      sendParameterRequest (MUSE_FLUID_PARAMETER_REVERB, "width"); -      sendParameterRequest (MUSE_FLUID_PARAMETER_REVERB, "level"); -      sendParameterRequest (MUSE_FLUID_PARAMETER_CHORUS, "on"); -      sendParameterRequest (MUSE_FLUID_PARAMETER_CHORUS, "number"); -      sendParameterRequest (MUSE_FLUID_PARAMETER_CHORUS, "type"); -      sendParameterRequest (MUSE_FLUID_PARAMETER_CHORUS, "speed"); -      sendParameterRequest (MUSE_FLUID_PARAMETER_CHORUS, "depth"); -      sendParameterRequest (MUSE_FLUID_PARAMETER_CHORUS, "level"); -      data[0] = MUSE_FLUID_GAIN_GET; -      sendSysex (data, 1); -      data[0] = MUSE_FLUID_GUI_REQ_SOUNDFONTS; -      sendSysex (data, 1); -} - -bool FluidSynthGui::sendParameterRequest (int parameterSet, const char * parameter) { -      size_t parameterMem = strlen (parameter) + 1; -      int datalen = 2 + parameterMem; -      unsigned char * data = new unsigned char [datalen]; -      *data = MUSE_FLUID_GUI_REQ_FXPARAMETER_GET; -      *(data + 1) = (char) parameterSet; -      memcpy (data + 2, parameter, parameterMem); -      sendSysex (data, datalen); -      delete data; -      return true; -} - -void FluidSynthGui::setParameter (int parameterSet, const char * parameter, double value) { -  int ival = (int) (value * 128); -  std::string ps (parameter); -  if (parameterSet == MUSE_FLUID_PARAMETER_REVERB) { -           if (ps == "roomsize") { -      ReverbRoomSize->setValue (ival); -    } else if (ps == "damping") { -      ReverbDamping->setValue (ival); -    } else if (ps == "width") { -      ReverbWidth->setValue (ival); -    } else if (ps == "level") { -      ReverbLevel->setValue (ival); -    } else if (ps == "on") { -      Reverb->setChecked (ival); -    } -  } else { -           if (ps == "number") { -      ChorusNumber->setValue (ival); -    } else if (ps == "type") { -      ChorusType->setCurrentItem (ival); -    } else if (ps == "speed") { -      ChorusSpeed->setValue (ival); -    } else if (ps == "depth") { -      ChorusDepth->setValue (ival); -    } else if (ps == "level") { -      ChorusLevel->setValue (ival); -    } else if (ps == "on") { -      Chorus->setChecked (ival); -    } -  } -} - -//Sends parameter to reverb or chorus -bool FluidSynthGui::sendParameterChange (int parameterSet, const char * parameter, int value) { -  size_t parameterMem = strlen (parameter) + 1; -  int datalen = 2 + parameterMem + sizeof (double); -  unsigned char * data = new unsigned char [datalen]; -  *data = (unsigned char) MUSE_FLUID_GUI_REQ_FXPARAMETER_SET; -  *(data + 1) = (unsigned char) parameterSet; -  memcpy (data + 2, parameter, parameterMem); -  double * dp = (double *) (data + 2 + parameterMem); -  *dp = ((double) value) / ((double) 128.0); -  sendSysex (data, datalen); -  delete data; -  return true; -} - -void FluidSynthGui::dbgMsg(const char* msg) -      { -      if (MUSE_FLUID_DEBUG) -            std::cerr << msg << std::endl; -      } -//--------------------------------------------------------- -//   main -//--------------------------------------------------------- - -/*QString museProject; -QString museGlobalShare; -QString museUser;*/ - - -int main(int argc, char* argv[]) -{ -/* -  museUser = getenv("MUSEHOME"); -  if (museUser == 0) -    museUser = getenv("HOME"); -  museGlobalShare = getenv("MUSE"); -  if (museGlobalShare == 0) { -    museGlobalShare = "/usr/muse"; -    if (access(museGlobalShare.toLatin1(), R_OK) != 0) { -      museGlobalShare = "/usr/local/muse"; -      if (access(museGlobalShare.toLatin1(), R_OK) != 0) -        museGlobalShare = museUser; -    } -  }*/ -	char * instanceName = argv[1]; -	QApplication app (argc, argv, true); -	QWidget* w = new FluidSynthGui (); -	if (argc > 1) -	w->setCaption(QString(instanceName)); -	w->show(); -	app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit())); -	qApp->exec(); -} - -#endif diff --git a/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynthgui.h b/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynthgui.h deleted file mode 100644 index 5b39723e..00000000 --- a/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynthgui.h +++ /dev/null @@ -1,228 +0,0 @@ -/* - * MusE FLUID Synth softsynth plugin - * - * Copyright (C) 2004 Mathias Lundgren (lunar_shuttle@users.sourcforge.net) - * - * $Id: fluidsynthgui.h,v 1.10.2.3 2009/02/02 21:38:02 terminator356 Exp $ - * - */ - -#ifndef __MUSE_FLUIDSYNTHGUI_H__ -#define __MUSE_FLUIDSYNTHGUI_H__ - -#include "ui_fluidsynthguibase.h" -#include "libsynti/gui.h" -#include <list> - -class QDialog; -class QTreeWidgetItem; - -struct FluidChannel; -#define FS_DEBUG 0 //Turn on/off debug -/* -#include <list> -#include <string> -#include <qscrollview.h> - -#include <qevent.h> -#include <qmenubar.h> -#include <qsocketnotifier.h> -#include <alsa/asoundlib.h> -#include <qlistview.h> -#include <qheader.h> -#include "muse/debug.h" -*/ - -#define FS_MAX_NR_OF_CHANNELS          16 -#define FS_UNSPECIFIED_FONT           126 -#define FS_UNSPECIFIED_ID             127 -#define FS_UNSPECIFIED_PRESET         129 -#define FS_CHANNEL_COL                  0 -#define FS_ID_COL                       0 -#define FS_SFNAME_COL                   1 -#define FS_SF_ID_COL                    1 -#define FS_DRUM_CHANNEL_COL             2 - -#define FS_SFDATALEN                    1 -#define FS_VERSION_MAJOR                0 -#define FS_VERSION_MINOR                4 -#define FS_INIT_DATA_HEADER_SIZE        4 -#define FS_INIT_CHANNEL_SECTION       255 - -// Predefined init-values for fluidsynth -#define FS_PREDEF_VOLUME               0.063 -#define FS_PREDEF_REVERB_LEVEL         0.125 -#define FS_PREDEF_REVERB_ROOMSIZE      0.125 -#define FS_PREDEF_REVERB_DAMPING       0.3 -#define FS_PREDEF_REVERB_WIDTH         0.125 -#define FS_PREDEF_CHORUS_NUM           3 -#define FS_PREDEF_CHORUS_TYPE          1 -#define FS_PREDEF_CHORUS_SPEED         0.5 -#define FS_PREDEF_CHORUS_DEPTH         0.3 -#define FS_PREDEF_CHORUS_LEVEL         0.5 -typedef unsigned char byte; - - -/* - - -#define MUSE_FLUID_UNSPECIFIED_CHANNEL	127 - - -#define MUSE_FLUID_UNSPECIFIED_LASTDIR	127 -*/ - -//Various messages the gui and the client uses to communicate -enum { -      FS_LASTDIR_CHANGE = 1, -      FS_PUSH_FONT -      }; - -enum { -      //FS_GAIN_SET, -      FS_SEND_SOUNDFONTDATA = 4, -      FS_SEND_CHANNELINFO, //Used by synth to send info about all channels, on init -      FS_SOUNDFONT_CHANNEL_SET, -      FS_SOUNDFONT_POP, -      FS_SEND_DRUMCHANNELINFO, //Used by synth to send drumchannel status about all channels, on init -      FS_DRUMCHANNEL_SET //Used by gui to set drumchannel status for specific channel -      }; - -enum -      { -      FS_DUMP_INFO = 240, -      FS_ERROR, -      FS_INIT_DATA -      }; -/* -enum { -      MUSE_FLUID_REVERB = 100, -      MUSE_FLUID_REVERB_ROOMSIZE, -      MUSE_FLUID_REVERB_DAMPING, -      MUSE_FLUID_REVERB_WIDTH, -      MUSE_FLUID_REVERB_LEVEL, -      MUSE_FLUID_CHORUS, -      MUSE_FLUID_CHORUS_NUMBER, -      MUSE_FLUID_CHORUS_TYPE, -      MUSE_FLUID_CHORUS_SPEED, -      MUSE_FLUID_CHORUS_DEPTH, -      MUSE_FLUID_CHORUS_LEVEL, -      MUSE_FLUID_GAIN, -      MUSE_FLUID_SOUNDFONT, -      MUSE_FLUID_STRING, -      MUSE_FLUID_STRING_END -      }; - -enum { -      MUSE_FLUID_CLIENT_SEND_PARAMETER = 33, -      MUSE_FLUID_CLIENT_SEND_SOUNDFONTS, -      MUSE_FLUID_PARAMETER_GET, -      MUSE_FLUID_PARAMETER_REVERB, -      MUSE_FLUID_PARAMETER_CHORUS, - -      MUSE_FLUID_GAIN_GET, -      MUSE_FLUID_SOUNDFONT_PUSH, -      MUSE_FLUID_SOUNDFONT_POP, - -      MUSE_FLUID_CLIENT_SEND_ERROR = 44, -      MUSE_FLUID_SOUNDFONT_LOAD, -      , -      MUSE_FLUID_CLIENT_RESTORE_CHANNELDATA, -      MUSE_FLUID_CLIENT_INIT_PARAMS, -      MUSE_FLUID_CLIENT_LASTDIR_CHANGE, - -      MUSE_FLUID_GUI_REQ_SOUNDFONTS = 60, -      MUSE_FLUID_GUI_REQ_FXPARAMETER_SET, -      MUSE_FLUID_GUI_REQ_FXPARAMETER_GET, -      MUSE_FLUID_GUI_SEND_ERROR, -      MUSE_FLUID_GUI_LASTDIR_CHANGE -      }; -*/ - -struct FluidGuiSoundFont -      { -      QString filename; -      QString name; -      byte id; -      }; - -//--------------------------------------------------------- -//   FluidSynthGui -//--------------------------------------------------------- - -class FluidSynthGui : public QDialog, public Ui::FLUIDSynthGuiBase, public MessGui -   { -   Q_OBJECT -   private: -      virtual void processEvent(const MidiPlayEvent& ev); -      void sendLastdir(QString); -      void sendLoadFont(QString); -      void sendChannelChange(byte font_id, byte channel); -      void sendDrumChannelChange(byte onoff, byte channel); -      void updateSoundfontListView(); -      void updateChannelListView(); - -      QString getSoundFontName(int id); -      int getSoundFontId(QString q); -      QString lastdir; -      std::list<FluidGuiSoundFont> stack; -      byte channels[FS_MAX_NR_OF_CHANNELS]; //Array of bytes, for mapping soundfonts to individual channels -      byte drumchannels[FS_MAX_NR_OF_CHANNELS]; // Array of bytes for setting channels to drumchannels or not (equiv to midichan 10) - -      int currentlySelectedFont; //Font currently selected in sfListView. -1 if none selected - -/* -      unsigned _smallH; -      unsigned _bigH; -      QSocketNotifier * _notifier; -      bool sendParameterChange (int, const char *, int); -      void setParameter (int, const char *, double); -      void requestAllParameters (); -      void dbgMsg(const char*); -      bool sendParameterRequest(int, const char *); -      //void dealWithSysex (unsigned char const * data, int datalen); - - - - - - -*/ -   private slots: -      void loadClicked(); -      void readMessage(int); -      void changeGain(int); -      void dumpInfo(); -      void channelItemClicked(QTableWidgetItem* item); -      void toggleReverb(bool); -      void changeReverbLevel (int); -      void changeReverbRoomSize(int val); -      void changeReverbWidth(int val); -      void changeReverbDamping(int val); -      void toggleChorus(bool); -      void changeChorusNumber(int); -      void changeChorusType(int); -      void changeChorusSpeed(int); -      void changeChorusDepth(int); -      void changeChorusLevel(int); - -      void popClicked(); -      void sfItemClicked(QTreeWidgetItem* item, int); -      /* -      void readData(int); - - - - -      */ - -   public: -//      virtual void sysexReceived (const unsigned char *, int); -//    virtual void controllerReceived(int, int, int); - -      FluidSynthGui(); -      ~FluidSynthGui(); -}; - - -#endif /* __MUSE_FLUIDSYNTHGUI_H__ */ diff --git a/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynthguibase.ui b/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynthguibase.ui deleted file mode 100644 index d6488bab..00000000 --- a/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynthguibase.ui +++ /dev/null @@ -1,559 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>FLUIDSynthGuiBase</class> - <widget class="QDialog" name="FLUIDSynthGuiBase"> -  <property name="geometry"> -   <rect> -    <x>0</x> -    <y>0</y> -    <width>617</width> -    <height>514</height> -   </rect> -  </property> -  <property name="windowTitle"> -   <string>FLUID Synth</string> -  </property> -  <layout class="QHBoxLayout" name="_2"> -   <property name="spacing"> -    <number>1</number> -   </property> -   <item> -    <layout class="QGridLayout" name="FluidGrid"> -     <item row="2" column="0"> -      <widget class="QFrame" name="DiskButtons"> -       <property name="frameShape"> -        <enum>QFrame::StyledPanel</enum> -       </property> -       <property name="frameShadow"> -        <enum>QFrame::Raised</enum> -       </property> -       <layout class="QHBoxLayout"> -        <item> -         <widget class="QPushButton" name="Push"> -          <property name="text"> -           <string>Load</string> -          </property> -         </widget> -        </item> -        <item> -         <widget class="QPushButton" name="Pop"> -          <property name="enabled"> -           <bool>false</bool> -          </property> -          <property name="text"> -           <string>Delete</string> -          </property> -         </widget> -        </item> -        <item> -         <widget class="QPushButton" name="dumpInfoButton"> -          <property name="text"> -           <string>Dump Info</string> -          </property> -         </widget> -        </item> -       </layout> -      </widget> -     </item> -     <item row="1" column="0"> -      <widget class="QTreeWidget" name="sfListView"> -       <property name="sizePolicy"> -        <sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding"> -         <horstretch>0</horstretch> -         <verstretch>0</verstretch> -        </sizepolicy> -       </property> -       <column> -        <property name="text"> -         <string>ID</string> -        </property> -       </column> -       <column> -        <property name="text"> -         <string>Fontname</string> -        </property> -       </column> -      </widget> -     </item> -     <item row="1" column="1"> -      <widget class="QTableWidget" name="channelListView"> -       <property name="sizePolicy"> -        <sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding"> -         <horstretch>0</horstretch> -         <verstretch>0</verstretch> -        </sizepolicy> -       </property> -       <attribute name="horizontalHeaderStretchLastSection"> -        <bool>true</bool> -       </attribute> -       <column> -        <property name="text"> -         <string>Chnl</string> -        </property> -       </column> -       <column> -        <property name="text"> -         <string>Soundfont</string> -        </property> -       </column> -       <column> -        <property name="text"> -         <string>Drum Chnl</string> -        </property> -       </column> -      </widget> -     </item> -     <item row="3" column="0"> -      <widget class="QFrame" name="ReverbFrame"> -       <property name="enabled"> -        <bool>false</bool> -       </property> -       <property name="frameShape"> -        <enum>QFrame::StyledPanel</enum> -       </property> -       <property name="frameShadow"> -        <enum>QFrame::Raised</enum> -       </property> -       <layout class="QGridLayout"> -        <item row="4" column="1"> -         <widget class="QSlider" name="ReverbLevel"> -          <property name="maximum"> -           <number>16383</number> -          </property> -          <property name="singleStep"> -           <number>16</number> -          </property> -          <property name="pageStep"> -           <number>1638</number> -          </property> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="tickPosition"> -           <enum>QSlider::TicksBothSides</enum> -          </property> -          <property name="tickInterval"> -           <number>1638</number> -          </property> -         </widget> -        </item> -        <item row="3" column="1"> -         <widget class="QSlider" name="ReverbWidth"> -          <property name="maximum"> -           <number>16383</number> -          </property> -          <property name="singleStep"> -           <number>16</number> -          </property> -          <property name="pageStep"> -           <number>1638</number> -          </property> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="tickPosition"> -           <enum>QSlider::TicksBothSides</enum> -          </property> -          <property name="tickInterval"> -           <number>1638</number> -          </property> -         </widget> -        </item> -        <item row="2" column="1"> -         <widget class="QSlider" name="ReverbDamping"> -          <property name="maximum"> -           <number>16383</number> -          </property> -          <property name="singleStep"> -           <number>16</number> -          </property> -          <property name="pageStep"> -           <number>1638</number> -          </property> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="tickPosition"> -           <enum>QSlider::TicksBothSides</enum> -          </property> -          <property name="tickInterval"> -           <number>1638</number> -          </property> -         </widget> -        </item> -        <item row="1" column="1"> -         <widget class="QSlider" name="ReverbRoomSize"> -          <property name="maximum"> -           <number>16383</number> -          </property> -          <property name="singleStep"> -           <number>16</number> -          </property> -          <property name="pageStep"> -           <number>1638</number> -          </property> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="tickPosition"> -           <enum>QSlider::TicksBothSides</enum> -          </property> -          <property name="tickInterval"> -           <number>1638</number> -          </property> -         </widget> -        </item> -        <item row="4" column="0"> -         <widget class="QLabel" name="ReverbLevelLabel"> -          <property name="text"> -           <string>Level</string> -          </property> -          <property name="alignment"> -           <set>Qt::AlignCenter</set> -          </property> -          <property name="wordWrap"> -           <bool>false</bool> -          </property> -         </widget> -        </item> -        <item row="3" column="0"> -         <widget class="QLabel" name="ReverbWidthLabel"> -          <property name="text"> -           <string>Width</string> -          </property> -          <property name="alignment"> -           <set>Qt::AlignCenter</set> -          </property> -          <property name="wordWrap"> -           <bool>false</bool> -          </property> -         </widget> -        </item> -        <item row="2" column="0"> -         <widget class="QLabel" name="ReverbDampingLabel"> -          <property name="text"> -           <string>Damping</string> -          </property> -          <property name="alignment"> -           <set>Qt::AlignCenter</set> -          </property> -          <property name="wordWrap"> -           <bool>false</bool> -          </property> -         </widget> -        </item> -        <item row="1" column="0"> -         <widget class="QLabel" name="ReverbRoomSizeLabel"> -          <property name="text"> -           <string>Room Size</string> -          </property> -          <property name="alignment"> -           <set>Qt::AlignCenter</set> -          </property> -          <property name="wordWrap"> -           <bool>false</bool> -          </property> -         </widget> -        </item> -        <item row="0" column="0" colspan="2"> -         <widget class="QCheckBox" name="Reverb"> -          <property name="text"> -           <string>Reverb</string> -          </property> -         </widget> -        </item> -       </layout> -      </widget> -     </item> -     <item row="0" column="1"> -      <widget class="QLabel" name="fontSetupLabel"> -       <property name="font"> -        <font> -         <weight>75</weight> -         <bold>true</bold> -        </font> -       </property> -       <property name="text"> -        <string>CHANNEL SETUP</string> -       </property> -       <property name="scaledContents"> -        <bool>false</bool> -       </property> -       <property name="alignment"> -        <set>Qt::AlignCenter</set> -       </property> -       <property name="wordWrap"> -        <bool>true</bool> -       </property> -      </widget> -     </item> -     <item row="3" column="1"> -      <widget class="QFrame" name="ChorusFrame"> -       <property name="enabled"> -        <bool>false</bool> -       </property> -       <property name="frameShape"> -        <enum>QFrame::StyledPanel</enum> -       </property> -       <property name="frameShadow"> -        <enum>QFrame::Raised</enum> -       </property> -       <layout class="QGridLayout"> -        <item row="1" column="4"> -         <widget class="QComboBox" name="ChorusType"> -          <item> -           <property name="text"> -            <string>Sine</string> -           </property> -          </item> -          <item> -           <property name="text"> -            <string>Triangle</string> -           </property> -          </item> -         </widget> -        </item> -        <item row="1" column="3"> -         <widget class="QLabel" name="ChorusTypeLabel"> -          <property name="text"> -           <string>Type</string> -          </property> -          <property name="alignment"> -           <set>Qt::AlignCenter</set> -          </property> -          <property name="wordWrap"> -           <bool>false</bool> -          </property> -         </widget> -        </item> -        <item row="1" column="1" colspan="2"> -         <widget class="QSpinBox" name="ChorusNumber"> -          <property name="maximum"> -           <number>127</number> -          </property> -         </widget> -        </item> -        <item row="1" column="0"> -         <widget class="QLabel" name="ChorusNumberLabel"> -          <property name="text"> -           <string>Number</string> -          </property> -          <property name="alignment"> -           <set>Qt::AlignCenter</set> -          </property> -          <property name="wordWrap"> -           <bool>false</bool> -          </property> -         </widget> -        </item> -        <item row="2" column="2" colspan="3"> -         <widget class="QSlider" name="ChorusSpeed"> -          <property name="maximum"> -           <number>16383</number> -          </property> -          <property name="singleStep"> -           <number>16</number> -          </property> -          <property name="pageStep"> -           <number>1638</number> -          </property> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="tickPosition"> -           <enum>QSlider::TicksBothSides</enum> -          </property> -          <property name="tickInterval"> -           <number>1638</number> -          </property> -         </widget> -        </item> -        <item row="2" column="0" colspan="2"> -         <widget class="QLabel" name="ChorusSpeedLabel"> -          <property name="text"> -           <string>Speed</string> -          </property> -          <property name="alignment"> -           <set>Qt::AlignCenter</set> -          </property> -          <property name="wordWrap"> -           <bool>false</bool> -          </property> -         </widget> -        </item> -        <item row="3" column="2" colspan="3"> -         <widget class="QSlider" name="ChorusDepth"> -          <property name="maximum"> -           <number>16383</number> -          </property> -          <property name="singleStep"> -           <number>16</number> -          </property> -          <property name="pageStep"> -           <number>1638</number> -          </property> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="tickPosition"> -           <enum>QSlider::TicksBothSides</enum> -          </property> -          <property name="tickInterval"> -           <number>1638</number> -          </property> -         </widget> -        </item> -        <item row="3" column="0" colspan="2"> -         <widget class="QLabel" name="ChorusDepthLabel"> -          <property name="text"> -           <string>Depth</string> -          </property> -          <property name="alignment"> -           <set>Qt::AlignCenter</set> -          </property> -          <property name="wordWrap"> -           <bool>false</bool> -          </property> -         </widget> -        </item> -        <item row="4" column="2" colspan="3"> -         <widget class="QSlider" name="ChorusLevel"> -          <property name="maximum"> -           <number>16383</number> -          </property> -          <property name="singleStep"> -           <number>16</number> -          </property> -          <property name="pageStep"> -           <number>1638</number> -          </property> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="tickPosition"> -           <enum>QSlider::TicksBothSides</enum> -          </property> -          <property name="tickInterval"> -           <number>1638</number> -          </property> -         </widget> -        </item> -        <item row="4" column="0" colspan="2"> -         <widget class="QLabel" name="ChorusLevelLabel"> -          <property name="text"> -           <string>Level</string> -          </property> -          <property name="alignment"> -           <set>Qt::AlignCenter</set> -          </property> -          <property name="wordWrap"> -           <bool>false</bool> -          </property> -         </widget> -        </item> -        <item row="0" column="0" colspan="5"> -         <widget class="QCheckBox" name="Chorus"> -          <property name="text"> -           <string>Chorus</string> -          </property> -         </widget> -        </item> -       </layout> -      </widget> -     </item> -     <item row="4" column="0" colspan="2"> -      <widget class="QGroupBox" name="GainBox"> -       <property name="title"> -        <string/> -       </property> -       <layout class="QHBoxLayout"> -        <item> -         <widget class="QLabel" name="GainLabel"> -          <property name="text"> -           <string>Gain</string> -          </property> -          <property name="alignment"> -           <set>Qt::AlignCenter</set> -          </property> -          <property name="wordWrap"> -           <bool>false</bool> -          </property> -         </widget> -        </item> -        <item> -         <widget class="QSlider" name="Gain"> -          <property name="minimum"> -           <number>0</number> -          </property> -          <property name="maximum"> -           <number>127</number> -          </property> -          <property name="pageStep"> -           <number>5</number> -          </property> -          <property name="value"> -           <number>13</number> -          </property> -          <property name="tracking"> -           <bool>true</bool> -          </property> -          <property name="orientation"> -           <enum>Qt::Horizontal</enum> -          </property> -          <property name="tickPosition"> -           <enum>QSlider::TicksBothSides</enum> -          </property> -          <property name="tickInterval"> -           <number>7</number> -          </property> -         </widget> -        </item> -       </layout> -      </widget> -     </item> -     <item row="0" column="0"> -      <widget class="QLabel" name="loadedFontsLabel"> -       <property name="font"> -        <font> -         <weight>75</weight> -         <bold>true</bold> -        </font> -       </property> -       <property name="text"> -        <string>LOADED SOUNDFONTS</string> -       </property> -       <property name="alignment"> -        <set>Qt::AlignCenter</set> -       </property> -       <property name="wordWrap"> -        <bool>true</bool> -       </property> -      </widget> -     </item> -     <item row="2" column="1"> -      <widget class="QLabel" name="pixmapLabel"> -       <property name="sizePolicy"> -        <sizepolicy hsizetype="Maximum" vsizetype="Maximum"> -         <horstretch>0</horstretch> -         <verstretch>0</verstretch> -        </sizepolicy> -       </property> -       <property name="pixmap"> -        <pixmap>image3</pixmap> -       </property> -       <property name="scaledContents"> -        <bool>true</bool> -       </property> -       <property name="wordWrap"> -        <bool>false</bool> -       </property> -      </widget> -     </item> -    </layout> -   </item> -  </layout> - </widget> - <layoutdefault spacing="3" margin="8"/> - <resources/> - <connections/> -</ui> diff --git a/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynti.cpp b/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynti.cpp deleted file mode 100644 index 327cde39..00000000 --- a/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynti.cpp +++ /dev/null @@ -1,1325 +0,0 @@ -/* - * MusE FLUID Synth softsynth plugin - * - * Copyright (C) 2004 Mathias Lundgren (lunar_shuttle@users.sourcforge.net) - * - * $Id: fluidsynti.cpp,v 1.19.2.18 2009/12/06 10:05:00 terminator356 Exp $ - * - */ - -#include <list> -#include <iostream> - -#include <QFileInfo> - -#include "fluidsynti.h" -#include "muse/midi.h" - -FluidCtrl FluidSynth::fluidCtrl[] = { -      //{ "Expression", CTRL_EXPRESSION, 0, 127 }, -      //{ "Sustain", CTRL_SUSTAIN, 0, 127 }, -      //{ "Portamento", CTRL_PORTAMENTO, 0, 127 }, -      //{ "Soft Pedal", CTRL_SOFT_PEDAL, 0, 127 }, -      //{ "Variation", CTRL_VARIATION_SEND, 0, 127 }, -      //{ "Channel reverb send", CTRL_REVERB_SEND, 0, 127 }, -      //{ "Channel chorus send", CTRL_CHORUS_SEND, 0, 127 }, -      //{ "Pitch", CTRL_PITCH, -8192, 8191 } -       -      // These controllers' initial values are set by the FS_PREDEF_ values, so just set them to zero here. -      { "Gain", FS_GAIN ,0, 127, 0}, -      { "Master reverb on/off", FS_REVERB_ON , 0, 1, 0}, -      { "Master reverb level", FS_REVERB_LEVEL, 0, 16384, 0}, -      { "Master reverb size", FS_REVERB_ROOMSIZE, 0, 16384, 0}, // Interval: [0,1] -      { "Master reverb damping", FS_REVERB_DAMPING, 0, 16384, 0}, // Interval: [0,1] -      { "Master reverb width", FS_REVERB_WIDTH, 0, 16384, 0}, // Interval: [0,100] -      { "Master chorus on/off", FS_CHORUS_ON, 0, 1, 0}, -      { "Master chorus num delay lines", FS_CHORUS_NUM, 0, 10, 0}, //Default: 3 -      { "Master chorus type",  FS_CHORUS_TYPE, 0, 1, 0}, -      { "Master chorus speed", FS_CHORUS_SPEED, 0, 16384, 0}, // (0.291,5) Hz -      { "Master chorus depth", FS_CHORUS_DEPTH, 0, 16384, 0}, // [0,40] -      { "Master chorus level", FS_CHORUS_LEVEL, 0, 16384, 0}, // [0,1] -       -      { "Program", CTRL_PROGRAM, 0, 0xffffff, 0}, -      { "Modulation", CTRL_MODULATION, 0, 127, 0}, -      { "Portamento time", CTRL_PORTAMENTO_TIME, 0, 127, 0}, -      { "Volume", CTRL_VOLUME, 0, 127, 100}, -      { "Pan", CTRL_PANPOT, -64, 63, 0}, -      { "Expression", CTRL_EXPRESSION, 0, 127, 127}, -      { "Sustain", CTRL_SUSTAIN, 0, 127, 0}, -      { "Portamento", CTRL_PORTAMENTO, 0, 127, 0}, -      { "Soft Pedal", CTRL_SOFT_PEDAL, 0, 127, 0}, -      { "Variation", CTRL_VARIATION_SEND, 0, 127, 0}, -      { "Channel reverb send", CTRL_REVERB_SEND, 0, 127, 40}, -      { "Channel chorus send", CTRL_CHORUS_SEND, 0, 127, 0}, -      { "Pitch", CTRL_PITCH, -8192, 8191, 0}, -      // Added by T356 -      { "Pitch bend sensitivity", FS_PITCHWHEELSENS, 0, 24, 2} -    }; - -static int NUM_CONTROLLER = sizeof(FluidSynth::fluidCtrl)/sizeof(*(FluidSynth::fluidCtrl)); -static void* fontLoadThread(void* t); - -QString *projPathPtr; -// -// Fluidsynth -// -FluidSynth::FluidSynth(int sr, pthread_mutex_t *_Globalsfloader_mutex) : Mess(2) -      { -      setSampleRate(sr); -      fluid_settings_t* s = new_fluid_settings(); -      fluid_settings_setnum(s, (char*) "synth.sample-rate", float(sampleRate())); -      fluidsynth = new_fluid_synth(s); -      if (!fluidsynth) { -            printf("Error while creating fluidsynth!\n"); -            return; -            } - -      //Set up channels: -      for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) { -            //channels[i].font       = 0; -            channels[i].font_extid = FS_UNSPECIFIED_ID; -            channels[i].font_intid = FS_UNSPECIFIED_ID; -            channels[i].preset     = FS_UNSPECIFIED_PRESET; -            channels[i].drumchannel= false; -      } -      //pthread_mutex_init(&_sfloader_mutex,NULL); -      _sfloader_mutex = _Globalsfloader_mutex; - -/* -      buffer = 0; -      bufferlen = 0; -      */ -      } - -FluidSynth::~FluidSynth() -      { -      int err = delete_fluid_synth (fluidsynth); -      delete gui; - -/*      if (buffer) -               delete [] buffer;*/ -      if (err == -1) { -            std::cerr << DEBUG_ARGS << "error while destroying synth: " << fluid_synth_error(fluidsynth) << std::endl; -            return; -            } -      //Destroy the mutex -/*      if (pthread_mutex_destroy(&_sfloader_mutex) != 0) -            std::cerr << DEBUG_ARGS << "Strange, mutex busy! Should not be!" << std::endl;*/ -             -      } - -bool FluidSynth::init(const char* name) -      { -      debug("FluidSynth::init\n"); - -      gui = new FluidSynthGui(); -      gui->show(); -      gui->setWindowTitle(name); - -      lastdir= ""; -      currentlyLoadedFonts = 0; -      nrOfSoundfonts = 0; -      sendChannelData(); -      cho_on = false; -      cho_num = FS_PREDEF_CHORUS_NUM; -      cho_type = FS_PREDEF_CHORUS_TYPE; -      cho_level = FS_PREDEF_CHORUS_LEVEL; -      cho_speed = FS_PREDEF_CHORUS_SPEED; -      cho_depth = FS_PREDEF_CHORUS_DEPTH; -      setController(0, FS_GAIN, (int)(fluidCtrl[0].max*FS_PREDEF_VOLUME)); -      setController(0, FS_REVERB_ON, 0); -      setController(0, FS_REVERB_LEVEL, (int)(fluidCtrl[2].max*FS_PREDEF_REVERB_LEVEL)); -      setController(0, FS_REVERB_ROOMSIZE, (int)(fluidCtrl[3].max*FS_PREDEF_REVERB_ROOMSIZE)); -      setController(0, FS_REVERB_DAMPING, (int)(fluidCtrl[4].max*FS_PREDEF_REVERB_DAMPING)); -      setController(0, FS_REVERB_WIDTH, (int)(fluidCtrl[5].max*FS_PREDEF_REVERB_WIDTH)); -      setController(0, FS_CHORUS_ON, 0); -      setController(0, FS_CHORUS_NUM, FS_PREDEF_CHORUS_NUM); -      //setController(0, FS_CHORUS_TYPE, FS_PREDEF_CHORUS_TYPE); //? -      setController(0, FS_CHORUS_SPEED, (int)(fluidCtrl[9].max*FS_PREDEF_CHORUS_SPEED)); -      setController(0, FS_CHORUS_DEPTH, (int)(fluidCtrl[10].max*FS_PREDEF_CHORUS_DEPTH)); -      setController(0, FS_CHORUS_LEVEL, (int)(fluidCtrl[11].max*FS_PREDEF_CHORUS_LEVEL)); -      return false; -      } - -//--------------------------------------------------------- -//   processMessages -//   Called from host always, even if output path is unconnected. -//--------------------------------------------------------- - -void FluidSynth::processMessages() -{ -  //Process messages from the gui -  while (gui->fifoSize())  -  { -    MidiPlayEvent ev = gui->readEvent(); -    if (ev.type() == ME_SYSEX)  -    { -      sysex(ev.len(), ev.data()); -      sendEvent(ev); -    } -    else if (ev.type() == ME_CONTROLLER)  -    { -      setController(ev.channel(), ev.dataA(), ev.dataB(), true); -      sendEvent(ev); -    } -    else  -    { -      if (FS_DEBUG) -            printf("FluidSynth::processMessages(): unknown event, type: %d\n", ev.type()); -    } -  } - -} - -//--------------------------------------------------------- -//   process -//   Called from host, ONLY if output path is connected. -//--------------------------------------------------------- - -void FluidSynth::process(float** ports, int offset, int len) -      { -      /* -      //Process messages from the gui -      while (gui->fifoSize()) { -            MidiPlayEvent ev = gui->readEvent(); -            if (ev.type() == ME_SYSEX) { -                  sysex(ev.len(), ev.data()); -                  sendEvent(ev); -                  } -            else if (ev.type() == ME_CONTROLLER) { -                  setController(ev.channel(), ev.dataA(), ev.dataB(), true); -                  sendEvent(ev); -                  } -            else { -                  if (FS_DEBUG) -                        printf("FluidSynth::process(): unknown event, type: %d\n", ev.type()); -                  } -            } -      */ - -      if (fluid_synth_write_float(fluidsynth, len, ports[0], offset, 1, ports[1], offset, 1)) { -            M_ERROR("Error writing from synth!"); -            return; -            } -      } - -//--------------------------------------------------------- -//   getInitData -// Prepare data that will restore the synth's state on load -//--------------------------------------------------------- -void FluidSynth::getInitData(int* n, const unsigned char** data) const -      { - - //printf("projPathPtr "); - //std::cout << *projPathPtr << std::endl; - -      // Data setup: -      // FS_INIT_DATA (1 byte) -      // FluidSynth version (2 bytes, x.y) -      // n = Number of soundfonts (1 byte) -      // Lastdir (variable size) -      // -      // FS_FONTS_BEGIN -      // n blocks with font path (variable size) -      // n bytes with font external id -      // -      // for all channels (16), 1 byte each for external id + 1 byte for preset + 1 byte for bankno -      // which is mapped to internal id after all fonts are loaded. -      // -      // reverb + chorus on/off (2 bytes) -      if (FS_DEBUG) -            printf("FluidSynth::getInitData()\n"); - -      //Calculate length: -      int len = FS_INIT_DATA_HEADER_SIZE + strlen(lastdir.c_str()) + 1; //header size -      for (std::list<FluidSoundFont>::const_iterator it = stack.begin(); it!=stack.end(); it++) { - -            // if the soundfont is located under the projectPath we extract this from the filename -            int fileLen = strlen(it->filename.c_str()); -            if (QString(it->filename.c_str()).startsWith(*projPathPtr)) { -                printf("project path found in filename, len %d shortened with %d\n",fileLen, projPathPtr->length()+1); -                fileLen = fileLen - projPathPtr->length()-1; -                } -            len+=fileLen + 2; -            } -      //Add length for lastdir and channels: -      len+=strlen(lastdir.c_str())+1; -      len+=(FS_MAX_NR_OF_CHANNELS*4); // 4 bytes: ext+int id + bankno + drumchannel status -      // + reverb -      len+=2; - -      if (FS_DEBUG) -            printf("Total length of init sysex: %d\n", len); -      byte* d = new byte[len]; - -      // Header: -      d[0] = FS_INIT_DATA; -      d[1] = FS_VERSION_MAJOR; -      d[2] = FS_VERSION_MINOR; -      d[3] = stack.size(); - -      //Lastdir: -      byte* chptr = d + FS_INIT_DATA_HEADER_SIZE; -      memcpy(chptr, lastdir.c_str(), strlen(lastdir.c_str())+1); - -      //For each font... -      chptr+=strlen(lastdir.c_str())+1; -      for (std::list<FluidSoundFont>::const_iterator it =stack.begin(); it!=stack.end(); it++) { - -            // if the soundfont is located under the projectPath we extract this from the filename -            int offset=0; -            if (QString(it->filename.c_str()).startsWith(*projPathPtr)) { -                offset= projPathPtr->length()+1; -            } - -            memcpy(chptr, it->filename.c_str()+offset, strlen(it->filename.c_str())-offset+1); -            //printf("path name stored=%s\n", it->filename.c_str()+offset); -            chptr = chptr + 1 + strlen(it->filename.c_str())-offset; -            } - -      //For each font again... -      *chptr = FS_INIT_CHANNEL_SECTION; -      chptr++; -      for (std::list<FluidSoundFont>::const_iterator it =stack.begin(); it!=stack.end(); it++) { -            *chptr = it->extid; -            chptr++; -            } - -      //External id:s & preset for all channels: -      for(int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) { -            *chptr = channels[i].font_extid; chptr++; -            *chptr = channels[i].preset; chptr++; -            *chptr = channels[i].banknum; chptr++; -            *chptr = channels[i].drumchannel; chptr++; -            } - -      //Reverb: -      *chptr = rev_on; chptr++; -      *chptr = cho_on; chptr++; -      if (FS_DEBUG) { -            for (int i=0; i<len; i++) -                  printf("%c ", d[i]); -            printf("\n"); -            for (int i=0; i<len; i++) -                  printf("%x ", d[i]); -            printf("\n"); -            } -      // Give values to host: -      *data = d; -      *n = len; -      } - -//----------------------------------- -// parseInitData -//----------------------------------- -void FluidSynth::parseInitData(int n, const byte* d) -      { -      printf("projPathPtr "); -      std::cout << *projPathPtr->toAscii().data() << std::endl; - -      bool load_drumchannels = true; // Introduced in initdata ver 0.3 -      bool handle_bankvalue  = true; // Introduced in initdata ver 0.4 - -      if (FS_DEBUG) { -            printf("--- PARSING INIT DATA ---\n"); -            for (int i=0; i<n; i++) -                  printf("%c ", d[i]); -            printf("\n"); -            } - -      byte version_major, version_minor; -      version_major = d[1]; version_minor = d[2]; - -      // Check which version of the initdata we're using and if it's OK -      if (!(version_major == FS_VERSION_MAJOR && version_minor == FS_VERSION_MINOR)) { -            if (FS_DEBUG) { -                  printf("Project saved with other version of fluidsynth format. Ver: %d.%d\n", version_major, version_minor); -                  } - -            if (version_major == 0 && version_minor == 1) { -               sendError("Initialization data created with different version of FluidSynth Mess, will be ignored."); -               return; -               } - -            if (version_major == 0 && version_minor <= 2) { -                  load_drumchannels = false; -                  } - -            if (version_major == 0 && version_minor <= 3) { -                  handle_bankvalue = false; -                  } -            } - -      byte nr_of_fonts = d[3]; -      nrOfSoundfonts = nr_of_fonts; //"Global" counter -      const byte* chptr = (d + 4); - -      //Get lastdir: -      lastdir = std::string((char*)chptr); -      sendLastdir(lastdir.c_str()); - -      chptr+=strlen(lastdir.c_str())+1; - -      FluidSoundFont fonts[nrOfSoundfonts]; //Just a temp one -      //Fonts: -      for (int i=0; i<nr_of_fonts; i++) { -            fonts[i].filename = (char*)(chptr); -            chptr+=(strlen(fonts[i].filename.c_str())+1); -	    QByteArray ba = projPathPtr->toAscii(); - -            if (QFileInfo(fonts[i].filename.c_str()).isRelative()) { -                printf("path is relative, we append full path!\n"); -                fonts[i].filename = ba.constData() + std::string("/")+ fonts[i].filename; -                } -            std::cout << "SOUNDFONT FILENAME + PATH " << fonts[i].filename << std::endl; -            } - -      if (*chptr != FS_INIT_CHANNEL_SECTION) { -            sendError("Init-data corrupt... Projectfile error. Initdata ignored.\n"); -            return; -            } - -      chptr++; -      for (int i=0; i<nr_of_fonts; i++) { -            fonts[i].extid = *chptr; -            chptr++; -            //printf("Extid, %d: %d\n",i,fonts[i].extid); -            } - -      // All channels external id + preset -      for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) { -            channels[i].font_extid = *chptr; chptr++; -            channels[i].preset     = *chptr; chptr++; -            if (handle_bankvalue) { // Ver 0.4 and later -                  channels[i].banknum = *chptr; chptr++; -                  } -            else { -                  channels[i].banknum = 0; -                  } - -            if (load_drumchannels) { // Ver 0.3 and later -                  channels[i].drumchannel = *chptr; -                  chptr++; -                  } -            } - -      //Reverb: -      setController(0, FS_REVERB_ON, *chptr); chptr++; -      setController(0, FS_CHORUS_ON, *chptr); chptr++; - -      if (FS_DEBUG) -            printf("--- END PARSE INIT DATA ---\n"); -      //Load the shit: -      for (int i=0; i<nrOfSoundfonts; i++) { -            pushSoundfont(fonts[i].filename.c_str(), fonts[i].extid); -            } -      } - - -//--------------------------------------------------------- -//   processEvent -//    All events from the sequencer goes here -//--------------------------------------------------------- - -bool FluidSynth::processEvent(const MidiPlayEvent& ev) -      { -      switch(ev.type()) { -            case ME_CONTROLLER: -                  if (FS_DEBUG_DATA) { -                        printf("*** FluidSynth::process - Controller. Chan: %x dataA: %x dataB: %x\n", ev.channel(), ev.dataA(), ev.dataB()); -                        for (int i=0; i< ev.len(); i++) -                              printf("%x ", ev.data()[i]); -                        } -                  setController(ev.channel(), ev.dataA(), ev.dataB(), false); -                  return true; -            case ME_NOTEON: -                  return playNote(ev.channel(), ev.dataA(), ev.dataB()); -            case ME_NOTEOFF: -                  return playNote(ev.channel(), ev.dataA(), 0); -            case ME_SYSEX: -                  //Debug print -                  if (FS_DEBUG_DATA) { -                        printf("*** FluidSynth::process - Sysex received\n"); -                        for (int i=0; i< ev.len(); i++) -                              printf("%x ", ev.data()[i]); -                        printf("\n"); -                        } -                  return sysex(ev.len(), ev.data()); -            case ME_PITCHBEND: -                setController(ev.channel(), CTRL_PITCH, ev.dataA(), false); -                break;             -             -            case ME_PROGRAM: -                setController(ev.channel(), CTRL_PROGRAM, ev.dataA(), false); -            break;    -            default: -            break; -      } -      return false; -      } - -//--------------------------------------------------------- -//   sysex -//--------------------------------------------------------- - -bool FluidSynth::sysex(int n, const unsigned char* d) -      { -      switch(*d) { -            case FS_LASTDIR_CHANGE: { -                  lastdir = std::string((char*)(d+1)); -                  sendLastdir(lastdir.c_str()); -                  break; -                  } -            case FS_PUSH_FONT: { -                  int extid = d[1]; - -                  if (FS_DEBUG) -                        printf("Client: Got push font %s, id: %d\n",(d+1), extid); - -                  const char* filename = (const char*)(d+2); -                  if (!pushSoundfont(filename, extid)) -                              sendError("Could not load soundfont "); -                  break; -                  } -            case FS_DUMP_INFO: { -                  dumpInfo(); -                  break; -                  } -            case FS_SOUNDFONT_CHANNEL_SET: { -                  sfChannelChange(*(d+1), *(d+2)); -                  break; -                  } -            case FS_INIT_DATA: { -                  parseInitData(n,d); -                  break; -                  } -            case FS_SOUNDFONT_POP: -                  popSoundfont(*(d+1)); -                  break; -            case FS_DRUMCHANNEL_SET: { -                  byte onoff = (*(d+1)); -                  byte channel = (*(d+2)); -                  channels[channel].drumchannel = onoff; -                  if (FS_DEBUG) -                        printf("Client: Set drumchannel on chan %d to %d\n",channel, onoff); -                  break; -                  } -            default: -                  if (FS_DEBUG) -                        printf("FluidSynth::sysex() : unknown sysex received: %d\n",*d); -                  break; -            } -      return false; -      } - -//--------------------------------------------------------- -//   sendSysex -//--------------------------------------------------------- -void FluidSynth::sendSysex(int l, const unsigned char* d) -      { -      MidiPlayEvent ev(0, 0, ME_SYSEX, d, l); -      //printf("FluidSynth::sendSysex gui:%p\n", gui);  -      gui->writeEvent(ev); -      } - -//----------------------------------- -// pushSoundfont - load a soundfont -//----------------------------------- -bool FluidSynth::pushSoundfont (const char* filename, int extid) -      { -      pthread_attr_t* attributes = (pthread_attr_t*) malloc(sizeof(pthread_attr_t)); -      pthread_attr_init(attributes); -      pthread_attr_setdetachstate(attributes, PTHREAD_CREATE_DETACHED); - -      FS_Helper* helper = new FS_Helper; -      helper->fptr = this; -      helper->filename = filename; -      helper->id = extid; - -      if (pthread_create(&fontThread, attributes, ::fontLoadThread, (void*) helper)) -            perror("creating thread failed:"); - -      pthread_attr_destroy(attributes); -      return true; -      } - -//--------------------------------------------------------- -//   fontLoadThread -//    helper thread to load soundfont in the -//    background -//--------------------------------------------------------- - -static void* fontLoadThread(void* t) -      { -      //Init vars -      FS_Helper* h = (FS_Helper*) t; -      FluidSynth* fptr = h->fptr; -      const char* filename = h->filename.c_str(); -      pthread_mutex_t* sfloader_mutex = (fptr->_sfloader_mutex); - -      //Let only one loadThread have access to the fluidsynth-object at the time -      pthread_mutex_lock(sfloader_mutex); -      int rv = fluid_synth_sfload(fptr->fluidsynth, filename, 1); - -      if (rv ==-1) { -            fptr->sendError(fluid_synth_error(fptr->fluidsynth)); -            if (FS_DEBUG) -                  std::cerr << DEBUG_ARGS << "error loading soundfont: " << fluid_synth_error(fptr->fluidsynth) << std::endl; -             -            //Unlock the mutex, or else we might be stuck here forever... -            pthread_mutex_unlock(sfloader_mutex); -            delete h; -            pthread_exit(0); -            } - -      //Deal with internal and external id etc. -      if (FS_DEBUG) -            printf("Soundfont %s loaded, index %d\n", filename, rv); - -      FluidSoundFont font; -      font.filename = h->filename;//strdup(filename); - -      font.intid = rv; -      if (h->id == FS_UNSPECIFIED_ID) { -            font.extid = fptr->getNextAvailableExternalId(); -            if (FS_DEBUG) -                  printf("Font got extid %d\n",font.extid); -            } -      else -            font.extid = h->id; -      if (FS_DEBUG) -            printf("Font has external id: %d int id:%d\n", font.extid, font.intid); - -      //Strip off the filename -      QString temp = QString(filename); -      QString name = temp.right(temp.length() - temp.lastIndexOf('/',-1) - 1); -      name = name.left(name.length()-4); //Strip off ".sf2" -      font.name = name.toLatin1().constData(); -      fptr->stack.push_front(font); -      fptr->currentlyLoadedFonts++; - -      //Cleanup & unlock: -      pthread_mutex_unlock(sfloader_mutex); -      delete h; - -      if (FS_DEBUG) -            printf("Currently loaded fonts: %d Nr of soundfonts: %d\n",fptr->currentlyLoadedFonts, fptr->nrOfSoundfonts); -      //Check whether this was the last font or not. If so, run initSynth(); -      if (fptr->nrOfSoundfonts <= fptr->currentlyLoadedFonts) { -            if (FS_DEBUG) -                  printf("This was the last font, rewriting channel settings...\n"); -            fptr->rewriteChannelSettings(); -            //Update data in GUI-window. -            fptr->sendSoundFontData();; -            fptr->sendChannelData(); -            } - -      pthread_exit(0); -      } - -//--------------------------------------------------------- -//   playNote -//    called from host -//--------------------------------------------------------- - -bool FluidSynth::playNote(int channel, int pitch, int velo) -      { -      if (channels[channel].font_intid == FS_UNSPECIFIED_FONT || -          channels[channel].font_intid == FS_UNSPECIFIED_ID) -            return false; -       -      if (velo) { -            if (fluid_synth_noteon(fluidsynth, channel, pitch, velo)) { -                  if (FS_DEBUG) -                        std::cerr << DEBUG_ARGS << "error processing noteon event: " << fluid_synth_error(fluidsynth); -                  } -            } -      else { -            if (fluid_synth_noteoff(fluidsynth, channel, pitch)) -                  if (FS_DEBUG) -                        std::cerr << DEBUG_ARGS << "error processing noteoff event: " << fluid_synth_error(fluidsynth) << std::endl; -            } -      return false; -      } -//--------------------------------------------------------- -//   sendSoundFontData -//--------------------------------------------------------- -void FluidSynth::sendSoundFontData() -      { -      int ndatalen = 2; //2 bytes for command and length - -      //Calculate length in chars of all strings in the soundfontstack in one string -      for (std::list<FluidSoundFont>::iterator it = stack.begin(); it != stack.end(); it++) { -            ndatalen += 1 + strlen(it->name.c_str()); -            ndatalen += FS_SFDATALEN; //unsigned char for ID -            } -      byte ndata[ndatalen]; -      *ndata = FS_SEND_SOUNDFONTDATA; //The command -      *(ndata + 1) = (unsigned char)stack.size (); //Nr of Soundfonts - -      // Copy the stuff to ndatalen: -      char* chunk_start = (char*)(ndata + 2); -      int chunk_len, name_len; -      for (std::list<FluidSoundFont>::iterator it = stack.begin(); it != stack.end();  ++it) { -            name_len = strlen(it->name.c_str()) + 1; -            chunk_len = name_len + FS_SFDATALEN; -            memcpy(chunk_start, it->name.c_str(), name_len); //First, store the fontname -            *(chunk_start + name_len) = it->extid; //The GUI only needs to know about the external id, store that here -            chunk_start += chunk_len; -            } -      sendSysex(ndatalen, ndata); -      } - -//--------------------------------------------------------- -//   sendChannelData -//--------------------------------------------------------- -void FluidSynth::sendChannelData() -      { -      int chunk_size = 2; -      int chdata_length = (chunk_size * FS_MAX_NR_OF_CHANNELS) +1 ; //Command and the 2 channels * 16 -      byte chdata[chdata_length]; -      byte* chdptr; -      chdata[0] = FS_SEND_CHANNELINFO; -      chdptr = (chdata + 1); -      for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) { -            *(chdptr)    = channels[i].font_extid; //Font external id -            *(chdptr+1)  = i; //Channel nr -            chdptr += chunk_size; -            } -      sendSysex(chdata_length, chdata); -      // Send drum channel info afterwards (later addition, not very neat, but works...) - -      int drumchdata_length = FS_MAX_NR_OF_CHANNELS + 1; //1 byte for the command, one byte for each channel -      byte drumchdata[drumchdata_length ]; -      byte* drumchdataptr = drumchdata; -      *drumchdata = FS_SEND_DRUMCHANNELINFO; - -      for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) { -            drumchdataptr++; -            *drumchdataptr = channels[i].drumchannel; -            } -      // FIXME By Tim. This is crashing, after the conversion to QT4 and cmake.             -      //usleep(1000); -      sendSysex(drumchdata_length, drumchdata); -      } - -//--------------------------------------------------------- -//   dumpInfo -//--------------------------------------------------------- - -void FluidSynth::dumpInfo() -      { -      printf("-----------------------------------------------------\n"); -      printf("Dumping info...\n"); -      printf("Last dir: %s\n", lastdir.c_str()); -      for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) -            printf("Chan %d\tFont extid:%d\tintid:%d\tdrumchan:%d\tpreset: %d\n", i, channels[i].font_extid, channels[i].font_intid, channels[i].drumchannel, channels[i].preset); - -      printf("\n"); -      for (std::list<FluidSoundFont>::iterator it = stack.begin(); it != stack.end(); it++) -            printf("Font: %s\tintid: %d\textid %d\tfilename:%s\n", it->name.c_str(), it->intid, it->extid, it->filename.c_str()); -      printf("Reverb on: %d, width: %f, size: %f level: %f damp: %f\n",rev_on, rev_width, rev_size, rev_level, rev_damping); -      printf("-----------------------------------------------------\n"); -      } - -//--------------------------------------------------------- -//   guiVisible -//--------------------------------------------------------- - -bool FluidSynth::guiVisible() const -      { -      return gui->isVisible(); -      } - - -//--------------------------------------------------------- -//   showGui -//--------------------------------------------------------- - -void FluidSynth::showGui(bool val) -      { -      gui->setVisible(val); -      } - -//--------------------------------------------------------- -//   setController -//--------------------------------------------------------- - -bool FluidSynth::setController(int channel, int id, int val) -      { -      setController(channel, id, val, false); -      return false; -      } - -//--------------------------------------------------------- -//   setController -//--------------------------------------------------------- - -void FluidSynth::setController(int channel, int id, int val, bool fromGui) -      { -      // -      // Channelless controllers -      // -      int err = 0; -      switch (id) { -            case FS_GAIN: { -                  fluid_synth_set_gain(fluidsynth, (float) val/25); //gives val an interval of approximately[0,5] -                  //Forward to gui if not from Gui -                  if (!fromGui) { -                        MidiPlayEvent ev(0, 0, 0, ME_CONTROLLER, FS_GAIN, val); -                        gui->writeEvent(ev); -                        } -                  break; -                  } -            case FS_REVERB_ON: { -                  rev_on = val; -                  fluid_synth_set_reverb_on(fluidsynth, val); // 0 or 1 -                  //if (rev_on) -                  //      fluid_synth_set_reverb(fluidsynth, rev_size, rev_damping, rev_width, rev_level); -                  if (!fromGui) { -                        MidiPlayEvent ev(0, 0, 0, ME_CONTROLLER, FS_REVERB_ON, val); -                        gui->writeEvent(ev); -                        } -                  break; -                  } -            case FS_REVERB_LEVEL: -                  //Interval: 0-2 -                  rev_level = (double)2*val/16384; //[0,2] -                  //if (rev_on) -                        fluid_synth_set_reverb(fluidsynth, rev_size, rev_damping, rev_width, rev_level); -                  if (!fromGui) { -                        MidiPlayEvent ev(0, 0, 0, ME_CONTROLLER, FS_REVERB_LEVEL, val); -                        gui->writeEvent(ev); -                        } -                  break; -            case FS_REVERB_WIDTH: // -                  rev_width = (double)val/164; //[0,100] -                  //if (rev_on) -                        fluid_synth_set_reverb(fluidsynth, rev_size, rev_damping, rev_width, rev_level); -                  if (!fromGui) { -                        MidiPlayEvent ev(0, 0, 0, ME_CONTROLLER, FS_REVERB_WIDTH, val); -                        gui->writeEvent(ev); -                        } -                  break; -            case FS_REVERB_DAMPING: //[0,1] -                  rev_damping = (double)val/16384; -                  //if (rev_on) -                        fluid_synth_set_reverb(fluidsynth, rev_size, rev_damping, rev_width, rev_level); -                  if (!fromGui) { -                        MidiPlayEvent ev(0, 0, 0, ME_CONTROLLER, FS_REVERB_DAMPING, val); -                        gui->writeEvent(ev); -                        } -                  break; -            case FS_REVERB_ROOMSIZE: //[0,1] -                  rev_size = (double)val/16384; -                  //if (rev_on) -                        fluid_synth_set_reverb(fluidsynth, rev_size, rev_damping, rev_width, rev_level); -                  if (!fromGui) { -                        MidiPlayEvent ev(0, 0, 0, ME_CONTROLLER, FS_REVERB_ROOMSIZE, val); -                        gui->writeEvent(ev); -                        } -                  break; -            case FS_CHORUS_ON: {// 0 or 1 -                  cho_on = val; -                  fluid_synth_set_chorus_on(fluidsynth, val); -                  if (!fromGui) { -                        MidiPlayEvent ev(0, 0, 0, ME_CONTROLLER, FS_CHORUS_ON, val); -                        gui->writeEvent(ev); -                        } -                  break; -                  } -            case FS_CHORUS_NUM: {//Number of delay lines -                  cho_num = val; -                  fluid_synth_set_chorus(fluidsynth, cho_num, cho_level, cho_speed, cho_depth, cho_type); -                  if (!fromGui) { -                        MidiPlayEvent ev(0, 0, 0, ME_CONTROLLER, FS_CHORUS_NUM, val); -                        gui->writeEvent(ev); -                        } -                  break; -                  } -            case FS_CHORUS_TYPE: {//? -                  cho_type = val; -                  fluid_synth_set_chorus(fluidsynth, cho_num, cho_level, cho_speed, cho_depth, cho_type); -                  if (!fromGui) { -                        MidiPlayEvent ev(0, 0, 0, ME_CONTROLLER, FS_CHORUS_TYPE, val); -                        gui->writeEvent(ev); -                        } -                  break; -                  } -            case FS_CHORUS_SPEED: {//(0.291,5) Hz -                  cho_speed = (double)(0.291 + (double)val/3479); -                  fluid_synth_set_chorus(fluidsynth, cho_num, cho_level, cho_speed, cho_depth, cho_type); -                  if (!fromGui) { -                        MidiPlayEvent ev(0, 0, 0, ME_CONTROLLER, FS_CHORUS_SPEED, val); -                        gui->writeEvent(ev); -                        } -                  break; -                  } -            case FS_CHORUS_DEPTH: { //[0,40] -                  cho_depth = (double) val*40/16383; -                  fluid_synth_set_chorus(fluidsynth, cho_num, cho_level, cho_speed, cho_depth, cho_type); -                  if (!fromGui) { -                        MidiPlayEvent ev(0, 0, 0, ME_CONTROLLER, FS_CHORUS_DEPTH, val); -                        gui->writeEvent(ev); -                        } -                  break; -                  } -            case FS_CHORUS_LEVEL: { //[0,1] -                  cho_level = (double) val/16383; -                  fluid_synth_set_chorus(fluidsynth, cho_num, cho_level, cho_speed, cho_depth, cho_type); -                  if (!fromGui) { -                        MidiPlayEvent ev(0, 0, 0, ME_CONTROLLER, FS_CHORUS_LEVEL, val); -                        gui->writeEvent(ev); -                        } -                  break; -                  } -            // -            // Controllers that depend on channels -            // -            case CTRL_PITCH: -                  // MusE's range is from -8192 to +8191, fluidsynth seems to be [0, 16384] -                  val +=8192; -                  err = fluid_synth_pitch_bend (fluidsynth, channel, val); -                  break; -                   -            // Added by T356 -            case FS_PITCHWHEELSENS: -                  err = fluid_synth_pitch_wheel_sens(fluidsynth, channel, val); -                  break; -                   -            case CTRL_PROGRAM: { -                  //Check if MusE is trying to set a preset on an unspecified font. If so, ignore. -                  if (FS_DEBUG) -                        printf("Program select : channel %d val %d\n",channel, val); -                  byte font_intid = channels[channel].font_intid; - -                  if (font_intid == FS_UNSPECIFIED_ID || font_intid == FS_UNSPECIFIED_FONT) -                        return; - -                  byte banknum = ((val >> 16) & 0xff); -                  byte patch = (val & 0xff); -                  //printf("val: %d banknum: %x patch: %d\n", val, banknum, patch); - -                  err = fluid_synth_program_select(fluidsynth, channel, font_intid , banknum, patch); -                  if (err) -                        printf("FluidSynth::setController() - Error changing program on soundfont %s, channel: %d\n", fluid_synth_error(fluidsynth), channel); -                  else { -                        channels[channel].preset = val;//setChannelPreset(val, channel); -                        channels[channel].banknum = banknum; -                        } -                  break; -                  } -            default: -                  if (FS_DEBUG) -                        printf("Setting controller on channel: %d with id: 0x%x to val: %d\n",channel, id, val); -                  err = fluid_synth_cc(fluidsynth, channel, id, val); -                  break; -            } - -      if (err) -            printf ("FluidSynth::setController() - error processing controller event: %s\n", fluid_synth_error(fluidsynth)); -      } - -//--------------------------------------------------------- -//   getControllerInfo -//--------------------------------------------------------- -int FluidSynth::getControllerInfo(int id, const char** name, int* controller, int* min, int* max, int* initval) const -      { -      if (id >= NUM_CONTROLLER) -            return 0; -      *controller = fluidCtrl[id].num; -      *name       = fluidCtrl[id].name; -      *min        = fluidCtrl[id].min; -      *max        = fluidCtrl[id].max; -      switch(id) -      { -        case 0: -          *initval = (int)(fluidCtrl[0].max*FS_PREDEF_VOLUME); -        break; -        case 1: -          *initval = 0; -        break; -        case 2: -          *initval = (int)(fluidCtrl[2].max*FS_PREDEF_REVERB_LEVEL); -        break; -        case 3: -          *initval = (int)(fluidCtrl[3].max*FS_PREDEF_REVERB_ROOMSIZE); -        break; -        case 4: -          *initval = (int)(fluidCtrl[4].max*FS_PREDEF_REVERB_DAMPING); -        break; -        case 5: -          *initval = (int)(fluidCtrl[5].max*FS_PREDEF_REVERB_WIDTH); -        break; -        case 6: -          *initval = 0; -        break; -        case 7: -          *initval = (int)(fluidCtrl[7].max*FS_PREDEF_CHORUS_NUM); -        break; -        case 8: -          *initval = (int)(fluidCtrl[8].max*FS_PREDEF_CHORUS_TYPE); -        break; -        case 9: -          *initval = (int)(fluidCtrl[9].max*FS_PREDEF_CHORUS_SPEED); -        break; -        case 10: -          *initval = (int)(fluidCtrl[10].max*FS_PREDEF_CHORUS_DEPTH); -        break; -        case 11: -          *initval = (int)(fluidCtrl[11].max*FS_PREDEF_CHORUS_LEVEL); -        break; -        default:       -          *initval = fluidCtrl[id].initval; -        break;   -      }   - -      if (FS_DEBUG) -            //printf("FluidSynth::getControllerInfo() id: %d name: %s controller: %d min: %d max: %d\n",id,*name,*controller,*min,*max); -            printf("FluidSynth::getControllerInfo() id: %d name: %s controller: %d min: %d max: %d initval: %d\n",id,*name,*controller,*min,*max,*initval); -      return ++id; -      } - -//--------------------------------------------------------- -//   sendError -//--------------------------------------------------------- -void FluidSynth::sendError(const char *errorMessage) -      { -      int len = 2 + strlen(errorMessage); -      unsigned char data[len]; -      *data = FS_ERROR; -      memcpy(data + 1, errorMessage, len - 1); -      sendSysex(len, data); -      } - -//--------------------------------------------------------- -//   getNextAvailableExternalId -//--------------------------------------------------------- - -int FluidSynth::getNextAvailableExternalId() -      { -      unsigned char place[FS_MAX_NR_OF_CHANNELS]; -      for(int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) -            place[i] = 0; -      for (std::list<FluidSoundFont>::iterator it = stack.begin(); it != stack.end(); it++) -            place[it->extid] = 1; - -      int i=0; -      while (i < FS_MAX_NR_OF_CHANNELS && place[i] == 1) -            i++; - -      return i; -      } - -//--------------------------------------------------------- -//   sfChannelChange -//--------------------------------------------------------- - -void FluidSynth::sfChannelChange(byte extid, byte channel) -      { -      if (FS_DEBUG) -            printf("FluidSynth::sfChannelChange()-Setting channel %d to font with extid %d intid %d\n",channel, extid, getFontInternalIdByExtId(extid)); -      channels[channel].font_extid = extid; -      channels[channel].font_intid = getFontInternalIdByExtId(extid); -      } - -//--------------------------------------------------------- -//   getFontInternalIdByExtId -//--------------------------------------------------------- -byte FluidSynth::getFontInternalIdByExtId(byte ext_id) -      { -      for (std::list<FluidSoundFont>::iterator it = stack.begin(); it !=stack.end(); it++) { -            if (it->extid == ext_id) -                  return it->intid; -            } -      return FS_UNSPECIFIED_FONT; -      } - -//--------------------------------------------------------- -//   sendLastDir -//--------------------------------------------------------- -void FluidSynth::sendLastdir(const char* lastdir) -      { -      int n = strlen(lastdir) + 2; -      byte d[n]; -      d[0] = FS_LASTDIR_CHANGE; -      memcpy(d+1,lastdir, strlen(lastdir)+1); - -      MidiPlayEvent ev(0,0, ME_SYSEX, d, n); -      gui->writeEvent(ev); -      } - - -//--------------------------------------------------------- -//   rewriteChannelSettings -//--------------------------------------------------------- -void FluidSynth::rewriteChannelSettings() -      { -      //Walk through the channels, remap internal ID:s to external ID:s (something that actually only needs to be done at -      //startup, since the fonts aren't loaded yet at that time and it isn't possible to give them a correct internal id -      //since they don't have any at that time, this can probably be fixed in a smarter way (but it works..)) -      for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) { -            int ext_id = channels[i].font_extid;//getFontExternalIdByChannel(i); -            if (ext_id != FS_UNSPECIFIED_ID) //Check if ext_id is set to any sane font -                  { -                  channels[i].font_intid = getFontInternalIdByExtId(ext_id);//(getFontInternalIdByExtId(ext_id));//if so, get value from the stack -                  } -            else -                  channels[i].font_intid = FS_UNSPECIFIED_FONT; //if not, set it to unspecified -            } - -      //Assign correct presets to all channels -      for (int i=0; i<FS_MAX_NR_OF_CHANNELS; i++) { -            int preset = channels[i].preset; -            int int_id = channels[i].font_intid; -            byte banknum = channels[i].banknum; - -            if (channels[i].drumchannel) -                  banknum = 128; - -            //printf("Channel %d, font int-id %d ext_id %d, preset %d\n",i, int_id, getFontExternalIdByChannel(i), preset); -            if (!(preset == FS_UNSPECIFIED_PRESET  -                  || int_id == FS_UNSPECIFIED_FONT -                  || int_id == FS_UNSPECIFIED_ID)) { -                  int rv = fluid_synth_program_select(fluidsynth, i, int_id, banknum, preset); -                  if (rv) -                        std::cerr << DEBUG_ARGS << "Error changing preset! " << fluid_synth_error(fluidsynth) << std::endl; -                  } -            } -      } -//--------------------------------------------------------- -//   getPatchName -//--------------------------------------------------------- -const char* FluidSynth::getPatchName(int i, int, int, bool /*drum*/) const -      { -      if (channels[i].font_intid == FS_UNSPECIFIED_FONT || -          channels[i].font_intid == FS_UNSPECIFIED_ID) -            //return "no preset"; -            return "<unknown>"; -      else if (channels[i].preset == FS_UNSPECIFIED_PRESET) -            //return "no preset"; -            return "<unknown>"; -      else { -            fluid_preset_t *preset = fluid_synth_get_channel_preset(fluidsynth, i); -            //if (!preset) return "no preset"; -            if (!preset) return "<unknown>"; -            return preset->get_name(preset); -            } -      } -//--------------------------------------------------------- -//   getPatchInfo -//--------------------------------------------------------- -const MidiPatch* FluidSynth::getPatchInfo(int i, const MidiPatch* patch) const -      { -      //if (channels[i].font_intid == FS_UNSPECIFIED_FONT) -      if (channels[i].font_intid == FS_UNSPECIFIED_FONT || -          channels[i].font_intid == FS_UNSPECIFIED_ID) -            return 0; -      //else if (channels[i].preset == FS_UNSPECIFIED_PRESET) -      //      return 0; -      else { -            //printf("Getpatchname, channel: %d\n",channel); -            if (!patch) -                  //Deliver first patch -                  return getFirstPatch(i); -            else -                  //Deliver next patch -                  return getNextPatch(i, patch); -            } -      } - -//--------------------------------------------------------- -//   getFirstPatch -//--------------------------------------------------------- -const MidiPatch* FluidSynth::getFirstPatch (int channel) const -      { -      static MidiPatch midiPatch; - -      midiPatch.typ = 0; -      midiPatch.lbank = 0; - -      fluid_preset_t* preset; -      int font_id = channels[channel].font_intid; -      //if (font_id == FS_UNSPECIFIED_FONT) -      if (font_id == FS_UNSPECIFIED_FONT || font_id == FS_UNSPECIFIED_ID) -            return 0; - -      fluid_sfont_t* sfont = fluid_synth_get_sfont_by_id(fluidsynth, font_id); - -      if (!channels[channel].drumchannel) { -            for (unsigned bank = 0; bank < 128; ++bank) { -                  for (unsigned patch = 0; patch < 128; ++patch) { -                        preset = sfont->get_preset (sfont, bank, patch); -                        if (preset) { -                              midiPatch.hbank = bank; -                              midiPatch.prog = patch; -                              midiPatch.name = preset->get_name (preset); -                              return &midiPatch; -                              } -                        } -                  } -            return 0; -            } -      else { //This is a drumchannel -            int bank = 128; -            for (unsigned patch = 0; patch < 128; ++patch) { -                  preset = sfont->get_preset (sfont, bank, patch); -                  if (preset) { -                        midiPatch.hbank = bank; -                        midiPatch.prog = patch; -                        midiPatch.name = preset->get_name(preset); -                        return &midiPatch; -                        } -                  } -            } -      return 0; -      } - -//--------------------------------------------------------- -//   getNextPatch -//--------------------------------------------------------- -const MidiPatch* FluidSynth::getNextPatch (int channel, const MidiPatch* patch) const -      { -      static MidiPatch midiPatch; -      //First check if there actually is any soundfont associated to the channel. If not, don't bother -      int font_id = channels[channel].font_intid; -      if (font_id == FS_UNSPECIFIED_FONT || font_id == FS_UNSPECIFIED_ID) -            return 0; -      if (patch == 0) -            return getFirstPatch(channel); -      midiPatch.typ = 0; -      midiPatch.lbank = 0; - -      //printf("Font has internal id: %d\n",font_id); -      fluid_preset_t* preset; -      fluid_sfont_t* sfont = fluid_synth_get_sfont_by_id(fluidsynth, font_id); - -      if (!channels[channel].drumchannel) { -            unsigned prog = patch->prog + 1; - -            for (unsigned bank = patch->hbank; bank < 128; ++bank) { -                  for ( ; prog < 128; ++prog) { -                        preset = sfont->get_preset (sfont, bank, prog); -                        if (preset) { -                              //printf("Preset info: bank: %d prog: %d name: %s\n", bank, prog, preset->get_name(preset)); -                              midiPatch.hbank = bank; -                              midiPatch.prog = prog; -                              midiPatch.name = preset->get_name (preset); -                              return &midiPatch; -                              } -                        } -                        prog = 0; // Reset if we "come around" -                  } -            } -      else { //This is a drum channel -            unsigned bank = 128; -            unsigned prog = patch->prog; -            for (prog = patch->prog + 1; prog < 128; ++prog) { -                  preset = sfont->get_preset (sfont, bank, prog); -                  if (preset) { -                        //printf("Preset info: bank: %d prog: %d name: %s\n",bank, prog, preset->get_name(preset)); -                        midiPatch.hbank = bank; -                        midiPatch.prog = prog; -                        midiPatch.name = preset->get_name (preset); -                        return &midiPatch; -                        } -                  } -            } -      return 0; -      } - -//--------------------------------------------------------- -//   popSoundfont -//--------------------------------------------------------- - -bool FluidSynth::popSoundfont (int ext_id) -      { -         bool success = false; -         int int_id = getFontInternalIdByExtId(ext_id); - -         //if (int_id == FS_UNSPECIFIED_FONT) { -         if (int_id == FS_UNSPECIFIED_FONT || int_id == FS_UNSPECIFIED_ID) { -               std::cerr << DEBUG_ARGS << "Internal error! Request for deletion of Soundfont that is not registered!" << std::endl; -               } -         else -         { -         //Try to unload soundfont -         int err = fluid_synth_sfunload(fluidsynth, int_id, 0); -         if (err != -1) {//Success -               //Check all channels that the font is used in -               for (int i=0; i<FS_MAX_NR_OF_CHANNELS;  i++) { -                     //Set them to unspecified and reset preset settings -                     if (channels[i].font_intid == int_id) { -                           channels[i].font_intid = FS_UNSPECIFIED_ID; -                           channels[i].font_extid = FS_UNSPECIFIED_ID; -                           channels[i].preset = FS_UNSPECIFIED_PRESET; -                           } -                     } -               //Remove it from soundfont stack -               for (std::list<FluidSoundFont>::iterator it =stack.begin(); it !=stack.end(); it++) { -                     if (it->intid == int_id) { -                           stack.erase(it); -                           break; -                           } -                     } -               //Resend fontdata & re-initialize -               sendSoundFontData(); -               sendChannelData(); -               rewriteChannelSettings(); -               success = true; -               currentlyLoadedFonts--; -            } -         else //OK, there was trouble -               std::cerr << DEBUG_ARGS << "Error unloading soundfont!" << fluid_synth_error(fluidsynth) << std::endl; -      } -      if (FS_DEBUG) -            printf("Removed soundfont with ext it: %d\n",ext_id); -      return success; -      } - -//--------------------------------------------------------- -//   instantiate -//    construct a new synthesizer instance -//--------------------------------------------------------- - -class QWidget; -static  pthread_mutex_t globalMutex; -static bool mutexEnabled = false; - - -static Mess* instantiate(int sr, QWidget*, QString* projectPathPtr, const char* name) -      { -printf("fluidsynth sampleRate %d\n", sr); -      projPathPtr=projectPathPtr; - -      if (!mutexEnabled) { -          pthread_mutex_init(&globalMutex,NULL); -          mutexEnabled = true; -          } - -      FluidSynth* synth = new FluidSynth(sr, &globalMutex); -      if (synth->init(name)) { -            delete synth; -            synth = 0; -            } -      return synth; -      } - -extern "C" -      { -      static MESS descriptor = { -            "FluidSynth", -            "FluidSynth soundfont loader by Mathias Lundgren", //Mathias Lundgren (lunar_shuttle@users.sf.net) -            "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/fluidsynth/fluidsynti.h b/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynti.h deleted file mode 100644 index 0816475c..00000000 --- a/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynti.h +++ /dev/null @@ -1,151 +0,0 @@ -/* - * MusE FLUID Synth softsynth plugin - * - * Copyright (C) 2004 Mathias Lundgren (lunar_shuttle@users.sourcforge.net) - * - * $Id: fluidsynti.h,v 1.15.2.5 2009/11/19 04:20:33 terminator356 Exp $ - * - */ - -#ifndef __MUSE_FLUIDSYNTI_H__ -#define __MUSE_FLUIDSYNTI_H__ - -#include <fluidsynth.h> -#include <pthread.h> -#include <string> - -#include "fluidsynthgui.h" -#include "libsynti/mess.h" -#include "muse/debug.h" -//#include "libsynti/mpevent.h" -#include "muse/mpevent.h"    -#include "muse/midictrl.h" - -#define FS_DEBUG_DATA 0 //Turn on/off debug print of midi data sent to fluidsynth - -typedef unsigned char byte; - -struct FluidSoundFont -      { -      std::string filename; -      std::string name; -      byte extid, intid; -      }; - -struct FluidCtrl { -      const char* name; -      int num; -      int min, max; -      //int val; -      int initval; -      }; - -// NRPN-controllers: -static const int FS_GAIN            = 0 + CTRL_NRPN14_OFFSET; -static const int FS_REVERB_ON       = 1 + CTRL_NRPN14_OFFSET; -static const int FS_REVERB_LEVEL    = 2 + CTRL_NRPN14_OFFSET; -static const int FS_REVERB_ROOMSIZE = 3 + CTRL_NRPN14_OFFSET; -static const int FS_REVERB_DAMPING  = 4 + CTRL_NRPN14_OFFSET; -static const int FS_REVERB_WIDTH    = 5 + CTRL_NRPN14_OFFSET; -static const int FS_CHORUS_ON       = 6 + CTRL_NRPN14_OFFSET; -static const int FS_CHORUS_NUM      = 7 + CTRL_NRPN14_OFFSET; -static const int FS_CHORUS_TYPE     = 8 + CTRL_NRPN14_OFFSET; -static const int FS_CHORUS_SPEED    = 9 + CTRL_NRPN14_OFFSET; -static const int FS_CHORUS_DEPTH   = 10 + CTRL_NRPN14_OFFSET; -static const int FS_CHORUS_LEVEL   = 11 + CTRL_NRPN14_OFFSET; -// Added by T356 -static const int FS_PITCHWHEELSENS  = 0 + CTRL_RPN_OFFSET; - -// FluidChannel is used to map different soundfonts to different fluid-channels -// This is to be able to select different presets from specific soundfonts, since -// Fluidsynth has a quite strange way of dealing with fontloading and channels -// We also need this since getFirstPatch and getNextPatch only tells us which channel is -// used, so this works as a connection between soundfonts and fluid-channels (one channel -// can only have one soundfont, but one soundfont can have many channels) - -struct FluidChannel -      { -      byte font_extid, font_intid, preset, drumchannel; -      byte banknum; // hbank -      //FluidSoundFont* font; -      }; - -/*#include <string> -#include <list> -#include <map> -*/ - -class FluidSynth : public Mess { -   private: -      bool pushSoundfont (const char*, int); -      void sendSysex(int l, const unsigned char* d); -      void sendLastdir(const char*); -      void sfChannelChange(unsigned char font_id, unsigned char channel); -      void parseInitData(int n, const byte* d); - -      byte getFontInternalIdByExtId (byte channel); - -      void debug(const char* msg) { if (FS_DEBUG) printf("Debug: %s\n",msg); } -      void dumpInfo(); //Prints out debug info - -      FluidChannel channels[FS_MAX_NR_OF_CHANNELS]; -      std::string lastdir; -      pthread_t fontThread; -      const MidiPatch * getFirstPatch (int channel) const; -      const MidiPatch* getNextPatch (int, const MidiPatch *) const; - -      //For reverb and chorus: -      double rev_size, rev_damping, rev_width, rev_level, cho_level, cho_speed, cho_depth; -      bool rev_on, cho_on; -      int cho_num, cho_type; - -public: -      FluidSynth(int sr, pthread_mutex_t *_Globalsfloader_mutex); -      ~FluidSynth(); -      bool init(const char*); -      virtual void processMessages(); -      virtual void process(float**, int, int); -      virtual bool playNote(int channel, int pitch, int velo); -      virtual bool sysex(int, const unsigned char*); -      virtual bool setController(int, int, int); -      void setController(int, int , int, bool); -      virtual void getInitData(int*, const unsigned char**) const; -      virtual const char* getPatchName(int, int, int, bool) const; -      virtual const MidiPatch* getPatchInfo(int i, const MidiPatch* patch) const; -      virtual int getControllerInfo(int, const char**, int*, int*, int*, int*) const; -      virtual bool processEvent(const MidiPlayEvent&); - -      virtual bool hasGui() const { return true; } -      virtual bool guiVisible() const; -      virtual void showGui(bool val); - -      void sendError(const char*); -      void sendSoundFontData(); -      void sendChannelData(); -      void rewriteChannelSettings(); //used because fluidsynth does some very nasty things when loading a font! -      bool popSoundfont (int ext_id); - -      int getNextAvailableExternalId(); - -      fluid_synth_t* fluidsynth; -      FluidSynthGui* gui; -      pthread_mutex_t *_sfloader_mutex; -      int currentlyLoadedFonts; //To know whether or not to run the init-parameters -      std::list<FluidSoundFont> stack; -      int nrOfSoundfonts; - -      void initInternal(); - -      static FluidCtrl fluidCtrl[]; - -      }; - -struct FS_Helper //Only used to pass parameters when calling the loading thread -      { -      FluidSynth* fptr; -      std::string filename; -      int id; -      }; - -// static void* fontLoadThread(void* t); // moved to the implementation file -Orcan -#endif /* __MUSE_FLUIDSYNTI_H__ */ | 
