You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
rosegarden/src/test/segmenttransposecommand.cpp

162 lines
5.5 KiB

// -*- c-basic-offset: 4 -*-
#include "commands/segment/SegmentTransposeCommand.h"
#include "base/NotationTypes.h"
#include "base/Segment.h"
#include "base/Selection.h"
using namespace Rosegarden;
using std::cout;
/**
* Bb in Bb major became E# in F major, due to segment
* transposition
*
* Should be F
*/
int testSegmentBbtoF()
{
Segment * segment1 = new Segment();
Note * n = new Note(Note::QuarterNote);
Event * bes = n->getAsNoteEvent(1, 10);
segment1->insert(bes);
segment1->insert(Key("Bb major").getAsEvent(0));
SegmentTransposeCommand * mockCommand =
new SegmentTransposeCommand(*segment1,
true, -3, -5, true);
mockCommand->execute();
EventSelection m_selection(*segment1, segment1->getStartTime(), segment1->getEndMarkerTime());
EventSelection::eventcontainer::iterator i;
for (i = m_selection.getSegmentEvents().begin();
i != m_selection.getSegmentEvents().end(); ++i) {
if ((*i)->isa(Note::EventType)) {
Pitch resultPitch(**i);
std::cout << "Resulting pitch is: " << resultPitch.getPerformancePitch() << std::endl;
std::cout << "accidental: " << resultPitch.getDisplayAccidental(Key("F major")) << std::endl;
std::cout << "DisplayAccidental: " << resultPitch.getDisplayAccidental(Key("F major")) << std::endl;
if (resultPitch.getDisplayAccidental(Key("F major")) != Accidentals::NoAccidental)
{
return -1;
}
}
}
return 0;
}
/**
* G# in E major became Bb in F major, due to segment
* transposition (by using the 'segment transposition' combobox)
*
* Should be A#
*/
int testGistoAis()
{
Segment * segment1 = new Segment();
Note * n = new Note(Note::QuarterNote);
Event * gis = n->getAsNoteEvent(1, 8);
segment1->insert(gis);
segment1->insert(Key("E major").getAsEvent(0));
SegmentTransposeCommand * mockCommand =
new SegmentTransposeCommand(*segment1,
true, 1, 2, true);
mockCommand->execute();
EventSelection m_selection(*segment1, segment1->getStartTime(), segment1->getEndMarkerTime());
EventSelection::eventcontainer::iterator i;
for (i = m_selection.getSegmentEvents().begin();
i != m_selection.getSegmentEvents().end(); ++i) {
if ((*i)->isa(Note::EventType)) {
Pitch resultPitch(**i);
std::cout << "Resulting pitch is: " << resultPitch.getPerformancePitch() << std::endl;
std::cout << "accidental: " << resultPitch.getDisplayAccidental(Key("F# major")) << std::endl;
std::cout << "DisplayAccidental: " << resultPitch.getDisplayAccidental(Key("F# major")) << std::endl;
if (resultPitch.getDisplayAccidental(Key("F# major")) != Accidentals::NoAccidental)
{
std::cout << "Gis in E major does not become A#-in-F#-major (no-accidental) when transposed upwards by a small second" << std::endl;
return -1;
}
}
}
return 0;
}
/**
* A C# in the key of C# major somehow became a B# in the key of C
*/
int testSegmentCisToC()
{
Segment * segment1 = new Segment();
Note * n = new Note(Note::QuarterNote);
Event * cis = n->getAsNoteEvent(1, 13);
segment1->insert(cis);
segment1->insert(Key("C# major").getAsEvent(0));
SegmentTransposeCommand * mockCommand =
new SegmentTransposeCommand(*segment1,
true, 0, -1, true);
mockCommand->execute();
EventSelection m_selection(*segment1, segment1->getStartTime(), segment1->getEndMarkerTime());
EventSelection::eventcontainer::iterator i;
for (i = m_selection.getSegmentEvents().begin();
i != m_selection.getSegmentEvents().end(); ++i) {
if ((*i)->isa(Note::EventType)) {
Pitch resultPitch(**i);
std::cout << "Resulting pitch is: " << resultPitch.getPerformancePitch() << std::endl;
std::cout << "accidental: " << resultPitch.getDisplayAccidental(Key("C major")) << std::endl;
std::cout << "DisplayAccidental: " << resultPitch.getDisplayAccidental(Key("C major")) << std::endl;
if (resultPitch.getDisplayAccidental(Key("C major")) != Accidentals::NoAccidental)
{
std::cout << "C# in C# major does not lose accidental when transposed downwards by 1 semitone" << std::endl;
return -1;
}
}
}
return 0;
}
int testUndo()
{
Segment * segment1 = new Segment();
Segment * segment2 = new Segment();
// transpose once
SegmentTransposeCommand * mockCommand1a =
new SegmentTransposeCommand(*segment1,
true, -1, -2, true);
mockCommand1a->execute();
SegmentTransposeCommand * mockCommand1b =
new SegmentTransposeCommand(*segment2,
true, -1, -2, true);
mockCommand1b->execute();
// transpose twice
SegmentTransposeCommand * mockCommand2a =
new SegmentTransposeCommand(*segment1,
true, -1, -2, true);
mockCommand2a->execute();
SegmentTransposeCommand * mockCommand2b =
new SegmentTransposeCommand(*segment2,
true, -1, -2, true);
mockCommand2b->execute();
mockCommand2b->unexecute();
mockCommand2a->unexecute();
mockCommand1b->unexecute();
mockCommand1a->unexecute();
return 0;
}
int test_segmenttransposecommand(int argc, char** argv)
{
return
testGistoAis() +
testSegmentCisToC() +
testUndo() +
testSegmentBbtoF();
}