diff options
author | Robert Jonsson <spamatica@gmail.com> | 2011-09-15 12:14:55 +0000 |
---|---|---|
committer | Robert Jonsson <spamatica@gmail.com> | 2011-09-15 12:14:55 +0000 |
commit | b0546e5e7f7044019892543c6c82029db8d564a7 (patch) | |
tree | 1b96a6260900f3fbf3513fb48a5a72aa89052dc8 /attic/muse2-oom/muse2/muse/widgets/mtrackinfo.cpp | |
parent | 583c73d1a07154d3d2672d65d8cce6495f490454 (diff) |
moved attic to a branch of it's own
Diffstat (limited to 'attic/muse2-oom/muse2/muse/widgets/mtrackinfo.cpp')
-rw-r--r-- | attic/muse2-oom/muse2/muse/widgets/mtrackinfo.cpp | 1831 |
1 files changed, 0 insertions, 1831 deletions
diff --git a/attic/muse2-oom/muse2/muse/widgets/mtrackinfo.cpp b/attic/muse2-oom/muse2/muse/widgets/mtrackinfo.cpp deleted file mode 100644 index 38d02735..00000000 --- a/attic/muse2-oom/muse2/muse/widgets/mtrackinfo.cpp +++ /dev/null @@ -1,1831 +0,0 @@ -//========================================================= -// MusE -// Linux Music Editor -// (C) Copyright 2010 Werner Schweer and others (ws@seh.de) -//========================================================= - -#include <QTimer> -#include <QMessageBox> -#include <QStandardItemModel> -#include <QStandardItem> - -#include <math.h> -#include <string.h> - -#include "mtrackinfo.h" -#include "song.h" -#include "globals.h" -#include "config.h" -#include "gconfig.h" -#include "midiport.h" -#include "minstrument.h" -#include "mididev.h" -#include "utils.h" -#include "audio.h" -#include "midi.h" -#include "midictrl.h" -#include "icons.h" -#include "app.h" -#include "route.h" -#include "popupmenu.h" -#include "pctable.h" - -//--------------------------------------------------------- -// setTrack -//--------------------------------------------------------- - -void MidiTrackInfo::setTrack(Track* t) -{ - if(!t) - { - selected = 0; - return; - } - - if(!t->isMidiTrack()) - return; - selected = t; - - QPalette pal; - if(selected->type() == Track::DRUM) - pal.setColor(trackNameLabel->backgroundRole(), config.drumTrackLabelBg); - else - pal.setColor(trackNameLabel->backgroundRole(), config.midiTrackLabelBg); - trackNameLabel->setPalette(pal); - - updateTrackInfo(-1); -} - -//--------------------------------------------------------- -// midiTrackInfo -//--------------------------------------------------------- - -MidiTrackInfo::MidiTrackInfo(QWidget* parent, Track* sel_track) : QFrame(parent)//QWidget(parent) -{ - setupUi(this); - _midiDetect = false; - _progRowNum = 0; - editing = false; - _matrix = new QList<int>; - _tableModel = new ProgramChangeTableModel(this); - tableView = new ProgramChangeTable(this); - tableView->setMinimumHeight(150); - tableView->horizontalHeader()->setStretchLastSection(true);//setResizeMode(1,QHeaderView::Stretch); - tableBox->addWidget(tableView); - selected = sel_track; - - // Since program covers 3 controls at once, it is in 'midi controller' units rather than 'gui control' units. - //program = -1; - program = CTRL_VAL_UNKNOWN; - pan = -65; - volume = -1; - - setFont(config.fonts[2]); - - //iChanDetectLabel->setPixmap(*darkgreendotIcon); - iChanDetectLabel->setPixmap(*darkRedLedIcon); - - QIcon recEchoIconSet; - recEchoIconSet.addPixmap(*midiThruOnIcon, QIcon::Normal, QIcon::On); - recEchoIconSet.addPixmap(*midiThruOffIcon, QIcon::Normal, QIcon::Off); - recEchoButton->setIcon(recEchoIconSet); - recEchoButton->setIconSize(midiThruOnIcon->size()); - - // MusE-2: AlignCenter and WordBreak are set in the ui(3) file, but not supported by QLabel. Turn them on here. - trackNameLabel->setAlignment(Qt::AlignCenter); - //Qt::TextWordWrap is not available for alignment in Qt4 - Orcan - // MusE-2 Tested: TextWrapAnywhere actually works, but in fact it takes precedence - // over word wrap, so I found it is not really desirable. Maybe with a user setting... - //trackNameLabel->setAlignment(Qt::AlignCenter | Qt::TextWordWrap | Qt::TextWrapAnywhere); - //trackNameLabel->setSizePolicy(QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Minimum)); - - if(selected) - { - trackNameLabel->setObjectName(selected->cname()); - QPalette pal; - //pal.setColor(trackNameLabel->backgroundRole(), QColor(0, 160, 255)); // Med blue - if(selected->type() == Track::DRUM) - pal.setColor(trackNameLabel->backgroundRole(), config.drumTrackLabelBg); - else - pal.setColor(trackNameLabel->backgroundRole(), config.midiTrackLabelBg); - trackNameLabel->setPalette(pal); - } - //else - //{ - // pal.setColor(trackNameLabel->backgroundRole(), config.midiTrackLabelBg); - // trackNameLabel->setPalette(pal); - //} - - //trackNameLabel->setStyleSheet(QString("background-color: ") + QColor(0, 160, 255).name()); // Med blue - trackNameLabel->setWordWrap(true); - trackNameLabel->setAutoFillBackground(true); - trackNameLabel->setTextFormat(Qt::PlainText); - trackNameLabel->setLineWidth(2); - trackNameLabel->setFrameStyle(QFrame::Sunken | QFrame::StyledPanel); - trackNameLabel->setSizePolicy(QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Minimum)); - - setLabelText(); - setLabelFont(); - - QStandardItem* hid = new QStandardItem(tr("I")); - QStandardItem* hstat = new QStandardItem(true); - hstat->setCheckable(true); - hstat->setCheckState(Qt::Unchecked); - QStandardItem* hpatch = new QStandardItem(tr("Patch")); - _tableModel->setHorizontalHeaderItem(0, hid); - _tableModel->setHorizontalHeaderItem(1, hstat); - _tableModel->setHorizontalHeaderItem(2, hpatch); - - tableView->setModel(_tableModel); - tableView->setColumnWidth(1, 20); - tableView->setColumnHidden(0, true); - - btnUp->setIcon(*upPCIcon); - btnDown->setIcon(*downPCIcon); - btnDelete->setIcon(*garbagePCIcon); - btnUp->setIconSize(upPCIcon->size()); - btnDown->setIconSize(downPCIcon->size()); - btnDelete->setIconSize(garbagePCIcon->size()); - - connect(tableView, SIGNAL(rowOrderChanged()), SLOT(rebuildMatrix())); - connect(_tableModel, SIGNAL(itemChanged(QStandardItem*)), SLOT(matrixItemChanged(QStandardItem*))); - connect(chkAdvanced, SIGNAL(stateChanged(int)), SLOT(toggleAdvanced(int))); - connect(btnDelete, SIGNAL(clicked(bool)), SLOT(deleteSelectedPatches(bool))); - connect(btnUp, SIGNAL(clicked(bool)), SLOT(movePatchUp(bool))); - connect(btnDown, SIGNAL(clicked(bool)), SLOT(movePatchDown(bool))); - - //setSizePolicy(QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding)); - - connect(iPatch, SIGNAL(released()), SLOT(instrPopup())); - - ///pop = new QMenu(iPatch); - //pop->setCheckable(false); // not needed in Qt4 - - // 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())); - connect(iHBank, SIGNAL(doubleClicked()), SLOT(iProgramDoubleClicked())); - connect(iLBank, SIGNAL(doubleClicked()), SLOT(iProgramDoubleClicked())); - connect(iProgram, SIGNAL(doubleClicked()), SLOT(iProgramDoubleClicked())); - connect(iLautst, SIGNAL(valueChanged(int)), SLOT(iLautstChanged(int))); - connect(iLautst, SIGNAL(doubleClicked()), SLOT(iLautstDoubleClicked())); - connect(iTransp, SIGNAL(valueChanged(int)), SLOT(iTranspChanged(int))); - connect(iAnschl, SIGNAL(valueChanged(int)), SLOT(iAnschlChanged(int))); - connect(iVerz, SIGNAL(valueChanged(int)), SLOT(iVerzChanged(int))); - connect(iLen, SIGNAL(valueChanged(int)), SLOT(iLenChanged(int))); - connect(iKompr, SIGNAL(valueChanged(int)), SLOT(iKomprChanged(int))); - connect(iPan, SIGNAL(valueChanged(int)), SLOT(iPanChanged(int))); - connect(iPan, SIGNAL(doubleClicked()), 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())); - connect(panRecButton, SIGNAL(clicked()), SLOT(panRecClicked())); - connect(recEchoButton, SIGNAL(toggled(bool)), SLOT(recEchoToggled(bool))); - connect(iRButton, SIGNAL(pressed()), SLOT(inRoutesPressed())); - - // TODO: Works OK, but disabled for now, until we figure out what to do about multiple out routes and display values... - //oRButton->setEnabled(false); - //oRButton->setVisible(false); - //connect(oRButton, SIGNAL(pressed()), SLOT(outRoutesPressed())); - - connect(song, SIGNAL(songChanged(int)), SLOT(songChanged(int))); - connect(muse, SIGNAL(configChanged()), SLOT(configChanged())); - - connect(heartBeatTimer, SIGNAL(timeout()), SLOT(heartBeat())); -} - -//--------------------------------------------------------- -// heartBeat -//--------------------------------------------------------- - -void MidiTrackInfo::heartBeat() -{ - ///if(!showTrackinfoFlag || !selected) - if(!isVisible() || !isEnabled() || !selected) - return; - switch(selected->type()) - { - case Track::MIDI: - case Track::DRUM: - { - MidiTrack* track = (MidiTrack*)selected; - - int outChannel = track->outChannel(); - int outPort = track->outPort(); - ///int ichMask = track->inChannelMask(); - //int iptMask = track->inPortMask(); - ///unsigned int iptMask = track->inPortMask(); - - MidiPort* mp = &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; - RouteList* rl = track->inRoutes(); - - 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 != Route::MIDI_PORT_ROUTE)) // p3.3.49 - 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 - continue; - - // No port assigned to the device? - //mpt = r->device->midiPort(); - mpt = r->midiPort; // p3.3.49 - if(mpt < 0 || mpt >= MIDI_PORTS) - continue; - - //for(; mch < MIDI_CHANNELS; ++mch) - //{ - //if(midiPorts[mpt].syncInfo().actDetect(mch) && (iptMask & (1 << mpt)) && (ichMask & (1 << mch)) ) - //if((iptMask & bitShiftLU[mpt]) && (midiPorts[mpt].syncInfo().actDetectBits() & ichMask) ) - //if(midiPorts[mpt].syncInfo().actDetectBits() & bitShiftLU[r->channel]) - if(midiPorts[mpt].syncInfo().actDetectBits() & r->channel) // p3.3.50 Use new channel mask. - { - //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; - } - //} - } - // 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); - } - } - - int nprogram = mp->hwCtrlState(outChannel, CTRL_PROGRAM); - if(nprogram == CTRL_VAL_UNKNOWN) - { - if(program != CTRL_VAL_UNKNOWN) - { - //printf("Arranger::midiTrackInfoHeartBeat setting program to unknown\n"); - - program = CTRL_VAL_UNKNOWN; - if(iHBank->value() != 0) - { - iHBank->blockSignals(true); - iHBank->setValue(0); - iHBank->blockSignals(false); - } - if(iLBank->value() != 0) - { - iLBank->blockSignals(true); - iLBank->setValue(0); - iLBank->blockSignals(false); - } - if(iProgram->value() != 0) - { - iProgram->blockSignals(true); - iProgram->setValue(0); - iProgram->blockSignals(false); - } - } - - nprogram = mp->lastValidHWCtrlState(outChannel, CTRL_PROGRAM); - if(nprogram == CTRL_VAL_UNKNOWN) - { - //const char* n = "<unknown>"; - const QString n(tr("Select Patch")); - //if(strcmp(iPatch->text().toLatin1().constData(), n) != 0) - if(iPatch->text() != n) - { - //printf("Arranger::midiTrackInfoHeartBeat setting patch <unknown>\n"); - - iPatch->setText(n); - } - } - else - { - MidiInstrument* instr = mp->instrument(); - QString name = instr->getPatchName(outChannel, nprogram, song->mtype(), track->type() == Track::DRUM); - if(name.isEmpty()) - { - const QString n("???"); - if(iPatch->text() != n) - iPatch->setText(n); - } - else - if(iPatch->text() != name) - { - //printf("Arranger::midiTrackInfoHeartBeat setting patch name\n"); - - iPatch->setText(name); - } - } - } - else - if(program != nprogram) - { - program = nprogram; - - //int hb, lb, pr; - //if (program == CTRL_VAL_UNKNOWN) { - // hb = lb = pr = 0; - // iPatch->setText("---"); - // } - //else - //{ - MidiInstrument* instr = mp->instrument(); - QString name = instr->getPatchName(outChannel, program, song->mtype(), track->type() == Track::DRUM); - 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"); - - if(iHBank->value() != hb) - { - iHBank->blockSignals(true); - iHBank->setValue(hb); - iHBank->blockSignals(false); - } - if(iLBank->value() != lb) - { - iLBank->blockSignals(true); - iLBank->setValue(lb); - iLBank->blockSignals(false); - } - if(iProgram->value() != pr) - { - iProgram->blockSignals(true); - iProgram->setValue(pr); - iProgram->blockSignals(false); - } - - } - - MidiController* mc = mp->midiController(CTRL_VOLUME); - int mn = mc->minVal(); - int v = mp->hwCtrlState(outChannel, CTRL_VOLUME); - if(v == CTRL_VAL_UNKNOWN) - //{ - //v = mc->initVal(); - //if(v == CTRL_VAL_UNKNOWN) - // v = 0; - v = mn - 1; - //} - else - // Auto bias... - v -= mc->bias(); - if(volume != v) - { - 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); - } - } - - mc = mp->midiController(CTRL_PANPOT); - mn = mc->minVal(); - v = mp->hwCtrlState(outChannel, CTRL_PANPOT); - if(v == CTRL_VAL_UNKNOWN) - //{ - //v = mc->initVal(); - //if(v == CTRL_VAL_UNKNOWN) - // v = 0; - v = mn - 1; - //} - else - // Auto bias... - v -= mc->bias(); - if(pan != v) - { - 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; - - case Track::WAVE: - case Track::AUDIO_OUTPUT: - case Track::AUDIO_INPUT: - case Track::AUDIO_GROUP: - case Track::AUDIO_AUX: - case Track::AUDIO_SOFTSYNTH: - break; - } -} - -//--------------------------------------------------------- -// configChanged -//--------------------------------------------------------- - -void MidiTrackInfo::configChanged() - { - //printf("MidiTrackInfo::configChanged\n"); - - //if (config.canvasBgPixmap.isEmpty()) { - // canvas->setBg(config.partCanvasBg); - // canvas->setBg(QPixmap()); - //} - //else { - // canvas->setBg(QPixmap(config.canvasBgPixmap)); - //} - - setFont(config.fonts[2]); - //updateTrackInfo(type); - } - -//--------------------------------------------------------- -// songChanged -//--------------------------------------------------------- - -void MidiTrackInfo::songChanged(int type) -{ - // Is it simply a midi controller value adjustment? Forget it. - if(type == SC_MIDI_CONTROLLER) - return; - if(type == SC_SELECTION) - return; - if(!isVisible()) - return; - updateTrackInfo(type); -} - -//--------------------------------------------------------- -// setLabelText -//--------------------------------------------------------- - -void MidiTrackInfo::setLabelText() -{ - MidiTrack* track = (MidiTrack*)selected; - if(track) - trackNameLabel->setText(track->name()); - else - trackNameLabel->setText(QString()); -} - -//--------------------------------------------------------- -// setLabelFont -//--------------------------------------------------------- - -void MidiTrackInfo::setLabelFont() -{ - //if(!selected) - // return; - //MidiTrack* track = (MidiTrack*)selected; - - // Use the new font #6 I created just for these labels (so far). - // Set the label's font. - trackNameLabel->setFont(config.fonts[6]); - // Dealing with a horizontally constrained label. Ignore vertical. Use a minimum readable point size. - autoAdjustFontSize(trackNameLabel, trackNameLabel->text(), false, true, config.fonts[6].pointSize(), 5); -} - -//--------------------------------------------------------- -// iOutputChannelChanged -//--------------------------------------------------------- - -void MidiTrackInfo::iOutputChannelChanged(int channel) - { - --channel; - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - if (channel != track->outChannel()) { - // Changed by T356. - //track->setOutChannel(channel); - audio->msgIdle(true); - //audio->msgSetTrackOutChannel(track, channel); - track->setOutChanAndUpdate(channel); - audio->msgIdle(false); - - // may result in adding/removing mixer strip: - //song->update(-1); - song->update(SC_MIDI_TRACK_PROP); - } - } - -//--------------------------------------------------------- -// iOutputPortChanged -//--------------------------------------------------------- - -void MidiTrackInfo::iOutputPortChanged(int index) - { - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - if (index == track->outPort()) - return; - // Changed by T356. - //track->setOutPort(index); - audio->msgIdle(true); - //audio->msgSetTrackOutPort(track, index); - track->setOutPortAndUpdate(index); - _tableModel->clear(); - rebuildMatrix(); - audio->msgIdle(false); - - song->update(SC_MIDI_TRACK_PROP); - } - -//--------------------------------------------------------- -// routingPopupMenuActivated -//--------------------------------------------------------- - -//void MidiTrackInfo::routingPopupMenuActivated(int n) -void MidiTrackInfo::routingPopupMenuActivated(QAction* act) -{ - ///if(!midiTrackInfo || gRoutingPopupMenuMaster != midiTrackInfo || !selected || !selected->isMidiTrack()) - if((gRoutingPopupMenuMaster != this) || !selected || !selected->isMidiTrack()) - return; - muse->routingPopupMenuActivated(selected, act->data().toInt()); -} - -#if 0 -//--------------------------------------------------------- -// routingPopupViewActivated -//--------------------------------------------------------- - -void MidiTrackInfo::routingPopupViewActivated(const QModelIndex& mdi) -{ - ///if(!midiTrackInfo || gRoutingPopupMenuMaster != midiTrackInfo || !selected || !selected->isMidiTrack()) - if(gRoutingPopupMenuMaster != this || !selected || !selected->isMidiTrack()) - return; - muse->routingPopupMenuActivated(selected, mdi.data().toInt()); -} -#endif - -//--------------------------------------------------------- -// inRoutesPressed -//--------------------------------------------------------- - -void MidiTrackInfo::inRoutesPressed() -{ - if(!selected) - return; - if(!selected->isMidiTrack()) - return; - - PopupMenu* pup = muse->prepareRoutingPopupMenu(selected, false); - //PopupView* pup = muse->prepareRoutingPopupView(selected, false); - - if(!pup) { - int ret = QMessageBox::warning(this, tr("No inputs"), - tr("There are no midi inputs.\n" - "Do you want to open the midi configuration dialog?"), - QMessageBox::Ok | QMessageBox::Cancel, - QMessageBox::Ok); - if (ret == QMessageBox::Ok) { - // printf("open config midi ports\n"); - muse->configMidiPorts(); - } - return; - } - - ///gRoutingPopupMenuMaster = midiTrackInfo; - gRoutingPopupMenuMaster = this; - connect(pup, SIGNAL(triggered(QAction*)), SLOT(routingPopupMenuActivated(QAction*))); - //connect(pup, SIGNAL(activated(const QModelIndex&)), SLOT(routingPopupViewActivated(const QModelIndex&))); - connect(pup, SIGNAL(aboutToHide()), muse, SLOT(routingPopupMenuAboutToHide())); - //connect(pup, SIGNAL(aboutToHide()), muse, SLOT(routingPopupViewAboutToHide())); - pup->popup(QCursor::pos()); - //pup->setVisible(true); - iRButton->setDown(false); - return; -} - -//--------------------------------------------------------- -// outRoutesPressed -//--------------------------------------------------------- - -void MidiTrackInfo::outRoutesPressed() -{ - if(!selected) - return; - if(!selected->isMidiTrack()) - return; - - PopupMenu* pup = muse->prepareRoutingPopupMenu(selected, true); - if(!pup) - return; - - ///gRoutingPopupMenuMaster = midiTrackInfo; - gRoutingPopupMenuMaster = this; - connect(pup, SIGNAL(triggered(QAction*)), SLOT(routingPopupMenuActivated(QAction*))); - connect(pup, SIGNAL(aboutToHide()), muse, SLOT(routingPopupMenuAboutToHide())); - pup->popup(QCursor::pos()); - ///oRButton->setDown(false); - return; -} - -//--------------------------------------------------------- -// iProgHBankChanged -//--------------------------------------------------------- - -void MidiTrackInfo::iProgHBankChanged() - { - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - int channel = track->outChannel(); - int port = track->outPort(); - int hbank = iHBank->value(); - int lbank = iLBank->value(); - int prog = iProgram->value(); - - if (hbank > 0 && hbank < 129) - hbank -= 1; - else - hbank = 0xff; - if (lbank > 0 && lbank < 129) - lbank -= 1; - else - lbank = 0xff; - if (prog > 0 && prog < 129) - prog -= 1; - else - prog = 0xff; - - MidiPort* mp = &midiPorts[port]; - if(prog == 0xff && hbank == 0xff && lbank == 0xff) - { - program = CTRL_VAL_UNKNOWN; - if(mp->hwCtrlState(channel, CTRL_PROGRAM) != CTRL_VAL_UNKNOWN) - audio->msgSetHwCtrlState(mp, channel, CTRL_PROGRAM, CTRL_VAL_UNKNOWN); - return; - } - - int np = mp->hwCtrlState(channel, CTRL_PROGRAM); - if(np == CTRL_VAL_UNKNOWN) - { - np = mp->lastValidHWCtrlState(channel, CTRL_PROGRAM); - if(np != CTRL_VAL_UNKNOWN) - { - lbank = (np & 0xff00) >> 8; - prog = np & 0xff; - if(prog == 0xff) - prog = 0; - int ilbnk = lbank; - int iprog = prog; - if(ilbnk == 0xff) - ilbnk = -1; - ++ilbnk; - ++iprog; - iLBank->blockSignals(true); - iProgram->blockSignals(true); - iLBank->setValue(ilbnk); - iProgram->setValue(iprog); - iLBank->blockSignals(false); - iProgram->blockSignals(false); - } - } - - if(prog == 0xff && (hbank != 0xff || lbank != 0xff)) - { - prog = 0; - iProgram->blockSignals(true); - iProgram->setValue(1); - iProgram->blockSignals(false); - } - program = (hbank << 16) + (lbank << 8) + prog; - MidiPlayEvent ev(0, port, channel, ME_CONTROLLER, CTRL_PROGRAM, program); - audio->msgPlayMidiEvent(&ev); - - MidiInstrument* instr = mp->instrument(); - iPatch->setText(instr->getPatchName(channel, program, song->mtype(), track->type() == Track::DRUM)); -// updateTrackInfo(); - } - -//--------------------------------------------------------- -// iProgLBankChanged -//--------------------------------------------------------- - -void MidiTrackInfo::iProgLBankChanged() - { - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - int channel = track->outChannel(); - int port = track->outPort(); - int hbank = iHBank->value(); - int lbank = iLBank->value(); - int prog = iProgram->value(); - - if (hbank > 0 && hbank < 129) - hbank -= 1; - else - hbank = 0xff; - if (lbank > 0 && lbank < 129) - lbank -= 1; - else - lbank = 0xff; - if (prog > 0 && prog < 129) - prog -= 1; - else - prog = 0xff; - - MidiPort* mp = &midiPorts[port]; - if(prog == 0xff && hbank == 0xff && lbank == 0xff) - { - program = CTRL_VAL_UNKNOWN; - if(mp->hwCtrlState(channel, CTRL_PROGRAM) != CTRL_VAL_UNKNOWN) - audio->msgSetHwCtrlState(mp, channel, CTRL_PROGRAM, CTRL_VAL_UNKNOWN); - return; - } - - int np = mp->hwCtrlState(channel, CTRL_PROGRAM); - if(np == CTRL_VAL_UNKNOWN) - { - np = mp->lastValidHWCtrlState(channel, CTRL_PROGRAM); - if(np != CTRL_VAL_UNKNOWN) - { - hbank = (np & 0xff0000) >> 16; - prog = np & 0xff; - if(prog == 0xff) - prog = 0; - int ihbnk = hbank; - int iprog = prog; - if(ihbnk == 0xff) - ihbnk = -1; - ++ihbnk; - ++iprog; - iHBank->blockSignals(true); - iProgram->blockSignals(true); - iHBank->setValue(ihbnk); - iProgram->setValue(iprog); - iHBank->blockSignals(false); - iProgram->blockSignals(false); - } - } - - if(prog == 0xff && (hbank != 0xff || lbank != 0xff)) - { - prog = 0; - iProgram->blockSignals(true); - iProgram->setValue(1); - iProgram->blockSignals(false); - } - program = (hbank << 16) + (lbank << 8) + prog; - MidiPlayEvent ev(0, port, channel, ME_CONTROLLER, CTRL_PROGRAM, program); - audio->msgPlayMidiEvent(&ev); - - MidiInstrument* instr = mp->instrument(); - iPatch->setText(instr->getPatchName(channel, program, song->mtype(), track->type() == Track::DRUM)); -// updateTrackInfo(); - } - -//--------------------------------------------------------- -// iProgramChanged -//--------------------------------------------------------- - -void MidiTrackInfo::iProgramChanged() - { - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - int channel = track->outChannel(); - int port = track->outPort(); - int hbank = iHBank->value(); - int lbank = iLBank->value(); - int prog = iProgram->value(); - - if (hbank > 0 && hbank < 129) - hbank -= 1; - else - hbank = 0xff; - if (lbank > 0 && lbank < 129) - lbank -= 1; - else - lbank = 0xff; - if (prog > 0 && prog < 129) - prog -= 1; - else - prog = 0xff; - - MidiPort *mp = &midiPorts[port]; - if(prog == 0xff) - { - program = CTRL_VAL_UNKNOWN; - iHBank->blockSignals(true); - iLBank->blockSignals(true); - iHBank->setValue(0); - iLBank->setValue(0); - iHBank->blockSignals(false); - iLBank->blockSignals(false); - - if(mp->hwCtrlState(channel, CTRL_PROGRAM) != CTRL_VAL_UNKNOWN) - audio->msgSetHwCtrlState(mp, channel, CTRL_PROGRAM, CTRL_VAL_UNKNOWN); - return; - } - else - { - int np = mp->hwCtrlState(channel, CTRL_PROGRAM); - if(np == CTRL_VAL_UNKNOWN) - { - np = mp->lastValidHWCtrlState(channel, CTRL_PROGRAM); - if(np != CTRL_VAL_UNKNOWN) - { - hbank = (np & 0xff0000) >> 16; - lbank = (np & 0xff00) >> 8; - int ihbnk = hbank; - int ilbnk = lbank; - if(ihbnk == 0xff) - ihbnk = -1; - if(ilbnk == 0xff) - ilbnk = -1; - ++ihbnk; - ++ilbnk; - iHBank->blockSignals(true); - iLBank->blockSignals(true); - iHBank->setValue(ihbnk); - iLBank->setValue(ilbnk); - iHBank->blockSignals(false); - iLBank->blockSignals(false); - } - } - program = (hbank << 16) + (lbank << 8) + prog; - MidiPlayEvent ev(0, port, channel, ME_CONTROLLER, CTRL_PROGRAM, program); - audio->msgPlayMidiEvent(&ev); - - MidiInstrument* instr = mp->instrument(); - iPatch->setText(instr->getPatchName(channel, program, song->mtype(), track->type() == Track::DRUM)); - } - -// updateTrackInfo(); - } - -//--------------------------------------------------------- -// iLautstChanged -//--------------------------------------------------------- - -void MidiTrackInfo::iLautstChanged(int val) - { - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - int outPort = track->outPort(); - int chan = track->outChannel(); - MidiPort* mp = &midiPorts[outPort]; - MidiController* mctl = mp->midiController(CTRL_VOLUME); - if((val < mctl->minVal()) || (val > mctl->maxVal())) - { - if(mp->hwCtrlState(chan, CTRL_VOLUME) != CTRL_VAL_UNKNOWN) - audio->msgSetHwCtrlState(mp, chan, CTRL_VOLUME, CTRL_VAL_UNKNOWN); - } - else - { - val += mctl->bias(); - - MidiPlayEvent ev(0, outPort, chan, - ME_CONTROLLER, CTRL_VOLUME, val); - audio->msgPlayMidiEvent(&ev); - } - song->update(SC_MIDI_CONTROLLER); - } - -//--------------------------------------------------------- -// iTranspChanged -//--------------------------------------------------------- - -void MidiTrackInfo::iTranspChanged(int val) - { - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - track->transposition = val; - song->update(SC_MIDI_TRACK_PROP); - } - -//--------------------------------------------------------- -// iAnschlChanged -//--------------------------------------------------------- - -void MidiTrackInfo::iAnschlChanged(int val) - { - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - track->velocity = val; - song->update(SC_MIDI_TRACK_PROP); - } - -//--------------------------------------------------------- -// iVerzChanged -//--------------------------------------------------------- - -void MidiTrackInfo::iVerzChanged(int val) - { - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - track->delay = val; - song->update(SC_MIDI_TRACK_PROP); - } - -//--------------------------------------------------------- -// iLenChanged -//--------------------------------------------------------- - -void MidiTrackInfo::iLenChanged(int val) - { - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - track->len = val; - song->update(SC_MIDI_TRACK_PROP); - } - -//--------------------------------------------------------- -// iKomprChanged -//--------------------------------------------------------- - -void MidiTrackInfo::iKomprChanged(int val) - { - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - track->compression = val; - song->update(SC_MIDI_TRACK_PROP); - } - -//--------------------------------------------------------- -// iPanChanged -//--------------------------------------------------------- - -void MidiTrackInfo::iPanChanged(int val) - { - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - int port = track->outPort(); - int chan = track->outChannel(); - MidiPort* mp = &midiPorts[port]; - MidiController* mctl = mp->midiController(CTRL_PANPOT); - if((val < mctl->minVal()) || (val > mctl->maxVal())) - { - if(mp->hwCtrlState(chan, CTRL_PANPOT) != CTRL_VAL_UNKNOWN) - audio->msgSetHwCtrlState(mp, chan, CTRL_PANPOT, CTRL_VAL_UNKNOWN); - } - else - { - val += mctl->bias(); - - // Realtime Change: - MidiPlayEvent ev(0, port, chan, - ME_CONTROLLER, CTRL_PANPOT, val); - audio->msgPlayMidiEvent(&ev); - } - song->update(SC_MIDI_CONTROLLER); - } - -//--------------------------------------------------------- -// instrPopup -//--------------------------------------------------------- - -void MidiTrackInfo::instrPopup() -{ - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - int channel = track->outChannel(); - int port = track->outPort(); - MidiInstrument* instr = midiPorts[port].instrument(); - QMenu* pup = new QMenu; - ///instr->populatePatchPopup(pop, channel, song->mtype(), track->type() == Track::DRUM); - instr->populatePatchPopup(pup, channel, song->mtype(), track->type() == Track::DRUM); - - ///if(pop->actions().count() == 0) - /// return; - if(pup->actions().count() == 0) - { - delete pup; - return; - } - - ///QAction *act = pop->exec(iPatch->mapToGlobal(QPoint(10,5))); - QAction *act = pup->exec(iPatch->mapToGlobal(QPoint(10,5))); - if (act) { - //int rv = act->data().toInt(); - QVariant _data = act->data(); - QStringList lst = _data.toStringList(); - if(!lst.isEmpty()) - { - QString str = lst.at(0); - QString pg = "";//lst.at(1); - int rv = str.toInt(); - - MidiPlayEvent ev(0, port, channel, ME_CONTROLLER, CTRL_PROGRAM, rv); - audio->msgPlayMidiEvent(&ev); - updateTrackInfo(-1); - - //At this point we add the event to the list. - if(lst.size() > 1) - { - pg = lst.at(1); - } - //QLabel label; - //label.setText(pg); - QString label = " " + pg + (pg.isEmpty() ? "" : ":\n ") + act->text(); - //QList<QStandardItem*> found = _tableModel->findItems(label, Qt::MatchExactly, 1); - //if(found.size() == 0) - //{ - QList<QStandardItem*> rowData; - QStandardItem* chk = new QStandardItem(true); - chk->setCheckable(true); - chk->setCheckState(Qt::Checked); - chk->setToolTip(tr("Add to patch sequence")); - //_tableModel->setItem(row, 0, chk); - QStandardItem* patch = new QStandardItem(label); - patch->setToolTip(label); - patch->setEditable(false); - rowData.append(new QStandardItem(str)); - rowData.append(chk); - rowData.append(patch); - //_tableModel->setItem(row, 1, patch); - //_tableModel->setItem(row, 2, new QStandardItem(str)); - for(int i=0; i < _tableModel->rowCount(); ++i) - { - QStandardItem* item = _tableModel->item(i, 1); - item->setCheckState(Qt::Unchecked); - } - _tableModel->insertRow(0, rowData); - tableView->resizeRowToContents(0); - tableView->selectRow(0); - _matrix->append(0); - tableView->setColumnWidth(1, 20); - tableView->setColumnWidth(0, 1); - /* tableView->setColumnHidden(0, true); - if(_tableModel->rowCount() == 1) - { - QStringList headers; - headers.append(tr("I")); - headers.append(tr("M")); - headers.append(tr("Patch")); - _tableModel->setHorizontalHeaderLabels(headers); - }*/ - /*} - else - { - for(int i=0; i < _tableModel->rowCount(); ++i) - { - QStandardItem* item = _tableModel->item(i, 0); - item->setCheckState(Qt::Unchecked); - } - //Select the patch that was a duplicate only - QStandardItem* dup = found.at(0); - QStandardItem* dchk = _tableModel->item(dup->row(), 0); - dchk->setCheckState(Qt::Checked); - }*/ - } - } - - delete pup; -} - -//--------------------------------------------------------- -// recEchoToggled -//--------------------------------------------------------- - -void MidiTrackInfo::recEchoToggled(bool v) -{ - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - track->setRecEcho(v); - song->update(SC_MIDI_TRACK_PROP); -} - -//--------------------------------------------------------- -// iProgramDoubleClicked -//--------------------------------------------------------- - -void MidiTrackInfo::iProgramDoubleClicked() -{ - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - int port = track->outPort(); - int chan = track->outChannel(); - MidiPort* mp = &midiPorts[port]; - MidiController* mctl = mp->midiController(CTRL_PROGRAM); - - if(!track || !mctl) - return; - - int lastv = mp->lastValidHWCtrlState(chan, CTRL_PROGRAM); - int curv = mp->hwCtrlState(chan, CTRL_PROGRAM); - - if(curv == CTRL_VAL_UNKNOWN) - { - // If no value has ever been set yet, use the current knob value - // (or the controller's initial value?) to 'turn on' the controller. - if(lastv == CTRL_VAL_UNKNOWN) - { - int kiv = mctl->initVal(); - //int kiv = lrint(_knob->value()); - if(kiv == CTRL_VAL_UNKNOWN) - kiv = 0; - //else - //{ - //if(kiv < mctrl->minVal()) - // kiv = mctrl->minVal(); - //if(kiv > mctrl->maxVal()) - // kiv = mctrl->maxVal(); - //kiv += mctrl->bias(); - //} - - //MidiPlayEvent ev(0, port, chan, ME_CONTROLLER, num, kiv); - MidiPlayEvent ev(0, port, chan, ME_CONTROLLER, CTRL_PROGRAM, kiv); - audio->msgPlayMidiEvent(&ev); - } - else - { - MidiPlayEvent ev(0, port, chan, ME_CONTROLLER, CTRL_PROGRAM, lastv); - audio->msgPlayMidiEvent(&ev); - } - } - else - { - if(mp->hwCtrlState(chan, CTRL_PROGRAM) != CTRL_VAL_UNKNOWN) - audio->msgSetHwCtrlState(mp, chan, CTRL_PROGRAM, CTRL_VAL_UNKNOWN); - } - - song->update(SC_MIDI_CONTROLLER); -} - -//--------------------------------------------------------- -// iLautstDoubleClicked -//--------------------------------------------------------- - -void MidiTrackInfo::iLautstDoubleClicked() -{ - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - int port = track->outPort(); - int chan = track->outChannel(); - MidiPort* mp = &midiPorts[port]; - MidiController* mctl = mp->midiController(CTRL_VOLUME); - - if(!track || !mctl) - return; - - int lastv = mp->lastValidHWCtrlState(chan, CTRL_VOLUME); - int curv = mp->hwCtrlState(chan, CTRL_VOLUME); - - if(curv == CTRL_VAL_UNKNOWN) - { - // If no value has ever been set yet, use the current knob value - // (or the controller's initial value?) to 'turn on' the controller. - if(lastv == CTRL_VAL_UNKNOWN) - { - int kiv = mctl->initVal(); - //int kiv = lrint(_knob->value()); - if(kiv == 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); - else - { - if(kiv < mctl->minVal()) - kiv = mctl->minVal(); - if(kiv > mctl->maxVal()) - kiv = mctl->maxVal(); - kiv += mctl->bias(); - } - - MidiPlayEvent ev(0, port, chan, ME_CONTROLLER, CTRL_VOLUME, kiv); - audio->msgPlayMidiEvent(&ev); - } - else - { - MidiPlayEvent ev(0, port, chan, ME_CONTROLLER, CTRL_VOLUME, lastv); - audio->msgPlayMidiEvent(&ev); - } - } - else - { - if(mp->hwCtrlState(chan, CTRL_VOLUME) != CTRL_VAL_UNKNOWN) - audio->msgSetHwCtrlState(mp, chan, CTRL_VOLUME, CTRL_VAL_UNKNOWN); - } - - song->update(SC_MIDI_CONTROLLER); -} - -//--------------------------------------------------------- -// iPanDoubleClicked -//--------------------------------------------------------- - -void MidiTrackInfo::iPanDoubleClicked() -{ - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - int port = track->outPort(); - int chan = track->outChannel(); - MidiPort* mp = &midiPorts[port]; - MidiController* mctl = mp->midiController(CTRL_PANPOT); - - if(!track || !mctl) - return; - - int lastv = mp->lastValidHWCtrlState(chan, CTRL_PANPOT); - int curv = mp->hwCtrlState(chan, CTRL_PANPOT); - - if(curv == CTRL_VAL_UNKNOWN) - { - // If no value has ever been set yet, use the current knob value - // (or the controller's initial value?) to 'turn on' the controller. - if(lastv == CTRL_VAL_UNKNOWN) - { - int kiv = mctl->initVal(); - //int kiv = lrint(_knob->value()); - if(kiv == 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); - else - { - if(kiv < mctl->minVal()) - kiv = mctl->minVal(); - if(kiv > mctl->maxVal()) - kiv = mctl->maxVal(); - kiv += mctl->bias(); - } - - MidiPlayEvent ev(0, port, chan, ME_CONTROLLER, CTRL_PANPOT, kiv); - audio->msgPlayMidiEvent(&ev); - } - else - { - MidiPlayEvent ev(0, port, chan, ME_CONTROLLER, CTRL_PANPOT, lastv); - audio->msgPlayMidiEvent(&ev); - } - } - else - { - if(mp->hwCtrlState(chan, CTRL_PANPOT) != CTRL_VAL_UNKNOWN) - audio->msgSetHwCtrlState(mp, chan, CTRL_PANPOT, CTRL_VAL_UNKNOWN); - } - - song->update(SC_MIDI_CONTROLLER); -} - - -//--------------------------------------------------------- -// updateTrackInfo -//--------------------------------------------------------- - -void MidiTrackInfo::updateTrackInfo(int flags) -{ - // Is it simply a midi controller value adjustment? Forget it. - if(flags == SC_MIDI_CONTROLLER) - return; - if(flags == SC_SELECTION) - return; - - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - - // p3.3.47 Update the routing popup menu if anything relevant changes. - //if(gRoutingPopupMenuMaster == midiTrackInfo && selected && (flags & (SC_ROUTE | SC_CHANNELS | SC_CONFIG))) - if(flags & (SC_ROUTE | SC_CHANNELS | SC_CONFIG)) // p3.3.50 - // Use this handy shared routine. - //muse->updateRouteMenus(selected); - ///muse->updateRouteMenus(selected, midiTrackInfo); // p3.3.50 - muse->updateRouteMenus(selected, this); - - // Added by Tim. p3.3.9 - setLabelText(); - setLabelFont(); - - if(flags & (SC_MIDI_TRACK_PROP)) - { - iTransp->blockSignals(true); - iAnschl->blockSignals(true); - iVerz->blockSignals(true); - iLen->blockSignals(true); - iKompr->blockSignals(true); - iTransp->setValue(track->transposition); - iAnschl->setValue(track->velocity); - iVerz->setValue(track->delay); - iLen->setValue(track->len); - iKompr->setValue(track->compression); - iTransp->blockSignals(false); - iAnschl->blockSignals(false); - iVerz->blockSignals(false); - iLen->blockSignals(false); - 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(); - - for (int i = 0; i < MIDI_PORTS; ++i) { - QString name; - name.sprintf("%d:%s", i+1, midiPorts[i].portname().toLatin1().constData()); - iOutput->insertItem(i, name); - if (i == outPort) - iOutput->setCurrentIndex(i); - } - 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); - // } - - iOutputChannel->blockSignals(true); - iOutputChannel->setValue(outChannel+1); - iOutputChannel->blockSignals(false); - ///iInputChannel->setText(bitmap2String(inChannel)); - - // Set record echo. - if(recEchoButton->isChecked() != track->recEcho()) - { - recEchoButton->blockSignals(true); - recEchoButton->setChecked(track->recEcho()); - recEchoButton->blockSignals(false); - } - } - - int outChannel = track->outChannel(); - int outPort = track->outPort(); - MidiPort* mp = &midiPorts[outPort]; - int nprogram = mp->hwCtrlState(outChannel, CTRL_PROGRAM); - if(nprogram == 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 = CTRL_VAL_UNKNOWN; - nprogram = mp->lastValidHWCtrlState(outChannel, CTRL_PROGRAM); - if(nprogram == CTRL_VAL_UNKNOWN) - //iPatch->setText(QString("<unknown>")); - iPatch->setText(tr("Select Patch")); - else - { - MidiInstrument* instr = mp->instrument(); - iPatch->setText(instr->getPatchName(outChannel, nprogram, song->mtype(), track->type() == Track::DRUM)); - } - } - else - //if (program != nprogram) - { - program = nprogram; - - //int hb, lb, pr; - //if (program == CTRL_VAL_UNKNOWN) { - // hb = lb = pr = 0; - // iPatch->setText("---"); - // } - //else - //{ - MidiInstrument* instr = mp->instrument(); - iPatch->setText(instr->getPatchName(outChannel, program, song->mtype(), track->type() == Track::DRUM)); - - 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); - } - - MidiController* mc = mp->midiController(CTRL_VOLUME); - int mn = mc->minVal(); - int v = mp->hwCtrlState(outChannel, CTRL_VOLUME); - volume = v; - if(v == CTRL_VAL_UNKNOWN) - //{ - //v = mc->initVal(); - //if(v == 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(CTRL_PANPOT); - mn = mc->minVal(); - v = mp->hwCtrlState(outChannel, CTRL_PANPOT); - pan = v; - if(v == CTRL_VAL_UNKNOWN) - //{ - //v = mc->initVal(); - //if(v == 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); - //} - -} - -//--------------------------------------------------------- -// progRecClicked -//--------------------------------------------------------- - -void MidiTrackInfo::progRecClicked() - { - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - int portno = track->outPort(); - int channel = track->outChannel(); - MidiPort* port = &midiPorts[portno]; - int program = port->hwCtrlState(channel, CTRL_PROGRAM); - if(program == CTRL_VAL_UNKNOWN || program == 0xffffff) - return; - - unsigned tick = song->cpos(); - Event a(Controller); - a.setTick(tick); - a.setA(CTRL_PROGRAM); - a.setB(program); - - song->recordEvent(track, a); - } - -//--------------------------------------------------------- -// volRecClicked -//--------------------------------------------------------- - -void MidiTrackInfo::volRecClicked() - { - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - int portno = track->outPort(); - int channel = track->outChannel(); - MidiPort* port = &midiPorts[portno]; - int volume = port->hwCtrlState(channel, CTRL_VOLUME); - if(volume == CTRL_VAL_UNKNOWN) - return; - - unsigned tick = song->cpos(); - Event a(Controller); - a.setTick(tick); - a.setA(CTRL_VOLUME); - a.setB(volume); - - song->recordEvent(track, a); - } - -//--------------------------------------------------------- -// panRecClicked -//--------------------------------------------------------- - -void MidiTrackInfo::panRecClicked() - { - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - int portno = track->outPort(); - int channel = track->outChannel(); - MidiPort* port = &midiPorts[portno]; - int pan = port->hwCtrlState(channel, CTRL_PANPOT); - if(pan == CTRL_VAL_UNKNOWN) - return; - - unsigned tick = song->cpos(); - Event a(Controller); - a.setTick(tick); - a.setA(CTRL_PANPOT); - a.setB(pan); - - song->recordEvent(track, a); - } - -//--------------------------------------------------------- -// recordClicked -//--------------------------------------------------------- - -void MidiTrackInfo::recordClicked() - { - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - int portno = track->outPort(); - int channel = track->outChannel(); - MidiPort* port = &midiPorts[portno]; - unsigned tick = song->cpos(); - - int program = port->hwCtrlState(channel, CTRL_PROGRAM); - if(program != CTRL_VAL_UNKNOWN && program != 0xffffff) - { - Event a(Controller); - a.setTick(tick); - a.setA(CTRL_PROGRAM); - a.setB(program); - song->recordEvent(track, a); - } - int volume = port->hwCtrlState(channel, CTRL_VOLUME); - if(volume != CTRL_VAL_UNKNOWN) - { - Event a(Controller); - a.setTick(tick); - a.setA(CTRL_VOLUME); - a.setB(volume); - song->recordEvent(track, a); - } - int pan = port->hwCtrlState(channel, CTRL_PANPOT); - if(pan != CTRL_VAL_UNKNOWN) - { - Event a(Controller); - a.setTick(tick); - a.setA(CTRL_PANPOT); - a.setB(pan); - song->recordEvent(track, a); - } - } - -void MidiTrackInfo::toggleAdvanced(int checked) -{ - if(checked == Qt::Checked) - { - frame->show(); - } - else - { - frame->hide(); - } -} - - -void MidiTrackInfo::rebuildMatrix() -{ - //Clear the matrix - _matrix->erase(_matrix->begin(), _matrix->end()); - //Rebuild from order of selected table items - for(int i=0; i < _tableModel->rowCount(); ++i) - { - QStandardItem* item = _tableModel->item(i, 1); - if(item->checkState() == Qt::Checked) - _matrix->append(item->row()); - } - tableView->resizeRowsToContents(); -} - -void MidiTrackInfo::matrixItemChanged(QStandardItem* item) -{ - rebuildMatrix(); - //if(item->column() != -1 && item->column() == 0 && item->isCheckable()) - //{ - // if(item->checkState() == Qt::Checked) - // { - // printf("Adding item to matrix %d\n", item->row()); - // _matrix->append(item->row()); - // } - // else - // { - // int ind = _matrix->indexOf(item->row()); - // if(ind != -1) - // { - // printf("Removing item from matrix %d\n",ind); - // _matrix->removeAt(ind); - // } - // } - //} -} - -void MidiTrackInfo::insertMatrixEvent() -{ - if(!selected) - return; - MidiTrack* track = (MidiTrack*)selected; - int channel = track->outChannel(); - int port = track->outPort(); - if(_matrix->size() == 1) - { - //Get the QStandardItem in the hidden third column - //This column contains the ID of the Patch - int row = _matrix->at(0); - QStandardItem* item = _tableModel->item(row, 0); - int id = item->text().toInt(); - MidiPlayEvent ev(0, port, channel, ME_CONTROLLER, CTRL_PROGRAM, id); - audio->msgPlayMidiEvent(&ev); - updateTrackInfo(-1); - tableView->selectRow(item->row()); - progRecClicked(); - } - else if(_matrix->size() > 1) - { - int row = _matrix->takeFirst(); - tableView->selectRow(_matrix->at(0)); - //printf("Adding Program Change for row: %d\n", row); - if(row != -1 && row < _tableModel->rowCount()) - { - QStandardItem* item = _tableModel->item(row, 0); - int id = item->text().toInt(); - MidiPlayEvent ev(0, port, channel, ME_CONTROLLER, CTRL_PROGRAM, id); - audio->msgPlayMidiEvent(&ev); - updateTrackInfo(-1); - progRecClicked(); - } - _matrix->push_back(row); - } -} - -void MidiTrackInfo::deleteSelectedPatches(bool b) -{ - QList<int> rows = tableView->getSelectedRows(); - if(!rows.isEmpty()) - { - int id = rows.at(0); - if(!_matrix->isEmpty()) - { - int mid = _matrix->indexOf(0); - if(mid != -1) - _matrix->takeAt(mid); - } - _tableModel->removeRow(id); - _tableModel->emit_layoutChanged(); - tableView->resizeRowsToContents(); - int c = _tableModel->rowCount(); - //printf("Row Count: %d - Deleted Row:%d\n",c ,id); - if(c > id) - tableView->selectRow(id); - else - { - tableView->selectRow(0); - } - } -/* for(int i =0; i < rows.size(); ++i) - { - if(!_matrix->isEmpty()) - { - int mid = _matrix->indexOf(i); - if(mid != -1) - _matrix->takeAt(mid); - } - _tableModel->removeRow(i); - } - */ -} - -void MidiTrackInfo::movePatchDown(bool b) -{ - QList<int> rows = tableView->getSelectedRows(); - if(!rows.isEmpty()) - { - int id = rows.at(0); - if((id + 1) >= _tableModel->rowCount()) - return; - int row = (id + 1); - QList<QStandardItem*> item = _tableModel->takeRow(id); - QStandardItem* txt = item.at(2); - txt->setEditable(false); - _tableModel->insertRow(row, item); - tableView->resizeRowsToContents(); - tableView->setColumnWidth(1, 20); - tableView->setColumnWidth(0, 1); - tableView->selectRow(row); - } -} - -void MidiTrackInfo::movePatchUp(bool clicked) -{ - QList<int> rows = tableView->getSelectedRows(); - if(!rows.isEmpty()) - { - int id = rows.at(0); - if((id - 1) < 0) - return; - int row = (id - 1); - QList<QStandardItem*> item = _tableModel->takeRow(id); - QStandardItem* txt = item.at(2); - txt->setEditable(false); - _tableModel->insertRow(row, item); - tableView->resizeRowsToContents(); - tableView->setColumnWidth(1, 20); - tableView->setColumnWidth(0, 1); - tableView->selectRow(row); - } -} - -void MidiTrackInfo::updateSize() -{ - tableView->resizeRowsToContents(); -} |