summaryrefslogtreecommitdiff
path: root/muse2/muse/ctrl
diff options
context:
space:
mode:
authorTim E. Real <termtech@rogers.com>2012-10-27 09:58:29 +0000
committerTim E. Real <termtech@rogers.com>2012-10-27 09:58:29 +0000
commitb1776f093d4b87ad2635990f429f4503157f6288 (patch)
treea18bcc5e23674d74037c87e0541f9feefdc7b9ca /muse2/muse/ctrl
parentb297348e8e2cd76be6f1d546fb458865cc4d263b (diff)
Improved: Velocity graphs. Icon for showing per-note or all velocities. Also found in Settings.
Improved: Piano KB has current selected note (yellow). For velocity/polyaftertouch/other per-note ctrls. Bad timing warning now has "don't show again". Added 'speaker' icon to drum edit. And drum list and piano keyboard now obey the 'speaker' icon.
Diffstat (limited to 'muse2/muse/ctrl')
-rw-r--r--muse2/muse/ctrl/ctrlcanvas.cpp42
-rw-r--r--muse2/muse/ctrl/ctrlpanel.cpp79
-rw-r--r--muse2/muse/ctrl/ctrlpanel.h9
3 files changed, 82 insertions, 48 deletions
diff --git a/muse2/muse/ctrl/ctrlcanvas.cpp b/muse2/muse/ctrl/ctrlcanvas.cpp
index 1774174f..6e92f3c6 100644
--- a/muse2/muse/ctrl/ctrlcanvas.cpp
+++ b/muse2/muse/ctrl/ctrlcanvas.cpp
@@ -511,16 +511,14 @@ void CtrlCanvas::partControllers(const MusECore::MidiPart* part, int num, int* d
int di;
int n;
- if(!mt->isDrumTrack() && curDrumPitch != -1)
- printf("keyfilter != -1 in non drum track?\n");
-
if((mt->type() == MusECore::Track::DRUM) && (curDrumPitch >= 0) && ((num & 0xff) == 0xff))
{
di = (num & ~0xff) | curDrumPitch;
n = (num & ~0xff) | MusEGlobal::drumMap[curDrumPitch].anote; // construct real controller number
mp = &MusEGlobal::midiPorts[MusEGlobal::drumMap[curDrumPitch].port];
}
- else if ((mt->type() == MusECore::Track::NEW_DRUM) && (curDrumPitch >= 0) && ((num & 0xff) == 0xff)) //FINDMICHJETZT does this work?
+ else if ((mt->type() == MusECore::Track::NEW_DRUM || mt->type() == MusECore::Track::MIDI) &&
+ (curDrumPitch >= 0) && ((num & 0xff) == 0xff)) //FINDMICHJETZT does this work?
{
di = (num & ~0xff) | curDrumPitch;
n = (num & ~0xff) | curDrumPitch;
@@ -599,12 +597,8 @@ void CtrlCanvas::updateItems()
if(_cnum == MusECore::CTRL_VELOCITY && e.type() == MusECore::Note)
{
newev = 0;
- if (curDrumPitch == -1) // and NOT >=0
- {
- // This is interesting - it would allow ALL drum note velocities to be shown.
- // But currently the drum list ALWAYS has a selected item so this is not supposed to happen.
+ if (curDrumPitch == -1 || !MusEGlobal::config.velocityPerNote) // and NOT >=0
items.add(newev = new CEvent(e, part, e.velo()));
- }
else if (e.dataA() == curDrumPitch) //same note. if curDrumPitch==-2, this never is true
items.add(newev = new CEvent(e, part, e.velo()));
if(newev && e.selected())
@@ -615,32 +609,16 @@ void CtrlCanvas::updateItems()
int ctl = e.dataA();
if(part->track() && part->track()->type() == MusECore::Track::DRUM && (_cnum & 0xff) == 0xff)
{
- //MusECore::MidiPort* port = &MusEGlobal::midiPorts[part->track()->outPort()];
if(curDrumPitch < 0)
- //if(curDrumPitch >= 0)
continue;
- //{
- //MusECore::MidiPort* port = &MusEGlobal::midiPorts[MusEGlobal::drumMap[curDrumPitch].port];
- //MusECore::MidiPort* port = &MusEGlobal::midiPorts[MusEGlobal::drumMap[ctl & 0x7f].port];
- int port = MusEGlobal::drumMap[ctl & 0x7f].port;
- int chan = MusEGlobal::drumMap[ctl & 0x7f].channel;
- //MusECore::MidiPort* cur_port = &MusEGlobal::midiPorts[MusEGlobal::drumMap[curDrumPitch].port];
- int cur_port = MusEGlobal::drumMap[curDrumPitch].port;
- int cur_chan = MusEGlobal::drumMap[curDrumPitch].channel;
- if((port != cur_port) || (chan != cur_chan))
- continue;
- // Is it a drum controller event, according to the track port's instrument?
- //MusECore::MidiController *mc = port->drumController(ctl);
- //if(!mc)
- // continue;
- //if(mc)
- //{
- //if(MusEGlobal::drumMap[ctl & 0x7f].channel != e.
- // continue;
- ctl = (ctl & ~0xff) | MusEGlobal::drumMap[ctl & 0x7f].anote;
- //}
- //}
+ int port = MusEGlobal::drumMap[ctl & 0x7f].port;
+ int chan = MusEGlobal::drumMap[ctl & 0x7f].channel;
+ int cur_port = MusEGlobal::drumMap[curDrumPitch].port;
+ int cur_chan = MusEGlobal::drumMap[curDrumPitch].channel;
+ if((port != cur_port) || (chan != cur_chan))
+ continue;
+ ctl = (ctl & ~0xff) | MusEGlobal::drumMap[ctl & 0x7f].anote;
}
if(ctl == _dnum)
{
diff --git a/muse2/muse/ctrl/ctrlpanel.cpp b/muse2/muse/ctrl/ctrlpanel.cpp
index c6adc778..8e380356 100644
--- a/muse2/muse/ctrl/ctrlpanel.cpp
+++ b/muse2/muse/ctrl/ctrlpanel.cpp
@@ -57,6 +57,7 @@
#include "menutitleitem.h"
#include "popupmenu.h"
#include "helper.h"
+#include "pixmap_button.h"
namespace MusEGui {
@@ -87,7 +88,7 @@ CtrlPanel::CtrlPanel(QWidget* parent, MidiEditor* e, CtrlCanvas* c, const char*
kbox->setContentsMargins(0, 0, 0, 0);
dbox->setContentsMargins(0, 0, 0, 0);
- selCtrl = new QPushButton(tr("S"));
+ selCtrl = new QPushButton(tr("S"), this);
selCtrl->setFocusPolicy(Qt::NoFocus);
selCtrl->setFont(MusEGlobal::config.fonts[3]);
selCtrl->setFixedHeight(20);
@@ -96,7 +97,7 @@ CtrlPanel::CtrlPanel(QWidget* parent, MidiEditor* e, CtrlCanvas* c, const char*
selCtrl->setToolTip(tr("select controller"));
// destroy button
- QPushButton* destroy = new QPushButton(tr("X"));
+ QPushButton* destroy = new QPushButton(tr("X"), this);
destroy->setFocusPolicy(Qt::NoFocus);
destroy->setFont(MusEGlobal::config.fonts[3]);
destroy->setFixedHeight(20);
@@ -112,7 +113,7 @@ CtrlPanel::CtrlPanel(QWidget* parent, MidiEditor* e, CtrlCanvas* c, const char*
_val = MusECore::CTRL_VAL_UNKNOWN;
_dnum = -1;
- _knob = new MusEGui::Knob;
+ _knob = new Knob(this);
_knob->setFixedWidth(25);
_knob->setFixedHeight(25);
_knob->setToolTip(tr("manual adjust"));
@@ -122,7 +123,7 @@ CtrlPanel::CtrlPanel(QWidget* parent, MidiEditor* e, CtrlCanvas* c, const char*
_knob->hide();
_knob->setAltFaceColor(Qt::red);
- _dl = new MusEGui::DoubleLabel(-1.0, 0.0, +127.0);
+ _dl = new DoubleLabel(-1.0, 0.0, +127.0, this);
_dl->setPrecision(0);
_dl->setToolTip(tr("ctrl-double-click on/off"));
_dl->setSpecialText(tr("off"));
@@ -139,16 +140,28 @@ CtrlPanel::CtrlPanel(QWidget* parent, MidiEditor* e, CtrlCanvas* c, const char*
connect(_dl, SIGNAL(valueChanged(double,int)), SLOT(ctrlChanged(double)));
connect(_dl, SIGNAL(ctrlDoubleClicked(int)), SLOT(labelDoubleClicked()));
+ _veloPerNoteButton = new PixmapButton(veloPerNote_OnIcon, veloPerNote_OffIcon, 2, this); // Margin = 2
+ _veloPerNoteButton->setFocusPolicy(Qt::NoFocus);
+ _veloPerNoteButton->setCheckable(true);
+ _veloPerNoteButton->setToolTip(tr("all/per-note velocity mode"));
+ _veloPerNoteButton->setEnabled(false);
+ _veloPerNoteButton->hide();
+ connect(_veloPerNoteButton, SIGNAL(clicked()), SLOT(velPerNoteClicked()));
+
bbox->addStretch();
bbox->addWidget(selCtrl);
bbox->addWidget(destroy);
bbox->addStretch();
kbox->addStretch();
kbox->addWidget(_knob);
+ kbox->addWidget(_veloPerNoteButton);
kbox->addStretch();
dbox->addStretch();
dbox->addWidget(_dl);
dbox->addStretch();
+
+ connect(MusEGlobal::song, SIGNAL(songChanged(MusECore::SongChangedFlags_t)), SLOT(songChanged(MusECore::SongChangedFlags_t)));
+ connect(MusEGlobal::muse, SIGNAL(configChanged()), SLOT(configChanged()));
connect(MusEGlobal::heartBeatTimer, SIGNAL(timeout()), SLOT(heartBeat()));
inHeartBeat = false;
setLayout(vbox);
@@ -227,6 +240,35 @@ void CtrlPanel::heartBeat()
}
//---------------------------------------------------------
+// configChanged
+//---------------------------------------------------------
+
+void CtrlPanel::configChanged()
+{
+ songChanged(SC_CONFIG);
+}
+
+//---------------------------------------------------------
+// songChanged
+//---------------------------------------------------------
+
+void CtrlPanel::songChanged(MusECore::SongChangedFlags_t type)
+{
+ if(editor->deleting()) // Ignore while while deleting to prevent crash.
+ return;
+
+ // Is it simply a midi controller value adjustment? Forget it.
+ if(type == SC_MIDI_CONTROLLER)
+ return;
+
+ if(type & SC_CONFIG)
+ {
+ if(_veloPerNoteButton->isChecked() != MusEGlobal::config.velocityPerNote)
+ _veloPerNoteButton->setChecked(MusEGlobal::config.velocityPerNote);
+ }
+}
+
+//---------------------------------------------------------
// labelDoubleClicked
//---------------------------------------------------------
@@ -424,7 +466,7 @@ void CtrlPanel::setHWController(MusECore::MidiTrack* t, MusECore::MidiController
mp = &MusEGlobal::midiPorts[MusEGlobal::drumMap[cdp].port];
ch = MusEGlobal::drumMap[cdp].channel;
}
- else if(_track->type() == MusECore::Track::NEW_DRUM && ((_dnum & 0xff) == 0xff) && cdp != -1)
+ else if((_track->type() == MusECore::Track::NEW_DRUM || _track->type() == MusECore::Track::MIDI) && ((_dnum & 0xff) == 0xff) && cdp != -1)
{
_dnum = (_dnum & ~0xff) | cdp; //FINDMICHJETZT does that work?
mp = &MusEGlobal::midiPorts[_track->outPort()];
@@ -442,11 +484,15 @@ void CtrlPanel::setHWController(MusECore::MidiTrack* t, MusECore::MidiController
_dl->setEnabled(false);
_knob->hide();
_dl->hide();
+ _veloPerNoteButton->setEnabled(true);
+ _veloPerNoteButton->show();
}
else
{
_knob->setEnabled(true);
_dl->setEnabled(true);
+ _veloPerNoteButton->setEnabled(false);
+ _veloPerNoteButton->hide();
double dlv;
int mn; int mx; int v;
if(_dnum == MusECore::CTRL_PROGRAM)
@@ -573,7 +619,7 @@ void CtrlPanel::ctrlPopupTriggered(QAction* act)
MusECore::MidiPort* port = &MusEGlobal::midiPorts[track->outPort()];
int curDrumPitch = ctrlcanvas->getCurDrumPitch();
bool isDrum = track->type() == MusECore::Track::DRUM;
- bool isNewDrum = track->type() == MusECore::Track::NEW_DRUM;
+ bool isNewDrum = (track->type() == MusECore::Track::NEW_DRUM) || (track->type() == MusECore::Track::MIDI);
MusECore::MidiInstrument* instr = port->instrument();
MusECore::MidiControllerList* mcl = instr->controller();
@@ -586,20 +632,12 @@ void CtrlPanel::ctrlPopupTriggered(QAction* act)
const int edit_ins = max + 3;
const int velo = max + 0x101;
- const int polyafter = max + 0x102;
- const int after = max + 0x103;
int rv = act->data().toInt();
if (rv == velo) { // special case velocity
emit controllerChanged(MusECore::CTRL_VELOCITY);
}
- else if (rv == polyafter) { // special case
- emit controllerChanged(MusECore::CTRL_POLYAFTER);
- }
- else if (rv == after) { // special case
- emit controllerChanged(MusECore::CTRL_AFTERTOUCH);
- }
else if (rv == add_ins_def) { // add new instrument controller
PopupMenu * ctrlSubPop = new PopupMenu(this, true); // true = enable stay open
@@ -736,5 +774,18 @@ void CtrlPanel::ctrlRightClicked(const QPoint& p, int /*id*/)
MusEGlobal::song->execMidiAutomationCtlPopup(0, part, p, ctlnum);
}
+//---------------------------------------------------------
+// velPerNoteClicked
+//---------------------------------------------------------
+
+void CtrlPanel::velPerNoteClicked()
+{
+ if(MusEGlobal::config.velocityPerNote != _veloPerNoteButton->isChecked())
+ {
+ MusEGlobal::config.velocityPerNote = _veloPerNoteButton->isChecked();
+ MusEGlobal::muse->changeConfig(false); // Save settings? No, wait till close.
+ }
+}
+
} // namespace MusEGui
diff --git a/muse2/muse/ctrl/ctrlpanel.h b/muse2/muse/ctrl/ctrlpanel.h
index 58b8d8c7..261f982f 100644
--- a/muse2/muse/ctrl/ctrlpanel.h
+++ b/muse2/muse/ctrl/ctrlpanel.h
@@ -25,6 +25,8 @@
#include <QWidget>
+#include "type_defs.h"
+
class QPushButton;
class QAction;
@@ -39,6 +41,7 @@ class DoubleLabel;
class Knob;
class MidiEditor;
class CtrlCanvas;
+class PixmapButton;
//---------------------------------------------------------
// CtrlPanel
@@ -58,8 +61,7 @@ class CtrlPanel: public QWidget {
MusEGui::Knob* _knob;
MusEGui::DoubleLabel* _dl;
int _val;
-
-
+ PixmapButton* _veloPerNoteButton;
signals:
void destroyPanel();
@@ -70,6 +72,9 @@ class CtrlPanel: public QWidget {
void labelDoubleClicked();
void ctrlRightClicked(const QPoint& p, int id);
void ctrlPopupTriggered(QAction* act);
+ void velPerNoteClicked();
+ void songChanged(MusECore::SongChangedFlags_t type);
+ void configChanged();
protected slots:
virtual void heartBeat();