summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Jung <flo@windfisch.org>2011-10-16 19:22:35 +0000
committerFlorian Jung <flo@windfisch.org>2011-10-16 19:22:35 +0000
commitf6fd0c7b4979612ed34a222c02d43e81ebaddf7e (patch)
treeacd6ca648f8c15371f50935c4627c29fecc88aef
parent5c191a7c5b525cfc833ed4d3be171101058e9779 (diff)
ctrlcanvas stuff. not ready yet
BUGGY! problem is: while changing entries, ourDrumMap may be reallocated which causes abort()s and/or bugs.
-rw-r--r--muse2/muse/ctrl/ctrlcanvas.cpp71
-rw-r--r--muse2/muse/ctrl/ctrlcanvas.h6
-rw-r--r--muse2/muse/ctrl/ctrledit.cpp6
-rw-r--r--muse2/muse/ctrl/ctrlpanel.cpp132
-rw-r--r--muse2/muse/ctrl/ctrlpanel.h4
-rw-r--r--muse2/muse/midiedit/dcanvas.cpp43
-rw-r--r--muse2/muse/midiedit/dlist.cpp24
-rw-r--r--muse2/muse/midiedit/drumedit.h3
-rw-r--r--muse2/muse/midiedit/scoreedit.cpp1
9 files changed, 202 insertions, 88 deletions
diff --git a/muse2/muse/ctrl/ctrlcanvas.cpp b/muse2/muse/ctrl/ctrlcanvas.cpp
index 9c5d636f..6e09e337 100644
--- a/muse2/muse/ctrl/ctrlcanvas.cpp
+++ b/muse2/muse/ctrl/ctrlcanvas.cpp
@@ -39,6 +39,7 @@
#include "gconfig.h"
#include "ctrlpanel.h"
#include "midiedit/drummap.h"
+#include "drumedit.h"
static MusECore::MidiCtrlValList veloList(MusECore::CTRL_VELOCITY); // dummy
@@ -211,6 +212,11 @@ CtrlCanvas::CtrlCanvas(MidiEditor* e, QWidget* parent, int xmag,
noEvents=false;
//_isFirstMove = true;
//_lastDelta = QPoint(0, 0);
+
+ if (dynamic_cast<DrumEdit*>(editor) && dynamic_cast<DrumEdit*>(editor)->old_style_drummap_mode()==false)
+ filterTrack=true;
+ else
+ filterTrack=false;
ctrl = &veloList;
_controller = &MusECore::veloCtrl;
@@ -231,10 +237,10 @@ CtrlCanvas::CtrlCanvas(MidiEditor* e, QWidget* parent, int xmag,
connect(MusEGlobal::song, SIGNAL(songChanged(int)), SLOT(songChanged(int)));
connect(MusEGlobal::muse, SIGNAL(configChanged()), SLOT(configChanged()));
- curDrumInstrument = editor->curDrumInstrument();
- //printf("CtrlCanvas::CtrlCanvas curDrumInstrument:%d\n", curDrumInstrument);
+ setCurDrumPitch(editor->curDrumInstrument());
+ //printf("CtrlCanvas::CtrlCanvas curDrumPitch:%d\n", curDrumPitch);
- connect(editor, SIGNAL(curDrumInstrumentChanged(int)), SLOT(setCurDrumInstrument(int)));
+ connect(editor, SIGNAL(curDrumInstrumentChanged(int)), SLOT(setCurDrumPitch(int)));
updateItems();
}
@@ -537,15 +543,21 @@ void CtrlCanvas::partControllers(const MusECore::MidiPart* part, int num, int* d
int di;
int n;
- if((mt->type() != MusECore::Track::DRUM) && curDrumInstrument != -1) //FINDMICHJETZT was ist das?
+ if(!mt->isDrumTrack() && curDrumPitch != -1)
printf("keyfilter != -1 in non drum track?\n");
- if((mt->type() == MusECore::Track::DRUM) && (curDrumInstrument != -1) && ((num & 0xff) == 0xff)) //FINDMICHJETZT was ist das?
+ if((mt->type() == MusECore::Track::DRUM) && (curDrumPitch != -1) && ((num & 0xff) == 0xff))
+ {
+ di = (num & ~0xff) | curDrumPitch;
+ n = (num & ~0xff) | MusEGlobal::drumMap[curDrumPitch].anote; // construct real controller number
+ //num = (num & ~0xff) | curDrumPitch); // construct real controller number
+ mp = &MusEGlobal::midiPorts[MusEGlobal::drumMap[curDrumPitch].port];
+ }
+ else if ((mt->type() == MusECore::Track::NEW_DRUM) && (curDrumPitch != -1) && ((num & 0xff) == 0xff)) //FINDMICHJETZT does this work?
{
- di = (num & ~0xff) | curDrumInstrument;
- n = (num & ~0xff) | MusEGlobal::drumMap[curDrumInstrument].anote; // construct real controller number
- //num = (num & ~0xff) | curDrumInstrument); // construct real controller number
- mp = &MusEGlobal::midiPorts[MusEGlobal::drumMap[curDrumInstrument].port];
+ di = (num & ~0xff) | curDrumPitch;
+ n = (num & ~0xff) | curDrumPitch;
+ mp = &MusEGlobal::midiPorts[mt->outPort()];
}
else
{
@@ -601,6 +613,10 @@ void CtrlCanvas::updateItems()
CEvent* lastce = 0;
MusECore::MidiPart* part = (MusECore::MidiPart*)(p->second);
+
+ if (filterTrack && part->track() != curTrack)
+ continue;
+
MusECore::EventList* el = part->events();
//MusECore::MidiController* mc;
MusECore::MidiCtrlValList* mcvl;
@@ -617,15 +633,15 @@ void CtrlCanvas::updateItems()
if(_cnum == MusECore::CTRL_VELOCITY && e.type() == MusECore::Note)
{
- //printf("CtrlCanvas::updateItems MusECore::CTRL_VELOCITY curDrumInstrument:%d\n", curDrumInstrument);
+ //printf("CtrlCanvas::updateItems MusECore::CTRL_VELOCITY curDrumPitch:%d\n", curDrumPitch);
newev = 0;
- if(curDrumInstrument == -1)
+ if(curDrumPitch == -1)
{
// This is interesting - it would allow ALL drum note velocities to be shown.
// But currently the drum list ALWAYS has a selected item so this is not supposed to happen.
items.add(newev = new CEvent(e, part, e.velo()));
}
- else if (e.dataA() == curDrumInstrument) //same note
+ else if (e.dataA() == curDrumPitch) //same note
items.add(newev = new CEvent(e, part, e.velo()));
if(newev && e.selected())
selection.push_back(newev);
@@ -795,7 +811,7 @@ void CtrlCanvas::viewMouseMoveEvent(QMouseEvent* event)
if (!moving)
break;
drag = DRAG_LASSO;
- // weiter mit DRAG_LASSO:
+ // fallthrough
case DRAG_LASSO:
lasso.setRect(start.x(), start.y(), dist.x(), dist.y());
redraw();
@@ -857,7 +873,7 @@ void CtrlCanvas::viewMouseReleaseEvent(QMouseEvent* event)
case DRAG_LASSO_START:
lasso.setRect(-1, -1, -1, -1);
-
+ //fallthrough
case DRAG_LASSO:
if(_controller) // p4.0.27
{
@@ -1690,8 +1706,8 @@ void CtrlCanvas::pdrawItems(QPainter& p, const QRect& rect, const MusECore::Midi
MusECore::MidiTrack* mt = part->track();
MusECore::MidiPort* mp;
- if((mt->type() == MusECore::Track::DRUM) && (curDrumInstrument != -1) && ((_cnum & 0xff) == 0xff)) //FINDMICHJETZT was ist das?
- mp = &MusEGlobal::midiPorts[MusEGlobal::drumMap[curDrumInstrument].port];
+ if((mt->type() == MusECore::Track::DRUM) && (curDrumPitch != -1) && ((_cnum & 0xff) == 0xff))
+ mp = &MusEGlobal::midiPorts[MusEGlobal::drumMap[curDrumPitch].port];
else
mp = &MusEGlobal::midiPorts[mt->outPort()];
@@ -1857,7 +1873,7 @@ void CtrlCanvas::pdraw(QPainter& p, const QRect& rect)
{
MusECore::MidiPart* part = (MusECore::MidiPart*)(ip->second);
//if((velo && part == curPart) || (!velo && part != curPart))
- if(part == curPart)
+ if(part == curPart || (filterTrack && part->track() != curTrack))
continue;
// Draw items for all parts - other than current part
pdrawItems(p, rect, part, velo, !velo);
@@ -1978,13 +1994,24 @@ void CtrlCanvas::draw(QPainter& p, const QRect& rect)
}
//---------------------------------------------------------
-// setCurDrumInstrument
+// setCurDrumPitch
//---------------------------------------------------------
-void CtrlCanvas::setCurDrumInstrument(int di)
+void CtrlCanvas::setCurDrumPitch(int instrument)
+{
+ DrumEdit* drumedit = dynamic_cast<DrumEdit*>(editor);
+ if (drumedit == NULL || drumedit->old_style_drummap_mode())
+ curDrumPitch = instrument;
+ else // new style drummap mode
{
- curDrumInstrument = di;
- //printf("CtrlCanvas::setCurDrumInstrument curDrumInstrument:%d\n", curDrumInstrument);
+ if (drumedit->get_instrument_map()[instrument].tracks.contains(curTrack))
+ curDrumPitch = drumedit->get_instrument_map()[instrument].pitch;
+ else
+ curDrumPitch = -1;
+ }
+
+
+ //printf("CtrlCanvas::setCurDrumPitch curDrumPitch:%d\n", curDrumPitch);
//
// check if current controller is only valid for
@@ -2000,6 +2027,6 @@ void CtrlCanvas::setCurDrumInstrument(int di)
// }
// Removed by T356
//songChanged(-1);
- }
+}
} // namespace MusEGui
diff --git a/muse2/muse/ctrl/ctrlcanvas.h b/muse2/muse/ctrl/ctrlcanvas.h
index 815898ac..79910b94 100644
--- a/muse2/muse/ctrl/ctrlcanvas.h
+++ b/muse2/muse/ctrl/ctrlcanvas.h
@@ -121,6 +121,7 @@ class CtrlCanvas : public MusEGui::View {
int line2y;
bool drawLineMode;
bool noEvents;
+ bool filterTrack;
void viewMousePressEvent(QMouseEvent* event);
void viewMouseMoveEvent(QMouseEvent*);
@@ -161,7 +162,7 @@ class CtrlCanvas : public MusEGui::View {
QPoint start;
MusEGui::Tool tool;
unsigned pos[3];
- int curDrumInstrument; //Used by the drum-editor to view velocity of only one key (one drum)
+ int curDrumPitch; //Used by the drum-editor to view velocity of only one key (one drum)
void leaveEvent(QEvent*e);
QPoint raster(const QPoint&) const;
@@ -179,7 +180,7 @@ class CtrlCanvas : public MusEGui::View {
private slots:
void songChanged(int type);
void configChanged();
- void setCurDrumInstrument(int);
+ void setCurDrumPitch(int);
public slots:
void setTool(int t);
@@ -199,6 +200,7 @@ class CtrlCanvas : public MusEGui::View {
MusECore::MidiCtrlValList* ctrlValList() { return ctrl; }
MusECore::MidiController* controller() { return _controller; }
MusECore::MidiTrack* track() const { return curTrack; }
+ int getCurDrumPitch() const { return curDrumPitch; }
};
} // namespace MusEGui
diff --git a/muse2/muse/ctrl/ctrledit.cpp b/muse2/muse/ctrl/ctrledit.cpp
index 7c960dd8..5ce6a7bb 100644
--- a/muse2/muse/ctrl/ctrledit.cpp
+++ b/muse2/muse/ctrl/ctrledit.cpp
@@ -55,8 +55,10 @@ CtrlEdit::CtrlEdit(QWidget* parent, MidiEditor* e, int xmag,
setObjectName(name);
setAttribute(Qt::WA_DeleteOnClose);
QHBoxLayout* hbox = new QHBoxLayout;
- panel = new CtrlPanel(0, e, "panel");
- canvas = new CtrlCanvas(e, 0, xmag, "ctrlcanvas", panel);
+ canvas = new CtrlCanvas(e, 0, xmag, "ctrlcanvas");
+ panel = new CtrlPanel(0, e, canvas, "panel");
+ canvas->setPanel(panel);
+
QWidget* vscale = new MusEGui::VScale;
hbox->setContentsMargins(0, 0, 0, 0);
diff --git a/muse2/muse/ctrl/ctrlpanel.cpp b/muse2/muse/ctrl/ctrlpanel.cpp
index 5e07e5f3..ed83bab8 100644
--- a/muse2/muse/ctrl/ctrlpanel.cpp
+++ b/muse2/muse/ctrl/ctrlpanel.cpp
@@ -64,7 +64,7 @@ namespace MusEGui {
// CtrlPanel
//---------------------------------------------------------
-CtrlPanel::CtrlPanel(QWidget* parent, MidiEditor* e, const char* name)
+CtrlPanel::CtrlPanel(QWidget* parent, MidiEditor* e, CtrlCanvas* c, const char* name)
: QWidget(parent)
{
setObjectName(name);
@@ -72,6 +72,7 @@ CtrlPanel::CtrlPanel(QWidget* parent, MidiEditor* e, const char* name)
//ctrlMainPop = 0;
//ctrlSubPop = 0;
editor = e;
+ ctrlcanvas = c;
setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding));
QVBoxLayout* vbox = new QVBoxLayout;
QHBoxLayout* bbox = new QHBoxLayout;
@@ -170,11 +171,11 @@ void CtrlPanel::heartBeat()
{
int outport;
int chan;
- int cdi = editor->curDrumInstrument();
- if(_track->type() == MusECore::Track::DRUM && ((_ctrl->num() & 0xff) == 0xff) && cdi != -1)
+ int cdp = ctrlcanvas->getCurDrumPitch();
+ if(_track->type() == MusECore::Track::DRUM && ((_ctrl->num() & 0xff) == 0xff) && cdp != -1)
{
- outport = MusEGlobal::drumMap[cdi].port;
- chan = MusEGlobal::drumMap[cdi].channel;
+ outport = MusEGlobal::drumMap[cdp].port;
+ chan = MusEGlobal::drumMap[cdp].channel;
}
else
{
@@ -248,11 +249,11 @@ void CtrlPanel::labelDoubleClicked()
int outport;
int chan;
- int cdi = editor->curDrumInstrument();
- if(_track->type() == MusECore::Track::DRUM && ((_ctrl->num() & 0xff) == 0xff) && cdi != -1)
+ int cdp = ctrlcanvas->getCurDrumPitch();
+ if(_track->type() == MusECore::Track::DRUM && ((_ctrl->num() & 0xff) == 0xff) && cdp != -1)
{
- outport = MusEGlobal::drumMap[cdi].port;
- chan = MusEGlobal::drumMap[cdi].channel;
+ outport = MusEGlobal::drumMap[cdp].port;
+ chan = MusEGlobal::drumMap[cdp].channel;
}
else
{
@@ -352,11 +353,11 @@ void CtrlPanel::ctrlChanged(double val)
int outport;
int chan;
- int cdi = editor->curDrumInstrument();
- if(_track->type() == MusECore::Track::DRUM && ((_ctrl->num() & 0xff) == 0xff) && cdi != -1)
+ int cdp = ctrlcanvas->getCurDrumPitch();
+ if(_track->type() == MusECore::Track::DRUM && ((_ctrl->num() & 0xff) == 0xff) && cdp != -1)
{
- outport = MusEGlobal::drumMap[cdi].port;
- chan = MusEGlobal::drumMap[cdi].channel;
+ outport = MusEGlobal::drumMap[cdp].port;
+ chan = MusEGlobal::drumMap[cdp].channel;
}
else
{
@@ -421,13 +422,19 @@ void CtrlPanel::setHWController(MusECore::MidiTrack* t, MusECore::MidiController
MusECore::MidiPort* mp;
int ch;
- int cdi = editor->curDrumInstrument();
+ int cdp = ctrlcanvas->getCurDrumPitch();
_dnum = _ctrl->num();
- if(_track->type() == MusECore::Track::DRUM && ((_dnum & 0xff) == 0xff) && cdi != -1)
+ if(_track->type() == MusECore::Track::DRUM && ((_dnum & 0xff) == 0xff) && cdp != -1)
{
- _dnum = (_dnum & ~0xff) | MusEGlobal::drumMap[cdi].anote;
- mp = &MusEGlobal::midiPorts[MusEGlobal::drumMap[cdi].port];
- ch = MusEGlobal::drumMap[cdi].channel;
+ _dnum = (_dnum & ~0xff) | MusEGlobal::drumMap[cdp].anote;
+ mp = &MusEGlobal::midiPorts[MusEGlobal::drumMap[cdp].port];
+ ch = MusEGlobal::drumMap[cdp].channel;
+ }
+ else if(_track->type() == MusECore::Track::NEW_DRUM && ((_dnum & 0xff) == 0xff) && cdp != -1)
+ {
+ _dnum = (_dnum & ~0xff) | cdp; //FINDMICHJETZT does that work?
+ mp = &MusEGlobal::midiPorts[_track->outPort()];
+ ch = _track->outChannel();
}
else
{
@@ -576,8 +583,9 @@ void CtrlPanel::ctrlPopup()
MusECore::MidiTrack* track = (MusECore::MidiTrack*)(part->track());
int channel = track->outChannel();
MusECore::MidiPort* port = &MusEGlobal::midiPorts[track->outPort()];
- int curDrumInstrument = editor->curDrumInstrument();
+ int curDrumPitch = ctrlcanvas->getCurDrumPitch();
bool isDrum = track->type() == MusECore::Track::DRUM;
+ bool isNewDrum = track->type() == MusECore::Track::NEW_DRUM;
QMenu* pop = new QMenu;
//pop->clear();
@@ -595,12 +603,20 @@ void CtrlPanel::ctrlPopup()
MusECore::MidiController* c = port->midiController(cl->num());
// dont show drum specific controller if not a drum track
if ((c->num() & 0xff) == 0xff) {
- if (!isDrum)
- continue;
- // only show controller for curDrumInstrument:
- if ((cl->num() & 0xff) != MusEGlobal::drumMap[curDrumInstrument].anote) {
- continue;
- }
+ if (isDrum)
+ {
+ // only show controller for curDrumPitch:
+ if ((curDrumPitch == -1) || ((cl->num() & 0xff) != MusEGlobal::drumMap[curDrumPitch].anote))
+ continue;
+ }
+ else if (isNewDrum)
+ {
+ // only show controller for curDrumPitch: FINDMICH does this work?
+ if ((curDrumPitch == -1) || ((cl->num() & 0xff) != curDrumPitch))
+ continue;
+ }
+ else
+ continue;
}
isList i = sList.begin();
for (; i != sList.end(); ++i) {
@@ -663,8 +679,10 @@ void CtrlPanel::ctrlPopup()
for (iMusECore::MidiController ci = mcl->begin(); ci != mcl->end(); ++ci)
{
int num = ci->second->num();
- if (isDrum && ((num & 0xff) == 0xff))
- num = (num & ~0xff) + MusEGlobal::drumMap[curDrumInstrument].anote;
+ if (isDrum && ((num & 0xff) == 0xff) && curDrumPitch!=-1)
+ num = (num & ~0xff) + MusEGlobal::drumMap[curDrumPitch].anote;
+ if (isNewDrum && ((num & 0xff) == 0xff) && curDrumPitch!=-1) //FINDMICHJETZT does this work?
+ num = (num & ~0xff) + curDrumPitch;
if(cll->find(channel, num) == cll->end())
pop1->addAction(ci->second->name());
@@ -677,8 +695,10 @@ void CtrlPanel::ctrlPopup()
c = ci->second;
if (c->name() == s) {
int num = c->num();
- if (isDrum && ((num & 0xff) == 0xff))
- num = (num & ~0xff) + MusEGlobal::drumMap[curDrumInstrument].anote;
+ if (isDrum && ((num & 0xff) == 0xff) && curDrumPitch!=-1)
+ num = (num & ~0xff) + MusEGlobal::drumMap[curDrumPitch].anote;
+ if (isNewDrum && ((num & 0xff) == 0xff) && curDrumPitch!=-1) //FINDMICHJETZT does this work?
+ num = (num & ~0xff) + curDrumPitch;
if(cll->find(channel, num) == cll->end())
{
@@ -734,8 +754,9 @@ void CtrlPanel::ctrlPopup()
MusECore::MidiTrack* track = (MusECore::MidiTrack*)(part->track());
int channel = track->outChannel();
MusECore::MidiPort* port = &MusEGlobal::midiPorts[track->outPort()];
- int curDrumInstrument = editor->curDrumInstrument();
- bool isDrum = track->type() == MusECore::Track::DRUM; //FINDMICHJETZT ist das wichtig?
+ int curDrumPitch = ctrlcanvas->getCurDrumPitch();
+ 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();
@@ -751,12 +772,20 @@ void CtrlPanel::ctrlPopup()
MusECore::MidiController* c = port->midiController(cl->num());
// dont show drum specific controller if not a drum track
if ((c->num() & 0xff) == 0xff) {
- if (!isDrum)
- continue;
- // only show controller for curDrumInstrument:
- if ((cl->num() & 0xff) != MusEGlobal::drumMap[curDrumInstrument].anote) {
- continue;
- }
+ if (isDrum)
+ {
+ // only show controller for curDrumPitch:
+ if ((curDrumPitch == -1) || ((cl->num() & 0xff) != MusEGlobal::drumMap[curDrumPitch].anote))
+ continue;
+ }
+ else if (isNewDrum)
+ {
+ // only show controller for curDrumPitch: FINDMICH does this work?
+ if ((curDrumPitch == -1) || ((cl->num() & 0xff) != curDrumPitch))
+ continue;
+ }
+ else
+ continue;
}
isList i = sList.begin();
for (; i != sList.end(); ++i) {
@@ -866,10 +895,12 @@ void CtrlPanel::ctrlPopup()
int num = ci->second->num();
if((num & 0xff) == 0xff)
{
- // dont show drum specific controller if not a drum track
- if(!isDrum)
+ 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;
- num = (num & ~0xff) + MusEGlobal::drumMap[curDrumInstrument].anote;
}
if(cll->find(channel, num) == cll->end())
@@ -896,8 +927,10 @@ void CtrlPanel::ctrlPopup()
{
c = ci->second;
int num = c->num();
- if (isDrum && ((num & 0xff) == 0xff))
- num = (num & ~0xff) + MusEGlobal::drumMap[curDrumInstrument].anote;
+ 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;
@@ -933,8 +966,11 @@ void CtrlPanel::ctrlPopup()
if (act2) {
int rv2 = act2->data().toInt();
int num = rv2;
- if (isDrum && ((num & 0xff) == 0xff))
- num = (num & ~0xff) + MusEGlobal::drumMap[curDrumInstrument].anote;
+ 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);
@@ -981,11 +1017,11 @@ void CtrlPanel::ctrlRightClicked(const QPoint& p, int /*id*/)
if(!editor->curCanvasPart() || !_ctrl)
return;
- int cdi = editor->curDrumInstrument();
+ int cdp = ctrlcanvas->getCurDrumPitch();
int ctlnum = _ctrl->num();
- if(_track->type() == MusECore::Track::DRUM && ((ctlnum & 0xff) == 0xff) && cdi != -1)
- //ctlnum = (ctlnum & ~0xff) | MusEGlobal::drumMap[cdi].enote;
- ctlnum = (ctlnum & ~0xff) | cdi;
+ if(_track->type() == MusECore::Track::DRUM && ((ctlnum & 0xff) == 0xff) && cdp != -1)
+ //ctlnum = (ctlnum & ~0xff) | MusEGlobal::drumMap[cdp].enote;
+ ctlnum = (ctlnum & ~0xff) | cdp;
MusECore::MidiPart* part = dynamic_cast<MusECore::MidiPart*>(editor->curCanvasPart());
MusEGlobal::song->execMidiAutomationCtlPopup(0, part, p, ctlnum);
diff --git a/muse2/muse/ctrl/ctrlpanel.h b/muse2/muse/ctrl/ctrlpanel.h
index c28708cb..ab6c1777 100644
--- a/muse2/muse/ctrl/ctrlpanel.h
+++ b/muse2/muse/ctrl/ctrlpanel.h
@@ -37,6 +37,7 @@ namespace MusEGui {
class DoubleLabel;
class Knob;
class MidiEditor;
+class CtrlCanvas;
//---------------------------------------------------------
// CtrlPanel
@@ -48,6 +49,7 @@ class CtrlPanel: public QWidget {
//QMenu* pop;
QPushButton* selCtrl;
MidiEditor* editor;
+ CtrlCanvas* ctrlcanvas;
MusECore::MidiTrack* _track;
MusECore::MidiController* _ctrl;
@@ -77,7 +79,7 @@ class CtrlPanel: public QWidget {
void ctrlPopup();
public:
- CtrlPanel(QWidget*, MidiEditor*, const char* name = 0);
+ CtrlPanel(QWidget*, MidiEditor*, CtrlCanvas*, const char* name = 0);
void setHWController(MusECore::MidiTrack* t, MusECore::MidiController* ctrl);
};
diff --git a/muse2/muse/midiedit/dcanvas.cpp b/muse2/muse/midiedit/dcanvas.cpp
index ec17b655..d024422c 100644
--- a/muse2/muse/midiedit/dcanvas.cpp
+++ b/muse2/muse/midiedit/dcanvas.cpp
@@ -304,7 +304,9 @@ bool DrumCanvas::moveItem(MusECore::Undo& operations, CItem* item, const QPoint&
MusECore::MidiPart* dest_part = part;
int nheight = y2pitch(pos.y());
-
+ if (nheight<0) nheight=0;
+ if (nheight>=getOurDrumMapSize()) nheight=getOurDrumMapSize()-1;
+
if (!instrument_map[nheight].tracks.contains(dest_part->track()))
{
if (debugMsg)
@@ -361,6 +363,9 @@ bool DrumCanvas::moveItem(MusECore::Undo& operations, CItem* item, const QPoint&
CItem* DrumCanvas::newItem(const QPoint& p, int state)
{
int instr = y2pitch(p.y()); //MusEGlobal::drumInmap[y2pitch(p.y())];
+ if ((instr<0) || (instr>=getOurDrumMapSize()))
+ return NULL;
+
int velo = ourDrumMap[instr].lv4;
if (state == Qt::ShiftModifier)
velo = ourDrumMap[instr].lv3;
@@ -378,6 +383,9 @@ CItem* DrumCanvas::newItem(const QPoint& p, int state)
CItem* DrumCanvas::newItem(int tick, int instrument, int velocity)
{
+ if ((instrument<0) || (instrument>=getOurDrumMapSize()))
+ return NULL;
+
if (!old_style_drummap_mode && !instrument_map[instrument].tracks.contains(curPart->track()))
{
if (debugMsg)
@@ -634,6 +642,8 @@ int DrumCanvas::y2pitch(int y) const
int pitch = y/TH;
if (pitch >= instrument_map.size())
pitch = instrument_map.size()-1;
+ else if (pitch<0)
+ pitch = 0;
return pitch;
}
@@ -849,6 +859,9 @@ void DrumCanvas::keyPressed(int index, int velocity)
{
using MusECore::MidiTrack;
+ if ((index<0) || (index>=getOurDrumMapSize()))
+ return;
+
// called from DList - play event
int port = old_style_drummap_mode ? ourDrumMap[index].port : dynamic_cast<MidiTrack*>(*instrument_map[index].tracks.begin())->outPort();
int channel = old_style_drummap_mode ? ourDrumMap[index].channel : dynamic_cast<MidiTrack*>(*instrument_map[index].tracks.begin())->outChannel();
@@ -884,6 +897,9 @@ void DrumCanvas::keyReleased(int index, bool)
{
using MusECore::MidiTrack;
+ if ((index<0) || (index>=getOurDrumMapSize()))
+ return;
+
// called from DList - silence playing event
int port = old_style_drummap_mode ? ourDrumMap[index].port : dynamic_cast<MidiTrack*>(*instrument_map[index].tracks.begin())->outPort();
int channel = old_style_drummap_mode ? ourDrumMap[index].channel : dynamic_cast<MidiTrack*>(*instrument_map[index].tracks.begin())->outChannel();
@@ -1006,15 +1022,24 @@ void DrumCanvas::mapChanged(int spitch, int dpitch)
}
// the instrument represented by instrument_map[dpitch] is always the instrument
- // which will be immediately AFTER our dragged instrument
- for (global_drum_ordering_t::iterator it=global_drum_ordering.begin(); it!=global_drum_ordering.end(); it++)
- if (instrument_map[dpitch].pitch==it->second && instrument_map[dpitch].tracks.contains(it->first))
- {
- while (!order_temp.empty())
- it=global_drum_ordering.insert(it, order_temp.takeLast());
+ // which will be immediately AFTER our dragged instrument. or it's invalid
+ if (dpitch < getOurDrumMapSize())
+ {
+ for (global_drum_ordering_t::iterator it=global_drum_ordering.begin(); it!=global_drum_ordering.end(); it++)
+ if (instrument_map[dpitch].pitch==it->second && instrument_map[dpitch].tracks.contains(it->first))
+ {
+ while (!order_temp.empty())
+ it=global_drum_ordering.insert(it, order_temp.takeLast());
- break;
- }
+ break;
+ }
+ }
+ else
+ {
+ global_drum_ordering_t::iterator it=global_drum_ordering.end();
+ while (!order_temp.empty())
+ it=global_drum_ordering.insert(it, order_temp.takeLast());
+ }
diff --git a/muse2/muse/midiedit/dlist.cpp b/muse2/muse/midiedit/dlist.cpp
index 2d4561e0..bcdbad79 100644
--- a/muse2/muse/midiedit/dlist.cpp
+++ b/muse2/muse/midiedit/dlist.cpp
@@ -296,7 +296,9 @@ void DList::viewMousePressEvent(QMouseEvent* ev)
int x = ev->x();
int y = ev->y();
int button = ev->button();
- unsigned instrument = y / TH;
+ int instrument = y / TH;
+ if (instrument >= ourDrumMapSize) instrument=ourDrumMapSize-1;
+ if (instrument < 0) instrument=0;
MusECore::DrumMap* dm = &ourDrumMap[instrument];
MusECore::DrumMap dm_old = *dm;
@@ -551,7 +553,7 @@ void DList::viewMousePressEvent(QMouseEvent* ev)
}
if (!old_style_drummap_mode && dm_old != *dm) //something changed and we're in new style mode?
- dcanvas->propagate_drummap_change(dm-ourDrumMap, (dm_old.enote != dm->enote));
+ dcanvas->propagate_drummap_change(instrument, (dm_old.enote != dm->enote));
MusEGlobal::song->update(SC_DRUMMAP);
//redraw(); //this is done by the songChanged slot
@@ -588,6 +590,9 @@ void DList::viewMouseDoubleClickEvent(QMouseEvent* ev)
//---------------------------------------------------------
void DList::lineEdit(int line, int section)
{
+ if (line >= ourDrumMapSize) line=ourDrumMapSize-1;
+ if (line < 0) line=0;
+
MusECore::DrumMap* dm = &ourDrumMap[line];
editEntry = dm;
if (editor == 0) {
@@ -656,6 +661,9 @@ void DList::lineEdit(int line, int section)
//---------------------------------------------------------
void DList::pitchEdit(int line, int section)
{
+ if (line >= ourDrumMapSize) line=ourDrumMapSize-1;
+ if (line < 0) line=0;
+
MusECore::DrumMap* dm = &ourDrumMap[line];
editEntry = dm;
if (pitch_editor == 0) {
@@ -710,7 +718,7 @@ int DList::x2col(int x) const
void DList::setCurDrumInstrument(int instr)
{
- if (instr < 0 || instr >= ourDrumMapSize -1)
+ if (instr < 0 || instr >= ourDrumMapSize)
return; // illegal instrument
MusECore::DrumMap* dm = &ourDrumMap[instr];
if (currentlySelected != dm) {
@@ -1022,7 +1030,14 @@ void DList::viewMouseReleaseEvent(QMouseEvent* ev)
dInstrument = (y+TH/2) / TH;
if (dInstrument < 0) dInstrument=0;
- if (dInstrument >= ourDrumMapSize) dInstrument=ourDrumMapSize-1;
+ if (old_style_drummap_mode)
+ {
+ if (dInstrument >= ourDrumMapSize) dInstrument=ourDrumMapSize-1;
+ }
+ else
+ {
+ if (dInstrument > ourDrumMapSize) dInstrument=ourDrumMapSize; // allow moving something below the last element
+ }
int cur_sel = (!old_style_drummap_mode && dInstrument>sInstrument) ? dInstrument-1 : dInstrument;
@@ -1077,6 +1092,7 @@ void DList::ourDrumMapChanged(bool instrMapChanged)
editEntry=NULL;
if (selIdx >= ourDrumMapSize) selIdx=ourDrumMapSize-1;
+ if (selIdx < 0) selIdx=0;
currentlySelected = &ourDrumMap[selIdx];
redraw();
diff --git a/muse2/muse/midiedit/drumedit.h b/muse2/muse/midiedit/drumedit.h
index b860da80..08f485e7 100644
--- a/muse2/muse/midiedit/drumedit.h
+++ b/muse2/muse/midiedit/drumedit.h
@@ -33,6 +33,7 @@
#include "header.h"
#include "shortcuts.h"
#include "event.h"
+#include "dcanvas.h" //FINDMICH UGLY. remove!
class QCloseEvent;
class QLabel;
@@ -182,6 +183,8 @@ class DrumEdit : public MidiEditor {
bool old_style_drummap_mode();
group_mode_t group_mode() { return _group_mode; }
bool ignore_hide() { return _ignore_hide; }
+
+ QVector<instrument_number_mapping_t>& get_instrument_map() { return static_cast<DrumCanvas*>(canvas)->get_instrument_map(); } //FINDMICH UGLY
};
} // namespace MusEGui
diff --git a/muse2/muse/midiedit/scoreedit.cpp b/muse2/muse/midiedit/scoreedit.cpp
index 9fd0b3ed..2d24fa54 100644
--- a/muse2/muse/midiedit/scoreedit.cpp
+++ b/muse2/muse/midiedit/scoreedit.cpp
@@ -4597,6 +4597,7 @@ void ScoreCanvas::add_new_parts(const std::map< MusECore::Part*, std::set<MusECo
* o drum controllers
* update ctrlcanvas/panel
* test!
+ * o don't mix DRUM and NEW_DRUM in drumeditor!
* o my record flag handling
* o option for disabling old-style / new-style drum tracks?
*