435
414
//---------------------------------------------------------
437
//---------------------------------------------------------
439
EditCAfterDialog::EditCAfterDialog(int tick, const MusECore::Event& event,
441
: EditEventDialog(parent)
443
setWindowTitle(tr("MusE: Enter Channel Aftertouch"));
445
QLabel* l1 = new QLabel(tr("Time Position"));
446
epos = new Awl::PosEdit;
448
QLabel* l2 = new QLabel(tr("Pressure"));
449
il2 = new MusEGui::IntLabel(-1, 0, 127, this, -1);
453
QSlider* slider = new QSlider(Qt::Horizontal);
454
slider->setMinimum(0);
455
slider->setMaximum(127);
456
slider->setPageStep(1);
459
connect(slider, SIGNAL(valueChanged(int)), il2, SLOT(setValue(int)));
460
connect(il2, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));
462
if (!event.empty()) {
463
epos->setValue(tick);
464
il2->setValue(event.dataA());
465
slider->setValue(event.dataA());
468
epos->setValue(tick);
470
slider->setValue(64);
473
layout1->addWidget(l1, 0, 0);
474
layout1->addWidget(epos, 0, 1, Qt::AlignLeft);
475
layout1->addWidget(l2, 1, 0);
476
layout1->addWidget(il2, 1, 1, Qt::AlignLeft);
477
//layout1->addMultiCellWidget(slider, 2, 2, 0, 1);
478
layout1->addWidget(slider, 2, 0, 1, 2);
481
//---------------------------------------------------------
482
// EditCAfterDialog::event
483
//---------------------------------------------------------
485
MusECore::Event EditCAfterDialog::event()
487
MusECore::Event event(MusECore::CAfter);
488
event.setTick(epos->pos().tick());
489
event.setA(il2->value());
493
//---------------------------------------------------------
495
//---------------------------------------------------------
497
EditPAfterDialog::EditPAfterDialog(int tick, const MusECore::Event& event,
499
: EditEventDialog(parent)
501
setWindowTitle(tr("MusE: Enter Poly Aftertouch"));
503
QLabel* l1 = new QLabel(tr("Time Position"));
504
epos = new Awl::PosEdit;
506
QLabel* l2 = new QLabel(tr("Pitch"));
507
pl = new MusEGui::PitchEdit;
508
QLabel* l3 = new QLabel(tr("Pressure"));
509
il2 = new MusEGui::IntLabel(-1, 0, 127, this, -1);
513
QSlider* slider = new QSlider(Qt::Horizontal);
514
slider->setMinimum(0);
515
slider->setMaximum(127);
516
slider->setPageStep(1);
519
connect(slider, SIGNAL(valueChanged(int)), il2, SLOT(setValue(int)));
520
connect(il2, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int)));
522
if (!event.empty()) {
523
epos->setValue(tick);
524
pl->setValue(event.pitch());
525
il2->setValue(event.dataB());
526
slider->setValue(event.dataB());
529
epos->setValue(tick);
532
slider->setValue(64);
535
layout1->addWidget(l1, 0, 0);
536
layout1->addWidget(epos, 0, 1, Qt::AlignLeft);
537
layout1->addWidget(l2, 1, 0);
538
layout1->addWidget(pl, 1, 1, Qt::AlignLeft);
539
layout1->addWidget(l3, 2, 0);
540
layout1->addWidget(il2, 2, 1, Qt::AlignLeft);
541
//layout1->addMultiCellWidget(slider, 3, 3, 0, 1);
542
layout1->addWidget(slider, 3, 0, 1, 2);
545
//---------------------------------------------------------
546
// EditPAfterDialog::event
547
//---------------------------------------------------------
549
MusECore::Event EditPAfterDialog::event()
551
MusECore::Event event(MusECore::PAfter);
552
event.setTick(epos->pos().tick());
553
event.setA(pl->value());
554
event.setB(il2->value());
557
//---------------------------------------------------------
559
416
//---------------------------------------------------------
579
436
MusECore::Event event(MusECore::Controller);
580
437
event.setTick(timePos->pos().tick());
582
if (num == MusECore::CTRL_PROGRAM)
440
QListWidgetItem* item = ctrlList->currentItem();
442
cnum = item->data(Qt::UserRole).toInt();
444
MusECore::MidiTrack* track = part->track();
445
bool isDrum = track->type() == MusECore::Track::DRUM;
446
MusECore::MidiPort* port = &MusEGlobal::midiPorts[track->outPort()];
447
int channel = track->outChannel();
451
if((cnum & 0xff) == 0xff)
453
evnum = (cnum & ~0xff) | (noteSpinBox->value() & 0x7f);
457
MusECore::DrumMap* dm = &MusEGlobal::drumMap[noteSpinBox->value() & 0x7f];
458
num = (cnum & ~0xff) | dm->anote;
459
port = &MusEGlobal::midiPorts[dm->port];
460
channel = dm->channel;
464
MusECore::MidiController* c = port->midiController(cnum);
465
MusECore::MidiCtrlValListList* cll = port->controller();
467
if(cll->find(channel, num) == cll->end())
469
MusECore::MidiCtrlValList* vl = new MusECore::MidiCtrlValList(num);
470
cll->add(channel, vl);
474
if(cnum == MusECore::CTRL_PROGRAM)
476
int hb = hbank->value();
477
int lb = lbank->value();
478
int prog = program->value();
479
if (hb > 0 && hb < 129)
483
if (lb > 0 && lb < 129)
487
if (prog > 0 && prog < 129)
491
int val = (hb << 16) + (lb << 8) + prog;
585
event.setB(valSlider->value() + MusEGlobal::midiPorts[part->track()->outPort()].midiController(num)->bias());
495
event.setB(valSlider->value() + c->bias());
596
506
// QPushButton* buttonNewController;
597
507
//---------------------------------------------------------
515
CI(int n, const QString& ss, bool u, bool o, bool i) : num(n), s(ss), used(u), off(o), instrument(i) {}
599
518
EditCtrlDialog::EditCtrlDialog(int tick, const MusECore::Event& event,
600
519
const MusECore::MidiPart* p, QWidget* parent)
601
520
: QDialog(parent), part(p)
604
523
widgetStack->setAutoFillBackground(true);
607
if (!event.empty()) {
612
///pop = new QMenu(this);
613
//pop->setCheckable(false);//not necessary in Qt4
615
525
MusECore::MidiTrack* track = part->track();
616
int portn = track->outPort();
617
MusECore::MidiPort* port = &MusEGlobal::midiPorts[portn];
526
MusECore::MidiPort* port = &MusEGlobal::midiPorts[track->outPort()];
618
527
bool isDrum = track->type() == MusECore::Track::DRUM;
528
bool isNewDrum = track->type() == MusECore::Track::NEW_DRUM;
529
bool isMidi = track->type() == MusECore::Track::MIDI;
619
530
MusECore::MidiCtrlValListList* cll = port->controller();
531
int channel = track->outChannel();
532
MusECore::MidiInstrument* instr = port->instrument();
533
MusECore::MidiControllerList* mcl = instr->controller();
539
if (!event.empty()) {
540
ev_num = event.dataA();
544
if(port->drumController(ev_num))
548
num = (ev_num & ~0xff) | MusEGlobal::drumMap[ev_num & 0xff].anote;
549
ev_note = ev_num & 0xff;
553
MusECore::MidiController* mc = port->midiController(ev_num);
621
555
ctrlList->clear();
622
556
ctrlList->setSelectionMode(QAbstractItemView::SingleSelection);
625
// populate list of available controller
558
//---------------------------------------------------
559
// build list of midi controllers for current
560
// MusECore::MidiPort/channel
561
//---------------------------------------------------
628
std::list<QString> sList;
629
typedef std::list<QString>::iterator isList;
564
typedef std::list<CI>::iterator isList;
565
std::set<int> already_added_nums;
631
567
for (MusECore::iMidiCtrlValList it = cll->begin(); it != cll->end(); ++it) {
632
568
MusECore::MidiCtrlValList* cl = it->second;
635
// dont show drum specific controller if not a drum track
636
if ((num & 0xff) == 0xff) {
640
MusECore::MidiController* c = port->midiController(num);
569
int ch = it->first >> 24;
572
MusECore::MidiController* c = port->midiController(cl->num());
573
bool isDrumCtrl = (c->isPerNoteController());
574
int show = c->showInTracks();
576
int clnum = cl->num();
642
577
isList i = sList.begin();
643
578
for (; i != sList.end(); ++i) {
647
if (i == sList.end())
648
sList.push_back(c->name());
651
MusECore::MidiController* mc = port->midiController(num);
653
int selectionIndex = 0;
654
for (isList i = sList.begin(); i != sList.end(); ++i, ++idx) {
655
ctrlList->addItem(*i);
656
if (mc->name() == *i)
657
selectionIndex = idx;
659
ctrlList->item(selectionIndex)->setSelected(true);
583
if (i == sList.end()) {
584
bool used = (clnum == num);
585
bool off = cl->hwVal() == MusECore::CTRL_VAL_UNKNOWN; // Does it have a value or is it 'off'?
586
// Filter if not used and off. But if there's something there, we must show it.
589
(((isDrumCtrl || isNewDrum) && !(show & MusECore::MidiController::ShowInDrum)) ||
590
(isMidi && !(show & MusECore::MidiController::ShowInMidi))))
592
bool isinstr = mcl->find(cnum) != mcl->end();
593
// Need to distinguish between global default controllers and
594
// instrument defined controllers. Instrument takes priority over global
595
// ie they 'overtake' definition of a global controller such that the
596
// global def is no longer available.
597
//sList.push_back(CI(num,
598
sList.push_back(CI(cnum,
599
isinstr ? MusECore::midiCtrlNumString(cnum, true) + c->name() : MusECore::midiCtrlName(cnum, true),
600
used, off, isinstr));
601
already_added_nums.insert(num);
605
// Add instrument-defined controllers:
606
QListWidgetItem* sel_item = 0;
607
for (isList i = sList.begin(); i != sList.end(); ++i)
609
// Filter if not used and off. But if there's something there, we must show it.
610
if(!i->instrument && !i->used && i->off)
612
QListWidgetItem* item = new QListWidgetItem(i->s, ctrlList);
613
item->setData(Qt::UserRole, i->num);
614
if(i->num == ev_cnum)
618
ctrlList->setCurrentItem(sel_item);
661
620
valSlider->setRange(mc->minVal(), mc->maxVal());
662
621
valSpinBox->setRange(mc->minVal(), mc->maxVal());
666
625
if(!event.empty())
668
if(num == MusECore::CTRL_PROGRAM)
627
if(ev_num == MusECore::CTRL_PROGRAM)
670
629
widgetStack->setCurrentIndex(1);
675
634
widgetStack->setCurrentIndex(0);
676
635
valSlider->setValue(val - mc->bias());
637
if(mc->isPerNoteController())
639
noteSpinBox->setVisible(true);
640
noteSpinBox->setEnabled(true);
641
noteLabel->setVisible(true);
642
noteLabel->setEnabled(true);
644
noteSpinBox->setValue(ev_note);
648
noteSpinBox->setEnabled(false);
649
noteSpinBox->setVisible(false);
650
noteLabel->setEnabled(false);
651
noteLabel->setVisible(false);
680
ctrlListClicked(ctrlList->selectedItems()[0]);
657
noteSpinBox->setEnabled(false);
658
noteSpinBox->setVisible(false);
659
noteLabel->setEnabled(false);
660
noteLabel->setVisible(false);
662
ctrlListClicked(sel_item);
681
664
connect(ctrlList, SIGNAL(itemClicked(QListWidgetItem*)), SLOT(ctrlListClicked(QListWidgetItem*)));
682
665
connect(buttonNewController, SIGNAL(clicked()), SLOT(newController()));
683
666
connect(hbank, SIGNAL(valueChanged(int)), SLOT(programChanged()));
703
686
MusECore::MidiTrack* track = part->track();
704
687
int portn = track->outPort();
705
688
MusECore::MidiPort* port = &MusEGlobal::midiPorts[portn];
689
bool isDrum = track->type() == MusECore::Track::DRUM;
690
bool isNewDrum = track->type() == MusECore::Track::NEW_DRUM;
691
bool isMidi = track->type() == MusECore::Track::MIDI;
706
692
MusECore::MidiInstrument* instr = port->instrument();
707
693
MusECore::MidiControllerList* mcl = instr->controller();
709
695
MusECore::MidiCtrlValListList* cll = port->controller();
710
696
int channel = track->outChannel();
712
697
for (MusECore::iMidiController ci = mcl->begin(); ci != mcl->end(); ++ci)
714
if(cll->find(channel, ci->second->num()) == cll->end())
716
QAction* act = pup->addAction(ci->second->name());
699
MusECore::MidiController* c = ci->second;
701
int show = c->showInTracks();
702
if(((isDrum || isNewDrum) && !(show & MusECore::MidiController::ShowInDrum)) ||
703
(isMidi && !(show & MusECore::MidiController::ShowInMidi)))
705
// If it's not already in the parent menu...
707
for(; idx < ctrlList->count(); ++idx) {
708
if(ctrlList->item(idx)->data(Qt::UserRole).toInt() == cnum)
711
if(idx >= ctrlList->count()) {
712
QAction* act = pup->addAction(MusECore::midiCtrlNumString(cnum, true) + c->name());
721
QAction* rv = pup->exec(buttonNewController->mapToGlobal(QPoint(0,0)));
723
QString s = rv->text();
717
QAction* act = pup->exec(buttonNewController->mapToGlobal(QPoint(0,0)));
718
if (act && act->data().toInt() != -1) {
719
int rv = act->data().toInt();
724
721
for (MusECore::iMidiController ci = mcl->begin(); ci != mcl->end(); ++ci) {
725
722
MusECore::MidiController* mc = ci->second;
726
if (mc->name() == s) {
727
if(cll->find(channel, mc->num()) == cll->end())
723
if (mc->num() == cnum) {
724
// Create a new controller list if it does not exist.
725
// FIXME: Sorry no per-pitch controller lists created here
726
// (meaning you should only create one 'new' one at a time)
727
// because the user has not had a chance to choose a pitch yet.
728
// They are handled in accept(), where there are more checks and creations.
729
if(!mc->isPerNoteController() && cll->find(channel, rv) == cll->end())
729
MusECore::MidiCtrlValList* vl = new MusECore::MidiCtrlValList(mc->num());
731
MusECore::MidiCtrlValList* vl = new MusECore::MidiCtrlValList(rv);
730
732
cll->add(channel, vl);
733
for (; idx < ctrlList->count() ;++idx) { // p4.0.25 Fix segfault
734
QString str = ctrlList->item(idx)->text();
735
for (; idx < ctrlList->count() ;++idx) {
736
QListWidgetItem* item = ctrlList->item(idx);
737
int item_data = item->data(Qt::UserRole).toInt();
738
if(item_data == cnum)
737
ctrlList->item(idx)->setSelected(true);
738
ctrlListClicked(ctrlList->item(idx));
740
ctrlList->setCurrentItem(item);
741
ctrlListClicked(item);
742
if (idx >= ctrlList->count()) { // p4.0.25 Fix segfault
743
ctrlList->addItem(s);
744
ctrlList->item(idx)->setSelected(true);
745
ctrlListClicked(ctrlList->item(idx));
745
if (idx >= ctrlList->count()) {
746
QListWidgetItem* new_item = new QListWidgetItem(act->text(), ctrlList);
747
new_item->setData(Qt::UserRole, cnum);
748
ctrlList->setCurrentItem(new_item);
749
ctrlListClicked(new_item);
760
762
void EditCtrlDialog::ctrlListClicked(QListWidgetItem* item)
764
QString s(item->text());
766
MusECore::MidiTrack* track = part->track();
767
int portn = track->outPort();
768
MusECore::MidiPort* port = &MusEGlobal::midiPorts[portn];
769
MusECore::MidiCtrlValListList* cll = port->controller();
771
MusECore::iMidiCtrlValList i;
772
for (i = cll->begin(); i != cll->end(); ++i) {
773
MusECore::MidiCtrlValList* cl = i->second;
775
MusECore::MidiController* c = port->midiController(num);
776
if (s == c->name()) {
777
if (num == MusECore::CTRL_PROGRAM) {
778
widgetStack->setCurrentIndex(1);
781
if(val == MusECore::CTRL_VAL_UNKNOWN)
786
widgetStack->setCurrentIndex(0);
787
valSlider->setRange(c->minVal(), c->maxVal());
788
valSpinBox->setRange(c->minVal(), c->maxVal());
789
controllerName->setText(s);
792
if(val == MusECore::CTRL_VAL_UNKNOWN || val == 0)
796
case MusECore::CTRL_PANPOT:
797
val = 64 - c->bias();
799
case MusECore::CTRL_VOLUME:
807
valSlider->setValue(val);
813
printf("controller %s not found!\n", s.toLatin1().constData());
766
int cnum = item->data(Qt::UserRole).toInt();
767
MusECore::MidiTrack* track = part->track();
768
int portn = track->outPort();
769
MusECore::MidiPort* port = &MusEGlobal::midiPorts[portn];
770
MusECore::MidiController* c = port->midiController(cnum);
772
if (cnum == MusECore::CTRL_PROGRAM) {
773
widgetStack->setCurrentIndex(1);
776
if(val == MusECore::CTRL_VAL_UNKNOWN)
781
widgetStack->setCurrentIndex(0);
782
if(c->isPerNoteController())
784
noteSpinBox->setEnabled(true);
785
noteSpinBox->setVisible(true);
786
noteLabel->setEnabled(true);
787
noteLabel->setVisible(true);
791
noteSpinBox->setEnabled(false);
792
noteSpinBox->setVisible(false);
793
noteLabel->setEnabled(false);
794
noteLabel->setVisible(false);
796
valSlider->setRange(c->minVal(), c->maxVal());
797
valSpinBox->setRange(c->minVal(), c->maxVal());
798
controllerName->setText(c->name());
801
if(val == MusECore::CTRL_VAL_UNKNOWN || val == 0)
805
case MusECore::CTRL_PANPOT:
806
val = 64 - c->bias();
808
case MusECore::CTRL_VOLUME:
816
valSlider->setValue(val);
816
820
//---------------------------------------------------------
818
822
//---------------------------------------------------------
820
void EditCtrlDialog::updatePatch()
824
void EditCtrlDialog::updatePatch(int val)
822
826
MusECore::MidiTrack* track = part->track();
823
827
int port = track->outPort();
824
828
int channel = track->outChannel();
825
829
MusECore::MidiInstrument* instr = MusEGlobal::midiPorts[port].instrument();
826
patchName->setText(instr->getPatchName(channel, val, MusEGlobal::song->mtype(), track->type() == MusECore::Track::DRUM));
830
patchName->setText(instr->getPatchName(channel, val, track->isDrumTrack()));
828
832
int hb = ((val >> 16) & 0xff) + 1;