From e27d6923d92c21f00fc3832e96b2b7952ed9058b Mon Sep 17 00:00:00 2001 From: Werner Schweer Date: Mon, 4 Dec 2006 19:54:05 +0000 Subject: idf editor updates --- muse/muse/ctrl/configmidictrl.cpp | 3 +- muse/muse/instruments/editinstrument.cpp | 136 +++- muse/muse/instruments/editinstrument.h | 3 +- muse/muse/instruments/editinstrument.ui | 1205 +++++++++++++++--------------- muse/muse/instruments/minstrument.cpp | 3 + muse/muse/instruments/minstrument.h | 21 +- muse/muse/midictrl.cpp | 29 +- muse/muse/midictrl.h | 13 +- muse/muse/muse.cpp | 28 + muse/muse/song.cpp | 1 - muse/muse/synth.cpp | 1 + 11 files changed, 801 insertions(+), 642 deletions(-) diff --git a/muse/muse/ctrl/configmidictrl.cpp b/muse/muse/ctrl/configmidictrl.cpp index f5d2247d..6f9187c9 100644 --- a/muse/muse/ctrl/configmidictrl.cpp +++ b/muse/muse/ctrl/configmidictrl.cpp @@ -50,6 +50,7 @@ ConfigMidiCtrl::ConfigMidiCtrl(MidiTrack* t) if (track->type() == Track::MIDI) { MidiTrack* mc = (MidiTrack*)track; portName->setText(track->name()); + instrumentName->setText(mc->instrument()->iname()); // // populate popup with all controllers available for // current instrument @@ -69,6 +70,7 @@ ConfigMidiCtrl::ConfigMidiCtrl(MidiTrack* t) delete cn; buttonAdd->setEnabled(false); buttonRemove->setEnabled(false); + connect(buttonAdd, SIGNAL(clicked()), SLOT(addClicked())); connect(buttonRemove, SIGNAL(clicked()), SLOT(removeClicked())); connect(availableController, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), SLOT(availableSelected(QListWidgetItem*))); @@ -190,7 +192,6 @@ void ConfigMidiCtrl::done(int code) void ConfigMidiCtrl::defineClicked() { - printf("define clicked\n"); DefineMidiCtrl dc(track, this); if (dc.exec()) QDialog::done(0); diff --git a/muse/muse/instruments/editinstrument.cpp b/muse/muse/instruments/editinstrument.cpp index c0a1c736..de4bdc4c 100644 --- a/muse/muse/instruments/editinstrument.cpp +++ b/muse/muse/instruments/editinstrument.cpp @@ -20,6 +20,8 @@ #include "editinstrument.h" #include "minstrument.h" +#include "ctrl.h" +#include "midictrl.h" //--------------------------------------------------------- // EditInstrument @@ -30,14 +32,23 @@ EditInstrument::EditInstrument(QWidget* parent) { setupUi(this); // populate instrument list - for (iMidiInstrument i = midiInstruments.begin(); i != midiInstruments.end(); ++i) - instrumentList->addItem((*i)->iname()); + for (iMidiInstrument i = midiInstruments.begin(); i != midiInstruments.end(); ++i) { + QListWidgetItem* item = new QListWidgetItem((*i)->iname()); + QVariant v = qVariantFromValue((void*)(*i)); + item->setData(Qt::UserRole, v); + instrumentList->addItem(item); + } instrumentList->setItemSelected(instrumentList->item(0), true); connect(instrumentList, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), SLOT(instrumentChanged(QListWidgetItem*))); connect(patchView, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)), SLOT(patchChanged(QTreeWidgetItem*))); instrumentChanged(instrumentList->item(0)); + connect(listController, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), + SLOT(controllerChanged(QListWidgetItem*))); + connect(instrumentName, SIGNAL(textChanged(const QString&)), SLOT(instrumentNameChanged(const QString&))); + connect(fileSaveAsAction, SIGNAL(triggered()), SLOT(fileSaveAs())); + connect(fileSaveAction, SIGNAL(triggered()), SLOT(fileSave())); } //--------------------------------------------------------- @@ -46,60 +57,111 @@ EditInstrument::EditInstrument(QWidget* parent) void EditInstrument::instrumentChanged(QListWidgetItem* sel) { - if (sel == 0) - return; - QString iname = sel->text(); - iMidiInstrument i = midiInstruments.begin(); - for (; i != midiInstruments.end(); ++i) { - if ((*i)->iname() == iname) - break; - } patchView->clear(); - if (i == midiInstruments.end()) + listController->clear(); + + if (sel == 0) return; // populate patch list - std::vector* pg = (*i)->groups(); + + MidiInstrument* instrument = (MidiInstrument*)sel->data(Qt::UserRole).value(); + instrumentName->setText(instrument->iname()); + std::vector* pg = instrument->groups(); for (std::vector::iterator g = pg->begin(); g != pg->end(); ++g) { QTreeWidgetItem* item = new QTreeWidgetItem; item->setText(0, g->name); + QVariant v = QVariant::fromValue((void*)0); + item->setData(0, Qt::UserRole, v); patchView->addTopLevelItem(item); for (iPatch p = g->patches.begin(); p != g->patches.end(); ++p) { + Patch* patch = *p; QTreeWidgetItem* sitem = new QTreeWidgetItem; - sitem->setText(0, (*p)->name); + sitem->setText(0, patch->name); + QVariant v = QVariant::fromValue((void*)(patch)); + sitem->setData(0, Qt::UserRole, v); item->addChild(sitem); } } + MidiControllerList* cl = instrument->controller(); + for (iMidiController ic = cl->begin(); ic != cl->end(); ++ic) { + MidiController* c = *ic; + QListWidgetItem* item = new QListWidgetItem(c->name()); + QVariant v = qVariantFromValue((void*)(c)); + item->setData(Qt::UserRole, v); + listController->addItem(item); + } + listController->setItemSelected(listController->item(0), true); + controllerChanged(listController->item(0)); } //--------------------------------------------------------- -// patchChanged +// controllerChanged //--------------------------------------------------------- -void EditInstrument::patchChanged(QTreeWidgetItem* sel) +void EditInstrument::controllerChanged(QListWidgetItem* sel) { - if (sel == 0) { - textLabelPatchName->setText(""); + if (sel == 0 || sel->data(Qt::UserRole).value() == 0) { + // patchNameEdit->setText(""); return; } - textLabelPatchName->setText(sel->text(0)); + MidiController* c = (MidiController*)sel->data(Qt::UserRole).value(); + entryName->setText(c->name()); + MidiController::ControllerType type = c->type(); + switch(type) { + case MidiController::Controller7: + spinBoxHCtrlNo->setEnabled(false); + break; + case MidiController::Controller14: + case MidiController::RPN: + case MidiController::NRPN: + case MidiController::RPN14: + case MidiController::NRPN14: + spinBoxHCtrlNo->setEnabled(true); + break; + case MidiController::Pitch: + case MidiController::Program: + case MidiController::Velo: + break; + } + + int ctrlH = (c->num() >> 8) & 0x7f; + int ctrlL = c->num() & 0x7f; + spinBoxType->setCurrentIndex(int(type)); + spinBoxHCtrlNo->setValue(ctrlH); + spinBoxLCtrlNo->setValue(ctrlL); + spinBoxMin->setValue(c->minVal()); + spinBoxMax->setValue(c->maxVal()); + spinBoxDefault->setValue(c->initVal()); } //--------------------------------------------------------- -// fileNew +// patchChanged //--------------------------------------------------------- -void EditInstrument::fileNew() +void EditInstrument::patchChanged(QTreeWidgetItem* sel) { - + if (sel == 0 || sel->data(0, Qt::UserRole).value() == 0) { + patchNameEdit->setText(""); + return; + } + Patch* p = (Patch*)sel->data(0, Qt::UserRole).value(); + patchNameEdit->setText(p->name); + spinBoxHBank->setValue(p->hbank); + spinBoxLBank->setValue(p->lbank); + spinBoxProgram->setValue(p->prog); + checkBoxDrum->setChecked(p->drumMap); + checkBoxGM->setChecked(p->typ & 1); + checkBoxGS->setChecked(p->typ & 2); + checkBoxXG->setChecked(p->typ & 4); } //--------------------------------------------------------- -// fileOpen +// fileNew //--------------------------------------------------------- -void EditInstrument::fileOpen() +void EditInstrument::fileNew() { - printf("fileOpen\n"); + } //--------------------------------------------------------- @@ -117,7 +179,16 @@ void EditInstrument::fileSave() void EditInstrument::fileSaveAs() { - + QListWidgetItem* item = instrumentList->currentItem(); + if (item == 0) + return; + MidiInstrument* instrument = (MidiInstrument*)item->data(Qt::UserRole).value(); + QString path = QDir::homePath() + "/MusE/instruments"; + path += QString("/%1.idf").arg(instrument->iname()); + QString s = QFileDialog::getSaveFileName(this, + tr("MusE: Save Instrument Definition"), + path, + tr("Instrument Definition (*.idf)")); } //--------------------------------------------------------- @@ -126,6 +197,21 @@ void EditInstrument::fileSaveAs() void EditInstrument::fileExit() { + } + +//--------------------------------------------------------- +// instrumentNameChanged +//--------------------------------------------------------- +void EditInstrument::instrumentNameChanged(const QString& s) + { + QListWidgetItem* item = instrumentList->currentItem(); + if (item == 0) + return; + if (s != item->text()) { + item->setText(s); + MidiInstrument* instrument = (MidiInstrument*)item->data(Qt::UserRole).value(); + instrument->setDirty(true); + } } diff --git a/muse/muse/instruments/editinstrument.h b/muse/muse/instruments/editinstrument.h index 54f6f5e5..2714814a 100644 --- a/muse/muse/instruments/editinstrument.h +++ b/muse/muse/instruments/editinstrument.h @@ -32,12 +32,13 @@ class EditInstrument : public QMainWindow, public Ui::EditInstrumentBase { private slots: virtual void fileNew(); - virtual void fileOpen(); virtual void fileSave(); virtual void fileSaveAs(); virtual void fileExit(); void instrumentChanged(QListWidgetItem*); void patchChanged(QTreeWidgetItem*); + void controllerChanged(QListWidgetItem* sel); + void instrumentNameChanged(const QString&); public: EditInstrument(QWidget* parent = 0); diff --git a/muse/muse/instruments/editinstrument.ui b/muse/muse/instruments/editinstrument.ui index 648981dc..c8f1916b 100644 --- a/muse/muse/instruments/editinstrument.ui +++ b/muse/muse/instruments/editinstrument.ui @@ -1,662 +1,681 @@ - - - EditInstrumentBase 0 0 - 750 - 644 + 819 + 505 MusE: Instrument Editor - - - Qt::Horizontal + + + 9 - - - - - Patches - - - - 9 - - - 6 - - - - - Qt::Horizontal - - - - - 7 - 7 - 0 - 0 - - - - true - - - - Patch/Group - - - - - - - 0 - - - 6 - - - - - - - - Patch Name: - - - - - - - Program: - - - - - - - 5 - - - 6 - - - - - - 5 - 0 - 0 - 0 - - - - &Delete - - - Alt+D - - - - - - - - 5 - 1 - 0 - 0 - - - - &New Patch - - - Alt+N - - - - - - - New Group - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 240 - 20 - - - - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 280 - 20 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 280 - 20 - - - - - - - - Qt::Horizontal - - - QSizePolicy::Expanding - - - - 280 - 20 - - - - - - - - d.c. - - - 127 - - - -1 - - - -1 - - - - - - - High Bank: - - - - - - - Low Bank: - - - - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 20 - 90 - - - - - - - - d.c. - - - 127 - - - -1 - - - -1 - - - - - - - - - - 6 - - - 6 - - - - - Drum - - - - - - - GM - - - - - - - GS - - - - - - - XG - - - - - - - - - - - - - - Controller - - - - 0 - - - 6 - - - - - - 5 - 0 - 0 - 0 - - - - Predefined Controller: - - - - - - - This is a list of commonly used midi controllers. -Note that in MusE pitch and program changes are -handled like normal controllers. - - - - - - - - 1 - 5 - 0 - 0 - - - - Properties - - + + 6 + + + + + Qt::Horizontal + + + + + + 0 + + + 6 + + + - 10 + 0 6 - - + + - Name + Instrument Name: - - - - Type - - + + - - + + + + + + 1 + + + + Patches + + - 2 + 9 6 - - - - Control7 - - - - - Control14 - - - - - RPN - - - - - NRPN - - - - - Pitch + + + Qt::Horizontal + + + + + 7 + 7 + 0 + 0 + - - - - Program + + true - + + + Patch/Group + + + + + + + 0 + + + 6 + + + + + + + + Patch Name: + + + + + + + Program: + + + + + + + 5 + + + 6 + + + + + + 5 + 0 + 0 + 0 + + + + &Delete + + + Alt+D + + + + + + + + 5 + 1 + 0 + 0 + + + + &New Patch + + + Alt+N + + + + + + + New Group + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 240 + 20 + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 280 + 20 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 280 + 20 + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 280 + 20 + + + + + + + + d.c. + + + 127 + + + -1 + + + -1 + + + + + + + High Bank: + + + + + + + Low Bank: + + + + + + + Qt::Vertical + + + QSizePolicy::Expanding + + + + 20 + 90 + + + + + + + + d.c. + + + 127 + + + -1 + + + -1 + + + + + + + + + + 6 + + + 6 + + + + + Drum + + + + + + + GM + + + + + + + GS + + + + + + + XG + + + + + + + - - - - H-Ctrl + + + + + Controller + + + + 9 + + + 6 + + + + + + 5 + 0 + 0 + 0 + - - 10 + + Controller List: - - - - Midi Controller Number High Byte + + + + Qt::Vertical - - 127 + + + 20 + 111 + - - 0 - - - 1 - - + - - - - L-Ctrl - - - 10 + + + + This is a list of commonly used midi controllers. +Note that in MusE pitch and program changes are +handled like normal controllers. - - - - Midi Controller Number Low Byte - - - 127 - - - 0 + + + + + 1 + 5 + 0 + 0 + - - 1 + + Properties + + + 10 + + + 6 + + + + + Name + + + + + + + Type + + + + + + + 2 + + + 6 + + + + + + Controller-7Bit + + + + + Controller-14Bit + + + + + RPN-7Bit + + + + + NRPN-7Bit + + + + + RPN-14Bit + + + + + NRPN-14Bit + + + + + Pitch + + + + + Program + + + + + + + + H-Ctrl + + + 10 + + + + + + + Midi Controller Number High Byte + + + 127 + + + 0 + + + 1 + + + + + + + L-Ctrl + + + 10 + + + + + + + Midi Controller Number Low Byte + + + 127 + + + 0 + + + 1 + + + + + + + + + + + + Range + + + + + + + 0 + + + 6 + + + + + Min + + + 10 + + + + + + + 16384 + + + -16385 + + + + + + + Max + + + 10 + + + + + + + 16384 + + + -16385 + + + 127 + + + + + + + Default + + + + + + + + + - - - - - - - - Range - - - - - + + + + SysEx + + 0 6 - - - - Min + + + + Qt::Vertical - - 10 + + QSizePolicy::Expanding - - - - - - 16384 - - - -16385 + + + 20 + 130 + - + - - - - Max - - - 10 + + + + + 1 + 7 + 0 + 0 + - - - - 16384 - - - -16385 - - - 127 - - + + - - + + - Default + Hex Entry: - - - - - - - - - - - list of defined controllers - - - This is the MusE list of defined controllers. - - - QFrame::StyledPanel - - - QFrame::Sunken - - - - Name - - - - - Type - - - - - H-Ctrl - - - - - L-Ctrl - - - - - Min Val - - - - - Max Val - - - - - - - - - SysEx - - - - 0 - - - 6 - - - - - Qt::Vertical - - - QSizePolicy::Expanding - - - - 20 - 130 - - - - - - - - - 1 - 7 - 0 - 0 - - - - - - - - - - - Hex Entry: - - - - + + + + + - - + + 0 0 - 750 - 35 + 819 + 32 @@ -665,17 +684,16 @@ handled like normal controllers. - 0 - 0 - 155 - 213 + 434 + 167 + 146 + 166 &File - @@ -726,6 +744,9 @@ handled like normal controllers. + + :/xpm/fileopen.png + Save &As... @@ -749,8 +770,8 @@ handled like normal controllers. - - - + + + diff --git a/muse/muse/instruments/minstrument.cpp b/muse/muse/instruments/minstrument.cpp index c6281552..dfd4a8be 100644 --- a/muse/muse/instruments/minstrument.cpp +++ b/muse/muse/instruments/minstrument.cpp @@ -80,6 +80,7 @@ static void loadIDF(QFileInfo* fi) if (e.tagName() == "MidiInstrument") { MidiInstrument* i = new MidiInstrument(); i->read(n); + i->setFilePath(fi->filePath()); midiInstruments.push_back(i); } } @@ -173,6 +174,8 @@ void MidiInstrument::init() // MidiController* prog = new MidiController("Program", CTRL_PROGRAM, 0, 0x7fffff, 0); _controller->push_back(prog); + _dirty = false; + _readonly = false; } MidiInstrument::MidiInstrument() diff --git a/muse/muse/instruments/minstrument.h b/muse/muse/instruments/minstrument.h index 64f86393..f8e7f99b 100644 --- a/muse/muse/instruments/minstrument.h +++ b/muse/muse/instruments/minstrument.h @@ -73,6 +73,8 @@ class MidiInstrument { std::vector pg; MidiControllerList* _controller; std::vector sysex; + bool _dirty; + bool _readonly; void init(); @@ -82,17 +84,24 @@ class MidiInstrument { EventList* _midiState; char* _initScript; QString _name; + QString _filePath; public: MidiInstrument(); virtual ~MidiInstrument(); MidiInstrument(const QString& txt); - const QString& iname() const { return _name; } - void setIName(const QString& txt) { _name = txt; } - - EventList* midiInit() const { return _midiInit; } - EventList* midiReset() const { return _midiReset; } - EventList* midiState() const { return _midiState; } + const QString& iname() const { return _name; } + void setIName(const QString& txt) { _name = txt; } + QString filePath() const { return _filePath; } + void setFilePath(const QString& s) { _filePath = s; } + bool dirty() const { return _dirty; } + void setDirty(bool v) { _dirty = v; } + bool readonly() const { return _readonly; } + void setReadonly(bool v) { _readonly = v; } + + EventList* midiInit() const { return _midiInit; } + EventList* midiReset() const { return _midiReset; } + EventList* midiState() const { return _midiState; } const char* initScript() const { return _initScript; } MidiControllerList* controller() const { return _controller; } diff --git a/muse/muse/midictrl.cpp b/muse/muse/midictrl.cpp index fc6fd665..fff81bf5 100644 --- a/muse/muse/midictrl.cpp +++ b/muse/muse/midictrl.cpp @@ -206,23 +206,23 @@ MidiController::MidiController(const QString& s, int n, int min, int max, int in MidiController::ControllerType midiControllerType(int num) { - if (num < 0x10000) - return MidiController::Controller7; - if (num < 0x20000) - return MidiController::Controller14; - if (num < 0x30000) - return MidiController::RPN; - if (num < 0x40000) - return MidiController::NRPN; if (num == CTRL_PITCH) return MidiController::Pitch; if (num == CTRL_PROGRAM) return MidiController::Program; if (num == CTRL_VELOCITY || num == CTRL_SVELOCITY) return MidiController::Velo; - if (num < 0x60000) + if (num < CTRL_14_OFFSET) + return MidiController::Controller7; + if (num < CTRL_RPN_OFFSET) + return MidiController::Controller14; + if (num < CTRL_NRPN_OFFSET) + return MidiController::RPN; + if (num < CTRL_RPN14_OFFSET) + return MidiController::NRPN; + if (num < CTRL_NRPN14_OFFSET) return MidiController::RPN14; - if (num < 0x70000) + if (num < CTRL_NONE_OFFSET) return MidiController::NRPN14; return MidiController::Controller7; } @@ -321,3 +321,12 @@ void MidiController::read(QDomNode node) return; } +//--------------------------------------------------------- +// type +//--------------------------------------------------------- + +MidiController::ControllerType MidiController::type() const + { + return midiControllerType(num()); + } + diff --git a/muse/muse/midictrl.h b/muse/muse/midictrl.h index f728d58f..895695e0 100644 --- a/muse/muse/midictrl.h +++ b/muse/muse/midictrl.h @@ -125,12 +125,13 @@ class MidiController { void setNum(int v) { _num = v; } void write(Xml& xml) const; void read(QDomNode); - int minVal() const { return _minVal; } - int maxVal() const { return _maxVal; } + int minVal() const { return _minVal; } + int maxVal() const { return _maxVal; } int initVal() const { return _initVal; } - void setInitVal(int val) { _initVal = val; } - void setMinVal(int val) { _minVal = val; } - void setMaxVal(int val) { _maxVal = val; } + void setInitVal(int val) { _initVal = val; } + void setMinVal(int val) { _minVal = val; } + void setMaxVal(int val) { _maxVal = val; } + ControllerType type() const; }; //--------------------------------------------------------- @@ -151,8 +152,8 @@ typedef MidiControllerList MidiControllerList; extern MidiControllerList defaultMidiController; extern void initMidiController(); -extern MidiController::ControllerType midiControllerType(int num); +extern MidiController::ControllerType midiControllerType(int num); extern void configMidiController(); extern const QString& int2ctrlType(int n); extern MidiController::ControllerType ctrlType2Int(const QString& s); diff --git a/muse/muse/muse.cpp b/muse/muse/muse.cpp index cbc802e9..4471ce5b 100644 --- a/muse/muse/muse.cpp +++ b/muse/muse/muse.cpp @@ -2974,6 +2974,34 @@ int main(int argc, char* argv[]) } } + // check for instruments directory: + + pd.setPath(QDir::homePath() + "/MusE/instruments"); + if (!pd.exists()) { + // ask user to create a new instruments directory + QString title(QT_TR_NOOP("MusE: create instruments directory")); + + QString s; + s = "The MusE instruments directory\n%1\ndoes not exists"; + s = s.arg(pd.path()); + + int rv = QMessageBox::question(0, + title, + s, + "Create", + "Abort", + QString(), + 0, 1); + if (rv == 0) { + if (!pd.mkpath(pd.path())) { + // TODO: tell user why this has happened + QMessageBox::critical(0, + title, + "Creating instruments directory failed"); + } + } + } + QString path; // project path relativ to config.projectPath if (argc >= 2) path = argv[optind]; // start with first name on command line diff --git a/muse/muse/song.cpp b/muse/muse/song.cpp index 1ad7fde7..17d03fe3 100644 --- a/muse/muse/song.cpp +++ b/muse/muse/song.cpp @@ -1527,4 +1527,3 @@ void Song::routeChanged(QAction* a) audio->msgRoute(a->isChecked(), a->data().value()); } - diff --git a/muse/muse/synth.cpp b/muse/muse/synth.cpp index fae15e2f..7c6de9f1 100644 --- a/muse/muse/synth.cpp +++ b/muse/muse/synth.cpp @@ -187,6 +187,7 @@ SynthI::SynthI() _sif = 0; // setVolume(1.0); // setPan(0.0); + setReadonly(true); // midi instrument cannot be edited } //--------------------------------------------------------- -- cgit v1.2.3