From b0546e5e7f7044019892543c6c82029db8d564a7 Mon Sep 17 00:00:00 2001 From: Robert Jonsson Date: Thu, 15 Sep 2011 12:14:55 +0000 Subject: moved attic to a branch of it's own --- .../muse2/synti/fluidsynth/CMakeLists.txt | 106 -- attic/muse2-oom/muse2/synti/fluidsynth/README.txt | 45 - attic/muse2-oom/muse2/synti/fluidsynth/TODO | 13 - .../muse2/synti/fluidsynth/fluidsynth.qrc | 8 - .../muse2/synti/fluidsynth/fluidsynth0.png | Bin 1195 -> 0 bytes .../muse2/synti/fluidsynth/fluidsynth1.png | Bin 7252 -> 0 bytes .../muse2/synti/fluidsynth/fluidsynthgui.cpp | 837 ------------- .../muse2/synti/fluidsynth/fluidsynthgui.h | 228 ---- .../muse2/synti/fluidsynth/fluidsynthguibase.ui | 559 --------- .../muse2/synti/fluidsynth/fluidsynti.cpp | 1325 -------------------- .../muse2-oom/muse2/synti/fluidsynth/fluidsynti.h | 151 --- 11 files changed, 3272 deletions(-) delete mode 100644 attic/muse2-oom/muse2/synti/fluidsynth/CMakeLists.txt delete mode 100644 attic/muse2-oom/muse2/synti/fluidsynth/README.txt delete mode 100644 attic/muse2-oom/muse2/synti/fluidsynth/TODO delete mode 100644 attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth.qrc delete mode 100644 attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth0.png delete mode 100644 attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth1.png delete mode 100644 attic/muse2-oom/muse2/synti/fluidsynth/fluidsynthgui.cpp delete mode 100644 attic/muse2-oom/muse2/synti/fluidsynth/fluidsynthgui.h delete mode 100644 attic/muse2-oom/muse2/synti/fluidsynth/fluidsynthguibase.ui delete mode 100644 attic/muse2-oom/muse2/synti/fluidsynth/fluidsynti.cpp delete mode 100644 attic/muse2-oom/muse2/synti/fluidsynth/fluidsynti.h (limited to 'attic/muse2-oom/muse2/synti/fluidsynth') 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 @@ - - - - fluidsynth0.png - fluidsynth1.png - - - diff --git a/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth0.png b/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth0.png deleted file mode 100644 index 2cb25b54..00000000 Binary files a/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth0.png and /dev/null differ diff --git a/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth1.png b/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth1.png deleted file mode 100644 index 58ca0e61..00000000 Binary files a/attic/muse2-oom/muse2/synti/fluidsynth/fluidsynth1.png and /dev/null differ 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 -#include -#include -#include -#include -#include -#include - -#include "muse/midi.h" -#include "icons.h" - - - /* -#include "muse/debug.h" -#include -#include -#include -#include -#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; itext(); - 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; isignalsBlocked(); - 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; isetItem(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::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::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::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::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 - -class QDialog; -class QTreeWidgetItem; - -struct FluidChannel; -#define FS_DEBUG 0 //Turn on/off debug -/* -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#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 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 @@ - - - FLUIDSynthGuiBase - - - - 0 - 0 - 617 - 514 - - - - FLUID Synth - - - - 1 - - - - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - Load - - - - - - - false - - - Delete - - - - - - - Dump Info - - - - - - - - - - - 0 - 0 - - - - - ID - - - - - Fontname - - - - - - - - - 0 - 0 - - - - true - - - - Chnl - - - - - Soundfont - - - - - Drum Chnl - - - - - - - - false - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - 16383 - - - 16 - - - 1638 - - - Qt::Horizontal - - - QSlider::TicksBothSides - - - 1638 - - - - - - - 16383 - - - 16 - - - 1638 - - - Qt::Horizontal - - - QSlider::TicksBothSides - - - 1638 - - - - - - - 16383 - - - 16 - - - 1638 - - - Qt::Horizontal - - - QSlider::TicksBothSides - - - 1638 - - - - - - - 16383 - - - 16 - - - 1638 - - - Qt::Horizontal - - - QSlider::TicksBothSides - - - 1638 - - - - - - - Level - - - Qt::AlignCenter - - - false - - - - - - - Width - - - Qt::AlignCenter - - - false - - - - - - - Damping - - - Qt::AlignCenter - - - false - - - - - - - Room Size - - - Qt::AlignCenter - - - false - - - - - - - Reverb - - - - - - - - - - - 75 - true - - - - CHANNEL SETUP - - - false - - - Qt::AlignCenter - - - true - - - - - - - false - - - QFrame::StyledPanel - - - QFrame::Raised - - - - - - - Sine - - - - - Triangle - - - - - - - - Type - - - Qt::AlignCenter - - - false - - - - - - - 127 - - - - - - - Number - - - Qt::AlignCenter - - - false - - - - - - - 16383 - - - 16 - - - 1638 - - - Qt::Horizontal - - - QSlider::TicksBothSides - - - 1638 - - - - - - - Speed - - - Qt::AlignCenter - - - false - - - - - - - 16383 - - - 16 - - - 1638 - - - Qt::Horizontal - - - QSlider::TicksBothSides - - - 1638 - - - - - - - Depth - - - Qt::AlignCenter - - - false - - - - - - - 16383 - - - 16 - - - 1638 - - - Qt::Horizontal - - - QSlider::TicksBothSides - - - 1638 - - - - - - - Level - - - Qt::AlignCenter - - - false - - - - - - - Chorus - - - - - - - - - - - - - - - - Gain - - - Qt::AlignCenter - - - false - - - - - - - 0 - - - 127 - - - 5 - - - 13 - - - true - - - Qt::Horizontal - - - QSlider::TicksBothSides - - - 7 - - - - - - - - - - - 75 - true - - - - LOADED SOUNDFONTS - - - Qt::AlignCenter - - - true - - - - - - - - 0 - 0 - - - - image3 - - - true - - - false - - - - - - - - - - - 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 -#include - -#include - -#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; ishow(); - 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::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::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::const_iterator it =stack.begin(); it!=stack.end(); it++) { - *chptr = it->extid; - chptr++; - } - - //External id:s & preset for all channels: - for(int i=0; itoAscii().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; itoAscii(); - - 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; iwriteEvent(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::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::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::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::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::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"; - else if (channels[i].preset == FS_UNSPECIFIED_PRESET) - //return "no preset"; - return ""; - else { - fluid_preset_t *preset = fluid_synth_get_channel_preset(fluidsynth, i); - //if (!preset) return "no preset"; - if (!preset) return ""; - 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::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 -#include -#include - -#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 -#include -#include -*/ - -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 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__ */ -- cgit v1.2.3