From 7a6952bbdbcf8bd6573543d1c28e6fa75d50d4e4 Mon Sep 17 00:00:00 2001 From: terminator356 Date: Tue, 7 Jan 2014 02:00:22 -0500 Subject: Instrument can now be changed from trackinfo panel. Tweaks, cleanups. Midi instrument can now be changed from midi track info panel. Some minor code tweaks, code cleanup in mtrackinfo.cpp, confmport.cpp. --- muse2/muse/conf.cpp | 2 +- muse2/muse/confmport.cpp | 98 +------ muse2/muse/confmport.h | 4 +- muse2/muse/instruments/minstrument.cpp | 26 +- muse2/muse/instruments/minstrument.h | 3 +- muse2/muse/widgets/mtrackinfo.cpp | 508 ++++++++++++--------------------- muse2/muse/widgets/mtrackinfo.h | 3 +- muse2/muse/widgets/mtrackinfobase.ui | 452 +++++++++++++++-------------- 8 files changed, 448 insertions(+), 648 deletions(-) (limited to 'muse2') diff --git a/muse2/muse/conf.cpp b/muse2/muse/conf.cpp index 56d648ad..2d2a35e2 100644 --- a/muse2/muse/conf.cpp +++ b/muse2/muse/conf.cpp @@ -1625,7 +1625,7 @@ void MidiFileConfig::updateValues() { importDefaultInstr->clear(); for(MusECore::iMidiInstrument i = MusECore::midiInstruments.begin(); i != MusECore::midiInstruments.end(); ++i) - if(!dynamic_cast(*i)) // Sorry, no synths for now. + if(!(*i)->isSynti()) // Sorry, no synths for now. importDefaultInstr->addItem((*i)->iname()); int idx = importDefaultInstr->findText(MusEGlobal::config.importMidiDefaultInstr); if(idx != -1) diff --git a/muse2/muse/confmport.cpp b/muse2/muse/confmport.cpp index b0e68b09..ddd8d2a5 100644 --- a/muse2/muse/confmport.cpp +++ b/muse2/muse/confmport.cpp @@ -297,81 +297,6 @@ void MPConfig::mdevViewItemRenamed(QTableWidgetItem* item) return; switch(col) { - // Enabled: Use editor (Not good - only responds if text changed. We need to respond always). - // Disabled: Use pop-up menu. DELETETHIS? - #if 0 - case DEVCOL_DEF_IN_CHANS: - { - QString id = item->tableWidget()->item(item->row(), DEVCOL_NO)->text(); - int no = atoi(id.toLatin1().constData()) - 1; - if(no < 0 || no >= MIDI_PORTS) - return; - int allch = (1 << MIDI_CHANNELS) - 1; - int ch = allch & string2bitmap(s); - MusEGlobal::midiPorts[no].setDefaultInChannels(ch); - - if(!MusEGlobal::song->midis()->empty() && MusEGlobal::midiPorts[no].device()) // Only if there are tracks, and device is valid. - { - int ret = QMessageBox::question(this, tr("Default input connections"), - tr("Setting will apply to new midi tracks.\n" - "Do you want to apply to all existing midi tracks now?"), - QMessageBox::Yes | QMessageBox::No, - QMessageBox::No); - if(ret == QMessageBox::Yes) - { - MusECore::MidiTrackList* mtl = MusEGlobal::song->midis(); - for(MusECore::iMidiTrack it = mtl->begin(); it != mtl->end(); ++it) - { - // Remove all routes from this port to the tracks first. - MusEGlobal::audio->msgRemoveRoute(MusECore::Route(no, allch), MusECore::Route(*it, allch)); - if(ch) - MusEGlobal::audio->msgAddRoute(MusECore::Route(no, ch), MusECore::Route(*it, ch)); - } - } - } - MusEGlobal::song->update(); - } - break; - #endif - - // Enabled: Use editor (Not good - only responds if text changed. We need to respond always). - // Disabled: Use pop-up menu. - // Only turn on if and when multiple output routes are supported. DELETETHIS? - #if 0 - case DEVCOL_DEF_OUT_CHANS: - { - QString id = item->tableWidget()->item(item->row(), DEVCOL_NO)->text(); - int no = atoi(id.toLatin1().constData()) - 1; - if(no < 0 || no >= MIDI_PORTS) - return; - int allch = (1 << MIDI_CHANNELS) - 1; - int ch = allch & string2bitmap(s); - MusEGlobal::midiPorts[no].setDefaultOutChannels(ch); - - if(!MusEGlobal::song->midis()->empty() && MusEGlobal::midiPorts[no].device()) // Only if there are tracks, and device is valid. - { - int ret = QMessageBox::question(this, tr("Default output connections"), - tr("Setting will apply to new midi tracks.\n" - "Do you want to apply to all existing midi tracks now?"), - QMessageBox::Yes | QMessageBox::No, - QMessageBox::No); - if(ret == QMessageBox::Yes) - { - MusECore::MidiTrackList* mtl = MusEGlobal::song->midis(); - for(MusECore::iMidiTrack it = mtl->begin(); it != mtl->end(); ++it) - { - // Remove all routes from the tracks to this port first. - MusEGlobal::audio->msgRemoveRoute(MusECore::Route(*it, allch), MusECore::Route(no, allch)); - if(ch) - MusEGlobal::audio->msgAddRoute(MusECore::Route(*it, ch), MusECore::Route(no, ch)); - } - } - } - MusEGlobal::song->update(); - } - break; - # endif - case DEVCOL_NAME: { QString id = item->tableWidget()->item(item->row(), DEVCOL_NO)->text(); @@ -652,9 +577,6 @@ void MPConfig::rbClicked(QTableWidgetItem* item) act->setEnabled(!MusEGlobal::song->midis()->empty()); // && MusEGlobal::midiPorts[no].device()); DELETETHIS connect(defpup, SIGNAL(triggered(QAction*)), SLOT(changeDefInputRoutes(QAction*))); - // DELETETHIS 2 - //connect(defpup, SIGNAL(aboutToHide()), MusEGlobal::muse, SLOT(routingPopupMenuAboutToHide())); - //defpup->popup(QCursor::pos()); defpup->exec(QCursor::pos()); delete defpup; defpup = 0; @@ -763,16 +685,12 @@ void MPConfig::rbClicked(QTableWidgetItem* item) for(imap i = mapALSA.begin(); i != mapALSA.end(); ++i) { int idx = i->second; - //if(idx > sz) // Sanity check DELETETHIS 2 - // continue; QString s(i->first.c_str()); MusECore::MidiDevice* md = MusEGlobal::midiDevices.find(s, MusECore::MidiDevice::ALSA_MIDI); if(md) { - //if(!dynamic_cast(md)) DELETETHIS if(md->deviceType() != MusECore::MidiDevice::ALSA_MIDI) continue; - act = pup->addAction(md->name()); act->setData(idx); act->setCheckable(true); @@ -970,20 +888,8 @@ void MPConfig::rbClicked(QTableWidgetItem* item) if (dev && dev->isSynti()) return; if (instrPopup == 0) - instrPopup = new QMenu(this); - instrPopup->clear(); - for (MusECore::iMidiInstrument i = MusECore::midiInstruments.begin(); i - != MusECore::midiInstruments.end(); ++i) - { - // By T356. - // Do not list synths. Although it is possible to assign a synth - // as an instrument to a non-synth device, we should not allow this. - // (One reason is that the 'show gui' column is then enabled, which - // makes no sense for a non-synth device). - MusECore::SynthI* si = dynamic_cast(*i); - if(!si) - instrPopup->addAction((*i)->iname()); - } + instrPopup = new PopupMenu(this); + MusECore::MidiInstrument::populateInstrPopup(instrPopup, port->instrument(), false); QAction* act = instrPopup->exec(ppt); if(!act) diff --git a/muse2/muse/confmport.h b/muse2/muse/confmport.h index 39e29bb6..4b5635ae 100644 --- a/muse2/muse/confmport.h +++ b/muse2/muse/confmport.h @@ -50,8 +50,8 @@ class PopupMenu; class MPConfig : public QDialog, Ui::SynthConfigBase { Q_OBJECT - QMenu* instrPopup; - MusEGui::PopupMenu* defpup; + PopupMenu* instrPopup; + PopupMenu* defpup; int _showAliases; // -1: None. 0: First aliases. 1: Second aliases etc. void setWhatsThis(QTableWidgetItem *item, int col); void setToolTip(QTableWidgetItem *item, int col); diff --git a/muse2/muse/instruments/minstrument.cpp b/muse2/muse/instruments/minstrument.cpp index c119f0bc..ecfc2da4 100644 --- a/muse2/muse/instruments/minstrument.cpp +++ b/muse2/muse/instruments/minstrument.cpp @@ -472,13 +472,13 @@ MType MidiInstrument::midiType() const void MidiInstrument::reset(int portNo) { MusECore::MidiPort* port = &MusEGlobal::midiPorts[portNo]; - if(port->device() == 0) // p4.0.15 + if(port->device() == 0) return; MusECore::MidiPlayEvent ev; ev.setType(0x90); ev.setPort(portNo); - ev.setTime(0); // p4.0.15 + ev.setTime(0); for (int chan = 0; chan < MIDI_CHANNELS; ++chan) { @@ -692,7 +692,7 @@ void SysEx::write(int level, Xml& xml) void MidiInstrument::readMidiState(Xml& xml) { - // p4.0.27 A kludge to support old midistates by wrapping them in the proper header. + // A kludge to support old midistates by wrapping them in the proper header. _tmpMidiStateVersion = 1; // Assume old (unmarked) first version 1. for (;;) { @@ -918,7 +918,6 @@ void MidiInstrument::read(Xml& xml) else if (tag == "Controller") { MidiController* mc = new MidiController(); mc->read(xml); - // Added by Tim. Copied from muse 2. // // HACK: make predefined "Program" controller overloadable // @@ -1040,6 +1039,25 @@ void MidiInstrument::write(int level, Xml& xml) } +//--------------------------------------------------------- +// populateInstrPopup (static) +//--------------------------------------------------------- + +void MidiInstrument::populateInstrPopup(MusEGui::PopupMenu* menu, MidiInstrument* /*current*/, bool show_synths) + { + menu->clear(); + for (MusECore::iMidiInstrument i = MusECore::midiInstruments.begin(); i + != MusECore::midiInstruments.end(); ++i) + { + // Do not list synths. Although it is possible to assign a synth + // as an instrument to a non-synth device, we should not allow this. + // (One reason is that the 'show gui' column is then enabled, which + // makes no sense for a non-synth device). + if(show_synths || !(*i)->isSynti()) + menu->addAction((*i)->iname()); + } + } + //--------------------------------------------------------- // populatePatchPopup //--------------------------------------------------------- diff --git a/muse2/muse/instruments/minstrument.h b/muse2/muse/instruments/minstrument.h index 5a520e67..4f532719 100644 --- a/muse2/muse/instruments/minstrument.h +++ b/muse2/muse/instruments/minstrument.h @@ -202,8 +202,8 @@ class MidiInstrument { const QString& iname() const { return _name; } void setIName(const QString& txt) { _name = txt; } MType midiType() const; + virtual bool isSynti() const { return false; } - //MidiInstrument& uniqueCopy(const MidiInstrument&); // Assign will 'delete' all existing patches and groups from the instrument. MidiInstrument& assign(const MidiInstrument&); QString filePath() const { return _filePath; } @@ -240,6 +240,7 @@ class MidiInstrument { virtual void reset(int); virtual QString getPatchName(int,int,bool) const; virtual void populatePatchPopup(MusEGui::PopupMenu*, int, bool); + static void populateInstrPopup(MusEGui::PopupMenu*, MidiInstrument* current = 0, bool show_synths = false); // Static void read(Xml&); void write(int level, Xml&); diff --git a/muse2/muse/widgets/mtrackinfo.cpp b/muse2/muse/widgets/mtrackinfo.cpp index a73eb212..2872385c 100644 --- a/muse2/muse/widgets/mtrackinfo.cpp +++ b/muse2/muse/widgets/mtrackinfo.cpp @@ -125,6 +125,7 @@ MidiTrackInfo::MidiTrackInfo(QWidget* parent, MusECore::Track* sel_track) : QWid progRecButton->setFocusPolicy(Qt::NoFocus); volRecButton->setFocusPolicy(Qt::NoFocus); panRecButton->setFocusPolicy(Qt::NoFocus); + instrPushButton->setFocusPolicy(Qt::NoFocus); iPatch->setFocusPolicy(Qt::NoFocus); iOutput->setFocusPolicy(Qt::NoFocus); @@ -153,33 +154,7 @@ MidiTrackInfo::MidiTrackInfo(QWidget* parent, MusECore::Track* sel_track) : QWid //trackNameLabel->setSizePolicy(QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Minimum)); if(selected) - { trackNameLabel->setObjectName(selected->cname()); - - /*QPalette pal; - QColor c; - //pal.setColor(trackNameLabel->backgroundRole(), QColor(0, 160, 255)); // Med blue - if(selected->type() == MusECore::Track::DRUM) - c = MusEGlobal::config.drumTrackLabelBg; - else - c = MusEGlobal::config.midiTrackLabelBg; - - QLinearGradient gradient(trackNameLabel->geometry().topLeft(), trackNameLabel->geometry().bottomLeft()); - //gradient.setColorAt(0, c.darker()); - //gradient.setColorAt(0, c); - //gradient.setColorAt(1, c.darker()); - gradient.setColorAt(0, c.lighter()); - gradient.setColorAt(1, c); - //palette.setBrush(QPalette::Button, gradient); - //palette.setBrush(QPalette::Window, gradient); - pal.setBrush(trackNameLabel->backgroundRole(), gradient); - trackNameLabel->setPalette(pal); */ - } - //else - //{ - // pal.setColor(trackNameLabel->backgroundRole(), MusEGlobal::config.midiTrackLabelBg); - // trackNameLabel->setPalette(pal); - //} //trackNameLabel->setStyleSheet(QString("background-color: ") + QColor(0, 160, 255).name()); // Med blue trackNameLabel->setWordWrap(true); @@ -192,18 +167,27 @@ MidiTrackInfo::MidiTrackInfo(QWidget* parent, MusECore::Track* sel_track) : QWid setLabelText(); setLabelFont(); + MusECore::MidiInstrument* minstr = NULL; + MusECore::MidiTrack* track = static_cast(selected); + if(track) + minstr = MusEGlobal::midiPorts[track->outPort()].instrument(); + if(minstr) + { + instrPushButton->setText(minstr->iname()); + if(minstr->isSynti()) + instrPushButton->setEnabled(false); + else + instrPushButton->setEnabled(true); + } + else + instrPushButton->setText(tr("")); + //setSizePolicy(QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding)); - connect(iPatch, SIGNAL(released()), SLOT(instrPopup())); - - //pop = new QMenu(iPatch); - //pop->setCheckable(false); // not needed in Qt4 + connect(instrPushButton, SIGNAL(released()), SLOT(instrPopup())); + connect(iPatch, SIGNAL(released()), SLOT(patchPopup())); - // Removed by Tim. p3.3.9 - //connect(iName, SIGNAL(returnPressed()), SLOT(iNameChanged())); - connect(iOutputChannel, SIGNAL(valueChanged(int)), SLOT(iOutputChannelChanged(int))); - ///connect(iInputChannel, SIGNAL(textChanged(const QString&)), SLOT(iInputChannelChanged(const QString&))); connect(iHBank, SIGNAL(valueChanged(int)), SLOT(iProgHBankChanged())); connect(iLBank, SIGNAL(valueChanged(int)), SLOT(iProgLBankChanged())); connect(iProgram, SIGNAL(valueChanged(int)), SLOT(iProgramChanged())); @@ -220,7 +204,6 @@ MidiTrackInfo::MidiTrackInfo(QWidget* parent, MusECore::Track* sel_track) : QWid connect(iPan, SIGNAL(valueChanged(int)), SLOT(iPanChanged(int))); connect(iPan, SIGNAL(ctrlDoubleClicked()), SLOT(iPanDoubleClicked())); connect(iOutput, SIGNAL(activated(int)), SLOT(iOutputPortChanged(int))); - ///connect(iInput, SIGNAL(textChanged(const QString&)), SLOT(iInputPortChanged(const QString&))); connect(recordButton, SIGNAL(clicked()), SLOT(recordClicked())); connect(progRecButton, SIGNAL(clicked()), SLOT(progRecClicked())); connect(volRecButton, SIGNAL(clicked()), SLOT(volRecClicked())); @@ -259,11 +242,6 @@ MidiTrackInfo::MidiTrackInfo(QWidget* parent, MusECore::Track* sel_track) : QWid connect(iLen, SIGNAL(escapePressed()), SIGNAL(escapePressed())); connect(iKompr, SIGNAL(escapePressed()), SIGNAL(escapePressed())); connect(iPan, SIGNAL(escapePressed()), SIGNAL(escapePressed())); - - // TODO: Works OK, but disabled for now, until we figure out what to do about multiple out routes and display values... - // Enabled (for Midi Port to Audio Input routing). p4.0.14 Tim. - //oRButton->setEnabled(false); - //oRButton->setVisible(false); connect(oRButton, SIGNAL(pressed()), SLOT(outRoutesPressed())); connect(MusEGlobal::song, SIGNAL(songChanged(MusECore::SongChangedFlags_t)), SLOT(songChanged(MusECore::SongChangedFlags_t))); @@ -278,7 +256,6 @@ MidiTrackInfo::MidiTrackInfo(QWidget* parent, MusECore::Track* sel_track) : QWid void MidiTrackInfo::heartBeat() { - ///if(!showTrackinfoFlag || !selected) if(_blockHeartbeatCount < 0) // error { fprintf(stderr, "ERROR: MidiTrackInfo::heartBeat: _blockHeartbeatCount is < 0, resetting to 0\n"); @@ -297,81 +274,44 @@ void MidiTrackInfo::heartBeat() int outChannel = track->outChannel(); int outPort = track->outPort(); - ///int ichMask = track->inChannelMask(); - //int iptMask = track->inPortMask(); - ///unsigned int iptMask = track->inPortMask(); - MusECore::MidiPort* mp = &MusEGlobal::midiPorts[outPort]; - // Set record echo. - //if(recEchoButton->isChecked() != track->recEcho()) - //{ - // recEchoButton->blockSignals(true); - // recEchoButton->setChecked(track->recEcho()); - // recEchoButton->blockSignals(false); - //} - // Check for detection of midi general activity on chosen channels... int mpt = 0; - //int mch = 0; MusECore::RouteList* rl = track->inRoutes(); MusECore::ciRoute r = rl->begin(); - //for( ; mpt < MIDI_PORTS; ++mpt) for( ; r != rl->end(); ++r) { - //if(!r->isValid() || ((r->type != Route::ALSA_MIDI_ROUTE) && (r->type != Route::JACK_MIDI_ROUTE))) - //if(!r->isValid() || (r->type != Route::MIDI_DEVICE_ROUTE)) - if(!r->isValid() || (r->type != MusECore::Route::MIDI_PORT_ROUTE)) // p3.3.49 + if(!r->isValid() || (r->type != MusECore::Route::MIDI_PORT_ROUTE)) continue; // NOTE: TODO: Code for channelless events like sysex, ** IF we end up using the 'special channel 17' method. //if(r->channel == -1) - if(r->channel == -1 || r->channel == 0) // p3.3.50 + if(r->channel == -1 || r->channel == 0) continue; // No port assigned to the device? - //mpt = r->device->midiPort(); - mpt = r->midiPort; // p3.3.49 + mpt = r->midiPort; if(mpt < 0 || mpt >= MIDI_PORTS) continue; - //for(; mch < MIDI_CHANNELS; ++mch) - //{ - //if(MusEGlobal::midiPorts[mpt].syncInfo().actDetect(mch) && (iptMask & (1 << mpt)) && (ichMask & (1 << mch)) ) - //if((iptMask & bitShiftLU[mpt]) && (MusEGlobal::midiPorts[mpt].syncInfo().actDetectBits() & ichMask) ) - //if(MusEGlobal::midiPorts[mpt].syncInfo().actDetectBits() & bitShiftLU[r->channel]) - if(MusEGlobal::midiPorts[mpt].syncInfo().actDetectBits() & r->channel) // p3.3.50 Use new channel mask. + if(MusEGlobal::midiPorts[mpt].syncInfo().actDetectBits() & r->channel) + { + if(!_midiDetect) { - //if(iChanTextLabel->paletteBackgroundColor() != green) - // iChanTextLabel->setPaletteBackgroundColor(green); - //if(iChanDetectLabel->pixmap() != greendotIcon) - if(!_midiDetect) - { - //printf("Arranger::midiTrackInfoHeartBeat setting green icon\n"); - - _midiDetect = true; - //iChanDetectLabel->setPixmap(*greendotIcon); - iChanDetectLabel->setPixmap(*redLedIcon); - } - break; - } - //} + _midiDetect = true; + iChanDetectLabel->setPixmap(*redLedIcon); + } + break; + } } // No activity detected? - //if(mch == MIDI_CHANNELS) - //if(mpt == MIDI_PORTS) if(r == rl->end()) { - //if(iChanTextLabel->paletteBackgroundColor() != darkGreen) - // iChanTextLabel->setPaletteBackgroundColor(darkGreen); - //if(iChanDetectLabel->pixmap() != darkgreendotIcon) if(_midiDetect) { - //printf("Arranger::midiTrackInfoHeartBeat setting darkgreen icon\n"); - _midiDetect = false; - //iChanDetectLabel->setPixmap(*darkgreendotIcon); iChanDetectLabel->setPixmap(*darkRedLedIcon); } } @@ -381,8 +321,6 @@ void MidiTrackInfo::heartBeat() { if(program != MusECore::CTRL_VAL_UNKNOWN) { - //printf("Arranger::midiTrackInfoHeartBeat setting program to unknown\n"); - program = MusECore::CTRL_VAL_UNKNOWN; if(iHBank->value() != 0) { @@ -427,7 +365,7 @@ void MidiTrackInfo::heartBeat() } else { - // p4.0.27 The optimizing below, to avoid repeatedly calling getPatchName, generally worked OK. + // The optimizing below, to avoid repeatedly calling getPatchName, generally worked OK. // But Fluidsynth revealed a flaw. When loading a song, updateTrackInfo is called which correctly // sets program = nprogram. But a synth will not receive midistate sysexes until later. // With Fluidsynth, that messed up our optimizing because the soundfont has not loaded yet. @@ -447,30 +385,20 @@ void MidiTrackInfo::heartBeat() { program = nprogram; - //int hb, lb, pr; - //if (program == MusECore::CTRL_VAL_UNKNOWN) { - // hb = lb = pr = 0; - // iPatch->setText("---"); - // } - //else - //{ - MusECore::MidiInstrument* instr = mp->instrument(); - const QString name = instr->getPatchName(outChannel, program, track->isDrumTrack()); - if(iPatch->text() != name) - iPatch->setText(name); - - int hb = ((program >> 16) & 0xff) + 1; - if (hb == 0x100) - hb = 0; - int lb = ((program >> 8) & 0xff) + 1; - if (lb == 0x100) - lb = 0; - int pr = (program & 0xff) + 1; - if (pr == 0x100) - pr = 0; - //} - - //printf("Arranger::midiTrackInfoHeartBeat setting program\n"); + MusECore::MidiInstrument* instr = mp->instrument(); + const QString name = instr->getPatchName(outChannel, program, track->isDrumTrack()); + if(iPatch->text() != name) + iPatch->setText(name); + + int hb = ((program >> 16) & 0xff) + 1; + if (hb == 0x100) + hb = 0; + int lb = ((program >> 8) & 0xff) + 1; + if (lb == 0x100) + lb = 0; + int pr = (program & 0xff) + 1; + if (pr == 0x100) + pr = 0; if(iHBank->value() != hb) { @@ -498,12 +426,7 @@ void MidiTrackInfo::heartBeat() int mn = mc->minVal(); int v = mp->hwCtrlState(outChannel, MusECore::CTRL_VOLUME); if(v == MusECore::CTRL_VAL_UNKNOWN) - //{ - //v = mc->initVal(); - //if(v == MusECore::CTRL_VAL_UNKNOWN) - // v = 0; v = mn - 1; - //} else // Auto bias... v -= mc->bias(); @@ -512,10 +435,7 @@ void MidiTrackInfo::heartBeat() volume = v; if(iLautst->value() != v) { - //printf("Arranger::midiTrackInfoHeartBeat setting volume\n"); - iLautst->blockSignals(true); - //iLautst->setRange(mn - 1, mc->maxVal()); iLautst->setValue(v); iLautst->blockSignals(false); } @@ -525,12 +445,7 @@ void MidiTrackInfo::heartBeat() mn = mc->minVal(); v = mp->hwCtrlState(outChannel, MusECore::CTRL_PANPOT); if(v == MusECore::CTRL_VAL_UNKNOWN) - //{ - //v = mc->initVal(); - //if(v == MusECore::CTRL_VAL_UNKNOWN) - // v = 0; v = mn - 1; - //} else // Auto bias... v -= mc->bias(); @@ -539,31 +454,11 @@ void MidiTrackInfo::heartBeat() pan = v; if(iPan->value() != v) { - //printf("Arranger::midiTrackInfoHeartBeat setting pan\n"); - iPan->blockSignals(true); - //iPan->setRange(mn - 1, mc->maxVal()); iPan->setValue(v); iPan->blockSignals(false); } } - - // Does it include a midi controller value adjustment? Then handle it... - //if(flags & SC_MIDI_CONTROLLER) - // seek(); - - /* - if(iTransp->value() != track->transposition) - iTransp->setValue(track->transposition); - if(iAnschl->value() != track->velocity) - iAnschl->setValue(track->velocity); - if(iVerz->value() != track->delay) - iVerz->setValue(track->delay); - if(iLen->value() != track->len) - iLen->setValue(track->len); - if(iKompr->value() != track->compression) - iKompr->setValue(track->compression); - */ } break; @@ -583,8 +478,6 @@ void MidiTrackInfo::heartBeat() void MidiTrackInfo::configChanged() { - //printf("MidiTrackInfo::configChanged\n"); - //if (MusEGlobal::config.canvasBgPixmap.isEmpty()) { // canvas->setBg(MusEGlobal::config.partCanvasBg); // canvas->setBg(QPixmap()); @@ -629,7 +522,6 @@ void MidiTrackInfo::setLabelText() { QPalette pal; QColor c; - //pal.setColor(trackNameLabel->backgroundRole(), QColor(0, 160, 255)); // Med blue if(track->type() == MusECore::Track::DRUM) c = MusEGlobal::config.drumTrackLabelBg; else if (track->type() == MusECore::Track::MIDI) @@ -640,14 +532,9 @@ void MidiTrackInfo::setLabelText() printf("THIS SHOULD NEVER HAPPEN: track is not a MIDI track in MidiTrackInfo::setLabelText()!\n"); QLinearGradient gradient(trackNameLabel->geometry().topLeft(), trackNameLabel->geometry().bottomLeft()); - //gradient.setColorAt(0, c.darker()); - //gradient.setColorAt(0, c); - //gradient.setColorAt(1, c.darker()); gradient.setColorAt(0, c); gradient.setColorAt(0.5, c.lighter()); gradient.setColorAt(1, c); - //palette.setBrush(QPalette::Button, gradient); - //palette.setBrush(QPalette::Window, gradient); pal.setBrush(trackNameLabel->backgroundRole(), gradient); trackNameLabel->setPalette(pal); } @@ -659,10 +546,6 @@ void MidiTrackInfo::setLabelText() void MidiTrackInfo::setLabelFont() { - //if(!selected) - // return; - //MusECore::MidiTrack* track = (MusECore::MidiTrack*)selected; - // Use the new font #6 I created just for these labels (so far). // Set the label's font. trackNameLabel->setFont(MusEGlobal::config.fonts[6]); @@ -686,8 +569,8 @@ void MidiTrackInfo::iOutputChannelChanged(int channel) track->setOutChanAndUpdate(channel); MusEGlobal::audio->msgIdle(false); - MusEGlobal::audio->msgUpdateSoloStates(); // p4.0.14 - MusEGlobal::song->update(SC_MIDI_TRACK_PROP); // + MusEGlobal::audio->msgUpdateSoloStates(); + MusEGlobal::song->update(SC_MIDI_TRACK_PROP); --_blockHeartbeatCount; } } @@ -711,8 +594,8 @@ void MidiTrackInfo::iOutputPortChanged(int index) track->setOutPortAndUpdate(port_num); MusEGlobal::audio->msgIdle(false); - MusEGlobal::audio->msgUpdateSoloStates(); // p4.0.14 - MusEGlobal::song->update(SC_MIDI_TRACK_PROP); // + MusEGlobal::audio->msgUpdateSoloStates(); + MusEGlobal::song->update(SC_MIDI_TRACK_PROP); --_blockHeartbeatCount; } @@ -727,7 +610,6 @@ void MidiTrackInfo::inRoutesPressed() if(!selected->isMidiTrack()) return; - //RoutePopupMenu* pup = MusEGlobal::muse->getRoutingPopupMenu(); RoutePopupMenu* pup = new RoutePopupMenu(); pup->exec(QCursor::pos(), selected, false); delete pup; @@ -745,7 +627,6 @@ void MidiTrackInfo::outRoutesPressed() if(!selected->isMidiTrack()) return; - //RoutePopupMenu* pup = MusEGlobal::muse->getRoutingPopupMenu(); RoutePopupMenu* pup = new RoutePopupMenu(); pup->exec(QCursor::pos(), selected, true); delete pup; @@ -1128,13 +1009,11 @@ void MidiTrackInfo::iPanChanged(int val) } //--------------------------------------------------------- -// instrPopupActivated +// patchPopupActivated //--------------------------------------------------------- -void MidiTrackInfo::instrPopupActivated(QAction* act) +void MidiTrackInfo::patchPopupActivated(QAction* act) { - //printf("MidiTrackInfo::instrPopupActivated\n"); - if(act && selected) { int rv = act->data().toInt(); @@ -1157,6 +1036,46 @@ void MidiTrackInfo::instrPopupActivated(QAction* act) //--------------------------------------------------------- void MidiTrackInfo::instrPopup() + { + if(!selected) + return; + MusECore::MidiTrack* track = static_cast(selected); + int port = track->outPort(); + MusECore::MidiInstrument* instr = MusEGlobal::midiPorts[port].instrument(); + PopupMenu* pup = new PopupMenu(false); + + MusECore::MidiInstrument::populateInstrPopup(pup, instr, false); + + if(pup->actions().count() == 0) + { + delete pup; + return; + } + + QAction *act = pup->exec(instrPushButton->mapToGlobal(QPoint(10,5))); + if(act) + { + QString s = act->text(); + for (MusECore::iMidiInstrument i = MusECore::midiInstruments.begin(); i != MusECore::midiInstruments.end(); ++i) + { + if((*i)->iname() == s) + { + MusEGlobal::midiPorts[port].setInstrument(*i); + // Make sure device initializations are sent if necessary. + MusEGlobal::audio->msgInitMidiDevices(false); // false = Don't force + MusEGlobal::song->update(); + break; + } + } + } + delete pup; + } + +//--------------------------------------------------------- +// patchPopup +//--------------------------------------------------------- + +void MidiTrackInfo::patchPopup() { if(!selected) return; @@ -1174,8 +1093,7 @@ void MidiTrackInfo::instrPopup() return; } - connect(pup, SIGNAL(triggered(QAction*)), SLOT(instrPopupActivated(QAction*))); - //connect(pup, SIGNAL(hovered(QAction*)), SLOT(instrPopupActivated(QAction*))); + connect(pup, SIGNAL(triggered(QAction*)), SLOT(patchPopupActivated(QAction*))); QAction *act = pup->exec(iPatch->mapToGlobal(QPoint(10,5))); if(act) @@ -1234,20 +1152,10 @@ void MidiTrackInfo::iProgHBankDoubleCLicked() if(lastv == MusECore::CTRL_VAL_UNKNOWN) { int kiv = mctl->initVal(); - //int kiv = lrint(_knob->value()); if(kiv == MusECore::CTRL_VAL_UNKNOWN) kiv = 0; - //else - //{ - //if(kiv < mctrl->minVal()) - // kiv = mctrl->minVal(); - //if(kiv > mctrl->maxVal()) - // kiv = mctrl->maxVal(); - //kiv += mctrl->bias(); - //} ++_blockHeartbeatCount; - //MusECore::MidiPlayEvent ev(0, port, chan, MusECore::ME_CONTROLLER, num, kiv); MusECore::MidiPlayEvent ev(0, port, chan, MusECore::ME_CONTROLLER, MusECore::CTRL_PROGRAM, kiv); MusEGlobal::audio->msgPlayMidiEvent(&ev); --_blockHeartbeatCount; @@ -1290,8 +1198,6 @@ void MidiTrackInfo::iProgHBankDoubleCLicked() MusEGlobal::audio->msgSetHwCtrlState(mp, chan, MusECore::CTRL_PROGRAM, MusECore::CTRL_VAL_UNKNOWN); --_blockHeartbeatCount; } -// MusECore::MidiPlayEvent ev(0, port, chan, MusECore::ME_CONTROLLER, MusECore::CTRL_PROGRAM, curv); -// MusEGlobal::audio->msgPlayMidiEvent(&ev); } MusEGlobal::song->update(SC_MIDI_CONTROLLER); @@ -1324,17 +1230,8 @@ void MidiTrackInfo::iProgLBankDoubleCLicked() if(lastv == MusECore::CTRL_VAL_UNKNOWN) { int kiv = mctl->initVal(); - //int kiv = lrint(_knob->value()); if(kiv == MusECore::CTRL_VAL_UNKNOWN) kiv = 0xff0000; - //else - //{ - //if(kiv < mctrl->minVal()) - // kiv = mctrl->minVal(); - //if(kiv > mctrl->maxVal()) - // kiv = mctrl->maxVal(); - //kiv += mctrl->bias(); - //} //MusECore::MidiPlayEvent ev(0, port, chan, MusECore::ME_CONTROLLER, num, kiv); MusECore::MidiPlayEvent ev(0, port, chan, MusECore::ME_CONTROLLER, MusECore::CTRL_PROGRAM, kiv); @@ -1420,19 +1317,9 @@ void MidiTrackInfo::iProgramDoubleClicked() if(lastv == MusECore::CTRL_VAL_UNKNOWN) { int kiv = mctl->initVal(); - //int kiv = lrint(_knob->value()); if(kiv == MusECore::CTRL_VAL_UNKNOWN) kiv = 0xffff00; - //else - //{ - //if(kiv < mctrl->minVal()) - // kiv = mctrl->minVal(); - //if(kiv > mctrl->maxVal()) - // kiv = mctrl->maxVal(); - //kiv += mctrl->bias(); - //} - //MusECore::MidiPlayEvent ev(0, port, chan, MusECore::ME_CONTROLLER, num, kiv); MusECore::MidiPlayEvent ev(0, port, chan, MusECore::ME_CONTROLLER, MusECore::CTRL_PROGRAM, kiv); MusEGlobal::audio->msgPlayMidiEvent(&ev); } @@ -1478,7 +1365,6 @@ void MidiTrackInfo::iLautstDoubleClicked() if(lastv == MusECore::CTRL_VAL_UNKNOWN) { int kiv = mctl->initVal(); - //int kiv = lrint(_knob->value()); if(kiv == MusECore::CTRL_VAL_UNKNOWN) // Set volume to 78% of range, so that if range is 0 - 127, then value is 100. kiv = lround(double(mctl->maxVal() - mctl->minVal()) * 0.7874); @@ -1536,7 +1422,6 @@ void MidiTrackInfo::iPanDoubleClicked() if(lastv == MusECore::CTRL_VAL_UNKNOWN) { int kiv = mctl->initVal(); - //int kiv = lrint(_knob->value()); if(kiv == MusECore::CTRL_VAL_UNKNOWN) // Set volume to 50% of range, so that if range is 0 - 127, then value is 64. kiv = lround(double(mctl->maxVal() - mctl->minVal()) * 0.5); @@ -1608,22 +1493,17 @@ void MidiTrackInfo::updateTrackInfo(MusECore::SongChangedFlags_t flags) iKompr->blockSignals(false); int outChannel = track->outChannel(); - ///int inChannel = track->inChannelMask(); int outPort = track->outPort(); - //int inPort = track->inPortMask(); - ///unsigned int inPort = track->inPortMask(); iOutput->blockSignals(true); - //iInput->clear(); iOutput->clear(); int item_idx = 0; for (int i = 0; i < MIDI_PORTS; ++i) { MusECore::MidiDevice* md = MusEGlobal::midiPorts[i].device(); - if(!md) // In the case of this combo box, don't bother listing empty ports. p4.0.41 + if(!md) // In the case of this combo box, don't bother listing empty ports. continue; - //if(!(md->rwFlags() & 1 || md->isSynti()) && (i != outPort)) - if(!(md->rwFlags() & 1) && (i != outPort)) // Only writeable ports, or current one. p4.0.41 + if(!(md->rwFlags() & 1) && (i != outPort)) // Only writeable ports, or current one. continue; QString name; name.sprintf("%d:%s", i+1, MusEGlobal::midiPorts[i].portname().toLatin1().constData()); @@ -1634,21 +1514,21 @@ void MidiTrackInfo::updateTrackInfo(MusECore::SongChangedFlags_t flags) } iOutput->blockSignals(false); - //iInput->setText(bitmap2String(inPort)); - ///iInput->setText(u32bitmap2String(inPort)); - - //iInputChannel->setText(bitmap2String(inChannel)); - - // Removed by Tim. p3.3.9 - //if (iName->text() != selected->name()) { - // iName->setText(selected->name()); - // iName->home(false); - // } + MusECore::MidiInstrument* minstr = MusEGlobal::midiPorts[outPort].instrument(); + if(minstr) + { + instrPushButton->setText(minstr->iname()); + if(minstr->isSynti()) + instrPushButton->setEnabled(false); + else + instrPushButton->setEnabled(true); + } + else + instrPushButton->setText(tr("")); iOutputChannel->blockSignals(true); iOutputChannel->setValue(outChannel+1); iOutputChannel->blockSignals(false); - ///iInputChannel->setText(bitmap2String(inChannel)); // Set record echo. if(recEchoButton->isChecked() != track->recEcho()) @@ -1658,112 +1538,91 @@ void MidiTrackInfo::updateTrackInfo(MusECore::SongChangedFlags_t flags) recEchoButton->blockSignals(false); } recEchoButton->setIcon(track->recEcho() ? QIcon(*midiThruOnIcon) : QIcon(*midiThruOffIcon)); - //recEchoButton->setIconSize(midiThruOnIcon->size()); } - int outChannel = track->outChannel(); - int outPort = track->outPort(); - MusECore::MidiPort* mp = &MusEGlobal::midiPorts[outPort]; - int nprogram = mp->hwCtrlState(outChannel, MusECore::CTRL_PROGRAM); + int outChannel = track->outChannel(); + int outPort = track->outPort(); + MusECore::MidiPort* mp = &MusEGlobal::midiPorts[outPort]; + int nprogram = mp->hwCtrlState(outChannel, MusECore::CTRL_PROGRAM); + if(nprogram == MusECore::CTRL_VAL_UNKNOWN) + { + iHBank->blockSignals(true); + iLBank->blockSignals(true); + iProgram->blockSignals(true); + iHBank->setValue(0); + iLBank->setValue(0); + iProgram->setValue(0); + iHBank->blockSignals(false); + iLBank->blockSignals(false); + iProgram->blockSignals(false); + + program = MusECore::CTRL_VAL_UNKNOWN; + nprogram = mp->lastValidHWCtrlState(outChannel, MusECore::CTRL_PROGRAM); if(nprogram == MusECore::CTRL_VAL_UNKNOWN) - { - iHBank->blockSignals(true); - iLBank->blockSignals(true); - iProgram->blockSignals(true); - iHBank->setValue(0); - iLBank->setValue(0); - iProgram->setValue(0); - iHBank->blockSignals(false); - iLBank->blockSignals(false); - iProgram->blockSignals(false); - - program = MusECore::CTRL_VAL_UNKNOWN; - nprogram = mp->lastValidHWCtrlState(outChannel, MusECore::CTRL_PROGRAM); - if(nprogram == MusECore::CTRL_VAL_UNKNOWN) - //iPatch->setText(QString("")); - iPatch->setText(tr("")); - else - { - MusECore::MidiInstrument* instr = mp->instrument(); - iPatch->setText(instr->getPatchName(outChannel, nprogram, track->isDrumTrack())); - } - } + iPatch->setText(tr("")); else - //if (program != nprogram) { - program = nprogram; + MusECore::MidiInstrument* instr = mp->instrument(); + iPatch->setText(instr->getPatchName(outChannel, nprogram, track->isDrumTrack())); + } + } + else + { + program = nprogram; - //int hb, lb, pr; - //if (program == MusECore::CTRL_VAL_UNKNOWN) { - // hb = lb = pr = 0; - // iPatch->setText("---"); - // } - //else - //{ - MusECore::MidiInstrument* instr = mp->instrument(); - iPatch->setText(instr->getPatchName(outChannel, program, track->isDrumTrack())); - - int hb = ((program >> 16) & 0xff) + 1; - if (hb == 0x100) - hb = 0; - int lb = ((program >> 8) & 0xff) + 1; - if (lb == 0x100) - lb = 0; - int pr = (program & 0xff) + 1; - if (pr == 0x100) - pr = 0; - //} - iHBank->blockSignals(true); - iLBank->blockSignals(true); - iProgram->blockSignals(true); - - iHBank->setValue(hb); - iLBank->setValue(lb); - iProgram->setValue(pr); - - iHBank->blockSignals(false); - iLBank->blockSignals(false); - iProgram->blockSignals(false); - } - - MusECore::MidiController* mc = mp->midiController(MusECore::CTRL_VOLUME); - int mn = mc->minVal(); - int v = mp->hwCtrlState(outChannel, MusECore::CTRL_VOLUME); - volume = v; - if(v == MusECore::CTRL_VAL_UNKNOWN) - //{ - //v = mc->initVal(); - //if(v == MusECore::CTRL_VAL_UNKNOWN) - // v = 0; - v = mn - 1; - //} - else - // Auto bias... - v -= mc->bias(); - iLautst->blockSignals(true); - iLautst->setRange(mn - 1, mc->maxVal()); - iLautst->setValue(v); - iLautst->blockSignals(false); - - mc = mp->midiController(MusECore::CTRL_PANPOT); - mn = mc->minVal(); - v = mp->hwCtrlState(outChannel, MusECore::CTRL_PANPOT); - pan = v; - if(v == MusECore::CTRL_VAL_UNKNOWN) - //{ - //v = mc->initVal(); - //if(v == MusECore::CTRL_VAL_UNKNOWN) - // v = 0; - v = mn - 1; - //} - else - // Auto bias... - v -= mc->bias(); - iPan->blockSignals(true); - iPan->setRange(mn - 1, mc->maxVal()); - iPan->setValue(v); - iPan->blockSignals(false); - //} + MusECore::MidiInstrument* instr = mp->instrument(); + iPatch->setText(instr->getPatchName(outChannel, program, track->isDrumTrack())); + + int hb = ((program >> 16) & 0xff) + 1; + if (hb == 0x100) + hb = 0; + int lb = ((program >> 8) & 0xff) + 1; + if (lb == 0x100) + lb = 0; + int pr = (program & 0xff) + 1; + if (pr == 0x100) + pr = 0; + + iHBank->blockSignals(true); + iLBank->blockSignals(true); + iProgram->blockSignals(true); + + iHBank->setValue(hb); + iLBank->setValue(lb); + iProgram->setValue(pr); + + iHBank->blockSignals(false); + iLBank->blockSignals(false); + iProgram->blockSignals(false); + } + + MusECore::MidiController* mc = mp->midiController(MusECore::CTRL_VOLUME); + int mn = mc->minVal(); + int v = mp->hwCtrlState(outChannel, MusECore::CTRL_VOLUME); + volume = v; + if(v == MusECore::CTRL_VAL_UNKNOWN) + v = mn - 1; + else + // Auto bias... + v -= mc->bias(); + iLautst->blockSignals(true); + iLautst->setRange(mn - 1, mc->maxVal()); + iLautst->setValue(v); + iLautst->blockSignals(false); + + mc = mp->midiController(MusECore::CTRL_PANPOT); + mn = mc->minVal(); + v = mp->hwCtrlState(outChannel, MusECore::CTRL_PANPOT); + pan = v; + if(v == MusECore::CTRL_VAL_UNKNOWN) + v = mn - 1; + else + // Auto bias... + v -= mc->bias(); + iPan->blockSignals(true); + iPan->setRange(mn - 1, mc->maxVal()); + iPan->setValue(v); + iPan->blockSignals(false); --_blockHeartbeatCount; } @@ -1888,7 +1747,6 @@ void MidiTrackInfo::recordClicked() void MidiTrackInfo::resizeEvent(QResizeEvent* ev) { - //printf("MidiTrackInfo::resizeEvent\n"); QWidget::resizeEvent(ev); setLabelText(); setLabelFont(); diff --git a/muse2/muse/widgets/mtrackinfo.h b/muse2/muse/widgets/mtrackinfo.h index bb14423d..7a992a8c 100644 --- a/muse2/muse/widgets/mtrackinfo.h +++ b/muse2/muse/widgets/mtrackinfo.h @@ -66,6 +66,7 @@ class MidiTrackInfo : public QWidget, public Ui::MidiTrackInfoBase void iKomprChanged(int); void iPanChanged(int); void iPanDoubleClicked(); + void patchPopup(); void instrPopup(); void recordClicked(); void progRecClicked(); @@ -74,7 +75,7 @@ class MidiTrackInfo : public QWidget, public Ui::MidiTrackInfoBase void recEchoToggled(bool); void inRoutesPressed(); void outRoutesPressed(); - void instrPopupActivated(QAction*); + void patchPopupActivated(QAction*); protected slots: virtual void heartBeat(); diff --git a/muse2/muse/widgets/mtrackinfobase.ui b/muse2/muse/widgets/mtrackinfobase.ui index f566d207..94bff6e2 100644 --- a/muse2/muse/widgets/mtrackinfobase.ui +++ b/muse2/muse/widgets/mtrackinfobase.ui @@ -6,8 +6,8 @@ 0 0 - 94 - 417 + 93 + 437 @@ -59,16 +59,103 @@ 0 - - + + - + + 0 + 0 + + + + false + + + off + + + -127 + + + 127 + + + 1 + + + + + + + 0 0 + + false + + + % + + + 25 + + + 200 + + + 100 + + + + + + + + 0 + 0 + + + + Out ch + - true + false + + + 0 + + + 1 + + + + + + + + 0 + 0 + + + + + 8 + 5 + + + + false + + + -127 + + + 127 + + + 0 @@ -85,54 +172,42 @@ - - + + 0 0 - - output channel - - - all midi events are sent to this output channel - false + + off + - 1 + -1000 - 16 + 1000 - - + + - + 0 0 - - Out ch - - false - - - 0 - - - 1 + true - + 0 @@ -251,33 +326,8 @@ - - - - - 0 - 0 - - - - false - - - off - - - -127 - - - 127 - - - 1 - - - - - + + 0 @@ -285,10 +335,10 @@ - Transpose notes up or down + Change note length in percent of actual length - Transp. + Length false @@ -298,30 +348,30 @@ - - + + 0 0 - - false + + Offset playback of notes before or after actual note - - off + + Delay - - -1000 + + false - - 1000 + + 2 - - + + 0 @@ -329,10 +379,10 @@ - Offset playback of notes before or after actual note + Transpose notes up or down - Delay + Transp. false @@ -342,8 +392,8 @@ - - + + 0 @@ -356,6 +406,9 @@ % + + + 25 @@ -367,8 +420,8 @@ - - + + 0 @@ -376,99 +429,80 @@ - Change note length in percent of actual length - - - Length - - - false - - - 2 - - - - - - - - 0 - 0 - - - - - 8 - 5 - + Bank Select MSB. Ctrl-double-click on/off. false + + off + - -127 + 0 - 127 + 128 0 - - + + 0 0 - - <html><head/><body><p>Add or substract velocity to notes on track.</p><p><span style=" font-style:italic;">Since the midi note range is 0-127 this <br/>might mean that the notes do not reach <br/>the combined velocity, note + Velocity.</span></p></body></html> + + 1 - Velocity + H-Bank false - + 0 + + 2 + - - + + - + 0 0 + + Bank Select LSB. Ctrl-double-click on/off. + false - - % - - - + + off - 25 + 0 - 200 + 128 - 100 + 0 - - + + 0 @@ -476,67 +510,45 @@ - Compress the notes velocity range, in percent of actual velocity + output channel - - Compr. + + all midi events are sent to this output channel - + false - - 2 + + 1 + + + 16 - - + + - + 0 0 - - QFrame::WinPanel - - - QFrame::Raised - - - 1 - - - 1 + + <html><head/><body><p>Add or substract velocity to notes on track.</p><p><span style=" font-style:italic;">Since the midi note range is 0-127 this <br/>might mean that the notes do not reach <br/>the combined velocity, note + Velocity.</span></p></body></html> - Channel Info - - - Qt::AlignCenter + Velocity false - - - - - - - 0 - 0 - - - - Select instrument patch - - - <unknown> + + 0 - + @@ -555,7 +567,7 @@ - + 0 @@ -594,61 +606,55 @@ - - + + - + 0 0 - - Bank Select MSB. Ctrl-double-click on/off. + + QFrame::WinPanel - - false + + QFrame::Raised - - off + + 1 - - 0 + + 1 - - 128 + + Channel Info - - 0 + + Qt::AlignCenter + + + false - - + + - + 0 0 - - 1 + + Select instrument patch - H-Bank - - - false - - - 0 - - - 2 + <unknown> - - + + 0 @@ -656,26 +662,20 @@ - Bank Select LSB. Ctrl-double-click on/off. - - - false - - - off + Compress the notes velocity range, in percent of actual velocity - - 0 + + Compr. - - 128 + + false - - 0 + + 2 - + @@ -700,7 +700,7 @@ - + @@ -728,7 +728,7 @@ - + 0 @@ -767,7 +767,7 @@ - + @@ -795,7 +795,7 @@ - + 0 @@ -834,7 +834,7 @@ - + @@ -865,7 +865,7 @@ - + 0 @@ -904,7 +904,7 @@ - + Qt::Vertical @@ -920,6 +920,22 @@ + + + + + 0 + 0 + + + + Select instrument + + + <unknown> + + + -- cgit v1.2.3