예제 #1
0
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()));
                        }
                    }
                }
            }
        }
    }
}
예제 #2
0
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);
}
예제 #3
0
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);
}
예제 #4
0
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);
}
예제 #5
0
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);
	}
}
예제 #6
0
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;
}
예제 #8
0
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);
}