MuseScore/mscore/ove.cpp
2014-07-15 14:23:09 +02:00

8413 lines
233 KiB
C++

//=============================================================================
// MusE Score
// Linux Music Score Editor
// $Id: importove.cpp 4287 2011-05-17 14:50:09Z vanferry $
//
// Copyright (C) 2002-2009 Werner Schweer and others
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// 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, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//=============================================================================
#include "ove.h"
namespace OVE {
/*template <class T>
inline void deleteVector(QList<T*>& vec) {
for (int i=0; i<vec.size(); ++i)
delete vec[i];
}
//vec.clear();
}*/
///////////////////////////////////////////////////////////////////////////////
TickElement::TickElement() {
tick_ = 0;
}
void TickElement::setTick(int tick) {
tick_ = tick;
}
int TickElement::getTick(void) const {
return tick_;
}
///////////////////////////////////////////////////////////////////////////////
MeasurePos::MeasurePos() {
measure_ = 0;
offset_ = 0;
}
void MeasurePos::setMeasure(int measure) {
measure_ = measure;
}
int MeasurePos::getMeasure() const {
return measure_;
}
void MeasurePos::setOffset(int offset) {
offset_ = offset;
}
int MeasurePos::getOffset() const {
return offset_;
}
MeasurePos MeasurePos::shiftMeasure(int measure) const {
MeasurePos mp;
mp.setMeasure(getMeasure() + measure);
mp.setOffset(getOffset());
return mp;
}
MeasurePos MeasurePos::shiftOffset(int offset) const {
MeasurePos mp;
mp.setMeasure(getMeasure());
mp.setOffset(getOffset() + offset);
return mp;
}
bool MeasurePos::operator ==(const MeasurePos& mp) const {
return getMeasure() == mp.getMeasure() && getOffset() == mp.getOffset();
}
bool MeasurePos::operator !=(const MeasurePos& mp) const {
return !(*this == mp);
}
bool MeasurePos::operator <(const MeasurePos& mp) const {
if (getMeasure() != mp.getMeasure()) {
return getMeasure() < mp.getMeasure();
}
return getOffset() < mp.getOffset();
}
bool MeasurePos::operator <=(const MeasurePos& mp) const {
if (getMeasure() != mp.getMeasure()) {
return getMeasure() <= mp.getMeasure();
}
return getOffset() <= mp.getOffset();
}
bool MeasurePos::operator >(const MeasurePos& mp) const {
return !(*this <= mp);
}
bool MeasurePos::operator >=(const MeasurePos& mp) const {
return !(*this < mp);
}
///////////////////////////////////////////////////////////////////////////////
PairElement::PairElement() {
start_ = new MeasurePos();
stop_ = new MeasurePos();
}
PairElement::~PairElement(){
delete start_;
delete stop_;
}
MeasurePos* PairElement::start() const {
return start_;
}
MeasurePos* PairElement::stop() const {
return stop_;
}
///////////////////////////////////////////////////////////////////////////////
PairEnds::PairEnds() {
leftLine_ = new LineElement();
rightLine_ = new LineElement();
leftShoulder_ = new OffsetElement();
rightShoulder_ = new OffsetElement();
}
PairEnds::~PairEnds(){
delete leftLine_;
delete rightLine_;
delete leftShoulder_;
delete rightShoulder_;
}
LineElement* PairEnds::getLeftLine() const {
return leftLine_;
}
LineElement* PairEnds::getRightLine() const {
return rightLine_;
}
OffsetElement* PairEnds::getLeftShoulder() const {
return leftShoulder_;
}
OffsetElement* PairEnds::getRightShoulder() const {
return rightShoulder_;
}
///////////////////////////////////////////////////////////////////////////////
LineElement::LineElement() {
line_ = 0;
}
void LineElement::setLine(int line) {
line_ = line;
}
int LineElement::getLine(void) const {
return line_;
}
///////////////////////////////////////////////////////////////////////////////
OffsetElement::OffsetElement() {
xOffset_ = 0;
yOffset_ = 0;
}
void OffsetElement::setXOffset(int offset) {
xOffset_ = offset;
}
int OffsetElement::getXOffset() const {
return xOffset_;
}
void OffsetElement::setYOffset(int offset) {
yOffset_ = offset;
}
int OffsetElement::getYOffset() const {
return yOffset_;
}
///////////////////////////////////////////////////////////////////////////////
LengthElement::LengthElement() {
length_ = 0;
}
void LengthElement::setLength(int length) {
length_ = length;
}
int LengthElement::getLength() const {
return length_;
}
///////////////////////////////////////////////////////////////////////////////
MusicData::MusicData() {
musicDataType_ = MusicDataType::None;
show_ = true;
color_ = 0;
voice_ = 0;
}
MusicDataType MusicData::getMusicDataType() const {
return musicDataType_;
}
MusicData::XmlDataType MusicData::getXmlDataType(MusicDataType type) {
XmlDataType xmlType = XmlDataType::None;
switch (type) {
case MusicDataType::Measure_Repeat: {
xmlType = XmlDataType::Attributes;
break;
}
case MusicDataType::Beam: {
xmlType = XmlDataType::NoteBeam;
break;
}
case MusicDataType::Slur:
case MusicDataType::Glissando:
case MusicDataType::Tuplet:
case MusicDataType::Tie: {
xmlType = XmlDataType::Notations;
break;
}
case MusicDataType::Text:
case MusicDataType::Repeat:
case MusicDataType::Wedge:
case MusicDataType::Dynamics:
case MusicDataType::Pedal:
case MusicDataType::OctaveShift_EndPoint: {
xmlType = XmlDataType::Direction;
break;
}
default: {
xmlType = XmlDataType::None;
break;
}
}
return xmlType;
}
/*bool MusicData::get_is_pair_element(MusicDataType type)
{
bool pair = false;
switch ( type )
{
case MusicDataType::Numeric_Ending :
case MusicDataType::Measure_Repeat :
case MusicDataType::Wedge :
case MusicDataType::OctaveShift :
//case MusicDataType::OctaveShift_EndPoint :
case MusicDataType::Pedal :
case MusicDataType::Beam :
case MusicDataType::Glissando :
case MusicDataType::Slur :
case MusicDataType::Tie :
case MusicDataType::Tuplet :
{
pair = true;
break;
}
default:
break;
}
return pair;
}*/
void MusicData::setShow(bool show) {
show_ = show;
}
bool MusicData::getShow() const {
return show_;
}
void MusicData::setColor(unsigned int color) {
color_ = color;
}
unsigned int MusicData::getColor() const {
return color_;
}
void MusicData::setVoice(unsigned int voice) {
voice_ = voice;
}
unsigned int MusicData::getVoice() const {
return voice_;
}
void MusicData::copyCommonBlock(const MusicData& source) {
setTick(source.getTick());
start()->setOffset(source.start()->getOffset());
setColor(source.getColor());
}
///////////////////////////////////////////////////////////////////////////////
MidiData::MidiData() {
midiType_ = MidiType::None;
}
MidiType MidiData::getMidiType() const {
return midiType_;
}
///////////////////////////////////////////////////////////////////////////////
OveSong::OveSong() :
codec_(0) {
clear();
}
OveSong::~OveSong() {
clear();
}
void OveSong::setIsVersion4(bool version4){
version4_ = version4;
}
bool OveSong::getIsVersion4() const {
return version4_;
}
void OveSong::setQuarter(int tick) {
quarter_ = tick;
}
int OveSong::getQuarter(void) const {
return quarter_;
}
void OveSong::setShowPageMargin(bool show){
showPageMargin_ = show;
}
bool OveSong::getShowPageMargin() const {
return showPageMargin_;
}
void OveSong::setShowTransposeTrack(bool show) {
showTransposeTrack = show;
}
bool OveSong::getShowTransposeTrack() const {
return showTransposeTrack;
}
void OveSong::setShowLineBreak(bool show) {
showLineBreak_ = show;
}
bool OveSong::getShowLineBreak() const {
return showLineBreak_;
}
void OveSong::setShowRuler(bool show) {
showRuler_ = show;
}
bool OveSong::getShowRuler() const {
return showRuler_;
}
void OveSong::setShowColor(bool show) {
showColor_ = show;
}
bool OveSong::getShowColor() const {
return showColor_;
}
void OveSong::setPlayRepeat(bool play) {
playRepeat_ = play;
}
bool OveSong::getPlayRepeat() const {
return playRepeat_;
}
void OveSong::setPlayStyle(PlayStyle style) {
playStyle_ = style;
}
OveSong::PlayStyle OveSong::getPlayStyle() const {
return playStyle_;
}
void OveSong::addTitle(const QString& str) {
titles_.push_back(str);
}
QList<QString> OveSong::getTitles(void) const {
return titles_;
}
void OveSong::addAnnotate(const QString& str) {
annotates_.push_back(str);
}
QList<QString> OveSong::getAnnotates(void) const {
return annotates_;
}
void OveSong::addWriter(const QString& str) {
writers_.push_back(str);
}
QList<QString> OveSong::getWriters(void) const {
return writers_;
}
void OveSong::addCopyright(const QString& str) {
copyrights_.push_back(str);
}
QList<QString> OveSong::getCopyrights(void) const {
return copyrights_;
}
void OveSong::addHeader(const QString& str) {
headers_.push_back(str);
}
QList<QString> OveSong::getHeaders(void) const {
return headers_;
}
void OveSong::addFooter(const QString& str) {
footers_.push_back(str);
}
QList<QString> OveSong::getFooters(void) const {
return footers_;
}
void OveSong::addTrack(Track* ptr) {
tracks_.push_back(ptr);
}
int OveSong::getTrackCount(void) const {
return tracks_.size();
}
QList<Track*> OveSong::getTracks() const {
return tracks_;
}
void OveSong::setTrackBarCount(int count) {
trackBarCount_ = count;
}
int OveSong::getTrackBarCount() const {
return trackBarCount_;
}
Track* OveSong::getTrack(int part, int staff) const {
int trackId = partStaffToTrack(part, staff);
if( trackId >=0 && trackId < (int)tracks_.size() ) {
return tracks_[trackId];
}
return 0;
}
bool OveSong::addPage(Page* page) {
pages_.push_back(page);
return true;
}
int OveSong::getPageCount() const {
return pages_.size();
}
Page* OveSong::getPage(int idx) {
if( idx>=0 && idx<(int)pages_.size() ) {
return pages_[idx];
}
return 0;
}
void OveSong::addLine(Line* ptr) {
lines_.push_back(ptr);
}
int OveSong::getLineCount() const {
return lines_.size();
}
Line* OveSong::getLine(int idx) const {
if( idx >=0 && idx<(int)lines_.size() ) {
return lines_[idx];
}
return 0;
}
void OveSong::addMeasure(Measure* ptr) {
measures_.push_back(ptr);
}
int OveSong::getMeasureCount(void) const {
return measures_.size();
}
Measure* OveSong::getMeasure(int bar) const {
if( bar >= 0 && bar < (int)measures_.size() ) {
return measures_[bar];
}
return 0;
}
void OveSong::addMeasureData(MeasureData* ptr) {
measureDatas_.push_back(ptr);
}
int OveSong::getMeasureDataCount(void) const {
return measureDatas_.size();
}
MeasureData* OveSong::getMeasureData(int part, int staff/*=0*/, int bar) const {
int trackId = partStaffToTrack(part, staff);
int trackBarCount = getTrackBarCount();
if( bar >= 0 && bar < trackBarCount ) {
int measureId = trackBarCount * trackId + bar;
if( measureId >=0 && measureId < (int)measureDatas_.size() ) {
return measureDatas_[measureId];
}
}
return 0;
}
MeasureData* OveSong::getMeasureData(int track, int bar) const {
int id = trackBarCount_*track + bar;
if( id >=0 && id < (int)measureDatas_.size() ) {
return measureDatas_[id];
}
return 0;
}
void OveSong::setPartStaffCounts(const QList<int>& partStaffCounts) {
//partStaffCounts_.assign(partStaffCounts.begin(), partStaffCounts.end());
for(int i=0; i<partStaffCounts.size(); ++i) {
partStaffCounts_.push_back(partStaffCounts[i]);
}
}
int OveSong::getPartCount() const {
return partStaffCounts_.size();
}
int OveSong::getStaffCount(int part) const {
if( part>=0 && part<(int)partStaffCounts_.size() ) {
return partStaffCounts_[part];
}
return 0;
}
int OveSong::getPartBarCount() const {
return measureDatas_.size() / tracks_.size();
}
QPair<int, int> OveSong::trackToPartStaff(int track) const {
QPair<int, int> partStaff;
int i;
int staffCount = 0;
for( i=0; i<partStaffCounts_.size(); ++i ) {
if( staffCount + partStaffCounts_[i] > track ) {
return qMakePair((int)i, track-staffCount);
}
staffCount += partStaffCounts_[i];
}
return qMakePair((int)partStaffCounts_.size(), 0);
}
int OveSong::partStaffToTrack(int part, int staff) const {
int i;
unsigned int staffCount = 0;
for( i=0; i<partStaffCounts_.size(); ++i ) {
if( part == (int)i && staff>=0 && staff<(int)partStaffCounts_[i] ) {
int trackId = staffCount + staff;
if( trackId >=0 && trackId < (int)tracks_.size() ) {
return trackId;
}
}
staffCount += partStaffCounts_[i];
}
return tracks_.size();
}
void OveSong::setTextCodecName(const QString& codecName) {
codec_ = QTextCodec::codecForName(codecName.toLatin1());
}
QString OveSong::getCodecString(const QByteArray& text) {
QString s;
if (codec_ == NULL)
s = QString(text);
else
s = codec_->toUnicode(text);
s = s.trimmed();
return s;
}
void OveSong::clear(void)
{
version4_ = true;
quarter_ = 480;
showPageMargin_ = false;
showTransposeTrack = false;
showLineBreak_ = false;
showRuler_ = false;
showColor_ = true;
playRepeat_ = true;
playStyle_ = PlayStyle::Record;
annotates_.clear();
copyrights_.clear();
footers_.clear();
headers_.clear();
titles_.clear();
writers_.clear();
// deleteVector(tracks_);
for(int i=0; i<tracks_.size(); ++i){
delete tracks_[i];
}
for(int i=0; i<pages_.size(); ++i){
delete pages_[i];
}
for(int i=0; i<lines_.size(); ++i){
delete lines_[i];
}
for(int i=0; i<measures_.size(); ++i){
delete measures_[i];
}
for(int i=0; i<measureDatas_.size(); ++i){
delete measureDatas_[i];
}
tracks_.clear();
pages_.clear();
lines_.clear();
measures_.clear();
measureDatas_.clear();
trackBarCount_ = 0;
partStaffCounts_.clear();
}
///////////////////////////////////////////////////////////////////////////////
Voice::Voice() {
channel_ = 0;
volume_ = -1;
pitchShift_ = 0;
pan_ = 0;
patch_ = 0;
stemType_ = 0;
}
void Voice::setChannel(int channel) {
channel_ = channel;
}
int Voice::getChannel() const {
return channel_;
}
void Voice::setVolume(int volume) {
volume_ = volume;
}
int Voice::getVolume() const {
return volume_;
}
void Voice::setPitchShift(int pitchShift) {
pitchShift_ = pitchShift;
}
int Voice::getPitchShift() const {
return pitchShift_;
}
void Voice::setPan(int pan) {
pan_ = pan;
}
int Voice::getPan() const {
return pan_;
}
void Voice::setPatch(int patch) {
patch_ = patch;
}
int Voice::getPatch() const {
return patch_;
}
void Voice::setStemType(int stemType) {
stemType_ = stemType;
}
int Voice::getStemType() const {
return stemType_;
}
int Voice::getDefaultPatch() {
return -1;
}
int Voice::getDefaultVolume() {
return -1;
}
///////////////////////////////////////////////////////////////////////////////
Track::Track() {
clear();
}
Track::~Track() {
clear();
}
void Track::setName(const QString& str) {
name_ = str;
}
QString Track::getName(void) const {
return name_;
}
void Track::setBriefName(const QString& str) {
briefName_ = str;
}
QString Track::getBriefName(void) const {
return briefName_;
}
void Track::setPatch(unsigned int patch) {
patch_ = patch;
}
unsigned int Track::getPatch() const {
return patch_;
}
void Track::setChannel(int channel) {
channel_ = channel;
}
int Track::getChannel() const {
return channel_;
}
void Track::setShowName(bool show) {
showName_ = show;
}
bool Track::getShowName() const {
return showName_;
}
void Track::setShowBriefName(bool show) {
showBriefName_ = show;
}
bool Track::getShowBriefName() const {
return showBriefName_;
}
void Track::setMute(bool mute) {
mute_ = mute;
}
bool Track::getMute() const {
return mute_;
}
void Track::setSolo(bool solo) {
solo_ = solo;
}
bool Track::getSolo() const {
return solo_;
}
void Track::setShowKeyEachLine(bool show) {
showKeyEachLine_ = show;
}
bool Track::getShowKeyEachLine() const {
return showKeyEachLine_;
}
void Track::setVoiceCount(int voices) {
voiceCount_ = voices;
}
int Track::getVoiceCount() const {
return voiceCount_;
}
void Track::addVoice(Voice* voice) {
voices_.push_back(voice);
}
QList<Voice*> Track::getVoices() const {
return voices_;
}
void Track::setShowTranspose(bool show) {
showTranspose_ = show;
}
bool Track::getShowTranspose() const {
return showTranspose_;
}
void Track::setTranspose(int transpose) {
transpose_ = transpose;
}
int Track::getTranspose() const {
return transpose_;
}
void Track::setNoteShift(int shift) {
noteShift_ = shift;
}
int Track::getNoteShift() const {
return noteShift_;
}
void Track::setStartClef(int clef/*in Clef*/) {
startClef_ = ClefType(clef);
}
ClefType Track::getStartClef() const {
return startClef_;
}
void Track::setTransposeClef(int clef) {
transposeClef_ = ClefType(clef);
}
ClefType Track::getTansposeClef() const {
return transposeClef_;
}
void Track::setStartKey(int key) {
startKey_ = key;
}
int Track::getStartKey() const {
return startKey_;
}
void Track::setDisplayPercent(unsigned int percent/*25~100?*/) {
displayPercent_ = percent;
}
unsigned int Track::getDisplayPercent() const {
return displayPercent_;
}
void Track::setShowLegerLine(bool show) {
showLegerLine_ = show;
}
bool Track::getShowLegerLine() const {
return showLegerLine_;
}
void Track::setShowClef(bool show) {
showClef_ = show;
}
bool Track::getShowClef() const {
return showClef_;
}
void Track::setShowTimeSignature(bool show) {
showTimeSignature_ = show;
}
bool Track::getShowTimeSignature() const {
return showTimeSignature_;
}
void Track::setShowKeySignature(bool show) {
showKeySignature_ = show;
}
bool Track::getShowKeySignature() const {
return showKeySignature_;
}
void Track::setShowBarline(bool show) {
showBarline_ = show;
}
bool Track::getShowBarline() const {
return showBarline_;
}
void Track::setFillWithRest(bool fill) {
fillWithRest_ = fill;
}
bool Track::getFillWithRest() const {
return fillWithRest_;
}
void Track::setFlatTail(bool flat) {
flatTail_ = flat;
}
bool Track::getFlatTail() const {
return flatTail_;
}
void Track::setShowClefEachLine(bool show) {
showClefEachLine_ = show;
}
bool Track::getShowClefEachLine() const {
return showClefEachLine_;
}
void Track::addDrum(const DrumNode& node) {
/*DrumNode node;
node.line_ = line;
node.headType_ = headType;
node.pitch_ = pitch;
node.voice_ = voice;*/
drumKit_.push_back(node);
}
QList<Track::DrumNode> Track::getDrumKit() const {
return drumKit_;
}
void Track::setPart(int part) {
part_ = part;
}
int Track::getPart() const {
return part_;
}
void Track::clear(void) {
number_ = 0;
name_ = QString();
patch_ = 0;
channel_ = 0;
transpose_ = 0;
showTranspose_ = false;
noteShift_ = 0;
startClef_ = ClefType::Treble;
transposeClef_ = ClefType::Treble;
displayPercent_ = 100;
startKey_ = 0;
voiceCount_ = 8;
showName_ = true;
showBriefName_ = false;
showKeyEachLine_ = false;
showLegerLine_ = true;
showClef_ = true;
showTimeSignature_ = true;
showKeySignature_ = true;
showBarline_ = true;
showClefEachLine_ = false;
fillWithRest_ = true;
flatTail_ = false;
mute_ = false;
solo_ = false;
drumKit_.clear();
part_ = 0;
for(int i=0; i<voices_.size(); ++i){
delete voices_[i];
}
voices_.clear();
}
///////////////////////////////////////////////////////////////////////////////
Page::Page() {
beginLine_ = 0;
lineCount_ = 0;
lineInterval_ = 9;
staffInterval_ = 7;
staffInlineInterval_ = 6;
lineBarCount_ = 4;
pageLineCount_ = 5;
leftMargin_ = 0xA8;
topMargin_ = 0xA8;
rightMargin_ = 0xA8;
bottomMargin_ = 0xA8;
pageWidth_ = 0x0B40;
pageHeight_ = 0x0E90;
}
void Page::setBeginLine(int line) {
beginLine_ = line;
}
int Page::getBeginLine() const {
return beginLine_;
}
void Page::setLineCount(int count) {
lineCount_ = count;
}
int Page::getLineCount() const {
return lineCount_;
}
void Page::setLineInterval(int interval) {
lineInterval_ = interval;
}
int Page::getLineInterval() const {
return lineInterval_;
}
void Page::setStaffInterval(int interval) {
staffInterval_ = interval;
}
int Page::getStaffInterval() const {
return staffInterval_;
}
void Page::setStaffInlineInterval(int interval) {
staffInlineInterval_ = interval;
}
int Page::getStaffInlineInterval() const {
return staffInlineInterval_;
}
void Page::setLineBarCount(int count) {
lineBarCount_ = count;
}
int Page::getLineBarCount() const {
return lineBarCount_;
}
void Page::setPageLineCount(int count) {
pageLineCount_ = count;
}
int Page::getPageLineCount() const {
return pageLineCount_;
}
void Page::setLeftMargin(int margin) {
leftMargin_ = margin;
}
int Page::getLeftMargin() const {
return leftMargin_;
}
void Page::setTopMargin(int margin) {
topMargin_ = margin;
}
int Page::getTopMargin() const {
return topMargin_;
}
void Page::setRightMargin(int margin) {
rightMargin_ = margin;
}
int Page::getRightMargin() const {
return rightMargin_;
}
void Page::setBottomMargin(int margin) {
bottomMargin_ = margin;
}
int Page::getBottomMargin() const {
return bottomMargin_;
}
void Page::setPageWidth(int width) {
pageWidth_ = width;
}
int Page::getPageWidth() const {
return pageWidth_;
}
void Page::setPageHeight(int height) {
pageHeight_ = height;
}
int Page::getPageHeight() const {
return pageHeight_;
}
///////////////////////////////////////////////////////////////////////////////
Line::Line() {
beginBar_ = 0;
barCount_ = 0;
yOffset_ = 0;
leftXOffset_ = 0;
rightXOffset_ = 0;
}
Line::~Line() {
for(int i=0; i<staffs_.size(); ++i){
delete staffs_[i];
}
staffs_.clear();
}
void Line::addStaff(Staff* staff) {
staffs_.push_back(staff);
}
int Line::getStaffCount() const {
return staffs_.size();
}
Staff* Line::getStaff(int idx) const {
if (idx >= 0 && idx < (int) staffs_.size()) {
return staffs_[idx];
}
return 0;
}
void Line::setBeginBar(unsigned int bar) {
beginBar_ = bar;
}
unsigned int Line::getBeginBar() const {
return beginBar_;
}
void Line::setBarCount(unsigned int count) {
barCount_ = count;
}
unsigned int Line::getBarCount() const {
return barCount_;
}
void Line::setYOffset(int offset) {
yOffset_ = offset;
}
int Line::getYOffset() const {
return yOffset_;
}
void Line::setLeftXOffset(int offset) {
leftXOffset_ = offset;
}
int Line::getLeftXOffset() const {
return leftXOffset_;
}
void Line::setRightXOffset(int offset) {
rightXOffset_ = offset;
}
int Line::getRightXOffset() const {
return rightXOffset_;
}
///////////////////////////////////////////////////////////////////////////////
Staff::Staff() {
clef_ = ClefType::Treble;
key_ = 0;
visible_ = true;
groupType_ = GroupType::None;
groupStaffCount_ = 0;
}
void Staff::setClefType(int clef) {
clef_ = (ClefType) clef;
}
ClefType Staff::getClefType() const {
return clef_;
}
void Staff::setKeyType(int key) {
key_ = key;
}
int Staff::getKeyType() const {
return key_;
}
void Staff::setVisible(bool visible) {
visible_ = visible;
}
bool Staff::setVisible() const {
return visible_;
}
void Staff::setGroupType(GroupType type){
groupType_ = type;
}
GroupType Staff::getGroupType() const {
return groupType_;
}
void Staff::setGroupStaffCount(int count) {
groupStaffCount_ = count;
}
int Staff::getGroupStaffCount() const {
return groupStaffCount_;
}
///////////////////////////////////////////////////////////////////////////////
Note::Note() {
rest_ = false;
note_ = 60;
accidental_ = AccidentalType::Normal;
showAccidental_ = false;
offVelocity_ = 0x40;
onVelocity_ = 0x50;
headType_ = NoteHeadType::Standard;
tiePos_ = TiePos::None;
offsetStaff_ = 0;
show_ = true;
offsetTick_ = 0;
}
void Note::setIsRest(bool rest) {
rest_ = rest;
}
bool Note::getIsRest() const {
return rest_;
}
void Note::setNote(unsigned int note) {
note_ = note;
}
unsigned int Note::getNote() const {
return note_;
}
void Note::setAccidental(int type) {
accidental_ = (AccidentalType) type;
}
AccidentalType Note::getAccidental() const {
return accidental_;
}
void Note::setShowAccidental(bool show) {
showAccidental_ = show;
}
bool Note::getShowAccidental() const {
return showAccidental_;
}
void Note::setOnVelocity(unsigned int velocity) {
onVelocity_ = velocity;
}
unsigned int Note::getOnVelocity() const {
return onVelocity_;
}
void Note::setOffVelocity(unsigned int velocity) {
offVelocity_ = velocity;
}
unsigned int Note::getOffVelocity() const {
return offVelocity_;
}
void Note::setHeadType(int type) {
headType_ = (NoteHeadType) type;
}
NoteHeadType Note::getHeadType() const {
return headType_;
}
void Note::setTiePos(int tiePos) {
tiePos_ = (TiePos) tiePos;
}
TiePos Note::getTiePos() const {
return tiePos_;
}
void Note::setOffsetStaff(int offset) {
offsetStaff_ = offset;
}
int Note::getOffsetStaff() const {
return offsetStaff_;
}
void Note::setShow(bool show) {
show_ = show;
}
bool Note::getShow() const {
return show_;
}
void Note::setOffsetTick(int offset) {
offsetTick_ = offset;
}
int Note::getOffsetTick() const {
return offsetTick_;
}
///////////////////////////////////////////////////////////////////////////////
Articulation::Articulation() {
type_ = ArticulationType::Marcato;
above_ = true;
changeSoundEffect_ = false;
changeLength_ = false;
changeVelocity_ = false;
changeExtraLength_ = false;
soundEffect_ = qMakePair(0, 0);
lengthPercentage_ = 100;
velocityType_ = VelocityType::Offset;
velocityValue_ = 0;
extraLength_ = 0;
trillNoteLength_ = 60;
trillRate_ = NoteType::Note_Sixteen;
accelerateType_ = AccelerateType::None;
auxiliaryFirst_ = false;
trillInterval_ = TrillInterval::Chromatic;
}
void Articulation::setArtType(int type) {
type_ = (ArticulationType) type;
}
ArticulationType Articulation::getArtType() const {
return type_;
}
void Articulation::setPlacementAbove(bool above) {
above_ = above;
}
bool Articulation::getPlacementAbove() const {
return above_;
}
bool Articulation::getChangeSoundEffect() const {
return changeSoundEffect_;
}
void Articulation::setSoundEffect(int soundFrom, int soundTo) {
soundEffect_ = qMakePair(soundFrom, soundTo);
changeSoundEffect_ = true;
}
QPair<int, int> Articulation::getSoundEffect() const {
return soundEffect_;
}
bool Articulation::getChangeLength() const {
return changeLength_;
}
void Articulation::setLengthPercentage(int percentage) {
lengthPercentage_ = percentage;
changeLength_ = true;
}
int Articulation::getLengthPercentage() const {
return lengthPercentage_;
}
bool Articulation::getChangeVelocity() const {
return changeVelocity_;
}
void Articulation::setVelocityType(VelocityType type) {
velocityType_ = type;
changeVelocity_ = true;
}
Articulation::VelocityType Articulation::getVelocityType() const {
return velocityType_;
}
void Articulation::setVelocityValue(int value) {
velocityValue_ = value;
}
int Articulation::getVelocityValue() const {
return velocityValue_;
}
bool Articulation::getChangeExtraLength() const {
return changeExtraLength_;
}
void Articulation::setExtraLength(int length) {
extraLength_ = length;
changeExtraLength_ = true;
}
int Articulation::getExtraLength() const {
return extraLength_;
}
void Articulation::setTrillNoteLength(int length) {
trillNoteLength_ = length;
}
int Articulation::getTrillNoteLength() const {
return trillNoteLength_;
}
void Articulation::setTrillRate(NoteType rate) {
trillRate_ = rate;
}
NoteType Articulation::getTrillRate() const {
return trillRate_;
}
void Articulation::setAccelerateType(int type) {
accelerateType_ = (AccelerateType) type;
}
Articulation::AccelerateType Articulation::getAccelerateType() const {
return accelerateType_;
}
void Articulation::setAuxiliaryFirst(bool first) {
auxiliaryFirst_ = first;
}
bool Articulation::getAuxiliaryFirst() const {
return auxiliaryFirst_;
}
void Articulation::setTrillInterval(int interval) {
trillInterval_ = (TrillInterval) interval;
}
Articulation::TrillInterval Articulation::getTrillInterval() const {
return trillInterval_;
}
bool Articulation::willAffectNotes() const {
bool affect = false;
switch (getArtType()) {
case ArticulationType::Major_Trill:
case ArticulationType::Minor_Trill:
case ArticulationType::Trill_Section:
case ArticulationType::Inverted_Short_Mordent:
case ArticulationType::Inverted_Long_Mordent:
case ArticulationType::Short_Mordent:
case ArticulationType::Turn:
case ArticulationType::Arpeggio:
case ArticulationType::Tremolo_Eighth:
case ArticulationType::Tremolo_Sixteenth:
case ArticulationType::Tremolo_Thirty_Second:
case ArticulationType::Tremolo_Sixty_Fourth: {
affect = true;
break;
}
case ArticulationType::Finger_1:
case ArticulationType::Finger_2:
case ArticulationType::Finger_3:
case ArticulationType::Finger_4:
case ArticulationType::Finger_5:
case ArticulationType::Flat_Accidental_For_Trill:
case ArticulationType::Sharp_Accidental_For_Trill:
case ArticulationType::Natural_Accidental_For_Trill:
case ArticulationType::Marcato:
case ArticulationType::Marcato_Dot:
case ArticulationType::Heavy_Attack:
case ArticulationType::SForzando:
case ArticulationType::SForzando_Dot:
case ArticulationType::Heavier_Attack:
case ArticulationType::SForzando_Inverted:
case ArticulationType::SForzando_Dot_Inverted:
case ArticulationType::Staccatissimo:
case ArticulationType::Staccato:
case ArticulationType::Tenuto:
case ArticulationType::Up_Bow:
case ArticulationType::Down_Bow:
case ArticulationType::Up_Bow_Inverted:
case ArticulationType::Down_Bow_Inverted:
case ArticulationType::Natural_Harmonic:
case ArticulationType::Artificial_Harmonic:
case ArticulationType::Plus_Sign:
case ArticulationType::Fermata:
case ArticulationType::Fermata_Inverted:
case ArticulationType::Pedal_Down:
case ArticulationType::Pedal_Up:
case ArticulationType::Pause:
case ArticulationType::Grand_Pause:
case ArticulationType::Toe_Pedal:
case ArticulationType::Heel_Pedal:
case ArticulationType::Toe_To_Heel_Pedal:
case ArticulationType::Heel_To_Toe_Pedal:
case ArticulationType::Open_String:
case ArticulationType::Guitar_Lift:
case ArticulationType::Guitar_Slide_Up:
case ArticulationType::Guitar_Rip:
case ArticulationType::Guitar_Fall_Off:
case ArticulationType::Guitar_Slide_Down:
case ArticulationType::Guitar_Spill:
case ArticulationType::Guitar_Flip:
case ArticulationType::Guitar_Smear:
case ArticulationType::Guitar_Bend:
case ArticulationType::Guitar_Doit:
case ArticulationType::Guitar_Plop:
case ArticulationType::Guitar_Wow_Wow:
case ArticulationType::Guitar_Thumb:
case ArticulationType::Guitar_Index_Finger:
case ArticulationType::Guitar_Middle_Finger:
case ArticulationType::Guitar_Ring_Finger:
case ArticulationType::Guitar_Pinky_Finger:
case ArticulationType::Guitar_Tap:
case ArticulationType::Guitar_Hammer:
case ArticulationType::Guitar_Pluck: {
break;
}
default:
break;
}
return affect;
}
bool Articulation::isTrill(ArticulationType type) {
bool isTrill = false;
switch (type) {
case ArticulationType::Major_Trill:
case ArticulationType::Minor_Trill:
case ArticulationType::Trill_Section: {
isTrill = true;
break;
}
default:
break;
}
return isTrill;
}
Articulation::XmlType Articulation::getXmlType() const {
XmlType xmlType = XmlType::Unknown;
switch (type_) {
case ArticulationType::Major_Trill:
case ArticulationType::Minor_Trill:
case ArticulationType::Trill_Section:
case ArticulationType::Inverted_Short_Mordent:
case ArticulationType::Inverted_Long_Mordent:
case ArticulationType::Short_Mordent:
case ArticulationType::Turn:
// case ArticulationType::Flat_Accidental_For_Trill :
// case ArticulationType::Sharp_Accidental_For_Trill :
// case ArticulationType::Natural_Accidental_For_Trill :
case ArticulationType::Tremolo_Eighth:
case ArticulationType::Tremolo_Sixteenth:
case ArticulationType::Tremolo_Thirty_Second:
case ArticulationType::Tremolo_Sixty_Fourth: {
xmlType = XmlType::Ornament;
break;
}
case ArticulationType::Marcato:
case ArticulationType::Marcato_Dot:
case ArticulationType::Heavy_Attack:
case ArticulationType::SForzando:
case ArticulationType::SForzando_Inverted:
case ArticulationType::SForzando_Dot:
case ArticulationType::SForzando_Dot_Inverted:
case ArticulationType::Heavier_Attack:
case ArticulationType::Staccatissimo:
case ArticulationType::Staccato:
case ArticulationType::Tenuto:
case ArticulationType::Pause:
case ArticulationType::Grand_Pause: {
xmlType = XmlType::Articulation;
break;
}
case ArticulationType::Up_Bow:
case ArticulationType::Down_Bow:
case ArticulationType::Up_Bow_Inverted:
case ArticulationType::Down_Bow_Inverted:
case ArticulationType::Natural_Harmonic:
case ArticulationType::Artificial_Harmonic:
case ArticulationType::Finger_1:
case ArticulationType::Finger_2:
case ArticulationType::Finger_3:
case ArticulationType::Finger_4:
case ArticulationType::Finger_5:
case ArticulationType::Plus_Sign: {
xmlType = XmlType::Technical;
break;
}
case ArticulationType::Arpeggio: {
xmlType = XmlType::Arpeggiate;
break;
}
case ArticulationType::Fermata:
case ArticulationType::Fermata_Inverted: {
xmlType = XmlType::Fermata;
break;
}
case ArticulationType::Pedal_Down:
case ArticulationType::Pedal_Up: {
xmlType = XmlType::Direction;
break;
}
// case ArticulationType::Toe_Pedal :
// case ArticulationType::Heel_Pedal :
// case ArticulationType::Toe_To_Heel_Pedal :
// case ArticulationType::Heel_To_Toe_Pedal :
// case ArticulationType::Open_String :
default:
break;
}
return xmlType;
}
///////////////////////////////////////////////////////////////////////////////
NoteContainer::NoteContainer() {
musicDataType_ = MusicDataType::Note_Container;
grace_ = false;
cue_ = false;
rest_ = false;
raw_ = false;
noteType_ = NoteType::Note_Quarter;
dot_ = 0;
graceNoteType_ = NoteType::Note_Eight;
stemUp_ = true;
showStem_ = true;
stemLength_ = 7;
inBeam_ = false;
tuplet_ = 0;
space_ = 2;//div by 0
noteShift_ = 0;
}
NoteContainer::~NoteContainer(){
for(int i=0; i<notes_.size(); ++i){
delete notes_[i];
}
for(int i=0; i<articulations_.size(); ++i){
delete articulations_[i];
}
notes_.clear();
articulations_.clear();
}
void NoteContainer::setIsGrace(bool grace) {
grace_ = grace;
}
bool NoteContainer::getIsGrace() const {
return grace_;
}
void NoteContainer::setIsCue(bool cue) {
cue_ = cue;
}
bool NoteContainer::getIsCue() const {
return cue_;
}
void NoteContainer::setIsRest(bool rest) {
rest_ = rest;
}
bool NoteContainer::getIsRest() const {
return rest_;
}
void NoteContainer::setIsRaw(bool raw) {
raw_ = raw;
}
bool NoteContainer::getIsRaw() const {
return raw_;
}
void NoteContainer::setNoteType(NoteType type) {
noteType_ = NoteType::Note_Quarter;
switch (type) {
case NoteType::Note_DoubleWhole:
case NoteType::Note_Whole:
case NoteType::Note_Half:
case NoteType::Note_Quarter:
case NoteType::Note_Eight:
case NoteType::Note_Sixteen:
case NoteType::Note_32:
case NoteType::Note_64:
case NoteType::Note_128:
case NoteType::Note_256: {
noteType_ = type;
break;
}
default: {
break;
}
}
}
NoteType NoteContainer::getNoteType() const {
return noteType_;
}
void NoteContainer::setDot(int dot) {
dot_ = dot;
}
int NoteContainer::getDot() const {
return dot_;
}
void NoteContainer::setGraceNoteType(NoteType type) {
graceNoteType_ = type;
}
NoteType NoteContainer::getGraceNoteType() const {
return graceNoteType_;
}
void NoteContainer::setInBeam(bool in) {
inBeam_ = in;
}
bool NoteContainer::getInBeam() const {
return inBeam_;
}
void NoteContainer::setStemUp(bool up) {
stemUp_ = up;
}
bool NoteContainer::getStemUp(void) const {
return stemUp_;
}
void NoteContainer::setShowStem(bool show) {
showStem_ = show;
}
bool NoteContainer::getShowStem() const {
return showStem_;
}
void NoteContainer::setStemLength(int line) {
stemLength_ = line;
}
int NoteContainer::getStemLength() const {
return stemLength_;
}
void NoteContainer::setTuplet(int tuplet) {
tuplet_ = tuplet;
}
int NoteContainer::getTuplet() const {
return tuplet_;
}
void NoteContainer::setSpace(int space) {
space_ = space;
}
int NoteContainer::getSpace() const {
return space_;
}
void NoteContainer::addNoteRest(Note* note) {
notes_.push_back(note);
}
QList<Note*> NoteContainer::getNotesRests() const {
return notes_;
}
void NoteContainer::addArticulation(Articulation* art) {
articulations_.push_back(art);
}
QList<Articulation*> NoteContainer::getArticulations() const {
return articulations_;
}
void NoteContainer::setNoteShift(int octave) {
noteShift_ = octave;
}
int NoteContainer::getNoteShift() const {
return noteShift_;
}
int NoteContainer::getOffsetStaff() const {
if(getIsRest())
return 0;
int staffMove = 0;
QList<OVE::Note*> notes = getNotesRests();
for (int i = 0; i < notes.size(); ++i) {
OVE::Note* notePtr = notes[i];
staffMove = notePtr->getOffsetStaff();
}
return staffMove;
}
int NoteContainer::getDuration() const {
int duration = (int) NoteDuration::D_4;
switch (noteType_) {
case NoteType::Note_DoubleWhole: {
duration = (int) NoteDuration::D_Double_Whole;
break;
}
case NoteType::Note_Whole: {
duration = (int) NoteDuration::D_Whole;
break;
}
case NoteType::Note_Half: {
duration = (int) NoteDuration::D_2;
break;
}
case NoteType::Note_Quarter: {
duration = (int) NoteDuration::D_4;
break;
}
case NoteType::Note_Eight: {
duration = (int) NoteDuration::D_8;
break;
}
case NoteType::Note_Sixteen: {
duration = (int) NoteDuration::D_16;
break;
}
case NoteType::Note_32: {
duration = (int) NoteDuration::D_32;
break;
}
case NoteType::Note_64: {
duration = (int) NoteDuration::D_64;
break;
}
case NoteType::Note_128: {
duration = (int) NoteDuration::D_128;
break;
}
case NoteType::Note_256: {
duration = (int) NoteDuration::D_256;
break;
}
default:
break;
}
int dotLength = duration;
for (int i = 0; i < dot_; ++i) {
dotLength /= 2;
}
dotLength = duration - dotLength;
duration += dotLength;
return duration;
}
///////////////////////////////////////////////////////////////////////////////
Beam::Beam() {
musicDataType_ = MusicDataType::Beam;
grace_ = false;
}
void Beam::setIsGrace(bool grace) {
grace_ = grace;
}
bool Beam::getIsGrace() const {
return grace_;
}
void Beam::addLine(const MeasurePos& startMp, const MeasurePos& endMp) {
lines_.push_back(qMakePair(startMp, endMp));
}
const QList<QPair<MeasurePos, MeasurePos> > Beam::getLines() const {
return lines_;
}
///////////////////////////////////////////////////////////////////////////////
Tie::Tie() {
musicDataType_ = MusicDataType::Tie;
showOnTop_ = true;
note_ = 72;
height_ = 24;
}
void Tie::setShowOnTop(bool top) {
showOnTop_ = top;
}
bool Tie::getShowOnTop() const {
return showOnTop_;
}
void Tie::setNote(int note) {
note_ = note;
}
int Tie::getNote() const {
return note_;
}
void Tie::setHeight(int height) {
height_ = height;
}
int Tie::getHeight() const {
return height_;
}
///////////////////////////////////////////////////////////////////////////////
Glissando::Glissando() {
musicDataType_ = MusicDataType::Glissando;
straight_ = true;
text_ = "gliss.";
lineThick_ = 8;
}
void Glissando::setStraightWavy(bool straight) {
straight_ = straight;
}
bool Glissando::getStraightWavy() const {
return straight_;
}
void Glissando::setText(const QString& text) {
text_ = text;
}
QString Glissando::getText() const {
return text_;
}
void Glissando::setLineThick(int thick) {
lineThick_ = thick;
}
int Glissando::getLineThick() const {
return lineThick_;
}
///////////////////////////////////////////////////////////////////////////////
Decorator::Decorator() :
decoratorType_(Type::Articulation),
artType_(ArticulationType::Marcato) {
musicDataType_ = MusicDataType::Decorator;
}
void Decorator::setDecoratorType(Type type) {
decoratorType_ = type;
}
Decorator::Type Decorator::getDecoratorType() const {
return decoratorType_;
}
void Decorator::setArticulationType(ArticulationType type) {
artType_ = type;
}
ArticulationType Decorator::getArticulationType() const {
return artType_;
}
///////////////////////////////////////////////////////////////////////////////
MeasureRepeat::MeasureRepeat() {
musicDataType_ = MusicDataType::Measure_Repeat;
singleRepeat_ = true;
}
void MeasureRepeat::setSingleRepeat(bool single) {
singleRepeat_ = single;
start()->setMeasure(0);
start()->setOffset(0);
stop()->setMeasure(single ? 1 : 2);
stop()->setOffset(0);
}
bool MeasureRepeat::getSingleRepeat() const {
return singleRepeat_;
}
///////////////////////////////////////////////////////////////////////////////
Tuplet::Tuplet() :
tuplet_(3), space_(2), height_(0), noteType_(NoteType::Note_Quarter){
musicDataType_ = MusicDataType::Tuplet;
mark_ = new OffsetElement();
}
Tuplet::~Tuplet(){
delete mark_;
}
void Tuplet::setTuplet(int tuplet) {
tuplet_ = tuplet;
}
int Tuplet::getTuplet() const {
return tuplet_;
}
void Tuplet::setSpace(int space) {
space_ = space;
}
int Tuplet::getSpace() const {
return space_;
}
OffsetElement* Tuplet::getMarkHandle() const {
return mark_;
}
void Tuplet::setHeight(int height) {
height_ = height;
}
int Tuplet::getHeight() const {
return height_;
}
void Tuplet::setNoteType(NoteType type) {
noteType_ = type;
}
NoteType Tuplet::getNoteType() const {
return noteType_;
}
///////////////////////////////////////////////////////////////////////////////
Harmony::Harmony() {
musicDataType_ = MusicDataType::Harmony;
harmonyType_ = HarmonyType::H_maj;
root_ = 0;
bass_ = -1; //0xff
bassOnBottom_ = false;
angle_ = 0;
}
void Harmony::setHarmonyType(HarmonyType type) {
harmonyType_ = type;
}
HarmonyType Harmony::getHarmonyType() const {
return harmonyType_;
}
void Harmony::setRoot(int root) {
root_ = root;
}
int Harmony::getRoot() const {
return root_;
}
void Harmony::setBass(int bass) {
bass_ = bass;
}
int Harmony::getBass() const {
return bass_;
}
void Harmony::setBassOnBottom(bool on) {
bassOnBottom_ = on;
}
bool Harmony::getBassOnBottom() const {
return bassOnBottom_;
}
void Harmony::setAngle(int angle) {
angle_ = angle;
}
int Harmony::getAngle() const {
return angle_;
}
///////////////////////////////////////////////////////////////////////////////
Clef::Clef() {
musicDataType_ = MusicDataType::Clef;
clefType_ = ClefType::Treble;
}
void Clef::setClefType(int type) {
clefType_ = (ClefType) type;
}
ClefType Clef::getClefType() const {
return clefType_;
}
///////////////////////////////////////////////////////////////////////////////
Lyric::Lyric() {
musicDataType_ = MusicDataType::Lyric;
lyric_ = QString();
verse_ = 0;
}
void Lyric::setLyric(const QString& lyricText) {
lyric_ = lyricText;
}
QString Lyric::getLyric() const {
return lyric_;
}
void Lyric::setVerse(int verse) {
verse_ = verse;
}
int Lyric::getVerse() const {
return verse_;
}
///////////////////////////////////////////////////////////////////////////////
Slur::Slur() {
musicDataType_ = MusicDataType::Slur;
containerCount_ = 1;
showOnTop_ = true;
noteTimePercent_ = 100;
handle_2_ = new OffsetElement();
handle_3_ = new OffsetElement();
}
Slur::~Slur() {
delete handle_2_;
delete handle_3_;
}
void Slur::setContainerCount(int count) {
containerCount_ = count;
}
int Slur::getContainerCount() const {
return containerCount_;
}
void Slur::setShowOnTop(bool top) {
showOnTop_ = top;
}
bool Slur::getShowOnTop() const {
return showOnTop_;
}
OffsetElement* Slur::getHandle2() const {
return handle_2_;
}
OffsetElement* Slur::getHandle3() const {
return handle_3_;
}
void Slur::setNoteTimePercent(int percent) {
noteTimePercent_ = percent;
}
int Slur::getNoteTimePercent() const {
return noteTimePercent_;
}
///////////////////////////////////////////////////////////////////////////////
Dynamics::Dynamics() {
musicDataType_ = MusicDataType::Dynamics;
dynamicsType_ = DynamicsType::PPPP;
playback_ = true;
velocity_ = 30;
}
void Dynamics::setDynamicsType(int type) {
dynamicsType_ = DynamicsType(type);
}
DynamicsType Dynamics::getDynamicsType() const {
return dynamicsType_;
}
void Dynamics::setIsPlayback(bool play) {
playback_ = play;
}
bool Dynamics::getIsPlayback() const {
return playback_;
}
void Dynamics::setVelocity(int vel) {
velocity_ = vel;
}
int Dynamics::getVelocity() const {
return velocity_;
}
///////////////////////////////////////////////////////////////////////////////
WedgeEndPoint::WedgeEndPoint() {
musicDataType_ = MusicDataType::Wedge_EndPoint;
wedgeType_ = WedgeType::Cres;
height_ = 24;
wedgeStart_ = true;
}
void WedgeEndPoint::setWedgeType(WedgeType type) {
wedgeType_ = type;
}
WedgeType WedgeEndPoint::getWedgeType() const {
return wedgeType_;
}
void WedgeEndPoint::setHeight(int height) {
height_ = height;
}
int WedgeEndPoint::getHeight() const {
return height_;
}
void WedgeEndPoint::setWedgeStart(bool wedgeStart) {
wedgeStart_ = wedgeStart;
}
bool WedgeEndPoint::getWedgeStart() const {
return wedgeStart_;
}
///////////////////////////////////////////////////////////////////////////////
Wedge::Wedge() {
musicDataType_ = MusicDataType::Wedge;
wedgeType_ = WedgeType::Cres;
height_ = 24;
}
void Wedge::setWedgeType(WedgeType type) {
wedgeType_ = type;
}
WedgeType Wedge::getWedgeType() const {
return wedgeType_;
}
void Wedge::setHeight(int height) {
height_ = height;
}
int Wedge::getHeight() const {
return height_;
}
///////////////////////////////////////////////////////////////////////////////
Pedal::Pedal() {
musicDataType_ = MusicDataType::Pedal;
half_ = false;
playback_ = false;
playOffset_ = 0;
pedalHandle_ = new OffsetElement();
}
Pedal::~Pedal() {
delete pedalHandle_;
}
void Pedal::setHalf(bool half) {
half_ = half;
}
bool Pedal::getHalf() const {
return half_;
}
OffsetElement* Pedal::getPedalHandle() const {
return pedalHandle_;
}
void Pedal::setIsPlayback(bool playback) {
playback_ = playback;
}
bool Pedal::getIsPlayback() const {
return playback_;
}
void Pedal::setPlayOffset(int offset) {
playOffset_ = offset;
}
int Pedal::getPlayOffset() const {
return playOffset_;
}
///////////////////////////////////////////////////////////////////////////////
KuoHao::KuoHao() {
musicDataType_ = MusicDataType::KuoHao;
kuohaoType_ = KuoHaoType::Parentheses;
height_ = 0;
}
void KuoHao::setHeight(int height) {
height_ = height;
}
int KuoHao::getHeight() const {
return height_;
}
void KuoHao::setKuohaoType(int type) {
kuohaoType_ = (KuoHaoType) type;
}
KuoHaoType KuoHao::getKuohaoType() const {
return kuohaoType_;
}
///////////////////////////////////////////////////////////////////////////////
Expressions::Expressions() {
musicDataType_ = MusicDataType::Expressions;
text_ = QString();
}
void Expressions::setText(const QString& str) {
text_ = str;
}
QString Expressions::getText() const {
return text_;
}
///////////////////////////////////////////////////////////////////////////////
HarpPedal::HarpPedal() :
showType_(0),
showCharFlag_(0) {
musicDataType_ = MusicDataType::Harp_Pedal;
}
void HarpPedal::setShowType(int type) {
showType_ = type;
}
int HarpPedal::getShowType() const {
return showType_;
}
void HarpPedal::setShowCharFlag(int flag) {
showCharFlag_ = flag;
}
int HarpPedal::getShowCharFlag() const {
return showCharFlag_;
}
///////////////////////////////////////////////////////////////////////////////
OctaveShift::OctaveShift() :
octaveShiftType_(OctaveShiftType::OS_8),
octaveShiftPosition_(OctaveShiftPosition::Start),
endTick_(0) {
musicDataType_ = MusicDataType::OctaveShift;
}
void OctaveShift::setOctaveShiftType(OctaveShiftType type) {
octaveShiftType_ = type;
}
OctaveShiftType OctaveShift::getOctaveShiftType() const {
return octaveShiftType_;
}
int OctaveShift::getNoteShift() const {
int shift = 12;
switch (getOctaveShiftType()) {
case OctaveShiftType::OS_8: {
shift = 12;
break;
}
case OctaveShiftType::OS_Minus_8: {
shift = -12;
break;
}
case OctaveShiftType::OS_15: {
shift = 24;
break;
}
case OctaveShiftType::OS_Minus_15: {
shift = -24;
break;
}
default:
break;
}
return shift;
}
void OctaveShift::setEndTick(int tick) {
endTick_ = tick;
}
int OctaveShift::getEndTick() const {
return endTick_;
}
///////////////////////////////////////////////////////////////////////////////
OctaveShiftEndPoint::OctaveShiftEndPoint() {
musicDataType_ = MusicDataType::OctaveShift_EndPoint;
octaveShiftType_ = OctaveShiftType::OS_8;
octaveShiftPosition_ = OctaveShiftPosition::Start;
endTick_ = 0;
}
void OctaveShiftEndPoint::setOctaveShiftType(OctaveShiftType type) {
octaveShiftType_ = type;
}
OctaveShiftType OctaveShiftEndPoint::getOctaveShiftType() const {
return octaveShiftType_;
}
void OctaveShiftEndPoint::setOctaveShiftPosition(OctaveShiftPosition position) {
octaveShiftPosition_ = position;
}
OctaveShiftPosition OctaveShiftEndPoint::getOctaveShiftPosition() const {
return octaveShiftPosition_;
}
void OctaveShiftEndPoint::setEndTick(int tick) {
endTick_ = tick;
}
int OctaveShiftEndPoint::getEndTick() const {
return endTick_;
}
///////////////////////////////////////////////////////////////////////////////
MultiMeasureRest::MultiMeasureRest() {
musicDataType_ = MusicDataType::Multi_Measure_Rest;
measureCount_ = 0;
}
void MultiMeasureRest::setMeasureCount(int count) {
measureCount_ = count;
}
int MultiMeasureRest::getMeasureCount() const {
return measureCount_;
}
///////////////////////////////////////////////////////////////////////////////
Tempo::Tempo() {
musicDataType_ = MusicDataType::Tempo;
leftNoteType_ = 3;
showMark_ = false;
showText_ = false;
showParenthesis_ = false;
typeTempo_ = 96;
leftText_ = QString();
rightText_ = QString();
swingEighth_ = false;
rightNoteType_ = 3;
}
void Tempo::setLeftNoteType(int type) {
leftNoteType_ = type;
}
NoteType Tempo::getLeftNoteType() const {
return (NoteType) leftNoteType_;
}
void Tempo::setShowMark(bool show) {
showMark_ = show;
}
bool Tempo::getShowMark() const {
return showMark_;
}
void Tempo::setShowBeforeText(bool show) {
showText_ = show;
}
bool Tempo::getShowBeforeText() const {
return showText_;
}
void Tempo::setShowParenthesis(bool show) {
showParenthesis_ = show;
}
bool Tempo::getShowParenthesis() const {
return showParenthesis_;
}
void Tempo::setTypeTempo(int tempo) {
typeTempo_ = tempo;
}
int Tempo::getTypeTempo() const {
return typeTempo_;
}
int Tempo::getQuarterTempo() const {
double factor = pow(2.0, int(NoteType::Note_Quarter) - int(getLeftNoteType()));
int tempo = int((double) getTypeTempo() * factor);
return tempo;
}
void Tempo::setLeftText(const QString& str) {
leftText_ = str;
}
QString Tempo::getLeftText() const {
return leftText_;
}
void Tempo::setRightText(const QString& str) {
rightText_ = str;
}
QString Tempo::getRightText() const {
return rightText_;
}
void Tempo::setSwingEighth(bool swing) {
swingEighth_ = swing;
}
bool Tempo::getSwingEighth() const {
return swingEighth_;
}
void Tempo::setRightNoteType(int type) {
rightNoteType_ = type;
}
int Tempo::getRightNoteType() const {
return rightNoteType_;
}
///////////////////////////////////////////////////////////////////////////////
Text::Text() {
musicDataType_ = MusicDataType::Text;
textType_ = Type::Rehearsal;
horiMargin_ = 8;
vertMargin_ = 8;
lineThick_ = 4;
text_ = QString();
width_ = 0;
height_ = 0;
}
void Text::setTextType(Type type) {
textType_ = type;
}
Text::Type Text::getTextType() const {
return textType_;
}
void Text::setHorizontalMargin(int margin) {
horiMargin_ = margin;
}
int Text::getHorizontalMargin() const {
return horiMargin_;
}
void Text::setVerticalMargin(int margin) {
vertMargin_ = margin;
}
int Text::getVerticalMargin() const {
return vertMargin_;
}
void Text::setLineThick(int thick) {
lineThick_ = thick;
}
int Text::getLineThick() const {
return lineThick_;
}
void Text::setText(const QString& text) {
text_ = text;
}
QString Text::getText() const {
return text_;
}
void Text::setWidth(int width) {
width_ = width;
}
int Text::getWidth() const {
return width_;
}
void Text::setHeight(int height) {
height_ = height;
}
int Text::getHeight() const {
return height_;
}
///////////////////////////////////////////////////////////////////////////////
TimeSignature::TimeSignature() {
numerator_ = 4;
denominator_ = 4;
isSymbol_ = false;
beatLength_ = 480;
barLength_ = 1920;
barLengthUnits_ = 0x400;
replaceFont_ = false;
showBeatGroup_ = false;
groupNumerator1_ = 0;
groupNumerator2_ = 0;
groupNumerator3_ = 0;
groupDenominator1_ = 4;
groupDenominator2_ = 4;
groupDenominator3_ = 4;
beamGroup1_ = 4;
beamGroup2_ = 0;
beamGroup3_ = 0;
beamGroup4_ = 0;
beamCount16th_ = 4;
beamCount32th_ = 1;
}
void TimeSignature::setNumerator(int numerator) {
numerator_ = numerator;
}
int TimeSignature::getNumerator() const {
return numerator_;
}
void TimeSignature::setDenominator(int denominator) {
denominator_ = denominator;
}
int TimeSignature::getDenominator() const {
return denominator_;
}
void TimeSignature::setIsSymbol(bool symbol) {
isSymbol_ = symbol;
}
bool TimeSignature::getIsSymbol() const {
if (numerator_ == 2 && denominator_ == 2) {
return true;
}
return isSymbol_;
}
void TimeSignature::setBeatLength(int length) {
beatLength_ = length;
}
int TimeSignature::getBeatLength() const {
return beatLength_;
}
void TimeSignature::setBarLength(int length) {
barLength_ = length;
}
int TimeSignature::getBarLength() const {
return barLength_;
}
void TimeSignature::addBeat(int startUnit, int lengthUnit, int startTick) {
BeatNode node;
node.startUnit_ = startUnit;
node.lengthUnit_ = lengthUnit;
node.startTick_ = startTick;
beats_.push_back(node);
}
void TimeSignature::endAddBeat() {
int i;
barLengthUnits_ = 0;
for (i = 0; i < beats_.size(); ++i) {
barLengthUnits_ += beats_[i].lengthUnit_;
}
}
int TimeSignature::getUnits() const {
return barLengthUnits_;
}
void TimeSignature::setReplaceFont(bool replace) {
replaceFont_ = replace;
}
bool TimeSignature::getReplaceFont() const {
return replaceFont_;
}
void TimeSignature::setShowBeatGroup(bool show) {
showBeatGroup_ = show;
}
bool TimeSignature::getShowBeatGroup() const {
return showBeatGroup_;
}
void TimeSignature::setGroupNumerator1(int numerator) {
groupNumerator1_ = numerator;
}
void TimeSignature::setGroupNumerator2(int numerator) {
groupNumerator2_ = numerator;
}
void TimeSignature::setGroupNumerator3(int numerator) {
groupNumerator3_ = numerator;
}
void TimeSignature::setGroupDenominator1(int denominator) {
groupDenominator1_ = denominator;
}
void TimeSignature::setGroupDenominator2(int denominator) {
groupDenominator2_ = denominator;
}
void TimeSignature::setGroupDenominator3(int denominator) {
groupDenominator3_ = denominator;
}
void TimeSignature::setBeamGroup1(int count) {
beamGroup1_ = count;
}
void TimeSignature::setBeamGroup2(int count) {
beamGroup2_ = count;
}
void TimeSignature::setBeamGroup3(int count) {
beamGroup3_ = count;
}
void TimeSignature::setBeamGroup4(int count) {
beamGroup4_ = count;
}
void TimeSignature::set16thBeamCount(int count) {
beamCount16th_ = count;
}
void TimeSignature::set32thBeamCount(int count) {
beamCount32th_ = count;
}
///////////////////////////////////////////////////////////////////////////////
Key::Key() {
key_ = 0;
set_ = false;
previousKey_ = 0;
symbolCount_ = 0;
}
void Key::setKey(int key) {
key_ = key;
set_ = true;
}
int Key::getKey() const {
return key_;
}
bool Key::getSetKey() const {
return set_;
}
void Key::setPreviousKey(int key) {
previousKey_ = key;
}
int Key::getPreviousKey() const {
return previousKey_;
}
void Key::setSymbolCount(int count) {
symbolCount_ = count;
}
int Key::getSymbolCount() const {
return symbolCount_;
}
///////////////////////////////////////////////////////////////////////////////
RepeatSymbol::RepeatSymbol() :
text_("#1"), repeatType_(RepeatType::Segno) {
musicDataType_ = MusicDataType::Repeat;
}
void RepeatSymbol::setText(const QString& text) {
text_ = text;
}
QString RepeatSymbol::getText() const {
return text_;
}
void RepeatSymbol::setRepeatType(int repeatType) {
repeatType_ = (RepeatType) repeatType;
}
RepeatType RepeatSymbol::getRepeatType() const {
return repeatType_;
}
///////////////////////////////////////////////////////////////////////////////
NumericEnding::NumericEnding() {
musicDataType_ = MusicDataType::Numeric_Ending;
height_ = 0;
text_ = QString();
numericHandle_ = new OffsetElement();
}
NumericEnding::~NumericEnding() {
delete numericHandle_;
}
OffsetElement* NumericEnding::getNumericHandle() const {
return numericHandle_;
}
void NumericEnding::setHeight(int height) {
height_ = height;
}
int NumericEnding::getHeight() const {
return height_;
}
void NumericEnding::setText(const QString& text) {
text_ = text;
}
QString NumericEnding::getText() const {
return text_;
}
QList<int> NumericEnding::getNumbers() const {
int i;
QStringList strs = text_.split(",", QString::SkipEmptyParts);
QList<int> endings;
for (i = 0; i < strs.size(); ++i) {
bool ok;
int num = strs[i].toInt(&ok);
endings.push_back(num);
}
return endings;
}
int NumericEnding::getJumpCount() const {
QList<int> numbers = getNumbers();
int count = 0;
for (int i = 0; i < numbers.size(); ++i) {
if ((int)i + 1 != numbers[i]) {
break;
}
count = i + 1;
}
return count;
}
///////////////////////////////////////////////////////////////////////////////
BarNumber::BarNumber() {
index_ = 0;
showOnParagraphStart_ = false;
align_ = 0;
showFlag_ = 1; // staff
barRange_ = 1; // can't be 0
prefix_ = QString();
}
void BarNumber::setIndex(int index) {
index_ = index;
}
int BarNumber::getIndex() const {
return index_;
}
void BarNumber::setShowOnParagraphStart(bool show) {
showOnParagraphStart_ = show;
}
bool BarNumber::getShowOnParagraphStart() const {
return showOnParagraphStart_;
}
void BarNumber::setAlign(int align)// 0:left, 1:center, 2:right
{
align_ = align;
}
int BarNumber::getAlign() const {
return align_;
}
void BarNumber::setShowFlag(int flag) {
showFlag_ = flag;
}
int BarNumber::getShowFlag() const {
return showFlag_;
}
void BarNumber::setShowEveryBarCount(int count) {
barRange_ = count;
}
int BarNumber::getShowEveryBarCount() const {
return barRange_;
}
void BarNumber::setPrefix(const QString& str) {
prefix_ = str;
}
QString BarNumber::getPrefix() const {
return prefix_;
}
///////////////////////////////////////////////////////////////////////////////
MidiController::MidiController() {
midiType_ = MidiType::Controller;
controller_ = 64; // pedal
value_ = 0;
}
void MidiController::setController(int number) {
controller_ = number;
}
int MidiController::getController() const {
return controller_;
}
void MidiController::setValue(int value) {
value_ = value;
}
int MidiController::getValue() const {
return value_;
}
///////////////////////////////////////////////////////////////////////////////
MidiProgramChange::MidiProgramChange() {
midiType_ = MidiType::Program_Change;
patch_ = 0; // grand piano
}
void MidiProgramChange::setPatch(int patch) {
patch_ = patch;
}
int MidiProgramChange::getPatch() const {
return patch_;
}
///////////////////////////////////////////////////////////////////////////////
MidiChannelPressure::MidiChannelPressure() :
pressure_(0) {
midiType_ = MidiType::Channel_Pressure;
}
void MidiChannelPressure::setPressure(int pressure) {
pressure_ = pressure;
}
int MidiChannelPressure::getPressure() const {
return pressure_;
}
///////////////////////////////////////////////////////////////////////////////
MidiPitchWheel::MidiPitchWheel() {
midiType_ = MidiType::Pitch_Wheel;
value_ = 0;
}
void MidiPitchWheel::setValue(int value) {
value_ = value;
}
int MidiPitchWheel::getValue() const {
return value_;
}
///////////////////////////////////////////////////////////////////////////////
Measure::Measure(int index) {
barNumber_ = new BarNumber();
barNumber_->setIndex(index);
time_ = new TimeSignature();
clear();
}
Measure::~Measure(){
clear();
delete barNumber_;
delete time_;
}
BarNumber* Measure::getBarNumber() const {
return barNumber_;
}
TimeSignature* Measure::getTime() const {
return time_;
}
void Measure::setLeftBarline(int barline) {
leftBarline_ = (BarLineType) barline;
}
BarLineType Measure::getLeftBarline() const {
return leftBarline_;
}
void Measure::setRightBarline(int barline) {
rightBarline_ = (BarLineType) barline;
}
BarLineType Measure::getRightBarline() const {
return rightBarline_;
}
void Measure::setBackwardRepeatCount(int repeatCount) {
repeatCount_ = repeatCount;
}
int Measure::getBackwardRepeatCount() const {
return repeatCount_;
}
void Measure::setTypeTempo(double tempo) {
typeTempo_ = tempo;
}
double Measure::getTypeTempo() const {
return typeTempo_;
}
void Measure::setIsPickup(bool pickup) {
pickup_ = pickup;
}
bool Measure::getIsPickup() const {
return pickup_;
}
void Measure::setIsMultiMeasureRest(bool rest) {
multiMeasureRest_ = rest;
}
bool Measure::getIsMultiMeasureRest() const {
return multiMeasureRest_;
}
void Measure::setMultiMeasureRestCount(int count) {
multiMeasureRestCount_ = count;
}
int Measure::getMultiMeasureRestCount() const {
return multiMeasureRestCount_;
}
void Measure::clear() {
leftBarline_ = BarLineType::Default;
rightBarline_ = BarLineType::Default;
repeatCount_ = 1;
typeTempo_ = 96.00;
setLength(0x780); //time = 4/4
pickup_ = false;
multiMeasureRest_ = false;
multiMeasureRestCount_ = 0;
}
///////////////////////////////////////////////////////////////////////////////
MeasureData::MeasureData() {
key_ = new Key();
clef_ = new Clef();
}
MeasureData::~MeasureData(){
int i;
for(i=0; i<musicDatas_.size(); ++i){
delete musicDatas_[i];
}
musicDatas_.clear();
// noteContainers_ also in musicDatas_, no need to destory
noteContainers_.clear();
// only delete at element start
for(i=0; i<crossMeasureElements_.size(); ++i){
if(crossMeasureElements_[i].second){
delete crossMeasureElements_[i].first;
}
}
crossMeasureElements_.clear();
for(i=0; i<midiDatas_.size(); ++i){
delete midiDatas_[i];
}
midiDatas_.clear();
delete key_;
delete clef_;
}
Key* MeasureData::getKey() const {
return key_;
}
Clef* MeasureData::getClef() const {
return clef_;
}
void MeasureData::addNoteContainer(NoteContainer* ptr) {
noteContainers_.push_back(ptr);
}
QList<NoteContainer*> MeasureData::getNoteContainers() const {
return noteContainers_;
}
void MeasureData::addMusicData(MusicData* ptr) {
musicDatas_.push_back(ptr);
}
QList<MusicData*> MeasureData::getMusicDatas(MusicDataType type) {
int i;
QList<MusicData*> notations;
for (i = 0; i < musicDatas_.size(); ++i) {
if (type == MusicDataType::None || musicDatas_[i]->getMusicDataType() == type) {
notations.push_back(musicDatas_[i]);
}
}
return notations;
}
void MeasureData::addCrossMeasureElement(MusicData* ptr, bool start) {
crossMeasureElements_.push_back(qMakePair(ptr, start));
}
QList<MusicData*> MeasureData::getCrossMeasureElements(
MusicDataType type, PairType pairType)
{
int i;
QList<MusicData*> pairs;
for (i = 0; i < crossMeasureElements_.size(); ++i) {
if ((type == MusicDataType::None || crossMeasureElements_[i].first->getMusicDataType() == type)
&& (pairType == PairType::All || ((crossMeasureElements_[i].second && pairType == PairType::Start)
|| (!crossMeasureElements_[i].second && pairType == PairType::Stop)))) {
pairs.push_back(crossMeasureElements_[i].first);
}
}
return pairs;
}
void MeasureData::addMidiData(MidiData* ptr) {
midiDatas_.push_back(ptr);
}
QList<MidiData*> MeasureData::getMidiDatas(MidiType type) {
int i;
QList<MidiData*> datas;
for (i = 0; i < midiDatas_.size(); ++i) {
if (type == MidiType::None || midiDatas_[i]->getMidiType() == type) {
datas.push_back(midiDatas_[i]);
}
}
return datas;
}
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
StreamHandle::StreamHandle() :
size_(0), curPos_(0), point_(NULL) {
}
StreamHandle::StreamHandle(unsigned char* p, int size) :
size_(size), curPos_(0), point_(p) {
}
StreamHandle::~StreamHandle() {
point_ = NULL;
}
bool StreamHandle::read(char* buff, int size) {
if (point_ != NULL && curPos_ + size <= size_) {
memcpy(buff, point_ + curPos_, size);
curPos_ += size;
return true;
}
return false;
}
bool StreamHandle::write(char* /*buff*/, int /*size*/) {
return true;
}
// Block.cpp
///////////////////////////////////////////////////////////////////////////////////////////////////
Block::Block() {
doResize(0);
}
Block::Block(unsigned int count) {
doResize(count);
}
void Block::resize(unsigned int count) {
doResize(count);
}
void Block::doResize(unsigned int count) {
data_.clear();
for(unsigned int i=0; i<count; ++i) {
data_.push_back('\0');
}
//data_.resize(count);
}
const unsigned char* Block::data() const {
//return const_cast<unsigned char*>(&data_.front());
return &data_.front();
}
unsigned char* Block::data() {
return &data_.front();
}
int Block::size() const {
return data_.size();
}
bool Block::toBoolean() const {
if (data() == NULL) {
return false;
}
return size() == 1 && data()[0] == 0x01;
}
unsigned int Block::toUnsignedInt() const {
if (data() == NULL) {
return 0;
}
int num = 0;
for (int i = 0; i < (int)sizeof(int) && i < size(); ++i) {
num = (num << 8) + *(data() + i);
}
return num;
}
int Block::toInt() const {
if (data() == NULL) {
return 0;
}
int i;
int num = 0;
for (i = 0; i < (int)sizeof(int) && i < size(); ++i) {
num = (num << 8) + (int) *(data() + i);
}
std::size_t minSize = sizeof(int);
if (size() < (int)minSize) {
minSize = size();
}
if ((*(data()) & 0x80) == 0x80) {
int maxNum = int(pow(2.0, (int) minSize * 8));
num -= maxNum;
//num *= -1;
}
return num;
}
QByteArray Block::toStrByteArray() const {
if (data() == NULL) {
return QByteArray();
}
QByteArray arr((char*) data(), size());
return arr;
}
QByteArray Block::fixedSizeBufferToStrByteArray() const {
QByteArray str;
for (int i = 0; i < size(); ++i) {
if (*(data() + i) == '\0') {
break;
}
str += (char) *(data() + i);
}
return str;
}
bool Block::operator ==(const Block& block) const {
if (size() != block.size()) {
return false;
}
for (int i = 0; i < size() && i < block.size(); ++i) {
if (*(data() + i) != *(block.data() + i)) {
return false;
}
}
return true;
}
bool Block::operator !=(const Block& block) const {
return !(*this == block);
}
///////////////////////////////////////////////////////////////////////////////////////////////////
FixedBlock::FixedBlock() :
Block() {
}
FixedBlock::FixedBlock(unsigned int count) :
Block(count) {
}
void FixedBlock::resize(unsigned int /*count*/) {
// Block::resize(size);
}
///////////////////////////////////////////////////////////////////////////////////////////////////
SizeBlock::SizeBlock() :
FixedBlock(4) {
}
unsigned int SizeBlock::toSize() const {
unsigned int i;
unsigned int num(0);
const unsigned int SIZE = 4;
for (i = 0; i < SIZE; ++i) {
num = (num << 8) + *(data() + i);
}
return num;
}
/*void SizeBlock::fromUnsignedInt(unsigned int count)
{
unsigned_int_to_char_buffer(count, data());
}*/
///////////////////////////////////////////////////////////////////////////////////////////////////
NameBlock::NameBlock() :
FixedBlock(4) {
}
/*void NameBlock::setValue(const char* const name)
{
unsigned int i;
for( i=0; i<size() && *(name+i)!='\0'; ++i )
{
*(data()+i) = *(name+i);
}
}*/
bool NameBlock::isEqual(const QString& name) const {
int nsize = name.size();
if (nsize != size()) {
return false;
}
for (int i = 0; i < size() && nsize; ++i) {
if (data()[i] != name[i]) {
return false;
}
}
return true;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
CountBlock::CountBlock() :
FixedBlock(2) {
}
/*void CountBlock::setValue(unsigned short count)
{
unsigned int i;
unsigned int SIZE = sizeof(unsigned short);
for( i=0; i<SIZE; ++i )
{
data()[SIZE-1-i] = count % 256;
count /= 256;
}
}*/
unsigned short CountBlock::toCount() const {
unsigned short num = 0;
for (int i = 0; i < size() && i < (int)sizeof(unsigned short); ++i) {
num = (num << 8) + *(data() + i);
}
return num;
}
// Chunk.cpp
const QString Chunk::TrackName = "TRAK";
const QString Chunk::PageName = "PAGE";
const QString Chunk::LineName = "LINE";
const QString Chunk::StaffName = "STAF";
const QString Chunk::MeasureName = "MEAS";
const QString Chunk::ConductName = "COND";
const QString Chunk::BdatName = "BDAT";
Chunk::Chunk() {
}
NameBlock Chunk::getName() const {
return nameBlock_;
}
////////////////////////////////////////////////////////////////////////////////
const unsigned int SizeChunk::version3TrackSize = 0x13a;
SizeChunk::SizeChunk() :
Chunk() {
sizeBlock_ = new SizeBlock();
dataBlock_ = new Block();
}
SizeChunk::~SizeChunk() {
delete sizeBlock_;
delete dataBlock_;
}
SizeBlock* SizeChunk::getSizeBlock() const {
return sizeBlock_;
}
Block* SizeChunk::getDataBlock() const {
return dataBlock_;
}
/////////////////////////////////////////////////////////////////////////////////
GroupChunk::GroupChunk() : Chunk() {
childCount_ = new CountBlock();
}
GroupChunk::~GroupChunk() {
delete childCount_;
}
CountBlock* GroupChunk::getCountBlock() const {
return childCount_;
}
// ChunkParse.cpp
unsigned int getHighNibble(unsigned int byte) {
return byte / 16;
}
unsigned int getLowNibble(unsigned int byte) {
return byte % 16;
}
int oveKeyToKey(int oveKey) {
int key = 0;
if( oveKey == 0 ) {
key = 0;
}
else if( oveKey > 7 ) {
key = oveKey - 7;
}
else if( oveKey <= 7 ) {
key = oveKey * (-1);
}
return key;
}
///////////////////////////////////////////////////////////////////////////////
BasicParse::BasicParse(OveSong* ove) :
ove_(ove), handle_(NULL), notify_(NULL) {
}
BasicParse::BasicParse() :
ove_(NULL), handle_(NULL), notify_(NULL) {
}
BasicParse::~BasicParse() {
ove_ = NULL;
handle_ = NULL;
notify_ = NULL;
}
void BasicParse::setNotify(IOveNotify* notify) {
notify_ = notify;
}
bool BasicParse::parse() {
return false;
}
bool BasicParse::readBuffer(Block& placeHolder, int size) {
if (handle_ == NULL) {
return false;
}
if (placeHolder.size() != size) {
placeHolder.resize(size);
}
if (size > 0) {
return handle_->read((char*) placeHolder.data(), placeHolder.size());
}
return true;
}
bool BasicParse::jump(int offset) {
if (handle_ == NULL || offset < 0) {
return false;
}
if (offset > 0) {
Block placeHolder(offset);
return handle_->read((char*) placeHolder.data(), placeHolder.size());
}
return true;
}
void BasicParse::messageOut(const QString& str) {
if (notify_ != NULL) {
notify_->loadInfo(str);
}
}
///////////////////////////////////////////////////////////////////////////////
OvscParse::OvscParse(OveSong* ove) :
BasicParse(ove), chunk_(NULL) {
}
OvscParse::~OvscParse() {
chunk_ = NULL;
}
void OvscParse::setOvsc(SizeChunk* chunk) {
chunk_ = chunk;
}
bool OvscParse::parse() {
Block* dataBlock = chunk_->getDataBlock();
unsigned int blockSize = chunk_->getSizeBlock()->toSize();
StreamHandle handle(dataBlock->data(), blockSize);
Block placeHolder;
handle_ = &handle;
// version
if (!readBuffer(placeHolder, 1)) { return false; }
bool version4 = placeHolder.toUnsignedInt() == 4;
ove_->setIsVersion4(version4);
QString str = QString("This file is created by Overture ") + (version4 ? "4" : "3") + "\n";
messageOut(str);
if( !jump(6) ) { return false; }
// show page margin
if (!readBuffer(placeHolder, 1)) { return false; }
ove_->setShowPageMargin(placeHolder.toBoolean());
if( !jump(1) ) { return false; }
// transpose track
if (!readBuffer(placeHolder, 1)) { return false; }
ove_->setShowTransposeTrack(placeHolder.toBoolean());
// play repeat
if (!readBuffer(placeHolder, 1)) { return false; }
ove_->setPlayRepeat(placeHolder.toBoolean());
// play style
if (!readBuffer(placeHolder, 1)) { return false; }
OveSong::PlayStyle style = OveSong::PlayStyle::Record;
if(placeHolder.toUnsignedInt() == 1){
style = OveSong::PlayStyle::Swing;
}
else if(placeHolder.toUnsignedInt() == 2){
style = OveSong::PlayStyle::Notation;
}
ove_->setPlayStyle(style);
// show line break
if (!readBuffer(placeHolder, 1)) { return false; }
ove_->setShowLineBreak(placeHolder.toBoolean());
// show ruler
if (!readBuffer(placeHolder, 1)) { return false; }
ove_->setShowRuler(placeHolder.toBoolean());
// show color
if (!readBuffer(placeHolder, 1)) { return false; }
ove_->setShowColor(placeHolder.toBoolean());
return true;
}
///////////////////////////////////////////////////////////////////////////////
TrackParse::TrackParse(OveSong* ove)
:BasicParse(ove) {
}
TrackParse::~TrackParse() {
}
void TrackParse::setTrack(SizeChunk* chunk) {
chunk_ = chunk;
}
bool TrackParse::parse() {
Block* dataBlock = chunk_->getDataBlock();
unsigned int blockSize = ove_->getIsVersion4() ? chunk_->getSizeBlock()->toSize() : SizeChunk::version3TrackSize;
StreamHandle handle(dataBlock->data(), blockSize);
Block placeHolder;
handle_ = &handle;
Track* oveTrack = new Track();
ove_->addTrack(oveTrack);
// 2 32bytes long track name buffer
if( !readBuffer(placeHolder, 32) ) { return false; }
oveTrack->setName(ove_->getCodecString(placeHolder.fixedSizeBufferToStrByteArray()));
if( !readBuffer(placeHolder, 32) ) { return false; }
oveTrack->setBriefName(ove_->getCodecString(placeHolder.fixedSizeBufferToStrByteArray()));
if( !jump(8) ) { return false; } //0x fffa0012 fffa0012
if( !jump(1) ) { return false; }
// patch
if( !readBuffer(placeHolder, 1) ) { return false; }
unsigned int thisByte = placeHolder.toInt();
oveTrack->setPatch(thisByte&0x7f);
// show name
if( !readBuffer(placeHolder, 1) ) { return false; }
oveTrack->setShowName(placeHolder.toBoolean());
// show brief name
if( !readBuffer(placeHolder, 1) ) { return false; }
oveTrack->setShowBriefName(placeHolder.toBoolean());
if( !jump(1) ) { return false; }
// show transpose
if( !readBuffer(placeHolder, 1) ) { return false; }
oveTrack->setShowTranspose(placeHolder.toBoolean());
if( !jump(1) ) { return false; }
// mute
if( !readBuffer(placeHolder, 1) ) { return false; }
oveTrack->setMute(placeHolder.toBoolean());
// solo
if( !readBuffer(placeHolder, 1) ) { return false; }
oveTrack->setSolo(placeHolder.toBoolean());
if( !jump(1) ) { return false; }
// show key each line
if( !readBuffer(placeHolder, 1) ) { return false; }
oveTrack->setShowKeyEachLine(placeHolder.toBoolean());
// voice count
if( !readBuffer(placeHolder, 1) ) { return false; }
oveTrack->setVoiceCount(placeHolder.toUnsignedInt());
if( !jump(3) ) { return false; }
// transpose value [-127, 127]
if( !readBuffer(placeHolder, 1) ) { return false; }
oveTrack->setTranspose(placeHolder.toInt());
if( !jump(2) ) { return false; }
// start clef
if( !readBuffer(placeHolder, 1) ) { return false; }
oveTrack->setStartClef(placeHolder.toUnsignedInt());
// transpose celf
if( !readBuffer(placeHolder, 1) ) { return false; }
oveTrack->setTransposeClef(placeHolder.toUnsignedInt());
// start key
if( !readBuffer(placeHolder, 1) ) { return false; }
oveTrack->setStartKey(placeHolder.toUnsignedInt());
// display percent
if( !readBuffer(placeHolder, 1) ) { return false; }
oveTrack->setDisplayPercent(placeHolder.toUnsignedInt());
// show leger line
if( !readBuffer(placeHolder, 1) ) { return false; }
oveTrack->setShowLegerLine(placeHolder.toBoolean());
// show clef
if( !readBuffer(placeHolder, 1) ) { return false; }
oveTrack->setShowClef(placeHolder.toBoolean());
// show time signature
if( !readBuffer(placeHolder, 1) ) { return false; }
oveTrack->setShowTimeSignature(placeHolder.toBoolean());
// show key signature
if( !readBuffer(placeHolder, 1) ) { return false; }
oveTrack->setShowKeySignature(placeHolder.toBoolean());
// show barline
if( !readBuffer(placeHolder, 1) ) { return false; }
oveTrack->setShowBarline(placeHolder.toBoolean());
// fill with rest
if( !readBuffer(placeHolder, 1) ) { return false; }
oveTrack->setFillWithRest(placeHolder.toBoolean());
// flat tail
if( !readBuffer(placeHolder, 1) ) { return false; }
oveTrack->setFlatTail(placeHolder.toBoolean());
// show clef each line
if( !readBuffer(placeHolder, 1) ) { return false; }
oveTrack->setShowClefEachLine(placeHolder.toBoolean());
if( !jump(12) ) { return false; }
// 8 voices
int i;
QList<Voice*> voices;
for( i=0; i<8; ++i ) {
Voice* voicePtr = new Voice();
if( !jump(5) ) { return false; }
// channel
if( !readBuffer(placeHolder, 1) ) { return false; }
voicePtr->setChannel(placeHolder.toUnsignedInt());
// volume
if( !readBuffer(placeHolder, 1) ) { return false; }
voicePtr->setVolume(placeHolder.toInt());
// pitch shift
if( !readBuffer(placeHolder, 1) ) { return false; }
voicePtr->setPitchShift(placeHolder.toInt());
// pan
if( !readBuffer(placeHolder, 1) ) { return false; }
voicePtr->setPan(placeHolder.toInt());
if( !jump(6) ) { return false; }
// patch
if( !readBuffer(placeHolder, 1) ) { return false; }
voicePtr->setPatch(placeHolder.toInt());
voices.push_back(voicePtr);
}
// stem type
for( i=0; i<8; ++i ) {
if( !readBuffer(placeHolder, 1) ) { return false; }
voices[i]->setStemType(placeHolder.toUnsignedInt());
oveTrack->addVoice(voices[i]);
}
// percussion define
QList<Track::DrumNode> nodes;
for(i=0; i<16; ++i) {
nodes.push_back(Track::DrumNode());
}
// line
for( i=0; i<16; ++i ) {
if( !readBuffer(placeHolder, 1) ) { return false; }
nodes[i].line_ = placeHolder.toInt();
}
// head type
for( i=0; i<16; ++i ) {
if( !readBuffer(placeHolder, 1) ) { return false; }
nodes[i].headType_ = placeHolder.toUnsignedInt();
}
// pitch
for( i=0; i<16; ++i ) {
if( !readBuffer(placeHolder, 1) ) { return false; }
nodes[i].pitch_ = placeHolder.toUnsignedInt();
}
// voice
for( i=0; i<16; ++i ) {
if( !readBuffer(placeHolder, 1) ) { return false; }
nodes[i].voice_ = placeHolder.toUnsignedInt();
}
for( i=0; i<nodes.size(); ++i ) {
oveTrack->addDrum(nodes[i]);
}
/* if( !Jump(17) ) { return false; }
// voice 0 channel
if( !ReadBuffer(placeHolder, 1) ) { return false; }
oveTrack->setChannel(placeHolder.toUnsignedInt());
// to be continued. if anything important...*/
return true;
}
///////////////////////////////////////////////////////////////////////////////
GroupParse::GroupParse(OveSong* ove)
:BasicParse(ove) {
}
GroupParse::~GroupParse(){
sizeChunks_.clear();
}
void GroupParse::addSizeChunk(SizeChunk* sizeChunk) {
sizeChunks_.push_back(sizeChunk);
}
bool GroupParse::parse() {
return false;
}
///////////////////////////////////////////////////////////////////////////////
PageGroupParse::PageGroupParse(OveSong* ove)
:BasicParse(ove) {
}
PageGroupParse::~PageGroupParse(){
pageChunks_.clear();
}
void PageGroupParse::addPage(SizeChunk* chunk) {
pageChunks_.push_back(chunk);
}
bool PageGroupParse::parse() {
if( pageChunks_.isEmpty() ) {
return false;
}
int i;
for( i=0; i<pageChunks_.size(); ++i ) {
Page* page = new Page();
ove_->addPage(page);
if( !parsePage(pageChunks_[i], page) ) { return false; }
}
return true;
}
bool PageGroupParse::parsePage(SizeChunk* chunk, Page* page) {
Block placeHolder(2);
StreamHandle handle(chunk->getDataBlock()->data(), chunk->getSizeBlock()->toSize());
handle_ = &handle;
// begin line
if( !readBuffer(placeHolder, 2) ) { return false; }
page->setBeginLine(placeHolder.toUnsignedInt());
// line count
if( !readBuffer(placeHolder, 2) ) { return false; }
page->setLineCount(placeHolder.toUnsignedInt());
if( !jump(4) ) { return false; }
// staff interval
if( !readBuffer(placeHolder, 2) ) { return false; }
page->setStaffInterval(placeHolder.toUnsignedInt());
// line interval
if( !readBuffer(placeHolder, 2) ) { return false; }
page->setLineInterval(placeHolder.toUnsignedInt());
// staff inline interval
if( !readBuffer(placeHolder, 2) ) { return false; }
page->setStaffInlineInterval(placeHolder.toUnsignedInt());
// line bar count
if( !readBuffer(placeHolder, 2) ) { return false; }
page->setLineBarCount(placeHolder.toUnsignedInt());
// page line count
if( !readBuffer(placeHolder, 2) ) { return false; }
page->setPageLineCount(placeHolder.toUnsignedInt());
// left margin
if( !readBuffer(placeHolder, 4) ) { return false; }
page->setLeftMargin(placeHolder.toUnsignedInt());
// top margin
if( !readBuffer(placeHolder, 4) ) { return false; }
page->setTopMargin(placeHolder.toUnsignedInt());
// right margin
if( !readBuffer(placeHolder, 4) ) { return false; }
page->setRightMargin(placeHolder.toUnsignedInt());
// bottom margin
if( !readBuffer(placeHolder, 4) ) { return false; }
page->setBottomMargin(placeHolder.toUnsignedInt());
// page width
if( !readBuffer(placeHolder, 4) ) { return false; }
page->setPageWidth(placeHolder.toUnsignedInt());
// page height
if( !readBuffer(placeHolder, 4) ) { return false; }
page->setPageHeight(placeHolder.toUnsignedInt());
handle_ = NULL;
return true;
}
///////////////////////////////////////////////////////////////////////////////
StaffCountGetter::StaffCountGetter(OveSong* ove)
:BasicParse(ove) {
}
unsigned int StaffCountGetter::getStaffCount(SizeChunk* chunk) {
StreamHandle handle(chunk->getDataBlock()->data(), chunk->getSizeBlock()->toSize());
Block placeHolder;
handle_ = &handle;
if( !jump(6) ) { return false; }
// staff count
if( !readBuffer(placeHolder, 2) ) { return false; }
return placeHolder.toUnsignedInt();
}
///////////////////////////////////////////////////////////////////////////////
LineGroupParse::LineGroupParse(OveSong* ove) :
BasicParse(ove), chunk_(NULL) {
}
LineGroupParse::~LineGroupParse(){
chunk_ = NULL;
lineChunks_.clear();
staffChunks_.clear();
}
void LineGroupParse::setLineGroup(GroupChunk* chunk) {
chunk_ = chunk;
}
void LineGroupParse::addLine(SizeChunk* chunk) {
lineChunks_.push_back(chunk);
}
void LineGroupParse::addStaff(SizeChunk* chunk) {
staffChunks_.push_back(chunk);
}
bool LineGroupParse::parse() {
if( lineChunks_.isEmpty() || staffChunks_.size() % lineChunks_.size() != 0 ) { return false; }
int i;
unsigned int j;
unsigned int lineStaffCount = staffChunks_.size() / lineChunks_.size();
for( i=0; i<lineChunks_.size(); ++i ) {
Line* linePtr = new Line();
ove_->addLine(linePtr);
if( !parseLine(lineChunks_[i], linePtr) ) { return false; }
for( j=lineStaffCount*i; j<lineStaffCount*(i+1); ++j ) {
Staff* staffPtr = new Staff();
linePtr->addStaff(staffPtr);
if( !parseStaff(staffChunks_[j], staffPtr) ) { return false; }
}
}
return true;
}
bool LineGroupParse::parseLine(SizeChunk* chunk, Line* line) {
Block placeHolder;
StreamHandle handle(chunk->getDataBlock()->data(), chunk->getSizeBlock()->toSize());
handle_ = &handle;
if( !jump(2) ) { return false; }
// begin bar
if( !readBuffer(placeHolder, 2) ) { return false; }
line->setBeginBar(placeHolder.toUnsignedInt());
// bar count
if( !readBuffer(placeHolder, 2) ) { return false; }
line->setBarCount(placeHolder.toUnsignedInt());
if( !jump(6) ) { return false; }
// y offset
if( !readBuffer(placeHolder, 2) ) { return false; }
line->setYOffset(placeHolder.toInt());
// left x offset
if( !readBuffer(placeHolder, 2) ) { return false; }
line->setLeftXOffset(placeHolder.toInt());
// right x offset
if( !readBuffer(placeHolder, 2) ) { return false; }
line->setRightXOffset(placeHolder.toInt());
if( !jump(4) ) { return false; }
handle_ = NULL;
return true;
}
bool LineGroupParse::parseStaff(SizeChunk* chunk, Staff* staff) {
Block placeHolder;
StreamHandle handle(chunk->getDataBlock()->data(), chunk->getSizeBlock()->toSize());
handle_ = &handle;
if( !jump(7) ) { return false; }
// clef
if( !readBuffer(placeHolder, 1) ) { return false; }
staff->setClefType(placeHolder.toUnsignedInt());
// key
if( !readBuffer(placeHolder, 1) ) { return false; }
staff->setKeyType(oveKeyToKey(placeHolder.toUnsignedInt()));
if( !jump(2) ) { return false; }
// visible
if( !readBuffer(placeHolder, 1) ) { return false; }
staff->setVisible(placeHolder.toBoolean());
if( !jump(12) ) { return false; }
// y offset
if( !readBuffer(placeHolder, 2) ) { return false; }
staff->setYOffset(placeHolder.toInt());
int jumpAmount = ove_->getIsVersion4() ? 26 : 18;
if( !jump(jumpAmount) ) { return false; }
// group type
if( !readBuffer(placeHolder, 1) ) { return false; }
GroupType groupType = GroupType::None;
if(placeHolder.toUnsignedInt() == 1) {
groupType = GroupType::Brace;
} else if(placeHolder.toUnsignedInt() == 2) {
groupType = GroupType::Bracket;
}
staff->setGroupType(groupType);
// group staff count
if( !readBuffer(placeHolder, 1) ) { return false; }
staff->setGroupStaffCount(placeHolder.toUnsignedInt());
handle_ = NULL;
return true;
}
///////////////////////////////////////////////////////////////////////////////
BarsParse::BarsParse(OveSong* ove) :
BasicParse(ove) {
}
BarsParse::~BarsParse(){
measureChunks_.clear();
conductChunks_.clear();
bdatChunks_.clear();
}
void BarsParse::addMeasure(SizeChunk* chunk) {
measureChunks_.push_back(chunk);
}
void BarsParse::addConduct(SizeChunk* chunk) {
conductChunks_.push_back(chunk);
}
void BarsParse::addBdat(SizeChunk* chunk) {
bdatChunks_.push_back(chunk);
}
bool BarsParse::parse() {
int i;
int trackMeasureCount = ove_->getTrackBarCount();
int trackCount = ove_->getTrackCount();
int measureDataCount = trackCount * measureChunks_.size();
QList<Measure*> measures;
QList<MeasureData*> measureDatas;
if( measureChunks_.isEmpty() ||
measureChunks_.size() != conductChunks_.size() ||
(int)bdatChunks_.size() != measureDataCount ) {
return false;
}
// add to ove
for ( i=0; i<(int)measureChunks_.size(); ++i ) {
Measure* measure = new Measure(i);
measures.push_back(measure);
ove_->addMeasure(measure);
}
for ( i=0; i<measureDataCount; ++i ) {
MeasureData* oveMeasureData = new MeasureData();
measureDatas.push_back(oveMeasureData);
ove_->addMeasureData(oveMeasureData);
}
for( i=0; i<(int)measureChunks_.size(); ++i ) {
Measure* measure = measures[i];
// MEAS
if( !parseMeas(measure, measureChunks_[i]) ) {
QString ss = QString("failed in parse MEAS %1\n").arg(i);
messageOut(ss);
return false;
}
}
for( i=0; i<(int)conductChunks_.size(); ++i ) {
// COND
if( !parseCond(measures[i], measureDatas[i], conductChunks_[i]) ) {
QString ss = QString("failed in parse COND %1\n").arg(i);
messageOut(ss);
return false;
}
}
for( i=0; i<(int)bdatChunks_.size(); ++i ) {
int measId = i % trackMeasureCount;
// BDAT
if( !parseBdat(measures[measId], measureDatas[i], bdatChunks_[i]) ) {
QString ss = QString("failed in parse BDAT %1\n").arg(i);
messageOut(ss);
return false;
}
if( notify_ != NULL ) {
int measureID = i % trackMeasureCount;
int trackID = i / trackMeasureCount;
//msg.msg_ = OVE_IMPORT_POS;
//msg.param1_ = (measureID<<16) + trackMeasureCount;
//msg.param2_ = (trackID<<16) + trackCount;
notify_->loadPosition(measureID, trackMeasureCount, trackID, trackCount);
}
}
return true;
}
bool BarsParse::parseMeas(Measure* measure, SizeChunk* chunk) {
Block placeHolder;
StreamHandle measureHandle(chunk->getDataBlock()->data(), chunk->getSizeBlock()->toSize());
handle_ = &measureHandle;
if( !jump(2) ) { return false; }
// multi-measure rest
if( !readBuffer(placeHolder, 1) ) { return false; }
measure->setIsMultiMeasureRest(placeHolder.toBoolean());
// pickup
if( !readBuffer(placeHolder, 1) ) { return false; }
measure->setIsPickup(placeHolder.toBoolean());
if( !jump(4) ) { return false; }
// left barline
if( !readBuffer(placeHolder, 1) ) { return false; }
measure->setLeftBarline(placeHolder.toUnsignedInt());
// right barline
if( !readBuffer(placeHolder, 1) ) { return false; }
measure->setRightBarline(placeHolder.toUnsignedInt());
// tempo
if( !readBuffer(placeHolder, 2) ) { return false; }
double tempo = ((double)placeHolder.toUnsignedInt());
if( ove_->getIsVersion4() ) {
tempo /= 100.0;
}
measure->setTypeTempo(tempo);
// bar length(tick)
if( !readBuffer(placeHolder, 2) ) { return false; }
measure->setLength(placeHolder.toUnsignedInt());
if( !jump(6) ) { return false; }
// bar number offset
if( !parseOffsetElement(measure->getBarNumber()) ) { return false; }
if( !jump(2) ) { return false; }
// multi-measure rest count
if( !readBuffer(placeHolder, 2) ) { return false; }
measure->setMultiMeasureRestCount(placeHolder.toUnsignedInt());
handle_ = NULL;
return true;
}
bool BarsParse::parseCond(Measure* measure, MeasureData* measureData, SizeChunk* chunk) {
Block placeHolder;
StreamHandle handle(chunk->getDataBlock()->data(), chunk->getSizeBlock()->toSize());
handle_ = &handle;
// item count
if( !readBuffer(placeHolder, 2) ) { return false; }
unsigned int cnt = placeHolder.toUnsignedInt();
if( !parseTimeSignature(measure, 36) ) { return false; }
for( unsigned int i=0; i<cnt; ++i ) {
if( !readBuffer(placeHolder, 2) ) { return false; }
unsigned int twoByte = placeHolder.toUnsignedInt();
unsigned int oldBlockSize = twoByte - 11;
unsigned int newBlockSize = twoByte - 7;
// type id
if( !readBuffer(placeHolder, 1) ) { return false; }
unsigned int thisByte = placeHolder.toUnsignedInt();
CondType type;
if( !getCondElementType(thisByte, type) ) { return false; }
switch (type) {
case CondType::Bar_Number: {
if (!parseBarNumber(measure, twoByte - 1)) {
return false;
}
break;
}
case CondType::Repeat: {
if (!parseRepeatSymbol(measureData, oldBlockSize)) {
return false;
}
break;
}
case CondType::Numeric_Ending: {
if (!parseNumericEndings(measureData, oldBlockSize)) {
return false;
}
break;
}
case CondType::Decorator: {
if (!parseDecorators(measureData, newBlockSize)) {
return false;
}
break;
}
case CondType::Tempo: {
if (!parseTempo(measureData, newBlockSize)) {
return false;
}
break;
}
case CondType::Text: {
if (!parseText(measureData, newBlockSize)) {
return false;
}
break;
}
case CondType::Expression: {
if (!parseExpressions(measureData, newBlockSize)) {
return false;
}
break;
}
case CondType::Time_Parameters: {
if (!parseTimeSignatureParameters(measure, newBlockSize)) {
return false;
}
break;
}
case CondType::Barline_Parameters: {
if (!parseBarlineParameters(measure, newBlockSize)) {
return false;
}
break;
}
default: {
if (!jump(newBlockSize)) {
return false;
}
break;
}
}
}
handle_ = NULL;
return true;
}
bool BarsParse::parseTimeSignature(Measure* measure, int /*length*/) {
Block placeHolder;
TimeSignature* timeSignature = measure->getTime();
// numerator
if( !readBuffer(placeHolder, 1) ) { return false; }
timeSignature->setNumerator(placeHolder.toUnsignedInt());
// denominator
if( !readBuffer(placeHolder, 1) ) { return false; }
timeSignature->setDenominator(placeHolder.toUnsignedInt());
if( !jump(2) ) { return false; }
// beat length
if( !readBuffer(placeHolder, 2) ) { return false; }
timeSignature->setBeatLength(placeHolder.toUnsignedInt());
// bar length
if( !readBuffer(placeHolder, 2) ) { return false; }
timeSignature->setBarLength(placeHolder.toUnsignedInt());
if( !jump(4) ) { return false; }
// is symbol
if( !readBuffer(placeHolder, 1) ) { return false; }
timeSignature->setIsSymbol(placeHolder.toBoolean());
if( !jump(1) ) { return false; }
// replace font
if( !readBuffer(placeHolder, 1) ) { return false; }
timeSignature->setReplaceFont(placeHolder.toBoolean());
// color
if( !readBuffer(placeHolder, 1) ) { return false; }
timeSignature->setColor(placeHolder.toUnsignedInt());
// show
if( !readBuffer(placeHolder, 1) ) { return false; }
timeSignature->setShow(placeHolder.toBoolean());
// show beat group
if( !readBuffer(placeHolder, 1) ) { return false; }
timeSignature->setShowBeatGroup(placeHolder.toBoolean());
if( !jump(6) ) { return false; }
// numerator 1, 2, 3
if( !readBuffer(placeHolder, 1) ) { return false; }
timeSignature->setGroupNumerator1(placeHolder.toUnsignedInt());
if( !readBuffer(placeHolder, 1) ) { return false; }
timeSignature->setGroupNumerator2(placeHolder.toUnsignedInt());
if( !readBuffer(placeHolder, 1) ) { return false; }
timeSignature->setGroupNumerator3(placeHolder.toUnsignedInt());
// denominator
if( !readBuffer(placeHolder, 1) ) { return false; }
timeSignature->setGroupDenominator1(placeHolder.toUnsignedInt());
if( !readBuffer(placeHolder, 1) ) { return false; }
timeSignature->setGroupDenominator2(placeHolder.toUnsignedInt());
if( !readBuffer(placeHolder, 1) ) { return false; }
timeSignature->setGroupDenominator3(placeHolder.toUnsignedInt());
// beam group 1~4
if( !readBuffer(placeHolder, 1) ) { return false; }
timeSignature->setBeamGroup1(placeHolder.toUnsignedInt());
if( !readBuffer(placeHolder, 1) ) { return false; }
timeSignature->setBeamGroup2(placeHolder.toUnsignedInt());
if( !readBuffer(placeHolder, 1) ) { return false; }
timeSignature->setBeamGroup3(placeHolder.toUnsignedInt());
if( !readBuffer(placeHolder, 1) ) { return false; }
timeSignature->setBeamGroup4(placeHolder.toUnsignedInt());
// beam 16th
if( !readBuffer(placeHolder, 1) ) { return false; }
timeSignature->set16thBeamCount(placeHolder.toUnsignedInt());
// beam 32th
if( !readBuffer(placeHolder, 1) ) { return false; }
timeSignature->set32thBeamCount(placeHolder.toUnsignedInt());
return true;
}
bool BarsParse::parseTimeSignatureParameters(Measure* measure, int length) {
Block placeHolder;
TimeSignature* ts = measure->getTime();
int cursor = ove_->getIsVersion4() ? 10 : 8;
if( !jump(cursor) ) { return false; }
// numerator
if( !readBuffer(placeHolder, 1) ) { return false; }
unsigned int numerator = placeHolder.toUnsignedInt();
cursor = ove_->getIsVersion4() ? 11 : 9;
if( ( length - cursor ) % 8 != 0 || (length - cursor) / 8 != (int)numerator ) {
return false;
}
for( unsigned int i =0; i<numerator; ++i ) {
// beat start unit
if( !readBuffer(placeHolder, 2) ) { return false; }
int beatStart = placeHolder.toUnsignedInt();
// beat length unit
if( !readBuffer(placeHolder, 2) ) { return false; }
int beatLength = placeHolder.toUnsignedInt();
if( !jump(2) ) { return false; }
// beat start tick
if( !readBuffer(placeHolder, 2) ) { return false; }
int beatStartTick = placeHolder.toUnsignedInt();
ts->addBeat(beatStart, beatLength, beatStartTick);
}
ts->endAddBeat();
return true;
}
bool BarsParse::parseBarlineParameters(Measure* measure, int /*length*/) {
Block placeHolder;
int cursor = ove_->getIsVersion4() ? 12 : 10;
if( !jump(cursor) ) { return false; }
// repeat count
if( !readBuffer(placeHolder, 1) ) { return false; }
int repeatCount = placeHolder.toUnsignedInt();
measure->setBackwardRepeatCount(repeatCount);
if( !jump(6) ) { return false; }
return true;
}
bool BarsParse::parseNumericEndings(MeasureData* measureData, int /*length*/) {
Block placeHolder;
NumericEnding* numeric = new NumericEnding();
measureData->addCrossMeasureElement(numeric, true);
if( !jump(3) ) { return false; }
// common
if( !parseCommonBlock(numeric) ) { return false; }
if( !jump(6) ) { return false; }
// measure count
if( !readBuffer(placeHolder, 2) ) { return false; }
//int offsetMeasure = placeHolder.toUnsignedInt() - 1;
int offsetMeasure = placeHolder.toUnsignedInt();
numeric->stop()->setMeasure(offsetMeasure);
if( !jump(2) ) { return false; }
// left x offset
if( !readBuffer(placeHolder, 2) ) { return false; }
numeric->getLeftShoulder()->setXOffset(placeHolder.toInt());
// height
if( !readBuffer(placeHolder, 2) ) { return false; }
numeric->setHeight(placeHolder.toUnsignedInt());
// left x offset
if( !readBuffer(placeHolder, 2) ) { return false; }
numeric->getRightShoulder()->setXOffset(placeHolder.toInt());
if( !jump(2) ) { return false; }
// y offset
if( !readBuffer(placeHolder, 2) ) { return false; }
numeric->getLeftShoulder()->setYOffset(placeHolder.toInt());
numeric->getRightShoulder()->setYOffset(placeHolder.toInt());
// number offset
if( !readBuffer(placeHolder, 2) ) { return false; }
numeric->getNumericHandle()->setXOffset(placeHolder.toInt());
if( !readBuffer(placeHolder, 2) ) { return false; }
numeric->getNumericHandle()->setYOffset(placeHolder.toInt());
if( !jump(6) ) { return false; }
// text size
if( !readBuffer(placeHolder, 1) ) { return false; }
unsigned int size = placeHolder.toUnsignedInt();
// text : size maybe a huge value
if( !readBuffer(placeHolder, size) ) { return false; }
numeric->setText(ove_->getCodecString(placeHolder.fixedSizeBufferToStrByteArray()));
// fix for wedding march.ove
if( size % 2 == 0 ) {
if( !jump(1) ) { return false; }
}
return true;
}
bool BarsParse::parseTempo(MeasureData* measureData, int /*length*/) {
Block placeHolder;
unsigned int thisByte;
Tempo* tempo = new Tempo();
measureData->addMusicData(tempo);
if( !jump(3) ) { return false; }
// common
if( !parseCommonBlock(tempo) ) { return false; }
if( !readBuffer(placeHolder, 1) ) { return false; }
thisByte = placeHolder.toUnsignedInt();
// show tempo
tempo->setShowMark( (getHighNibble(thisByte) & 0x4) == 0x4 );
// show before text
tempo->setShowBeforeText( (getHighNibble(thisByte) & 0x8 ) == 0x8 ) ;
// show parenthesis
tempo->setShowParenthesis( (getHighNibble(thisByte) & 0x1 ) == 0x1 );
// left note type
tempo->setLeftNoteType( getLowNibble(thisByte) );
if( !jump(1) ) { return false; }
if( ove_->getIsVersion4() ) {
if( !jump(2) ) { return false; }
// tempo
if( !readBuffer(placeHolder, 2) ) { return false; }
tempo->setTypeTempo(placeHolder.toUnsignedInt()/100);
} else {
// tempo
if( !readBuffer(placeHolder, 2) ) { return false; }
tempo->setTypeTempo(placeHolder.toUnsignedInt());
if( !jump(2) ) { return false; }
}
// offset
if( !parseOffsetElement(tempo) ) { return false; }
if( !jump(16) ) { return false; }
// 31 bytes left text
if( !readBuffer(placeHolder, 31) ) { return false; }
tempo->setLeftText(ove_->getCodecString(placeHolder.fixedSizeBufferToStrByteArray()));
if( !readBuffer(placeHolder, 1) ) { return false; }
thisByte = placeHolder.toUnsignedInt();
// swing eighth
tempo->setSwingEighth(getHighNibble(thisByte)!=8);
// right note type
tempo->setRightNoteType(getLowNibble(thisByte));
// right text
if( ove_->getIsVersion4() ) {
if( !readBuffer(placeHolder, 31) ) { return false; }
tempo->setRightText(ove_->getCodecString(placeHolder.fixedSizeBufferToStrByteArray()));
if( !jump(1) ) { return false; }
}
return true;
}
bool BarsParse::parseBarNumber(Measure* measure, int /*length*/) {
Block placeHolder;
BarNumber* barNumber = measure->getBarNumber();
if( !jump(2) ) { return false; }
// show on paragraph start
if( !readBuffer(placeHolder, 1) ) { return false; }
barNumber->setShowOnParagraphStart(getLowNibble(placeHolder.toUnsignedInt())==8);
unsigned int blankSize = ove_->getIsVersion4() ? 9 : 7;
if( !jump(blankSize) ) { return false; }
// text align
if( !readBuffer(placeHolder, 1) ) { return false; }
barNumber->setAlign(placeHolder.toUnsignedInt());
if( !jump(4) ) { return false; }
// show flag
if( !readBuffer(placeHolder, 1) ) { return false; }
barNumber->setShowFlag(placeHolder.toUnsignedInt());
if( !jump(10) ) { return false; }
// bar range
if( !readBuffer(placeHolder, 1) ) { return false; }
barNumber->setShowEveryBarCount(placeHolder.toUnsignedInt());
// prefix
if( !readBuffer(placeHolder, 2) ) { return false; }
barNumber->setPrefix(ove_->getCodecString(placeHolder.fixedSizeBufferToStrByteArray()));
if( !jump(18) ) { return false; }
return true;
}
bool BarsParse::parseText(MeasureData* measureData, int length) {
Block placeHolder;
Text* text = new Text();
measureData->addMusicData(text);
if( !jump(3) ) { return false; }
// common
if( !parseCommonBlock(text) ) { return false; }
// type
if( !readBuffer(placeHolder, 1) ) { return false; }
unsigned int thisByte = placeHolder.toUnsignedInt();
bool includeLineBreak = ( (getHighNibble(thisByte)&0x2) != 0x2 );
unsigned int id = getLowNibble(thisByte);
Text::Type textType = Text::Type::Rehearsal;
if (id == 0) {
textType = Text::Type::MeasureText;
} else if (id == 1) {
textType = Text::Type::SystemText;
} else // id ==2
{
textType = Text::Type::Rehearsal;
}
text->setTextType(textType);
if( !jump(1) ) { return false; }
// x offset
if( !readBuffer(placeHolder, 4) ) { return false; }
text->setXOffset(placeHolder.toInt());
// y offset
if( !readBuffer(placeHolder, 4) ) { return false; }
text->setYOffset(placeHolder.toInt());
// width
if( !readBuffer(placeHolder, 4) ) { return false; }
text->setWidth(placeHolder.toUnsignedInt());
// height
if( !readBuffer(placeHolder, 4) ) { return false; }
text->setHeight(placeHolder.toUnsignedInt());
if( !jump(7) ) { return false; }
// horizontal margin
if( !readBuffer(placeHolder, 1) ) { return false; }
text->setHorizontalMargin(placeHolder.toUnsignedInt());
if( !jump(1) ) { return false; }
// vertical margin
if( !readBuffer(placeHolder, 1) ) { return false; }
text->setVerticalMargin(placeHolder.toUnsignedInt());
if( !jump(1) ) { return false; }
// line thick
if( !readBuffer(placeHolder, 1) ) { return false; }
text->setLineThick(placeHolder.toUnsignedInt());
if( !jump(2) ) { return false; }
// text size
if( !readBuffer(placeHolder, 2) ) { return false; }
unsigned int size = placeHolder.toUnsignedInt();
// text string, maybe huge
if( !readBuffer(placeHolder, size) ) { return false; }
text->setText(ove_->getCodecString(placeHolder.fixedSizeBufferToStrByteArray()));
if( !includeLineBreak ) {
if( !jump(6) ) { return false; }
} else {
unsigned int cursor = ove_->getIsVersion4() ? 43 : 41;
cursor += size;
// multi lines of text
for( unsigned int i=0; i<2; ++i ) {
if( (int)cursor < length ) {
// line parameters count
if( !readBuffer(placeHolder, 2) ) { return false; }
unsigned int lineCount = placeHolder.toUnsignedInt();
if( i==0 && int(cursor + 2 + 8*lineCount) > length ) {
return false;
}
if( i==1 && int(cursor + 2 + 8*lineCount) != length ) {
return false;
}
if( !jump(8*lineCount) ) { return false; }
cursor += 2 + 8*lineCount;
}
}
}
return true;
}
bool BarsParse::parseRepeatSymbol(MeasureData* measureData, int /*length*/) {
Block placeHolder;
RepeatSymbol* repeat = new RepeatSymbol();
measureData->addMusicData(repeat);
if( !jump(3) ) { return false; }
// common
if( !parseCommonBlock(repeat) ) { return false; }
// RepeatType
if( !readBuffer(placeHolder, 1) ) { return false; }
repeat->setRepeatType(placeHolder.toUnsignedInt());
if( !jump(13) ) { return false; }
// offset
if( !parseOffsetElement(repeat) ) { return false; }
if( !jump(15) ) { return false; }
// size
if( !readBuffer(placeHolder, 2) ) { return false; }
unsigned int size = placeHolder.toUnsignedInt();
// text, maybe huge
if( !readBuffer(placeHolder, size) ) { return false; }
repeat->setText(ove_->getCodecString(placeHolder.fixedSizeBufferToStrByteArray()));
// last 0
if( size % 2 == 0 ) {
if( !jump(1) ) { return false; }
}
return true;
}
bool BarsParse::parseBdat(Measure* /*measure*/, MeasureData* measureData, SizeChunk* chunk) {
Block placeHolder;
StreamHandle handle(chunk->getDataBlock()->data(), chunk->getSizeBlock()->toSize());
handle_ = &handle;
// parse here
if( !readBuffer(placeHolder, 2) ) { return false; }
unsigned int cnt = placeHolder.toUnsignedInt();
for( unsigned int i=0; i<cnt; ++i ) {
// 0x0028 or 0x0016 or 0x002C
if( !readBuffer(placeHolder, 2) ) { return false; }
unsigned int count = placeHolder.toUnsignedInt() - 7;
// type id
if( !readBuffer(placeHolder, 1) ) { return false; }
unsigned int thisByte = placeHolder.toUnsignedInt();
BdatType type;
if( !getBdatElementType(thisByte, type) ) { return false; }
switch( type ) {
case BdatType::Raw_Note :
case BdatType::Rest :
case BdatType::Note : {
if( !parseNoteRest(measureData, count, type) ) { return false; }
break;
}
case BdatType::Beam : {
if( !parseBeam(measureData, count) ) { return false; }
break;
}
case BdatType::Harmony : {
if( !parseHarmony(measureData, count) ) { return false; }
break;
}
case BdatType::Clef : {
if( !parseClef(measureData, count) ) { return false; }
break;
}
case BdatType::Dynamics : {
if( !parseDynamics(measureData, count) ) { return false; }
break;
}
case BdatType::Wedge : {
if( !parseWedge(measureData, count) ) { return false; }
break;
}
case BdatType::Glissando : {
if( !parseGlissando(measureData, count) ) { return false; }
break;
}
case BdatType::Decorator : {
if( !parseDecorators(measureData, count) ) { return false; }
break;
}
case BdatType::Key : {
if( !parseKey(measureData, count) ) { return false; }
break;
}
case BdatType::Lyric : {
if( !parseLyric(measureData, count) ) { return false; }
break;
}
case BdatType::Octave_Shift: {
if( !parseOctaveShift(measureData, count) ) { return false; }
break;
}
case BdatType::Slur : {
if( !parseSlur(measureData, count) ) { return false; }
break;
}
case BdatType::Text : {
if( !parseText(measureData, count) ) { return false; }
break;
}
case BdatType::Tie : {
if( !parseTie(measureData, count) ) { return false; }
break;
}
case BdatType::Tuplet : {
if( !parseTuplet(measureData, count) ) { return false; }
break;
}
case BdatType::Guitar_Bend :
case BdatType::Guitar_Barre : {
if( !parseSizeBlock(count) ) { return false; }
break;
}
case BdatType::Pedal: {
if( !parsePedal(measureData, count) ) { return false; }
break;
}
case BdatType::KuoHao: {
if( !parseKuohao(measureData, count) ) { return false; }
break;
}
case BdatType::Expressions: {
if( !parseExpressions(measureData, count) ) { return false; }
break;
}
case BdatType::Harp_Pedal: {
if( !parseHarpPedal(measureData, count) ) { return false; }
break;
}
case BdatType::Multi_Measure_Rest: {
if( !parseMultiMeasureRest(measureData, count) ) { return false; }
break;
}
case BdatType::Harmony_GuitarFrame: {
if( !parseHarmonyGuitarFrame(measureData, count) ) { return false; }
break;
}
case BdatType::Graphics_40:
case BdatType::Graphics_RoundRect:
case BdatType::Graphics_Rect:
case BdatType::Graphics_Round:
case BdatType::Graphics_Line:
case BdatType::Graphics_Curve:
case BdatType::Graphics_WedgeSymbol: {
if( !parseSizeBlock(count) ) { return false; }
break;
}
case BdatType::Midi_Controller : {
if( !parseMidiController(measureData, count) ) { return false; }
break;
}
case BdatType::Midi_Program_Change : {
if( !parseMidiProgramChange(measureData, count) ) { return false; }
break;
}
case BdatType::Midi_Channel_Pressure : {
if( !parseMidiChannelPressure(measureData, count) ) { return false; }
break;
}
case BdatType::Midi_Pitch_Wheel : {
if( !parseMidiPitchWheel(measureData, count) ) { return false; }
break;
}
default: {
if( !jump(count) ) { return false; }
break;
}
}
// if i==count-1 then is bar end place holder
}
handle_ = NULL;
return true;
}
int getInt(int byte, int bits) {
int num = 0;
if( bits > 0 ) {
int factor = int(pow(2.0, bits-1));
num = (byte % (factor*2));
if ( (byte & factor) == factor ) {
num -= factor*2;
}
}
return num;
}
bool BarsParse::parseNoteRest(MeasureData* measureData, int length, BdatType type) {
NoteContainer* container = new NoteContainer();
Block placeHolder;
unsigned int thisByte;
measureData->addNoteContainer(container);
measureData->addMusicData(container);
// note|rest & grace
container->setIsRest(type==BdatType::Rest);
container->setIsRaw(type==BdatType::Raw_Note);
if( !readBuffer(placeHolder, 2) ) { return false; }
thisByte = placeHolder.toUnsignedInt();
container->setIsGrace( thisByte == 0x3C00 );
container->setIsCue( thisByte == 0x4B40 || thisByte == 0x3240 );
// show / hide
if( !readBuffer(placeHolder, 1) ) { return false; }
thisByte = placeHolder.toUnsignedInt();
container->setShow(getLowNibble(thisByte)!=0x8);
// voice
container->setVoice(getLowNibble(thisByte)&0x7);
// common
if( !parseCommonBlock(container) ) { return false; }
// tuplet
if( !readBuffer(placeHolder, 1) ) { return false; }
container->setTuplet(placeHolder.toUnsignedInt());
// space
if( !readBuffer(placeHolder, 1) ) { return false; }
container->setSpace(placeHolder.toUnsignedInt());
// in beam
if( !readBuffer(placeHolder, 1) ) { return false; }
thisByte = placeHolder.toUnsignedInt();
bool inBeam = ( getHighNibble(thisByte) & 0x1 ) == 0x1;
container->setInBeam(inBeam);
// grace NoteType
container->setGraceNoteType((NoteType)getHighNibble(thisByte));
// dot
container->setDot(getLowNibble(thisByte)&0x03);
// NoteType
if( !readBuffer(placeHolder, 1) ) { return false; }
thisByte = placeHolder.toUnsignedInt();
container->setNoteType((NoteType)getLowNibble(thisByte));
int cursor = 0;
if( type == BdatType::Rest ) {
Note* restPtr = new Note();
container->addNoteRest(restPtr);
restPtr->setIsRest(true);
// line
if( !readBuffer(placeHolder, 1) ) { return false; }
restPtr->setLine(placeHolder.toInt());
if( !jump(1) ) { return false; }
cursor = ove_->getIsVersion4() ? 16 : 14;
} else // type == Bdat_Note || type == Bdat_Raw_Note
{
// stem up 0x80, stem down 0x00
if( !readBuffer(placeHolder, 1) ) { return false; }
thisByte = placeHolder.toUnsignedInt();
container->setStemUp((getHighNibble(thisByte)&0x8)==0x8);
// stem length
int stemOffset = thisByte%0x80;
container->setStemLength(getInt(stemOffset, 7)+7/*3.5 line span*/);
// show stem 0x00, hide stem 0x40
if( !readBuffer(placeHolder, 1) ) { return false; }
bool hideStem = getHighNibble(thisByte)==0x4;
container->setShowStem(!hideStem);
if( !jump(1) ) { return false; }
// note count
if( !readBuffer(placeHolder, 1) ) { return false; }
unsigned int noteCount = placeHolder.toUnsignedInt();
unsigned int i;
// each note 16 bytes
for( i=0; i<noteCount; ++i ) {
Note* notePtr = new Note();
notePtr->setIsRest(false);
container->addNoteRest(notePtr);
// note show / hide
if( !readBuffer(placeHolder, 1) ) { return false; }
thisByte = placeHolder.toUnsignedInt();
notePtr->setShow((thisByte&0x80) != 0x80);
// note head type
notePtr->setHeadType(thisByte&0x7f);
// tie pos
if( !readBuffer(placeHolder, 1) ) { return false; }
thisByte = placeHolder.toUnsignedInt();
notePtr->setTiePos(getHighNibble(thisByte));
// offset staff, in {-1, 0, 1}
if( !readBuffer(placeHolder, 1) ) { return false; }
thisByte = getLowNibble(placeHolder.toUnsignedInt());
int offsetStaff = 0;
if( thisByte == 1 ) { offsetStaff = 1; }
if( thisByte == 7 ) { offsetStaff = -1; }
notePtr->setOffsetStaff(offsetStaff);
// accidental
if( !readBuffer(placeHolder, 1) ) { return false; }
thisByte = placeHolder.toUnsignedInt();
notePtr->setAccidental(getLowNibble(thisByte));
// accidental 0: influenced by key, 4: influenced by previous accidental in measure
bool notShow = ( getHighNibble(thisByte) == 0 ) || ( getHighNibble(thisByte) == 4 );
notePtr->setShowAccidental(!notShow);
if( !jump(1) ) { return false; }
// line
if( !readBuffer(placeHolder, 1) ) { return false; }
notePtr->setLine(placeHolder.toInt());
if( !jump(1) ) { return false; }
// note
if( !readBuffer(placeHolder, 1) ) { return false; }
unsigned int note = placeHolder.toUnsignedInt();
notePtr->setNote(note);
// note on velocity
if( !readBuffer(placeHolder, 1) ) { return false; }
unsigned int onVelocity = placeHolder.toUnsignedInt();
notePtr->setOnVelocity(onVelocity);
// note off velocity
if( !readBuffer(placeHolder, 1) ) { return false; }
unsigned int offVelocity = placeHolder.toUnsignedInt();
notePtr->setOffVelocity(offVelocity);
if( !jump(2) ) { return false; }
// length (tick)
if( !readBuffer(placeHolder, 2) ) { return false; }
container->setLength(placeHolder.toUnsignedInt());
// offset tick
if( !readBuffer(placeHolder, 2) ) { return false; }
notePtr->setOffsetTick(placeHolder.toInt());
}
cursor = ove_->getIsVersion4() ? 18 : 16;
cursor += noteCount * 16/*note size*/;
}
// articulation
while ( cursor < length + 1/* 0x70 || 0x80 || 0x90 */ ) {
Articulation* art = new Articulation();
container->addArticulation(art);
// block size
if( !readBuffer(placeHolder, 2) ) { return false; }
int blockSize = placeHolder.toUnsignedInt();
// articulation type
if( !readBuffer(placeHolder, 1) ) { return false; }
art->setArtType(placeHolder.toUnsignedInt());
// placement
if( !readBuffer(placeHolder, 1) ) { return false; }
art->setPlacementAbove(placeHolder.toUnsignedInt()!=0x00); //0x00:below, 0x30:above
// offset
if( !parseOffsetElement(art) ) { return false; }
if( !ove_->getIsVersion4() ) {
if( blockSize - 8 > 0 ) {
if( !jump(blockSize-8) ) { return false; }
}
} else {
// setting
if( !readBuffer(placeHolder, 1) ) { return false; }
thisByte = placeHolder.toUnsignedInt();
const bool changeSoundEffect = ( ( thisByte & 0x1 ) == 0x1 );
const bool changeLength = ( ( thisByte & 0x2 ) == 0x2 );
const bool changeVelocity = ( ( thisByte & 0x4 ) == 0x4 );
//const bool changeExtraLength = ( ( thisByte & 0x20 ) == 0x20 );
if( !jump(8) ) { return false; }
// velocity type
if( !readBuffer(placeHolder, 1) ) { return false; }
thisByte = placeHolder.toUnsignedInt();
if( changeVelocity ) {
art->setVelocityType((Articulation::VelocityType)thisByte);
}
if( !jump(14) ) { return false; }
// sound effect
if( !readBuffer(placeHolder, 2) ) { return false; }
int from = placeHolder.toInt();
if( !readBuffer(placeHolder, 2) ) { return false; }
int to = placeHolder.toInt();
if( changeSoundEffect ) {
art->setSoundEffect(from, to);
}
if( !jump(1) ) { return false; }
// length percentage
if( !readBuffer(placeHolder, 1) ) { return false; }
if( changeLength ) {
art->setLengthPercentage(placeHolder.toUnsignedInt());
}
// velocity
if( !readBuffer(placeHolder, 2) ) { return false; }
if( changeVelocity ) {
art->setVelocityValue(placeHolder.toInt());
}
if( Articulation::isTrill(art->getArtType()) ) {
if( !jump(8) ) { return false; }
// trill note length
if( !readBuffer(placeHolder, 1) ) { return false; }
art->setTrillNoteLength(placeHolder.toUnsignedInt());
// trill rate
if( !readBuffer(placeHolder, 1) ) { return false; }
thisByte = placeHolder.toUnsignedInt();
NoteType trillNoteType = NoteType::Note_Sixteen;
switch ( getHighNibble(thisByte) ) {
case 0:
trillNoteType = NoteType::Note_None;
break;
case 1:
trillNoteType = NoteType::Note_Sixteen;
break;
case 2:
trillNoteType = NoteType::Note_32;
break;
case 3:
trillNoteType = NoteType::Note_64;
break;
case 4:
trillNoteType = NoteType::Note_128;
break;
default:
break;
}
art->setTrillRate(trillNoteType);
// accelerate type
art->setAccelerateType(thisByte&0xf);
if( !jump(1) ) { return false; }
// auxiliary first
if( !readBuffer(placeHolder, 1) ) { return false; }
art->setAuxiliaryFirst(placeHolder.toBoolean());
if( !jump(1) ) { return false; }
// trill interval
if( !readBuffer(placeHolder, 1) ) { return false; }
art->setTrillInterval(placeHolder.toUnsignedInt());
} else {
if( blockSize > 40 ) {
if( !jump( blockSize - 40 ) ) { return false; }
}
}
}
cursor += blockSize;
}
return true;
}
int tupletToSpace(int tuplet) {
int a(1);
while( a*2 < tuplet ) {
a *= 2;
}
return a;
}
bool BarsParse::parseBeam(MeasureData* measureData, int length) {
int i;
Block placeHolder;
Beam* beam = new Beam();
measureData->addCrossMeasureElement(beam, true);
// maybe create tuplet, for < quarter & tool 3(
bool createTuplet = false;
int maxEndUnit = 0;
Tuplet* tuplet = new Tuplet();
// is grace
if( !readBuffer(placeHolder, 1) ) { return false; }
beam->setIsGrace(placeHolder.toBoolean());
if( !jump(1) ) { return false; }
// voice
if( !readBuffer(placeHolder, 1) ) { return false; }
beam->setVoice(getLowNibble(placeHolder.toUnsignedInt())&0x7);
// common
if( !parseCommonBlock(beam) ) { return false; }
if( !jump(2) ) { return false; }
// beam count
if( !readBuffer(placeHolder, 1) ) { return false; }
int beamCount = placeHolder.toUnsignedInt();
if( !jump(1) ) { return false; }
// left line
if( !readBuffer(placeHolder, 1) ) { return false; }
beam->getLeftLine()->setLine(placeHolder.toInt());
// right line
if( !readBuffer(placeHolder, 1) ) { return false; }
beam->getRightLine()->setLine(placeHolder.toInt());
if( ove_->getIsVersion4() ) {
if( !jump(8) ) { return false; }
}
int currentCursor = ove_->getIsVersion4() ? 23 : 13;
int count = (length - currentCursor)/16;
if( count != beamCount ) { return false; }
for( i=0; i<count; ++i ) {
if( !jump(1) ) { return false; }
// tuplet
if( !readBuffer(placeHolder, 1) ) { return false; }
int tupletCount = placeHolder.toUnsignedInt();
if( tupletCount > 0 ) {
createTuplet = true;
tuplet->setTuplet(tupletCount);
tuplet->setSpace(tupletToSpace(tupletCount));
}
// start / stop measure
// line i start end position
MeasurePos startMp;
MeasurePos stopMp;
if( !readBuffer(placeHolder, 1) ) { return false; }
startMp.setMeasure(placeHolder.toUnsignedInt());
if( !readBuffer(placeHolder, 1) ) { return false; }
stopMp.setMeasure(placeHolder.toUnsignedInt());
if( !readBuffer(placeHolder, 2) ) { return false; }
startMp.setOffset(placeHolder.toInt());
if( !readBuffer(placeHolder, 2) ) { return false; }
stopMp.setOffset(placeHolder.toInt());
beam->addLine(startMp, stopMp);
if( stopMp.getOffset() > maxEndUnit ) {
maxEndUnit = stopMp.getOffset();
}
if( i == 0 ) {
if( !jump(4) ) { return false; }
// left offset up+4, down-4
if( !readBuffer(placeHolder, 2) ) { return false; }
beam->getLeftShoulder()->setYOffset(placeHolder.toInt());
// right offset up+4, down-4
if( !readBuffer(placeHolder, 2) ) { return false; }
beam->getRightShoulder()->setYOffset(placeHolder.toInt());
} else {
if( !jump(8) ) { return false; }
}
}
const QList<QPair<MeasurePos, MeasurePos> > lines = beam->getLines();
MeasurePos offsetMp;
for( i=0; i<lines.size(); ++i ) {
if( lines[i].second > offsetMp ) {
offsetMp = lines[i].second;
}
}
beam->stop()->setMeasure(offsetMp.getMeasure());
beam->stop()->setOffset(offsetMp.getOffset());
// a case that Tuplet block don't exist, and hide inside beam
if( createTuplet ) {
tuplet->copyCommonBlock(*beam);
tuplet->getLeftLine()->setLine(beam->getLeftLine()->getLine());
tuplet->getRightLine()->setLine(beam->getRightLine()->getLine());
tuplet->stop()->setMeasure(beam->stop()->getMeasure());
tuplet->stop()->setOffset(maxEndUnit);
measureData->addCrossMeasureElement(tuplet, true);
} else {
delete tuplet;
}
return true;
}
bool BarsParse::parseTie(MeasureData* measureData, int /*length*/) {
Block placeHolder;
Tie* tie = new Tie();
measureData->addCrossMeasureElement(tie, true);
if( !jump(3) ) { return false; }
// start common
if( !parseCommonBlock(tie) ) { return false; }
if( !jump(1) ) { return false; }
// note
if( !readBuffer(placeHolder, 1) ) { return false; }
tie->setNote(placeHolder.toUnsignedInt());
// pair lines
if( !parsePairLinesBlock(tie) ) { return false; }
// offset common
if( !parseOffsetCommonBlock(tie) ) { return false; }
// left shoulder offset
if( !parseOffsetElement(tie->getLeftShoulder()) ) { return false; }
// right shoulder offset
if( !parseOffsetElement(tie->getRightShoulder()) ) { return false; }
// height
if( !readBuffer(placeHolder, 2) ) { return false; }
tie->setHeight(placeHolder.toUnsignedInt());
return true;
}
bool BarsParse::parseTuplet(MeasureData* measureData, int /*length*/) {
Block placeHolder;
Tuplet* tuplet = new Tuplet();
measureData->addCrossMeasureElement(tuplet, true);
if( !jump(3) ) { return false; }
// common
if( !parseCommonBlock(tuplet) ) { return false; }
if( !jump(2) ) { return false; }
// pair lines
if( !parsePairLinesBlock(tuplet) ) { return false; }
// offset common
if( !parseOffsetCommonBlock(tuplet) ) { return false; }
// left shoulder offset
if( !parseOffsetElement(tuplet->getLeftShoulder()) ) { return false; }
// right shoulder offset
if( !parseOffsetElement(tuplet->getRightShoulder()) ) { return false; }
if( !jump(2) ) { return false; }
// height
if( !readBuffer(placeHolder, 2) ) { return false; }
tuplet->setHeight(placeHolder.toUnsignedInt());
// tuplet
if( !readBuffer(placeHolder, 1) ) { return false; }
tuplet->setTuplet(placeHolder.toUnsignedInt());
// space
if( !readBuffer(placeHolder, 1) ) { return false; }
tuplet->setSpace(placeHolder.toUnsignedInt());
// mark offset
if( !parseOffsetElement(tuplet->getMarkHandle()) ) { return false; }
return true;
}
HarmonyType binaryToHarmonyType(int bin) {
HarmonyType type = HarmonyType::H_maj;
if( bin == 0x0091 ) {
type = HarmonyType::H_maj;
} else if( bin == 0x0089 ) {
type = HarmonyType::H_min;
} else if( bin == 0x0489 ) {
type = HarmonyType::H_min7;
} else if( bin == 0x0491 ) {
type = HarmonyType::H_7;
} else if( bin == 0x0495 ) {
type = HarmonyType::H_9;
} else if( bin == 0x0449 ) {
type = HarmonyType::H_min7b5;
} else if( bin == 0x04A1 ) {
type = HarmonyType::H_7sus4;
} else if( bin == 0x00A1 ) {
type = HarmonyType::H_sus4;
} else if( bin == 0x0049 ) {
type = HarmonyType::H_dim;
} else if( bin == 0x0249 ) {
type = HarmonyType::H_dim7;
} else if( bin == 0x0111 ) {
type = HarmonyType::H_aug;
} else if( bin == 0x0511 ) {
type = HarmonyType::H_aug7;
} else if( bin == 0x044D ) {
type = HarmonyType::H_min9_b5;
} else if( bin == 0x0499 ) {
type = HarmonyType::H_7s9;
} else if( bin == 0x0615 ) {
type = HarmonyType::H_13;
} else if( bin == 0x0289 ) {
type = HarmonyType::H_min6;
} else if( bin == 0x0291 ) {
type = HarmonyType::H_6;
} else if( bin == 0x0295 ) {
type = HarmonyType::H_6; //6add9
} else if( bin == 0x0095 ) {
type = HarmonyType::H_min; //minor add9
} else if( bin == 0x008D ) {
type = HarmonyType::H_maj7;
} else if( bin == 0x0891 ) {
type = HarmonyType::H_maj7;
} else if( bin == 0x0881 ) {
type = HarmonyType::H_maj7_s5; //maj7#5
} else if( bin == 0x0911 ) {
type = HarmonyType::H_maj7_s5; //maj7#5
} else if( bin == 0x0991 ) {
type = HarmonyType::H_maj7_s11; //maj7#11
} else if( bin == 0x0851 ) {
type = HarmonyType::H_maj7_s11; //maj7#11
} else if( bin == 0x08D1 ) {
type = HarmonyType::H_maj9;
} else if( bin == 0x0895 ) {
type = HarmonyType::H_maj9_s5; //maj9#5
} else if( bin == 0x0995 ) {
type = HarmonyType::H_maj13_s11; //maj9#11
} else if( bin == 0x0855 ) {
type = HarmonyType::H_maj9_s11; //maj9#11
} else if( bin == 0x08D5 ) {
type = HarmonyType::H_maj13;
} else if( bin == 0x0A95 ) {
type = HarmonyType::H_maj13_s11; //maj13#11
} else if( bin == 0x0A55 ) {
type = HarmonyType::H_maj13; //maj13(no3)
} else if( bin == 0x0A85 ) {
type = HarmonyType::H_maj9_s5; //maj13#5#11(no4)
} else if( bin == 0x0B45 ) {
type = HarmonyType::H_7b9;
} else if( bin == 0x0493 ) {
type = HarmonyType::H_7b5;
} else if( bin == 0x0451 ) {
type = HarmonyType::H_9b5;
} else if( bin == 0x0455 ) {
type = HarmonyType::H_7s9; //7#5#9
} else if( bin == 0x0519 ) {
type = HarmonyType::H_7b9; //7#5b9
} else if( bin == 0x0513 ) {
type = HarmonyType::H_aug7; //aug9
} else if( bin == 0x0515 ) {
type = HarmonyType::H_sus4; //sus9
} else if( bin == 0x04A5 ) {
type = HarmonyType::H_13b9;
} else if( bin == 0x0613 ) {
type = HarmonyType::H_13b9; //13b9#11
} else if( bin == 0x0611 ) {
type = HarmonyType::H_13;
} else if( bin == 0x0653 ) {
type = HarmonyType::H_min; //m(natural7)
} else if( bin == 0x0889 ) {
type = HarmonyType::H_min9; //m9(natural7)
} else if( bin == 0x088D ) {
type = HarmonyType::H_min11;
} else if( bin == 0x04AD ) {
type = HarmonyType::H_9s11;
} else if( bin == 0x04D5 ) {
type = HarmonyType::H_7sus4; //sus7
} else if( bin == 0x0421 ) {
type = HarmonyType::H_min11;
} else if( bin == 0x04A9 ) {
type = HarmonyType::H_min9;
} else if( bin == 0x048D ) {
type = HarmonyType::H_7b5b9;
} else if( bin == 0x0453 ) {
type = HarmonyType::H_maj; //(no5)
} else if( bin == 0x0011 ) {
type = HarmonyType::H_maj7; //(no3)
} else if( bin == 0x0081 ) {
type = HarmonyType::H_7; //7(no3)
} else if( bin == 0x0481 ) {
type = HarmonyType::H_7; //7(no5)
} else if( bin == 0x0411 ) {
type = HarmonyType::H_6;
} else if( bin == 0x0291 ) {
type = HarmonyType::H_sus4; //sus(add9)
} else if( bin == 0x00A5 ) {
type = HarmonyType::H_13s9; //13#9b5
} else if( bin == 0x0659 ) {
type = HarmonyType::H_sus4; //sus(no5)
} else if( bin == 0x0021 ) {
type = HarmonyType::H_7b5b9; //7b5b9#9
} else if( bin == 0x045B ) {
type = HarmonyType::H_13b5; //13b5b9#9
} else if( bin == 0x065B ) {
type = HarmonyType::H_13b9; //13b9#9
} else if( bin == 0x061B ) {
type = HarmonyType::H_7b9s9; //7b9#9
} else if( bin == 0x04B5 ) {
type = HarmonyType::H_7;
}
return type;
}
bool BarsParse::parseHarmony(MeasureData* measureData, int /*length*/) {
Block placeHolder;
Harmony* harmony = new Harmony();
measureData->addMusicData(harmony);
if( !jump(3) ) { return false; }
// common
if( !parseCommonBlock(harmony) ) { return false; }
// bass on bottom
if( !readBuffer(placeHolder, 1) ) { return false; }
harmony->setBassOnBottom((getHighNibble(placeHolder.toUnsignedInt())==0x4));
if( !jump(1) ) { return false; }
// y offset
if( !readBuffer(placeHolder, 2) ) { return false; }
harmony->setYOffset(placeHolder.toInt());
// harmony type
if( !readBuffer(placeHolder, 2) ) { return false; }
harmony->setHarmonyType(binaryToHarmonyType(placeHolder.toUnsignedInt()));
// root
if( !readBuffer(placeHolder, 1) ) { return false; }
harmony->setRoot(placeHolder.toInt());
// bass
if( !readBuffer(placeHolder, 1) ) { return false; }
harmony->setBass(placeHolder.toInt());
// angle
if( !readBuffer(placeHolder, 2) ) { return false; }
harmony->setAngle(placeHolder.toInt());
if( ove_->getIsVersion4() ) {
// length (tick)
if( !readBuffer(placeHolder, 2) ) { return false; }
harmony->setLength(placeHolder.toUnsignedInt());
if( !jump(4) ) { return false; }
}
return true;
}
bool BarsParse::parseClef(MeasureData* measureData, int /*length*/) {
Block placeHolder;
Clef* clef = new Clef();
measureData->addMusicData(clef);
if( !jump(3) ) { return false; }
// common
if( !parseCommonBlock(clef) ) { return false; }
// clef type
if( !readBuffer(placeHolder, 1) ) { return false; }
clef->setClefType(placeHolder.toUnsignedInt());
// line
if( !readBuffer(placeHolder, 1) ) { return false; }
clef->setLine(placeHolder.toInt());
if( !jump(2) ) { return false; }
return true;
}
bool BarsParse::parseLyric(MeasureData* measureData, int length) {
Block placeHolder;
Lyric* lyric = new Lyric();
measureData->addMusicData(lyric);
if( !jump(3) ) { return false; }
// common
if( !parseCommonBlock(lyric) ) { return false; }
if( !jump(2) ) { return false; }
// offset
if( !parseOffsetElement(lyric) ) { return false; }
if( !jump(7) ) { return false; }
// verse
if( !readBuffer(placeHolder, 1) ) { return false; }
lyric->setVerse(placeHolder.toUnsignedInt());
if( ove_->getIsVersion4() ) {
if( !jump(6) ) { return false; }
// lyric
if( length > 29 ) {
if( !readBuffer(placeHolder, length-29) ) { return false; }
lyric->setLyric(ove_->getCodecString(placeHolder.fixedSizeBufferToStrByteArray()));
}
}
return true;
}
bool BarsParse::parseSlur(MeasureData* measureData, int /*length*/) {
Block placeHolder;
Slur* slur = new Slur();
measureData->addCrossMeasureElement(slur, true);
if( !jump(2) ) { return false; }
// voice
if( !readBuffer(placeHolder, 1) ) { return false; }
slur->setVoice(getLowNibble(placeHolder.toUnsignedInt())&0x7);
// common
if( !parseCommonBlock(slur) ) { return false; }
// show on top
if( !readBuffer(placeHolder, 1) ) { return false; }
slur->setShowOnTop(getHighNibble(placeHolder.toUnsignedInt())==0x8);
if( !jump(1) ) { return false; }
// pair lines
if( !parsePairLinesBlock(slur) ) { return false; }
// offset common
if( !parseOffsetCommonBlock(slur) ) { return false; }
// handle 1
if( !parseOffsetElement(slur->getLeftShoulder()) ) { return false; }
// handle 4
if( !parseOffsetElement(slur->getRightShoulder()) ) { return false; }
// handle 2
if( !parseOffsetElement(slur->getHandle2()) ) { return false; }
// handle 3
if( !parseOffsetElement(slur->getHandle3()) ) { return false; }
if( ove_->getIsVersion4() ) {
if( !jump(3) ) { return false; }
// note time percent
if( !readBuffer(placeHolder, 1) ) { return false; }
slur->setNoteTimePercent(placeHolder.toUnsignedInt());
if( !jump(36) ) { return false; }
}
return true;
}
bool BarsParse::parseGlissando(MeasureData* measureData, int /*length*/) {
Block placeHolder;
Glissando* glissando = new Glissando();
measureData->addCrossMeasureElement(glissando, true);
if( !jump(3) ) { return false; }
// common
if( !parseCommonBlock(glissando) ) { return false; }
// straight or wavy
if( !readBuffer(placeHolder, 1) ) { return false; }
unsigned int thisByte = placeHolder.toUnsignedInt();
glissando->setStraightWavy(getHighNibble(thisByte)==4);
if( !jump(1) ) { return false; }
// pair lines
if( !parsePairLinesBlock(glissando) ) { return false; }
// offset common
if( !parseOffsetCommonBlock(glissando) ) { return false; }
// left shoulder
if( !parseOffsetElement(glissando->getLeftShoulder()) ) { return false; }
// right shoulder
if( !parseOffsetElement(glissando->getRightShoulder()) ) { return false; }
if( ove_->getIsVersion4() ) {
if( !jump(1) ) { return false; }
// line thick
if( !readBuffer(placeHolder, 1) ) { return false; }
glissando->setLineThick(placeHolder.toUnsignedInt());
if( !jump(12) ) { return false; }
// text 32 bytes
if( !readBuffer(placeHolder, 32) ) { return false; }
glissando->setText(ove_->getCodecString(placeHolder.fixedSizeBufferToStrByteArray()));
if( !jump(6) ) { return false; }
}
return true;
}
bool getDecoratorType(
unsigned int thisByte,
bool& measureRepeat,
Decorator::Type& decoratorType,
bool& singleRepeat,
ArticulationType& artType) {
measureRepeat = false;
decoratorType = Decorator::Type::Articulation;
singleRepeat = true;
artType = ArticulationType::None;
switch (thisByte) {
case 0x00: {
decoratorType = Decorator::Type::Dotted_Barline;
break;
}
case 0x30: {
artType = ArticulationType::Open_String;
break;
}
case 0x31: {
artType = ArticulationType::Finger_1;
break;
}
case 0x32: {
artType = ArticulationType::Finger_2;
break;
}
case 0x33: {
artType = ArticulationType::Finger_3;
break;
}
case 0x34: {
artType = ArticulationType::Finger_4;
break;
}
case 0x35: {
artType = ArticulationType::Finger_5;
break;
}
case 0x6B: {
artType = ArticulationType::Flat_Accidental_For_Trill;
break;
}
case 0x6C: {
artType = ArticulationType::Sharp_Accidental_For_Trill;
break;
}
case 0x6D: {
artType = ArticulationType::Natural_Accidental_For_Trill;
break;
}
case 0x8d: {
measureRepeat = true;
singleRepeat = true;
break;
}
case 0x8e: {
measureRepeat = true;
singleRepeat = false;
break;
}
case 0xA0: {
artType = ArticulationType::Minor_Trill;
break;
}
case 0xA1: {
artType = ArticulationType::Major_Trill;
break;
}
case 0xA2: {
artType = ArticulationType::Trill_Section;
break;
}
case 0xA6: {
artType = ArticulationType::Turn;
break;
}
case 0xA8: {
artType = ArticulationType::Tremolo_Eighth;
break;
}
case 0xA9: {
artType = ArticulationType::Tremolo_Sixteenth;
break;
}
case 0xAA: {
artType = ArticulationType::Tremolo_Thirty_Second;
break;
}
case 0xAB: {
artType = ArticulationType::Tremolo_Sixty_Fourth;
break;
}
case 0xB2: {
artType = ArticulationType::Fermata;
break;
}
case 0xB3: {
artType = ArticulationType::Fermata_Inverted;
break;
}
case 0xB9: {
artType = ArticulationType::Pause;
break;
}
case 0xBA: {
artType = ArticulationType::Grand_Pause;
break;
}
case 0xC0: {
artType = ArticulationType::Marcato;
break;
}
case 0xC1: {
artType = ArticulationType::Marcato_Dot;
break;
}
case 0xC2: {
artType = ArticulationType::SForzando;
break;
}
case 0xC3: {
artType = ArticulationType::SForzando_Dot;
break;
}
case 0xC4: {
artType = ArticulationType::SForzando_Inverted;
break;
}
case 0xC5: {
artType = ArticulationType::SForzando_Dot_Inverted;
break;
}
case 0xC6: {
artType = ArticulationType::Staccatissimo;
break;
}
case 0xC7: {
artType = ArticulationType::Staccato;
break;
}
case 0xC8: {
artType = ArticulationType::Tenuto;
break;
}
case 0xC9: {
artType = ArticulationType::Natural_Harmonic;
break;
}
case 0xCA: {
artType = ArticulationType::Artificial_Harmonic;
break;
}
case 0xCB: {
artType = ArticulationType::Plus_Sign;
break;
}
case 0xCC: {
artType = ArticulationType::Up_Bow;
break;
}
case 0xCD: {
artType = ArticulationType::Down_Bow;
break;
}
case 0xCE: {
artType = ArticulationType::Up_Bow_Inverted;
break;
}
case 0xCF: {
artType = ArticulationType::Down_Bow_Inverted;
break;
}
case 0xD0: {
artType = ArticulationType::Pedal_Down;
break;
}
case 0xD1: {
artType = ArticulationType::Pedal_Up;
break;
}
case 0xD6: {
artType = ArticulationType::Heavy_Attack;
break;
}
case 0xD7: {
artType = ArticulationType::Heavier_Attack;
break;
}
default:
return false;
break;
}
return true;
}
bool BarsParse::parseDecorators(MeasureData* measureData, int length) {
Block placeHolder;
MusicData* musicData = new MusicData();
if( !jump(3) ) { return false; }
// common
if( !parseCommonBlock(musicData) ) { return false; }
if( !jump(2) ) { return false; }
// y offset
if( !readBuffer(placeHolder, 2) ) { return false; }
musicData->setYOffset(placeHolder.toInt());
if( !jump(2) ) { return false; }
// measure repeat | piano pedal | dotted barline | articulation
if( !readBuffer(placeHolder, 1) ) { return false; }
unsigned int thisByte = placeHolder.toUnsignedInt();
Decorator::Type decoratorType;
bool isMeasureRepeat;
bool isSingleRepeat = true;
ArticulationType artType = ArticulationType::None;
getDecoratorType(thisByte, isMeasureRepeat, decoratorType, isSingleRepeat, artType);
if( isMeasureRepeat ) {
MeasureRepeat* measureRepeat = new MeasureRepeat();
measureData->addCrossMeasureElement(measureRepeat, true);
measureRepeat->copyCommonBlock(*musicData);
measureRepeat->setYOffset(musicData->getYOffset());
measureRepeat->setSingleRepeat(isSingleRepeat);
} else {
Decorator* decorator = new Decorator();
measureData->addMusicData(decorator);
decorator->copyCommonBlock(*musicData);
decorator->setYOffset(musicData->getYOffset());
decorator->setDecoratorType(decoratorType);
decorator->setArticulationType(artType);
}
int cursor = ove_->getIsVersion4() ? 16 : 14;
if( !jump(length-cursor) ) { return false; }
return true;
}
bool BarsParse::parseWedge(MeasureData* measureData, int length) {
Block placeHolder;
Wedge* wedge = new Wedge();
if( !jump(3) ) { return false; }
// common
if( !parseCommonBlock(wedge) ) { return false; }
// wedge type
if( !readBuffer(placeHolder, 1) ) { return false; }
WedgeType wedgeType = WedgeType::Cres_Line;
bool wedgeOrExpression = true;
unsigned int highHalfByte = getHighNibble(placeHolder.toUnsignedInt());
unsigned int lowHalfByte = getLowNibble(placeHolder.toUnsignedInt());
switch (highHalfByte) {
case 0x0: {
wedgeType = WedgeType::Cres_Line;
wedgeOrExpression = true;
break;
}
case 0x4: {
wedgeType = WedgeType::Decresc_Line;
wedgeOrExpression = true;
break;
}
case 0x6: {
wedgeType = WedgeType::Decresc;
wedgeOrExpression = false;
break;
}
case 0x2: {
wedgeType = WedgeType::Cres;
wedgeOrExpression = false;
break;
}
default:
break;
}
// 0xb | 0x8(ove3) , else 3, 0(ove3)
if( (lowHalfByte & 0x8) == 0x8 ) {
wedgeType = WedgeType::Double_Line;
wedgeOrExpression = true;
}
if( !jump(1) ) { return false; }
// y offset
if( !readBuffer(placeHolder, 2) ) { return false; }
wedge->setYOffset(placeHolder.toInt());
// wedge
if( wedgeOrExpression ) {
measureData->addCrossMeasureElement(wedge, true);
wedge->setWedgeType(wedgeType);
if( !jump(2) ) { return false; }
// height
if( !readBuffer(placeHolder, 2) ) { return false; }
wedge->setHeight(placeHolder.toUnsignedInt());
// offset common
if( !parseOffsetCommonBlock(wedge) ) { return false; }
int cursor = ove_->getIsVersion4() ? 21 : 19;
if( !jump(length-cursor) ) { return false; }
}
// expression : cresc, decresc
else {
Expressions* express = new Expressions();
measureData->addMusicData(express);
express->copyCommonBlock(*wedge);
express->setYOffset(wedge->getYOffset());
if( !jump(4) ) { return false; }
// offset common
if( !parseOffsetCommonBlock(express) ) { return false; }
if( ove_->getIsVersion4() ) {
if( !jump(18) ) { return false; }
// words
if( length > 39 ) {
if( !readBuffer(placeHolder, length-39) ) { return false; }
express->setText(ove_->getCodecString(placeHolder.fixedSizeBufferToStrByteArray()));
}
} else {
QString str = wedgeType==WedgeType::Cres ? "cresc" : "decresc";
express->setText(str);
if( !jump(8) ) { return false; }
}
}
return true;
}
bool BarsParse::parseDynamics(MeasureData* measureData, int /*length*/) {
Block placeHolder;
Dynamics* dynamics = new Dynamics();
measureData->addMusicData(dynamics);
if( !jump(1) ) { return false; }
// is playback
if( !readBuffer(placeHolder, 1) ) { return false; }
dynamics->setIsPlayback(getHighNibble(placeHolder.toUnsignedInt())!=0x4);
if( !jump(1) ) { return false; }
// common
if( !parseCommonBlock(dynamics) ) { return false; }
// y offset
if( !readBuffer(placeHolder, 2) ) { return false; }
dynamics->setYOffset(placeHolder.toInt());
// dynamics type
if( !readBuffer(placeHolder, 1) ) { return false; }
dynamics->setDynamicsType(getLowNibble(placeHolder.toUnsignedInt()));
// velocity
if( !readBuffer(placeHolder, 1) ) { return false; }
dynamics->setVelocity(placeHolder.toUnsignedInt());
int cursor = ove_->getIsVersion4() ? 4 : 2;
if( !jump(cursor) ) { return false; }
return true;
}
bool BarsParse::parseKey(MeasureData* measureData, int /*length*/) {
Block placeHolder;
Key* key = measureData->getKey();
int cursor = ove_->getIsVersion4() ? 9 : 7;
if( !jump(cursor) ) { return false; }
// key
if( !readBuffer(placeHolder, 1) ) { return false; }
key->setKey(oveKeyToKey(placeHolder.toUnsignedInt()));
// previous key
if( !readBuffer(placeHolder, 1) ) { return false; }
key->setPreviousKey(oveKeyToKey(placeHolder.toUnsignedInt()));
if( !jump(3) ) { return false; }
// symbol count
if( !readBuffer(placeHolder, 1) ) { return false; }
key->setSymbolCount(placeHolder.toUnsignedInt());
if( !jump(4) ) { return false; }
return true;
}
bool BarsParse::parsePedal(MeasureData* measureData, int length) {
Block placeHolder;
Pedal* pedal = new Pedal();
//measureData->addMusicData(pedal); //can't remember why
measureData->addCrossMeasureElement(pedal, true);
if( !jump(1) ) { return false; }
// is playback
if( !readBuffer(placeHolder, 1) ) { return false; }
pedal->setIsPlayback(getHighNibble(placeHolder.toUnsignedInt())!=4);
if( !jump(1) ) { return false; }
// common
if( !parseCommonBlock(pedal) ) { return false; }
if( !jump(2) ) { return false; }
// pair lines
if( !parsePairLinesBlock(pedal) ) { return false; }
// offset common
if( !parseOffsetCommonBlock(pedal) ) { return false; }
// left shoulder
if( !parseOffsetElement(pedal->getLeftShoulder()) ) { return false; }
// right shoulder
if( !parseOffsetElement(pedal->getRightShoulder()) ) { return false; }
int cursor = ove_->getIsVersion4() ? 0x45 : 0x23;
int blankCount = ove_->getIsVersion4() ? 42 : 10;
pedal->setHalf( length > cursor );
if( !jump(blankCount) ) { return false; }
if( length > cursor ) {
if( !jump(2) ) { return false; }
// handle x offset
if( !readBuffer(placeHolder, 2) ) { return false; }
pedal->getPedalHandle()->setXOffset(placeHolder.toInt());
if( !jump(6) ) { return false; }
}
return true;
}
bool BarsParse::parseKuohao(MeasureData* measureData, int /*length*/) {
Block placeHolder;
KuoHao* kuoHao = new KuoHao();
measureData->addMusicData(kuoHao);
if( !jump(3) ) { return false; }
// common
if( !parseCommonBlock(kuoHao) ) { return false; }
if( !jump(2) ) { return false; }
// pair lines
if( !parsePairLinesBlock(kuoHao) ) { return false; }
if( !jump(4) ) { return false; }
// left shoulder
if( !parseOffsetElement(kuoHao->getLeftShoulder()) ) { return false; }
// right shoulder
if( !parseOffsetElement(kuoHao->getRightShoulder()) ) { return false; }
// kuohao type
if( !readBuffer(placeHolder, 1) ) { return false; }
kuoHao->setKuohaoType(placeHolder.toUnsignedInt());
// height
if( !readBuffer(placeHolder, 1) ) { return false; }
kuoHao->setHeight(placeHolder.toUnsignedInt());
int jumpAmount = ove_->getIsVersion4() ? 40 : 8;
if( !jump(jumpAmount) ) { return false; }
return true;
}
bool BarsParse::parseExpressions(MeasureData* measureData, int length) {
Block placeHolder;
Expressions* expressions = new Expressions();
measureData->addMusicData(expressions);
if( !jump(3) ) { return false; }
// common00
if( !parseCommonBlock(expressions) ) { return false; }
if( !jump(2) ) { return false; }
// y offset
if( !readBuffer(placeHolder, 2) ) { return false; }
expressions->setYOffset(placeHolder.toInt());
// range bar offset
if( !readBuffer(placeHolder, 2) ) { return false; }
//int barOffset = placeHolder.toUnsignedInt();
if( !jump(10) ) { return false; }
// tempo 1
if( !readBuffer(placeHolder, 2) ) { return false; }
//double tempo1 = ((double)placeHolder.toUnsignedInt()) / 100.0;
// tempo 2
if( !readBuffer(placeHolder, 2) ) { return false; }
//double tempo2 = ((double)placeHolder.toUnsignedInt()) / 100.0;
if( !jump(6) ) { return false; }
// text
int cursor = ove_->getIsVersion4() ? 35 : 33;
if( length > cursor ) {
if( !readBuffer(placeHolder, length-cursor) ) { return false; }
expressions->setText(ove_->getCodecString(placeHolder.fixedSizeBufferToStrByteArray()));
}
return true;
}
bool BarsParse::parseHarpPedal(MeasureData* measureData, int /*length*/) {
Block placeHolder;
HarpPedal* harpPedal = new HarpPedal();
measureData->addMusicData(harpPedal);
if( !jump(3) ) { return false; }
// common
if( !parseCommonBlock(harpPedal) ) { return false; }
if( !jump(2) ) { return false; }
// y offset
if( !readBuffer(placeHolder, 2) ) { return false; }
harpPedal->setYOffset(placeHolder.toInt());
// show type
if( !readBuffer(placeHolder, 1) ) { return false; }
harpPedal->setShowType(placeHolder.toUnsignedInt());
// show char flag
if( !readBuffer(placeHolder, 1) ) { return false; }
harpPedal->setShowCharFlag(placeHolder.toUnsignedInt());
if( !jump(8) ) { return false; }
return true;
}
bool BarsParse::parseMultiMeasureRest(MeasureData* measureData, int /*length*/) {
Block placeHolder(2);
MultiMeasureRest* measureRest = new MultiMeasureRest();
measureData->addMusicData(measureRest);
if( !jump(3) ) { return false; }
// common
if( !parseCommonBlock(measureRest) ) { return false; }
if( !jump(6) ) { return false; }
return true;
}
bool BarsParse::parseHarmonyGuitarFrame(MeasureData* measureData, int length) {
Block placeHolder;
Harmony* harmony = new Harmony();
measureData->addMusicData(harmony);
if( !jump(3) ) { return false; }
// common
if( !parseCommonBlock(harmony) ) { return false; }
// root
if( !readBuffer(placeHolder, 1) ) { return false; }
harmony->setRoot(placeHolder.toUnsignedInt());
// type
if( !readBuffer(placeHolder, 1) ) { return false; }
harmony->setHarmonyType((HarmonyType)placeHolder.toUnsignedInt());
// bass
if( !readBuffer(placeHolder, 1) ) { return false; }
harmony->setBass(placeHolder.toUnsignedInt());
int jumpAmount = ove_->getIsVersion4() ? length - 12 : length - 10;
if( !jump(jumpAmount) ) { return false; }
return true;
}
void extractOctave(unsigned int Bits, OctaveShiftType& octaveShiftType, QList<OctaveShiftPosition>& positions) {
octaveShiftType = OctaveShiftType::OS_8;
positions.clear();
switch (Bits) {
case 0x0: {
octaveShiftType = OctaveShiftType::OS_8;
positions.push_back(OctaveShiftPosition::Continue);
break;
}
case 0x1: {
octaveShiftType = OctaveShiftType::OS_Minus_8;
positions.push_back(OctaveShiftPosition::Continue);
break;
}
case 0x2: {
octaveShiftType = OctaveShiftType::OS_15;
positions.push_back(OctaveShiftPosition::Continue);
break;
}
case 0x3: {
octaveShiftType = OctaveShiftType::OS_Minus_15;
positions.push_back(OctaveShiftPosition::Continue);
break;
}
case 0x4: {
octaveShiftType = OctaveShiftType::OS_8;
positions.push_back(OctaveShiftPosition::Stop);
break;
}
case 0x5: {
octaveShiftType = OctaveShiftType::OS_Minus_8;
positions.push_back(OctaveShiftPosition::Stop);
break;
}
case 0x6: {
octaveShiftType = OctaveShiftType::OS_15;
positions.push_back(OctaveShiftPosition::Stop);
break;
}
case 0x7: {
octaveShiftType = OctaveShiftType::OS_Minus_15;
positions.push_back(OctaveShiftPosition::Stop);
break;
}
case 0x8: {
octaveShiftType = OctaveShiftType::OS_8;
positions.push_back(OctaveShiftPosition::Start);
break;
}
case 0x9: {
octaveShiftType = OctaveShiftType::OS_Minus_8;
positions.push_back(OctaveShiftPosition::Start);
break;
}
case 0xA: {
octaveShiftType = OctaveShiftType::OS_15;
positions.push_back(OctaveShiftPosition::Start);
break;
}
case 0xB: {
octaveShiftType = OctaveShiftType::OS_Minus_15;
positions.push_back(OctaveShiftPosition::Start);
;
break;
}
case 0xC: {
octaveShiftType = OctaveShiftType::OS_8;
positions.push_back(OctaveShiftPosition::Start);
positions.push_back(OctaveShiftPosition::Stop);
break;
}
case 0xD: {
octaveShiftType = OctaveShiftType::OS_Minus_8;
positions.push_back(OctaveShiftPosition::Start);
positions.push_back(OctaveShiftPosition::Stop);
break;
}
case 0xE: {
octaveShiftType = OctaveShiftType::OS_15;
positions.push_back(OctaveShiftPosition::Start);
positions.push_back(OctaveShiftPosition::Stop);
break;
}
case 0xF: {
octaveShiftType = OctaveShiftType::OS_Minus_15;
positions.push_back(OctaveShiftPosition::Start);
positions.push_back(OctaveShiftPosition::Stop);
break;
}
default:
break;
}
}
bool BarsParse::parseOctaveShift(MeasureData* measureData, int /*length*/) {
Block placeHolder;
OctaveShift* octave = new OctaveShift();
measureData->addCrossMeasureElement(octave, true);
if( !jump(3) ) { return false; }
// common
if( !parseCommonBlock(octave) ) { return false; }
// octave
if( !readBuffer(placeHolder, 1) ) { return false; }
unsigned int type = getLowNibble(placeHolder.toUnsignedInt());
OctaveShiftType octaveShiftType = OctaveShiftType::OS_8;
QList<OctaveShiftPosition> positions;
extractOctave(type, octaveShiftType, positions);
octave->setOctaveShiftType(octaveShiftType);
if( !jump(1) ) { return false; }
// y offset
if( !readBuffer(placeHolder, 2) ) { return false; }
octave->setYOffset(placeHolder.toInt());
if( !jump(4) ) { return false; }
// length
if( !readBuffer(placeHolder, 2) ) { return false; }
octave->setLength(placeHolder.toUnsignedInt());
// end tick
if( !readBuffer(placeHolder, 2) ) { return false; }
octave->setEndTick(placeHolder.toUnsignedInt());
// start & stop maybe appear in same measure
for (int i=0; i<positions.size(); ++i) {
OctaveShiftPosition position = positions[i];
OctaveShiftEndPoint* octavePoint = new OctaveShiftEndPoint();
measureData->addMusicData(octavePoint);
octavePoint->copyCommonBlock(*octave);
octavePoint->setOctaveShiftType(octaveShiftType);
octavePoint->setOctaveShiftPosition(position);
octavePoint->setEndTick(octave->getEndTick());
// stop
if( i==0 && position == OctaveShiftPosition::Stop ) {
octavePoint->start()->setOffset(octave->start()->getOffset()+octave->getLength());
}
// end point
if( i>0 ) {
octavePoint->start()->setOffset(octave->start()->getOffset()+octave->getLength());
octavePoint->setTick(octave->getEndTick());
}
}
return true;
}
bool BarsParse::parseMidiController(MeasureData* measureData, int /*length*/) {
Block placeHolder;
MidiController* controller = new MidiController();
measureData->addMidiData(controller);
parseMidiCommon(controller);
// value [0, 128)
if( !readBuffer(placeHolder, 1) ) { return false; }
controller->setValue(placeHolder.toUnsignedInt());
// controller number
if( !readBuffer(placeHolder, 1) ) { return false; }
controller->setController(placeHolder.toUnsignedInt());
if( ove_->getIsVersion4() ) {
if( !jump(2) ) { return false; }
}
return true;
}
bool BarsParse::parseMidiProgramChange(MeasureData* measureData, int /*length*/) {
Block placeHolder;
MidiProgramChange* program = new MidiProgramChange();
measureData->addMidiData(program);
parseMidiCommon(program);
if( !jump(1) ) { return false; }
// patch
if( !readBuffer(placeHolder, 1) ) { return false; }
program->setPatch(placeHolder.toUnsignedInt());
if( ove_->getIsVersion4() ) {
if( !jump(2) ) { return false; }
}
return true;
}
bool BarsParse::parseMidiChannelPressure(MeasureData* measureData, int /*length*/) {
Block placeHolder;
MidiChannelPressure* pressure = new MidiChannelPressure();
measureData->addMidiData(pressure);
parseMidiCommon(pressure);
if( !jump(1) ) { return false; }
// pressure
if( !readBuffer(placeHolder, 1) ) { return false; }
pressure->setPressure(placeHolder.toUnsignedInt());
if( ove_->getIsVersion4() )
{
if( !jump(2) ) { return false; }
}
return true;
}
bool BarsParse::parseMidiPitchWheel(MeasureData* measureData, int /*length*/) {
Block placeHolder;
MidiPitchWheel* wheel = new MidiPitchWheel();
measureData->addMidiData(wheel);
parseMidiCommon(wheel);
// pitch wheel
if( !readBuffer(placeHolder, 2) ) { return false; }
int value = placeHolder.toUnsignedInt();
wheel->setValue(value);
if( ove_->getIsVersion4() ) {
if( !jump(2) ) { return false; }
}
return true;
}
bool BarsParse::parseSizeBlock(int length) {
if( !jump(length) ) { return false; }
return true;
}
bool BarsParse::parseMidiCommon(MidiData* ptr) {
Block placeHolder;
if( !jump(3) ) { return false; }
// start position
if( !readBuffer(placeHolder, 2) ) { return false; }
ptr->setTick(placeHolder.toUnsignedInt());
return true;
}
bool BarsParse::parseCommonBlock(MusicData* ptr) {
Block placeHolder;
// start tick
if( !readBuffer(placeHolder, 2) ) { return false; }
ptr->setTick(placeHolder.toInt());
// start unit
if( !readBuffer(placeHolder, 2) ) { return false; }
ptr->start()->setOffset(placeHolder.toInt());
if( ove_->getIsVersion4() ) {
// color
if( !readBuffer(placeHolder, 1) ) { return false; }
ptr->setColor(placeHolder.toUnsignedInt());
if( !jump(1) ) { return false; }
}
return true;
}
bool BarsParse::parseOffsetCommonBlock(MusicData* ptr) {
Block placeHolder;
// offset measure
if( !readBuffer(placeHolder, 2) ) { return false; }
ptr->stop()->setMeasure(placeHolder.toUnsignedInt());
// end unit
if( !readBuffer(placeHolder, 2) ) { return false; }
ptr->stop()->setOffset(placeHolder.toInt());
return true;
}
bool BarsParse::parsePairLinesBlock(PairEnds* ptr) {
Block placeHolder;
// left line
if( !readBuffer(placeHolder, 2) ) { return false; }
ptr->getLeftLine()->setLine(placeHolder.toInt());
// right line
if( !readBuffer(placeHolder, 2) ) { return false; }
ptr->getRightLine()->setLine(placeHolder.toInt());
return true;
}
bool BarsParse::parseOffsetElement(OffsetElement* ptr) {
Block placeHolder;
// x offset
if( !readBuffer(placeHolder, 2) ) { return false; }
ptr->setXOffset(placeHolder.toInt());
// y offset
if( !readBuffer(placeHolder, 2) ) { return false; }
ptr->setYOffset(placeHolder.toInt());
return true;
}
bool BarsParse::getCondElementType(unsigned int byteData, CondType& type) {
if( byteData == 0x09 ) {
type = CondType::Time_Parameters;
} else if (byteData == 0x0A) {
type = CondType::Bar_Number;
} else if (byteData == 0x16) {
type = CondType::Decorator;
} else if (byteData == 0x1C) {
type = CondType::Tempo;
} else if (byteData == 0x1D) {
type = CondType::Text;
} else if (byteData == 0x25) {
type = CondType::Expression;
} else if (byteData == 0x30) {
type = CondType::Barline_Parameters;
} else if (byteData == 0x31) {
type = CondType::Repeat;
} else if (byteData == 0x32) {
type = CondType::Numeric_Ending;
} else {
return false;
}
return true;
}
bool BarsParse::getBdatElementType(unsigned int byteData, BdatType& type) {
if (byteData == 0x70) {
type = BdatType::Raw_Note;
} else if (byteData == 0x80) {
type = BdatType::Rest;
} else if (byteData == 0x90) {
type = BdatType::Note;
} else if (byteData == 0x10) {
type = BdatType::Beam;
} else if (byteData == 0x11) {
type = BdatType::Harmony;
} else if (byteData == 0x12) {
type = BdatType::Clef;
} else if (byteData == 0x13) {
type = BdatType::Wedge;
} else if (byteData == 0x14) {
type = BdatType::Dynamics;
} else if (byteData == 0x15) {
type = BdatType::Glissando;
} else if (byteData == 0x16) {
type = BdatType::Decorator;
} else if (byteData == 0x17) {
type = BdatType::Key;
} else if (byteData == 0x18) {
type = BdatType::Lyric;
} else if (byteData == 0x19) {
type = BdatType::Octave_Shift;
} else if (byteData == 0x1B) {
type = BdatType::Slur;
} else if (byteData == 0x1D) {
type = BdatType::Text;
} else if (byteData == 0x1E) {
type = BdatType::Tie;
} else if (byteData == 0x1F) {
type = BdatType::Tuplet;
} else if (byteData == 0x21) {
type = BdatType::Guitar_Bend;
} else if (byteData == 0x22) {
type = BdatType::Guitar_Barre;
} else if (byteData == 0x23) {
type = BdatType::Pedal;
} else if (byteData == 0x24) {
type = BdatType::KuoHao;
} else if (byteData == 0x25) {
type = BdatType::Expressions;
} else if (byteData == 0x26) {
type = BdatType::Harp_Pedal;
} else if (byteData == 0x27) {
type = BdatType::Multi_Measure_Rest;
} else if (byteData == 0x28) {
type = BdatType::Harmony_GuitarFrame;
} else if (byteData == 0x40) {
type = BdatType::Graphics_40;
} else if (byteData == 0x41) {
type = BdatType::Graphics_RoundRect;
} else if (byteData == 0x42) {
type = BdatType::Graphics_Rect;
} else if (byteData == 0x43) {
type = BdatType::Graphics_Round;
} else if (byteData == 0x44) {
type = BdatType::Graphics_Line;
} else if (byteData == 0x45) {
type = BdatType::Graphics_Curve;
} else if (byteData == 0x46) {
type = BdatType::Graphics_WedgeSymbol;
} else if (byteData == 0xAB) {
type = BdatType::Midi_Controller;
} else if (byteData == 0xAC) {
type = BdatType::Midi_Program_Change;
} else if (byteData == 0xAD) {
type = BdatType::Midi_Channel_Pressure;
} else if (byteData == 0xAE) {
type = BdatType::Midi_Pitch_Wheel;
} else if (byteData == 0xFF) {
type = BdatType::Bar_End;
} else {
return false;
}
return true;
}
///////////////////////////////////////////////////////////////////////////////
LyricChunkParse::LyricChunkParse(OveSong* ove) :
BasicParse(ove) {
}
void LyricChunkParse::setLyricChunk(SizeChunk* chunk) {
chunk_ = chunk;
}
// only ove3 has this chunk
bool LyricChunkParse::parse() {
unsigned int i;
Block* dataBlock = chunk_->getDataBlock();
unsigned int blockSize = chunk_->getSizeBlock()->toSize();
StreamHandle handle(dataBlock->data(), blockSize);
Block placeHolder;
handle_ = &handle;
if( !jump(4) ) { return false; }
// Lyric count
if( !readBuffer(placeHolder, 2) ) { return false; }
unsigned int count = placeHolder.toUnsignedInt();
for( i=0; i<count; ++i ) {
LyricInfo info;
if( !readBuffer(placeHolder, 2) ) { return false; }
//unsigned int size = placeHolder.toUnsignedInt();
// 0x0D00
if( !jump(2) ) { return false; }
// voice
if( !readBuffer(placeHolder, 1) ) { return false; }
info.voice_ = placeHolder.toUnsignedInt();
// verse
if( !readBuffer(placeHolder, 1) ) { return false; }
info.verse_ = placeHolder.toUnsignedInt();
// track
if( !readBuffer(placeHolder, 1) ) { return false; }
info.track_ = placeHolder.toUnsignedInt();
if( !jump(1) ) { return false; }
// measure
if( !readBuffer(placeHolder, 2) ) { return false; }
info.measure_ = placeHolder.toUnsignedInt();
// word count
if( !readBuffer(placeHolder, 2) ) { return false; }
info.wordCount_ = placeHolder.toUnsignedInt();
// lyric size
if( !readBuffer(placeHolder, 2) ) { return false; }
info.lyricSize_ = placeHolder.toUnsignedInt();
if( !jump(6) ) { return false; }
// name
if( !readBuffer(placeHolder, 32) ) { return false; }
info.name_ = ove_->getCodecString(placeHolder.fixedSizeBufferToStrByteArray());
if( info.lyricSize_ > 0 ) {
// lyric
if( info.lyricSize_ > 0 ) {
if( !readBuffer(placeHolder, info.lyricSize_) ) { return false; }
info.lyric_ = ove_->getCodecString(placeHolder.fixedSizeBufferToStrByteArray());
}
if( !jump(4) ) { return false; }
// font
if( !readBuffer(placeHolder, 2) ) { return false; }
info.font_ = placeHolder.toUnsignedInt();
if( !jump(1) ) { return false; }
// font size
if( !readBuffer(placeHolder, 1) ) { return false; }
info.fontSize_ = placeHolder.toUnsignedInt();
// font style
if( !readBuffer(placeHolder, 1) ) { return false; }
info.fontStyle_ = placeHolder.toUnsignedInt();
if( !jump(1) ) { return false; }
for( int j=0; j<info.wordCount_; ++j ) {
if( !jump(8) ) { return false; }
}
}
processLyricInfo(info);
}
return true;
}
bool isSpace(char c) {
return c == ' ' || c == '\n';
}
void LyricChunkParse::processLyricInfo(const LyricInfo& info) {
int i;
int j;
int index = 0; //words
int measureId = info.measure_-1;
bool changeMeasure = true;
MeasureData* measureData = 0;
int trackMeasureCount = ove_->getTrackBarCount();
QStringList words = info.lyric_.split(" ", QString::SkipEmptyParts);
while ( index < words.size() && measureId+1 < trackMeasureCount ) {
if( changeMeasure ) {
++measureId;
measureData = ove_->getMeasureData(info.track_, measureId);
changeMeasure = false;
}
if( measureData == 0 ) { return; }
QList<NoteContainer*> containers = measureData->getNoteContainers();
QList<MusicData*> lyrics = measureData->getMusicDatas(MusicDataType::Lyric);
for( i=0; i<containers.size() && index<words.size(); ++i ) {
if( containers[i]->getIsRest() ) {
continue;
}
for( j=0; j<lyrics.size(); ++j ) {
Lyric* lyric = dynamic_cast<Lyric*>(lyrics[j]);
if( containers[i]->start()->getOffset() == lyric->start()->getOffset() &&
(int)containers[i]->getVoice() == info.voice_ &&
lyric->getVerse() == info.verse_ ) {
if(index<words.size()) {
QString l = words[index].trimmed();
if(!l.isEmpty()) {
lyric->setLyric(l);
lyric->setVoice(info.voice_);
}
}
++index;
}
}
}
changeMeasure = true;
}
}
///////////////////////////////////////////////////////////////////////////////
TitleChunkParse::TitleChunkParse(OveSong* ove) :
BasicParse(ove) {
titleType_ = 0x00000001;
annotateType_ = 0x00010000;
writerType_ = 0x00020002;
copyrightType_ = 0x00030001;
headerType_ = 0x00040000;
footerType_ = 0x00050002;
}
void TitleChunkParse::setTitleChunk(SizeChunk* chunk) {
chunk_ = chunk;
}
QByteArray getByteArray(const Block& block) {
QByteArray array((char*)block.data(), block.size());
int index0 = array.indexOf('\0');
array = array.left(index0);
return array;
}
bool TitleChunkParse::parse() {
Block* dataBlock = chunk_->getDataBlock();
unsigned int blockSize = chunk_->getSizeBlock()->toSize();
StreamHandle handle(dataBlock->data(), blockSize);
Block typeBlock;
unsigned int titleType;
handle_ = &handle;
if( !readBuffer(typeBlock, 4) ) { return false; }
titleType = typeBlock.toUnsignedInt();
if( titleType == titleType_ || titleType == annotateType_ || titleType == writerType_ || titleType == copyrightType_ ) {
Block offsetBlock;
if( !readBuffer(offsetBlock, 4) ) { return false; }
const unsigned int itemCount = 4;
unsigned int i;
for( i=0; i<itemCount; ++i ) {
if( i>0 ) {
//0x 00 AB 00 0C 00 00
if( !jump(6) ) { return false; }
}
Block countBlock;
if( !readBuffer(countBlock, 2) ) { return false; }
unsigned int titleSize = countBlock.toUnsignedInt();
Block dataBlock;
if( !readBuffer(dataBlock, titleSize) ) { return false; }
QByteArray array = getByteArray(dataBlock);
if(!array.isEmpty()) {
addToOve(ove_->getCodecString(array), titleType);
}
}
return true;
}
if( titleType == headerType_ || titleType == footerType_ ) {
if( !jump(10) ) { return false; }
Block countBlock;
if( !readBuffer(countBlock, 2) ) { return false; }
unsigned int titleSize = countBlock.toUnsignedInt();
Block dataBlock;
if( !readBuffer(dataBlock, titleSize) ) { return false; }
QByteArray array = getByteArray(dataBlock);
addToOve(ove_->getCodecString(array), titleType);
//0x 00 AB 00 0C 00 00
if( !jump(6) ) { return false; }
return true;
}
return false;
}
void TitleChunkParse::addToOve(const QString& str, unsigned int titleType) {
if( str.isEmpty() ) { return; }
if (titleType == titleType_) {
ove_->addTitle(str);
}
if (titleType == annotateType_) {
ove_->addAnnotate(str);
}
if (titleType == writerType_) {
ove_->addWriter(str);
}
if (titleType == copyrightType_) {
ove_->addCopyright(str);
}
if (titleType == headerType_) {
ove_->addHeader(str);
}
if (titleType == footerType_) {
ove_->addFooter(str);
}
}
// OveOrganize.cpp
OveOrganizer::OveOrganizer(OveSong* ove) {
ove_ = ove;
}
void OveOrganizer::organize() {
if(ove_ == NULL) {
return;
}
organizeTracks();
organizeAttributes();
organizeMeasures();
}
void OveOrganizer::organizeAttributes() {
int i;
int j;
int k;
// key
if(ove_->getLineCount() > 0) {
Line* line = ove_->getLine(0);
int partBarCount = ove_->getPartBarCount();
int lastKey = 0;
if(line != 0){
for(i=0; i<line->getStaffCount(); ++i) {
QPair<int, int> partStaff = ove_->trackToPartStaff(i);
Staff* staff = line->getStaff(i);
lastKey = staff->getKeyType();
for(j=0; j<partBarCount; ++j) {
MeasureData* measureData = ove_->getMeasureData(partStaff.first, partStaff.second, j);
if(measureData != 0) {
Key* key = measureData->getKey();
if( j==0 ) {
key->setKey(lastKey);
key->setPreviousKey(lastKey);
}
if( !key->getSetKey() ) {
key->setKey(lastKey);
key->setPreviousKey(lastKey);
}
else {
if( key->getKey() != lastKey ) {
lastKey = key->getKey();
}
}
}
}
}
}
}
// clef
if( ove_->getLineCount() > 0 ) {
Line* line = ove_->getLine(0);
int partBarCount = ove_->getPartBarCount();
ClefType lastClefType = ClefType::Treble;
if(line != 0){
for( i=0; i<line->getStaffCount(); ++i ) {
QPair<int, int> partStaff = ove_->trackToPartStaff(i);
Staff* staff = line->getStaff(i);
lastClefType = staff->getClefType();
for( j=0; j<partBarCount; ++j ) {
MeasureData* measureData = ove_->getMeasureData(partStaff.first, partStaff.second, j);
if(measureData != 0) {
Clef* clefPtr = measureData->getClef();
clefPtr->setClefType((int)lastClefType);
const QList<MusicData*>& clefs = measureData->getMusicDatas(MusicDataType::Clef);
for( k=0; k<clefs.size(); ++k ) {
Clef* clef = dynamic_cast<Clef*>(clefs[k]);
lastClefType = clef->getClefType();
}
}
}
}
}
}
}
Staff* getStaff(OveSong* ove, int track) {
if (ove->getLineCount() > 0) {
Line* line = ove->getLine(0);
if(line != 0 && line->getStaffCount() > 0) {
Staff* staff = line->getStaff(track);
return staff;
}
}
return 0;
}
void OveOrganizer::organizeTracks() {
int i;
//QList<QPair<ClefType, int> > trackChannels;
QList<Track*> tracks = ove_->getTracks();
QList<bool> comboStaveStarts;
for( i=0; i<tracks.size(); ++i ) {
comboStaveStarts.push_back(false);
}
for( i=0; i<tracks.size(); ++i ) {
Staff* staff = getStaff(ove_, i);
if(staff != 0) {
if(staff->getGroupType() == GroupType::Brace && staff->getGroupStaffCount() == 1 ) {
comboStaveStarts[i] = true;
}
}
/*if( i < tracks.size() - 1 ) {
if( tracks[i]->getStartClef() == ClefType::Treble &&
tracks[i+1]->getStartClef() == ClefType::Bass &&
tracks[i]->getChannel() == tracks[i+1]->get_channel() ) {
}
}*/
}
int trackId = 0;
QList<int> partStaffCounts;
while( trackId < (int)tracks.size() ) {
int partTrackCount = 1;
if( comboStaveStarts[trackId] ) {
partTrackCount = 2;
}
partStaffCounts.push_back(partTrackCount);
trackId += partTrackCount;
}
ove_->setPartStaffCounts(partStaffCounts);
}
void OveOrganizer::organizeMeasures() {
int trackBarCount = ove_->getTrackBarCount();
for( int i=0; i<ove_->getPartCount(); ++i ) {
int partStaffCount = ove_->getStaffCount(i);
for( int j=0; j<partStaffCount; ++j ) {
for( int k=0; k<trackBarCount; ++k ) {
Measure* measure = ove_->getMeasure(k);
MeasureData* measureData = ove_->getMeasureData(i, j, k);
organizeMeasure(i, j, measure, measureData);
}
}
}
}
void OveOrganizer::organizeMeasure(int part, int track, Measure* measure, MeasureData* measureData) {
// note containers
organizeContainers(part, track, measure, measureData);
// single end data
organizeMusicDatas(part, track, measure, measureData);
// cross measure elements
organizeCrossMeasureElements(part, track, measure, measureData);
}
void addToList(QList<int>& list, int number) {
for(int i=0; i<list.size(); ++i){
if(list[i] == number){
return;
}
}
list.push_back(number);
}
void OveOrganizer::organizeContainers(int /*part*/, int /*track*/,
Measure* measure, MeasureData* measureData) {
int i;
QList<NoteContainer*> containers = measureData->getNoteContainers();
int barUnits = measure->getTime()->getUnits();
QList<int> voices;
for(i=0; i<containers.size(); ++i){
int endUnit = barUnits;
if( i < containers.size() - 1 ) {
endUnit = containers[i+1]->start()->getOffset();
}
containers[i]->stop()->setOffset(endUnit);
addToList(voices, containers[i]->getVoice());
}
// shift voices
qSort(voices.begin(), voices.end());
for (i = 0; i < voices.size(); ++i) {
int voice = voices[i];
// voice -> i
for(int j=0; j<(int)containers.size(); ++j) {
int avoice = containers[j]->getVoice();
if ( avoice == voice && avoice != i ) {
containers[j]->setVoice(i);
}
}
}
}
void OveOrganizer::organizeMusicDatas(int /*part*/, int /*track*/, Measure* measure, MeasureData* measureData) {
int i;
int barIndex = measure->getBarNumber()->getIndex();
QList<MusicData*> datas = measureData->getMusicDatas(MusicDataType::None);
for(i=0; i<datas.size(); ++i) {
datas[i]->start()->setMeasure(barIndex);
}
}
void OveOrganizer::organizeCrossMeasureElements(int part, int track, Measure* measure, MeasureData* measureData) {
int i;
QList<MusicData*> pairs = measureData->getCrossMeasureElements(MusicDataType::None, MeasureData::PairType::Start);
for(i=0; i<pairs.size(); ++i) {
MusicData* pair = pairs[i];
switch ( pair->getMusicDataType() ) {
case MusicDataType::Beam :
case MusicDataType::Glissando :
case MusicDataType::Slur :
case MusicDataType::Tie :
case MusicDataType::Tuplet :
case MusicDataType::Pedal :
case MusicDataType::Numeric_Ending :
//case MusicDataType::OctaveShift_EndPoint :
case MusicDataType::Measure_Repeat : {
organizePairElement(pair, part, track, measure, measureData);
break;
}
case MusicDataType::OctaveShift : {
OctaveShift* octave = dynamic_cast<OctaveShift*>(pair);
organizeOctaveShift(octave, measure, measureData);
break;
}
case MusicDataType::Wedge : {
Wedge* wedge = dynamic_cast<Wedge*>(pair);
organizeWedge(wedge, part, track, measure, measureData);
break;
}
default:
break;
}
}
}
void OveOrganizer::organizePairElement(
MusicData* data,
int part,
int track,
Measure* measure,
MeasureData* measureData) {
int bar1Index = measure->getBarNumber()->getIndex();
int bar2Index = bar1Index + data->stop()->getMeasure();
MeasureData* measureData2 = ove_->getMeasureData(part, track, bar2Index);
data->start()->setMeasure(bar1Index);
if(measureData2 != 0 && measureData != measureData2) {
measureData2->addCrossMeasureElement(data, false);
}
if( data->getMusicDataType() == MusicDataType::Tuplet ){
Tuplet* tuplet = dynamic_cast<Tuplet*>(data);
const QList<NoteContainer*> containers = measureData->getNoteContainers();
for(int i=0; i<containers.size(); ++i){
if(containers[i]->getTick() > tuplet->getTick()){
break;
}
if(containers[i]->getTick() == tuplet->getTick()){
tuplet->setNoteType(containers[i]->getNoteType());
}
}
int tupletTick = NoteTypeToTick(tuplet->getNoteType(), ove_->getQuarter())*tuplet->getSpace();
if( tuplet->getTick() % tupletTick != 0 ) {
int newStartTick = (tuplet->getTick() / tupletTick) * tupletTick;
for(int i=0; i<containers.size(); ++i){
if( containers[i]->getTick() == newStartTick &&
containers[i]->getTuplet() == tuplet->getTuplet()) {
tuplet->setTick(containers[i]->getTick());
tuplet->start()->setOffset(containers[i]->start()->getOffset());
}
}
}
}
}
void OveOrganizer::organizeOctaveShift(
OctaveShift* octave,
Measure* measure,
MeasureData* measureData) {
// octave shift
int i;
const QList<NoteContainer*> containers = measureData->getNoteContainers();
int barIndex = measure->getBarNumber()->getIndex();
octave->start()->setMeasure(barIndex);
for(i=0; i<containers.size(); ++i) {
int noteShift = octave->getNoteShift();
int containerTick = containers[i]->getTick();
if( octave->getTick() <= containerTick && octave->getEndTick() > containerTick ) {
containers[i]->setNoteShift(noteShift);
}
}
}
bool getMiddleUnit(
OveSong* ove, int /*part*/, int /*track*/,
Measure* measure1, Measure* measure2, int unit1, int /*unit2*/,
Measure* middleMeasure, int& middleUnit) {
Q_UNUSED(middleMeasure); // avoid (bogus?) warning to show up
QList<int> barUnits;
int i;
int bar1Index = measure1->getBarNumber()->getIndex();
int bar2Index = measure2->getBarNumber()->getIndex();
int sumUnit = 0;
for( int j=bar1Index; j<=bar2Index; ++j ) {
Measure* measure = ove->getMeasure(j);
barUnits.push_back(measure->getTime()->getUnits());
sumUnit += measure->getTime()->getUnits();
}
int currentSumUnit = 0;
for( i=0; i<barUnits.size(); ++i ) {
int barUnit = barUnits[i];
if( i==0 ) {
barUnit = barUnits[i] - unit1;
}
if( currentSumUnit + barUnit < sumUnit/2 ) {
currentSumUnit += barUnit;
}
else {
break;
}
}
if( i < barUnits.size() ) {
int barMiddleIndex = bar1Index + i;
middleMeasure = ove->getMeasure(barMiddleIndex);
middleUnit = sumUnit/2 - currentSumUnit;
return true;
}
return false;
}
void OveOrganizer::organizeWedge(Wedge* wedge, int part, int track, Measure* measure, MeasureData* measureData) {
int bar1Index = measure->getBarNumber()->getIndex();
int bar2Index = bar1Index + wedge->stop()->getMeasure();
MeasureData* measureData2 = ove_->getMeasureData(part, track, bar2Index);
WedgeType wedgeType = wedge->getWedgeType();
if( wedge->getWedgeType() == WedgeType::Double_Line ) {
wedgeType = WedgeType::Cres_Line;
}
wedge->start()->setMeasure(bar1Index);
WedgeEndPoint* startPoint = new WedgeEndPoint();
measureData->addMusicData(startPoint);
startPoint->setTick(wedge->getTick());
startPoint->start()->setOffset(wedge->start()->getOffset());
startPoint->setWedgeStart(true);
startPoint->setWedgeType(wedgeType);
startPoint->setHeight(wedge->getHeight());
WedgeEndPoint* stopPoint = new WedgeEndPoint();
stopPoint->setTick(wedge->getTick());
stopPoint->start()->setOffset(wedge->stop()->getOffset());
stopPoint->setWedgeStart(false);
stopPoint->setWedgeType(wedgeType);
stopPoint->setHeight(wedge->getHeight());
if(measureData2 != 0) {
measureData2->addMusicData(stopPoint);
}
if( wedge->getWedgeType() == WedgeType::Double_Line ) {
Measure* middleMeasure = NULL;
int middleUnit = 0;
getMiddleUnit(
ove_, part, track,
measure, ove_->getMeasure(bar2Index),
wedge->start()->getOffset(), wedge->stop()->getOffset(),
middleMeasure, middleUnit);
if( middleMeasure != 0 ) {
WedgeEndPoint* midStopPoint = new WedgeEndPoint();
measureData->addMusicData(midStopPoint);
midStopPoint->setTick(wedge->getTick());
midStopPoint->start()->setOffset(middleUnit);
midStopPoint->setWedgeStart(false);
midStopPoint->setWedgeType(WedgeType::Cres_Line);
midStopPoint->setHeight(wedge->getHeight());
WedgeEndPoint* midStartPoint = new WedgeEndPoint();
measureData->addMusicData(midStartPoint);
midStartPoint->setTick(wedge->getTick());
midStartPoint->start()->setOffset(middleUnit);
midStartPoint->setWedgeStart(true);
midStartPoint->setWedgeType(WedgeType::Decresc_Line);
midStartPoint->setHeight(wedge->getHeight());
}
}
}
// OveSerialize.cpp
enum class ChunkType : char {
OVSC = 00 ,
TRKL,
TRAK,
PAGL,
PAGE,
LINL,
LINE,
STAF,
BARL,
MEAS,
COND,
BDAT,
PACH,
FNTS,
ODEV,
TITL,
ALOT,
ENGR,
FMAP,
PCPR,
// Overture 3.6
LYRC,
NONE
};
ChunkType nameToChunkType(const NameBlock& name) {
ChunkType type = ChunkType::NONE;
if (name.isEqual("OVSC")) {
type = ChunkType::OVSC;
} else if (name.isEqual("TRKL")) {
type = ChunkType::TRKL;
} else if (name.isEqual("TRAK")) {
type = ChunkType::TRAK;
} else if (name.isEqual("PAGL")) {
type = ChunkType::PAGL;
} else if (name.isEqual("PAGE")) {
type = ChunkType::PAGE;
} else if (name.isEqual("LINL")) {
type = ChunkType::LINL;
} else if (name.isEqual("LINE")) {
type = ChunkType::LINE;
} else if (name.isEqual("STAF")) {
type = ChunkType::STAF;
} else if (name.isEqual("BARL")) {
type = ChunkType::BARL;
} else if (name.isEqual("MEAS")) {
type = ChunkType::MEAS;
} else if (name.isEqual("COND")) {
type = ChunkType::COND;
} else if (name.isEqual("BDAT")) {
type = ChunkType::BDAT;
} else if (name.isEqual("PACH")) {
type = ChunkType::PACH;
} else if (name.isEqual("FNTS")) {
type = ChunkType::FNTS;
} else if (name.isEqual("ODEV")) {
type = ChunkType::ODEV;
} else if (name.isEqual("TITL")) {
type = ChunkType::TITL;
} else if (name.isEqual("ALOT")) {
type = ChunkType::ALOT;
} else if (name.isEqual("ENGR")) {
type = ChunkType::ENGR;
} else if (name.isEqual("FMAP")) {
type = ChunkType::FMAP;
} else if (name.isEqual("PCPR")) {
type = ChunkType::PCPR;
} else if (name.isEqual("LYRC")) {
type = ChunkType::LYRC;
}
return type;
}
int chunkTypeToMaxTimes(ChunkType type) {
int maxTimes = -1; // no limit
switch (type) {
case ChunkType::OVSC: {
maxTimes = 1;
break;
}
case ChunkType::TRKL: {// case ChunkType::TRAK :
maxTimes = 1;
break;
}
case ChunkType::PAGL: {// case ChunkType::PAGE :
maxTimes = 1;
break;
}
// case ChunkType::LINE :
// case ChunkType::STAF :
case ChunkType::LINL: {
maxTimes = 1;
break;
}
// case ChunkType::MEAS :
// case ChunkType::COND :
// case ChunkType::BDAT :
case ChunkType::BARL: {
maxTimes = 1;
break;
}
case ChunkType::PACH:
case ChunkType::FNTS:
case ChunkType::ODEV:
case ChunkType::ALOT:
case ChunkType::ENGR:
case ChunkType::FMAP:
case ChunkType::PCPR: {
maxTimes = 1;
break;
}
case ChunkType::TITL: {
maxTimes = 8;
break;
}
case ChunkType::LYRC: {
maxTimes = 1;
break;
}
// case ChunkType::NONE :
default:
break;
}
return maxTimes;
}
///////////////////////////////////////////////////////////////////////////////////////////
OveSerialize::OveSerialize() :
ove_(0),
streamHandle_(0),
notify_(0) {
}
OveSerialize::~OveSerialize() {
if(streamHandle_ != 0) {
delete streamHandle_;
streamHandle_ = 0;
}
}
void OveSerialize::setOve(OveSong* ove) {
ove_ = ove;
}
void OveSerialize::setFileStream(unsigned char* buffer, unsigned int size) {
streamHandle_ = new StreamHandle(buffer, size);
}
void OveSerialize::setNotify(IOveNotify* notify) {
notify_ = notify;
}
void OveSerialize::messageOutError() {
if (notify_ != NULL) {
notify_->loadError();
}
}
void OveSerialize::messageOut(const QString& str) {
if (notify_ != NULL) {
notify_->loadInfo(str);
}
}
bool OveSerialize::load(void) {
if(streamHandle_ == 0)
return false;
if( !readHeader() ) {
messageOutError();
return false;
}
unsigned int i;
QMap<ChunkType, int> chunkTimes;
//bool firstEnter = true;
for( i=(int)ChunkType::OVSC; i<(int)ChunkType::NONE; ++i ) {
chunkTimes[(ChunkType)i] = 0;
}
ChunkType chunkType = ChunkType::NONE;
do {
NameBlock nameBlock;
SizeChunk sizeChunk;
if( !readNameBlock(nameBlock) ) { return false; }
chunkType = nameToChunkType(nameBlock);
++chunkTimes[chunkType];
int maxTime = chunkTypeToMaxTimes(chunkType);
if( maxTime > 0 && chunkTimes[chunkType] > maxTime ) {
messageOut("format not support, chunk appear more than accept.\n");
return false;
}
switch (chunkType) {
/*case ChunkType::OVSC :
{
if( !readHeadData(&sizeChunk) )
{
messageOut_error();
return false;
}
break;
}*/
case ChunkType::TRKL: {
if (!readTracksData()) {
messageOutError();
return false;
}
break;
}
case ChunkType::PAGL: {
if (!readPagesData()) {
messageOutError();
return false;
}
break;
}
case ChunkType::LINL: {
if (!readLinesData()) {
messageOutError();
return false;
}
break;
}
case ChunkType::BARL: {
if (!readBarsData()) {
messageOutError();
return false;
}
break;
}
case ChunkType::TRAK:
case ChunkType::PAGE:
case ChunkType::LINE:
case ChunkType::STAF:
case ChunkType::MEAS:
case ChunkType::COND:
case ChunkType::BDAT: {
return false;
break;
}
case ChunkType::LYRC: {
SizeChunk lyricChunk;
if (!readSizeChunk(&lyricChunk)) {
messageOutError();
return false;
}
LyricChunkParse parse(ove_);
parse.setLyricChunk(&lyricChunk);
parse.parse();
break;
}
case ChunkType::TITL: {
SizeChunk titleChunk;
if (!readSizeChunk(&titleChunk)) {
messageOutError();
return false;
}
TitleChunkParse titleChunkParse(ove_);
titleChunkParse.setTitleChunk(&titleChunk);
titleChunkParse.parse();
break;
}
case ChunkType::PACH:
case ChunkType::FNTS:
case ChunkType::ODEV:
case ChunkType::ALOT:
case ChunkType::ENGR:
case ChunkType::FMAP:
case ChunkType::PCPR: {
if (!readSizeChunk(&sizeChunk)) {
messageOutError();
return false;
}
break;
}
default:
/*if( firstEnter )
{
QString info = "Not compatible file, try to load and save with newer version, Overture 4 is recommended.\n";
messageOut(info);
messageOutError();
return false;
}*/
break;
}
//firstEnter = false;
}
while ( chunkType != ChunkType::NONE );
// if( !readOveEnd() ) { return false; }
// organize OveData
OVE::OveOrganizer organizer(ove_);
organizer.organize();
return true;
}
void OveSerialize::release() {
delete this;
}
bool OveSerialize::readHeader() {
ChunkType chunkType = ChunkType::NONE;
NameBlock nameBlock;
SizeChunk sizeChunk;
if (!readNameBlock(nameBlock)) {
return false;
}
chunkType = nameToChunkType(nameBlock);
//int maxTime = chunkTypeToMaxTimes(chunkType);
if (chunkType == ChunkType::OVSC) {
if (readHeadData(&sizeChunk)) {
return true;
}
}
QString info = "Not compatible file, try to load and save with newer version, Overture 4 is recommended.\n";
messageOut(info);
return false;
}
bool OveSerialize::readHeadData(SizeChunk* ovscChunk) {
if (!readSizeChunk(ovscChunk))
return false;
OvscParse ovscParse(ove_);
ovscParse.setNotify(notify_);
ovscParse.setOvsc(ovscChunk);
return ovscParse.parse();
}
bool OveSerialize::readTracksData() {
GroupChunk trackGroupChunk;
if (!readGroupChunk(&trackGroupChunk))
return false;
unsigned int i;
unsigned short trackCount = trackGroupChunk.getCountBlock()->toCount();
for (i = 0; i < trackCount; ++i) {
SizeChunk* trackChunk = new SizeChunk();
if (ove_->getIsVersion4()) {
if (!readChunkName(trackChunk, Chunk::TrackName)) {
return false;
}
if (!readSizeChunk(trackChunk)) {
return false;
}
} else {
if (!readDataChunk(trackChunk->getDataBlock(),
SizeChunk::version3TrackSize)) {
return false;
}
}
TrackParse trackParse(ove_);
trackParse.setTrack(trackChunk);
trackParse.parse();
}
return true;
}
bool OveSerialize::readPagesData() {
GroupChunk pageGroupChunk;
if (!readGroupChunk(&pageGroupChunk))
return false;
unsigned short pageCount = pageGroupChunk.getCountBlock()->toCount();
unsigned int i;
PageGroupParse parse(ove_);
for (i = 0; i < pageCount; ++i) {
SizeChunk* pageChunk = new SizeChunk();
if (!readChunkName(pageChunk, Chunk::PageName)) {
return false;
}
if (!readSizeChunk(pageChunk)) {
return false;
}
parse.addPage(pageChunk);
}
if (!parse.parse()) {
return false;
}
return true;
}
bool OveSerialize::readLinesData() {
GroupChunk lineGroupChunk;
if (!readGroupChunk(&lineGroupChunk))
return false;
unsigned short lineCount = lineGroupChunk.getCountBlock()->toCount();
int i;
unsigned int j;
QList<SizeChunk*> lineChunks;
QList<SizeChunk*> staffChunks;
for (i = 0; i < lineCount; ++i) {
SizeChunk* lineChunk = new SizeChunk();
if (!readChunkName(lineChunk, Chunk::LineName)) {
return false;
}
if (!readSizeChunk(lineChunk)) {
return false;
}
lineChunks.push_back(lineChunk);
StaffCountGetter getter(ove_);
unsigned int staffCount = getter.getStaffCount(lineChunk);
for (j = 0; j < staffCount; ++j) {
SizeChunk* staffChunk = new SizeChunk();
if (!readChunkName(staffChunk, Chunk::StaffName)) {
return false;
}
if (!readSizeChunk(staffChunk)) {
return false;
}
staffChunks.push_back(staffChunk);
}
}
LineGroupParse parse(ove_);
parse.setLineGroup(&lineGroupChunk);
for (i = 0; i < lineChunks.size(); ++i) {
parse.addLine(lineChunks[i]);
}
for (i = 0; i < staffChunks.size(); ++i) {
parse.addStaff(staffChunks[i]);
}
if (!parse.parse()) {
return false;
}
return true;
}
bool OveSerialize::readBarsData() {
GroupChunk barGroupChunk;
if (!readGroupChunk(&barGroupChunk))
return false;
unsigned short measCount = barGroupChunk.getCountBlock()->toCount();
int i;
QList<SizeChunk*> measureChunks;
QList<SizeChunk*> conductChunks;
QList<SizeChunk*> bdatChunks;
ove_->setTrackBarCount(measCount);
// read chunks
for (i = 0; i < measCount; ++i) {
SizeChunk* measureChunkPtr = new SizeChunk();
if (!readChunkName(measureChunkPtr, Chunk::MeasureName)) {
return false;
}
if (!readSizeChunk(measureChunkPtr)) {
return false;
}
measureChunks.push_back(measureChunkPtr);
}
for (i = 0; i < measCount; ++i) {
SizeChunk* conductChunkPtr = new SizeChunk();
if (!readChunkName(conductChunkPtr, Chunk::ConductName))
return false;
if (!readSizeChunk(conductChunkPtr))
return false;
conductChunks.push_back(conductChunkPtr);
}
int bdatCount = ove_->getTrackCount() * measCount;
for (i = 0; i < bdatCount; ++i) {
SizeChunk* batChunkPtr = new SizeChunk();
if (!readChunkName(batChunkPtr, Chunk::BdatName)) {
return false;
}
if (!readSizeChunk(batChunkPtr)) {
return false;
}
bdatChunks.push_back(batChunkPtr);
}
// parse bars
BarsParse barsParse(ove_);
for (i = 0; i < (int) measureChunks.size(); ++i) {
barsParse.addMeasure(measureChunks[i]);
}
for (i = 0; i < (int) conductChunks.size(); ++i) {
barsParse.addConduct(conductChunks[i]);
}
for (i = 0; i < (int) bdatChunks.size(); ++i) {
barsParse.addBdat(bdatChunks[i]);
}
barsParse.setNotify(notify_);
if (!barsParse.parse()) {
return false;
}
return true;
}
bool OveSerialize::readOveEnd() {
if (streamHandle_ == 0)
return false;
const unsigned int END_OVE1 = 0xffffffff;
const unsigned int END_OVE2 = 0x00000000;
unsigned int buffer;
if (!streamHandle_->read((char*) &buffer, sizeof(unsigned int)))
return false;
if (buffer != END_OVE1)
return false;
if (!streamHandle_->read((char*) &buffer, sizeof(unsigned int)))
return false;
if (buffer != END_OVE2)
return false;
return true;
}
/////////////////////////////////////////////////////////////////////////////////////////
bool OveSerialize::readNameBlock(NameBlock& nameBlock) {
if (streamHandle_ == 0)
return false;
if (!streamHandle_->read((char*) nameBlock.data(), nameBlock.size()))
return false;
return true;
}
bool OveSerialize::readChunkName(Chunk* /*chunk*/, const QString& name) {
if (streamHandle_ == 0)
return false;
NameBlock nameBlock;
if (!streamHandle_->read((char*) nameBlock.data(), nameBlock.size()))
return false;
if (!(nameBlock.toStrByteArray() == name))
return false;
return true;
}
bool OveSerialize::readSizeChunk(SizeChunk* sizeChunk) {
if (streamHandle_ == 0)
return false;
SizeBlock* sizeBlock = sizeChunk->getSizeBlock();
if (!streamHandle_->read((char*) sizeBlock->data(), sizeBlock->size()))
return false;
unsigned int blockSize = sizeBlock->toSize();
sizeChunk->getDataBlock()->resize(blockSize);
Block* dataBlock = sizeChunk->getDataBlock();
if (!streamHandle_->read((char*) dataBlock->data(), blockSize))
return false;
return true;
}
bool OveSerialize::readDataChunk(Block* block, unsigned int size) {
if (streamHandle_ == 0)
return false;
block->resize(size);
if (!streamHandle_->read((char*) block->data(), size))
return false;
return true;
}
bool OveSerialize::readGroupChunk(GroupChunk* groupChunk) {
if (streamHandle_ == 0)
return false;
CountBlock* countBlock = groupChunk->getCountBlock();
if (!streamHandle_->read((char*) countBlock->data(), countBlock->size()))
return false;
return true;
}
IOVEStreamLoader* createOveStreamLoader() {
return new OveSerialize;
}
}