diff options
-rw-r--r-- | muse2/muse/functions.cpp | 7 | ||||
-rw-r--r-- | muse2/muse/midiedit/scoreedit.cpp | 166 | ||||
-rw-r--r-- | muse2/muse/midiedit/scoreedit.h | 2 | ||||
-rw-r--r-- | muse2/muse/midieditor.cpp | 28 | ||||
-rw-r--r-- | muse2/muse/midieditor.h | 9 | ||||
-rw-r--r-- | muse2/muse/part.cpp | 7 | ||||
-rw-r--r-- | muse2/muse/song.cpp | 23 | ||||
-rw-r--r-- | muse2/muse/song.h | 6 | ||||
-rw-r--r-- | muse2/muse/structure.cpp | 2 |
9 files changed, 171 insertions, 79 deletions
diff --git a/muse2/muse/functions.cpp b/muse2/muse/functions.cpp index a8b7ea1d..d6cfa7d0 100644 --- a/muse2/muse/functions.cpp +++ b/muse2/muse/functions.cpp @@ -1000,6 +1000,7 @@ void paste_at(const QString& pt, int pos, int max_distance, bool always_new_part { Undo operations; map<Part*, unsigned> expand_map; + map<Part*, set<Part*> > new_part_map; Xml xml(pt.toLatin1().constData()); for (;;) @@ -1041,11 +1042,13 @@ void paste_at(const QString& pt, int pos, int max_distance, bool always_new_part ( ( (dest_part->endTick() + max_distance < first_paste_tick) || // dest_part is too far away always_new_part ) && !never_new_part ) ) { + Part* old_dest_part=dest_part; dest_part = dest_track->newPart(); dest_part->events()->incARef(-1); // the later song->applyOperationGroup() will increment it // so we must decrement it first :/ - dest_part->setTick(AL::sigmap.raster1(first_paste_tick, config.division)); + + new_part_map[old_dest_part].insert(dest_part); operations.push_back(UndoOp(UndoOp::AddPart, dest_part)); } @@ -1104,6 +1107,8 @@ void paste_at(const QString& pt, int pos, int max_distance, bool always_new_part if (it->second != it->first->lenTick()) schedule_resize_all_same_len_clone_parts(it->first, it->second, operations); + song->informAboutNewParts(new_part_map); // must be called before apply. otherwise + // pointer changes (by resize) screw it up song->applyOperationGroup(operations); song->update(SC_SELECTION); } diff --git a/muse2/muse/midiedit/scoreedit.cpp b/muse2/muse/midiedit/scoreedit.cpp index e4a3994a..d49658ae 100644 --- a/muse2/muse/midiedit/scoreedit.cpp +++ b/muse2/muse/midiedit/scoreedit.cpp @@ -75,6 +75,9 @@ using namespace std; //#include "../ctrl/ctrledit.h" +using MusEGlobal::debugMsg; +using MusEGlobal::heavyDebugMsg; + string IntToStr(int i); QString IntToQStr(int i); @@ -480,6 +483,7 @@ ScoreEdit::ScoreEdit(QWidget* parent, const char* name, unsigned initPos) selection_changed(); connect(song, SIGNAL(songChanged(int)), SLOT(song_changed(int))); + connect(song, SIGNAL(newPartsCreated(const std::map< Part*, std::set<Part*> >&)), score_canvas, SLOT(add_new_parts(const std::map< Part*, std::set<Part*> >&))); score_canvas->fully_recalculate(); score_canvas->goto_tick(initPos,true); @@ -762,11 +766,11 @@ Part* read_part(Xml& xml, QString tag_name="part") else { sscanf(tag.toLatin1().constData(), "%d:%d", &trackIdx, &partIdx); - if (MusEGlobal::debugMsg) cout << "read_part: trackIdx="<<trackIdx<<", partIdx="<<partIdx; + if (debugMsg) cout << "read_part: trackIdx="<<trackIdx<<", partIdx="<<partIdx; Track* track = song->tracks()->index(trackIdx); if (track) part = track->parts()->find(partIdx); - if (MusEGlobal::debugMsg) cout << ", track="<<track<<", part="<<part<<endl; + if (debugMsg) cout << ", track="<<track<<", part="<<part<<endl; } } break; @@ -1544,7 +1548,7 @@ void ScoreCanvas::init_pixmaps() { if (!pixmaps_initalized) { - if (MusEGlobal::debugMsg) cout << "initalizing colors..." << endl; + if (debugMsg) cout << "initalizing colors..." << endl; mycolors=new QColor[NUM_MYCOLORS]; @@ -1561,7 +1565,7 @@ void ScoreCanvas::init_pixmaps() mycolors[i+VELO_PIXMAP_BEGIN]=QColor(0xff,0,(127-i)*4); - if (MusEGlobal::debugMsg) cout << "loading pixmaps..." << endl; + if (debugMsg) cout << "loading pixmaps..." << endl; pix_whole=new QPixmap[NUM_MYCOLORS]; pix_half=new QPixmap[NUM_MYCOLORS]; @@ -1619,7 +1623,7 @@ void ScoreCanvas::init_pixmaps() pixmaps_initalized=true; - if (MusEGlobal::debugMsg) cout << "done" << endl; + if (debugMsg) cout << "done" << endl; } } @@ -1701,11 +1705,11 @@ void staff_t::create_appropriate_eventlist() end=flo_quantize(event.endTick()+part->tick(), parent->quant_ticks()); if (end==begin) { - if (MusEGlobal::heavyDebugMsg) cout << "note len would be quantized to zero. using minimal possible length" << endl; + if (heavyDebugMsg) cout << "note len would be quantized to zero. using minimal possible length" << endl; end=begin+parent->quant_ticks(); } - if (MusEGlobal::heavyDebugMsg) cout << "inserting note on at "<<begin<<" with pitch="<<event.pitch()<<" and len="<<end-begin<<endl; + if (heavyDebugMsg) cout << "inserting note on at "<<begin<<" with pitch="<<event.pitch()<<" and len="<<end-begin<<endl; eventlist.insert(pair<unsigned, FloEvent>(begin, FloEvent(begin,event.pitch(), event.velo(),end-begin,FloEvent::NOTE_ON,part,&it->second))); } //else ignore it @@ -1722,7 +1726,7 @@ void staff_t::create_appropriate_eventlist() if (to > unsigned(SONG_LENGTH)) to=SONG_LENGTH; - if (MusEGlobal::heavyDebugMsg) cout << "new signature from tick "<<from<<" to " << to << ": "<<it->second->sig.z<<"/"<<it->second->sig.n<<"; ticks per measure = "<<ticks_per_measure<<endl; + if (heavyDebugMsg) cout << "new signature from tick "<<from<<" to " << to << ": "<<it->second->sig.z<<"/"<<it->second->sig.n<<"; ticks per measure = "<<ticks_per_measure<<endl; eventlist.insert(pair<unsigned, FloEvent>(from, FloEvent(from, FloEvent::TIME_SIG, it->second->sig.z, it->second->sig.n) ) ); for (unsigned t=from; t<to; t+=ticks_per_measure) eventlist.insert(pair<unsigned, FloEvent>(t, FloEvent(t,0,0,ticks_per_measure,FloEvent::BAR) ) ); @@ -1899,7 +1903,7 @@ int calc_measure_len(const list<int>& nums, int denom) vector<int> create_emphasize_list(const list<int>& nums, int denom) { - if (MusEGlobal::heavyDebugMsg) + if (heavyDebugMsg) { cout << "creating emphasize list for "; for (list<int>::const_iterator it=nums.begin(); it!=nums.end(); it++) @@ -1927,7 +1931,7 @@ vector<int> create_emphasize_list(const list<int>& nums, int denom) result[0]=0; - if (MusEGlobal::heavyDebugMsg) + if (heavyDebugMsg) { for (int i=0;i<len;i++) { @@ -2009,7 +2013,7 @@ list<note_len_t> parse_note_len(int len_ticks, int begin_tick, vector<int>& foo, len_now=len_now*TICKS_PER_WHOLE/64; - if (MusEGlobal::heavyDebugMsg) cout << "add " << len_now << " ticks" << endl; + if (heavyDebugMsg) cout << "add " << len_now << " ticks" << endl; if (allow_dots) { for (int i=0;i<=MAX_QUANT_POWER;i++) @@ -2152,7 +2156,7 @@ void staff_t::create_itemlist() note_pos_t notepos=note_pos(pitch,tmp_key,clef); - if (MusEGlobal::heavyDebugMsg) + if (heavyDebugMsg) { printf("FLO: t=%i\ttype=%i\tpitch=%i\tvel=%i\tlen=%i\n",it->first, it->second.type, it->second.pitch, it->second.vel, it->second.len); cout << "\tline="<<notepos.height<<"\tvorzeichen="<<notepos.vorzeichen << endl; @@ -2165,7 +2169,7 @@ void staff_t::create_itemlist() if (lastevent==last_measure) //there was no note? { unsigned tmppos=(last_measure+t-parent->quant_ticks())/2; - if (MusEGlobal::heavyDebugMsg) cout << "\tend-of-measure: this was an empty measure. inserting rest in between at t="<<tmppos << endl; + if (heavyDebugMsg) cout << "\tend-of-measure: this was an empty measure. inserting rest in between at t="<<tmppos << endl; itemlist[tmppos].insert( FloItem(FloItem::REST,notepos,0,0) ); itemlist[t].insert( FloItem(FloItem::REST_END,notepos,0,0) ); } @@ -2175,13 +2179,13 @@ void staff_t::create_itemlist() int rest=t-lastevent; if (rest) { - if (MusEGlobal::heavyDebugMsg) printf("\tend-of-measure: set rest at %i with len %i\n",lastevent,rest); + if (heavyDebugMsg) printf("\tend-of-measure: set rest at %i with len %i\n",lastevent,rest); list<note_len_t> lens=parse_note_len(rest,lastevent-last_measure,emphasize_list,DOTTED_RESTS,UNSPLIT_RESTS); unsigned tmppos=lastevent; for (list<note_len_t>::iterator x=lens.begin(); x!=lens.end(); x++) { - if (MusEGlobal::heavyDebugMsg) cout << "\t\tpartial rest with len="<<x->len<<", dots="<<x->dots<<endl; + if (heavyDebugMsg) cout << "\t\tpartial rest with len="<<x->len<<", dots="<<x->dots<<endl; itemlist[tmppos].insert( FloItem(FloItem::REST,notepos,x->len,x->dots) ); tmppos+=calc_len(x->len,x->dots); itemlist[tmppos].insert( FloItem(FloItem::REST_END,notepos,0,0) ); @@ -2201,7 +2205,7 @@ void staff_t::create_itemlist() int rest=t-lastevent; if (rest) { - if (MusEGlobal::heavyDebugMsg) printf("\tset rest at %i with len %i\n",lastevent,rest); + if (heavyDebugMsg) printf("\tset rest at %i with len %i\n",lastevent,rest); // no need to check if the rest crosses measure boundaries; // it can't. @@ -2209,7 +2213,7 @@ void staff_t::create_itemlist() unsigned tmppos=lastevent; for (list<note_len_t>::iterator x=lens.begin(); x!=lens.end(); x++) { - if (MusEGlobal::heavyDebugMsg) cout << "\t\tpartial rest with len="<<x->len<<", dots="<<x->dots<<endl; + if (heavyDebugMsg) cout << "\t\tpartial rest with len="<<x->len<<", dots="<<x->dots<<endl; itemlist[tmppos].insert( FloItem(FloItem::REST,notepos,x->len,x->dots) ); tmppos+=calc_len(x->len,x->dots); itemlist[tmppos].insert( FloItem(FloItem::REST_END,notepos,0,0) ); @@ -2218,7 +2222,7 @@ void staff_t::create_itemlist() - if (MusEGlobal::heavyDebugMsg) printf("\tset note at %i with len=%i\n", t, len); + if (heavyDebugMsg) printf("\tset note at %i with len=%i\n", t, len); int tmplen; bool tied_note; @@ -2235,14 +2239,14 @@ void staff_t::create_itemlist() eventlist.insert(pair<unsigned, FloEvent>(next_measure, FloEvent(actual_tick,pitch, velo,0,FloEvent::NOTE_OFF, it->second.source_part, it->second.source_event))); eventlist.insert(pair<unsigned, FloEvent>(next_measure, FloEvent(actual_tick,pitch, velo,newlen,FloEvent::NOTE_ON, it->second.source_part, it->second.source_event))); - if (MusEGlobal::heavyDebugMsg) cout << "\t\tnote was split to length "<<tmplen<<" + " << newlen<<endl; + if (heavyDebugMsg) cout << "\t\tnote was split to length "<<tmplen<<" + " << newlen<<endl; } else { tmplen=len; tied_note=false; - if (MusEGlobal::heavyDebugMsg) cout << "\t\tinserting NOTE OFF at "<<t+len<<endl; + if (heavyDebugMsg) cout << "\t\tinserting NOTE OFF at "<<t+len<<endl; eventlist.insert(pair<unsigned, FloEvent>(t+len, FloEvent(t+len,pitch, velo,0,FloEvent::NOTE_OFF,it->second.source_part, it->second.source_event))); } @@ -2252,7 +2256,7 @@ void staff_t::create_itemlist() int count=0; for (list<note_len_t>::iterator x=lens.begin(); x!=lens.end(); x++) { - if (MusEGlobal::heavyDebugMsg) cout << "\t\tpartial note with len="<<x->len<<", dots="<<x->dots<<endl; + if (heavyDebugMsg) cout << "\t\tpartial note with len="<<x->len<<", dots="<<x->dots<<endl; count++; bool tie; @@ -2273,14 +2277,14 @@ void staff_t::create_itemlist() } else if (type==FloEvent::TIME_SIG) { - if (MusEGlobal::heavyDebugMsg) cout << "inserting TIME SIGNATURE "<<it->second.num<<"/"<<it->second.denom<<" at "<<t<<endl; + if (heavyDebugMsg) cout << "inserting TIME SIGNATURE "<<it->second.num<<"/"<<it->second.denom<<" at "<<t<<endl; itemlist[t].insert( FloItem(FloItem::TIME_SIG, it->second.num, it->second.denom) ); emphasize_list=create_emphasize_list(it->second.num, it->second.denom); } else if (type==FloEvent::KEY_CHANGE) { - if (MusEGlobal::heavyDebugMsg) cout << "inserting KEY CHANGE ("<<it->second.key<<") at "<<t<<endl; + if (heavyDebugMsg) cout << "inserting KEY CHANGE ("<<it->second.key<<") at "<<t<<endl; itemlist[t].insert( FloItem(FloItem::KEY_CHANGE, it->second.key) ); tmp_key=it->second.key; } @@ -2298,7 +2302,7 @@ void staff_t::process_itemlist() { set<FloItem, floComp>& curr_items=it2->second; - if (MusEGlobal::heavyDebugMsg) cout << "at t="<<it2->first<<endl; + if (heavyDebugMsg) cout << "at t="<<it2->first<<endl; // phase 0: keep track of active notes, rests ------------------- // (and occupied lines) and the last measure @@ -2315,7 +2319,7 @@ void staff_t::process_itemlist() emphasize_list=create_emphasize_list(it->num, it->denom); } - if (MusEGlobal::heavyDebugMsg) + if (heavyDebugMsg) { cout << "occupied: "; for (map<int,int>::iterator i=occupied.begin(); i!=occupied.end(); i++) @@ -2341,7 +2345,7 @@ void staff_t::process_itemlist() //(can be seen on already_grouped) if ((it->type==FloItem::REST) && (it->already_grouped==false)) { - if (MusEGlobal::heavyDebugMsg) cout << "trying to group" << endl; + if (heavyDebugMsg) cout << "trying to group" << endl; int lastheight; int height_cumulative=0; @@ -2352,12 +2356,12 @@ void staff_t::process_itemlist() set<FloItem, floComp>::iterator tmp; for (tmp=it; tmp!=curr_items.end();) { - if (MusEGlobal::heavyDebugMsg) cout << "checking if we can proceed with an item at height="<<tmp->pos.height<<endl; + if (heavyDebugMsg) cout << "checking if we can proceed with an item at height="<<tmp->pos.height<<endl; for (int i=lastheight+1; i<=tmp->pos.height-1; i++) if (occupied[i]!=0) { - if (MusEGlobal::heavyDebugMsg) cout << "we can NOT, because occ["<<i<<"] != 0" << endl; + if (heavyDebugMsg) cout << "we can NOT, because occ["<<i<<"] != 0" << endl; //stop grouping that rest goto get_out_here; } @@ -2369,7 +2373,7 @@ void staff_t::process_itemlist() { // füge diese pause zur gruppe dazu und entferne sie von diesem set hier // entfernen aber nur, wenn sie nicht it, also die erste pause ist, die brauchen wir noch! - if (MusEGlobal::heavyDebugMsg) cout << "\tgrouping rest at height="<<tmp->pos.height<<endl; + if (heavyDebugMsg) cout << "\tgrouping rest at height="<<tmp->pos.height<<endl; height_cumulative+=tmp->pos.height; counter++; if (tmp!=it) @@ -2379,12 +2383,12 @@ void staff_t::process_itemlist() } else //it's something else? well, we can stop grouping that rest then { - if (MusEGlobal::heavyDebugMsg) cout << "we can NOT, because that item is not a rest" << endl; + if (heavyDebugMsg) cout << "we can NOT, because that item is not a rest" << endl; //stop grouping that rest goto get_out_here; } } - if (MusEGlobal::heavyDebugMsg) cout << "no items to proceed on left, continuing" << endl; + if (heavyDebugMsg) cout << "no items to proceed on left, continuing" << endl; get_out_here: n_groups++; @@ -2399,7 +2403,7 @@ void staff_t::process_itemlist() // have we grouped all available rests into one single? if ( (n_groups==1) && (tmp==curr_items.end()) && !dont_group) { - if (MusEGlobal::heavyDebugMsg) cout << "wow, we were able to group all rests into one single" << endl; + if (heavyDebugMsg) cout << "wow, we were able to group all rests into one single" << endl; if (temp.len==0) //the whole rest is shifted one line (one space and one line) temp.pos.height=DEFAULT_REST_HEIGHT+2; else @@ -2407,7 +2411,7 @@ void staff_t::process_itemlist() } else { - if (MusEGlobal::heavyDebugMsg) cout << "creating group #"<<n_groups<<endl; + if (heavyDebugMsg) cout << "creating group #"<<n_groups<<endl; temp.pos.height=nearbyint((float)height_cumulative/counter); } @@ -2418,7 +2422,7 @@ void staff_t::process_itemlist() // the item. effect: you don't have the rest at all curr_items.erase(it++); - if (MusEGlobal::heavyDebugMsg) cout << "replacing all grouped rests with a rest at height="<<temp.pos.height<<endl; + if (heavyDebugMsg) cout << "replacing all grouped rests with a rest at height="<<temp.pos.height<<endl; curr_items.insert(temp); } @@ -2509,7 +2513,7 @@ group_them_again: if (it->type==FloItem::NOTE) lengths[it->len].add(it->pos.height); - if (MusEGlobal::heavyDebugMsg) + if (heavyDebugMsg) { cout << "note lengths at that time are:"; for (map<int, cumulative_t>::iterator it=lengths.begin(); it!=lengths.end(); it++) @@ -2522,14 +2526,14 @@ group_them_again: if (lengths.size()==0) { - if (MusEGlobal::heavyDebugMsg) cout << "no notes other than wholes, or no notes at all. we can relax" << endl; + if (heavyDebugMsg) cout << "no notes other than wholes, or no notes at all. we can relax" << endl; } else if (lengths.size()==1) { pair<const int, cumulative_t>& group=*(lengths.begin()); stem_t stem; int shift=0; - if (MusEGlobal::heavyDebugMsg) cout << "only one non-whole note group (len="<<group.first<<") at height="<<group.second.mean()<< endl; + if (heavyDebugMsg) cout << "only one non-whole note group (len="<<group.first<<") at height="<<group.second.mean()<< endl; if (group.second.mean()>=6) { @@ -2560,7 +2564,7 @@ group_them_again: pair<const int, cumulative_t>& group2=*it; stem_t stem1, stem2; int shift1=0, shift2=0; - if (MusEGlobal::heavyDebugMsg) cout << "two non-whole note group: len="<<group1.first<<" at height="<<group1.second.mean()<<" and len="<<group2.first<<" at height="<<group2.second.mean()<< endl; + if (heavyDebugMsg) cout << "two non-whole note group: len="<<group1.first<<" at height="<<group1.second.mean()<<" and len="<<group2.first<<" at height="<<group2.second.mean()<< endl; if (group1.second.mean()<group2.second.mean()) { @@ -2618,17 +2622,17 @@ group_them_again: group1_len_ticks=calc_len(group1_len,0); group2_len_ticks=calc_len(group2_len,0); - if (MusEGlobal::heavyDebugMsg) cout << "we have "<<lengths.size()<<" groups. putting the "<<group1_n<<" longest and the "<<group2_n<<"shortest groups together"<<endl << + if (heavyDebugMsg) cout << "we have "<<lengths.size()<<" groups. putting the "<<group1_n<<" longest and the "<<group2_n<<"shortest groups together"<<endl << "\tgroup1 will have len="<<group1_len<<" ("<<group1_len_ticks<<" ticks), group2 will have len="<<group2_len<<" ("<<group2_len_ticks<<" ticks)"<<endl; for (set<FloItem, floComp>::iterator it=curr_items.begin(); it!=curr_items.end();) if (it->type==FloItem::NOTE) { //if *it belongs to group1 and has not already its destination length - if (MusEGlobal::heavyDebugMsg) cout << "\tprocessing note-item with len="<<it->len<<endl; + if (heavyDebugMsg) cout << "\tprocessing note-item with len="<<it->len<<endl; if (it->len<group1_len) { - if (MusEGlobal::heavyDebugMsg) cout << "\t\thas to be changed to fit into group 1" << endl; + if (heavyDebugMsg) cout << "\t\thas to be changed to fit into group 1" << endl; FloItem tmp=*it; curr_items.erase(it++); @@ -2653,7 +2657,7 @@ group_them_again: int count=0; for (list<note_len_t>::iterator x=lens.begin(); x!=lens.end(); x++) { - if (MusEGlobal::heavyDebugMsg) cout << "\t\twhile regrouping: partial note with len="<<x->len<<", dots="<<x->dots<<endl; + if (heavyDebugMsg) cout << "\t\twhile regrouping: partial note with len="<<x->len<<", dots="<<x->dots<<endl; count++; bool tie; @@ -2672,7 +2676,7 @@ group_them_again: //else if *it belongs to group2 and has not already its destination length else if ((it->len<group2_len) && (it->len>group1_len)) { - if (MusEGlobal::heavyDebugMsg) cout << "\t\thas to be changed to fit into group 2" << endl; + if (heavyDebugMsg) cout << "\t\thas to be changed to fit into group 2" << endl; FloItem tmp=*it; curr_items.erase(it++); @@ -2698,7 +2702,7 @@ group_them_again: int count=0; for (list<note_len_t>::iterator x=lens.begin(); x!=lens.end(); x++) { - if (MusEGlobal::heavyDebugMsg) cout << "\t\twhile regrouping: partial note with len="<<x->len<<", dots="<<x->dots<<endl; + if (heavyDebugMsg) cout << "\t\twhile regrouping: partial note with len="<<x->len<<", dots="<<x->dots<<endl; count++; bool tie; @@ -2716,7 +2720,7 @@ group_them_again: } else //nothing to do? { - if (MusEGlobal::heavyDebugMsg) cout << "\t\tnothing to do" << endl; + if (heavyDebugMsg) cout << "\t\tnothing to do" << endl; it++; } } @@ -2732,7 +2736,7 @@ group_them_again: //draw a pixmap centered void ScoreCanvas::draw_pixmap(QPainter& p, int x, int y, const QPixmap& pm) { - if (MusEGlobal::heavyDebugMsg) cout << "drawing pixmap with size="<<pm.width()<<"/"<<pm.height()<<" at "<<x<<"/"<<y<<endl; + if (heavyDebugMsg) cout << "drawing pixmap with size="<<pm.width()<<"/"<<pm.height()<<" at "<<x<<"/"<<y<<endl; p.drawPixmap(x-pm.width()/2,y-pm.height()/2,pm); } @@ -2949,7 +2953,7 @@ void ScoreCanvas::draw_items(QPainter& p, int y_offset, staff_t& staff, ScoreIte for (ScoreItemList::iterator it2=from_it; it2!=to_it; it2++) { - if (MusEGlobal::heavyDebugMsg) cout << "at t="<<it2->first << endl; + if (heavyDebugMsg) cout << "at t="<<it2->first << endl; int upstem_y1 = -1, upstem_y2=-1, upstem_x=-1, upflag=-1; int downstem_y1 = -1, downstem_y2=-1, downstem_x=-1, downflag=-1; @@ -2958,7 +2962,7 @@ void ScoreCanvas::draw_items(QPainter& p, int y_offset, staff_t& staff, ScoreIte { if (it->type==FloItem::NOTE) { - if (MusEGlobal::heavyDebugMsg) + if (heavyDebugMsg) { cout << "\tNOTE at line"<<it->pos.height<<" with acc.="<<it->pos.vorzeichen<<", len="<<pow(2,it->len); for (int i=0;i<it->dots;i++) cout << "."; @@ -3092,7 +3096,7 @@ void ScoreCanvas::draw_items(QPainter& p, int y_offset, staff_t& staff, ScoreIte //if needed, draw tie if (it->is_tie_dest) { - if (MusEGlobal::heavyDebugMsg) cout << "drawing tie" << endl; + if (heavyDebugMsg) cout << "drawing tie" << endl; draw_tie(p,it->tie_from_x-x_pos+x_left,it->x -x_pos+x_left,y_offset + it->y, (it->len==0) ? true : (it->stem==DOWNWARDS) , mycolors[color_index]); // in english: "if it's a whole note, tie is upwards (true). if not, tie is upwards if // stem is downwards and vice versa" @@ -3100,7 +3104,7 @@ void ScoreCanvas::draw_items(QPainter& p, int y_offset, staff_t& staff, ScoreIte } else if (it->type==FloItem::REST) { - if (MusEGlobal::heavyDebugMsg) + if (heavyDebugMsg) { cout << "\tREST at line"<<it->pos.height<<" with len="<<pow(2,it->len); for (int i=0;i<it->dots;i++) cout << "."; @@ -3130,7 +3134,7 @@ void ScoreCanvas::draw_items(QPainter& p, int y_offset, staff_t& staff, ScoreIte } else if (it->type==FloItem::BAR) { - if (MusEGlobal::heavyDebugMsg) cout << "\tBAR" << endl; + if (heavyDebugMsg) cout << "\tBAR" << endl; p.setPen(Qt::black); p.drawLine(it->x -x_pos+x_left,y_offset -2*YLEN,it->x -x_pos+x_left,y_offset +2*YLEN); @@ -3140,14 +3144,14 @@ void ScoreCanvas::draw_items(QPainter& p, int y_offset, staff_t& staff, ScoreIte } else if (it->type==FloItem::TIME_SIG) { - if (MusEGlobal::heavyDebugMsg) cout << "\tTIME SIGNATURE: "<<it->num<<"/"<<it->denom<<endl; + if (heavyDebugMsg) cout << "\tTIME SIGNATURE: "<<it->num<<"/"<<it->denom<<endl; draw_timesig(p, it->x - x_pos+x_left, y_offset, it->num, it->denom); } else if (it->type==FloItem::KEY_CHANGE) { key_enum new_key=it->key; - if (MusEGlobal::heavyDebugMsg) cout << "\tKEY CHANGE: from "<<curr_key<<" to "<<new_key<<endl; + if (heavyDebugMsg) cout << "\tKEY CHANGE: from "<<curr_key<<" to "<<new_key<<endl; list<int> aufloes_list=calc_accidentials(curr_key, staff.clef, new_key); list<int> new_acc_list=calc_accidentials(new_key, staff.clef); @@ -3358,7 +3362,7 @@ void ScoreCanvas::draw_number(QPainter& p, int x, int y, int n) void ScoreCanvas::draw(QPainter& p, const QRect&) { - if (MusEGlobal::debugMsg) cout <<"now in ScoreCanvas::draw"<<endl; + if (debugMsg) cout <<"now in ScoreCanvas::draw"<<endl; @@ -3381,7 +3385,7 @@ void ScoreCanvas::draw(QPainter& p, const QRect&) p.drawRect(lasso); } - if (MusEGlobal::debugMsg) cout << "drawing done." << endl; + if (debugMsg) cout << "drawing done." << endl; } @@ -3564,7 +3568,7 @@ void ScoreCanvas::mousePressEvent (QMouseEvent* event) { ScoreItemList& itemlist=staff_it->itemlist; - if (MusEGlobal::debugMsg) cout << "mousePressEvent at "<<x<<"/"<<y<<"; tick="<<tick<<endl; + if (debugMsg) cout << "mousePressEvent at "<<x<<"/"<<y<<"; tick="<<tick<<endl; set<FloItem, floComp>::iterator set_it; for (set_it=itemlist[tick].begin(); set_it!=itemlist[tick].end(); set_it++) if (set_it->type==FloItem::NOTE) @@ -3620,7 +3624,7 @@ void ScoreCanvas::mousePressEvent (QMouseEvent* event) mouse_x_drag_operation=NO_OP; } - if (MusEGlobal::debugMsg) + if (debugMsg) cout << "you clicked at a note with begin at "<<set_it->begin_tick<<" and end at "<<t<<endl << "x-drag-operation will be "<<mouse_x_drag_operation<<endl << "pointer to part is "<<set_it->source_part << endl; @@ -3688,13 +3692,13 @@ void ScoreCanvas::mousePressEvent (QMouseEvent* event) if (flo_quantize(newevent.lenTick(), quant_ticks()) <= 0) { newevent.setLenTick(quant_ticks()); - if (MusEGlobal::debugMsg) cout << "inserted note's length would be invisible after quantisation (too short)." << endl << + if (debugMsg) cout << "inserted note's length would be invisible after quantisation (too short)." << endl << " setting it to " << newevent.lenTick() << endl; } if (newevent.endTick() > curr_part->lenTick()) { - if (MusEGlobal::debugMsg) cout << "clipping inserted note from len="<<newevent.endTick()<<" to len="<<(curr_part->lenTick() - newevent.tick())<<endl; + if (debugMsg) cout << "clipping inserted note from len="<<newevent.endTick()<<" to len="<<(curr_part->lenTick() - newevent.tick())<<endl; newevent.setLenTick(curr_part->lenTick() - newevent.tick()); } @@ -3743,7 +3747,7 @@ void ScoreCanvas::mouseReleaseEvent (QMouseEvent* event) { if (flo_quantize(dragged_event.lenTick(), quant_ticks()) <= 0) { - if (MusEGlobal::debugMsg) cout << "new length <= 0, erasing item" << endl; + if (debugMsg) cout << "new length <= 0, erasing item" << endl; if (undo_started) song->undo(); audio->msgDeleteEvent(dragged_event, dragged_event_part, true, false, false); } @@ -3843,13 +3847,13 @@ void ScoreCanvas::mouseMoveEvent (QMouseEvent* event) { if ((abs(dx)>DRAG_INIT_DISTANCE) && (mouse_x_drag_operation!=NO_OP)) { - if (MusEGlobal::debugMsg) cout << "mouse-operation is now "<<mouse_x_drag_operation<<endl; + if (debugMsg) cout << "mouse-operation is now "<<mouse_x_drag_operation<<endl; mouse_operation=mouse_x_drag_operation; setCursor(Qt::SizeHorCursor); } else if (abs(dy)>DRAG_INIT_DISTANCE) { - if (MusEGlobal::debugMsg) cout << "mouse-operation is now PITCH" << endl; + if (debugMsg) cout << "mouse-operation is now PITCH" << endl; mouse_operation=PITCH; setCursor(Qt::SizeVerCursor); } @@ -3880,7 +3884,7 @@ void ScoreCanvas::mouseMoveEvent (QMouseEvent* event) break; case PITCH: - if (MusEGlobal::heavyDebugMsg) cout << "trying to change pitch, delta="<<-nearbyint((float)dy/PITCH_DELTA)<<endl; + if (heavyDebugMsg) cout << "trying to change pitch, delta="<<-nearbyint((float)dy/PITCH_DELTA)<<endl; new_pitch=original_dragged_event.pitch() - nearbyint((float)dy/PITCH_DELTA); if (new_pitch < 0) new_pitch=0; @@ -3888,7 +3892,7 @@ void ScoreCanvas::mouseMoveEvent (QMouseEvent* event) if (new_pitch != old_pitch) { - if (MusEGlobal::debugMsg) cout << "changing pitch, delta="<<new_pitch-original_dragged_event.pitch()<<endl; + if (debugMsg) cout << "changing pitch, delta="<<new_pitch-original_dragged_event.pitch()<<endl; if (undo_started) song->undo(); undo_started=transpose_notes(part_to_set(dragged_event_part),1, new_pitch-original_dragged_event.pitch()); old_pitch=new_pitch; @@ -3906,7 +3910,7 @@ void ScoreCanvas::mouseMoveEvent (QMouseEvent* event) else { dest_tick=0; - if (MusEGlobal::debugMsg) cout << "not moving note before begin of part; setting it directly to the begin" << endl; + if (debugMsg) cout << "not moving note before begin of part; setting it directly to the begin" << endl; } if (dest_tick != old_dest_tick) @@ -3932,7 +3936,7 @@ void ScoreCanvas::mouseMoveEvent (QMouseEvent* event) else { tmp.setLenTick(0); - if (MusEGlobal::debugMsg) cout << "not setting len to a negative value. using 0 instead" << endl; + if (debugMsg) cout << "not setting len to a negative value. using 0 instead" << endl; } unsigned newpartlen=dragged_event_part->lenTick(); @@ -3941,12 +3945,12 @@ void ScoreCanvas::mouseMoveEvent (QMouseEvent* event) if (dragged_event_part->hasHiddenEvents()) // do not allow autoexpand { tmp.setLenTick(dragged_event_part->lenTick() - tmp.tick()); - if (MusEGlobal::debugMsg) cout << "resized note would exceed its part; limiting length to " << tmp.lenTick() << endl; + if (debugMsg) cout << "resized note would exceed its part; limiting length to " << tmp.lenTick() << endl; } else { newpartlen=tmp.endTick(); - if (MusEGlobal::debugMsg) cout << "resized note would exceeds its part; expanding the part..." << endl; + if (debugMsg) cout << "resized note would exceeds its part; expanding the part..." << endl; } } @@ -4053,14 +4057,14 @@ void ScoreCanvas::heartbeat_timer_event() void ScoreCanvas::x_scroll_event(int x) { - if (MusEGlobal::debugMsg) cout << "SCROLL EVENT: x="<<x<<endl; + if (debugMsg) cout << "SCROLL EVENT: x="<<x<<endl; x_pos=x; redraw(); } void ScoreCanvas::y_scroll_event(int y) { - if (MusEGlobal::debugMsg) cout << "SCROLL EVENT: y="<<y<<endl; + if (debugMsg) cout << "SCROLL EVENT: y="<<y<<endl; y_pos=y; redraw(); } @@ -4264,7 +4268,7 @@ void ScoreCanvas::set_quant(int val) void ScoreCanvas::set_pixels_per_whole(int val) { - if (MusEGlobal::debugMsg) cout << "setting px per whole to " << val << endl; + if (debugMsg) cout << "setting px per whole to " << val << endl; int tick; int old_xpos=x_pos; @@ -4286,7 +4290,7 @@ void ScoreCanvas::set_pixels_per_whole(int val) if (old_xpos!=0) { x_pos=tick_to_x(tick); - if (MusEGlobal::debugMsg) cout << "x_pos was not zero, readjusting to " << x_pos << endl; + if (debugMsg) cout << "x_pos was not zero, readjusting to " << x_pos << endl; emit xscroll_changed(x_pos); } @@ -4482,6 +4486,22 @@ void ScoreEdit::keyPressEvent(QKeyEvent* event) } +void ScoreCanvas::add_new_parts(const std::map< Part*, std::set<Part*> >& param) +{ + for (list<staff_t>::iterator staff=staves.begin(); staff!=staves.end(); staff++) + { + for (std::map< Part*, set<Part*> >::const_iterator it = param.begin(); it!=param.end(); it++) + if (staff->parts.find(it->first)!=staff->parts.end()) + staff->parts.insert(it->second.begin(), it->second.end()); + + //staff->cleanup_parts(); // don't cleanup here, because at this point, the parts may only exist + // in the operation group. cleanup could remove them immediately + staff->update_part_indices(); + } + + fully_recalculate(); +} + //the following assertions are made: // pix_quarter.width() == pix_half.width() @@ -4513,12 +4533,12 @@ void ScoreEdit::keyPressEvent(QKeyEvent* event) * CURRENT TODO * o pasting in editors sometimes fails oO? ( ERROR: reading eventlist from clipboard failed. ignoring this one... ) * o ctrl+shift+c for editors - * o when pasting and creating new parts, inform the editors about that! * o TEST pasting in editors! * o sane default for raster * o use raster and amount in paste_notes! * x clone-bug * x pasting in editors: add dialogs + * x when pasting and creating new parts, inform the editors about that! * * o ticks-to-quarter spinboxes * diff --git a/muse2/muse/midiedit/scoreedit.h b/muse2/muse/midiedit/scoreedit.h index b436f85a..9227389f 100644 --- a/muse2/muse/midiedit/scoreedit.h +++ b/muse2/muse/midiedit/scoreedit.h @@ -762,6 +762,8 @@ class ScoreCanvas : public MusEWidget::View void deselect_all(); void midi_note(int pitch, int velo); + + void add_new_parts(const std::map< Part*, std::set<Part*> >&); public slots: void x_scroll_event(int); diff --git a/muse2/muse/midieditor.cpp b/muse2/muse/midieditor.cpp index 218c0615..d4a16eda 100644 --- a/muse2/muse/midieditor.cpp +++ b/muse2/muse/midieditor.cpp @@ -45,7 +45,7 @@ MidiEditor::MidiEditor(ToplevelType t, int r, PartList* pl, _pl = pl; if (_pl) for (iPart i = _pl->begin(); i != _pl->end(); ++i) - _parts.push_back(i->second->sn()); + _parts.insert(i->second->sn()); _raster = r; canvas = 0; wview = 0; @@ -59,6 +59,8 @@ MidiEditor::MidiEditor(ToplevelType t, int r, PartList* pl, mainGrid->setContentsMargins(0, 0, 0, 0); mainGrid->setSpacing(0); setCentralWidget(mainw); + + connect(song, SIGNAL(newPartsCreated(const std::map< Part*, std::set<Part*> >&)), SLOT(addNewParts(const std::map< Part*, std::set<Part*> >&))); } //--------------------------------------------------------- @@ -68,7 +70,7 @@ MidiEditor::MidiEditor(ToplevelType t, int r, PartList* pl, void MidiEditor::genPartlist() { _pl->clear(); - for (std::list<int>::iterator i = _parts.begin(); i != _parts.end(); ++i) { + for (std::set<int>::iterator i = _parts.begin(); i != _parts.end(); ++i) { TrackList* tl = song->tracks(); for (iTrack it = tl->begin(); it != tl->end(); ++it) { PartList* pl = (*it)->parts(); @@ -86,6 +88,17 @@ void MidiEditor::genPartlist() } //--------------------------------------------------------- +// addPart +//--------------------------------------------------------- + +void MidiEditor::addPart(Part* p) +{ + _pl->add(p); + _parts.insert(p->sn()); +} + + +//--------------------------------------------------------- // MidiEditor //--------------------------------------------------------- @@ -266,3 +279,14 @@ void MidiEditor::horizontalZoomOut() hscroll->setMag(newmag); } + +void MidiEditor::addNewParts(const std::map< Part*, std::set<Part*> >& param) +{ + using std::map; + using std::set; + + for (map< Part*, set<Part*> >::const_iterator it = param.begin(); it!=param.end(); it++) + if (_pl->index(it->first) != -1) + for (set<Part*>::const_iterator it2=it->second.begin(); it2!=it->second.end(); it2++) + addPart(*it2); +} diff --git a/muse2/muse/midieditor.h b/muse2/muse/midieditor.h index af681075..84597cd3 100644 --- a/muse2/muse/midieditor.h +++ b/muse2/muse/midieditor.h @@ -27,6 +27,9 @@ #include "al/sig.h" #include "cobject.h" + +#include <set> + class QGridLayout; class QWidget; @@ -51,7 +54,7 @@ class MidiEditor : public TopWin { Q_OBJECT PartList* _pl; - std::list<int> _parts; + std::set<int> _parts; int _curDrumInstrument; // currently selected instrument if drum // editor protected: @@ -70,6 +73,9 @@ class MidiEditor : public TopWin { void writePartList(int, Xml&) const; void genPartlist(); + private slots: + void addNewParts(const std::map< Part*, std::set<Part*> >&); + public slots: void songChanged(int type); void setCurDrumInstrument(int instr); @@ -100,6 +106,7 @@ class MidiEditor : public TopWin { Part* curCanvasPart(); WavePart* curWavePart(); void setCurCanvasPart(Part*); + void addPart(Part*); }; #endif diff --git a/muse2/muse/part.cpp b/muse2/muse/part.cpp index 51478928..6d273c82 100644 --- a/muse2/muse/part.cpp +++ b/muse2/muse/part.cpp @@ -648,8 +648,8 @@ int PartList::index(Part* part) } if(MusEGlobal::debugMsg) printf("PartList::index(): not found!\n"); - //return 0; - return -1; + //return 0; // don't comment this in again + return -1; // don't change that value. at least MidiEditor::addNewParts relies on this } //--------------------------------------------------------- @@ -1044,6 +1044,9 @@ void Song::cmdSplitPart(Track* track, Part* part, int tick) Part* p1; Part* p2; track->splitPart(part, tick, p1, p2); + + //song->informAboutNewParts(part, p1); // is unneccessary because of ChangePart below + song->informAboutNewParts(part, p2); startUndo(); // Indicate no undo, and do port controller values but not clone parts. diff --git a/muse2/muse/song.cpp b/muse2/muse/song.cpp index e5381884..af5b0489 100644 --- a/muse2/muse/song.cpp +++ b/muse2/muse/song.cpp @@ -3927,3 +3927,26 @@ QString Song::getScriptPath(int id, bool isdelivered) return path; } +void Song::informAboutNewParts(const std::map< Part*, std::set<Part*> >& param) +{ + emit newPartsCreated(param); +} + +void Song::informAboutNewParts(Part* orig, Part* p1, Part* p2, Part* p3, Part* p4, Part* p5, Part* p6, Part* p7, Part* p8, Part* p9) +{ + std::map< Part*, std::set<Part*> > temp; + + temp[orig].insert(p1); + temp[orig].insert(p2); + temp[orig].insert(p3); + temp[orig].insert(p4); + temp[orig].insert(p5); + temp[orig].insert(p6); + temp[orig].insert(p7); + temp[orig].insert(p8); + temp[orig].insert(p9); + temp[orig].erase(static_cast<Part*>(NULL)); + temp[orig].erase(orig); + + informAboutNewParts(temp); +} diff --git a/muse2/muse/song.h b/muse2/muse/song.h index 872993e5..09174f71 100644 --- a/muse2/muse/song.h +++ b/muse2/muse/song.h @@ -27,6 +27,9 @@ #include <QObject> #include <QStringList> +#include <map> +#include <set> + #include "pos.h" #include "globaldefs.h" #include "tempo.h" @@ -163,6 +166,8 @@ class Song : public QObject { ~Song(); bool applyOperationGroup(Undo& group, bool doUndo=true); + void informAboutNewParts(const std::map< Part*, std::set<Part*> >&); + void informAboutNewParts(Part* orig, Part* p1, Part* p2=NULL, Part* p3=NULL, Part* p4=NULL, Part* p5=NULL, Part* p6=NULL, Part* p7=NULL, Part* p8=NULL, Part* p9=NULL); void putEvent(int pv); void endMsgCmd(); @@ -421,6 +426,7 @@ class Song : public QObject { void midiPortsChanged(); void midiNote(int pitch, int velo); void controllerChanged(Track* t); + void newPartsCreated(const std::map< Part*, std::set<Part*> >&); }; extern Song* song; diff --git a/muse2/muse/structure.cpp b/muse2/muse/structure.cpp index 9665ce5e..6c9d25dd 100644 --- a/muse2/muse/structure.cpp +++ b/muse2/muse/structure.cpp @@ -347,6 +347,8 @@ void globalSplit() p1->events()->incARef(-1); // the later song->applyOperationGroup() will increment it p2->events()->incARef(-1); // so we must decrement it first :/ + //song->informAboutNewParts(part, p1); // is unneccessary because of ModifyPart + song->informAboutNewParts(part, p2); operations.push_back(UndoOp(UndoOp::ModifyPart,part, p1, true, false)); operations.push_back(UndoOp(UndoOp::AddPart,p2)); break; |