summaryrefslogtreecommitdiff
path: root/muse2/muse/midiedit
diff options
context:
space:
mode:
authorTim E. Real <termtech@rogers.com>2012-11-12 04:49:31 +0000
committerTim E. Real <termtech@rogers.com>2012-11-12 04:49:31 +0000
commitbe1005a6031861b91e1a2df33f62e1c5a0a2aeb6 (patch)
tree89152909549c7dd624f4748f394c3adbcbf65b86 /muse2/muse/midiedit
parent31f618e5461553bd7836677f944acfa233e5ae3c (diff)
Finished Aftertouch controllers
Feature: Piano KB / drum list show coloured dots when per-pitch controllers exist / have data.
Diffstat (limited to 'muse2/muse/midiedit')
-rw-r--r--muse2/muse/midiedit/dcanvas.cpp2
-rw-r--r--muse2/muse/midiedit/dcanvas.h1
-rw-r--r--muse2/muse/midiedit/dlist.cpp186
-rw-r--r--muse2/muse/midiedit/dlist.h2
-rw-r--r--muse2/muse/midiedit/drumedit.cpp9
-rw-r--r--muse2/muse/midiedit/drumedit.h1
-rw-r--r--muse2/muse/midiedit/piano.cpp67
-rw-r--r--muse2/muse/midiedit/piano.h10
-rw-r--r--muse2/muse/midiedit/pianoroll.cpp3
-rw-r--r--muse2/muse/midiedit/pianoroll.h1
10 files changed, 272 insertions, 10 deletions
diff --git a/muse2/muse/midiedit/dcanvas.cpp b/muse2/muse/midiedit/dcanvas.cpp
index 9189b0d8..8b324bde 100644
--- a/muse2/muse/midiedit/dcanvas.cpp
+++ b/muse2/muse/midiedit/dcanvas.cpp
@@ -116,7 +116,7 @@ DrumCanvas::DrumCanvas(MidiEditor* pr, QWidget* parent, int sx,
int sy, const char* name)
: EventCanvas(pr, parent, sx, sy, name)
{
- drumEditor=dynamic_cast<DrumEdit*>(pr);
+ drumEditor=static_cast<DrumEdit*>(pr);
_setCurPartIfOnlyOneEventIsSelected=false;
diff --git a/muse2/muse/midiedit/dcanvas.h b/muse2/muse/midiedit/dcanvas.h
index 1cd8074a..d35a8891 100644
--- a/muse2/muse/midiedit/dcanvas.h
+++ b/muse2/muse/midiedit/dcanvas.h
@@ -170,6 +170,7 @@ class DrumCanvas : public EventCanvas {
QVector<instrument_number_mapping_t>& get_instrument_map() { return instrument_map; }
void propagate_drummap_change(int instrument, bool update_druminmap);
void rebuildOurDrumMap();
+ DrumEdit* drumEdit() { return drumEditor; }
};
} // namespace MusEGui
diff --git a/muse2/muse/midiedit/dlist.cpp b/muse2/muse/midiedit/dlist.cpp
index 3222e278..de89834f 100644
--- a/muse2/muse/midiedit/dlist.cpp
+++ b/muse2/muse/midiedit/dlist.cpp
@@ -166,8 +166,190 @@ void DList::draw(QPainter& p, const QRect& rect)
}
break;
case COL_NAME:
- s = dm->name;
- align = Qt::AlignVCenter | Qt::AlignLeft;
+ {
+ if(dcanvas && dcanvas->part())
+ {
+ MusECore::Part* cur_part = dcanvas->part();
+ if(cur_part->track() && cur_part->track()->isMidiTrack())
+ {
+ MusECore::MidiTrack* cur_track = static_cast<MusECore::MidiTrack*>(cur_part->track());
+ int cur_channel = cur_track->outChannel();
+ MusECore::MidiPort* cur_port = &MusEGlobal::midiPorts[cur_track->outPort()];
+
+ if(old_style_drummap_mode)
+ {
+ int channel = dm->channel;
+ MusECore::MidiPort* mp = &MusEGlobal::midiPorts[dm->port];
+ int instr_pitch = dm->anote;
+ MusECore::MidiCtrlValListList* cll = mp->controller();
+ const int min = channel << 24;
+ const int max = min + 0x1000000;
+ bool found = false;
+ bool used = false;
+ bool off = true;
+ for(MusECore::iMidiCtrlValList imcvl = cll->lower_bound(min); imcvl != cll->lower_bound(max); ++imcvl)
+ {
+ MusECore::MidiCtrlValList* cl = imcvl->second;
+ MusECore::MidiController* c = mp->midiController(cl->num());
+ if(!c->isPerNoteController())
+ continue;
+ int cnum = c->num();
+ int num = cl->num();
+ int pitch = num & 0x7f;
+ if(pitch != instr_pitch)
+ continue;
+
+ found = true;
+ MusECore::EventList* el = cur_part->events();
+ for(MusECore::iEvent ie = el->begin(); ie != el->end(); ++ie)
+ {
+ MusECore::Event e = ie->second;
+ if(e.type() != MusECore::Controller)
+ continue;
+ int ctl_num = e.dataA();
+ if((ctl_num | 0xff) == cnum && (ctl_num & 0x7f) == instrument)
+ {
+ used = true;
+ break;
+ }
+ }
+ off = cl->hwVal() == MusECore::CTRL_VAL_UNKNOWN; // Does it have a value or is it 'off'?
+ if(used && !off)
+ break; // We have all the info we need, done.
+ }
+
+ if(found)
+ {
+ int rx = r.x() + 1;
+ int ry = r.y() + r.height()/2 - 3;
+ int rw = 6;
+ int rh = 6;
+ if(used)
+ {
+ if(off)
+ p.drawPixmap(rx, ry, rw, rh, *greendot12x12Icon);
+ else
+ p.drawPixmap(rx, ry, rw, rh, *orangedot12x12Icon);
+ }
+ else
+ {
+ if(off)
+ p.drawPixmap(rx, ry, rw, rh, *graydot12x12Icon);
+ else
+ p.drawPixmap(rx, ry, rw, rh, *bluedot12x12Icon);
+ }
+ }
+ }
+ else
+ {
+
+ QSet<MusECore::Track*>* group = &dcanvas->get_instrument_map()[instrument].tracks;
+ bool found = false;
+ bool used = false;
+ bool off = true;
+
+ // REMOVE Tim. Or FIXME. An attempt to light the dots while respecting grouping.
+ //if(!group->empty())
+ {
+// int group_size = group->size();
+// if(group_size == 1)
+// {
+// MusECore::Track* t = *group->begin();
+// MusECore::PartList* part_list = dcanvas->drumEdit()->parts();
+// for(MusECore::ciPart ip = part_list->cbegin(); ip != part_list->cend(); ++ip) {
+// if(ip->second->track() == t) {
+// }
+// }
+// }
+
+ int instr_pitch = dcanvas->get_instrument_map()[instrument].pitch;
+
+ //if(//dcanvas->drumEdit()->group_mode() == DrumEdit::DONT_GROUP ||
+ //dcanvas->drumEdit()->group_mode() == DrumEdit::GROUP_MAX ||
+ //dcanvas->drumEdit()->group_mode() == DrumEdit::GROUP_SAME_CHANNEL ||
+ //group_size >= 2 && group->find(cur_track) != group->end())
+ //for(QSet<MusECore::Track*>::iterator it = group->begin(); it != group->end(); ++it)
+ if(group->find(cur_track) != group->end())
+ {
+ //if(!(*it)->isMidiTrack())
+ // continue;
+ //MusECore::MidiTrack* track = static_cast<MusECore::MidiTrack*>(*it);
+ //MusECore::MidiPort* mp = &MusEGlobal::midiPorts[track->outPort()];
+ //MusECore::MidiCtrlValListList* cll = mp->controller();
+ MusECore::MidiCtrlValListList* cll = cur_port->controller();
+ //int channel = track->outChannel();
+ //const int min = channel << 24;
+ const int min = cur_channel << 24;
+ const int max = min + 0x1000000;
+
+ for(MusECore::iMidiCtrlValList imcvl = cll->lower_bound(min); imcvl != cll->lower_bound(max); ++imcvl)
+ {
+ MusECore::MidiCtrlValList* cl = imcvl->second;
+ MusECore::MidiController* c = cur_port->midiController(cl->num());
+ if(!c->isPerNoteController())
+ continue;
+ int cnum = c->num();
+ int num = cl->num();
+ int pitch = num & 0x7f;
+ if(pitch != instr_pitch)
+ continue;
+
+ found = true;
+ MusECore::EventList* el = cur_part->events();
+ //MusECore::PartList* part_list = dcanvas->drumEdit()->parts();
+ //for(MusECore::ciPart ip = part_list->cbegin(); ip != part_list->cend(); ++ip)
+ {
+ //MusECore::Part* part = ip->second;
+ ///if(part->track() !=
+ //MusECore::EventList* el = part->events();
+ for(MusECore::iEvent ie = el->begin(); ie != el->end(); ++ie)
+ {
+ MusECore::Event e = ie->second;
+ if(e.type() != MusECore::Controller)
+ continue;
+ int ctl_num = e.dataA();
+ if((ctl_num | 0xff) == cnum && (ctl_num & 0x7f) == pitch)
+ {
+ used = true;
+ break;
+ }
+ }
+ }
+ off = cl->hwVal() == MusECore::CTRL_VAL_UNKNOWN; // Does it have a value or is it 'off'?
+ if(used && !off)
+ break; // We have all the info we need, done.
+ }
+ }
+
+ if(found)
+ {
+ int rx = r.x() + 1;
+ int ry = r.y() + r.height()/2 - 3;
+ int rw = 6;
+ int rh = 6;
+ if(used)
+ {
+ if(off)
+ p.drawPixmap(rx, ry, rw, rh, *greendot12x12Icon);
+ else
+ p.drawPixmap(rx, ry, rw, rh, *orangedot12x12Icon);
+ }
+ else
+ {
+ if(off)
+ p.drawPixmap(rx, ry, rw, rh, *graydot12x12Icon);
+ else
+ p.drawPixmap(rx, ry, rw, rh, *bluedot12x12Icon);
+ }
+ }
+ }
+ }
+ }
+ }
+ QString str = dm->name;
+ align = Qt::AlignVCenter | Qt::AlignLeft;
+ p.drawText(r.x() + 8, r.y(), r.width() - 8, r.height(), align, str);
+ }
break;
case COL_OUTCHANNEL:
s.setNum(dm->channel+1);
diff --git a/muse2/muse/midiedit/dlist.h b/muse2/muse/midiedit/dlist.h
index 28b4af27..df23a200 100644
--- a/muse2/muse/midiedit/dlist.h
+++ b/muse2/muse/midiedit/dlist.h
@@ -113,7 +113,7 @@ class DPitchEdit: public Awl::PitchEdit
class DList : public View {
Q_OBJECT
-
+
MusEGui::DrumCanvas* dcanvas;
MusECore::DrumMap* ourDrumMap;
int ourDrumMapSize;
diff --git a/muse2/muse/midiedit/drumedit.cpp b/muse2/muse/midiedit/drumedit.cpp
index 5126180f..2ff9448d 100644
--- a/muse2/muse/midiedit/drumedit.cpp
+++ b/muse2/muse/midiedit/drumedit.cpp
@@ -3,6 +3,7 @@
// Linux Music Editor
// $Id: drumedit.cpp,v 1.22.2.21 2009/11/16 11:29:33 lunar_shuttle Exp $
// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+// (C) Copyright 2012 Tim E. Real (terminator356 on users dot sourceforge dot net)
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
@@ -1292,8 +1293,14 @@ void DrumEdit::addCtrlClicked()
{
PopupMenu* pup = new PopupMenu(true); // true = enable stay open. Don't bother with parent.
connect(pup, SIGNAL(triggered(QAction*)), SLOT(ctrlPopupTriggered(QAction*)));
+
+ int cur_instr = curDrumInstrument();
+ // HACK! New drum ctrl canvas current drum index is not the same as the editor current drum index.
+ // Should try to fix this situation - two different values exist. Tim.
+ if(!old_style_drummap_mode())
+ cur_instr = (cur_instr & ~0xff) | get_instrument_map()[cur_instr].pitch;
- int est_width = populateMidiCtrlMenu(pup, parts(), curCanvasPart(), curDrumInstrument());
+ int est_width = populateMidiCtrlMenu(pup, parts(), curCanvasPart(), cur_instr);
QPoint ep = ctrl->mapToGlobal(QPoint(0,0));
//int newx = ep.x() - pup->width(); // Too much! Width says 640. Maybe because it hasn't been shown yet .
diff --git a/muse2/muse/midiedit/drumedit.h b/muse2/muse/midiedit/drumedit.h
index 4b9d391a..2daafd30 100644
--- a/muse2/muse/midiedit/drumedit.h
+++ b/muse2/muse/midiedit/drumedit.h
@@ -3,6 +3,7 @@
// Linux Music Editor
// $Id: drumedit.h,v 1.9.2.7 2009/11/16 11:29:33 lunar_shuttle Exp $
// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+// (C) Copyright 2012 Tim E. Real (terminator356 on users dot sourceforge dot net)
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
diff --git a/muse2/muse/midiedit/piano.cpp b/muse2/muse/midiedit/piano.cpp
index afbf8328..40d93910 100644
--- a/muse2/muse/midiedit/piano.cpp
+++ b/muse2/muse/midiedit/piano.cpp
@@ -3,6 +3,7 @@
// Linux Music Editor
// $Id: piano.cpp,v 1.3 2004/05/31 11:48:55 lunar_shuttle Exp $
// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+// (C) Copyright 2012 Tim E. Real (terminator356 on users dot sourceforge dot net)
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
@@ -25,9 +26,15 @@
#include <stdio.h>
+#include <map>
+
#include "piano.h"
#include "globals.h"
#include "song.h"
+#include "track.h"
+#include "midieditor.h"
+#include "midictrl.h"
+#include "icons.h"
namespace MusEGui {
@@ -438,10 +445,11 @@ static const char *mk8_xpm[] = {
// Piano
//---------------------------------------------------------
-Piano::Piano(QWidget* parent, int ymag)
+Piano::Piano(QWidget* parent, int ymag, MidiEditor* editor)
: View(parent, 1, ymag)
{
setMouseTracking(true);
+ _midiEditor = editor;
curPitch = -1;
_curSelectedPitch = 60; // Start with 'C3"
octave = new QPixmap(oct_xpm);
@@ -537,6 +545,63 @@ void Piano::draw(QPainter& p, const QRect& r)
}
}
+
+ if(!_midiEditor)
+ return;
+ MusECore::PartList* part_list = _midiEditor->parts();
+ MusECore::Part* cur_part = _midiEditor->curCanvasPart();
+ if(!part_list || !cur_part)
+ return;
+
+ MusECore::MidiTrack* track = (MusECore::MidiTrack*)(cur_part->track());
+ int channel = track->outChannel();
+ MusECore::MidiPort* port = &MusEGlobal::midiPorts[track->outPort()];
+ MusECore::MidiCtrlValListList* cll = port->controller();
+ const int min = channel << 24;
+ const int max = min + 0x1000000;
+
+ for(MusECore::ciMidiCtrlValList it = cll->lower_bound(min); it != cll->lower_bound(max); ++it)
+ {
+ MusECore::MidiCtrlValList* cl = it->second;
+ MusECore::MidiController* c = port->midiController(cl->num());
+ if(!c->isPerNoteController())
+ continue;
+ int cnum = c->num();
+ int num = cl->num();
+ int pitch = num & 0x7f;
+ bool used = false;
+ MusECore::EventList* el = cur_part->events();
+ for (MusECore::ciEvent ie = el->begin(); ie != el->end(); ++ie)
+ {
+ MusECore::Event e = ie->second;
+ if(e.type() != MusECore::Controller)
+ continue;
+ int ctl_num = e.dataA();
+ if((ctl_num | 0xff) == cnum && (ctl_num & 0x7f) == pitch)
+ {
+ used = true;
+ break;
+ }
+ }
+
+ bool off = cl->hwVal() == MusECore::CTRL_VAL_UNKNOWN; // Does it have a value or is it 'off'?
+
+ int y = pitch2y(pitch) + 3;
+ if(used)
+ {
+ if(off)
+ p.drawPixmap(0, y, 6, 6, *greendot12x12Icon);
+ else
+ p.drawPixmap(0, y, 6, 6, *orangedot12x12Icon);
+ }
+ else
+ {
+ if(off)
+ p.drawPixmap(0, y, 6, 6, *graydot12x12Icon);
+ else
+ p.drawPixmap(0, y, 6, 6, *bluedot12x12Icon);
+ }
+ }
}
diff --git a/muse2/muse/midiedit/piano.h b/muse2/muse/midiedit/piano.h
index f42037ec..c2044dd4 100644
--- a/muse2/muse/midiedit/piano.h
+++ b/muse2/muse/midiedit/piano.h
@@ -3,6 +3,7 @@
// Linux Music Editor
// $Id: piano.h,v 1.2 2004/05/31 11:48:55 lunar_shuttle Exp $
// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+// (C) Copyright 2012 Tim E. Real (terminator356 on users dot sourceforge dot net)
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
@@ -34,7 +35,9 @@ class QPixmap;
#define KH 13
namespace MusEGui {
-
+
+class MidiEditor;
+
//---------------------------------------------------------
// Piano
//---------------------------------------------------------
@@ -42,7 +45,8 @@ namespace MusEGui {
class Piano : public View
{
Q_OBJECT
-
+
+ MidiEditor* _midiEditor;
int curPitch;
int _curSelectedPitch;
QPixmap* octave;
@@ -83,7 +87,7 @@ class Piano : public View
void setPitch(int);
public:
- Piano(QWidget*, int);
+ Piano(QWidget* parent, int ymag, MidiEditor* editor = 0);
int curSelectedPitch() const { return _curSelectedPitch; }
void setCurSelectedPitch(int pitch);
};
diff --git a/muse2/muse/midiedit/pianoroll.cpp b/muse2/muse/midiedit/pianoroll.cpp
index e4064bd9..0698f5ad 100644
--- a/muse2/muse/midiedit/pianoroll.cpp
+++ b/muse2/muse/midiedit/pianoroll.cpp
@@ -3,6 +3,7 @@
// Linux Music Editor
// $Id: pianoroll.cpp,v 1.25.2.15 2009/11/16 11:29:33 lunar_shuttle Exp $
// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+// (C) Copyright 2012 Tim E. Real (terminator356 on users dot sourceforge dot net)
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
@@ -360,7 +361,7 @@ PianoRoll::PianoRoll(MusECore::PartList* pl, QWidget* parent, const char* name,
gridS1->setSpacing(0);
time = new MusEGui::MTScale(&_raster, split1, xscale);
- piano = new Piano(split1, yscale);
+ piano = new Piano(split1, yscale, this);
canvas = new PianoCanvas(this, split1, xscale, yscale);
vscroll = new MusEGui::ScrollScale(-3, 7, yscale, KH * 75, Qt::Vertical, split1);
setCurDrumInstrument(piano->curSelectedPitch());
diff --git a/muse2/muse/midiedit/pianoroll.h b/muse2/muse/midiedit/pianoroll.h
index 87ea1d3d..65af30a8 100644
--- a/muse2/muse/midiedit/pianoroll.h
+++ b/muse2/muse/midiedit/pianoroll.h
@@ -3,6 +3,7 @@
// Linux Music Editor
// $Id: pianoroll.h,v 1.5.2.4 2009/11/16 11:29:33 lunar_shuttle Exp $
// (C) Copyright 1999 Werner Schweer (ws@seh.de)
+// (C) Copyright 2012 Tim E. Real (terminator356 on users dot sourceforge dot net)
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License