summaryrefslogtreecommitdiff
path: root/muse2/muse/midiedit
diff options
context:
space:
mode:
authorTim E. Real <termtech@rogers.com>2012-11-03 12:05:56 +0000
committerTim E. Real <termtech@rogers.com>2012-11-03 12:05:56 +0000
commit31f618e5461553bd7836677f944acfa233e5ae3c (patch)
tree9ce5c671ed1a089bb2cd19692db5a9c45951b237 /muse2/muse/midiedit
parentb45ce65ca39817a0678f2172410b71433f79f736 (diff)
Improved: Instrument Editor, fFixed MANY bugs. Should be SOLID now.
Improved: Midi controller graph 'Ctrl' popup menus. Improved: Aftertouch and PolyAftertouch (channel/key pressure) are true MusE controllers now. TODO: Still W.I.P. See ChangeLog
Diffstat (limited to 'muse2/muse/midiedit')
-rw-r--r--muse2/muse/midiedit/drumedit.cpp133
-rw-r--r--muse2/muse/midiedit/pianoroll.cpp133
2 files changed, 20 insertions, 246 deletions
diff --git a/muse2/muse/midiedit/drumedit.cpp b/muse2/muse/midiedit/drumedit.cpp
index 03f246cf..5126180f 100644
--- a/muse2/muse/midiedit/drumedit.cpp
+++ b/muse2/muse/midiedit/drumedit.cpp
@@ -64,6 +64,7 @@
#include "popupmenu.h"
#include "menutitleitem.h"
#include "widgets/function_dialogs/quantize.h"
+#include "editinstrument.h"
namespace MusEGui {
@@ -1253,141 +1254,27 @@ void DrumEdit::ctrlPopupTriggered(QAction* act)
MusECore::MidiTrack* track = (MusECore::MidiTrack*)(part->track());
int channel = track->outChannel();
MusECore::MidiPort* port = &MusEGlobal::midiPorts[track->outPort()];
- int curDrumPitch = curDrumInstrument();
- bool isDrum = track->type() == MusECore::Track::DRUM;
- bool isNewDrum = track->type() == MusECore::Track::NEW_DRUM;
- MusECore::MidiInstrument* instr = port->instrument();
- MusECore::MidiControllerList* mcl = instr->controller();
-
MusECore::MidiCtrlValListList* cll = port->controller();
const int min = channel << 24;
const int max = min + 0x1000000;
-
- const int add_ins_def = max + 1;
- const int add_other = max + 2;
const int edit_ins = max + 3;
-
const int velo = max + 0x101;
-
int rv = act->data().toInt();
if (rv == velo) { // special case velocity
newCtlNum = MusECore::CTRL_VELOCITY;
}
- else if (rv == add_ins_def) { // add new instrument controller
-
- PopupMenu * ctrlSubPop = new PopupMenu(this, true); // true = enable stay open
- ctrlSubPop->addAction(new MenuTitleItem(tr("Instrument-defined"), ctrlSubPop));
-
- //
- // populate popup with all controllers available for
- // current instrument
- //
-
- for (MusECore::iMidiController ci = mcl->begin(); ci != mcl->end(); ++ci)
- {
- int num = ci->second->num();
- if((num & 0xff) == 0xff)
- {
- if (isDrum && curDrumPitch!=-1)
- num = (num & ~0xff) + MusEGlobal::drumMap[curDrumPitch].anote;
- else if (isNewDrum && curDrumPitch!=-1)
- num = (num & ~0xff) + curDrumPitch; //FINDMICH does this work?
- else // dont show drum specific controller if not a drum track
- continue;
- }
-
- if(cll->find(channel, num) == cll->end())
- ctrlSubPop->addAction(MusECore::midiCtrlNumString(num, true) + ci->second->name())->setData(num);
- }
-
- // Don't allow editing instrument if it's a synth
- if(!port->device() || port->device()->deviceType() != MusECore::MidiDevice::SYNTH_MIDI)
- ctrlSubPop->addAction(QIcon(*midi_edit_instrumentIcon), tr("Edit instrument ..."))->setData(edit_ins);
-
- QAction *act2 = ctrlSubPop->exec(ctrl->mapToGlobal(QPoint(0,0)));
- if (act2)
- {
- int rv2 = act2->data().toInt();
-
- if (rv2 == edit_ins) // edit instrument
- MusEGlobal::muse->startEditInstrument();
- else // select new instrument control
- {
- MusECore::MidiController* c;
- for (MusECore::iMidiController ci = mcl->begin(); ci != mcl->end(); ++ci)
- {
- c = ci->second;
- int num = c->num();
- if (isDrum && ((num & 0xff) == 0xff) && curDrumPitch!=-1)
- num = (num & ~0xff) + MusEGlobal::drumMap[curDrumPitch].anote;
- else if (isNewDrum && ((num & 0xff) == 0xff) && curDrumPitch!=-1)
- num = (num & ~0xff) + curDrumPitch; //FINDMICHJETZT does this work?
-
- if(num != rv2)
- continue;
-
- if(cll->find(channel, num) == cll->end())
- {
- MusECore::MidiCtrlValList* vl = new MusECore::MidiCtrlValList(num);
-
- cll->add(channel, vl);
- newCtlNum = c->num();
- }
- else
- newCtlNum = c->num();
- break;
- }
- }
- }
- delete ctrlSubPop;
- }
-
- //else if (rv == edit_ins) // edit instrument
- // MusEGlobal::muse->startEditInstrument();
-
- else if (rv == add_other) { // add new other controller
- PopupMenu* ctrlSubPop = new PopupMenu(this, true); // true = enable stay open
- ctrlSubPop->addAction(new MenuTitleItem(tr("Common Controls"), ctrlSubPop));
-
- for(int num = 0; num < 127; ++num)
- if(cll->find(channel, num) == cll->end())
- ctrlSubPop->addAction(MusECore::midiCtrlName(num, true))->setData(num);
- QAction *act2 = ctrlSubPop->exec(ctrl->mapToGlobal(QPoint(0,0)));
- if (act2) {
- int rv2 = act2->data().toInt();
- int num = rv2;
- if (isDrum && ((num & 0xff) == 0xff) && curDrumPitch!=-1)
- num = (num & ~0xff) + MusEGlobal::drumMap[curDrumPitch].anote;
- if (isNewDrum && ((num & 0xff) == 0xff) && curDrumPitch!=-1)
- num = (num & ~0xff) + curDrumPitch; //FINDMICHJETZT does this work?
-
- if(cll->find(channel, num) == cll->end())
- {
- MusECore::MidiCtrlValList* vl = new MusECore::MidiCtrlValList(num);
-
- cll->add(channel, vl);
- newCtlNum = rv2;
- }
- else
- newCtlNum = rv2;
- }
- delete ctrlSubPop;
+ else if (rv == edit_ins) { // edit instrument
+ MusECore::MidiInstrument* instr = port->instrument();
+ MusEGlobal::muse->startEditInstrument(instr ? instr->iname() : QString(), EditInstrument::Controllers);
}
else { // Select a control
- MusECore::iMidiCtrlValList i = cll->begin();
- for (; i != cll->end(); ++i) {
- MusECore::MidiCtrlValList* cl = i->second;
- MusECore::MidiController* c = port->midiController(cl->num());
- if (c->num() == rv) {
- newCtlNum = c->num();
- break;
- }
- }
- if (i == cll->end()) {
- printf("DrumEdit: controller number %d not found!", rv);
- }
- }
+ if(cll->find(channel, rv) == cll->end())
+ cll->add(channel, new MusECore::MidiCtrlValList(rv));
+ newCtlNum = rv;
+ if(port->drumController(rv))
+ newCtlNum |= 0xff;
+ }
if(newCtlNum != -1)
{
diff --git a/muse2/muse/midiedit/pianoroll.cpp b/muse2/muse/midiedit/pianoroll.cpp
index 97c5ecc3..e4064bd9 100644
--- a/muse2/muse/midiedit/pianoroll.cpp
+++ b/muse2/muse/midiedit/pianoroll.cpp
@@ -64,6 +64,7 @@
#include "helper.h"
#include "popupmenu.h"
#include "menutitleitem.h"
+#include "editinstrument.h"
#include "cmd.h"
@@ -813,141 +814,27 @@ void PianoRoll::ctrlPopupTriggered(QAction* act)
MusECore::MidiTrack* track = (MusECore::MidiTrack*)(part->track());
int channel = track->outChannel();
MusECore::MidiPort* port = &MusEGlobal::midiPorts[track->outPort()];
- int curPitch = curDrumInstrument();
- MusECore::MidiInstrument* instr = port->instrument();
- MusECore::MidiControllerList* mcl = instr->controller();
-
MusECore::MidiCtrlValListList* cll = port->controller();
const int min = channel << 24;
const int max = min + 0x1000000;
-
- const int add_ins_def = max + 1;
- const int add_other = max + 2;
const int edit_ins = max + 3;
-
const int velo = max + 0x101;
-
int rv = act->data().toInt();
if (rv == velo) { // special case velocity
newCtlNum = MusECore::CTRL_VELOCITY;
}
- else if (rv == add_ins_def) { // add new instrument controller
-
- PopupMenu * ctrlSubPop = new PopupMenu(this, true); // true = enable stay open
- ctrlSubPop->addAction(new MenuTitleItem(tr("Instrument-defined"), ctrlSubPop));
-
- //
- // populate popup with all controllers available for
- // current instrument
- //
-
- for (MusECore::iMidiController ci = mcl->begin(); ci != mcl->end(); ++ci)
- {
- int num = ci->second->num();
- if((num & 0xff) == 0xff)
- {
- //if (curPitch!=-1)
- // num = (num & ~0xff) + MusEGlobal::drumMap[curPitch].anote;
- //else
- if(curPitch!=-1)
- num = (num & ~0xff) + curPitch; //FINDMICH does this work?
- else // dont show drum specific controller if not a drum track
- continue;
- }
-
- if(cll->find(channel, num) == cll->end())
- ctrlSubPop->addAction(MusECore::midiCtrlNumString(num, true) + ci->second->name())->setData(num);
- }
-
- // Don't allow editing instrument if it's a synth
- if(!port->device() || port->device()->deviceType() != MusECore::MidiDevice::SYNTH_MIDI)
- ctrlSubPop->addAction(QIcon(*midi_edit_instrumentIcon), tr("Edit instrument ..."))->setData(edit_ins);
-
- QAction *act2 = ctrlSubPop->exec(ctrl->mapToGlobal(QPoint(0,0)));
- if (act2)
- {
- int rv2 = act2->data().toInt();
-
- if (rv2 == edit_ins) // edit instrument
- MusEGlobal::muse->startEditInstrument();
- else // select new instrument control
- {
- MusECore::MidiController* c;
- for (MusECore::iMidiController ci = mcl->begin(); ci != mcl->end(); ++ci)
- {
- c = ci->second;
- int num = c->num();
- //if (((num & 0xff) == 0xff) && curPitch!=-1)
- // num = (num & ~0xff) + MusEGlobal::drumMap[curPitch].anote;
- //else
- if (((num & 0xff) == 0xff) && curPitch!=-1)
- num = (num & ~0xff) + curPitch; //FINDMICHJETZT does this work?
-
- if(num != rv2)
- continue;
-
- if(cll->find(channel, num) == cll->end())
- {
- MusECore::MidiCtrlValList* vl = new MusECore::MidiCtrlValList(num);
-
- cll->add(channel, vl);
- newCtlNum = c->num();
- }
- else
- newCtlNum = c->num();
- break;
- }
- }
- }
- delete ctrlSubPop;
- }
-
- //else if (rv == edit_ins) // edit instrument
- // MusEGlobal::muse->startEditInstrument();
-
- else if (rv == add_other) { // add new other controller
- PopupMenu* ctrlSubPop = new PopupMenu(this, true); // true = enable stay open
- ctrlSubPop->addAction(new MenuTitleItem(tr("Common Controls"), ctrlSubPop));
-
- for(int num = 0; num < 127; ++num)
- if(cll->find(channel, num) == cll->end())
- ctrlSubPop->addAction(MusECore::midiCtrlName(num, true))->setData(num);
- QAction *act2 = ctrlSubPop->exec(ctrl->mapToGlobal(QPoint(0,0)));
- if (act2) {
- int rv2 = act2->data().toInt();
- int num = rv2;
- //if (((num & 0xff) == 0xff) && curPitch!=-1)
- // num = (num & ~0xff) + MusEGlobal::drumMap[curPitch].anote;
- if (((num & 0xff) == 0xff) && curPitch!=-1)
- num = (num & ~0xff) + curPitch; //FINDMICHJETZT does this work?
-
- if(cll->find(channel, num) == cll->end())
- {
- MusECore::MidiCtrlValList* vl = new MusECore::MidiCtrlValList(num);
-
- cll->add(channel, vl);
- newCtlNum = rv2;
- }
- else
- newCtlNum = rv2;
- }
- delete ctrlSubPop;
+ else if (rv == edit_ins) { // edit instrument
+ MusECore::MidiInstrument* instr = port->instrument();
+ MusEGlobal::muse->startEditInstrument(instr ? instr->iname() : QString(), EditInstrument::Controllers);
}
else { // Select a control
- MusECore::iMidiCtrlValList i = cll->begin();
- for (; i != cll->end(); ++i) {
- MusECore::MidiCtrlValList* cl = i->second;
- MusECore::MidiController* c = port->midiController(cl->num());
- if (c->num() == rv) {
- newCtlNum = c->num();
- break;
- }
- }
- if (i == cll->end()) {
- printf("PianoRoll: controller number %d not found!", rv);
- }
- }
+ if(cll->find(channel, rv) == cll->end())
+ cll->add(channel, new MusECore::MidiCtrlValList(rv));
+ newCtlNum = rv;
+ if(port->drumController(rv))
+ newCtlNum |= 0xff;
+ }
if(newCtlNum != -1)
{