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/dlist.cpp | |
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/dlist.cpp')
-rw-r--r-- | muse2/muse/midiedit/dlist.cpp | 186 |
1 files changed, 184 insertions, 2 deletions
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); |