void copyTrack(int tracknum, int blocknum, int windownum){ struct Tracker_Windows *window=getWindowFromNum(windownum);if(window==NULL) return; if (tracknum==-1 && blocknum==-1){ CB_CopyTrack_CurrPos(window); } else { struct Tracker_Windows *window=NULL; struct WTracks *wtrack; struct WBlocks *wblock; wtrack=getWTrackFromNumA( windownum, &window, blocknum, &wblock, tracknum ); if(wtrack==NULL) return; cb_wtrack = CB_CopyTrack(wblock, wtrack); } 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 CB_CutFx_Force( struct WBlocks *wblock, struct WTracks *wtrack ){ struct FXs *fxs=wtrack->track->fxs; cb_wtrack=CB_CopyTrack(wblock,wtrack); wtrack->track->notes=NULL; wtrack->track->stops=NULL; while(fxs!=NULL){ (*fxs->fx->closeFX)(fxs->fx,wtrack->track); fxs=NextFX(fxs); } wtrack->track->fxs=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; }