1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-07-19 14:17:41 +02:00

Re-implement note tracks in MixerBoard

This commit adds note tracks into the mixerboard.  It's done as a separate
slider this time instead of via subclasses (as PRL requested), so which
should be easier to use.

This also changes some of the gaurds to EXPERIMENTAL_MIDI_OUT from
USE_MIDI, as it's meaningless to have the note track code in mixerboard
when it cannot do anything (depends on methods that exist behind
EXPERIMENTAL_MIDI_OUT).
This commit is contained in:
Pokechu22 2017-02-21 18:05:35 -08:00 committed by Paul Licameli
parent 59d740ad77
commit 1c93198d08
4 changed files with 99 additions and 36 deletions

View File

@ -728,7 +728,7 @@ void AudacityProject::CreateMenusAndCommands()
AudioIONotBusyFlag); AudioIONotBusyFlag);
c->AddItem(wxT("Karaoke"), _("&Karaoke..."), FN(OnKaraoke), LabelTracksExistFlag, LabelTracksExistFlag); c->AddItem(wxT("Karaoke"), _("&Karaoke..."), FN(OnKaraoke), LabelTracksExistFlag, LabelTracksExistFlag);
c->AddItem(wxT("MixerBoard"), _("&Mixer Board..."), FN(OnMixerBoard), WaveTracksExistFlag, WaveTracksExistFlag); c->AddItem(wxT("MixerBoard"), _("&Mixer Board..."), FN(OnMixerBoard), PlayableTracksExistFlag, PlayableTracksExistFlag);
c->AddSeparator(); c->AddSeparator();
@ -1836,6 +1836,7 @@ CommandFlag AudacityProject::GetUpdateFlags(bool checkActive)
} }
else if (t->GetKind() == Track::Wave) { else if (t->GetKind() == Track::Wave) {
flags |= WaveTracksExistFlag; flags |= WaveTracksExistFlag;
flags |= PlayableTracksExistFlag;
if (t->GetSelected()) { if (t->GetSelected()) {
flags |= TracksSelectedFlag; flags |= TracksSelectedFlag;
if (t->GetLinked()) { if (t->GetLinked()) {
@ -1853,6 +1854,9 @@ CommandFlag AudacityProject::GetUpdateFlags(bool checkActive)
NoteTrack *nt = (NoteTrack *) t; NoteTrack *nt = (NoteTrack *) t;
flags |= NoteTracksExistFlag; flags |= NoteTracksExistFlag;
#ifdef EXPERIMENTAL_MIDI_OUT
flags |= PlayableTracksExistFlag;
#endif
if (nt->GetSelected()) { if (nt->GetSelected()) {
flags |= TracksSelectedFlag; flags |= TracksSelectedFlag;

View File

@ -24,7 +24,9 @@
#include "AColor.h" #include "AColor.h"
#include "AudioIO.h" #include "AudioIO.h"
#ifdef USE_MIDI
#include "NoteTrack.h" #include "NoteTrack.h"
#endif
#include "Project.h" #include "Project.h"
#include "TrackPanel.h" // for EVT_TRACK_PANEL_TIMER #include "TrackPanel.h" // for EVT_TRACK_PANEL_TIMER
@ -137,6 +139,9 @@ enum {
ID_BITMAPBUTTON_MUSICAL_INSTRUMENT = 13000, ID_BITMAPBUTTON_MUSICAL_INSTRUMENT = 13000,
ID_SLIDER_PAN, ID_SLIDER_PAN,
ID_SLIDER_GAIN, ID_SLIDER_GAIN,
#ifdef EXPERIMENTAL_MIDI_OUT
ID_SLIDER_VELOCITY,
#endif
ID_TOGGLEBUTTON_MUTE, ID_TOGGLEBUTTON_MUTE,
ID_TOGGLEBUTTON_SOLO, ID_TOGGLEBUTTON_SOLO,
}; };
@ -148,6 +153,9 @@ BEGIN_EVENT_TABLE(MixerTrackCluster, wxPanelWrapper)
EVT_BUTTON(ID_BITMAPBUTTON_MUSICAL_INSTRUMENT, MixerTrackCluster::OnButton_MusicalInstrument) EVT_BUTTON(ID_BITMAPBUTTON_MUSICAL_INSTRUMENT, MixerTrackCluster::OnButton_MusicalInstrument)
EVT_SLIDER(ID_SLIDER_PAN, MixerTrackCluster::OnSlider_Pan) EVT_SLIDER(ID_SLIDER_PAN, MixerTrackCluster::OnSlider_Pan)
EVT_SLIDER(ID_SLIDER_GAIN, MixerTrackCluster::OnSlider_Gain) EVT_SLIDER(ID_SLIDER_GAIN, MixerTrackCluster::OnSlider_Gain)
#ifdef EXPERIMENTAL_MIDI_OUT
EVT_SLIDER(ID_SLIDER_VELOCITY, MixerTrackCluster::OnSlider_Velocity)
#endif
//v EVT_COMMAND_SCROLL(ID_SLIDER_GAIN, MixerTrackCluster::OnSliderScroll_Gain) //v EVT_COMMAND_SCROLL(ID_SLIDER_GAIN, MixerTrackCluster::OnSliderScroll_Gain)
EVT_COMMAND(ID_TOGGLEBUTTON_MUTE, wxEVT_COMMAND_BUTTON_CLICKED, MixerTrackCluster::OnButton_Mute) EVT_COMMAND(ID_TOGGLEBUTTON_MUTE, wxEVT_COMMAND_BUTTON_CLICKED, MixerTrackCluster::OnButton_Mute)
EVT_COMMAND(ID_TOGGLEBUTTON_SOLO, wxEVT_COMMAND_BUTTON_CLICKED, MixerTrackCluster::OnButton_Solo) EVT_COMMAND(ID_TOGGLEBUTTON_SOLO, wxEVT_COMMAND_BUTTON_CLICKED, MixerTrackCluster::OnButton_Solo)
@ -184,25 +192,13 @@ MixerTrackCluster::MixerTrackCluster(wxWindow* parent,
// mStaticText_TrackName->SetBackgroundColour(this->GetTrackColor()); // mStaticText_TrackName->SetBackgroundColour(this->GetTrackColor());
// gain slider at left // gain and velocity sliders at left (both in same place)
ctrlPos.x = kDoubleInset; ctrlPos.x = kDoubleInset;
ctrlPos.y += TRACK_NAME_HEIGHT + kDoubleInset; ctrlPos.y += TRACK_NAME_HEIGHT + kDoubleInset;
const int nGainSliderHeight = const int nGainSliderHeight =
size.GetHeight() - ctrlPos.y - kQuadrupleInset; size.GetHeight() - ctrlPos.y - kQuadrupleInset;
ctrlSize.Set(kLeftSideStackWidth - kQuadrupleInset, nGainSliderHeight); ctrlSize.Set(kLeftSideStackWidth - kQuadrupleInset, nGainSliderHeight);
#ifdef USE_MIDI
if (GetNote()) {
mSlider_Gain =
safenew MixerTrackSlider(
this, ID_SLIDER_GAIN,
/* i18n-hint: title of the MIDI Velocity slider */
_("Velocity"),
ctrlPos, ctrlSize, VEL_SLIDER, true,
true, 0.0, wxVERTICAL);
}
else
#endif
mSlider_Gain = mSlider_Gain =
safenew MixerTrackSlider( safenew MixerTrackSlider(
this, ID_SLIDER_GAIN, this, ID_SLIDER_GAIN,
@ -210,11 +206,19 @@ MixerTrackCluster::MixerTrackCluster(wxWindow* parent,
_("Gain"), _("Gain"),
ctrlPos, ctrlSize, DB_SLIDER, true, ctrlPos, ctrlSize, DB_SLIDER, true,
true, 0.0, wxVERTICAL); true, 0.0, wxVERTICAL);
mSlider_Gain->SetName(_("Gain")); mSlider_Gain->SetName(_("Gain"));
this->UpdateGain(); this->UpdateGain();
#ifdef EXPERIMENTAL_MIDI_OUT
mSlider_Velocity =
safenew MixerTrackSlider(
this, ID_SLIDER_VELOCITY,
/* i18n-hint: title of the MIDI Velocity slider */
_("Velocity"),
ctrlPos, ctrlSize, VEL_SLIDER, true,
true, 0.0, wxVERTICAL);
mSlider_Velocity->SetName(_("Velocity"));
this->UpdateVelocity();
#endif
// other controls and meter at right // other controls and meter at right
@ -329,7 +333,7 @@ WaveTrack *MixerTrackCluster::GetRight() const
return nullptr; return nullptr;
} }
#ifdef USE_MIDI #ifdef EXPERIMENTAL_MIDI_OUT
NoteTrack *MixerTrackCluster::GetNote() const NoteTrack *MixerTrackCluster::GetNote() const
{ {
return dynamic_cast< NoteTrack * >( mTrack ); return dynamic_cast< NoteTrack * >( mTrack );
@ -361,6 +365,9 @@ void MixerTrackCluster::HandleResize() // For wxSizeEvents, update gain slider a
TRACK_NAME_HEIGHT + kDoubleInset) - // mStaticText_TrackName + margin TRACK_NAME_HEIGHT + kDoubleInset) - // mStaticText_TrackName + margin
kQuadrupleInset; // margin below gain slider kQuadrupleInset; // margin below gain slider
mSlider_Gain->SetSize(-1, nGainSliderHeight); mSlider_Gain->SetSize(-1, nGainSliderHeight);
#ifdef EXPERIMENTAL_MIDI_OUT
mSlider_Velocity->SetSize(-1, nGainSliderHeight);
#endif
bool bSoloNone = mProject->IsSoloNone(); bool bSoloNone = mProject->IsSoloNone();
@ -384,10 +391,6 @@ void MixerTrackCluster::HandleSliderGain(const bool bWantPushState /*= false*/)
float fValue = mSlider_Gain->Get(); float fValue = mSlider_Gain->Get();
if (GetWave()) if (GetWave())
GetWave()->SetGain(fValue); GetWave()->SetGain(fValue);
#ifdef EXPERIMENTAL_MIDI_OUT
else
GetNote()->SetVelocity(fValue);
#endif
if (GetRight()) if (GetRight())
GetRight()->SetGain(fValue); GetRight()->SetGain(fValue);
@ -397,6 +400,20 @@ void MixerTrackCluster::HandleSliderGain(const bool bWantPushState /*= false*/)
mProject->TP_PushState(_("Moved gain slider"), _("Gain"), UndoPush::CONSOLIDATE ); mProject->TP_PushState(_("Moved gain slider"), _("Gain"), UndoPush::CONSOLIDATE );
} }
#ifdef EXPERIMENTAL_MIDI_OUT
void MixerTrackCluster::HandleSliderVelocity(const bool bWantPushState /*= false*/)
{
float fValue = mSlider_Velocity->Get();
if (GetNote())
GetNote()->SetVelocity(fValue);
// Update the TrackPanel correspondingly.
mProject->RefreshTPTrack(mTrack);
if (bWantPushState)
mProject->TP_PushState(_("Moved velocity slider"), _("Velocity"), UndoPush::CONSOLIDATE);
}
#endif
void MixerTrackCluster::HandleSliderPan(const bool bWantPushState /*= false*/) void MixerTrackCluster::HandleSliderPan(const bool bWantPushState /*= false*/)
{ {
float fValue = mSlider_Pan->Get(); float fValue = mSlider_Pan->Get();
@ -462,28 +479,33 @@ void MixerTrackCluster::UpdateSolo()
void MixerTrackCluster::UpdatePan() void MixerTrackCluster::UpdatePan()
{ {
#ifdef EXPERIMENTAL_MIDI_OUT
if (!GetWave()) { if (!GetWave()) {
mSlider_Pan->Hide(); mSlider_Pan->Hide();
return; return;
} }
#endif
mSlider_Pan->Set(GetWave()->GetPan()); mSlider_Pan->Set(GetWave()->GetPan());
} }
void MixerTrackCluster::UpdateGain() void MixerTrackCluster::UpdateGain()
{ {
#ifdef EXPERIMENTAL_MIDI_OUT
if (!GetWave()) { if (!GetWave()) {
mSlider_Gain->SetStyle(VEL_SLIDER); mSlider_Gain->Hide();
mSlider_Gain->Set(GetNote()->GetVelocity());
return; return;
} }
mSlider_Gain->SetStyle(DB_SLIDER);
#endif
mSlider_Gain->Set(GetWave()->GetGain()); mSlider_Gain->Set(GetWave()->GetGain());
} }
#ifdef EXPERIMENTAL_MIDI_OUT
void MixerTrackCluster::UpdateVelocity()
{
if (!GetNote()) {
mSlider_Velocity->Hide();
return;
}
mSlider_Velocity->Set(GetNote()->GetVelocity());
}
#endif
void MixerTrackCluster::UpdateMeter(const double t0, const double t1) void MixerTrackCluster::UpdateMeter(const double t0, const double t1)
{ {
// NoteTracks do not (currently) register on meters. It would probably be // NoteTracks do not (currently) register on meters. It would probably be
@ -696,6 +718,13 @@ void MixerTrackCluster::OnSlider_Gain(wxCommandEvent& WXUNUSED(event))
this->HandleSliderGain(); this->HandleSliderGain();
} }
#ifdef EXPERIMENTAL_MIDI_OUT
void MixerTrackCluster::OnSlider_Velocity(wxCommandEvent& WXUNUSED(event))
{
this->HandleSliderVelocity();
}
#endif
//v void MixerTrackCluster::OnSliderScroll_Gain(wxScrollEvent& WXUNUSED(event)) //v void MixerTrackCluster::OnSliderScroll_Gain(wxScrollEvent& WXUNUSED(event))
//{ //{
//int sliderValue = (int)(mSlider_Gain->Get()); //v mSlider_Gain->GetValue(); //int sliderValue = (int)(mSlider_Gain->Get()); //v mSlider_Gain->GetValue();
@ -1209,6 +1238,16 @@ void MixerBoard::UpdateGain(const PlayableTrack* pTrack)
pMixerTrackCluster->UpdateGain(); pMixerTrackCluster->UpdateGain();
} }
#ifdef EXPERIMENTAL_MIDI_OUT
void MixerBoard::UpdateVelocity(const PlayableTrack* pTrack)
{
MixerTrackCluster* pMixerTrackCluster;
FindMixerTrackCluster(pTrack, &pMixerTrackCluster);
if (pMixerTrackCluster)
pMixerTrackCluster->UpdateVelocity();
}
#endif
void MixerBoard::UpdateMeters(const double t1, const bool bLoopedPlay) void MixerBoard::UpdateMeters(const double t1, const bool bLoopedPlay)
{ {
if (!this->IsShown() || (t1 == BAD_STREAM_TIME)) if (!this->IsShown() || (t1 == BAD_STREAM_TIME))

View File

@ -64,7 +64,9 @@ class Meter;
class MixerBoard; class MixerBoard;
class Track; class Track;
#ifdef USE_MIDI
class NoteTrack; class NoteTrack;
#endif
class PlayableTrack; class PlayableTrack;
class WaveTrack; class WaveTrack;
@ -81,13 +83,18 @@ public:
WaveTrack *GetWave() const; WaveTrack *GetWave() const;
WaveTrack *GetRight() const; WaveTrack *GetRight() const;
#ifdef EXPERIMENTAL_MIDI_OUT
NoteTrack *GetNote() const; NoteTrack *GetNote() const;
#endif
void UpdatePrefs(); void UpdatePrefs();
void HandleResize(); // For wxSizeEvents, update gain slider and meter. void HandleResize(); // For wxSizeEvents, update gain slider and meter.
void HandleSliderGain(const bool bWantPushState = false); void HandleSliderGain(const bool bWantPushState = false);
#ifdef EXPERIMENTAL_MIDI_OUT
void HandleSliderVelocity(const bool bWantPushState = false);
#endif
void HandleSliderPan(const bool bWantPushState = false); void HandleSliderPan(const bool bWantPushState = false);
void ResetMeter(const bool bResetClipping); void ResetMeter(const bool bResetClipping);
@ -99,6 +106,9 @@ public:
void UpdateSolo(); void UpdateSolo();
void UpdatePan(); void UpdatePan();
void UpdateGain(); void UpdateGain();
#ifdef EXPERIMENTAL_MIDI_OUT
void UpdateVelocity();
#endif
void UpdateMeter(const double t0, const double t1); void UpdateMeter(const double t0, const double t1);
private: private:
@ -113,6 +123,9 @@ private:
void OnButton_MusicalInstrument(wxCommandEvent& event); void OnButton_MusicalInstrument(wxCommandEvent& event);
void OnSlider_Gain(wxCommandEvent& event); void OnSlider_Gain(wxCommandEvent& event);
#ifdef EXPERIMENTAL_MIDI_OUT
void OnSlider_Velocity(wxCommandEvent& event);
#endif
void OnSlider_Pan(wxCommandEvent& event); void OnSlider_Pan(wxCommandEvent& event);
void OnButton_Mute(wxCommandEvent& event); void OnButton_Mute(wxCommandEvent& event);
void OnButton_Solo(wxCommandEvent& event); void OnButton_Solo(wxCommandEvent& event);
@ -133,6 +146,9 @@ private:
AButton* mToggleButton_Solo; AButton* mToggleButton_Solo;
MixerTrackSlider* mSlider_Pan; MixerTrackSlider* mSlider_Pan;
MixerTrackSlider* mSlider_Gain; MixerTrackSlider* mSlider_Gain;
#ifdef EXPERIMENTAL_MIDI_OUT
MixerTrackSlider* mSlider_Velocity;
#endif
Meter* mMeter; Meter* mMeter;
public: public:
@ -222,6 +238,9 @@ public:
void UpdateSolo(const PlayableTrack* pTrack = NULL); // NULL means update for all tracks. void UpdateSolo(const PlayableTrack* pTrack = NULL); // NULL means update for all tracks.
void UpdatePan(const PlayableTrack* pTrack); void UpdatePan(const PlayableTrack* pTrack);
void UpdateGain(const PlayableTrack* pTrack); void UpdateGain(const PlayableTrack* pTrack);
#ifdef EXPERIMENTAL_MIDI_OUT
void UpdateVelocity(const PlayableTrack* pTrack);
#endif
void UpdateMeters(const double t1, const bool bLoopedPlay); void UpdateMeters(const double t1, const bool bLoopedPlay);

View File

@ -54,6 +54,7 @@ enum CommandFlag : unsigned long long
PausedFlag = 0x200000000ULL, // jkc PausedFlag = 0x200000000ULL, // jkc
NotPausedFlag = 0x400000000ULL, // jkc NotPausedFlag = 0x400000000ULL, // jkc
HasWaveDataFlag = 0x800000000ULL, // jkc HasWaveDataFlag = 0x800000000ULL, // jkc
PlayableTracksExistFlag = 0x1000000000ULL,
NoFlagsSpecifed = ~0ULL NoFlagsSpecifed = ~0ULL
}; };