void pasteTrack(int tracknum, int blocknum, int windownum){ if (tracknum==-1 && blocknum==-1){ struct Tracker_Windows *window=getWindowFromNum(windownum);if(window==NULL) return; CB_PasteTrack_CurrPos(window); return; } struct Tracker_Windows *window=NULL; struct WTracks *wtrack; struct WBlocks *wblock; wtrack=getWTrackFromNumA( windownum, &window, blocknum, &wblock, tracknum ); if(wtrack==NULL) return; if (cb_wtrack != NULL) { Undo_Open_rec();{ ADD_UNDO(Track(window, wblock, wtrack, wblock->curr_realline)); co_CB_PasteTrack(wblock, cb_wtrack, wtrack); }Undo_Close(); } window->must_redraw = true; }
void InsertTracks( struct Tracker_Windows *window, struct WBlocks *wblock, NInt tracknum, NInt toinsert ){ NInt lokke; NInt num_tracks; struct Blocks *block=wblock->block; struct WTracks *wtrack; struct Tracks *track; if(tracknum>=block->num_tracks+1 || tracknum<0) return; if(toinsert<=0){ if(toinsert<0) DeleteTracks(window,wblock,tracknum,-toinsert); return; } num_tracks=block->num_tracks+toinsert; PC_Pause();{ Block_Set_num_tracks(block,num_tracks); for(lokke=num_tracks-1;lokke>=tracknum+toinsert;lokke--){ wtrack=CB_CopyTrack( wblock, ListFindElement1(&wblock->wtracks->l,lokke-toinsert) ); co_CB_PasteTrack( wblock, wtrack, ListFindElement1(&wblock->wtracks->l,lokke) ); } for(lokke=tracknum;lokke<tracknum+toinsert;lokke++){ wtrack=ListFindElement1(&wblock->wtracks->l,lokke); track=wtrack->track; track->notes=NULL; track->stops=NULL; VECTOR_clean(&track->fxs); track->patch=NULL; } }PC_StopPause(NULL); }
void DeleteTracks( struct Tracker_Windows *window, struct WBlocks *wblock, NInt tracknum, NInt todelete ) { NInt lokke; NInt num_tracks; struct Blocks *block=wblock->block; struct WTracks *wtrack; if(tracknum>=block->num_tracks+1 || tracknum<0) return; if(tracknum-todelete>=block->num_tracks){ todelete=block->num_tracks-tracknum; } PC_Pause(); if(block->num_tracks==1){ CB_CutTrack_CurrPos(window); goto exit; } num_tracks=block->num_tracks-todelete; fprintf(stderr,"delete track. Curr: %d, num_tracks: %d, todelete: %d\n",tracknum,num_tracks,todelete); for(lokke=tracknum ; lokke<num_tracks-1+todelete;lokke++){ wtrack=CB_CopyTrack( wblock, ListFindElement1(&wblock->wtracks->l,lokke+todelete) ); co_CB_PasteTrack( wblock, wtrack, ListFindElement1(&wblock->wtracks->l,lokke) ); } Block_Set_num_tracks(block,num_tracks); exit: PC_StopPause(NULL); }
void CB_PasteTrack_CurrPos(struct Tracker_Windows *window){ struct WBlocks *wblock=window->wblock; struct Blocks *block=wblock->block; struct WTracks *wtrack=wblock->wtrack; Place lastplace; PlaceSetLastPos(wblock->block,&lastplace); PC_Pause(); switch(window->curr_track){ case SIGNATURETRACK: if(cb_signature==NULL) goto exit; ADD_UNDO(Signatures_CurrPos(window)); block->signatures=CB_CopySignatures(cb_signature); CutListAt_a(&block->signatures,&lastplace); UpdateWBlockWidths(window, wblock); UpdateBeats(block); //UpdateSTimes(block); //UpdateWLPBs(window,wblock); break; case LPBTRACK: if(cb_lpb==NULL) goto exit; ADD_UNDO(LPBs_CurrPos(window)); block->lpbs=CB_CopyLPBs(cb_lpb); CutListAt_a(&block->lpbs,&lastplace); UpdateSTimes(block); //UpdateWLPBs(window,wblock); UpdateBeats(block); #if !USE_OPENGL DrawUpLPBs(window,wblock); #endif break; case TEMPOTRACK: if(cb_tempo==NULL) goto exit; ADD_UNDO(Tempos_CurrPos(window)); block->tempos=CB_CopyTempos(cb_tempo); CutListAt_a(&block->tempos,&lastplace); //UpdateWTempos(window,wblock); #if !USE_OPENGL DrawUpTempos(window,wblock); #endif UpdateSTimes(block); break; case TEMPONODETRACK: if(cb_temponode==NULL) goto exit; ADD_UNDO(TempoNodes_CurrPos(window)); block->temponodes=CB_CopyTempoNodes(cb_temponode); CutListAt_a(&block->temponodes,&lastplace); LegalizeTempoNodes(block); #if !USE_OPENGL ///UpdateWTempoNodes(window,wblock); DrawUpWTempoNodes(window,wblock); #endif UpdateSTimes(block); break; default: if(cb_wtrack==NULL) goto exit; Undo_Open_rec();{ printf("curr_track_sub: %d\n",window->curr_track_sub); ADD_UNDO(Track_CurrPos(window)); if(window->curr_track_sub==-1 && cb_wtrack_only_contains_one_fxs==false){ // copy all printf("aaa\n"); if(co_CB_PasteTrack(wblock,cb_wtrack,wtrack)){ #if !USE_OPENGL UpdateFXNodeLines(window,wblock,wtrack); #endif window->must_redraw = true; }else{ #if !USE_OPENGL UpdateAndClearSomeTrackReallinesAndGfxWTracks( window, wblock, window->curr_track, window->curr_track ); #endif } }else{ printf("bbb\n"); // only copy fx struct WTracks *fromwtrack = cb_wtrack; if (cb_wtrack_only_contains_one_fxs==true){ // only copy one fx R_ASSERT(cb_wtrack->track->fxs.num_elements==1); struct FXs *fxs = cb_wtrack->track->fxs.elements[0]; vector_t *fxss = VECTOR_copy(&wtrack->track->fxs); remove_fxs_from_fxss(fxss, fxs); VECTOR_push_back(fxss, fxs); fromwtrack = CB_CopyTrack(wblock, cb_wtrack); fromwtrack->track->fxs = *VECTOR_copy(fxss); } if(co_CB_PasteTrackFX(wblock,fromwtrack,wtrack)){ #if !USE_OPENGL UpdateFXNodeLines(window,wblock,wtrack); #endif window->must_redraw = true; }else{ #if !USE_OPENGL UpdateAndClearSomeTrackReallinesAndGfxWTracks( window, wblock, window->curr_track, window->curr_track ); #endif } } }Undo_Close(); break; } SetNotePolyphonyAttributes(wtrack->track); ValidateCursorPos(window); exit: PC_StopPause(window); }
void TRACK_split_into_monophonic_tracks(struct Tracker_Windows *window, struct WBlocks *wblock, struct WTracks *wtrack){ PlayStop(); // This function is too chaotic. Don't bother pausing player. vector_t notesvector = {0}; struct Tracks *track = wtrack->track; struct Notes *notes = track->notes; struct Notes *notes_nexttrack = NULL; bool have_made_undo = false; if (NOTES_sorted_by_pitch_questionmark(track->notes)==false) { ADD_UNDO(Block_CurrPos(window)); have_made_undo = true; notes = NOTES_sort_by_pitch(notes); } while(notes != NULL){ struct Notes *notes_root = notes; while(notes != NULL) { struct Notes *next = NextNote(notes); if (next==NULL) break; if (PlaceGreaterThan(¬es->end, &next->l.p)){ if (have_made_undo==false) { have_made_undo=true; } ListRemoveElement3(¬es, &next->l); ListAddElement3_a(¬es_nexttrack, &next->l); } else notes = next; } VECTOR_push_back(¬esvector, notes_root); notes = notes_nexttrack; notes_nexttrack = NULL; } if (have_made_undo==false){ GFX_Message(NULL, "Track is already monophonic"); return; } int num_tracks = notesvector.num_elements; track->notes = NULL; struct WTracks *wtrack_copy = CB_CopyTrack(wblock,wtrack); VECTOR_clean(&wtrack_copy->track->fxs); InsertTracks(window, wblock, wtrack->l.num+1, num_tracks-1); printf("Vector length: %d\n",num_tracks); int i; for(i=0;i<num_tracks;i++){ struct Notes *notes = notesvector.elements[i]; printf(" %d: %d\n", i, ListFindNumElements3(¬es->l)); while(notes != NULL){ printf(" %s\n",NotesTexts3[(int)notes->note]); notes = NextNote(notes); } struct WTracks *towtrack = ListFindElement1(&wblock->wtracks->l, wtrack->l.num+i); if (i>0) co_CB_PasteTrack(wblock, wtrack_copy, towtrack); towtrack->track->notes = notesvector.elements[i]; } window->must_redraw = true; }
void CB_PasteBlock( struct Tracker_Windows *window, struct WBlocks *wblock, struct WBlocks *towblock ){ R_ASSERT(is_playing()==false); struct Blocks *block=wblock->block; struct Blocks *toblock=towblock->block; struct WTracks *towtrack=towblock->wtracks; struct WTracks *towtrack_wtrack=towblock->wtrack; struct Tracks *totrack=toblock->tracks; struct WTracks *wtrack; NInt wblocknum=towblock->l.num; struct ListHeader1 *nextwblock=towblock->l.next; NInt blocknum=toblock->l.num; struct ListHeader1 *nextblock=toblock->l.next; unsigned int org_color = toblock->color; NInt org_num_tracks=toblock->num_tracks; memcpy(towblock,wblock,sizeof(struct WBlocks)); memcpy(toblock,block,sizeof(struct Blocks)); toblock->color = org_color; // Don't want to paste color. towblock->l.next=nextwblock; towblock->l.num=wblocknum; towblock->block=toblock; towblock->wtracks=towtrack; towblock->wtrack=towtrack_wtrack; toblock->tracks=totrack; toblock->l.next=nextblock; toblock->l.num=blocknum; //printf("org num_tracks: %d, before: %d\n",org_num_tracks,toblock->num_tracks); toblock->num_tracks=org_num_tracks; Block_Set_num_tracks(toblock,block->num_tracks); TIME_everything_in_block_has_changed(towblock->block); // UpdateReallines requires updated time values (for whether to show swing type track or not). toblock->name=block->name; towblock->localzooms=NULL; CB_UnpackLocalZooms(&towblock->localzooms,wblock->localzooms,block->num_lines); //towblock->reallines=NULL; UpdateRealLines_dont_change_curr_realline(window, towblock); //towblock->wtempos=NULL; //towblock->wlpbs=NULL; toblock->swings=CB_CopySwings(block->swings, NULL); toblock->signatures=CB_CopySignatures(block->signatures); toblock->lpbs=CB_CopyLPBs(block->lpbs); toblock->tempos=CB_CopyTempos(block->tempos); toblock->temponodes=CB_CopyTempoNodes(block->temponodes); toblock->lasttemponode=(struct TempoNodes *)ListLast3(&toblock->temponodes->l); UpdateReallinesDependens(window,towblock); wtrack=wblock->wtracks; towtrack=towblock->wtracks; while(wtrack!=NULL){ if(towtrack==NULL){ RError("Error in funtion CB_PasteBlock in file clipboard_block_paste.c; towtrack=NULL\n"); break; } if(towtrack->l.num!=wtrack->l.num){ RError("Error in funtion CB_PasteBlock in file clipboard_block_paste.c; towtrack->l.num!=wtrack->l.num\n"); break; } co_CB_PasteTrack(towblock,wtrack,towtrack); towtrack=NextWTrack(towtrack); wtrack=NextWTrack(wtrack); } if(towtrack!=NULL){ RError("Error in funtion CB_PasteBlock in file clipboard_block_paste.c; towtrack!=NULL when wtrack==NULL\n"); } g_editor_blocks_generation++; BS_UpdateBlockList(); BS_UpdatePlayList(); }