summaryrefslogtreecommitdiff
path: root/attic/muse2-oom/muse2/muse/instruments/midictrledit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'attic/muse2-oom/muse2/muse/instruments/midictrledit.cpp')
-rw-r--r--attic/muse2-oom/muse2/muse/instruments/midictrledit.cpp725
1 files changed, 725 insertions, 0 deletions
diff --git a/attic/muse2-oom/muse2/muse/instruments/midictrledit.cpp b/attic/muse2-oom/muse2/muse/instruments/midictrledit.cpp
new file mode 100644
index 00000000..9dcac628
--- /dev/null
+++ b/attic/muse2-oom/muse2/muse/instruments/midictrledit.cpp
@@ -0,0 +1,725 @@
+//=========================================================
+// MusE
+// Linux Music Editor
+// $Id: midictrledit.cpp,v 1.1.1.1.2.2 2008/08/18 00:15:24 terminator356 Exp $
+//
+// (C) Copyright 2003 Werner Schweer (ws@seh.de)
+//=========================================================
+
+#include <stdio.h>
+
+#include "app.h"
+#include "midiport.h"
+#include "mididev.h"
+#include "midictrl.h"
+#include "midictrledit.h"
+#include "minstrument.h"
+#include "song.h"
+#include "xml.h"
+#include "filedialog.h"
+#include "globals.h"
+
+MidiControllerEditDialog* midiControllerEditDialog;
+
+static MidiController predefinedMidiController[] = {
+ MidiController(QString("Pitch"), 0x40000, -8192, +8191, 0),
+ };
+enum {
+ COL_NAME = 0, COL_TYPE,
+ COL_HNUM, COL_LNUM, COL_MIN, COL_MAX
+ };
+//---------------------------------------------------------
+// addControllerToView
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::addControllerToView(MidiController* mctrl)
+ {
+ QString hnum;
+ QString lnum;
+ QString min;
+ QString max;
+ int n = mctrl->num();
+ int h = (n >> 8) & 0x7f;
+ int l = n & 0x7f;
+ MidiController::ControllerType t = midiControllerType(n);
+ switch(t)
+ {
+ case MidiController::Controller7:
+ hnum = "---";
+ lnum.setNum(l);
+ min.setNum(mctrl->minVal());
+ max.setNum(mctrl->maxVal());
+ break;
+ case MidiController::RPN:
+ case MidiController::NRPN:
+ case MidiController::RPN14:
+ case MidiController::NRPN14:
+ case MidiController::Controller14:
+ hnum.setNum(h);
+ lnum.setNum(l);
+ min.setNum(mctrl->minVal());
+ max.setNum(mctrl->maxVal());
+ break;
+ case MidiController::Pitch:
+ hnum = "---";
+ lnum = "---";
+ min.setNum(mctrl->minVal());
+ max.setNum(mctrl->maxVal());
+ break;
+ default:
+ hnum = "---";
+ lnum = "---";
+ min.setNum(0);
+ max.setNum(0);
+ break;
+ }
+
+ new Q3ListViewItem(viewController,
+ mctrl->name(),
+ int2ctrlType(t),
+ hnum, lnum, min, max
+ );
+
+ }
+//---------------------------------------------------------
+// MidiControllerEditDialog
+//---------------------------------------------------------
+
+MidiControllerEditDialog::MidiControllerEditDialog(QWidget* parent, const char* name, bool modal, Qt::WFlags fl)
+ : MidiControllerEditDialogBase(parent, name, modal, fl)
+ {
+ _lastPort = midiPortsList->currentItem();
+ viewController->setColumnAlignment(COL_HNUM, Qt::AlignCenter);
+ viewController->setColumnAlignment(COL_LNUM, Qt::AlignCenter);
+ viewController->setColumnAlignment(COL_MIN, Qt::AlignCenter);
+ viewController->setColumnAlignment(COL_MAX, Qt::AlignCenter);
+ viewController->setColumnWidthMode(COL_NAME, Q3ListView::Maximum);
+
+ // populate list of predefined controller
+ updatePredefinedList();
+
+ // populate ports pulldown
+ updateMidiPortsList();
+ connect(buttonNew, SIGNAL(clicked()), SLOT(ctrlAdd()));
+ connect(buttonDelete, SIGNAL(clicked()), SLOT(ctrlDelete()));
+ connect(entryName, SIGNAL(textChanged(const QString&)), SLOT(nameChanged(const QString&)));
+ connect(comboType, SIGNAL(activated(const QString&)), SLOT(typeChanged(const QString&)));
+ connect(spinboxHCtrlNo, SIGNAL(valueChanged(int)), SLOT(valueHChanged(int)));
+ connect(spinboxLCtrlNo, SIGNAL(valueChanged(int)), SLOT(valueLChanged(int)));
+ connect(spinboxMin, SIGNAL(valueChanged(int)), SLOT(minChanged(int)));
+ connect(spinboxMax, SIGNAL(valueChanged(int)), SLOT(maxChanged(int)));
+ connect(viewController, SIGNAL(selectionChanged()), SLOT(controllerChanged()));
+ connect(buttonApply, SIGNAL(clicked()), SLOT(apply()));
+ connect(midiPortsList, SIGNAL(activated(int)), SLOT(portChanged(int)));
+
+ updateViewController();
+ _modified = false;
+ buttonApply->setEnabled(false);
+ connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
+ }
+
+//---------------------------------------------------------
+// songChanged
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::songChanged(int flags)
+{
+ // Is it simply a midi controller value adjustment? Forget it.
+ if(flags == SC_MIDI_CONTROLLER)
+ return;
+
+ if(flags & (SC_CONFIG | SC_MIDI_CONTROLLER))
+ //if(flags & (SC_CONFIG | SC_MIDI_CONTROLLER_ADD))
+ {
+ //listController->blockSignals(true);
+ midiPortsList->blockSignals(true);
+ //viewController->blockSignals(true);
+ updatePredefinedList();
+ updateMidiPortsList();
+ updateViewController();
+ //viewController->setCurrentItem(viewController->firstChild());
+ //controllerChanged(viewController->currentItem());
+ //listController->blockSignals(false);
+ midiPortsList->blockSignals(false);
+ //viewController->blockSignals(false);
+ }
+}
+
+//---------------------------------------------------------
+// updatePredefinedList
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::updatePredefinedList()
+{
+ listController->clear();
+ int size = sizeof(predefinedMidiController) / sizeof(*predefinedMidiController);
+ for (int i = 0; i < size; ++i)
+ listController->insertItem(predefinedMidiController[i].name());
+ listController->setSelected(0, true);
+}
+
+//---------------------------------------------------------
+// updateMidiPortsList
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::updateMidiPortsList()
+{
+ midiPortsList->clear();
+ for (int i = 0; i < MIDI_PORTS; ++i) {
+ MidiPort* port = &midiPorts[i];
+ MidiDevice* dev = port->device();
+ QString name;
+ name.sprintf("%d(%s)", port->portno()+1,
+ dev ? dev->name().toLatin1() : "none");
+ midiPortsList->insertItem(name, i);
+ }
+ _lastPort = midiPortsList->currentItem();
+}
+
+//---------------------------------------------------------
+// updateViewController
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::updateViewController()
+{
+ //for (iMidiController i = midiControllerList.begin();
+ // i != midiControllerList.end(); ++i) {
+ // addControllerToView(&*i);
+ int mpidx = midiPortsList->currentItem();
+
+ viewController->clear();
+ //MidiControllerList* mcl;
+ MidiInstrument* mi = midiPorts[mpidx].instrument();
+ //if(mi)
+ MidiControllerList* mcl = mi->controller();
+ //else
+ // mcl = &defaultMidiController;
+ for (iMidiController i = mcl->begin(); i != mcl->end(); ++i)
+ addControllerToView(*i);
+
+ viewController->blockSignals(true);
+ viewController->setCurrentItem(viewController->firstChild());
+ controllerChanged(viewController->currentItem());
+ viewController->blockSignals(false);
+
+ setModified(false);
+}
+
+//---------------------------------------------------------
+// reject
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::setModified(bool v)
+{
+ if(v == _modified)
+ return;
+
+ _modified = v;
+
+ if(v)
+ {
+ buttonApply->setEnabled(true);
+ }
+ else
+ {
+ buttonApply->setEnabled(false);
+ }
+}
+
+//---------------------------------------------------------
+// reject
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::reject()
+ {
+ //MidiControllerList* mcl;
+// MidiInstrument* mi = midiPorts[mpidx].instrument();
+ //if(mi)
+// MidiControllerList* mcl = mi->controller();
+ //else
+ // mcl = &defaultMidiController;
+// for (iMidiController i = mcl->begin(); i != mcl->end(); ++i)
+// addControllerToView(*i);
+
+ // Restore the list before closing this dialog.
+ updateViewController();
+ //setModified(false);
+
+ MidiControllerEditDialogBase::reject();
+ }
+
+//---------------------------------------------------------
+// apply
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::apply()
+{
+ int mpidx = midiPortsList->currentItem();
+ //MidiControllerList* mcl;
+ MidiInstrument* mi = midiPorts[mpidx].instrument();
+ //if(mi)
+ MidiControllerList* mcl = mi->controller();
+ //else
+ // mcl = &defaultMidiController;
+ mcl->clear();
+
+
+ Q3ListViewItem* item = viewController->firstChild();
+ int hval;
+ int lval;
+ while (item) {
+ hval = item->text(COL_HNUM).toInt();
+ lval = item->text(COL_LNUM).toInt();
+ MidiController* c = new MidiController();
+ c->setName(item->text(COL_NAME));
+
+ MidiController::ControllerType type = ctrlType2Int(item->text(COL_TYPE));
+
+ switch(type) {
+ case MidiController::Controller7:
+ c->setNum(lval);
+ break;
+ case MidiController::Controller14:
+ c->setNum((hval << 8 | lval) | CTRL_14_OFFSET);
+ break;
+ case MidiController::RPN:
+ c->setNum((hval << 8 | lval) | CTRL_RPN_OFFSET);
+ break;
+ case MidiController::NRPN:
+ c->setNum((hval << 8 | lval) | CTRL_NRPN_OFFSET);
+ break;
+ case MidiController::RPN14:
+ c->setNum((hval << 8 | lval) | CTRL_RPN14_OFFSET);
+ break;
+ case MidiController::NRPN14:
+ c->setNum((hval << 8 | lval) | CTRL_NRPN14_OFFSET);
+ break;
+ case MidiController::Program:
+ c->setNum(CTRL_PROGRAM);
+ break;
+ case MidiController::Pitch:
+ c->setNum(CTRL_PITCH);
+ break;
+ default:
+ break;
+ }
+ if(type == MidiController::Program)
+ {
+ c->setMinVal(0);
+ c->setMaxVal(0xffffff);
+ }
+ else
+ {
+ c->setMinVal(item->text(COL_MIN).toInt());
+ c->setMaxVal(item->text(COL_MAX).toInt());
+ }
+
+ mcl->push_back(c);
+
+ item = item->nextSibling();
+ }
+
+ // Update the list before closing this dialog.
+ //updateViewController();
+ //setModified(false);
+ song->update(SC_CONFIG | SC_MIDI_CONTROLLER);
+}
+
+//---------------------------------------------------------
+// ctrlAdd
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::ctrlAdd()
+ {
+ Q3ListBoxItem* item = listController->selectedItem();
+ if (item == 0)
+ return;
+ QString name = item->text();
+ int size = sizeof(predefinedMidiController) / sizeof(*predefinedMidiController);
+ for (int i = 0; i < size; ++i) {
+ MidiController* c = &predefinedMidiController[i];
+ if (c->name() != name)
+ continue;
+ MidiController::ControllerType t = midiControllerType(c->num());
+ QString type = int2ctrlType(t);
+ QString min, max;
+ QString hno, lno;
+ int h = (c->num() >> 8) & 0x7f;
+ int l = c->num() & 0x7f;
+
+ switch(t) {
+ case MidiController::Controller7:
+ min.setNum(c->minVal());
+ max.setNum(c->maxVal());
+ hno = "---";
+ lno.setNum(l);
+ break;
+ case MidiController::RPN:
+ case MidiController::NRPN:
+ case MidiController::RPN14:
+ case MidiController::NRPN14:
+ case MidiController::Controller14:
+ min.setNum(c->minVal());
+ max.setNum(c->maxVal());
+ hno.setNum(h);
+ lno.setNum(l);
+ break;
+ case MidiController::Pitch:
+ min.setNum(c->minVal());
+ max.setNum(c->maxVal());
+ hno = "---";
+ lno = "---";
+ break;
+ default:
+ hno = "---";
+ lno = "---";
+ min.setNum(0);
+ max.setNum(0);
+ break;
+ }
+
+ Q3ListViewItem* item = new Q3ListViewItem(viewController,
+ name, type, hno, lno, min, max);
+
+ viewController->blockSignals(true);
+ viewController->setCurrentItem(item);
+ controllerChanged(item);
+ viewController->blockSignals(false);
+
+ setModified(true);
+ break;
+ }
+ }
+
+//---------------------------------------------------------
+// ctrlDelete
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::ctrlDelete()
+ {
+ Q3ListViewItem* item = viewController->currentItem();
+ if (item == 0)
+ return;
+ delete item;
+
+ setModified(true);
+ }
+
+//---------------------------------------------------------
+// accept
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::accept()
+ {
+ apply();
+ MidiControllerEditDialogBase::accept();
+ }
+
+//---------------------------------------------------------
+// portChanged
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::portChanged(int n)
+ {
+ if(n == _lastPort)
+ return;
+ _lastPort = n;
+
+ //listController->blockSignals(true);
+ //midiPortsList->blockSignals(true);
+ //viewController->blockSignals(true);
+ //updatePredefinedList();
+ //updateMidiPortsList();
+ //reject(); // populate list
+ updateViewController();
+ //viewController->setCurrentItem(viewController->firstChild());
+ //controllerChanged(viewController->currentItem());
+ //listController->blockSignals(false);
+ //midiPortsList->blockSignals(false);
+ //viewController->blockSignals(false);
+ }
+
+//---------------------------------------------------------
+// nameChanged
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::nameChanged(const QString& s)
+ {
+ Q3ListViewItem* item = viewController->currentItem();
+ if (item == 0)
+ return;
+ item->setText(COL_NAME, s);
+
+ setModified(true);
+ }
+
+//---------------------------------------------------------
+// typeChanged
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::typeChanged(const QString& s)
+ {
+ Q3ListViewItem* item = viewController->currentItem();
+ if (item == 0)
+ return;
+ item->setText(COL_TYPE, s);
+ switch(ctrlType2Int(s)) {
+ case MidiController::Controller14:
+ case MidiController::RPN14:
+ case MidiController::NRPN14:
+ item->setText(COL_LNUM, QString("0"));
+ item->setText(COL_HNUM, QString("0"));
+ item->setText(COL_MIN, QString("0"));
+ item->setText(COL_MAX, QString("16383"));
+ break;
+ case MidiController::Controller7:
+ item->setText(COL_MIN, QString("0"));
+ item->setText(COL_MAX, QString("127"));
+ item->setText(COL_LNUM, QString("0"));
+ item->setText(COL_HNUM, QString("---"));
+ break;
+ case MidiController::RPN:
+ case MidiController::NRPN:
+ item->setText(COL_MIN, QString("0"));
+ item->setText(COL_MAX, QString("127"));
+ item->setText(COL_LNUM, QString("0"));
+ item->setText(COL_HNUM, QString("0"));
+ break;
+
+ case MidiController::Program:
+
+ item->setText(COL_MIN, QString("---"));
+ item->setText(COL_MAX, QString("---"));
+ item->setText(COL_LNUM, QString("---"));
+ item->setText(COL_HNUM, QString("---"));
+ break;
+ case MidiController::Pitch:
+ item->setText(COL_MIN, QString("-8192"));
+ item->setText(COL_MAX, QString("8191"));
+ item->setText(COL_LNUM, QString("---"));
+ item->setText(COL_HNUM, QString("---"));
+ break;
+ default:
+ break;
+ }
+
+ setModified(true);
+
+ controllerChanged(item);
+ }
+
+//---------------------------------------------------------
+// valueHChanged
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::valueHChanged(int val)
+ {
+ Q3ListViewItem* item = viewController->currentItem();
+ if (item == 0)
+ return;
+ QString s;
+ s.setNum(val);
+ item->setText(COL_HNUM, s);
+
+ setModified(true);
+ }
+
+//---------------------------------------------------------
+// valueLChanged
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::valueLChanged(int val)
+ {
+ Q3ListViewItem* item = viewController->currentItem();
+ if (item == 0)
+ return;
+ QString s;
+ s.setNum(val);
+ item->setText(COL_LNUM, s);
+
+ setModified(true);
+ }
+
+//---------------------------------------------------------
+// controllerChanged
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::controllerChanged()
+ {
+ Q3ListViewItem* item = viewController->selectedItem();
+ controllerChanged(item);
+ }
+
+void MidiControllerEditDialog::controllerChanged(Q3ListViewItem* item)
+ {
+ if (item == 0) {
+ entryName->setEnabled(false);
+ comboType->setEnabled(false);
+ spinboxHCtrlNo->setEnabled(false);
+ spinboxLCtrlNo->setEnabled(false);
+ spinboxMin->setEnabled(false);
+ spinboxMax->setEnabled(false);
+ return;
+ }
+
+ entryName->blockSignals(true);
+ comboType->blockSignals(true);
+ spinboxHCtrlNo->blockSignals(true);
+ spinboxLCtrlNo->blockSignals(true);
+ spinboxMin->blockSignals(true);
+ spinboxMax->blockSignals(true);
+
+ entryName->setEnabled(true);
+ entryName->setText(item->text(COL_NAME));
+ comboType->setCurrentItem(int(ctrlType2Int(item->text(COL_TYPE))));
+ switch (ctrlType2Int(item->text(COL_TYPE))) {
+ case MidiController::Controller7:
+ comboType->setEnabled(true);
+ spinboxHCtrlNo->setEnabled(false);
+ spinboxLCtrlNo->setEnabled(true);
+ spinboxMin->setEnabled(true);
+ spinboxMax->setEnabled(true);
+ spinboxHCtrlNo->setValue(0);
+ spinboxLCtrlNo->setValue(item->text(COL_LNUM).toInt());
+ spinboxMin->setRange(0, 127);
+ spinboxMax->setRange(0, 127);
+ spinboxMin->setValue(item->text(COL_MIN).toInt());
+ spinboxMax->setValue(item->text(COL_MAX).toInt());
+ break;
+
+ case MidiController::RPN:
+ case MidiController::NRPN:
+ comboType->setEnabled(true);
+ spinboxHCtrlNo->setEnabled(true);
+ spinboxLCtrlNo->setEnabled(true);
+ spinboxMin->setEnabled(true);
+ spinboxMax->setEnabled(true);
+ spinboxHCtrlNo->setValue(item->text(COL_HNUM).toInt());
+ spinboxLCtrlNo->setValue(item->text(COL_LNUM).toInt());
+ spinboxMin->setRange(0, 127);
+ spinboxMax->setRange(0, 127);
+ spinboxMin->setValue(item->text(COL_MIN).toInt());
+ spinboxMax->setValue(item->text(COL_MAX).toInt());
+ break;
+ case MidiController::Controller14:
+ case MidiController::RPN14:
+ case MidiController::NRPN14:
+ comboType->setEnabled(true);
+ spinboxHCtrlNo->setEnabled(true);
+ spinboxLCtrlNo->setEnabled(true);
+ spinboxMin->setEnabled(true);
+ spinboxMax->setEnabled(true);
+
+ spinboxHCtrlNo->setValue(item->text(COL_HNUM).toInt());
+ spinboxLCtrlNo->setValue(item->text(COL_LNUM).toInt());
+ spinboxMin->setRange(0, 16383);
+ spinboxMax->setRange(0, 16383);
+ spinboxMin->setValue(item->text(COL_MIN).toInt());
+ spinboxMax->setValue(item->text(COL_MAX).toInt());
+ break;
+
+ case MidiController::Pitch:
+ comboType->setEnabled(true);
+ spinboxHCtrlNo->setEnabled(false);
+ spinboxLCtrlNo->setEnabled(false);
+ spinboxMin->setEnabled(true);
+ spinboxMax->setEnabled(true);
+ spinboxHCtrlNo->setValue(0);
+ spinboxLCtrlNo->setValue(0);
+ spinboxMin->setRange(-8192, 8191);
+ spinboxMax->setRange(-8192, 8191);
+ spinboxMin->setValue(item->text(COL_MIN).toInt());
+ spinboxMax->setValue(item->text(COL_MAX).toInt());
+ break;
+
+ case MidiController::Program:
+ comboType->setEnabled(true);
+ spinboxHCtrlNo->setEnabled(false);
+ spinboxLCtrlNo->setEnabled(false);
+ spinboxMin->setEnabled(false);
+ spinboxMax->setEnabled(false);
+ spinboxHCtrlNo->setValue(0);
+ spinboxLCtrlNo->setValue(0);
+ spinboxMin->setRange(0, 0);
+ spinboxMax->setRange(0, 0);
+ spinboxMin->setValue(0);
+ spinboxMax->setValue(0);
+ break;
+ default:
+ break;
+ }
+ entryName->blockSignals(false);
+ comboType->blockSignals(false);
+ spinboxHCtrlNo->blockSignals(false);
+ spinboxLCtrlNo->blockSignals(false);
+ spinboxMin->blockSignals(false);
+ spinboxMax->blockSignals(false);
+ }
+
+//---------------------------------------------------------
+// minChanged
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::minChanged(int val)
+ {
+ Q3ListViewItem* item = viewController->currentItem();
+ if (item == 0)
+ return;
+
+ QString s;
+ s.setNum(val);
+ item->setText(COL_MIN, s);
+
+ if(val > item->text(COL_MAX).toInt())
+ {
+ spinboxMax->blockSignals(true);
+ spinboxMax->setValue(val);
+ item->setText(COL_MAX, s);
+ spinboxMax->blockSignals(false);
+ }
+ setModified(true);
+ }
+
+//---------------------------------------------------------
+// maxChanged
+//---------------------------------------------------------
+
+void MidiControllerEditDialog::maxChanged(int val)
+ {
+ Q3ListViewItem* item = viewController->currentItem();
+ if (item == 0)
+ return;
+
+ QString s;
+ s.setNum(val);
+ item->setText(COL_MAX, s);
+
+ if(val < item->text(COL_MIN).toInt())
+ {
+ spinboxMin->blockSignals(true);
+ spinboxMin->setValue(val);
+ item->setText(COL_MIN, s);
+ spinboxMin->blockSignals(false);
+ }
+ setModified(true);
+ }
+
+//---------------------------------------------------------
+// configMidiController
+//---------------------------------------------------------
+
+void configMidiController()
+ {
+ if (midiControllerEditDialog == 0)
+ {
+ midiControllerEditDialog = new MidiControllerEditDialog();
+ midiControllerEditDialog->show();
+ }
+ else
+ {
+ if(midiControllerEditDialog->isShown())
+ midiControllerEditDialog->hide();
+ else
+ midiControllerEditDialog->show();
+ }
+ }