void RemovePlayer::redo() { myScore.removePlayer(myPlayerIndex); // Remove the player from any player changes that it was involved in. myOriginalChanges.clear(); for (System &system : myScore.getSystems()) { for (PlayerChange &change : system.getPlayerChanges()) { myOriginalChanges.push_back(change); for (unsigned int i = 0; i < system.getStaves().size(); ++i) { for (const ActivePlayer &activePlayer : change.getActivePlayers(i)) { if (activePlayer.getPlayerNumber() >= myPlayerIndex) { change.removeActivePlayer(i, activePlayer); // Shift player numbers. if (activePlayer.getPlayerNumber() > myPlayerIndex) { change.insertActivePlayer( i, ActivePlayer( activePlayer.getPlayerNumber() - 1, activePlayer.getInstrumentNumber())); } } } } } } }
void CMainFrame::OnTimer(W64UINT nIDEvent) { BOOL ShowingMeters = m_MeterBar.IsWindowVisible(); BOOL ShowingSpectrum = m_SpectrumBar.IsWindowVisible(); if (IsPlaying()) { // if player is playing W64INT Frame; if (m_Player.GetPosition(Frame)) { double fFrame = double(Frame); if (ActivePlayer()) { // if active view owns player m_NavBar.SetNow(fFrame); // update nav bar now if (ShowingMeters) m_MeterBar.TimerHook(Frame); if (ShowingSpectrum) m_SpectrumBar.TimerHook(Frame); } if (m_PlayerView != NULL) m_PlayerView->SetNow(fFrame); // update playing view's now // if not looping and end of audio was reached if (!m_Player.GetRepeat() && Frame >= m_Player.GetWave()->GetFrameCount()) { Stop(); // stop playing // timer doesn't update UI for performance reasons; see IsIdleMessage m_TransportBar.OnUpdateCmdUI(this, FALSE); // explictly update UI } } else // can't get position Close(); // close player to avoid message infinite loop } else { // not playing if (ShowingMeters) m_MeterBar.TimerHook(W64INT_MAX); // reserved frame for hold decay } CMDIFrameWnd::OnTimer(nIDEvent); }
bool CMainFrame::Seek(double Frame) { if (!IsPlaying() || ActivePlayer()) { // if stopped, or active view owns player SetNow(Frame); // normal case } else { // player is playing but owned by inactive view if (!SetPosition(Frame)) // just set player position return(FALSE); } return(TRUE); }
bool CMainFrame::Stop() { if (!SetPlaying(FALSE)) return(FALSE); if (!m_Player.Rewind()) return(FALSE); if (ActivePlayer()) // if active view owns player m_NavBar.SetNow(0); if (m_PlayerView != NULL) m_PlayerView->SetNow(0); return(TRUE); }
void CMainFrame::SetSelection(const CDblRange& Sel) { if (m_View != NULL) { // if active view exists CDblRange SafeSel = Sel; W64INT frames = m_View->GetWave().GetFrameCount(); SafeSel.Start = CLAMP(SafeSel.Start, 0, frames); SafeSel.End = CLAMP(SafeSel.End, 0, frames); if (ActivePlayer()) // if active view owns player SetLoopPoints(SafeSel); // set player loop points m_View->SetSelection(SafeSel); m_NavBar.SetSelection(SafeSel); } }
void CMainFrame::SetNow(double Now, bool Center) { if (m_View != NULL) { // if active view exists W64INT frames = m_View->GetWave().GetFrameCount(); Now = CLAMP(Now, 0, frames); if (ActivePlayer()) // if active view owns player SetPosition(Now); // set player position if (Center) m_View->EnsureVisible(Now); m_View->SetNow(Now); m_NavBar.SetNow(Now); } }
PlayerChange PlayerChangeDialog::getPlayerChange() const { PlayerChange change; for (size_t i = 0; i < myStaffComboBoxes.size(); ++i) { const int staff = myStaffComboBoxes[i]->itemData( myStaffComboBoxes[i]->currentIndex()).toInt(); if (staff >= 0) { change.insertActivePlayer( staff, ActivePlayer(static_cast<int>(i), myInstrumentComboBoxes[i]->currentIndex())); } } return change; }
bool CMainFrame::SetPlaying(bool Enable) { if (Enable == IsPlaying()) // if already in requested state return(TRUE); // nothing to do if (m_View == NULL) return(FALSE); // nothing to play if (Enable) { // if playing if (!ActivePlayer()) { // if active view doesn't own player if (!UpdatePlayerState()) // take ownership before playing return(FALSE); } // if cursor is at end of audio if (m_View->GetIntNow() >= m_View->GetWave().GetFrameCount()) m_Player.Rewind(); // rewind so non-repeat play works if (m_MeterBar.IsWindowVisible()) m_MeterBar.ResetClipping(); } return(m_Player.SetPlaying(Enable)); }
Document &DocumentManager::addDefaultDocument( const SettingsManager &settings_manager) { Document &doc = addDocument(); Score &score = doc.getScore(); auto settings = settings_manager.getReadHandle(); // Add an initial player and instrument. Player player; player.setDescription("Player 1"); player.setTuning(settings->get(Settings::DefaultTuning)); score.insertPlayer(player); Instrument instrument; instrument.setDescription(settings->get(Settings::DefaultInstrumentName) + " 1"); instrument.setMidiPreset(settings->get(Settings::DefaultInstrumentPreset)); score.insertInstrument(instrument); ScoreUtils::addStandardFilters(score); // Add an initial staff, player change, and tempo marker. System system; system.insertStaff(Staff(player.getTuning().getStringCount())); PlayerChange initialPlayers; initialPlayers.insertActivePlayer(0, ActivePlayer(0, 0)); system.insertPlayerChange(initialPlayers); TempoMarker tempo; tempo.setDescription("Moderately"); system.insertTempoMarker(tempo); score.insertSystem(system); return doc; }
* GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <catch.hpp> #include <actions/removeplayerchange.h> #include <score/score.h> #include <score/scorelocation.h> TEST_CASE("Actions/RemovePlayerChange", "") { Score score; System system; PlayerChange change(5); change.insertActivePlayer(1, ActivePlayer(0, 2)); system.insertPlayerChange(change); score.insertSystem(system); RemovePlayerChange action(ScoreLocation(score, 0, 0, 5)); action.redo(); REQUIRE(score.getSystems()[0].getPlayerChanges().size() == 0); action.undo(); REQUIRE(score.getSystems()[0].getPlayerChanges().size() == 1); REQUIRE(score.getSystems()[0].getPlayerChanges()[0] == change); }