//========================================================= // MusE // Linux Music Editor // // vamgui.c // This is a simple GUI implemented with QT for // vam software synthesizer. // (Many) parts of this file was taken from Werner Schweer's GUI // for his organ soft synth. // // (C) Copyright 2002 Jotsif Lindman H�nlund (jotsif@linux.nu) // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA // 02111-1301, USA or point your web browser to http://www.gnu.org. //========================================================= #include #include #include #include #include "common_defs.h" #include "vamgui.h" #include "vam.h" #include #include #include #include #include #include #include #include "muse/globals.h" #include "muse/xml.h" #include "muse/midi.h" #include "muse/midictrl.h" #include "muse/icons.h" const char *vam_ctrl_names[] = { "DCO1_PITCHMOD", "DCO1_WAVEFORM", "DCO1_FM", "DCO1_PWM", "DCO1_ATTACK", "DCO1_DECAY", "DCO1_SUSTAIN", "DCO1_RELEASE", "DCO2_PITCHMOD", "DCO2_WAVEFORM", "DCO2_FM", "DCO2_PWM", "DCO2_ATTACK", "DCO2_DECAY", "DCO2_SUSTAIN", "DCO2_RELEASE", "LFO_FREQ", "LFO_WAVEFORM", "FILT_ENV_MOD", "FILT_KEYTRACK", "FILT_RES", "FILT_ATTACK", "FILT_DECAY", "FILT_SUSTAIN", "FILT_RELEASE", "DCO2ON", "FILT_INVERT", "FILT_CUTOFF", "DCO1_DETUNE", "DCO2_DETUNE", "DCO1_PW", "DCO2_PW" }; //--------------------------------------------------------- // Preset //--------------------------------------------------------- struct Preset { QString name; int ctrl[NUM_CONTROLLER]; void readConfiguration(MusECore::Xml& xml); void readControl(MusECore::Xml& xml); void writeConfiguration(MusECore::Xml& xml, int level); }; std::list presets; typedef std::list::iterator iPreset; // Removed by T356 //QString museProject; //QString museGlobalShare; //QString museUser; //QString instanceName; // char* presetFileTypes[] = { // "Presets (*.pre)", // 0 // }; //--------------------------------------------------------- // readControl //--------------------------------------------------------- void Preset::readControl(MusECore::Xml& xml) { int idx = 0; int val = 0; for (;;) { MusECore::Xml::Token token(xml.parse()); const QString& tag(xml.s1()); switch (token) { case MusECore::Xml::Error: case MusECore::Xml::End: return; case MusECore::Xml::TagStart: xml.unknown("control"); break; case MusECore::Xml::Attribut: if (tag == "idx") { idx = xml.s2().toInt(); if (idx >= NUM_CONTROLLER) idx = 0; } else if (tag == "val") val = xml.s2().toInt(); break; case MusECore::Xml::TagEnd: if (tag == "control") { ctrl[idx] = val; return; } default: break; } } } //--------------------------------------------------------- // readConfiguration //--------------------------------------------------------- void Preset::readConfiguration(MusECore::Xml& xml) { for (;;) { MusECore::Xml::Token token(xml.parse()); const QString& tag(xml.s1()); switch (token) { case MusECore::Xml::Error: case MusECore::Xml::End: return; case MusECore::Xml::TagStart: if (tag == "control") readControl(xml); else xml.unknown("preset"); break; case MusECore::Xml::Attribut: if (tag == "name") name = xml.s2(); break; case MusECore::Xml::TagEnd: if (tag == "preset") return; default: break; } } } //--------------------------------------------------------- // writeConfiguration //--------------------------------------------------------- void Preset::writeConfiguration(MusECore::Xml& xml, int level) { //xml.tag(level++, "preset name=\"%s\"", name.ascii()); xml.tag(level++, "preset name=\"%s\"", MusECore::Xml::xmlString(name).toAscii().constData()); for (int i = 0; i < NUM_CONTROLLER; ++i) { xml.tag(level, "control idx=\"%d\" val=\"%d\" /", i, ctrl[i]); } xml.tag(level--, "/preset"); } //--------------------------------------------------------- // VAMGui //--------------------------------------------------------- VAMGui::VAMGui() : QWidget(0, Qt::Window), MessGui() { setupUi(this); QSocketNotifier* s = new QSocketNotifier(readFd, QSocketNotifier::Read); connect(s, SIGNAL(activated(int)), SLOT(readMessage(int))); loadPresets->setIcon(QIcon(*MusEGui::openIcon)); savePresets->setIcon(QIcon(*MusEGui::saveIcon)); savePresetsToFile->setIcon(QIcon(*MusEGui::saveasIcon)); deletePreset->setIcon(QIcon(*MusEGui::deleteIcon)); // p4.0.27 First ctrl offset. dctrl[DCO1_PITCHMOD - VAM_FIRST_CTRL] = SynthGuiCtrl(PitchModS, LCDNumber1, SynthGuiCtrl::SLIDER); dctrl[DCO1_WAVEFORM - VAM_FIRST_CTRL] = SynthGuiCtrl(Waveform, 0, SynthGuiCtrl::COMBOBOX); dctrl[DCO1_FM - VAM_FIRST_CTRL] = SynthGuiCtrl(FMS, LCDNumber1_2, SynthGuiCtrl::SLIDER); dctrl[DCO1_PWM - VAM_FIRST_CTRL] = SynthGuiCtrl(PWMS, LCDNumber1_3, SynthGuiCtrl::SLIDER); dctrl[DCO1_ATTACK - VAM_FIRST_CTRL] = SynthGuiCtrl(AttackS, LCDNumber1_3_2, SynthGuiCtrl::SLIDER); dctrl[DCO1_DECAY - VAM_FIRST_CTRL] = SynthGuiCtrl(DecayS, LCDNumber1_3_2_2, SynthGuiCtrl::SLIDER); dctrl[DCO1_SUSTAIN - VAM_FIRST_CTRL] = SynthGuiCtrl(SustainS, LCDNumber1_3_2_3, SynthGuiCtrl::SLIDER); dctrl[DCO1_RELEASE - VAM_FIRST_CTRL] = SynthGuiCtrl(ReleaseS, LCDNumber1_3_2_4, SynthGuiCtrl::SLIDER); dctrl[DCO2_PITCHMOD - VAM_FIRST_CTRL] = SynthGuiCtrl(PitchModS2, LCDNumber1_4, SynthGuiCtrl::SLIDER); dctrl[DCO2_WAVEFORM - VAM_FIRST_CTRL] = SynthGuiCtrl(Waveform2, 0, SynthGuiCtrl::COMBOBOX); dctrl[DCO2_FM - VAM_FIRST_CTRL] = SynthGuiCtrl(FMS2, LCDNumber1_2_2, SynthGuiCtrl::SLIDER); dctrl[DCO2_PWM - VAM_FIRST_CTRL] = SynthGuiCtrl(PWMS2, LCDNumber1_3_3, SynthGuiCtrl::SLIDER); dctrl[DCO2_ATTACK - VAM_FIRST_CTRL] = SynthGuiCtrl(AttackS2, LCDNumber1_3_2_5, SynthGuiCtrl::SLIDER); dctrl[DCO2_DECAY - VAM_FIRST_CTRL] = SynthGuiCtrl(DecayS2, LCDNumber1_3_2_2_2, SynthGuiCtrl::SLIDER); dctrl[DCO2_SUSTAIN - VAM_FIRST_CTRL] = SynthGuiCtrl(SustainS2, LCDNumber1_3_2_3_2, SynthGuiCtrl::SLIDER); dctrl[DCO2_RELEASE - VAM_FIRST_CTRL] = SynthGuiCtrl(ReleaseS2, LCDNumber1_3_2_4_2, SynthGuiCtrl::SLIDER); dctrl[LFO_FREQ - VAM_FIRST_CTRL] = SynthGuiCtrl(FreqS, LCDNumber1_5, SynthGuiCtrl::SLIDER); dctrl[LFO_WAVEFORM - VAM_FIRST_CTRL] = SynthGuiCtrl(Waveform2_2, 0, SynthGuiCtrl::COMBOBOX); dctrl[FILT_ENV_MOD - VAM_FIRST_CTRL] = SynthGuiCtrl(EnvModS, LCDNumber1_5_3, SynthGuiCtrl::SLIDER); dctrl[FILT_KEYTRACK - VAM_FIRST_CTRL] = SynthGuiCtrl(KeyTrack, 0, SynthGuiCtrl::SWITCH); dctrl[FILT_RES - VAM_FIRST_CTRL] = SynthGuiCtrl(ResS, LCDNumber1_5_5, SynthGuiCtrl::SLIDER); dctrl[FILT_ATTACK - VAM_FIRST_CTRL] = SynthGuiCtrl(AttackS3, LCDNumber1_3_2_5_2, SynthGuiCtrl::SLIDER); dctrl[FILT_DECAY - VAM_FIRST_CTRL] = SynthGuiCtrl(DecayS3, LCDNumber1_3_2_2_2_2, SynthGuiCtrl::SLIDER); dctrl[FILT_SUSTAIN - VAM_FIRST_CTRL] = SynthGuiCtrl(SustainS3, LCDNumber1_3_2_3_2_2, SynthGuiCtrl::SLIDER); dctrl[FILT_RELEASE - VAM_FIRST_CTRL] = SynthGuiCtrl(ReleaseS3, LCDNumber1_3_2_4_2_2, SynthGuiCtrl::SLIDER); dctrl[DCO2ON - VAM_FIRST_CTRL] = SynthGuiCtrl(DCO2On, 0, SynthGuiCtrl::SWITCH); dctrl[FILT_INVERT - VAM_FIRST_CTRL] = SynthGuiCtrl(FilterInvert, 0, SynthGuiCtrl::SWITCH); dctrl[FILT_CUTOFF - VAM_FIRST_CTRL] = SynthGuiCtrl(CutoffS, LCDNumber1_5_5_2, SynthGuiCtrl::SLIDER); dctrl[DCO1_DETUNE - VAM_FIRST_CTRL] = SynthGuiCtrl(DetuneS, LCDNumber1_6, SynthGuiCtrl::SLIDER); dctrl[DCO2_DETUNE - VAM_FIRST_CTRL] = SynthGuiCtrl(DetuneS2, LCDNumber1_6_2, SynthGuiCtrl::SLIDER); dctrl[DCO1_PW - VAM_FIRST_CTRL] = SynthGuiCtrl(PWS, LCDNumber1_2_3, SynthGuiCtrl::SLIDER); dctrl[DCO2_PW - VAM_FIRST_CTRL] = SynthGuiCtrl(PWS2, LCDNumber1_2_4, SynthGuiCtrl::SLIDER); map = new QSignalMapper(this); for (int i = 0; i < NUM_CONTROLLER; ++i) { map->setMapping(dctrl[i].editor, i); if (dctrl[i].type == SynthGuiCtrl::SLIDER) connect((QSlider*)(dctrl[i].editor), SIGNAL(valueChanged(int)), map, SLOT(map())); else if (dctrl[i].type == SynthGuiCtrl::COMBOBOX) connect((QComboBox*)(dctrl[i].editor), SIGNAL(activated(int)), map, SLOT(map())); else if (dctrl[i].type == SynthGuiCtrl::SWITCH) connect((QCheckBox*)(dctrl[i].editor), SIGNAL(toggled(bool)), map, SLOT(map())); } connect(map, SIGNAL(mapped(int)), this, SLOT(ctrlChanged(int))); connect(presetList, SIGNAL(itemClicked(QListWidgetItem*)), this, SLOT(presetClicked(QListWidgetItem*))); // presetNameEdit connect(presetSet, SIGNAL(clicked()), this, SLOT(setPreset())); connect(savePresets, SIGNAL(clicked()), this, SLOT(savePresetsPressed())); connect(loadPresets, SIGNAL(clicked()), this, SLOT(loadPresetsPressed())); connect(deletePreset, SIGNAL(clicked()), this, SLOT(deletePresetPressed())); connect(savePresetsToFile, SIGNAL(clicked()), this, SLOT(savePresetsToFilePressed())); ctrlHi = 0; ctrlLo = 0; dataHi = 0; dataLo = 0; presetFileName = NULL; // 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) // Nov 21, 2012 Hey this causes the thing not to open at all, EVER, on Lubuntu and some others! // And we had a request to remove this from a knowledgable tester. REMOVE Tim. ///show(); ///hide(); } //--------------------------------------------------------- // ctrlChanged //--------------------------------------------------------- void VAMGui::ctrlChanged(int idx) { SynthGuiCtrl* ctrl = &dctrl[idx]; int val = 0; if (ctrl->type == SynthGuiCtrl::SLIDER) { QSlider* slider = (QSlider*)(ctrl->editor); int max = slider->maximum(); val = (slider->value() * 16383 + max/2) / max; } else if (ctrl->type == SynthGuiCtrl::COMBOBOX) { val = ((QComboBox*)(ctrl->editor))->currentIndex(); } else if (ctrl->type == SynthGuiCtrl::SWITCH) { val = ((QCheckBox*)(ctrl->editor))->isChecked(); } //sendController(0, idx + MusECore::CTRL_RPN14_OFFSET, val); sendController(0, idx + VAM_FIRST_CTRL, val); // p4.0.27 } int VAMGui::getController(int idx) { // p4.0.27 if(idx < VAM_FIRST_CTRL || idx > VAM_LAST_CTRL) { //#ifdef VAM_DEBUG printf("VAMGui:: invalid controller number %d\n", idx); //#endif return 0; } idx -= VAM_FIRST_CTRL; SynthGuiCtrl* ctrl = &dctrl[idx]; int val = 0; if (ctrl->type == SynthGuiCtrl::SLIDER) { QSlider* slider = (QSlider*)(ctrl->editor); int max = slider->maximum(); val = (slider->value() * 16383 + max/2) / max; } else if (ctrl->type == SynthGuiCtrl::COMBOBOX) { val = ((QComboBox*)(ctrl->editor))->currentIndex(); } else if (ctrl->type == SynthGuiCtrl::SWITCH) { val = ((QCheckBox*)(ctrl->editor))->isChecked(); } return val; } int VAMGui::getControllerInfo(int id, const char** name, int* controller, int* min, int* max, int* /*initval*/) const { if (id >= NUM_CONTROLLER) return 0; //*controller = id; *controller = id + VAM_FIRST_CTRL; // p4.0.27 *name = vam_ctrl_names[id]; const SynthGuiCtrl* ctrl = (const SynthGuiCtrl*)&dctrl[id]; //int val = 0; if (ctrl->type == SynthGuiCtrl::SLIDER) { QSlider* slider = (QSlider*)(ctrl->editor); *max = 16383; //slider->maximum(); *min = slider->minimum(); //val = (slider->value() * 16383 + max/2) / max; //val = 16383 + 1/2 } else if (ctrl->type == SynthGuiCtrl::COMBOBOX) { //val = ((QComboBox*)(ctrl->editor))->currentIndex(); *min = 0; *max = ((QComboBox*)(ctrl->editor))->count(); } else if (ctrl->type == SynthGuiCtrl::SWITCH) { //val = ((QCheckBox*)(ctrl->editor))->isChecked(); *min=0; *max=1; } return ++id; } //--------------------------------------------------------- // presetClicked //--------------------------------------------------------- void VAMGui::presetClicked(QListWidgetItem* item) { if (item == 0) return; presetNameEdit->setText(item->text()); Preset* preset = 0; for (iPreset i = presets.begin(); i != presets.end(); ++i) { if (i->name == item->text()) { preset = &*i; break; } } activatePreset(preset); } //--------------------------------------------------------- // activatePreset //--------------------------------------------------------- void VAMGui::activatePreset(Preset* preset) { if (preset == 0) { fprintf(stderr, "internal error 1\n"); exit(-1); } //for (unsigned int i = 0; i < sizeof(dctrl)/sizeof(*dctrl); ++i) { for (unsigned int i = 0; i < NUM_CONTROLLER; ++i) { // p4.0.27 setParam(i, preset->ctrl[i]); ctrlChanged(i); } } //--------------------------------------------------------- // setPreset //--------------------------------------------------------- void VAMGui::setPreset() { if (presetNameEdit->text().isEmpty()) return; for (iPreset i = presets.begin(); i != presets.end(); ++i) { if (i->name == presetNameEdit->text()) { setPreset(&*i); return; } } addNewPreset(presetNameEdit->text()); } //--------------------------------------------------------- // addNewPreset //--------------------------------------------------------- void VAMGui::addNewPreset(const QString& name) { Preset p; p.name = name; setPreset(&p); presets.push_back(p); presetList->addItem(name); } //--------------------------------------------------------- // deleteNamedPreset //--------------------------------------------------------- void VAMGui::deleteNamedPreset(const QString& name) { QListWidgetItem * item = presetList->findItems(name, Qt::MatchExactly)[0]; if (!item) { fprintf(stderr, "%s: Could not find preset!\n", __FUNCTION__); return; } presetList->clearSelection(); int index = presetList->row(item); presetList->takeItem(index); for (iPreset i = presets.begin(); i != presets.end(); ++i) { if (i->name == name) { presets.erase(i); break; } } } //--------------------------------------------------------- // setPreset //--------------------------------------------------------- void VAMGui::setPreset(Preset* preset) { for (unsigned int i = 0; i < NUM_CONTROLLER; ++i) { int val = 0; SynthGuiCtrl* ctrl = &dctrl[i]; if (ctrl->type == SynthGuiCtrl::SLIDER) { QSlider* slider = (QSlider*)(ctrl->editor); int max = slider->maximum(); val = (slider->value() * 16383 + max/2) / max; } else if (ctrl->type == SynthGuiCtrl::COMBOBOX) { val = ((QComboBox*)(ctrl->editor))->currentIndex(); } else if (ctrl->type == SynthGuiCtrl::SWITCH) { val = ((QCheckBox*)(ctrl->editor))->isChecked(); } preset->ctrl[i] = val; } // // send sysex to synti // #if 0 putchar(0xf0); putchar(MUSE_SYNTH_SYSEX_MFG_ID); // mess putchar(VAM_UNIQUE_ID); // vam putchar(0x3); // setPreset QByteArray ba = preset->name.toLatin1(); const char* name = ba.constData(); while (*name) putchar(*name++ & 0x7f); putchar(0); for (int i = 0; i < NUM_CONTROLLER; ++i) { putchar(i); putchar(preset->ctrl[i]); } putchar(0xf7); #endif } //--------------------------------------------------------- // setParam // set param in gui // val -- midi value 0 - 16383 //--------------------------------------------------------- void VAMGui::setParam(int param, int val) { //if (param >= int(sizeof(dctrl)/sizeof(*dctrl))) { if (param >= NUM_CONTROLLER) { // p4.0.27 #ifdef VAM_DEBUG fprintf(stderr, "vam: set unknown parameter 0x%x to 0x%x\n", param, val); #endif return; } SynthGuiCtrl* ctrl = &dctrl[param]; ctrl->editor->blockSignals(true); if (ctrl->type == SynthGuiCtrl::SLIDER) { QSlider* slider = (QSlider*)(ctrl->editor); int max = slider->maximum(); if(val < 0) val = (val * max + 8191) / 16383 - 1; else val = (val * max + 8191) / 16383; slider->setValue(val); if (ctrl->label) ((QLCDNumber*)(ctrl->label))->display(val); } else if (ctrl->type == SynthGuiCtrl::COMBOBOX) { ((QComboBox*)(ctrl->editor))->setCurrentIndex(val); } else if (ctrl->type == SynthGuiCtrl::SWITCH) { ((QCheckBox*)(ctrl->editor))->setChecked(val); } ctrl->editor->blockSignals(false); } //--------------------------------------------------------- // sysexReceived //--------------------------------------------------------- void VAMGui::sysexReceived(const unsigned char* /*data*/, int /*len*/) { // Removed, this is not used. p4.0.27 /* if (len >= 4) { //--------------------------------------------- // MusE Soft Synth //--------------------------------------------- if (data[0] == MUSE_SYNTH_SYSEX_MFG_ID) { if (data[1] == VAM_UNIQUE_ID) { // vam if (data[2] == 2) { // parameter response if (len != 6) { fprintf(stderr, "vam gui: bad sysEx len\n"); return; } int val = data[4] + (data[5]<<7); switch(data[3]) { case DCO1_PITCHMOD: case DCO2_PITCHMOD: case DCO1_DETUNE: case DCO2_DETUNE: setParam(data[3], ((val + 1) * 2) - 16383); break; default: setParam(data[3], val); break; } return; } else if (data[2] == 1) { // param request return; } } } } #ifdef VAM_DEBUG fprintf(stderr, "vam gui: unknown sysex received, len %d:\n", len); for (int i = 0; i < len; ++i) fprintf(stderr, "%02x ", data[i]); fprintf(stderr, "\n"); #endif */ } //--------------------------------------------------------- // processEvent //--------------------------------------------------------- void VAMGui::processEvent(const MusECore::MidiPlayEvent& ev) { if (ev.type() == MusECore::ME_CONTROLLER) { //setParam(ev.dataA() & 0xfff, ev.dataB()); // p4.0.27 int ctl = ev.dataA(); if(ctl < VAM_FIRST_CTRL || ctl > VAM_LAST_CTRL) { //#ifdef VAM_DEBUG printf("VAMGui:: invalid controller number %d\n", ctl); //#endif return; } setParam(ctl - VAM_FIRST_CTRL, ev.dataB()); } else if (ev.type() == MusECore::ME_SYSEX) sysexReceived(ev.data(), ev.len()); else { #ifdef VAM_DEBUG printf("VAMGui::illegal event type received\n"); #endif } } //--------------------------------------------------------- // loadPresetsPressed //--------------------------------------------------------- void VAMGui::loadPresetsPressed() { #if 1 // TODO QString iname; QString s(MusEGlobal::configPath); /* QString filename = QFileDialog::getOpenFileName(lastdir, QString("*.[Ss][Ff]2"), this, "Load Soundfont dialog", "Choose soundfont");*/ QString fn = QFileDialog::getOpenFileName(this, tr("MusE: Load VAM Presets"), s, "Presets (*.vam)"); if (fn.isEmpty()) return; bool popenFlag=false; FILE* f = fopen(fn.toAscii().constData(),"r");//fileOpen(this, fn, QString(".pre"), "r", popenFlag, true); if (f == 0) return; presets.clear(); presetList->clear(); MusECore::Xml xml(f); int mode = 0; for (;;) { MusECore::Xml::Token token = xml.parse(); QString tag = xml.s1(); switch (token) { case MusECore::Xml::Error: case MusECore::Xml::End: return; case MusECore::Xml::TagStart: if (mode == 0 && tag == "muse") mode = 1; // else if (mode == 1 && tag == "instrument") // mode = 2; else if (mode == 2 && tag == "preset") { Preset preset; preset.readConfiguration(xml); presets.push_back(preset); presetList->addItem(preset.name); } else if(mode != 1) xml.unknown("SynthPreset"); break; case MusECore::Xml::Attribut: if(mode == 1 && tag == "iname") { // fprintf(stderr, "%s\n", xml.s2().toLatin1()); if(xml.s2() != "vam-1.0") return; else mode = 2; } break; case MusECore::Xml::TagEnd: if (tag == "muse") goto ende; default: break; } } ende: if (popenFlag) pclose(f); else fclose(f); if (presetFileName) delete presetFileName; presetFileName = new QString(fn); QString dots ("..."); fileName->setText(fn.right(32).insert(0, dots)); if (presets.empty()) return; Preset preset = presets.front(); activatePreset(&preset); #endif } //--------------------------------------------------------- // doSavePresets //--------------------------------------------------------- void VAMGui::doSavePresets(const QString& fn, bool showWarning) { showWarning=showWarning; // prevent of unsused variable warning #if 1 bool popenFlag=false; if (fn=="") { printf("empty name\n"); return; } printf("fn=%s\n",fn.toAscii().constData()); FILE* f = fopen(fn.toAscii().constData(),"w");//fileOpen(this, fn, QString(".pre"), "w", popenFlag, false, showWarning); if (f == 0) return; MusECore::Xml xml(f); xml.header(); xml.tag(0, "muse version=\"1.0\""); xml.tag(0, "instrument iname=\"vam-1.0\" /"); for (iPreset i = presets.begin(); i != presets.end(); ++i) i->writeConfiguration(xml, 1); xml.tag(1, "/muse"); if (popenFlag) pclose(f); else fclose(f); #endif } //--------------------------------------------------------- // savePresetsPressed //--------------------------------------------------------- void VAMGui::savePresetsPressed() { #if 1 // TODO QString s(MusEGlobal::configPath); QString fn = QFileDialog::getSaveFileName(this, tr("MusE: Save VAM Presets"), s, "Presets (*.vam)"); if (fn.isEmpty()) return; doSavePresets (fn, true); #endif } //--------------------------------------------------------- // savePresetsToFilePressed //--------------------------------------------------------- void VAMGui::savePresetsToFilePressed() { if (!presetFileName ) { QString s(MusEGlobal::configPath); QString fn = QFileDialog::getSaveFileName(this, tr("MusE: Save VAM Presets"), s, "Presets (*.vam)"); presetFileName = new QString(fn); } if (*presetFileName == QString("")) return; //if presetFileName-> doSavePresets (*presetFileName, false); } //--------------------------------------------------------- // deletePresetPressed //--------------------------------------------------------- void VAMGui::deletePresetPressed() { deleteNamedPreset (presetList->currentItem()->text()); } //--------------------------------------------------------- // readMessage //--------------------------------------------------------- void VAMGui::readMessage(int) { MessGui::readMessage(); }