diff options
author | Tim E. Real <termtech@rogers.com> | 2012-11-12 04:49:31 +0000 |
---|---|---|
committer | Tim E. Real <termtech@rogers.com> | 2012-11-12 04:49:31 +0000 |
commit | be1005a6031861b91e1a2df33f62e1c5a0a2aeb6 (patch) | |
tree | 89152909549c7dd624f4748f394c3adbcbf65b86 /muse2/muse/midiedit | |
parent | 31f618e5461553bd7836677f944acfa233e5ae3c (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.cpp | 2 | ||||
-rw-r--r-- | muse2/muse/midiedit/dcanvas.h | 1 | ||||
-rw-r--r-- | muse2/muse/midiedit/dlist.cpp | 186 | ||||
-rw-r--r-- | muse2/muse/midiedit/dlist.h | 2 | ||||
-rw-r--r-- | muse2/muse/midiedit/drumedit.cpp | 9 | ||||
-rw-r--r-- | muse2/muse/midiedit/drumedit.h | 1 | ||||
-rw-r--r-- | muse2/muse/midiedit/piano.cpp | 67 | ||||
-rw-r--r-- | muse2/muse/midiedit/piano.h | 10 | ||||
-rw-r--r-- | muse2/muse/midiedit/pianoroll.cpp | 3 | ||||
-rw-r--r-- | muse2/muse/midiedit/pianoroll.h | 1 |
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 |