1
//=========================================================
4
// $Id: trackinfo.cpp,v 1.10.2.15 2009/11/14 03:37:48 terminator356 Exp $
5
// (C) Copyright 1999-2004 Werner Schweer (ws@seh.de)
6
//=========================================================
10
#include <qtoolbutton.h>
12
#include <qpopupmenu.h>
13
#include <qmessagebox.h>
15
#include <qcheckbox.h>
16
#include <qpushbutton.h>
17
#include <qwidgetstack.h>
18
#include <qlineedit.h>
33
//#include "mtrackinfobase.h"
36
#include "mixer/amixer.h"
39
#include "xpm/muse_leftside_logo.xpm"
40
#include "mixer/astrip.h"
44
#include "popupmenu.h"
47
//---------------------------------------------------------
48
// midiTrackInfoHeartBeat
49
//---------------------------------------------------------
51
void Arranger::midiTrackInfoHeartBeat()
53
if(!showTrackinfoFlag || !selected)
55
switch(selected->type())
60
MidiTrack* track = (MidiTrack*)selected;
62
int outChannel = track->outChannel();
63
int outPort = track->outPort();
64
///int ichMask = track->inChannelMask();
65
//int iptMask = track->inPortMask();
66
///unsigned int iptMask = track->inPortMask();
68
MidiPort* mp = &midiPorts[outPort];
71
if(midiTrackInfo->recEchoButton->isOn() != track->recEcho())
73
midiTrackInfo->recEchoButton->blockSignals(true);
74
midiTrackInfo->recEchoButton->setOn(track->recEcho());
75
midiTrackInfo->recEchoButton->blockSignals(false);
78
// Check for detection of midi general activity on chosen channels...
81
RouteList* rl = track->inRoutes();
83
ciRoute r = rl->begin();
84
//for( ; mpt < MIDI_PORTS; ++mpt)
85
for( ; r != rl->end(); ++r)
87
//if(!r->isValid() || ((r->type != Route::ALSA_MIDI_ROUTE) && (r->type != Route::JACK_MIDI_ROUTE)))
88
//if(!r->isValid() || (r->type != Route::MIDI_DEVICE_ROUTE))
89
if(!r->isValid() || (r->type != Route::MIDI_PORT_ROUTE)) // p3.3.49
92
// NOTE: TODO: Code for channelless events like sysex, ** IF we end up using the 'special channel 17' method.
93
//if(r->channel == -1)
94
if(r->channel == -1 || r->channel == 0) // p3.3.50
97
// No port assigned to the device?
98
//mpt = r->device->midiPort();
99
mpt = r->midiPort; // p3.3.49
100
if(mpt < 0 || mpt >= MIDI_PORTS)
103
//for(; mch < MIDI_CHANNELS; ++mch)
105
//if(midiPorts[mpt].syncInfo().actDetect(mch) && (iptMask & (1 << mpt)) && (ichMask & (1 << mch)) )
106
//if((iptMask & bitShiftLU[mpt]) && (midiPorts[mpt].syncInfo().actDetectBits() & ichMask) )
107
//if(midiPorts[mpt].syncInfo().actDetectBits() & bitShiftLU[r->channel])
108
if(midiPorts[mpt].syncInfo().actDetectBits() & r->channel) // p3.3.50 Use new channel mask.
110
//if(midiTrackInfo->iChanTextLabel->paletteBackgroundColor() != green)
111
// midiTrackInfo->iChanTextLabel->setPaletteBackgroundColor(green);
112
//if(midiTrackInfo->iChanDetectLabel->pixmap() != greendotIcon)
113
if(!midiTrackInfo->_midiDetect)
115
//printf("Arranger::midiTrackInfoHeartBeat setting green icon\n");
117
midiTrackInfo->_midiDetect = true;
118
//midiTrackInfo->iChanDetectLabel->setPixmap(*greendotIcon);
119
midiTrackInfo->iChanDetectLabel->setPixmap(*redLedIcon);
125
// No activity detected?
126
//if(mch == MIDI_CHANNELS)
127
//if(mpt == MIDI_PORTS)
130
//if(midiTrackInfo->iChanTextLabel->paletteBackgroundColor() != darkGreen)
131
// midiTrackInfo->iChanTextLabel->setPaletteBackgroundColor(darkGreen);
132
//if(midiTrackInfo->iChanDetectLabel->pixmap() != darkgreendotIcon)
133
if(midiTrackInfo->_midiDetect)
135
//printf("Arranger::midiTrackInfoHeartBeat setting darkgreen icon\n");
137
midiTrackInfo->_midiDetect = false;
138
//midiTrackInfo->iChanDetectLabel->setPixmap(*darkgreendotIcon);
139
midiTrackInfo->iChanDetectLabel->setPixmap(*darkRedLedIcon);
143
int nprogram = mp->hwCtrlState(outChannel, CTRL_PROGRAM);
144
if(nprogram == CTRL_VAL_UNKNOWN)
146
if(program != CTRL_VAL_UNKNOWN)
148
//printf("Arranger::midiTrackInfoHeartBeat setting program to unknown\n");
150
program = CTRL_VAL_UNKNOWN;
151
if(midiTrackInfo->iHBank->value() != 0)
153
midiTrackInfo->iHBank->blockSignals(true);
154
midiTrackInfo->iHBank->setValue(0);
155
midiTrackInfo->iHBank->blockSignals(false);
157
if(midiTrackInfo->iLBank->value() != 0)
159
midiTrackInfo->iLBank->blockSignals(true);
160
midiTrackInfo->iLBank->setValue(0);
161
midiTrackInfo->iLBank->blockSignals(false);
163
if(midiTrackInfo->iProgram->value() != 0)
165
midiTrackInfo->iProgram->blockSignals(true);
166
midiTrackInfo->iProgram->setValue(0);
167
midiTrackInfo->iProgram->blockSignals(false);
171
nprogram = mp->lastValidHWCtrlState(outChannel, CTRL_PROGRAM);
172
if(nprogram == CTRL_VAL_UNKNOWN)
174
//const char* n = "<unknown>";
175
const QString n(tr("<unknown>"));
176
//if(strcmp(midiTrackInfo->iPatch->text().latin1(), n) != 0)
177
if(midiTrackInfo->iPatch->text() != n)
179
//printf("Arranger::midiTrackInfoHeartBeat setting patch <unknown>\n");
181
midiTrackInfo->iPatch->setText(n);
186
MidiInstrument* instr = mp->instrument();
187
const char* name = instr->getPatchName(outChannel, nprogram, song->mtype(), track->type() == Track::DRUM);
190
if(midiTrackInfo->iPatch->text() != ("???"))
191
midiTrackInfo->iPatch->setText("???");
194
if(strcmp(midiTrackInfo->iPatch->text().latin1(), name) != 0)
196
//printf("Arranger::midiTrackInfoHeartBeat setting patch name\n");
198
midiTrackInfo->iPatch->setText(name);
203
if(program != nprogram)
208
//if (program == CTRL_VAL_UNKNOWN) {
210
// iPatch->setText("---");
214
MidiInstrument* instr = mp->instrument();
215
const char* name = instr->getPatchName(outChannel, program, song->mtype(), track->type() == Track::DRUM);
216
if(strcmp(midiTrackInfo->iPatch->text().latin1(), name) != 0)
217
midiTrackInfo->iPatch->setText(QString(name));
219
int hb = ((program >> 16) & 0xff) + 1;
222
int lb = ((program >> 8) & 0xff) + 1;
225
int pr = (program & 0xff) + 1;
230
//printf("Arranger::midiTrackInfoHeartBeat setting program\n");
232
if(midiTrackInfo->iHBank->value() != hb)
234
midiTrackInfo->iHBank->blockSignals(true);
235
midiTrackInfo->iHBank->setValue(hb);
236
midiTrackInfo->iHBank->blockSignals(false);
238
if(midiTrackInfo->iLBank->value() != lb)
240
midiTrackInfo->iLBank->blockSignals(true);
241
midiTrackInfo->iLBank->setValue(lb);
242
midiTrackInfo->iLBank->blockSignals(false);
244
if(midiTrackInfo->iProgram->value() != pr)
246
midiTrackInfo->iProgram->blockSignals(true);
247
midiTrackInfo->iProgram->setValue(pr);
248
midiTrackInfo->iProgram->blockSignals(false);
253
MidiController* mc = mp->midiController(CTRL_VOLUME);
254
int mn = mc->minVal();
255
int v = mp->hwCtrlState(outChannel, CTRL_VOLUME);
256
if(v == CTRL_VAL_UNKNOWN)
259
//if(v == CTRL_VAL_UNKNOWN)
269
if(midiTrackInfo->iLautst->value() != v)
271
//printf("Arranger::midiTrackInfoHeartBeat setting volume\n");
273
midiTrackInfo->iLautst->blockSignals(true);
274
//midiTrackInfo->iLautst->setRange(mn - 1, mc->maxVal());
275
midiTrackInfo->iLautst->setValue(v);
276
midiTrackInfo->iLautst->blockSignals(false);
280
mc = mp->midiController(CTRL_PANPOT);
282
v = mp->hwCtrlState(outChannel, CTRL_PANPOT);
283
if(v == CTRL_VAL_UNKNOWN)
286
//if(v == CTRL_VAL_UNKNOWN)
296
if(midiTrackInfo->iPan->value() != v)
298
//printf("Arranger::midiTrackInfoHeartBeat setting pan\n");
300
midiTrackInfo->iPan->blockSignals(true);
301
//midiTrackInfo->iPan->setRange(mn - 1, mc->maxVal());
302
midiTrackInfo->iPan->setValue(v);
303
midiTrackInfo->iPan->blockSignals(false);
307
// Does it include a midi controller value adjustment? Then handle it...
308
//if(flags & SC_MIDI_CONTROLLER)
312
if(midiTrackInfo->iTransp->value() != track->transposition)
313
midiTrackInfo->iTransp->setValue(track->transposition);
314
if(midiTrackInfo->iAnschl->value() != track->velocity)
315
midiTrackInfo->iAnschl->setValue(track->velocity);
316
if(midiTrackInfo->iVerz->value() != track->delay)
317
midiTrackInfo->iVerz->setValue(track->delay);
318
if(midiTrackInfo->iLen->value() != track->len)
319
midiTrackInfo->iLen->setValue(track->len);
320
if(midiTrackInfo->iKompr->value() != track->compression)
321
midiTrackInfo->iKompr->setValue(track->compression);
327
case Track::AUDIO_OUTPUT:
328
case Track::AUDIO_INPUT:
329
case Track::AUDIO_GROUP:
330
case Track::AUDIO_AUX:
331
case Track::AUDIO_SOFTSYNTH:
336
//---------------------------------------------------------
338
//---------------------------------------------------------
340
void Arranger::showTrackInfo(bool flag)
342
showTrackinfoFlag = flag;
343
trackInfo->setShown(flag);
344
infoScroll->setShown(flag);
348
//---------------------------------------------------------
350
//---------------------------------------------------------
352
void Arranger::genTrackInfo(QWidget* parent)
354
trackInfo = new WidgetStack(parent, "trackInfoStack");
356
noTrackInfo = new QWidget(trackInfo);
357
QPixmap *noInfoPix = new QPixmap(160, 1000); //muse_leftside_logo_xpm);
358
const QPixmap *logo = new QPixmap(muse_leftside_logo_xpm);
359
noInfoPix->fill(noTrackInfo->paletteBackgroundColor() );
360
copyBlt(noInfoPix, 10, 0, logo, 0,0, logo->width(), logo->height());
361
noTrackInfo->setPaletteBackgroundPixmap(*noInfoPix);
362
noTrackInfo->setGeometry(0, 0, 65, 200);
363
noTrackInfo->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding));
365
midiTrackInfo = new MidiTrackInfo(trackInfo);
366
trackInfo->addWidget(noTrackInfo, 0);
367
trackInfo->addWidget(midiTrackInfo, 1);
368
trackInfo->addWidget(0, 2);
373
//---------------------------------------------------------
375
//---------------------------------------------------------
377
void Arranger::updateTrackInfo(int flags)
379
if (!showTrackinfoFlag) {
387
if (selected->isMidiTrack()) {
389
updateMidiTrackInfo(flags);
396
//---------------------------------------------------------
398
//---------------------------------------------------------
400
void Arranger::switchInfo(int n)
403
AudioStrip* w = (AudioStrip*)(trackInfo->getWidget(2));
404
if (w == 0 || selected != w->getTrack()) {
407
w = new AudioStrip(trackInfo, (AudioTrack*)selected);
408
connect(song, SIGNAL(songChanged(int)), w, SLOT(songChanged(int)));
409
connect(muse, SIGNAL(configChanged()), w, SLOT(configChanged()));
410
w->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
411
trackInfo->addWidget(w, 2);
416
if (trackInfo->curIdx() == n)
418
trackInfo->raiseWidget(n);
422
//---------------------------------------------------------
423
// setTrackInfoLabelText
424
//---------------------------------------------------------
426
void Arranger::setTrackInfoLabelText()
428
MidiTrack* track = (MidiTrack*)selected;
430
midiTrackInfo->trackNameLabel->setText(track->name());
432
midiTrackInfo->trackNameLabel->setText(QString());
435
//---------------------------------------------------------
436
// setTrackInfoLabelFont
437
//---------------------------------------------------------
439
void Arranger::setTrackInfoLabelFont()
441
MidiTrack* track = (MidiTrack*)selected;
445
// Use the new font #6 I created just for these labels (so far).
446
// Set the label's font.
447
midiTrackInfo->trackNameLabel->setFont(config.fonts[6]);
448
// Dealing with a horizontally constrained label. Ignore vertical. Use a minimum readable point size.
449
autoAdjustFontSize(midiTrackInfo->trackNameLabel, midiTrackInfo->trackNameLabel->text(), false, true, config.fonts[6].pointSize(), 5);
452
// Removed by Tim. p3.3.9
455
//---------------------------------------------------------
457
//---------------------------------------------------------
459
void Arranger::iNameChanged()
461
QString txt = midiTrackInfo->iName->text();
462
if (txt == selected->name())
465
TrackList* tl = song->tracks();
466
for(iTrack i = tl->begin(); i != tl->end(); ++i)
468
if((*i)->name() == txt)
471
midiTrackInfo->iName->blockSignals(true);
472
midiTrackInfo->iName->setText(selected->name());
473
midiTrackInfo->iName->blockSignals(false);
475
QMessageBox::critical(this,
476
tr("MusE: bad trackname"),
477
tr("please choose a unique track name"),
479
QMessageBox::NoButton,
480
QMessageBox::NoButton);
482
midiTrackInfo->iName->setFocus();
487
//Track* track = selected->clone();
488
Track* track = selected->clone(false);
489
selected->setName(txt);
490
audio->msgChangeTrack(track, selected);
494
//---------------------------------------------------------
495
// iOutputChannelChanged
496
//---------------------------------------------------------
498
void Arranger::iOutputChannelChanged(int channel)
501
MidiTrack* track = (MidiTrack*)selected;
502
if (channel != track->outChannel()) {
504
//track->setOutChannel(channel);
505
audio->msgIdle(true);
506
//audio->msgSetTrackOutChannel(track, channel);
507
track->setOutChanAndUpdate(channel);
508
audio->msgIdle(false);
510
// may result in adding/removing mixer strip:
512
song->update(SC_MIDI_CHANNEL);
517
//---------------------------------------------------------
519
//---------------------------------------------------------
521
void Arranger::iInputChannelChanged(const QString& s)
523
MidiTrack* track = (MidiTrack*)selected;
524
int val = string2bitmap(s);
525
if (val != track->inChannelMask()) {
526
track->setInChannelMask(val);
532
//---------------------------------------------------------
533
// iOutputPortChanged
534
//---------------------------------------------------------
536
void Arranger::iOutputPortChanged(int index)
538
MidiTrack* track = (MidiTrack*)selected;
539
if (index == track->outPort())
542
//track->setOutPort(index);
543
audio->msgIdle(true);
544
//audio->msgSetTrackOutPort(track, index);
545
track->setOutPortAndUpdate(index);
546
audio->msgIdle(false);
552
//---------------------------------------------------------
554
//---------------------------------------------------------
556
void Arranger::iInputPortChanged(const QString& s)
558
// Changed by Tim. p3.3.8
559
//int val = string2bitmap(s);
560
unsigned int val = string2u32bitmap(s);
562
MidiTrack* track = (MidiTrack*)selected;
563
if (val == track->inPortMask())
565
track->setInPortMask(val);
570
//---------------------------------------------------------
571
// routingPopupMenuActivated
572
//---------------------------------------------------------
574
void Arranger::routingPopupMenuActivated(int n)
576
//if(gRoutingPopupMenuMaster != this || !track || !track->isMidiTrack())
577
if(!midiTrackInfo || gRoutingPopupMenuMaster != midiTrackInfo || !selected || !selected->isMidiTrack())
580
//if (n >= MIDI_PORTS * MIDI_CHANNELS) { // p3.3.50
581
// for (int i = 0; i < MIDI_CHANNELS; i++)
582
//muse->routingPopupMenuActivated(selected, i + MIDI_CHANNELS * (n-1000));
583
// muse->routingPopupMenuActivated(selected, i + MIDI_CHANNELS * (n - MIDI_PORTS * MIDI_CHANNELS)); // p3.3.50
586
muse->routingPopupMenuActivated(selected, n);
590
//---------------------------------------------------------
592
//---------------------------------------------------------
594
void Arranger::inRoutesPressed()
599
///song->chooseMidiRoutes(midiTrackInfo->iRButton, (MidiTrack*)selected, false);
601
if(!selected->isMidiTrack())
604
//song->chooseMidiRoutes(iR, (MidiTrack*)track, false);
605
PopupMenu* pup = muse->prepareRoutingPopupMenu(selected, false);
610
//gRoutingPopupMenuMaster = this;
611
gRoutingPopupMenuMaster = midiTrackInfo;
612
connect(pup, SIGNAL(activated(int)), SLOT(routingPopupMenuActivated(int)));
613
// Nope, can't clear menu and mm list in there, sub-menus stay open. Never mind for now...
614
connect(pup, SIGNAL(aboutToHide()), muse, SLOT(routingPopupMenuAboutToHide()));
615
pup->popup(QCursor::pos(), 0);
616
midiTrackInfo->iRButton->setDown(false);
620
//---------------------------------------------------------
622
//---------------------------------------------------------
624
void Arranger::outRoutesPressed()
629
///song->chooseMidiRoutes(midiTrackInfo->oRButton, (MidiTrack*)selected, true);
631
if(!selected->isMidiTrack())
634
//song->chooseMidiRoutes(iR, (MidiTrack*)track, false);
635
PopupMenu* pup = muse->prepareRoutingPopupMenu(selected, true);
640
//gRoutingPopupMenuMaster = this;
641
gRoutingPopupMenuMaster = midiTrackInfo;
642
connect(pup, SIGNAL(activated(int)), SLOT(routingPopupMenuActivated(int)));
643
// Nope, can't clear menu and mm list in there, sub-menus stay open. Never mind for now...
644
connect(pup, SIGNAL(aboutToHide()), muse, SLOT(routingPopupMenuAboutToHide()));
645
pup->popup(QCursor::pos(), 0);
646
midiTrackInfo->oRButton->setDown(false);
650
//---------------------------------------------------------
652
//---------------------------------------------------------
654
void Arranger::iProgHBankChanged()
656
MidiTrack* track = (MidiTrack*)selected;
657
int channel = track->outChannel();
658
int port = track->outPort();
659
int hbank = midiTrackInfo->iHBank->value();
660
int lbank = midiTrackInfo->iLBank->value();
661
int prog = midiTrackInfo->iProgram->value();
663
if (hbank > 0 && hbank < 129)
667
if (lbank > 0 && lbank < 129)
671
if (prog > 0 && prog < 129)
676
MidiPort* mp = &midiPorts[port];
677
if(prog == 0xff && hbank == 0xff && lbank == 0xff)
679
program = CTRL_VAL_UNKNOWN;
680
if(mp->hwCtrlState(channel, CTRL_PROGRAM) != CTRL_VAL_UNKNOWN)
681
audio->msgSetHwCtrlState(mp, channel, CTRL_PROGRAM, CTRL_VAL_UNKNOWN);
685
int np = mp->hwCtrlState(channel, CTRL_PROGRAM);
686
if(np == CTRL_VAL_UNKNOWN)
688
np = mp->lastValidHWCtrlState(channel, CTRL_PROGRAM);
689
if(np != CTRL_VAL_UNKNOWN)
691
lbank = (np & 0xff00) >> 8;
701
midiTrackInfo->iLBank->blockSignals(true);
702
midiTrackInfo->iProgram->blockSignals(true);
703
midiTrackInfo->iLBank->setValue(ilbnk);
704
midiTrackInfo->iProgram->setValue(iprog);
705
midiTrackInfo->iLBank->blockSignals(false);
706
midiTrackInfo->iProgram->blockSignals(false);
710
if(prog == 0xff && (hbank != 0xff || lbank != 0xff))
713
midiTrackInfo->iProgram->blockSignals(true);
714
midiTrackInfo->iProgram->setValue(1);
715
midiTrackInfo->iProgram->blockSignals(false);
717
program = (hbank << 16) + (lbank << 8) + prog;
718
MidiPlayEvent ev(0, port, channel, ME_CONTROLLER, CTRL_PROGRAM, program);
719
audio->msgPlayMidiEvent(&ev);
721
MidiInstrument* instr = mp->instrument();
722
const char* name = instr->getPatchName(channel, program, song->mtype(), track->type() == Track::DRUM);
723
midiTrackInfo->iPatch->setText(QString(name));
724
// updateTrackInfo();
727
//---------------------------------------------------------
729
//---------------------------------------------------------
731
void Arranger::iProgLBankChanged()
733
MidiTrack* track = (MidiTrack*)selected;
734
int channel = track->outChannel();
735
int port = track->outPort();
736
int hbank = midiTrackInfo->iHBank->value();
737
int lbank = midiTrackInfo->iLBank->value();
738
int prog = midiTrackInfo->iProgram->value();
740
if (hbank > 0 && hbank < 129)
744
if (lbank > 0 && lbank < 129)
748
if (prog > 0 && prog < 129)
753
MidiPort* mp = &midiPorts[port];
754
if(prog == 0xff && hbank == 0xff && lbank == 0xff)
756
program = CTRL_VAL_UNKNOWN;
757
if(mp->hwCtrlState(channel, CTRL_PROGRAM) != CTRL_VAL_UNKNOWN)
758
audio->msgSetHwCtrlState(mp, channel, CTRL_PROGRAM, CTRL_VAL_UNKNOWN);
762
int np = mp->hwCtrlState(channel, CTRL_PROGRAM);
763
if(np == CTRL_VAL_UNKNOWN)
765
np = mp->lastValidHWCtrlState(channel, CTRL_PROGRAM);
766
if(np != CTRL_VAL_UNKNOWN)
768
hbank = (np & 0xff0000) >> 16;
778
midiTrackInfo->iHBank->blockSignals(true);
779
midiTrackInfo->iProgram->blockSignals(true);
780
midiTrackInfo->iHBank->setValue(ihbnk);
781
midiTrackInfo->iProgram->setValue(iprog);
782
midiTrackInfo->iHBank->blockSignals(false);
783
midiTrackInfo->iProgram->blockSignals(false);
787
if(prog == 0xff && (hbank != 0xff || lbank != 0xff))
790
midiTrackInfo->iProgram->blockSignals(true);
791
midiTrackInfo->iProgram->setValue(1);
792
midiTrackInfo->iProgram->blockSignals(false);
794
program = (hbank << 16) + (lbank << 8) + prog;
795
MidiPlayEvent ev(0, port, channel, ME_CONTROLLER, CTRL_PROGRAM, program);
796
audio->msgPlayMidiEvent(&ev);
798
MidiInstrument* instr = mp->instrument();
799
const char* name = instr->getPatchName(channel, program, song->mtype(), track->type() == Track::DRUM);
800
midiTrackInfo->iPatch->setText(QString(name));
801
// updateTrackInfo();
804
//---------------------------------------------------------
806
//---------------------------------------------------------
808
void Arranger::iProgramChanged()
810
MidiTrack* track = (MidiTrack*)selected;
811
int channel = track->outChannel();
812
int port = track->outPort();
813
int hbank = midiTrackInfo->iHBank->value();
814
int lbank = midiTrackInfo->iLBank->value();
815
int prog = midiTrackInfo->iProgram->value();
817
if (hbank > 0 && hbank < 129)
821
if (lbank > 0 && lbank < 129)
825
if (prog > 0 && prog < 129)
830
MidiPort *mp = &midiPorts[port];
833
program = CTRL_VAL_UNKNOWN;
834
midiTrackInfo->iHBank->blockSignals(true);
835
midiTrackInfo->iLBank->blockSignals(true);
836
midiTrackInfo->iHBank->setValue(0);
837
midiTrackInfo->iLBank->setValue(0);
838
midiTrackInfo->iHBank->blockSignals(false);
839
midiTrackInfo->iLBank->blockSignals(false);
841
if(mp->hwCtrlState(channel, CTRL_PROGRAM) != CTRL_VAL_UNKNOWN)
842
audio->msgSetHwCtrlState(mp, channel, CTRL_PROGRAM, CTRL_VAL_UNKNOWN);
847
int np = mp->hwCtrlState(channel, CTRL_PROGRAM);
848
if(np == CTRL_VAL_UNKNOWN)
850
np = mp->lastValidHWCtrlState(channel, CTRL_PROGRAM);
851
if(np != CTRL_VAL_UNKNOWN)
853
hbank = (np & 0xff0000) >> 16;
854
lbank = (np & 0xff00) >> 8;
863
midiTrackInfo->iHBank->blockSignals(true);
864
midiTrackInfo->iLBank->blockSignals(true);
865
midiTrackInfo->iHBank->setValue(ihbnk);
866
midiTrackInfo->iLBank->setValue(ilbnk);
867
midiTrackInfo->iHBank->blockSignals(false);
868
midiTrackInfo->iLBank->blockSignals(false);
871
program = (hbank << 16) + (lbank << 8) + prog;
872
MidiPlayEvent ev(0, port, channel, ME_CONTROLLER, CTRL_PROGRAM, program);
873
audio->msgPlayMidiEvent(&ev);
875
MidiInstrument* instr = mp->instrument();
876
const char* name = instr->getPatchName(channel, program, song->mtype(), track->type() == Track::DRUM);
877
midiTrackInfo->iPatch->setText(QString(name));
880
// updateTrackInfo();
883
//---------------------------------------------------------
885
//---------------------------------------------------------
887
void Arranger::iLautstChanged(int val)
889
MidiTrack* track = (MidiTrack*)selected;
890
int outPort = track->outPort();
891
int chan = track->outChannel();
892
MidiPort* mp = &midiPorts[outPort];
893
MidiController* mctl = mp->midiController(CTRL_VOLUME);
894
if((val < mctl->minVal()) || (val > mctl->maxVal()))
896
if(mp->hwCtrlState(chan, CTRL_VOLUME) != CTRL_VAL_UNKNOWN)
897
audio->msgSetHwCtrlState(mp, chan, CTRL_VOLUME, CTRL_VAL_UNKNOWN);
903
MidiPlayEvent ev(0, outPort, chan,
904
ME_CONTROLLER, CTRL_VOLUME, val);
905
audio->msgPlayMidiEvent(&ev);
907
song->update(SC_MIDI_CONTROLLER);
910
//---------------------------------------------------------
912
//---------------------------------------------------------
914
void Arranger::iTranspChanged(int val)
916
MidiTrack* track = (MidiTrack*)selected;
917
track->transposition = val;
920
//---------------------------------------------------------
922
//---------------------------------------------------------
924
void Arranger::iAnschlChanged(int val)
926
MidiTrack* track = (MidiTrack*)selected;
927
track->velocity = val;
930
//---------------------------------------------------------
932
//---------------------------------------------------------
934
void Arranger::iVerzChanged(int val)
936
MidiTrack* track = (MidiTrack*)selected;
940
//---------------------------------------------------------
942
//---------------------------------------------------------
944
void Arranger::iLenChanged(int val)
946
MidiTrack* track = (MidiTrack*)selected;
950
//---------------------------------------------------------
952
//---------------------------------------------------------
954
void Arranger::iKomprChanged(int val)
956
MidiTrack* track = (MidiTrack*)selected;
957
track->compression = val;
960
//---------------------------------------------------------
962
//---------------------------------------------------------
964
void Arranger::iPanChanged(int val)
966
MidiTrack* track = (MidiTrack*)selected;
967
int port = track->outPort();
968
int chan = track->outChannel();
969
MidiPort* mp = &midiPorts[port];
970
MidiController* mctl = mp->midiController(CTRL_PANPOT);
971
if((val < mctl->minVal()) || (val > mctl->maxVal()))
973
if(mp->hwCtrlState(chan, CTRL_PANPOT) != CTRL_VAL_UNKNOWN)
974
audio->msgSetHwCtrlState(mp, chan, CTRL_PANPOT, CTRL_VAL_UNKNOWN);
981
MidiPlayEvent ev(0, port, chan,
982
ME_CONTROLLER, CTRL_PANPOT, val);
983
audio->msgPlayMidiEvent(&ev);
985
song->update(SC_MIDI_CONTROLLER);
988
//---------------------------------------------------------
990
//---------------------------------------------------------
992
void Arranger::instrPopup()
994
MidiTrack* track = (MidiTrack*)selected;
995
int channel = track->outChannel();
996
int port = track->outPort();
997
MidiInstrument* instr = midiPorts[port].instrument();
998
instr->populatePatchPopup(pop, channel, song->mtype(), track->type() == Track::DRUM);
1000
if(pop->count() == 0)
1002
int rv = pop->exec(midiTrackInfo->iPatch->mapToGlobal(QPoint(10,5)));
1004
MidiPlayEvent ev(0, port, channel, ME_CONTROLLER, CTRL_PROGRAM, rv);
1005
audio->msgPlayMidiEvent(&ev);
1006
updateTrackInfo(-1);
1010
//---------------------------------------------------------
1012
//---------------------------------------------------------
1014
void Arranger::recEchoToggled(bool v)
1016
MidiTrack* track = (MidiTrack*)selected;
1017
track->setRecEcho(v);
1019
//song->update(SC_???);
1022
//---------------------------------------------------------
1023
// iProgramDoubleClicked
1024
//---------------------------------------------------------
1026
void Arranger::iProgramDoubleClicked()
1028
MidiTrack* track = (MidiTrack*)selected;
1029
int port = track->outPort();
1030
int chan = track->outChannel();
1031
MidiPort* mp = &midiPorts[port];
1032
MidiController* mctl = mp->midiController(CTRL_PROGRAM);
1037
int lastv = mp->lastValidHWCtrlState(chan, CTRL_PROGRAM);
1038
int curv = mp->hwCtrlState(chan, CTRL_PROGRAM);
1040
if(curv == CTRL_VAL_UNKNOWN)
1042
// If no value has ever been set yet, use the current knob value
1043
// (or the controller's initial value?) to 'turn on' the controller.
1044
if(lastv == CTRL_VAL_UNKNOWN)
1046
int kiv = mctl->initVal();
1047
//int kiv = lrint(_knob->value());
1048
if(kiv == CTRL_VAL_UNKNOWN)
1052
//if(kiv < mctrl->minVal())
1053
// kiv = mctrl->minVal();
1054
//if(kiv > mctrl->maxVal())
1055
// kiv = mctrl->maxVal();
1056
//kiv += mctrl->bias();
1059
//MidiPlayEvent ev(0, port, chan, ME_CONTROLLER, num, kiv);
1060
MidiPlayEvent ev(0, port, chan, ME_CONTROLLER, CTRL_PROGRAM, kiv);
1061
audio->msgPlayMidiEvent(&ev);
1065
MidiPlayEvent ev(0, port, chan, ME_CONTROLLER, CTRL_PROGRAM, lastv);
1066
audio->msgPlayMidiEvent(&ev);
1071
if(mp->hwCtrlState(chan, CTRL_PROGRAM) != CTRL_VAL_UNKNOWN)
1072
audio->msgSetHwCtrlState(mp, chan, CTRL_PROGRAM, CTRL_VAL_UNKNOWN);
1075
song->update(SC_MIDI_CONTROLLER);
1078
//---------------------------------------------------------
1079
// iLautstDoubleClicked
1080
//---------------------------------------------------------
1082
void Arranger::iLautstDoubleClicked()
1084
MidiTrack* track = (MidiTrack*)selected;
1085
int port = track->outPort();
1086
int chan = track->outChannel();
1087
MidiPort* mp = &midiPorts[port];
1088
MidiController* mctl = mp->midiController(CTRL_VOLUME);
1093
int lastv = mp->lastValidHWCtrlState(chan, CTRL_VOLUME);
1094
int curv = mp->hwCtrlState(chan, CTRL_VOLUME);
1096
if(curv == CTRL_VAL_UNKNOWN)
1098
// If no value has ever been set yet, use the current knob value
1099
// (or the controller's initial value?) to 'turn on' the controller.
1100
if(lastv == CTRL_VAL_UNKNOWN)
1102
int kiv = mctl->initVal();
1103
//int kiv = lrint(_knob->value());
1104
if(kiv == CTRL_VAL_UNKNOWN)
1105
// Set volume to 78% of range, so that if range is 0 - 127, then value is 100.
1106
kiv = lround(double(mctl->maxVal() - mctl->minVal()) * 0.7874);
1109
if(kiv < mctl->minVal())
1110
kiv = mctl->minVal();
1111
if(kiv > mctl->maxVal())
1112
kiv = mctl->maxVal();
1113
kiv += mctl->bias();
1116
MidiPlayEvent ev(0, port, chan, ME_CONTROLLER, CTRL_VOLUME, kiv);
1117
audio->msgPlayMidiEvent(&ev);
1121
MidiPlayEvent ev(0, port, chan, ME_CONTROLLER, CTRL_VOLUME, lastv);
1122
audio->msgPlayMidiEvent(&ev);
1127
if(mp->hwCtrlState(chan, CTRL_VOLUME) != CTRL_VAL_UNKNOWN)
1128
audio->msgSetHwCtrlState(mp, chan, CTRL_VOLUME, CTRL_VAL_UNKNOWN);
1131
song->update(SC_MIDI_CONTROLLER);
1134
//---------------------------------------------------------
1135
// iPanDoubleClicked
1136
//---------------------------------------------------------
1138
void Arranger::iPanDoubleClicked()
1140
MidiTrack* track = (MidiTrack*)selected;
1141
int port = track->outPort();
1142
int chan = track->outChannel();
1143
MidiPort* mp = &midiPorts[port];
1144
MidiController* mctl = mp->midiController(CTRL_PANPOT);
1149
int lastv = mp->lastValidHWCtrlState(chan, CTRL_PANPOT);
1150
int curv = mp->hwCtrlState(chan, CTRL_PANPOT);
1152
if(curv == CTRL_VAL_UNKNOWN)
1154
// If no value has ever been set yet, use the current knob value
1155
// (or the controller's initial value?) to 'turn on' the controller.
1156
if(lastv == CTRL_VAL_UNKNOWN)
1158
int kiv = mctl->initVal();
1159
//int kiv = lrint(_knob->value());
1160
if(kiv == CTRL_VAL_UNKNOWN)
1161
// Set volume to 50% of range, so that if range is 0 - 127, then value is 64.
1162
kiv = lround(double(mctl->maxVal() - mctl->minVal()) * 0.5);
1165
if(kiv < mctl->minVal())
1166
kiv = mctl->minVal();
1167
if(kiv > mctl->maxVal())
1168
kiv = mctl->maxVal();
1169
kiv += mctl->bias();
1172
MidiPlayEvent ev(0, port, chan, ME_CONTROLLER, CTRL_PANPOT, kiv);
1173
audio->msgPlayMidiEvent(&ev);
1177
MidiPlayEvent ev(0, port, chan, ME_CONTROLLER, CTRL_PANPOT, lastv);
1178
audio->msgPlayMidiEvent(&ev);
1183
if(mp->hwCtrlState(chan, CTRL_PANPOT) != CTRL_VAL_UNKNOWN)
1184
audio->msgSetHwCtrlState(mp, chan, CTRL_PANPOT, CTRL_VAL_UNKNOWN);
1187
song->update(SC_MIDI_CONTROLLER);
1190
//---------------------------------------------------------
1192
//---------------------------------------------------------
1194
void Arranger::genMidiTrackInfo()
1196
//midiTrackInfo->iChanDetectLabel->setPixmap(*darkgreendotIcon);
1197
midiTrackInfo->iChanDetectLabel->setPixmap(*darkRedLedIcon);
1199
QIconSet recEchoIconSet;
1200
recEchoIconSet.setPixmap(*recEchoIconOn, QIconSet::Automatic, QIconSet::Normal, QIconSet::On);
1201
recEchoIconSet.setPixmap(*recEchoIconOff, QIconSet::Automatic, QIconSet::Normal, QIconSet::Off);
1202
midiTrackInfo->recEchoButton->setIconSet(recEchoIconSet);
1204
//midiTrackInfo->trackNameLabel->setAlignment(AlignCenter | WordBreak);
1205
//midiTrackInfo->trackNameLabel->setSizePolicy(QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Minimum));
1206
//frameShape WinPanel
1207
//frameShadow Raised
1210
midiTrackInfo->trackNameLabel->setBackgroundColor(QColor(0, 160, 255)); // Med blue
1212
// Added by Tim. p3.3.9
1213
setTrackInfoLabelText();
1214
setTrackInfoLabelFont();
1217
connect(midiTrackInfo->iPatch, SIGNAL(released()), SLOT(instrPopup()));
1219
pop = new QPopupMenu(midiTrackInfo->iPatch);
1220
pop->setCheckable(false);
1222
// Removed by Tim. p3.3.9
1223
//connect(midiTrackInfo->iName, SIGNAL(returnPressed()), SLOT(iNameChanged()));
1225
connect(midiTrackInfo->iOutputChannel, SIGNAL(valueChanged(int)), SLOT(iOutputChannelChanged(int)));
1226
///connect(midiTrackInfo->iInputChannel, SIGNAL(textChanged(const QString&)), SLOT(iInputChannelChanged(const QString&)));
1227
connect(midiTrackInfo->iHBank, SIGNAL(valueChanged(int)), SLOT(iProgHBankChanged()));
1228
connect(midiTrackInfo->iLBank, SIGNAL(valueChanged(int)), SLOT(iProgLBankChanged()));
1229
connect(midiTrackInfo->iProgram, SIGNAL(valueChanged(int)), SLOT(iProgramChanged()));
1230
connect(midiTrackInfo->iHBank, SIGNAL(doubleClicked()), SLOT(iProgramDoubleClicked()));
1231
connect(midiTrackInfo->iLBank, SIGNAL(doubleClicked()), SLOT(iProgramDoubleClicked()));
1232
connect(midiTrackInfo->iProgram, SIGNAL(doubleClicked()), SLOT(iProgramDoubleClicked()));
1233
connect(midiTrackInfo->iLautst, SIGNAL(valueChanged(int)), SLOT(iLautstChanged(int)));
1234
connect(midiTrackInfo->iLautst, SIGNAL(doubleClicked()), SLOT(iLautstDoubleClicked()));
1235
connect(midiTrackInfo->iTransp, SIGNAL(valueChanged(int)), SLOT(iTranspChanged(int)));
1236
connect(midiTrackInfo->iAnschl, SIGNAL(valueChanged(int)), SLOT(iAnschlChanged(int)));
1237
connect(midiTrackInfo->iVerz, SIGNAL(valueChanged(int)), SLOT(iVerzChanged(int)));
1238
connect(midiTrackInfo->iLen, SIGNAL(valueChanged(int)), SLOT(iLenChanged(int)));
1239
connect(midiTrackInfo->iKompr, SIGNAL(valueChanged(int)), SLOT(iKomprChanged(int)));
1240
connect(midiTrackInfo->iPan, SIGNAL(valueChanged(int)), SLOT(iPanChanged(int)));
1241
connect(midiTrackInfo->iPan, SIGNAL(doubleClicked()), SLOT(iPanDoubleClicked()));
1242
connect(midiTrackInfo->iOutput, SIGNAL(activated(int)), SLOT(iOutputPortChanged(int)));
1243
///connect(midiTrackInfo->iInput, SIGNAL(textChanged(const QString&)), SLOT(iInputPortChanged(const QString&)));
1244
connect(midiTrackInfo->recordButton, SIGNAL(clicked()), SLOT(recordClicked()));
1245
connect(midiTrackInfo->progRecButton, SIGNAL(clicked()), SLOT(progRecClicked()));
1246
connect(midiTrackInfo->volRecButton, SIGNAL(clicked()), SLOT(volRecClicked()));
1247
connect(midiTrackInfo->panRecButton, SIGNAL(clicked()), SLOT(panRecClicked()));
1248
connect(midiTrackInfo->recEchoButton, SIGNAL(toggled(bool)), SLOT(recEchoToggled(bool)));
1249
connect(midiTrackInfo->iRButton, SIGNAL(pressed()), SLOT(inRoutesPressed()));
1251
// TODO: Works OK, but disabled for now, until we figure out what to do about multiple out routes and display values...
1252
midiTrackInfo->oRButton->setEnabled(false);
1253
connect(midiTrackInfo->oRButton, SIGNAL(pressed()), SLOT(outRoutesPressed()));
1255
connect(heartBeatTimer, SIGNAL(timeout()), SLOT(midiTrackInfoHeartBeat()));
1258
//---------------------------------------------------------
1259
// updateMidiTrackInfo
1260
//---------------------------------------------------------
1262
void Arranger::updateMidiTrackInfo(int flags)
1264
MidiTrack* track = (MidiTrack*)selected;
1266
// Is it simply a midi controller value adjustment? Forget it.
1267
if(flags == SC_MIDI_CONTROLLER)
1270
// p3.3.47 Update the routing popup menu if anything relevant changes.
1271
//if(gRoutingPopupMenuMaster == midiTrackInfo && selected && (flags & (SC_ROUTE | SC_CHANNELS | SC_CONFIG)))
1272
if(flags & (SC_ROUTE | SC_CHANNELS | SC_CONFIG)) // p3.3.50
1273
// Use this handy shared routine.
1274
//muse->updateRouteMenus(selected);
1275
muse->updateRouteMenus(selected, midiTrackInfo); // p3.3.50
1277
// Added by Tim. p3.3.9
1278
setTrackInfoLabelText();
1279
setTrackInfoLabelFont();
1282
int outChannel = track->outChannel();
1283
///int inChannel = track->inChannelMask();
1284
int outPort = track->outPort();
1285
//int inPort = track->inPortMask();
1286
///unsigned int inPort = track->inPortMask();
1288
//midiTrackInfo->iInput->clear();
1289
midiTrackInfo->iOutput->clear();
1291
for (int i = 0; i < MIDI_PORTS; ++i) {
1293
name.sprintf("%d:%s", i+1, midiPorts[i].portname().latin1());
1294
midiTrackInfo->iOutput->insertItem(name, i);
1296
midiTrackInfo->iOutput->setCurrentItem(i);
1298
//midiTrackInfo->iInput->setText(bitmap2String(inPort));
1299
///midiTrackInfo->iInput->setText(u32bitmap2String(inPort));
1301
//midiTrackInfo->iInputChannel->setText(bitmap2String(inChannel));
1303
// Removed by Tim. p3.3.9
1304
//if (midiTrackInfo->iName->text() != selected->name()) {
1305
// midiTrackInfo->iName->setText(selected->name());
1306
// midiTrackInfo->iName->home(false);
1309
midiTrackInfo->iOutputChannel->setValue(outChannel+1);
1310
///midiTrackInfo->iInputChannel->setText(bitmap2String(inChannel));
1313
if(midiTrackInfo->recEchoButton->isOn() != track->recEcho())
1315
midiTrackInfo->recEchoButton->blockSignals(true);
1316
midiTrackInfo->recEchoButton->setOn(track->recEcho());
1317
midiTrackInfo->recEchoButton->blockSignals(false);
1320
MidiPort* mp = &midiPorts[outPort];
1321
int nprogram = mp->hwCtrlState(outChannel, CTRL_PROGRAM);
1322
if(nprogram == CTRL_VAL_UNKNOWN)
1324
midiTrackInfo->iHBank->blockSignals(true);
1325
midiTrackInfo->iLBank->blockSignals(true);
1326
midiTrackInfo->iProgram->blockSignals(true);
1327
midiTrackInfo->iHBank->setValue(0);
1328
midiTrackInfo->iLBank->setValue(0);
1329
midiTrackInfo->iProgram->setValue(0);
1330
midiTrackInfo->iHBank->blockSignals(false);
1331
midiTrackInfo->iLBank->blockSignals(false);
1332
midiTrackInfo->iProgram->blockSignals(false);
1334
program = CTRL_VAL_UNKNOWN;
1335
nprogram = mp->lastValidHWCtrlState(outChannel, CTRL_PROGRAM);
1336
if(nprogram == CTRL_VAL_UNKNOWN)
1337
//midiTrackInfo->iPatch->setText(QString("<unknown>"));
1338
midiTrackInfo->iPatch->setText(tr("<unknown>"));
1341
MidiInstrument* instr = mp->instrument();
1342
const char* name = instr->getPatchName(outChannel, nprogram, song->mtype(), track->type() == Track::DRUM);
1343
midiTrackInfo->iPatch->setText(QString(name));
1347
//if (program != nprogram)
1352
//if (program == CTRL_VAL_UNKNOWN) {
1353
// hb = lb = pr = 0;
1354
// midiTrackInfo->iPatch->setText("---");
1358
MidiInstrument* instr = mp->instrument();
1359
const char* name = instr->getPatchName(outChannel, program, song->mtype(), track->type() == Track::DRUM);
1360
midiTrackInfo->iPatch->setText(QString(name));
1362
int hb = ((program >> 16) & 0xff) + 1;
1365
int lb = ((program >> 8) & 0xff) + 1;
1368
int pr = (program & 0xff) + 1;
1372
midiTrackInfo->iHBank->blockSignals(true);
1373
midiTrackInfo->iLBank->blockSignals(true);
1374
midiTrackInfo->iProgram->blockSignals(true);
1376
midiTrackInfo->iHBank->setValue(hb);
1377
midiTrackInfo->iLBank->setValue(lb);
1378
midiTrackInfo->iProgram->setValue(pr);
1380
midiTrackInfo->iHBank->blockSignals(false);
1381
midiTrackInfo->iLBank->blockSignals(false);
1382
midiTrackInfo->iProgram->blockSignals(false);
1385
MidiController* mc = mp->midiController(CTRL_VOLUME);
1386
int mn = mc->minVal();
1387
int v = mp->hwCtrlState(outChannel, CTRL_VOLUME);
1389
if(v == CTRL_VAL_UNKNOWN)
1391
//v = mc->initVal();
1392
//if(v == CTRL_VAL_UNKNOWN)
1399
midiTrackInfo->iLautst->blockSignals(true);
1400
midiTrackInfo->iLautst->setRange(mn - 1, mc->maxVal());
1401
midiTrackInfo->iLautst->setValue(v);
1402
midiTrackInfo->iLautst->blockSignals(false);
1404
mc = mp->midiController(CTRL_PANPOT);
1406
v = mp->hwCtrlState(outChannel, CTRL_PANPOT);
1408
if(v == CTRL_VAL_UNKNOWN)
1410
//v = mc->initVal();
1411
//if(v == CTRL_VAL_UNKNOWN)
1418
midiTrackInfo->iPan->blockSignals(true);
1419
midiTrackInfo->iPan->setRange(mn - 1, mc->maxVal());
1420
midiTrackInfo->iPan->setValue(v);
1421
midiTrackInfo->iPan->blockSignals(false);
1425
// Does it include a midi controller value adjustment? Then handle it...
1426
//if(flags & SC_MIDI_CONTROLLER)
1429
// Is it simply a midi controller value adjustment? Forget it.
1430
//if(flags != SC_MIDI_CONTROLLER)
1432
midiTrackInfo->iTransp->setValue(track->transposition);
1433
midiTrackInfo->iAnschl->setValue(track->velocity);
1434
midiTrackInfo->iVerz->setValue(track->delay);
1435
midiTrackInfo->iLen->setValue(track->len);
1436
midiTrackInfo->iKompr->setValue(track->compression);
1441
//---------------------------------------------------------
1443
// change values akkording to seek position
1444
//---------------------------------------------------------
1446
void Arranger::seek()
1448
if (!showTrackinfoFlag || !selected)
1450
switch(selected->type()) {
1454
MidiTrack* track = (MidiTrack*)selected;
1455
int outPort = track->outPort();
1456
int outChannel = track->outChannel();
1457
MidiPort* mp = &midiPorts[outPort];
1459
// int nprogram = mp->getCtrl(outChannel, tick, CTRL_PROGRAM);
1460
int nprogram = mp->hwCtrlState(outChannel, CTRL_PROGRAM);
1461
if(nprogram == CTRL_VAL_UNKNOWN)
1463
midiTrackInfo->iHBank->blockSignals(true);
1464
midiTrackInfo->iLBank->blockSignals(true);
1465
midiTrackInfo->iProgram->blockSignals(true);
1466
midiTrackInfo->iHBank->setValue(0);
1467
midiTrackInfo->iLBank->setValue(0);
1468
midiTrackInfo->iProgram->setValue(0);
1469
midiTrackInfo->iHBank->blockSignals(false);
1470
midiTrackInfo->iLBank->blockSignals(false);
1471
midiTrackInfo->iProgram->blockSignals(false);
1473
program = CTRL_VAL_UNKNOWN;
1474
nprogram = mp->lastValidHWCtrlState(outChannel, CTRL_PROGRAM);
1475
if(nprogram == CTRL_VAL_UNKNOWN)
1476
midiTrackInfo->iPatch->setText(QString("<unknown>"));
1479
MidiInstrument* instr = mp->instrument();
1480
const char* name = instr->getPatchName(outChannel, nprogram, song->mtype(), track->type() == Track::DRUM);
1481
midiTrackInfo->iPatch->setText(QString(name));
1485
if (program != nprogram) {
1489
//if (program == CTRL_VAL_UNKNOWN) {
1490
// hb = lb = pr = 0;
1491
// midiTrackInfo->iPatch->setText("---");
1495
MidiInstrument* instr = mp->instrument();
1496
const char* name = instr->getPatchName(outChannel, program, song->mtype(), track->type() == Track::DRUM);
1497
midiTrackInfo->iPatch->setText(QString(name));
1499
int hb = ((program >> 16) & 0xff) + 1;
1502
int lb = ((program >> 8) & 0xff) + 1;
1505
int pr = (program & 0xff) + 1;
1509
midiTrackInfo->iHBank->blockSignals(true);
1510
midiTrackInfo->iLBank->blockSignals(true);
1511
midiTrackInfo->iProgram->blockSignals(true);
1513
midiTrackInfo->iHBank->setValue(hb);
1514
midiTrackInfo->iLBank->setValue(lb);
1515
midiTrackInfo->iProgram->setValue(pr);
1517
midiTrackInfo->iHBank->blockSignals(false);
1518
midiTrackInfo->iLBank->blockSignals(false);
1519
midiTrackInfo->iProgram->blockSignals(false);
1522
//int nvolume = midiPorts[outPort].getCtrl(outChannel, tick, CTRL_VOLUME);
1523
// int npan = midiPorts[outPort].getCtrl(outChannel, tick, CTRL_PANPOT);
1524
MidiController* mc = mp->midiController(CTRL_VOLUME);
1525
int v = mp->hwCtrlState(outChannel, CTRL_VOLUME);
1529
if(v == CTRL_VAL_UNKNOWN)
1530
v = mc->minVal() - 1;
1533
midiTrackInfo->iLautst->blockSignals(true);
1534
midiTrackInfo->iLautst->setValue(v);
1535
midiTrackInfo->iLautst->blockSignals(false);
1537
mc = mp->midiController(CTRL_PANPOT);
1538
v = mp->hwCtrlState(outChannel, CTRL_PANPOT);
1542
if(v == CTRL_VAL_UNKNOWN)
1544
//v = mc->initVal();
1545
//if(v == CTRL_VAL_UNKNOWN)
1547
v = mc->minVal() - 1;
1552
midiTrackInfo->iPan->blockSignals(true);
1553
midiTrackInfo->iPan->setValue(v);
1554
midiTrackInfo->iPan->blockSignals(false);
1560
case Track::AUDIO_OUTPUT:
1561
case Track::AUDIO_INPUT:
1562
case Track::AUDIO_GROUP:
1563
case Track::AUDIO_AUX:
1564
case Track::AUDIO_SOFTSYNTH: