summaryrefslogtreecommitdiff
path: root/muse2/muse/midiedit
diff options
context:
space:
mode:
Diffstat (limited to 'muse2/muse/midiedit')
-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
4 files changed, 58 insertions, 13 deletions
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?
*