summaryrefslogtreecommitdiff
path: root/muse2
diff options
context:
space:
mode:
Diffstat (limited to 'muse2')
-rw-r--r--muse2/muse/app.cpp1
-rw-r--r--muse2/muse/midiedit/scoreedit.cpp382
-rw-r--r--muse2/muse/midiedit/scoreedit.h50
-rw-r--r--muse2/muse/songfile.cpp10
4 files changed, 393 insertions, 50 deletions
diff --git a/muse2/muse/app.cpp b/muse2/muse/app.cpp
index 8def91ec..052bb48b 100644
--- a/muse2/muse/app.cpp
+++ b/muse2/muse/app.cpp
@@ -1892,6 +1892,7 @@ void MusE::loadProjectFile1(const QString& name, bool songTemplate, bool loadAll
song->updatePos();
clipboardChanged(); // enable/disable "Paste"
selectionChanged(); // enable/disable "Copy" & "Paste"
+ scoreNamingChanged(); // inform the score menus about the new scores and their names
progress->setValue(50);
// p3.3.53 Try this AFTER the song update above which does a mixer update... Tested OK - mixers resize properly now.
diff --git a/muse2/muse/midiedit/scoreedit.cpp b/muse2/muse/midiedit/scoreedit.cpp
index 71439600..cb94c5ff 100644
--- a/muse2/muse/midiedit/scoreedit.cpp
+++ b/muse2/muse/midiedit/scoreedit.cpp
@@ -19,8 +19,6 @@
#include <QApplication>
#include <QClipboard>
#include <QDir>
-#include <QAction>
-#include <QActionGroup>
#include <QKeySequence>
#include <QKeyEvent>
#include <QGridLayout>
@@ -140,7 +138,6 @@ QColor* mycolors; // array [NUM_MYCOLORS]
-int ScoreEdit::serial=1;
set<QString> ScoreEdit::names;
//---------------------------------------------------------
@@ -200,7 +197,7 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
undo_tools->addActions(undoRedo->actions());
addToolBar(undo_tools);
- EditToolBar* edit_tools = new EditToolBar(this, PointerTool | PencilTool | RubberTool);
+ edit_tools = new EditToolBar(this, PointerTool | PencilTool | RubberTool);
addToolBar(edit_tools);
edit_tools->set(PointerTool);
score_canvas->set_tool(PointerTool);
@@ -217,14 +214,14 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
QToolBar* newnote_toolbar = addToolBar(tr("New note settings"));
newnote_toolbar->setObjectName("New note settings");
newnote_toolbar->addWidget(new QLabel(tr("Note length:"), newnote_toolbar));
- QActionGroup* len_actions=new QActionGroup(this);
- QAction* n1_action = newnote_toolbar->addAction("1", menu_mapper, SLOT(map()));
- QAction* n2_action = newnote_toolbar->addAction("2", menu_mapper, SLOT(map()));
- QAction* n4_action = newnote_toolbar->addAction("4", menu_mapper, SLOT(map()));
- QAction* n8_action = newnote_toolbar->addAction("8", menu_mapper, SLOT(map()));
- QAction* n16_action = newnote_toolbar->addAction("16", menu_mapper, SLOT(map()));
- QAction* n32_action = newnote_toolbar->addAction("32", menu_mapper, SLOT(map()));
- QAction* nlast_action = newnote_toolbar->addAction(tr("last"), menu_mapper, SLOT(map()));
+ len_actions=new QActionGroup(this);
+ n1_action = newnote_toolbar->addAction("1", menu_mapper, SLOT(map()));
+ n2_action = newnote_toolbar->addAction("2", menu_mapper, SLOT(map()));
+ n4_action = newnote_toolbar->addAction("4", menu_mapper, SLOT(map()));
+ n8_action = newnote_toolbar->addAction("8", menu_mapper, SLOT(map()));
+ n16_action = newnote_toolbar->addAction("16", menu_mapper, SLOT(map()));
+ n32_action = newnote_toolbar->addAction("32", menu_mapper, SLOT(map()));
+ nlast_action = newnote_toolbar->addAction(tr("last"), menu_mapper, SLOT(map()));
menu_mapper->setMapping(n1_action, CMD_NOTELEN_1);
menu_mapper->setMapping(n2_action, CMD_NOTELEN_2);
menu_mapper->setMapping(n4_action, CMD_NOTELEN_4);
@@ -253,7 +250,7 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
newnote_toolbar->addSeparator();
newnote_toolbar->addWidget(new QLabel(tr("Velocity:"), newnote_toolbar));
- QSpinBox* velo_spinbox = new QSpinBox(this);
+ velo_spinbox = new QSpinBox(this);
velo_spinbox->setRange(0, 127);
velo_spinbox->setSingleStep(1);
connect(velo_spinbox, SIGNAL(valueChanged(int)), score_canvas, SLOT(set_newnote_velo(int)));
@@ -261,7 +258,7 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
velo_spinbox->setValue(64);
newnote_toolbar->addWidget(new QLabel(tr("Off-Velocity:"), newnote_toolbar));
- QSpinBox* velo_off_spinbox = new QSpinBox(this);
+ velo_off_spinbox = new QSpinBox(this);
velo_off_spinbox->setRange(0, 127);
velo_off_spinbox->setSingleStep(1);
connect(velo_off_spinbox, SIGNAL(valueChanged(int)), score_canvas, SLOT(set_newnote_velo_off(int)));
@@ -271,9 +268,9 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
QToolBar* quant_toolbar = addToolBar(tr("Quantisation settings"));
- newnote_toolbar->setObjectName("Quantisation settings");
+ quant_toolbar->setObjectName("Quantisation settings");
quant_toolbar->addWidget(new QLabel(tr("Quantisation:"), quant_toolbar));
- QComboBox* quant_combobox = new QComboBox(this);
+ quant_combobox = new QComboBox(this);
quant_combobox->addItem("2"); // if you add or remove items from
quant_combobox->addItem("4"); // here, also change quant_mapper[]
quant_combobox->addItem("8"); // in ScoreCanvas::set_quant()!
@@ -286,7 +283,7 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
quant_toolbar->addSeparator();
quant_toolbar->addWidget(new QLabel(tr("Pixels per whole:"), quant_toolbar));
- QSpinBox* px_per_whole_spinbox = new QSpinBox(this);
+ px_per_whole_spinbox = new QSpinBox(this);
px_per_whole_spinbox->setRange(10, 1200);
px_per_whole_spinbox->setSingleStep(50);
connect(px_per_whole_spinbox, SIGNAL(valueChanged(int)), score_canvas, SLOT(set_pixels_per_whole(int)));
@@ -297,10 +294,10 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
QMenu* settings_menu = menuBar()->addMenu(tr("&Settings"));
QMenu* color_menu = settings_menu->addMenu(tr("Note head &colors"));
- QActionGroup* color_actions = new QActionGroup(this);
- QAction* color_black_action = color_menu->addAction(tr("&Black"), menu_mapper, SLOT(map()));
- QAction* color_velo_action = color_menu->addAction(tr("&Velocity"), menu_mapper, SLOT(map()));
- QAction* color_part_action = color_menu->addAction(tr("&Part"), menu_mapper, SLOT(map()));
+ color_actions = new QActionGroup(this);
+ color_black_action = color_menu->addAction(tr("&Black"), menu_mapper, SLOT(map()));
+ color_velo_action = color_menu->addAction(tr("&Velocity"), menu_mapper, SLOT(map()));
+ color_part_action = color_menu->addAction(tr("&Part"), menu_mapper, SLOT(map()));
color_black_action->setCheckable(true);
color_velo_action->setCheckable(true);
color_part_action->setCheckable(true);
@@ -315,8 +312,8 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
menu_command(CMD_COLOR_BLACK);
QMenu* preamble_menu = settings_menu->addMenu(tr("Set up &preamble"));
- QAction* preamble_keysig_action = preamble_menu->addAction(tr("Display &key signature"));
- QAction* preamble_timesig_action = preamble_menu->addAction(tr("Display &time signature"));
+ preamble_keysig_action = preamble_menu->addAction(tr("Display &key signature"));
+ preamble_timesig_action = preamble_menu->addAction(tr("Display &time signature"));
connect(preamble_keysig_action, SIGNAL(toggled(bool)), score_canvas, SLOT(preamble_keysig_slot(bool)));
connect(preamble_timesig_action, SIGNAL(toggled(bool)), score_canvas, SLOT(preamble_timesig_slot(bool)));
@@ -340,7 +337,7 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos)
if (name!=NULL)
set_name(name, false, true);
else
- set_name("Score "+IntToQStr(serial++), false, true);
+ init_name();
}
@@ -349,6 +346,21 @@ void ScoreEdit::add_parts(PartList* pl, bool all_in_one)
score_canvas->add_staves(pl, all_in_one);
}
+void ScoreEdit::init_name()
+{
+ int no=1;
+ QString temp;
+
+ while (true)
+ {
+ temp="Score "+IntToQStr(no);
+ if (set_name(temp, false, false))
+ break;
+ else
+ no++;
+ }
+}
+
bool ScoreEdit::set_name(QString newname, bool emit_signal, bool emergency_name)
{
if (names.find(newname)==names.end())
@@ -445,12 +457,295 @@ void ScoreEdit::menu_command(int cmd)
QMessageBox::warning(this, tr("Error"), tr("Changing score title failed:\nthe selected title is not unique"));
}
}
+ break;
default:
score_canvas->menu_command(cmd);
}
}
+//---------------------------------------------------------
+// readPart
+//---------------------------------------------------------
+
+Part* readPart(Xml& xml, QString tag_name="part") //TODO FINDMICH: duplicated from songfile.cpp; only difference: "none" is supported
+{
+ Part* part = 0;
+
+ for (;;)
+ {
+ Xml::Token token = xml.parse();
+ const QString& tag = xml.s1();
+
+ switch (token)
+ {
+ case Xml::Error:
+ case Xml::End:
+ return part;
+
+ case Xml::Text:
+ {
+ int trackIdx, partIdx;
+ if (tag=="none")
+ part=NULL;
+ else
+ {
+ sscanf(tag.toLatin1().constData(), "%d:%d", &trackIdx, &partIdx);
+ Track* track = song->tracks()->index(trackIdx);
+ if (track)
+ part = track->parts()->find(partIdx);
+ }
+ }
+ break;
+
+ case Xml::TagStart:
+ xml.unknown("readPart");
+ break;
+
+ case Xml::TagEnd:
+ if (tag == tag_name)
+ return part;
+
+ default:
+ break;
+ }
+ }
+}
+
+
+
+void staff_t::read_status(Xml& xml)
+{
+ for (;;)
+ {
+ Xml::Token token = xml.parse();
+ if (token == Xml::Error || token == Xml::End)
+ break;
+ const QString& tag = xml.s1();
+ switch (token)
+ {
+ case Xml::TagStart:
+ if (tag == "type")
+ type = staff_type_t(xml.parseInt());
+ else if (tag == "clef")
+ clef = clef_t(xml.parseInt());
+ else if (tag == "part")
+ {
+ Part* part=readPart(xml);
+ if (part)
+ parts.insert(part);
+ else
+ cerr << "ERROR: THIS SHOULD NEVER HAPPEN: part is NULL while reading from xml" << endl;
+ }
+ else
+ xml.unknown("staff");
+ break;
+
+ case Xml::TagEnd:
+ if (tag == "staff")
+ return;
+
+ default:
+ break;
+ }
+ }
+}
+
+
+void staff_t::write_status(int level, Xml& xml) const
+{
+ xml.tag(level++, "staff");
+ xml.intTag(level, "type", type);
+ xml.intTag(level, "clef", clef);
+ for (set<Part*>::iterator part=parts.begin(); part!=parts.end(); part++)
+ {
+ Track* track = (*part)->track();
+ int trkIdx = song->tracks()->index(track);
+ int partIdx = track->parts()->index(*part);
+
+ if((trkIdx == -1) || (partIdx == -1))
+ cerr << "ERROR: staff_t::write_status: trkIdx:"<<trkIdx<<", partIdx:"<<partIdx<<endl;
+
+ xml.put(level, "<part>%d:%d</part>", trkIdx, partIdx);
+ }
+ xml.tag(level, "/staff");
+}
+
+//---------------------------------------------------------
+// writeStatus
+//---------------------------------------------------------
+
+void ScoreEdit::writeStatus(int level, Xml& xml) const
+{
+ xml.tag(level++, "scoreedit");
+ TopWin::writeStatus(level, xml);
+
+ xml.strTag(level, "name", name);
+ xml.intTag(level, "tool", edit_tools->curTool());
+ xml.intTag(level, "quantPower", score_canvas->quant_power2());
+ xml.intTag(level, "pxPerWhole", score_canvas->pixels_per_whole());
+ xml.intTag(level, "newNoteVelo", velo_spinbox->value());
+ xml.intTag(level, "newNoteVeloOff", velo_off_spinbox->value());
+ xml.intTag(level, "lastLen", score_canvas->get_last_len());
+
+ int len=0;
+ if (n1_action->isChecked())
+ len=1;
+ else if (n2_action->isChecked())
+ len=2;
+ else if (n4_action->isChecked())
+ len=4;
+ else if (n8_action->isChecked())
+ len=8;
+ else if (n16_action->isChecked())
+ len=16;
+ else if (n32_action->isChecked())
+ len=32;
+ else if (nlast_action->isChecked())
+ len=0; // means "last"
+
+ xml.intTag(level, "newLen", len);
+
+ int color=0;
+ if (color_black_action->isChecked())
+ color=0;
+ else if (color_velo_action->isChecked())
+ color=1;
+ else if (color_part_action->isChecked())
+ color=2;
+
+ xml.intTag(level, "noteColor", color);
+
+ xml.intTag(level, "xscroll", xscroll->value());
+ xml.intTag(level, "yscroll", yscroll->value());
+ xml.intTag(level, "preambleContainsKeysig", preamble_keysig_action->isChecked());
+ xml.intTag(level, "preambleContainsTimesig", preamble_timesig_action->isChecked());
+
+ Part* selected_part=score_canvas->get_selected_part();
+ if (selected_part==NULL)
+ {
+ xml.put(level, "<selectedPart>none</selectedPart>");
+ }
+ else
+ {
+ Track* track = selected_part->track();
+ int trkIdx = song->tracks()->index(track);
+ int partIdx = track->parts()->index(selected_part);
+
+ if((trkIdx == -1) || (partIdx == -1))
+ cerr << "ERROR: ScoreEdit::write_status: trkIdx:"<<trkIdx<<", partIdx:"<<partIdx<<endl;
+
+ xml.put(level, "<selectedPart>%d:%d</selectedPart>", trkIdx, partIdx);
+ }
+
+
+ score_canvas->write_staves(level,xml);
+
+ xml.tag(level, "/scoreedit");
+}
+
+void ScoreCanvas::write_staves(int level, Xml& xml) const
+{
+ for (list<staff_t>::const_iterator staff=staves.begin(); staff!=staves.end(); staff++)
+ staff->write_status(level, xml);
+}
+
+
+//---------------------------------------------------------
+// readStatus
+//---------------------------------------------------------
+
+void ScoreEdit::readStatus(Xml& xml)
+{
+ for (;;)
+ {
+ Xml::Token token = xml.parse();
+ if (token == Xml::Error || token == Xml::End)
+ break;
+
+ const QString& tag = xml.s1();
+ switch (token)
+ {
+ case Xml::TagStart:
+ if (tag == "name")
+ name = xml.parse1();
+ else if (tag == "tool")
+ edit_tools->set(xml.parseInt());
+ else if (tag == "quantPower")
+ quant_combobox->setCurrentIndex(xml.parseInt()-1);
+ else if (tag == "pxPerWhole")
+ px_per_whole_spinbox->setValue(xml.parseInt());
+ else if (tag == "newNoteVelo")
+ velo_spinbox->setValue(xml.parseInt());
+ else if (tag == "newNoteVeloOff")
+ velo_off_spinbox->setValue(xml.parseInt());
+ else if (tag == "lastLen")
+ score_canvas->set_last_len(xml.parseInt());
+ else if (tag == "newLen")
+ {
+ int val=xml.parseInt();
+ switch (val)
+ {
+ case 0: nlast_action->setChecked(true); break;
+ case 1: n1_action->setChecked(true); break;
+ case 2: n2_action->setChecked(true); break;
+ case 4: n4_action->setChecked(true); break;
+ case 8: n8_action->setChecked(true); break;
+ case 16: n16_action->setChecked(true); break;
+ case 32: n32_action->setChecked(true); break;
+ default:
+ cerr << "ERROR: THIS SHOULD NEVER HAPPEN. newLen is invalid in ScoreEdit::readStatus.\n" <<
+ " (newLen="<<val<<"; the only valid values are 0,1,2,4,8,16 and 32)\n" <<
+ " however, don't worry, this is no major problem, using 0 instead" << endl;
+ nlast_action->setChecked(true);
+ }
+ }
+ else if (tag == "noteColor")
+ {
+ int val=xml.parseInt();
+ switch (val)
+ {
+ case 0: color_black_action->setChecked(true); break;
+ case 1: color_velo_action->setChecked(true); break;
+ case 2: color_part_action->setChecked(true); break;
+ default:
+ cerr << "ERROR: THIS SHOULD NEVER HAPPEN. noteColor is invalid in ScoreEdit::readStatus.\n" <<
+ " (noteColor="<<val<<"; the only valid values are 0,1 and 2)\n" <<
+ " however, don't worry, this is no major problem, using 0 instead" << endl;
+ color_black_action->setChecked(true);
+ }
+ }
+ else if (tag == "xscroll")
+ xscroll->setValue(xml.parseInt());
+ else if (tag == "yscroll")
+ yscroll->setValue(xml.parseInt());
+ else if (tag == "preambleContainsKeysig")
+ preamble_keysig_action->setChecked(xml.parseInt());
+ else if (tag == "preambleContainsTimesig")
+ preamble_timesig_action->setChecked(xml.parseInt());
+ else if (tag == "topwin")
+ TopWin::readStatus(xml);
+ else if (tag == "selectedPart")
+ score_canvas->set_selected_part(readPart(xml, "selectedPart"));
+ else if (tag == "staff")
+ {
+ staff_t staff(score_canvas);
+ staff.read_status(xml);
+ score_canvas->push_back_staff(staff);
+ }
+ else
+ xml.unknown("ScoreEdit");
+ break;
+
+ case Xml::TagEnd:
+ if (tag == "scoreedit")
+ return;
+ default:
+ break;
+ }
+ }
+}
+
void ScoreCanvas::add_staves(PartList* pl, bool all_in_one)
@@ -464,8 +759,6 @@ void ScoreCanvas::add_staves(PartList* pl, bool all_in_one)
staff.parts.insert(part_it->second);
staff.cleanup_parts();
- staff.split_note=SPLIT_NOTE;
-
staff.type=GRAND_TOP; //FINDME_INITCLEF
staff.clef=VIOLIN;
staves.push_back(staff);
@@ -489,8 +782,6 @@ void ScoreCanvas::add_staves(PartList* pl, bool all_in_one)
staff.parts.insert(part_it->second);
staff.cleanup_parts();
- staff.split_note=SPLIT_NOTE;
-
staff.type=GRAND_TOP; //FINDME_INITCLEF
staff.clef=VIOLIN;
staves.push_back(staff);
@@ -626,9 +917,8 @@ void ScoreCanvas::set_staffmode(list<staff_t>::iterator it, staff_mode_t mode)
case MODE_BOTH:
it->type=GRAND_BOTTOM;
it->clef=BASS;
- it->split_note=SPLIT_NOTE;
- staves.insert(it, staff_t(this, GRAND_TOP, VIOLIN, it->parts, it->split_note));
+ staves.insert(it, staff_t(this, GRAND_TOP, VIOLIN, it->parts));
break;
default:
@@ -949,8 +1239,8 @@ void staff_t::create_appropriate_eventlist()
Event& event=it->second;
if ( (event.isNote() && !event.isNoteOff()) &&
- ( ((type==GRAND_TOP) && (event.pitch() >= split_note)) ||
- ((type==GRAND_BOTTOM) && (event.pitch() < split_note)) ||
+ ( ((type==GRAND_TOP) && (event.pitch() >= SPLIT_NOTE)) ||
+ ((type==GRAND_BOTTOM) && (event.pitch() < SPLIT_NOTE)) ||
(type==NORMAL) ) )
{
unsigned begin, end;
@@ -3481,33 +3771,39 @@ set<Part*> staff_t::parts_at_tick(unsigned tick)
* between, for example, when a cis is tied to a des
*
* CURRENT TODO
- * o clean up code (find TODOs)
- *
- * IMPORTANT TODO
* o save and restore window settings, automatically reopen windows
* after loading file etc
+ * o set window title properly
+ * o set initial window size properly
+ * o save and restore toolbar-position-settings
+ *
+ * IMPORTANT TODO
* o offer functions like in the pianoroll: quantize etc.
* o support selections
+ * o let the user select the distance between staves
+ * o add a select-clef-toolbox for tracks
+ * o respect the track's clef (has to be implemented first in muse)
*
* less important stuff
* o deal with expanding parts
* o do all the song_changed(SC_EVENT_INSERTED) properly
* o add tracks in correct order to score
- * o draw measure numbers
- * o use timesig_t in all timesig-stuff
* o use bars instead of flags over groups of 8ths / 16ths etc
* o support different keys in different tracks at the same time
* calc_pos_add_list and calc_item_pos will be affected by this
* calc_pos_add_list must be called before calc_item_pos then,
* and calc_item_pos must respect the pos_add_list instead of
* keeping its own pos_add variable (which is only an optimisation)
- * o draw a margin around notes which are in a bright color
+ *
+ * really unimportant nice-to-haves
+ * o clean up code (find TODOs)
+ * o support in-song clef-changes
+ * o draw measure numbers
+ * o use timesig_t in all timesig-stuff
* o refuse to resize so that width gets smaller or equal than x_left
- * o use the proper quantisation functions instead of
- * flo_quantize() and flo_quantize_floor()
- * o let the user set up SPLIT_NOTE
- * o let the user decide about the initial clef (search for FINDME_INITCLEF)
- *
+ * o draw a margin around notes which are in a bright color
+ *
+ *
* stuff for the other muse developers
* o process accurate timesignatures from muse's list (has to be implemented first in muse)
* ( (2+2+3)/4 or (3+2+2)/4 instead of 7/4 )
diff --git a/muse2/muse/midiedit/scoreedit.h b/muse2/muse/midiedit/scoreedit.h
index b68b637a..c0f51cc2 100644
--- a/muse2/muse/midiedit/scoreedit.h
+++ b/muse2/muse/midiedit/scoreedit.h
@@ -16,7 +16,10 @@
#include <QPixmap>
#include <QTimer>
#include <QScrollBar>
+#include <QComboBox>
#include <QSignalMapper>
+#include <QAction>
+#include <QActionGroup>
#include <values.h>
#include "noteinfo.h"
@@ -66,15 +69,40 @@ class ScoreEdit : public TopWin
private:
virtual void closeEvent(QCloseEvent*);
+
+ void init_name();
QGridLayout* mainGrid;
QWidget* mainw;
+ EditToolBar* edit_tools;
+ QSpinBox* velo_spinbox;
+ QSpinBox* velo_off_spinbox;
+
+ QComboBox* quant_combobox;
+ QSpinBox* px_per_whole_spinbox;
+
+ QAction* preamble_keysig_action;
+ QAction* preamble_timesig_action;
+
+ QActionGroup* len_actions;
+ QAction* n1_action;
+ QAction* n2_action;
+ QAction* n4_action;
+ QAction* n8_action;
+ QAction* n16_action;
+ QAction* n32_action;
+ QAction* nlast_action;
+
+ QActionGroup* color_actions;
+ QAction* color_black_action;
+ QAction* color_velo_action;
+ QAction* color_part_action;
+
QScrollBar* xscroll;
QScrollBar* yscroll;
ScoreCanvas* score_canvas;
- static int serial;
static set<QString> names;
QString name;
@@ -99,8 +127,8 @@ class ScoreEdit : public TopWin
public:
ScoreEdit(QWidget* parent = 0, const char* name = 0, unsigned initPos = MAXINT);
~ScoreEdit();
- static void readConfiguration(Xml&){}; //TODO does nothing
- static void writeConfiguration(int, Xml&){}; //TODO does nothing
+ void writeStatus(int level, Xml& xml) const;
+ void readStatus(Xml& xml);
void add_parts(PartList* pl, bool all_in_one=false);
QString get_name() { return name; }
@@ -438,7 +466,6 @@ struct staff_t
staff_type_t type;
clef_t clef;
- int split_note;
ScoreCanvas* parent;
@@ -462,11 +489,10 @@ struct staff_t
parent=parent_;
}
- staff_t (ScoreCanvas* parent_, staff_type_t type_, clef_t clef_, set<Part*> parts_, int split_note_=0)
+ staff_t (ScoreCanvas* parent_, staff_type_t type_, clef_t clef_, set<Part*> parts_)
{
type=type_;
clef=clef_;
- split_note=split_note_;
parts=parts_;
parent=parent_;
}
@@ -474,6 +500,9 @@ struct staff_t
bool cleanup_parts();
set<Part*> parts_at_tick(unsigned tick);
+
+ void read_status(Xml& xml);
+ void write_status(int level, Xml& xml) const;
};
list<int> calc_accidentials(key_enum key, clef_t clef, key_enum next_key=KEY_C);
@@ -670,6 +699,7 @@ class ScoreCanvas : public View
~ScoreCanvas(){};
void add_staves(PartList* pl, bool all_in_one);
+ void push_back_staff(staff_t& staff) { staves.push_back(staff); } //FINDMICH dirty. very dirty.
int canvas_width();
int canvas_height();
@@ -681,6 +711,14 @@ class ScoreCanvas : public View
int quant_ticks() { return TICKS_PER_WHOLE / (1<<_quant_power2); }
int pixels_per_whole() { return _pixels_per_whole; }
int note_x_indent() { return pixels_per_whole()/quant_len()/2; }
+
+ int get_last_len() {return last_len;}
+ void set_last_len(int l) {last_len=l;}
+
+ Part* get_selected_part() {return selected_part;}
+ void set_selected_part(Part* p) {selected_part=p;}
+
+ void write_staves(int level, Xml& xml) const;
};
int calc_measure_len(const list<int>& nums, int denom);
diff --git a/muse2/muse/songfile.cpp b/muse2/muse/songfile.cpp
index 3841a204..9a577308 100644
--- a/muse2/muse/songfile.cpp
+++ b/muse2/muse/songfile.cpp
@@ -19,6 +19,7 @@
#include "drumedit.h"
//#include "midiedit/drumedit.h" // p4.0.2
#include "pianoroll.h"
+#include "scoreedit.h"
//#include "midiedit/pianoroll.h" // p4.0.2
#include "globals.h"
#include "xml.h"
@@ -1009,12 +1010,19 @@ void MusE::readToplevels(Xml& xml)
// But for now be safe for all the top levels...
if(!pl->empty())
{
-
startPianoroll(pl);
toplevels.back().cobject()->readStatus(xml);
pl = new PartList;
}
}
+ else if (tag == "scoreedit") {
+ ScoreEdit* score = new ScoreEdit(this, 0, arranger->cursorValue());
+ score->show();
+ toplevels.push_back(Toplevel(Toplevel::SCORE, (unsigned long)(score), score));
+ connect(score, SIGNAL(deleted(unsigned long)), SLOT(toplevelDeleted(unsigned long)));
+ connect(score, SIGNAL(name_changed()), SLOT(scoreNamingChanged()));
+ score->readStatus(xml);
+ }
else if (tag == "drumedit") {
if(!pl->empty())
{