// Note: this set of diffs compares files expanded with only USE_MIDI to the // same file expanded with USE_MIDI and EXPERIMENTAL_MIDI_OUT. In all cases // here, "#include" was replaced with "$include" to thwart inclusion by the // preprocessor. Otherwise, the diffs would be over 100K lines and too hard to // understand. The goal here is to verify that all differences are related to // the implementation of MIDI output. // The preprocessor reported these errors: // Portmidi has some missing include files or compiler switches: w80/lib-src/portmidi/pm_linux/pmlinuxalsa.cni:31:2: error: #error needs ALSA 0.9.0 or later w80/lib-src/portmidi/pm_linux/pmlinuxalsa.cni:31:2: error: #error needs ALSA 0.9.0 or later w80/src/effects/nyquist/Nyquist.cppni:60:2: error: #error You need to update lib-src/libnyquist w80/src/effects/nyquist/Nyquist.cppni:60:2: error: #error You need to update lib-src/libnyquist // There's a check for a wx version generating these errors: w80/src/widgets/ASlider.cppni:1177:21: error: missing binary operator before token "(" w80/src/widgets/ASlider.cppni:1185:21: error: missing binary operator before token "(" w80/src/widgets/ASlider.cppni:1177:21: error: missing binary operator before token "(" w80/src/widgets/ASlider.cppni:1185:21: error: missing binary operator before token "(" *** w80/src/AudioIO.h.umE 2010-11-28 14:06:52.000000000 -0500 --- w80/src/AudioIO.h.moE 2010-11-28 14:06:52.000000000 -0500 *************** *** 6,12 **** $include "portaudio.h" $include "Audacity.h" $include "Experimental.h" ! # 32 "w80/src/AudioIO.hni" $include $include --- 6,24 ---- $include "portaudio.h" $include "Audacity.h" $include "Experimental.h" ! ! ! ! $include "portmidi.h" ! $include "porttime.h" ! $include "allegro.h" ! ! ! ! ! ! ! $include $include // OK -- midi output stuff *************** *** 53,59 **** # 103 "w80/src/AudioIO.hni" int StartStream(WaveTrackArray playbackTracks, WaveTrackArray captureTracks, ! TimeTrack *timeTrack, double sampleRate, double t0, double t1, --- 65,71 ---- # 103 "w80/src/AudioIO.hni" int StartStream(WaveTrackArray playbackTracks, WaveTrackArray captureTracks, ! NoteTrackArray midiTracks, TimeTrack *timeTrack, double sampleRate, double t0, double t1, // OK -- midi output stuff *************** *** 86,92 **** bool IsStreamActive(); bool IsStreamActive(int token); ! # 167 "w80/src/AudioIO.hni" bool IsAudioTokenActive(int token); --- 98,123 ---- bool IsStreamActive(); bool IsStreamActive(int token); ! ! ! ! ! ! ! PmTimestamp MidiTime(); ! # 155 "w80/src/AudioIO.hni" ! private: ! bool mHasSolo; ! public: ! bool SetHasSolo(bool hasSolo); ! bool GetHasSolo() { return mHasSolo; } ! ! ! ! ! ! ! bool IsAudioTokenActive(int token); // OK -- midi output stuff *************** *** 171,177 **** unsigned int numCaptureChannels, sampleFormat captureFormat); void FillBuffers(); ! # 362 "w80/src/AudioIO.hni" int GetCommonlyAvailPlayback(); --- 202,226 ---- unsigned int numCaptureChannels, sampleFormat captureFormat); void FillBuffers(); ! ! ! void PrepareMidiIterator(bool send = true, double offset = 0); ! bool StartPortMidiStream(); ! void OutputEvent(); ! void FillMidiBuffers(); ! void GetNextEvent(); ! void AudacityMidiCallback(); ! double AudioTime() { return mT0 + mNumFrames / mRate; } ! double PauseTime(); ! double getCurrentTrackTime(); ! long calculateMidiTimeStamp(double time); ! ! ! ! ! ! ! int GetCommonlyAvailPlayback(); // OK -- midi output stuff *************** *** 195,204 **** static const int NumRatesToTry; double NormalizeStreamTime(double absoluteTime) const; # 449 "w80/src/AudioIO.hni" AudioThread *mThread; ! Resample **mResample; RingBuffer **mCaptureBuffers; --- 244,284 ---- static const int NumRatesToTry; double NormalizeStreamTime(double absoluteTime) const; + + + + PmStream *mMidiStream; + PmError mLastPmError; + long mMidiLatency; + long mSynthLatency; + + + volatile double mAudioCallbackOutputTime; + volatile long mNumFrames; + volatile long mNumPauseFrames; + volatile long mPauseTime; + volatile double mMidiLoopOffset; + volatile long mAudioFramesPerBuffer; + + Alg_seq_ptr mSeq; + Alg_iterator_ptr mIterator; + Alg_event_ptr mNextEvent; + double mNextEventTime; + + NoteTrack *mNextEventTrack; + bool mMidiOutputComplete; + bool mNextIsNoteOn; + + + bool mMidiStreamActive; + + + bool mSendMidiState; + NoteTrackArray mMidiPlaybackTracks; # 449 "w80/src/AudioIO.hni" AudioThread *mThread; ! AudioThread *mMidiThread; Resample **mResample; RingBuffer **mCaptureBuffers; // OK -- midi output stuff *************** *** 237,244 **** volatile bool mAudioThreadFillBuffersLoopActive; ! ! volatile double mLastRecordingOffset; --- 317,324 ---- volatile bool mAudioThreadFillBuffersLoopActive; ! volatile bool mMidiThreadFillBuffersLoopRunning; ! volatile bool mMidiThreadFillBuffersLoopActive; volatile double mLastRecordingOffset; // OK -- midi output stuff *************** *** 276,282 **** friend class AudioThread; ! friend void InitAudioIO(); --- 356,362 ---- friend class AudioThread; ! friend class MidiThread; friend void InitAudioIO(); // OK -- midi output stuff *** w80/src/effects/Effect.cpp.umE 2010-11-28 14:06:52.000000000 -0500 --- w80/src/effects/Effect.cpp.moE 2010-11-28 14:06:52.000000000 -0500 *************** *** 470,482 **** playbackTracks.Add(mixRight); ! int token = gAudioIO->StartStream(playbackTracks, recordingTracks, ! NULL, rate, t0, t1, NULL); --- 470,482 ---- playbackTracks.Add(mixRight); ! NoteTrackArray empty; int token = gAudioIO->StartStream(playbackTracks, recordingTracks, ! empty, NULL, rate, t0, t1, NULL); // OK -- midi output stuff *** w80/src/MixerBoard.cpp.umE 2010-11-28 14:06:53.000000000 -0500 --- w80/src/MixerBoard.cpp.moE 2010-11-28 14:06:53.000000000 -0500 *************** *** 17,23 **** $include "MixerBoard.h" $include "Project.h" ! $include "../images/MusicalInstruments.h" --- 17,23 ---- $include "MixerBoard.h" $include "Project.h" ! $include "NoteTrack.h" $include "../images/MusicalInstruments.h" // NoteTrack.h needed for MixerBoard with EXP_MIDI_OUT *************** *** 96,103 **** { mMixerBoard = grandParent; mProject = project; ! # 131 "w80/src/MixerBoard.cppni" ! mLeftTrack = pLeftTrack; mRightTrack = pRightTrack; --- 96,112 ---- { mMixerBoard = grandParent; mProject = project; ! ! if (pLeftTrack->GetKind() == Track::Note) { ! mLeftTrack = NULL; ! mNoteTrack = (NoteTrack*) pLeftTrack; ! mTrack = pLeftTrack; ! } else { ! mTrack = mLeftTrack = pLeftTrack; ! mNoteTrack = NULL; ! } ! ! mRightTrack = pRightTrack; // NoteTrack mixer channel *************** *** 112,137 **** wxPoint ctrlPos((2 * 4), (2 * 4)); wxSize ctrlSize(size.GetWidth() - (4 * 4), 18); ! ! ! ! ! mStaticText_TrackName = ! new wxStaticText(this, -1, mLeftTrack->GetName(), ctrlPos, ctrlSize, ! wxALIGN_CENTRE | 0x0001 | wxBORDER_SUNKEN); ! ! ! ! ! ! ctrlPos.x = (2 * 4); ctrlPos.y += 18 + (2 * 4); const int nGainSliderHeight = size.GetHeight() - ctrlPos.y - (4 * 4); ctrlSize.Set(48 - (2 * 4) - (4 * 4), nGainSliderHeight); ! # 176 "w80/src/MixerBoard.cppni" mSlider_Gain = new MixerTrackSlider( this, ID_SLIDER_GAIN, --- 121,147 ---- wxPoint ctrlPos((2 * 4), (2 * 4)); wxSize ctrlSize(size.GetWidth() - (4 * 4), 18); ! wxString name = mTrack->GetName(); mStaticText_TrackName = ! new wxStaticText(this, -1, name, ctrlPos, ctrlSize, ! wxALIGN_CENTRE | wxST_NO_AUTORESIZE | wxSUNKEN_BORDER); ! # 160 "w80/src/MixerBoard.cppni" ctrlPos.x = (2 * 4); ctrlPos.y += 18 + (2 * 4); const int nGainSliderHeight = size.GetHeight() - ctrlPos.y - (4 * 4); ctrlSize.Set(48 - (2 * 4) - (4 * 4), nGainSliderHeight); ! ! if (mNoteTrack) { ! mSlider_Gain = ! new MixerTrackSlider( ! this, ID_SLIDER_GAIN, ! ! _("Velocity"), ! ctrlPos, ctrlSize, VEL_SLIDER, true, ! true, 0.0, wxVERTICAL); ! } else ! mSlider_Gain = new MixerTrackSlider( this, ID_SLIDER_GAIN, // looks OK *************** *** 148,156 **** ctrlPos.x += 48 - (2 * 4) + 4; ctrlSize.Set(48, 48); - wxBitmap* bitmap = mMixerBoard->GetMusicalInstrumentBitmap(mLeftTrack); wxASSERT(bitmap); mBitmapButton_MusicalInstrument = --- 158,166 ---- ctrlPos.x += 48 - (2 * 4) + 4; ctrlSize.Set(48, 48); + wxBitmap* bitmap = mMixerBoard->GetMusicalInstrumentBitmap(name); wxASSERT(bitmap); mBitmapButton_MusicalInstrument = // changed to use name rather than wavetrack to find bitmap *************** *** 259,279 **** { float fValue = mSlider_Gain->Get(); - - - mLeftTrack->SetGain(fValue); - if (mRightTrack) mRightTrack->SetGain(fValue); - mProject->RefreshTPTrack(mLeftTrack); if (bWantPushState) mProject->TP_PushState(_("Moved gain slider"), _("Gain"), true ); --- 269,289 ---- { float fValue = mSlider_Gain->Get(); + if (mLeftTrack) + mLeftTrack->SetGain(fValue); + else + mNoteTrack->SetGain(fValue); if (mRightTrack) mRightTrack->SetGain(fValue); + mProject->RefreshTPTrack(mTrack); if (bWantPushState) mProject->TP_PushState(_("Moved gain slider"), _("Gain"), true ); // looks OK *************** *** 283,289 **** { float fValue = mSlider_Pan->Get(); ! mLeftTrack->SetPan(fValue); if (mRightTrack) --- 293,299 ---- { float fValue = mSlider_Pan->Get(); ! if (mLeftTrack) mLeftTrack->SetPan(fValue); if (mRightTrack) // looks ok *************** *** 291,299 **** - mProject->RefreshTPTrack(mLeftTrack); if (bWantPushState) --- 301,309 ---- + mProject->RefreshTPTrack(mTrack); if (bWantPushState) // looks ok *************** *** 303,309 **** void MixerTrackCluster::ResetMeter() { ! mMeter->Reset(mLeftTrack->GetRate(), true); } --- 313,319 ---- void MixerTrackCluster::ResetMeter() { ! if (mLeftTrack) mMeter->Reset(mLeftTrack->GetRate(), true); } // looks ok -- notetracks are not "metered" *************** *** 322,330 **** void MixerTrackCluster::UpdateName() { - const wxString newName = mLeftTrack->GetName(); mStaticText_TrackName->SetLabel(newName); --- 332,340 ---- void MixerTrackCluster::UpdateName() { + const wxString newName = mTrack->GetName(); mStaticText_TrackName->SetLabel(newName); // looks ok *************** *** 332,351 **** mBitmapButton_MusicalInstrument->SetBitmapLabel( - *(mMixerBoard->GetMusicalInstrumentBitmap(mLeftTrack))); } void MixerTrackCluster::UpdateMute() { - mToggleButton_Mute->SetAlternate(mLeftTrack->GetSolo()); - if (mLeftTrack->GetMute()) mToggleButton_Mute->PushDown(); else --- 342,361 ---- mBitmapButton_MusicalInstrument->SetBitmapLabel( + *(mMixerBoard->GetMusicalInstrumentBitmap(newName))); } void MixerTrackCluster::UpdateMute() { + mToggleButton_Mute->SetAlternate(mTrack->GetSolo()); + if (mTrack->GetMute()) mToggleButton_Mute->PushDown(); else // looks ok *************** *** 355,363 **** void MixerTrackCluster::UpdateSolo() { - bool bIsSolo = mLeftTrack->GetSolo(); if (bIsSolo) mToggleButton_Solo->PushDown(); --- 365,373 ---- void MixerTrackCluster::UpdateSolo() { + bool bIsSolo = mTrack->GetSolo(); if (bIsSolo) mToggleButton_Solo->PushDown(); // looks ok *************** *** 379,385 **** void MixerTrackCluster::UpdateGain() { ! # 447 "w80/src/MixerBoard.cppni" mSlider_Gain->Set(mLeftTrack->GetGain()); } --- 389,402 ---- void MixerTrackCluster::UpdateGain() { ! ! if (mNoteTrack) { ! mSlider_Gain->SetStyle(VEL_SLIDER); ! mSlider_Gain->Set(mNoteTrack->GetGain()); ! return; ! } ! mSlider_Gain->SetStyle(DB_SLIDER); ! mSlider_Gain->Set(mLeftTrack->GetGain()); } // looks ok *************** *** 387,395 **** { if ((t0 < 0.0) || (t1 < 0.0) || (t0 >= t1) || - ((mMixerBoard->HasSolo() || mLeftTrack->GetMute()) && !mLeftTrack->GetSolo())) { this->ResetMeter(); --- 404,412 ---- { if ((t0 < 0.0) || (t1 < 0.0) || (t0 >= t1) || + ((mMixerBoard->HasSolo() || mTrack->GetMute()) && !mTrack->GetSolo())) { this->ResetMeter(); // looks ok *************** *** 404,412 **** float* rmsRight = new float[nFramesPerBuffer]; - bool bSuccess = true; const double dFrameInterval = (t1 - t0) / (double)nFramesPerBuffer; double dFrameT0 = t0; --- 421,429 ---- float* rmsRight = new float[nFramesPerBuffer]; + bool bSuccess = (mLeftTrack != NULL); const double dFrameInterval = (t1 - t0) / (double)nFramesPerBuffer; double dFrameT0 = t0; // loos ok *************** *** 486,496 **** { - bool bSelect = !mLeftTrack->GetSelected(); - mLeftTrack->SetSelected(bSelect); if (mRightTrack) mRightTrack->SetSelected(bSelect); --- 503,513 ---- { + bool bSelect = !mTrack->GetSelected(); + mTrack->SetSelected(bSelect); if (mRightTrack) mRightTrack->SetSelected(bSelect); // looks ok *************** *** 498,506 **** this->Refresh(true); - mProject->RefreshTPTrack(mLeftTrack); } else --- 515,523 ---- this->Refresh(true); + mProject->RefreshTPTrack(mTrack); } else // looks ok *************** *** 508,516 **** mProject->SelectNone(); - mLeftTrack->SetSelected(true); if (mRightTrack) mRightTrack->SetSelected(true); --- 525,533 ---- mProject->SelectNone(); + mTrack->SetSelected(true); if (mRightTrack) mRightTrack->SetSelected(true); // looks ok *************** *** 519,529 **** { - mProject->mViewInfo.sel0 = mLeftTrack->GetOffset(); - mProject->mViewInfo.sel1 = mLeftTrack->GetEndTime(); } --- 536,546 ---- { + mProject->mViewInfo.sel0 = mTrack->GetOffset(); + mProject->mViewInfo.sel1 = mTrack->GetEndTime(); } // looks ok *************** *** 562,570 **** wxRect bev(0, 0, clusterSize.GetWidth() - 1, clusterSize.GetHeight() - 1); - if (mLeftTrack->GetSelected()) { for (unsigned int i = 0; i < 4; i++) --- 579,587 ---- wxRect bev(0, 0, clusterSize.GetWidth() - 1, clusterSize.GetHeight() - 1); + if (mTrack->GetSelected()) { for (unsigned int i = 0; i < 4; i++) // looks ok *************** *** 597,607 **** void MixerTrackCluster::OnButton_Mute(wxCommandEvent& event) { - mProject->HandleTrackMute(mLeftTrack, mToggleButton_Mute->WasShiftDown()); - mToggleButton_Mute->SetAlternate(mLeftTrack->GetSolo()); --- 614,624 ---- void MixerTrackCluster::OnButton_Mute(wxCommandEvent& event) { + mProject->HandleTrackMute(mTrack, mToggleButton_Mute->WasShiftDown()); + mToggleButton_Mute->SetAlternate(mTrack->GetSolo()); // looks ok *************** *** 614,633 **** else - mProject->RefreshTPTrack(mLeftTrack); } void MixerTrackCluster::OnButton_Solo(wxCommandEvent& event) { - mProject->HandleTrackSolo(mLeftTrack, mToggleButton_Solo->WasShiftDown()); - bool bIsSolo = mLeftTrack->GetSolo(); mToggleButton_Mute->SetAlternate(bIsSolo); --- 631,650 ---- else + mProject->RefreshTPTrack(mTrack); } void MixerTrackCluster::OnButton_Solo(wxCommandEvent& event) { + mProject->HandleTrackSolo(mTrack, mToggleButton_Solo->WasShiftDown()); + bool bIsSolo = mTrack->GetSolo(); mToggleButton_Mute->SetAlternate(bIsSolo); // looks ok *************** *** 642,650 **** else - mProject->RefreshTPTrack(mLeftTrack); } --- 659,667 ---- else + mProject->RefreshTPTrack(mTrack); } // looks ok *************** *** 797,810 **** if (pLeftTrack->GetKind() == Track::Wave ! ) { if (nClusterIndex < nClusterCount) { ! # 930 "w80/src/MixerBoard.cppni" mMixerTrackClusters[nClusterIndex]->mLeftTrack = (WaveTrack*)pLeftTrack; mMixerTrackClusters[nClusterIndex]->mRightTrack = (WaveTrack*)pRightTrack; mMixerTrackClusters[nClusterIndex]->UpdateForStateChange(); --- 814,839 ---- if (pLeftTrack->GetKind() == Track::Wave ! || pLeftTrack->GetKind() == Track::Note ) { if (nClusterIndex < nClusterCount) { ! ! ! ! ! ! if (pLeftTrack->GetKind() == Track::Note) { ! mMixerTrackClusters[nClusterIndex]->mNoteTrack = (NoteTrack*)pLeftTrack; ! mMixerTrackClusters[nClusterIndex]->mLeftTrack = NULL; ! } else { ! mMixerTrackClusters[nClusterIndex]->mNoteTrack = NULL; mMixerTrackClusters[nClusterIndex]->mLeftTrack = (WaveTrack*)pLeftTrack; + } + + mMixerTrackClusters[nClusterIndex]->mRightTrack = (WaveTrack*)pRightTrack; mMixerTrackClusters[nClusterIndex]->UpdateForStateChange(); // looks ok *************** *** 845,853 **** for (; nClusterIndex < nClusterCount; nClusterIndex++) - this->RemoveTrackCluster(mMixerTrackClusters[nClusterIndex]->mLeftTrack); } } --- 874,882 ---- for (; nClusterIndex < nClusterCount; nClusterIndex++) + this->RemoveTrackCluster(mMixerTrackClusters[nClusterIndex]->mTrack); } } // looks ok *************** *** 862,879 **** } - void MixerBoard::MoveTrackCluster(const WaveTrack* pLeftTrack, - bool bUp) { MixerTrackCluster* pMixerTrackCluster; - int nIndex = this->FindMixerTrackCluster(pLeftTrack, &pMixerTrackCluster); if (pMixerTrackCluster == NULL) return; --- 891,908 ---- } + void MixerBoard::MoveTrackCluster(const Track* pTrack, + bool bUp) { MixerTrackCluster* pMixerTrackCluster; + int nIndex = FindMixerTrackCluster(pTrack, &pMixerTrackCluster); if (pMixerTrackCluster == NULL) return; // looks ok *************** *** 906,922 **** } - void MixerBoard::RemoveTrackCluster(const WaveTrack* pLeftTrack) { MixerTrackCluster* pMixerTrackCluster; - int nIndex = this->FindMixerTrackCluster(pLeftTrack, &pMixerTrackCluster); if (pMixerTrackCluster == NULL) return; --- 935,951 ---- } + void MixerBoard::RemoveTrackCluster(const Track* pTrack) { MixerTrackCluster* pMixerTrackCluster; + int nIndex = FindMixerTrackCluster(pTrack, &pMixerTrackCluster); if (pMixerTrackCluster == NULL) return; // looks ok *************** *** 942,957 **** ! ! } - wxBitmap* MixerBoard::GetMusicalInstrumentBitmap(const WaveTrack* pLeftTrack) { if (mMusicalInstruments.IsEmpty()) --- 971,986 ---- ! FindMixerTrackCluster(pTrack, &pMixerTrackCluster); ! assert(pMixerTrackCluster == NULL); } + wxBitmap* MixerBoard::GetMusicalInstrumentBitmap(wxString name) { if (mMusicalInstruments.IsEmpty()) // looks ok *************** *** 960,968 **** - const wxString strTrackName(pLeftTrack->GetName().MakeLower()); size_t nBestItemIndex = 0; unsigned int nBestScore = 0; --- 989,997 ---- + const wxString strTrackName(name.MakeLower()); size_t nBestItemIndex = 0; unsigned int nBestScore = 0; // looks ok *************** *** 1011,1026 **** } - void MixerBoard::RefreshTrackCluster(const WaveTrack* pLeftTrack, bool bEraseBackground ) { MixerTrackCluster* pMixerTrackCluster; - this->FindMixerTrackCluster(pLeftTrack, &pMixerTrackCluster); if (pMixerTrackCluster) pMixerTrackCluster->Refresh(bEraseBackground); --- 1040,1055 ---- } + void MixerBoard::RefreshTrackCluster(const Track* pTrack, bool bEraseBackground ) { MixerTrackCluster* pMixerTrackCluster; + FindMixerTrackCluster(pTrack, &pMixerTrackCluster); if (pMixerTrackCluster) pMixerTrackCluster->Refresh(bEraseBackground); // looks ok *************** *** 1050,1080 **** } - void MixerBoard::UpdateName(const WaveTrack* pLeftTrack) { MixerTrackCluster* pMixerTrackCluster; - this->FindMixerTrackCluster(pLeftTrack, &pMixerTrackCluster); if (pMixerTrackCluster) pMixerTrackCluster->UpdateName(); } - void MixerBoard::UpdateMute(const WaveTrack* pLeftTrack ) { - if (pLeftTrack == NULL) { for (unsigned int i = 0; i < mMixerTrackClusters.GetCount(); i++) --- 1079,1109 ---- } + void MixerBoard::UpdateName(const Track* pTrack) { MixerTrackCluster* pMixerTrackCluster; + FindMixerTrackCluster(pTrack, &pMixerTrackCluster); if (pMixerTrackCluster) pMixerTrackCluster->UpdateName(); } + void MixerBoard::UpdateMute(const Track* pTrack ) { + if (pTrack == NULL) { for (unsigned int i = 0; i < mMixerTrackClusters.GetCount(); i++) // looks ok *************** *** 1084,1092 **** { MixerTrackCluster* pMixerTrackCluster; - this->FindMixerTrackCluster(pLeftTrack, &pMixerTrackCluster); if (pMixerTrackCluster) pMixerTrackCluster->UpdateMute(); --- 1113,1121 ---- { MixerTrackCluster* pMixerTrackCluster; + FindMixerTrackCluster(pTrack, &pMixerTrackCluster); if (pMixerTrackCluster) pMixerTrackCluster->UpdateMute(); // looks ok *************** *** 1094,1108 **** } - void MixerBoard::UpdateSolo(const WaveTrack* pLeftTrack ) { - if (pLeftTrack == NULL) { for (unsigned int i = 0; i < mMixerTrackClusters.GetCount(); i++) --- 1123,1137 ---- } + void MixerBoard::UpdateSolo(const Track* pTrack ) { + if (pTrack == NULL) { for (unsigned int i = 0; i < mMixerTrackClusters.GetCount(); i++) // looks ok *************** *** 1112,1120 **** { MixerTrackCluster* pMixerTrackCluster; - this->FindMixerTrackCluster(pLeftTrack, &pMixerTrackCluster); if (pMixerTrackCluster) pMixerTrackCluster->UpdateSolo(); --- 1141,1149 ---- { MixerTrackCluster* pMixerTrackCluster; + FindMixerTrackCluster(pTrack, &pMixerTrackCluster); if (pMixerTrackCluster) pMixerTrackCluster->UpdateSolo(); // looks ok *************** *** 1122,1153 **** } - void MixerBoard::UpdatePan(const WaveTrack* pLeftTrack) { MixerTrackCluster* pMixerTrackCluster; - this->FindMixerTrackCluster(pLeftTrack, &pMixerTrackCluster); if (pMixerTrackCluster) pMixerTrackCluster->UpdatePan(); } - void MixerBoard::UpdateGain(const WaveTrack* pLeftTrack) { MixerTrackCluster* pMixerTrackCluster; - this->FindMixerTrackCluster(pLeftTrack, &pMixerTrackCluster); if (pMixerTrackCluster) pMixerTrackCluster->UpdateGain(); --- 1151,1182 ---- } + void MixerBoard::UpdatePan(const Track* pTrack) { MixerTrackCluster* pMixerTrackCluster; + FindMixerTrackCluster(pTrack, &pMixerTrackCluster); if (pMixerTrackCluster) pMixerTrackCluster->UpdatePan(); } + void MixerBoard::UpdateGain(const Track* pTrack) { MixerTrackCluster* pMixerTrackCluster; + FindMixerTrackCluster(pTrack, &pMixerTrackCluster); if (pMixerTrackCluster) pMixerTrackCluster->UpdateGain(); // looks ok *************** *** 1266,1285 **** } - int MixerBoard::FindMixerTrackCluster(const WaveTrack* pLeftTrack, - MixerTrackCluster** hMixerTrackCluster) const { *hMixerTrackCluster = NULL; for (unsigned int i = 0; i < mMixerTrackClusters.GetCount(); i++) { - if (mMixerTrackClusters[i]->mLeftTrack == pLeftTrack) { *hMixerTrackCluster = mMixerTrackClusters[i]; --- 1295,1314 ---- } + int MixerBoard::FindMixerTrackCluster(const Track* pTrack, + MixerTrackCluster** hMixerTrackCluster) const { *hMixerTrackCluster = NULL; for (unsigned int i = 0; i < mMixerTrackClusters.GetCount(); i++) { + if (mMixerTrackClusters[i]->mTrack == pTrack) { *hMixerTrackCluster = mMixerTrackClusters[i]; // looks ok *** w80/src/MixerBoard.h.umE 2010-11-28 14:06:53.000000000 -0500 --- w80/src/MixerBoard.h.moE 2010-11-28 14:06:53.000000000 -0500 *************** *** 55,62 **** class AudacityProject; class MixerBoard; ! ! class WaveTrack; --- 55,62 ---- class AudacityProject; class MixerBoard; ! class Track; ! class NoteTrack; class WaveTrack; // looks ok *************** *** 107,118 **** ! WaveTrack* mLeftTrack; WaveTrack* mRightTrack; ! private: --- 107,118 ---- ! Track* mTrack; WaveTrack* mLeftTrack; WaveTrack* mRightTrack; ! NoteTrack* mNoteTrack; private: // looks ok *************** *** 193,230 **** int GetTrackClustersWidth(); ! ! ! ! ! void MoveTrackCluster(const WaveTrack* pLeftTrack, bool bUp); ! void RemoveTrackCluster(const WaveTrack* pLeftTrack); ! ! ! wxBitmap* GetMusicalInstrumentBitmap(const WaveTrack* pLeftTrack); ! ! bool HasSolo(); - void RefreshTrackCluster(const WaveTrack* pLeftTrack, bool bEraseBackground = true); void RefreshTrackClusters(bool bEraseBackground = true); void ResizeTrackClusters(); void ResetMeters(); - # 233 "w80/src/MixerBoard.hni" - void UpdateName(const WaveTrack* pLeftTrack); - void UpdateMute(const WaveTrack* pLeftTrack = NULL); - void UpdateSolo(const WaveTrack* pLeftTrack = NULL); - void UpdatePan(const WaveTrack* pLeftTrack); - void UpdateGain(const WaveTrack* pLeftTrack); void UpdateMeters(const double t1, const bool bLoopedPlay); void UpdateWidth(); --- 193,223 ---- int GetTrackClustersWidth(); + void MoveTrackCluster(const Track* pTrack, bool bUp); + void RemoveTrackCluster(const Track* pTrack); ! wxBitmap* GetMusicalInstrumentBitmap(const wxString name); ! # 214 "w80/src/MixerBoard.hni" bool HasSolo(); + void RefreshTrackCluster(const Track* pTrack, bool bEraseBackground = true); void RefreshTrackClusters(bool bEraseBackground = true); void ResizeTrackClusters(); void ResetMeters(); + void UpdateName(const Track* pTrack); + void UpdateMute(const Track* pTrack = NULL); + void UpdateSolo(const Track* pTrack = NULL); + void UpdatePan(const Track* pTrack); + void UpdateGain(const Track* pTrack); + # 240 "w80/src/MixerBoard.hni" void UpdateMeters(const double t1, const bool bLoopedPlay); void UpdateWidth(); // looks ok *************** *** 232,242 **** private: void CreateMuteSoloImages(); - int FindMixerTrackCluster(const WaveTrack* pLeftTrack, - MixerTrackCluster** hMixerTrackCluster) const; void LoadMusicalInstruments(); --- 225,235 ---- private: void CreateMuteSoloImages(); + int FindMixerTrackCluster(const Track* pTrack, + MixerTrackCluster** hMixerTrackCluster) const; void LoadMusicalInstruments(); // looks ok *** w80/src/NoteTrack.h.umE 2010-11-28 14:06:53.000000000 -0500 --- w80/src/NoteTrack.h.moE 2010-11-28 14:06:53.000000000 -0500 *************** *** 52,59 **** virtual bool Shift(double t); ! ! double NearestBeatTime(double time, double *beat); --- 52,59 ---- virtual bool Shift(double t); ! float GetGain() const { return mGain; } ! void SetGain(float gain) { mGain = gain; } double NearestBeatTime(double time, double *beat); // looks ok *************** *** 120,127 **** void VScroll(int start, int end); ! ! virtual bool HandleXMLTag(const wxChar *tag, const wxChar **attrs); --- 120,127 ---- void VScroll(int start, int end); ! wxRect GetGainPlacementRect() const { return mGainPlacementRect; } ! void SetGainPlacementRect(const wxRect &r) { mGainPlacementRect = r; } virtual bool HandleXMLTag(const wxChar *tag, const wxChar **attrs); // looks ok *************** *** 137,143 **** DirManager *mDirManager; ! --- 137,143 ---- DirManager *mDirManager; ! float mGain; // looks ok *** w80/src/prefs/MidiIOPrefs.cpp.umE 2010-11-28 14:06:53.000000000 -0500 --- w80/src/prefs/MidiIOPrefs.cpp.moE 2010-11-28 14:06:53.000000000 -0500 *************** *** 5,7 **** --- 5,256 ---- # 26 "w80/src/prefs/MidiIOPrefs.cppni" $include "../Audacity.h" $include "../Experimental.h" + + + $include + + $include + $include + + $include "portmidi.h" + + $include "../AudioIO.h" + $include "../Internat.h" + $include "../Prefs.h" + $include "../Project.h" + $include "../ShuttleGui.h" + + $include "MidiIOPrefs.h" + + enum { + HostID = 10000, + PlayID, + RecordID, + ChannelsID + }; + + BEGIN_EVENT_TABLE(MidiIOPrefs, PrefsPanel) + EVT_CHOICE(HostID, MidiIOPrefs::OnHost) + + END_EVENT_TABLE() + + MidiIOPrefs::MidiIOPrefs(wxWindow * parent) + : PrefsPanel(parent, _("MIDI Devices")) + { + Populate(); + } + + MidiIOPrefs::~MidiIOPrefs() + { + } + + void MidiIOPrefs::Populate() + { + + GetNamesAndLabels(); + + + mPlayDevice = gPrefs->Read(wxT("/MidiIO/PlaybackDevice"), wxT("")); + mRecordDevice = gPrefs->Read(wxT("/MidiIO/RecordingDevice"), wxT("")); + + + + + + + ShuttleGui S(this, eIsCreatingFromPrefs); + PopulateOrExchange(S); + + + wxCommandEvent e; + OnHost(e); + } + + + + + + void MidiIOPrefs::GetNamesAndLabels() { + + Pm_Terminate(); + Pm_Initialize(); + int nDevices = Pm_CountDevices(); + for (int i = 0; i < nDevices; i++) { + const PmDeviceInfo *info = Pm_GetDeviceInfo(i); + if (info->output || info->input) { + wxString name(info->interf, wxConvLocal); + if (mHostNames.Index(name) == wxNOT_FOUND) { + mHostNames.Add(name); + mHostLabels.Add(name); + } + } + } + } + + void MidiIOPrefs::PopulateOrExchange( ShuttleGui & S ) { + wxArrayString empty; + + S.SetBorder(2); + + S.StartStatic(_("Interface")); + { + S.StartMultiColumn(2); + { + S.Id(HostID); + mHost = S.TieChoice(_("Host") + wxString(wxT(":")), + wxT("/MidiIO/Host"), + wxT(""), + mHostNames, + mHostLabels); + S.SetSizeHints(mHostNames); + + S.AddPrompt(_("Using: PortMidi")); + } + S.EndMultiColumn(); + } + S.EndStatic(); + + S.StartStatic(_("Playback")); + { + S.StartMultiColumn(2); + { + S.Id(PlayID); + mPlay = S.AddChoice(_("Device") + wxString(wxT(":")), + wxEmptyString, + &empty); + int latency = gPrefs->Read(wxT("/MidiIO/OutputLatency"), + DEFAULT_SYNTH_LATENCY); + mLatency = S.TieTextBox(_("MIDI Synthesizer Latency (ms):"), + wxT("/MidiIO/SynthLatency"), + latency, 3); + } + S.EndMultiColumn(); + } + S.EndStatic(); + + S.StartStatic(_("Recording")); + { + S.StartMultiColumn(2); + { + S.Id(RecordID); + mRecord = S.AddChoice(_("Device") + wxString(wxT(":")), + wxEmptyString, + &empty); + + S.Id(ChannelsID); + + + + + + } + S.EndMultiColumn(); + } + S.EndStatic(); + } + + void MidiIOPrefs::OnHost(wxCommandEvent & e) + { + int index = mHost->GetCurrentSelection(); + wxString itemAtIndex = mHostNames.Item(index); + int nDevices = Pm_CountDevices(); + + if (nDevices == 0) { + mHost->Clear(); + mHost->Append(_("No MIDI interfaces"), (void *) NULL); + mHost->SetSelection(0); + } + + mPlay->Clear(); + mRecord->Clear(); + + wxArrayString playnames; + wxArrayString recordnames; + + for (int i = 0; i < nDevices; i++) { + const PmDeviceInfo *info = Pm_GetDeviceInfo(i); + wxString interf(info->interf, wxConvLocal); + if (itemAtIndex.IsSameAs(interf)) { + wxString name(info->name, wxConvLocal); + wxString device = wxString::Format(wxT("%s: %s"), + interf.c_str(), + name.c_str()); + int index; + + if (info->output) { + playnames.Add(name); + index = mPlay->Append(name, (void *) info); + if (device == mPlayDevice) { + mPlay->SetSelection(index); + } + } + + if (info->input) { + recordnames.Add(name); + index = mRecord->Append(name, (void *) info); + if (device == mRecordDevice) { + mRecord->SetSelection(index); + } + } + } + } + + if (mPlay->GetCount() == 0) { + playnames.Add(_("No devices found")); + mPlay->Append(playnames[0], (void *) NULL); + } + + if (mRecord->GetCount() == 0) { + recordnames.Add(_("No devices found")); + mRecord->Append(recordnames[0], (void *) NULL); + } + + if (mPlay->GetCount() && mPlay->GetSelection() == wxNOT_FOUND) { + mPlay->SetSelection(0); + } + + if (mRecord->GetCount() && mRecord->GetSelection() == wxNOT_FOUND) { + mRecord->SetSelection(0); + } + + ShuttleGui S(this, eIsCreating); + S.SetSizeHints(mPlay, playnames); + S.SetSizeHints(mRecord, recordnames); + + } + + bool MidiIOPrefs::Apply() + { + ShuttleGui S(this, eIsSavingToPrefs); + PopulateOrExchange(S); + + const PmDeviceInfo *info; + + info = (const PmDeviceInfo *) mPlay->GetClientData(mPlay->GetSelection()); + if (info) { + gPrefs->Write(wxT("/MidiIO/PlaybackDevice"), + wxString::Format(wxT("%s: %s"), + wxString(info->interf, wxConvLocal).c_str(), + wxString(info->name, wxConvLocal).c_str())); + } + + info = (const PmDeviceInfo *) mRecord->GetClientData(mRecord->GetSelection()); + if (info) { + gPrefs->Write(wxT("/MidiIO/RecordingDevice"), + wxString::Format(wxT("%s: %s"), + wxString(info->interf, wxConvLocal).c_str(), + wxString(info->name, wxConvLocal).c_str())); + } + + return true; + } + + bool MidiIOPrefs::Validate() + { + long latency; + if (!mLatency->GetValue().ToLong(&latency)) { + wxMessageBox(_("The MIDI Synthesizer Latency must be an integer")); + return false; + } + return true; + } // looks ok *** w80/src/prefs/MidiIOPrefs.h.umE 2010-11-28 14:06:53.000000000 -0500 --- w80/src/prefs/MidiIOPrefs.h.moE 2010-11-28 14:06:53.000000000 -0500 *************** *** 4,6 **** --- 4,52 ---- # 1 "w80/src/prefs/MidiIOPrefs.hni" # 12 "w80/src/prefs/MidiIOPrefs.hni" $include "../Experimental.h" + + + + + + $include + + $include + $include + $include + + $include "../ShuttleGui.h" + + $include "PrefsPanel.h" + + class MidiIOPrefs:public PrefsPanel + { + public: + MidiIOPrefs(wxWindow * parent); + virtual ~MidiIOPrefs(); + virtual bool Apply(); + virtual bool Validate(); + + private: + void Populate(); + void PopulateOrExchange(ShuttleGui & S); + void GetNamesAndLabels(); + + void OnHost(wxCommandEvent & e); + + + wxArrayString mHostNames; + wxArrayString mHostLabels; + + wxString mPlayDevice; + wxString mRecordDevice; + + + wxChoice *mHost; + wxChoice *mPlay; + wxTextCtrl *mLatency; + wxChoice *mRecord; + + + DECLARE_EVENT_TABLE(); + }; // looks ok *** w80/src/toolbars/ControlToolBar.cpp.umE 2010-11-28 14:06:53.000000000 -0500 --- w80/src/toolbars/ControlToolBar.cpp.moE 2010-11-28 14:06:53.000000000 -0500 *************** *** 410,416 **** for (Track *trk = iter.First(); trk; trk = iter.Next()) { if (trk->GetKind() == Track::Wave ! ) { hasaudio = true; --- 410,416 ---- for (Track *trk = iter.First(); trk; trk = iter.Next()) { if (trk->GetKind() == Track::Wave ! || trk->GetKind() == Track::Note ) { hasaudio = true; // this is in PlayPlayRegion() -- looks ok *************** *** 502,508 **** mCutPreviewTracks->GetWaveTrackArray(false), WaveTrackArray(), ! NULL, p->GetRate(), tcp0, tcp1, p, false, t0, t1-t0); --- 502,508 ---- mCutPreviewTracks->GetWaveTrackArray(false), WaveTrackArray(), ! NoteTrackArray(), NULL, p->GetRate(), tcp0, tcp1, p, false, t0, t1-t0); // looks ok *************** *** 521,527 **** token = gAudioIO->StartStream(t->GetWaveTrackArray(false), WaveTrackArray(), ! timetrack, p->GetRate(), t0, t1, p, looped); --- 521,527 ---- token = gAudioIO->StartStream(t->GetWaveTrackArray(false), WaveTrackArray(), ! t->GetNoteTrackArray(false), timetrack, p->GetRate(), t0, t1, p, looped); // looks ok *************** *** 747,753 **** WaveTrackArray newRecordingTracks, playbackTracks; ! bool duplex; gPrefs->Read(wxT("/AudioIO/Duplex"), &duplex, true); --- 747,753 ---- WaveTrackArray newRecordingTracks, playbackTracks; ! NoteTrackArray midiTracks; bool duplex; gPrefs->Read(wxT("/AudioIO/Duplex"), &duplex, true); // looks ok *************** *** 755,767 **** if(duplex){ playbackTracks = t->GetWaveTrackArray(false); ! } else { playbackTracks = WaveTrackArray(); ! } --- 755,767 ---- if(duplex){ playbackTracks = t->GetWaveTrackArray(false); ! midiTracks = t->GetNoteTrackArray(false); } else { playbackTracks = WaveTrackArray(); ! midiTracks = NoteTrackArray(); } // looks ok *************** *** 858,864 **** int token = gAudioIO->StartStream(playbackTracks, newRecordingTracks, ! t->GetTimeTrack(), p->GetRate(), t0, t1, p); --- 858,864 ---- int token = gAudioIO->StartStream(playbackTracks, newRecordingTracks, ! midiTracks, t->GetTimeTrack(), p->GetRate(), t0, t1, p); // looks ok *** w80/src/TrackPanel.cpp.umE 2010-11-28 14:06:53.000000000 -0500 --- w80/src/TrackPanel.cpp.moE 2010-11-28 14:06:53.000000000 -0500 *************** *** 3678,3684 **** float newValue = slider->Get(); MixerBoard* pMixerBoard = this->GetMixerBoard(); ! WaveTrack *link = (WaveTrack *)mTracks->GetLink(mCapturedTrack); --- 3678,3684 ---- float newValue = slider->Get(); MixerBoard* pMixerBoard = this->GetMixerBoard(); ! if (mCapturedTrack->GetKind() == Track::Wave) { WaveTrack *link = (WaveTrack *)mTracks->GetLink(mCapturedTrack); // looks ok *************** *** 3698,3704 **** if (pMixerBoard) pMixerBoard->UpdateGain((WaveTrack*)mCapturedTrack); } ! # 4035 "w80/src/TrackPanel.cppni" VisibleTrackIterator iter(GetProject()); for (Track *t = iter.First(); t; t = iter.Next()) { --- 3698,3717 ---- if (pMixerBoard) pMixerBoard->UpdateGain((WaveTrack*)mCapturedTrack); } ! ! } else { ! if (!pan) { ! ((NoteTrack *) mCapturedTrack)->SetGain(newValue); ! ! ! ! ! ! ! } ! } ! ! VisibleTrackIterator iter(GetProject()); for (Track *t = iter.First(); t; t = iter.Next()) { // looks ok *************** *** 3815,3821 **** else if (t->GetKind() == Track::Note) { wxRect midiRect; ! # 4169 "w80/src/TrackPanel.cppni" mTrackInfo.GetTrackControlsRect(r, midiRect); if (midiRect.Contains(event.m_x, event.m_y) && ((NoteTrack *) t)->LabelClick(midiRect, event.m_x, event.m_y, --- 3828,3851 ---- else if (t->GetKind() == Track::Note) { wxRect midiRect; ! ! ! ! ! wxRect muteSoloRect(r); ! muteSoloRect.y -= 34; ! if (MuteSoloFunc(t, muteSoloRect, event.m_x, event.m_y, false) || ! MuteSoloFunc(t, muteSoloRect, event.m_x, event.m_y, true)) ! return; ! ! ! ! ! ! if (GainFunc(t, ((NoteTrack *) t)->GetGainPlacementRect(), ! event, event.m_x, event.m_y)) ! return; ! mTrackInfo.GetTrackControlsRect(r, midiRect); if (midiRect.Contains(event.m_x, event.m_y) && ((NoteTrack *) t)->LabelClick(midiRect, event.m_x, event.m_y, // looks ok *************** *** 5289,5295 **** int h = ((NoteTrack *) t)->DrawLabelControls(*dc, midiRect) + 2; ! # 5706 "w80/src/TrackPanel.cppni" } } --- 5319,5345 ---- int h = ((NoteTrack *) t)->DrawLabelControls(*dc, midiRect) + 2; ! ! ! ! if (r.height > 84) { ! AColor::Line(*dc, r.x+48 , r.y+50, r.x+48, r.y + 66); ! ! AColor::Line(*dc, r.x, r.y + 66, mTrackInfo.GetTrackInfoWidth(), r.y + 66); ! } ! mTrackInfo.DrawMuteSolo(dc, r, t, ! (captured && mMouseCapture == IsMuting), false, HasSoloButton()); ! mTrackInfo.DrawMuteSolo(dc, r, t, ! (captured && mMouseCapture == IsSoloing), true, HasSoloButton()); ! # 5698 "w80/src/TrackPanel.cppni" ! wxRect gr; ! mTrackInfo.GetGainRect(r, gr); ! r.y = r.y + h - gr.y; ! r.height = r.height - h + gr.y; ! ! ((NoteTrack *) t)->SetGainPlacementRect(r); ! mTrackInfo.DrawVelocitySlider(dc, (NoteTrack *) t, r); ! } } // looks ok -- drawing mute and gain on notetrack *************** *** 7559,7565 **** mPans.Count() < (unsigned int)index - mSliderOffset + 1) MakeMoreSliders(); } ! # 8013 "w80/src/TrackPanel.cppni" void TrackInfo::DrawSliders(wxDC *dc, WaveTrack *t, wxRect r) { wxRect gainRect; --- 7609,7631 ---- mPans.Count() < (unsigned int)index - mSliderOffset + 1) MakeMoreSliders(); } ! ! ! void TrackInfo::DrawVelocitySlider(wxDC *dc, NoteTrack *t, wxRect r) ! { ! wxRect gainRect; ! int index = t->GetIndex(); ! EnsureSufficientSliders(index); ! GetGainRect(r, gainRect); ! if (gainRect.y + gainRect.height < r.y + r.height - 19) { ! mGains[index]->SetStyle(VEL_SLIDER); ! GainSlider(index)->Move(wxPoint(gainRect.x, gainRect.y)); ! GainSlider(index)->Set(t->GetGain()); ! GainSlider(index)->OnPaint(*dc, t->GetSelected()); ! } ! } ! ! void TrackInfo::DrawSliders(wxDC *dc, WaveTrack *t, wxRect r) { wxRect gainRect; // looks ok *************** *** 7573,7579 **** if (gainRect.y + gainRect.height < r.y + r.height - 19) { ! GainSlider(index)->Move(wxPoint(gainRect.x, gainRect.y)); GainSlider(index)->Set(t->GetGain()); --- 7639,7645 ---- if (gainRect.y + gainRect.height < r.y + r.height - 19) { ! GainSlider(index)->SetStyle(DB_SLIDER); GainSlider(index)->Move(wxPoint(gainRect.x, gainRect.y)); GainSlider(index)->Set(t->GetGain()); // looks ok - DB slider and Vel slider can change roles *** w80/src/TrackPanel.h.umE 2010-11-28 14:06:53.000000000 -0500 --- w80/src/TrackPanel.h.moE 2010-11-28 14:06:53.000000000 -0500 *************** *** 103,109 **** void DrawMuteSolo(wxDC * dc, const wxRect r, Track * t, bool down, bool solo, bool bHasSoloButton); void DrawVRuler(wxDC * dc, const wxRect r, Track * t); ! void DrawSliders(wxDC * dc, WaveTrack *t, wxRect r); --- 103,109 ---- void DrawMuteSolo(wxDC * dc, const wxRect r, Track * t, bool down, bool solo, bool bHasSoloButton); void DrawVRuler(wxDC * dc, const wxRect r, Track * t); ! void DrawVelocitySlider(wxDC * dc, NoteTrack *t, wxRect r); void DrawSliders(wxDC * dc, WaveTrack *t, wxRect r); // looks ok *** w80/src/widgets/ASlider.cpp.umE 2010-11-28 14:06:54.000000000 -0500 --- w80/src/widgets/ASlider.cpp.moE 2010-11-28 14:06:54.000000000 -0500 *************** *** 234,293 **** Init(parent, name, pos, size, minValue, maxValue, stepValue, canUseShift, style, heavyweight, popup, 1.0, orientation); } - # 416 "w80/src/widgets/ASlider.cppni" - LWSlider::LWSlider(wxWindow *parent, - wxString name, - const wxPoint &pos, - const wxSize &size, - int style, - bool heavyweight , - bool popup , - int orientation ) - { - wxString leftLabel, rightLabel; - # 435 "w80/src/widgets/ASlider.cppni" - float minValue, maxValue, stepValue; - float speed = 1.0; switch(style) { case PAN_SLIDER: ! minValue = -1.0f; ! maxValue = +1.0f; ! stepValue = 0.1f; ! orientation = wxHORIZONTAL; break; case DB_SLIDER: ! minValue = -36.0f; ! if (orientation == wxHORIZONTAL) ! maxValue = 36.0f; ! else ! maxValue = 36.0f; ! stepValue = 1.0f; ! speed = 0.5; break; case FRAC_SLIDER: ! minValue = 0.0f; ! maxValue = 1.0f; ! stepValue = STEP_CONTINUOUS; break; case SPEED_SLIDER: ! minValue = 0.01f; ! maxValue = 3.0f; ! stepValue = STEP_CONTINUOUS; break; default: ! minValue = 0.0f; ! maxValue = 1.0f; ! stepValue = 0.0f; wxASSERT(false); } - Init(parent, name, pos, size, minValue, maxValue, stepValue, - true, style, heavyweight, popup, speed, orientation); } void LWSlider::Init(wxWindow * parent, --- 234,312 ---- Init(parent, name, pos, size, minValue, maxValue, stepValue, canUseShift, style, heavyweight, popup, 1.0, orientation); } + + void LWSlider::SetStyle(int style) + { + mStyle = style; + mSpeed = 1.0; switch(style) { case PAN_SLIDER: ! mMinValue = -1.0f; ! mMaxValue = +1.0f; ! mStepValue = 0.1f; ! mOrientation = wxHORIZONTAL; ! mName = _("Pan"); break; case DB_SLIDER: ! mMinValue = DB_MIN; ! if (mOrientation == wxHORIZONTAL) ! mMaxValue = DB_MAX; ! else ! mMaxValue = DB_MAX; ! mStepValue = 1.0f; ! mSpeed = 0.5; ! mName = _("Gain"); break; case FRAC_SLIDER: ! mMinValue = FRAC_MIN; ! mMaxValue = FRAC_MAX; ! mStepValue = STEP_CONTINUOUS; break; case SPEED_SLIDER: ! mMinValue = SPEED_MIN; ! mMaxValue = SPEED_MAX; ! mStepValue = STEP_CONTINUOUS; ! break; ! ! case VEL_SLIDER: ! mMinValue = VEL_MIN; ! mMaxValue = VEL_MAX; ! mStepValue = 1.0f; ! mSpeed = 0.5; ! mName = _("Velocity"); break; default: ! mMinValue = FRAC_MIN; ! mMaxValue = FRAC_MAX; ! mStepValue = 0.0f; wxASSERT(false); } + } + LWSlider::LWSlider(wxWindow *parent, + wxString name, + const wxPoint &pos, + const wxSize &size, + int style, + bool heavyweight , + bool popup , + int orientation ) + { + wxString leftLabel, rightLabel; + + mOrientation = orientation; + mName = name; + + SetStyle(style); + + Init(parent, mName, pos, size, mMinValue, mMaxValue, mStepValue, + true, style, heavyweight, popup, mSpeed, mOrientation); + # 477 "w80/src/widgets/ASlider.cppni" } void LWSlider::Init(wxWindow * parent, // looks ok *************** *** 399,405 **** if (mStyle == PAN_SLIDER || mStyle == DB_SLIDER || mStyle == SPEED_SLIDER ! ) maxStr += wxT("000"); --- 418,424 ---- if (mStyle == PAN_SLIDER || mStyle == DB_SLIDER || mStyle == SPEED_SLIDER ! || mStyle == VEL_SLIDER ) maxStr += wxT("000"); // looks ok *************** *** 712,721 **** label.Printf(wxT("%s: %.2fx"), mName.c_str(), mCurrentValue); break; ! ! ! ! } --- 731,740 ---- label.Printf(wxT("%s: %.2fx"), mName.c_str(), mCurrentValue); break; ! case VEL_SLIDER: ! label.Printf(wxT("%s: %s%d"), mName.c_str(), ! (mCurrentValue > 0.0f ? _("+") : _("")), ! (int) mCurrentValue); } // looks ok *************** *** 1328,1334 **** { mLWSlider->Set(value); } ! # 1590 "w80/src/widgets/ASlider.cppni" void ASlider::Increase(float steps) { mLWSlider->Increase(steps); --- 1347,1361 ---- { mLWSlider->Set(value); } ! ! ! void ASlider::SetStyle(int style) ! { ! mStyle = style; ! mLWSlider->SetStyle(style); ! } ! ! void ASlider::Increase(float steps) { mLWSlider->Increase(steps); // looks ok *** w80/src/widgets/ASlider.h.umE 2010-11-28 14:06:54.000000000 -0500 --- w80/src/widgets/ASlider.h.moE 2010-11-28 14:06:54.000000000 -0500 *************** *** 81,87 **** float Get(bool convert = true); void Set(float value); ! void Increase(float steps); void Decrease(float steps); --- 81,87 ---- float Get(bool convert = true); void Set(float value); ! void SetStyle(int style); void Increase(float steps); void Decrease(float steps); // looks ok *************** *** 217,223 **** float Get( bool convert = true ); void Set(float value); ! void Increase(float steps); --- 217,223 ---- float Get( bool convert = true ); void Set(float value); ! void SetStyle(int style); void Increase(float steps); // looks ok