예제 #1
0
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;
}
예제 #2
0
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);
}
예제 #3
0
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);
}
예제 #4
0
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);
}
예제 #5
0
파일: tracks.c 프로젝트: onukore/radium
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(&notes->end, &next->l.p)){

        if (have_made_undo==false) {
            have_made_undo=true;
        }
        
        ListRemoveElement3(&notes, &next->l);                           
        ListAddElement3_a(&notes_nexttrack, &next->l);

      } else
        notes = next;
    }

    VECTOR_push_back(&notesvector, 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(&notes->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;
}
예제 #6
0
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();
}