From 8f81edb163136e8374db131eeefd261fc58e2dc9 Mon Sep 17 00:00:00 2001 From: Robert Jonsson Date: Thu, 4 Oct 2012 16:08:51 +0000 Subject: added gain knob to channel strips --- muse2/ChangeLog | 3 + muse2/muse/audiotrack.cpp | 23 ++++++++ muse2/muse/mixer/astrip.cpp | 108 +++++++++++++++++++++-------------- muse2/muse/mixer/astrip.h | 7 ++- muse2/muse/node.cpp | 8 +-- muse2/muse/track.h | 3 + muse2/muse/widgets/knob.h | 6 ++ muse2/muse/widgets/mtrackinfobase.ui | 17 +++++- 8 files changed, 126 insertions(+), 49 deletions(-) (limited to 'muse2') diff --git a/muse2/ChangeLog b/muse2/ChangeLog index 48d3cc49..07625080 100644 --- a/muse2/ChangeLog +++ b/muse2/ChangeLog @@ -1,3 +1,6 @@ +04.10.2012: + - Added Gain knob on channel strip for audio tracks (rj) + - Added descriptive tooltips for midi parameters in midi track info (rj) 03.10.2012: - Changed WaveTrack and AudioInput to create mono tracks, AudioInputs are also no longer muted upon creation (rj) diff --git a/muse2/muse/audiotrack.cpp b/muse2/muse/audiotrack.cpp index ab750edb..da6f196b 100644 --- a/muse2/muse/audiotrack.cpp +++ b/muse2/muse/audiotrack.cpp @@ -40,6 +40,7 @@ #include "dssihost.h" #include "app.h" #include "controlfifo.h" +#include "fastlog.h" namespace MusECore { @@ -123,6 +124,7 @@ AudioTrack::AudioTrack(TrackType t) bufferPos = INT_MAX; setVolume(1.0); + _gain = 1.0; } AudioTrack::AudioTrack(const AudioTrack& t, int flags) @@ -801,6 +803,24 @@ void AudioTrack::setPan(double val) cl->second->setCurVal(val); } +//--------------------------------------------------------- +// pan +//--------------------------------------------------------- + +double AudioTrack::gain() const + { + return _gain; + } + +//--------------------------------------------------------- +// setPan +//--------------------------------------------------------- + +void AudioTrack::setGain(double val) + { + _gain = val; + } + //--------------------------------------------------------- // pluginCtrlVal //--------------------------------------------------------- @@ -1084,6 +1104,7 @@ void AudioTrack::writeProperties(int level, Xml& xml) const xml.intTag(level, "prefader", prefader()); xml.intTag(level, "sendMetronome", sendMetronome()); xml.intTag(level, "automation", int(automationType())); + xml.floatTag(level, "gain", _gain); if (hasAuxSend()) { int naux = MusEGlobal::song->auxs()->size(); for (int idx = 0; idx < naux; ++idx) { @@ -1167,6 +1188,8 @@ bool AudioTrack::readProperties(Xml& xml, const QString& tag) _prefader = xml.parseInt(); else if (tag == "sendMetronome") _sendMetronome = xml.parseInt(); + else if (tag == "gain") + _gain = xml.parseFloat(); else if (tag == "automation") setAutomationType(AutomationType(xml.parseInt())); else if (tag == "controller") { diff --git a/muse2/muse/mixer/astrip.cpp b/muse2/muse/mixer/astrip.cpp index 530ca7e2..243df29c 100644 --- a/muse2/muse/mixer/astrip.cpp +++ b/muse2/muse/mixer/astrip.cpp @@ -179,7 +179,8 @@ void AudioStrip::songChanged(MusECore::SongChangedFlags_t val) updateRouteButtons(); MusECore::AudioTrack* src = (MusECore::AudioTrack*)track; - + gain->setValue(src->gain()); + // Do channels before MusEGlobal::config... if (val & SC_CHANNELS) updateChannels(); @@ -440,6 +441,15 @@ void AudioStrip::auxChanged(double val, int idx) MusEGlobal::song->update(SC_AUX); } +//--------------------------------------------------------- +// gainChanged +//--------------------------------------------------------- + +void AudioStrip::gainChanged(double val) + { + ((MusECore::AudioTrack*)track)->setGain(val); + } + //--------------------------------------------------------- // auxLabelChanged //--------------------------------------------------------- @@ -664,74 +674,79 @@ void AudioStrip::updateChannels() // 1 - aux send //--------------------------------------------------------- -MusEGui::Knob* AudioStrip::addKnob(int type, int id, MusEGui::DoubleLabel** dlabel, QLabel *name) +MusEGui::Knob* AudioStrip::addKnob(Knob::KnobType type, int id, MusEGui::DoubleLabel** dlabel, QLabel *name) { - MusEGui::Knob* knob = new MusEGui::Knob(this); + MusEGui::Knob* knob = new Knob(this); knob->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum)); - if (type == 0) + MusEGui::DoubleLabel* knobLabel; + if (type == Knob::panType) + { knob->setRange(-1.0, +1.0); - else - knob->setRange(MusEGlobal::config.minSlider-0.1, 10.0); - knob->setBackgroundRole(QPalette::Mid); - - if (type == 0) knob->setToolTip(tr("panorama")); - else + knobLabel = new MusEGui::DoubleLabel(0, -1.0, +1.0, this); + + } else if (type == Knob::auxType) + { + knob->setRange(MusEGlobal::config.minSlider-0.1, 10.0); knob->setToolTip(tr("aux send level")); + knob->setFaceColor(Qt::blue); + knobLabel = new MusEGui::DoubleLabel(0.0, MusEGlobal::config.minSlider, 10.1, this); - MusEGui::DoubleLabel* pl; - if (type == 0) - pl = new MusEGui::DoubleLabel(0, -1.0, +1.0, this); - else - pl = new MusEGui::DoubleLabel(0.0, MusEGlobal::config.minSlider, 10.1, this); + } else if (type == Knob::gainType) + { + knob->setRange(1.0, 20.0); + knob->setFaceColor(Qt::yellow); + knob->setToolTip(tr("calibration gain")); + knobLabel = new MusEGui::DoubleLabel(1.0, 1.0, 30.0, this); + } + knob->setBackgroundRole(QPalette::Mid); if (dlabel) - *dlabel = pl; - pl->setSlider(knob); + *dlabel = knobLabel; + knobLabel->setSlider(knob); ///pl->setFont(MusEGlobal::config.fonts[1]); - pl->setBackgroundRole(QPalette::Mid); - pl->setFrame(true); - if (type == 0) - pl->setPrecision(2); - else { - pl->setPrecision(0); + knobLabel->setBackgroundRole(QPalette::Mid); + knobLabel->setFrame(true); + if (type == Knob::panType) + knobLabel->setPrecision(2); + else if (type == Knob::auxType){ + knobLabel->setPrecision(0); + } + else if (type == Knob::gainType){ + knobLabel->setPrecision(1); } - pl->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum)); + knobLabel->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum)); - // QString label; - // if (type == 0) - // label = tr("Pan"); - // else - // label = name; - - //QLabel* plb = new QLabel(label, this); name->setParent(this); name->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum)); name->setAlignment(Qt::AlignCenter); grid->addWidget(name, _curGridRow, 0); - grid->addWidget(pl, _curGridRow+1, 0); + grid->addWidget(knobLabel, _curGridRow+1, 0); grid->addWidget(knob, _curGridRow, 1, 2, 1); _curGridRow += 2; - connect(knob, SIGNAL(valueChanged(double,int)), pl, SLOT(setValue(double))); + connect(knob, SIGNAL(valueChanged(double,int)), knobLabel, SLOT(setValue(double))); - if (type == 0) { - connect(pl, SIGNAL(valueChanged(double, int)), SLOT(panLabelChanged(double))); + if (type == Knob::panType) { + connect(knobLabel, SIGNAL(valueChanged(double, int)), SLOT(panLabelChanged(double))); connect(knob, SIGNAL(sliderMoved(double,int,bool)), SLOT(panChanged(double,int,bool))); connect(knob, SIGNAL(sliderPressed(int)), SLOT(panPressed())); connect(knob, SIGNAL(sliderReleased(int)), SLOT(panReleased())); connect(knob, SIGNAL(sliderRightClicked(const QPoint &, int)), SLOT(panRightClicked(const QPoint &))); } - else { + else if (type == Knob::auxType){ + knobLabel->setReadOnly(true); knob->setId(id); - - connect(pl, SIGNAL(valueChanged(double, int)), knob, SLOT(setValue(double))); - // Not used yet. Switch if/when necessary. - //connect(pl, SIGNAL(valueChanged(double, int)), SLOT(auxLabelChanged(double, int))); - + connect(knobLabel, SIGNAL(valueChanged(double, int)), knob, SLOT(setValue(double))); connect(knob, SIGNAL(sliderMoved(double, int)), SLOT(auxChanged(double, int))); } + else if (type == Knob::gainType){ + knobLabel->setReadOnly(true); + knob->setId(id); + connect(knobLabel, SIGNAL(valueChanged(double, int)), knob, SLOT(setValue(double))); + connect(knob, SIGNAL(sliderMoved(double, int)), SLOT(gainChanged(double))); + } return knob; } @@ -812,6 +827,13 @@ AudioStrip::AudioStrip(QWidget* parent, MusECore::AudioTrack* at) grid->addWidget(stereo, _curGridRow, 0); grid->addWidget(pre, _curGridRow++, 1); + //--------------------------------------------------- + // Gain + //--------------------------------------------------- + + gain = addKnob(MusEGui::Knob::gainType, 0, &gainLabel, new QLabel("Gain", this)); + gain->setValue(t->gain()); + //--------------------------------------------------- // aux send //--------------------------------------------------- @@ -826,7 +848,7 @@ AudioStrip::AudioStrip(QWidget* parent, MusECore::AudioTrack* at) title = title.mid(0,8) + "."; } QLabel *name = new QLabel(title,this); - MusEGui::Knob* ak = addKnob(1, idx, &al, name); + MusEGui::Knob* ak = addKnob(MusEGui::Knob::auxType, idx, &al, name); auxKnob.push_back(ak); auxLabel.push_back(al); @@ -899,7 +921,7 @@ AudioStrip::AudioStrip(QWidget* parent, MusECore::AudioTrack* at) // pan, balance //--------------------------------------------------- - pan = addKnob(0, 0, &panl, new QLabel("Pan", this)); + pan = addKnob(MusEGui::Knob::panType, 0, &panl, new QLabel("Pan", this)); pan->setValue(t->pan()); //--------------------------------------------------- diff --git a/muse2/muse/mixer/astrip.h b/muse2/muse/mixer/astrip.h index 81edc664..7088301f 100644 --- a/muse2/muse/mixer/astrip.h +++ b/muse2/muse/mixer/astrip.h @@ -29,6 +29,7 @@ #include "type_defs.h" #include "strip.h" +#include "knob.h" //#include "route.h" //class QDialog; @@ -67,6 +68,9 @@ class AudioStrip : public Strip { MusEGui::Knob* pan; MusEGui::DoubleLabel* panl; + MusEGui::Knob* gain; + MusEGui::DoubleLabel* gainLabel; + std::vector auxKnob; std::vector auxLabel; @@ -81,7 +85,7 @@ class AudioStrip : public Strip { //QToolButton* iR; //QToolButton* oR; - MusEGui::Knob* addKnob(int, int, MusEGui::DoubleLabel**, QLabel *name); + MusEGui::Knob* addKnob(Knob::KnobType, int, MusEGui::DoubleLabel**, QLabel *name); void updateOffState(); void updateVolume(); @@ -96,6 +100,7 @@ class AudioStrip : public Strip { void iRoutePressed(); void oRoutePressed(); void auxChanged(double, int); + void gainChanged(double); void volumeChanged(double,int,bool); void volumePressed(); void volumeReleased(); diff --git a/muse2/muse/node.cpp b/muse2/muse/node.cpp index 02264a37..ffc26ee9 100644 --- a/muse2/muse/node.cpp +++ b/muse2/muse/node.cpp @@ -406,8 +406,8 @@ void AudioTrack::copyData(unsigned pos, int dstChannels, int srcStartChan, int s double _pan = controller()->value(AC_PAN, pos, !MusEGlobal::automation || automationType() == AUTO_OFF || !_panEnCtrl || !_panEn2Ctrl); - vol[0] = _volume * (1.0 - _pan); - vol[1] = _volume * (1.0 + _pan); + vol[0] = _volume * (1.0 - _pan) * _gain; + vol[1] = _volume * (1.0 + _pan) * _gain; float meter[trackChans]; // Have we been here already during this process cycle? @@ -744,8 +744,8 @@ void AudioTrack::addData(unsigned pos, int dstChannels, int srcStartChan, int sr double _pan = controller()->value(AC_PAN, pos, !MusEGlobal::automation || automationType() == AUTO_OFF || !_panEnCtrl || !_panEn2Ctrl); - vol[0] = _volume * (1.0 - _pan); - vol[1] = _volume * (1.0 + _pan); + vol[0] = _volume * (1.0 - _pan) * _gain; + vol[1] = _volume * (1.0 + _pan) * _gain; float meter[trackChans]; // Have we been here already during this process cycle? diff --git a/muse2/muse/track.h b/muse2/muse/track.h index 5390d40c..19c824cd 100644 --- a/muse2/muse/track.h +++ b/muse2/muse/track.h @@ -351,6 +351,7 @@ class AudioTrack : public Track { bool _sendMetronome; AutomationType _automationType; Pipeline* _efxPipe; + double _gain; void internal_assign(const Track&, int flags); protected: @@ -421,6 +422,8 @@ class AudioTrack : public Track { void setVolume(double val); double pan() const; void setPan(double val); + double gain() const; + void setGain(double val); bool prefader() const { return _prefader; } double auxSend(int idx) const; diff --git a/muse2/muse/widgets/knob.h b/muse2/muse/widgets/knob.h index bd8621a1..114284d0 100644 --- a/muse2/muse/widgets/knob.h +++ b/muse2/muse/widgets/knob.h @@ -43,6 +43,12 @@ class Knob : public SliderBase, public ScaleIf public: enum Symbol { Line, Dot }; + enum KnobType { + panType, + auxType, + gainType, + }; + private: bool hasScale; diff --git a/muse2/muse/widgets/mtrackinfobase.ui b/muse2/muse/widgets/mtrackinfobase.ui index 93c2f2c9..f566d207 100644 --- a/muse2/muse/widgets/mtrackinfobase.ui +++ b/muse2/muse/widgets/mtrackinfobase.ui @@ -6,7 +6,7 @@ 0 0 - 93 + 94 417 @@ -284,6 +284,9 @@ 0 + + Transpose notes up or down + Transp. @@ -325,6 +328,9 @@ 0 + + Offset playback of notes before or after actual note + Delay @@ -369,6 +375,9 @@ 0 + + Change note length in percent of actual length + Length @@ -416,6 +425,9 @@ 0 + + <html><head/><body><p>Add or substract velocity to notes on track.</p><p><span style=" font-style:italic;">Since the midi note range is 0-127 this <br/>might mean that the notes do not reach <br/>the combined velocity, note + Velocity.</span></p></body></html> + Velocity @@ -463,6 +475,9 @@ 0 + + Compress the notes velocity range, in percent of actual velocity + Compr. -- cgit v1.2.3