Exemple #1
0
void Block_Properties(
	struct Blocks *block,
	NInt num_tracks,
	int num_lines
){
	if(num_tracks!=block->num_tracks){
		struct Tracker_Windows *window=root->song->tracker_windows;
		while(window!=NULL){
			struct WBlocks *wblock=(struct WBlocks *)ListFindElement1(&window->wblocks->l,block->l.num);
			SetCursorPosConcrete(window,wblock,0,-1);
			window=NextWindow(window);
		}
		Block_Set_num_tracks(block,num_tracks);
	}

	if(num_lines!=block->num_lines){
		Block_Set_num_lines(block,num_lines);
	}

	struct Tracker_Windows *window=root->song->tracker_windows;
	while(window!=NULL){
		struct WBlocks *wblock=ListFindElement1(&window->wblocks->l,block->l.num);
		if(wblock->curr_realline>=wblock->num_reallines){
			wblock->curr_realline = wblock->num_reallines-1;
		}

		UpdateReallinesDependens(window,wblock);
		window=NextWindow(window);
	}
}
Exemple #2
0
static void DrawAllWTrackOnOffs(
                                struct Tracker_Windows *window,
                                struct WBlocks *wblock
                                )
{

  struct WTracks *wtrack=(struct WTracks *)ListFindElement1(&wblock->wtracks->l,wblock->left_track);
  
  while(wtrack!=NULL && wtrack->l.num<=wblock->right_track){

	if(wtrack->track->onoff==0){
		GFX_T_Line(window,WAVEFORM_COLOR_NUM,
                           wtrack->x+2,wtrack->y+1,
                           wtrack->x2-2,wtrack->y+(window->org_fontheight*2)-1,
                           PAINT_BUFFER
		);
		GFX_T_Line(window,WAVEFORM_COLOR_NUM,
                           wtrack->x2-2,wtrack->y+1,
                           wtrack->x+2,wtrack->y+(window->org_fontheight*2)-1,
                           PAINT_BUFFER
		);
	}

        wtrack=NextWTrack(wtrack);
  }
}
Exemple #3
0
void *Undo_Do_Range(
	struct Tracker_Windows *window,
	struct WBlocks *wblock,
	struct WTracks *wtrack,
	int realline,
	void *pointer
){
	struct Range *undo_range=(struct Range *)pointer;
	struct WTracks *mywtrack;
	struct Tracks *track;
	struct Notes *notetemp;
	struct Stops *stoptemp;
	NInt num_tracks=undo_range->num_tracks;
	NInt lokke;

	for(lokke=0;lokke<num_tracks;lokke++){
		mywtrack=ListFindElement1(&wblock->wtracks->l,lokke+wtrack->l.num);
		track=mywtrack->track;
		notetemp=track->notes;
		stoptemp=track->stops;
		track->notes=undo_range->notes[lokke];
		track->stops=undo_range->stops[lokke];
		undo_range->notes[lokke]=notetemp;
		undo_range->stops[lokke]=stoptemp;
	}

	return undo_range;
}
void SetMouseActionWTrackBorder(
	struct Tracker_Windows *window,
	struct MouseAction *action,
	int x
){
	struct WBlocks *wblock=window->wblock;
	NInt wtracknum=wblock->left_track;
	NInt rwtracknum=wblock->right_track;
	struct WTracks *wtrack=ListFindElement1(&wblock->wtracks->l,wtracknum);
	struct WTracks *next=NextWTrack(wtrack);

	if(x<=wtrack->fxarea.x){
		SetMouseActionTempoNodeBorder(window,action,x);
		return;
	}

	for(;;){
		if(wtrack->l.num==rwtracknum) break;
		if(x>=wtrack->x2 && x<=next->fxarea.x) break;
		wtrack=next;
		next=NextWTrack(wtrack);
	}
	
	if(wtrack->x < wblock->t.x1) return; // Changing trackwidth of a partly shown track doesnt work quite well.

	action->eint1=wtrack->l.num;
	action->action=TRACKBORDER;
	action->MouseUpFunction= &MoveWTrackBorder_Mouse;
}
Exemple #5
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);
}
Exemple #6
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);
}
Exemple #7
0
int CursorLeft(struct Tracker_Windows *window,struct WBlocks *wblock){
	if(window->curr_track>0 || (0==window->curr_track && window->curr_track_sub>=0)){

		window->curr_track_sub--;

		if(window->curr_track_sub==-2){
                  do{
                    ATOMIC_INC(window->curr_track, -1);
                    R_ASSERT_RETURN_IF_FALSE2(window->curr_track >= 0, 0);
                    ATOMIC_WRITE(wblock->wtrack, ListFindElement1(&wblock->wtracks->l,window->curr_track));
                  }while(wblock->wtrack==NULL);
                  int num_subtracks = GetNumSubtracks(wblock->wtrack);
                  window->curr_track_sub=num_subtracks-1;
		}

		if(
			window->curr_track<wblock->left_track ||
			(window->curr_track==wblock->left_track && window->curr_track_sub<wblock->left_subtrack)
		){
                        wblock->left_subtrack=-1;//window->curr_track_sub;
			wblock->left_track=window->curr_track;
                        printf("   left_track: %d, left_subtrack: %d. curr_track: %d\n",wblock->left_track, wblock->left_subtrack,window->curr_track);
			//UpdateAllWTracksCoordinates(window,wblock);
                        UpdateWBlockCoordinates(window,wblock);
			return 2;
		}else{
                        printf("   left_track: %d, left_subtrack: %d, curr_track: %d\n",wblock->left_track, wblock->left_subtrack,window->curr_track);
			return 1;
		}
	}else{
                
                if (window->curr_track==TEMPOTRACK)
                  return 0;
                
		ATOMIC_INC(window->curr_track, -1);

                if (window->curr_track==TEMPONODETRACK && window->show_reltempo_track==false)
                  ATOMIC_INC(window->curr_track, -1);

                if (window->curr_track==LINENUMBTRACK)
                  ATOMIC_INC(window->curr_track, -1);

                if (window->curr_track==SIGNATURETRACK && window->show_signature_track==false)
                  ATOMIC_INC(window->curr_track, -1);
                
                if (window->curr_track==LPBTRACK && window->show_lpb_track==false)
                  ATOMIC_INC(window->curr_track, -1);
                
                if (window->curr_track==TEMPOTRACK && window->show_bpm_track==false)
                  set_curr_track_to_leftmost_legal_track(window);

		return 1;
	}
}
Exemple #8
0
// Simpler version when using opengl
void P2MUpdateSongPosCallBack(void){

  bool setfirstpos=ATOMIC_GET(root->setfirstpos);

  NInt curr_block_num = ATOMIC_GET(root->curr_blocknum);
  
  struct Tracker_Windows *window=root->song->tracker_windows;
  struct WBlocks *wblock = ListFindElement1(&window->wblocks->l,curr_block_num);

  int old_curr_realline = wblock->curr_realline;
  int till_curr_realline = R_BOUNDARIES(0, ATOMIC_GET(wblock->till_curr_realline), wblock->num_reallines-1); // till_curr_realline can be set from any thread, at any time, to any value.

  if (!ATOMIC_GET(root->play_cursor_onoff)){
    //printf("P2MUpdateSongPosCallBack: Setting to %d\n",till_curr_realline);
    wblock->curr_realline = till_curr_realline;
    wblock->top_realline += till_curr_realline - old_curr_realline;
    wblock->bot_realline += till_curr_realline - old_curr_realline;
  }
  
  if(pc->playtype==PLAYSONG)
    BS_SelectPlaylistPos(ATOMIC_GET2(root->curr_playlist));
  
  if(window->curr_block!=curr_block_num){
    //printf("Bef. w: %d, r: %d\n",window->curr_block,root->curr_block);
    if(setfirstpos){
      wblock->curr_realline=0;
      SetWBlock_Top_And_Bot_Realline(window,wblock);
      GE_set_curr_realline(0);
    }
    SelectWBlock(
                 window,
                 wblock
                 );
    //printf("Aft. w: %d, r: %d\n",window->curr_block,root->curr_block);
  }      


  // make sure "Rec" is updated
  {
    static struct Tracks *current_track = NULL;
    static bool current_track_recording = false;
    
    struct Tracks *track = wblock->wtrack->track;
    if (track != current_track || (current_track!=NULL && track->is_recording != current_track_recording)){
      current_track = track;
      current_track_recording = current_track->is_recording;
      GL_create(window, wblock);
    }
  }

  //GE_set_curr_realline(wblock->curr_realline);
  //  printf("till_curr_realline: %d\n",wblock->till_curr_realline);
  //ScrollEditorToRealLine(window,wblock,wblock->curr_realline);
}
Exemple #9
0
void PlaySongCurrPos(struct Tracker_Windows *window){
	struct Blocks *block;
	struct WBlocks *wblock;
	Place *place;
	int playpos;
	bool changeblock=false;

	wblock=window->wblock;

	PlayStopReally(false);

	root->setfirstpos=false;

	playpos=root->curr_playlist;
                
	block=BL_GetBlockFromPos(playpos);
	if(block==NULL) return;

	if(wblock->l.num!=block->l.num){
		wblock=ListFindElement1(&window->wblocks->l,block->l.num);
		changeblock=true;
		root->setfirstpos=true;
	}

	if(
		! changeblock &&
		playpos==root->song->length-1 &&
		wblock->curr_realline==wblock->num_reallines  // ??. Never supposed to happen.
	){
		return;
	}

	if(wblock->curr_realline==0) root->setfirstpos=true;


	debug("contsong, playpos: %d , root->curr_block: %d\n",playpos,root->curr_block);

	if(changeblock){
		place=PlaceGetFirstPos();
		pc->seqtime=0;
	}else{
		place=&wblock->reallines[wblock->curr_realline]->l.p;
		pc->seqtime=-Place2STime(wblock->block,place);
	}
	debug("contsong, time: %d, playpos: %d , root->curr_block: %d\n",pc->seqtime,playpos,root->curr_block);

	place->line++;
	debug("nextline: %d\n",Place2STime(wblock->block,place));
	place->line--;

	PlaySong(place,playpos);
}
Exemple #10
0
void Block_Set_num_tracks(
	struct Blocks *block,
	NInt num_tracks
){
	struct Tracker_Windows *window=root->song->tracker_windows;
	struct WBlocks *wblock;
	NInt org_num_tracks=block->num_tracks;
	NInt lokke;

	if(num_tracks==0){
		RError("Error in function 'Block_Set_num_tracks' in file 'block_properties.c'. num_tracks=0.\n");
		return;
	}

	if(num_tracks==org_num_tracks) return;

	block->num_tracks=num_tracks;

	if(num_tracks<org_num_tracks){
		CutListAt1(&block->tracks,num_tracks);
		while(window!=NULL){
			wblock=(struct WBlocks *)ListFindElement1(&window->wblocks->l,block->l.num);
			CutListAt1(&wblock->wtracks,num_tracks);
			window=NextWindow(window);
		}
	}else{
		for(lokke=org_num_tracks;lokke<num_tracks;lokke++){
			AppendTrack(block);
		}
		window=root->song->tracker_windows;
		while(window!=NULL){
			wblock=(struct WBlocks *)ListFindElement1(&window->wblocks->l,block->l.num);
			UpdateWTracks(window,wblock);
			window=NextWindow(window);
		}
	}

}
Exemple #11
0
static void DrawAllPianoRollHeaders_old(
                                    struct Tracker_Windows *window,
                                    struct WBlocks *wblock
                                    )
{  
  struct WTracks *wtrack=(struct WTracks *)ListFindElement1(&wblock->wtracks->l,wblock->left_track);
  
  while(wtrack!=NULL && wtrack->l.num<=wblock->right_track){

    //struct Tracks *track = wtrack->track;
    
    int x1 = wtrack->x + 2;
    int x2 = wtrack->panonoff.x1;
    int y1 = wtrack->panonoff.y1;
    //int y2 = wtrack->panonoff.y2;

    // Text
    //    GFX_SetClipRect(window,x1, 0, x2, wblock->t.y1, PAINT_BUFFER);
    {
      //static char temp[500];
      //sprintf(temp,"%d->%d:", wtrack1->l.num, wtrack2->l.num);
      int midpos1 = scale(1,0,3,x1,x2);
      int midpos2 = scale(2,0,3,x1,x2);

      //printf("_________ T_TEXT %d: %s %d %d %d. midpos: %d, x1: %d, x2: %d\n",wtrack->l.num,NotesTexts3[wtrack->pianoroll_lowkey],x1,y1,midpos-x1,midpos,x1,x2);
      GFX_T_Text(
                 window, 8, NotesTexts3[wtrack->pianoroll_lowkey],
                 x1,
                 y1+3,
                 midpos1 - x1,
                 TEXT_CLIPRECT|TEXT_SCALE|TEXT_CENTER|TEXT_BOLD,
                 PAINT_BUFFER
                 );

      printf("%d:, x1: %d, midpos1: %d, midpos2: %d, x2: %d\n",wtrack->l.num,x1, midpos1, midpos2, x2);
      
      GFX_T_Text(
                 window, 8, NotesTexts3[wtrack->pianoroll_highkey],
                 midpos2,
                 y1+3,
                 x2 - midpos2,
                 TEXT_CLIPRECT|TEXT_SCALE|TEXT_CENTER|TEXT_BOLD,
                 PAINT_BUFFER
                 );
    }
    //GFX_CancelClipRect(window,PAINT_BUFFER);

    wtrack=NextWTrack(wtrack);
  }
}
Exemple #12
0
void DLoadWTracks(
	struct Root *newroot,
	struct Tracker_Windows *window,
	struct WBlocks *wblock,
	struct WTracks *wtrack
){
if(wtrack==NULL) return;

	wtrack->fxonoff=1;
	wtrack->track=(struct Tracks *)ListFindElement1(&wblock->block->tracks->l,wtrack->l.num);


DLoadWTracks(newroot,window,wblock,NextWTrack(wtrack));
}
Exemple #13
0
bool SetCursorPosConcrete(
	struct Tracker_Windows *window,
	struct WBlocks *wblock,
	NInt tracknum,
	int subtrack
){
        struct WTracks *wtrack;
	int ret=0,tempret;

	if(tracknum>=wblock->block->num_tracks || tracknum<TEMPOTRACK) return false;

	if(tracknum<0){
		if(tracknum==window->curr_track) return true;

		if(tracknum>window->curr_track){
			while(window->curr_track!=tracknum){
				tempret=CursorRight(window,wblock);
				ret=R_MAX(tempret,ret);
			}
		}else{
			while(window->curr_track!=tracknum){
				tempret=CursorLeft(window,wblock);
				ret=R_MAX(tempret,ret);
			}
		}
	}else{
		wtrack=ListFindElement1(&wblock->wtracks->l,tracknum);
                int num_subtracks = GetNumSubtracks(wtrack);

		subtrack=R_MIN(num_subtracks-1,subtrack);

		if(tracknum==window->curr_track && subtrack==window->curr_track_sub)
                  return 0;

		if(tracknum>window->curr_track || (tracknum==window->curr_track && subtrack>window->curr_track_sub)){
			while(window->curr_track!=tracknum || window->curr_track_sub!=subtrack){
				tempret=CursorRight(window,wblock);
                                //printf("wtrack->num: %d, curr_track: %d, num_tracks: %d\n",wtrack->l.num, window->curr_track,wblock->block->num_tracks);
				ret=R_MAX(tempret,ret);
			}
		}else{
			while(window->curr_track!=tracknum || window->curr_track_sub!=subtrack){
				tempret=CursorLeft(window,wblock);
				ret=R_MAX(tempret,ret);
			}
		}
	}

	return true;
}
Exemple #14
0
int CursorLeft(struct Tracker_Windows *window,struct WBlocks *wblock){
	struct WTracks *wtrack=wblock->wtrack;

	if(window->curr_track>0 || (0==window->curr_track && window->curr_track_sub>=0)){

		window->curr_track_sub--;

		if(window->curr_track_sub==-2){
			wblock->wtrack=ListFindElement1(&wblock->wtracks->l,wtrack->l.num-1);
                        int num_subtracks = GetNumSubtracks(wblock->wtrack->track);
			window->curr_track_sub=num_subtracks-1;
			window->curr_track--;
		}

		if(
			window->curr_track<wblock->left_track ||
			(window->curr_track==wblock->left_track && window->curr_track_sub<wblock->left_subtrack)
		){
			wblock->left_subtrack=window->curr_track_sub;
			wblock->left_track=window->curr_track;
			UpdateAllWTracksCoordinates(window,wblock);
			return 2;
		}else{
			return 1;
		}
	}else{
                
                if (window->curr_track==TEMPOTRACK)
                  return 0;
                
		window->curr_track--;

                if (window->curr_track==TEMPONODETRACK && window->show_reltempo_track==false)
                  window->curr_track--;

                if (window->curr_track==LINENUMBTRACK)
                  window->curr_track--;

                if (window->curr_track==SIGNATURETRACK && window->show_signature_track==false)
                  window->curr_track--;
                
                if (window->curr_track==LPBTRACK && window->show_lpb_track==false)
                  window->curr_track--;
                
                if (window->curr_track==TEMPOTRACK && window->show_bpm_track==false)
                  set_curr_track_to_leftmost_legal_track(window);

		return 1;
	}
}
Exemple #15
0
void DeleteBlock(
	NInt blockpos
){
	struct Tracker_Windows *window=root->song->tracker_windows;
	struct WBlocks *wblock;
	struct Blocks *removed_block=ListFindElement1(&root->song->blocks->l,blockpos);
	struct Blocks *nextblock=NextBlock(removed_block);

	ListRemoveElement1(&root->song->blocks,&removed_block->l);

        {
          struct Blocks *block = nextblock;
          while(block!=NULL){
            block->l.num--;
            block=NextBlock(block);
          }
        }

	root->song->num_blocks--;

	while(window!=NULL){
		wblock=ListFindElement1(&window->wblocks->l,blockpos);
		ListRemoveElement1(
			&window->wblocks,
			&wblock->l
		);
		wblock=NextWBlock(wblock);
		while(wblock!=NULL){
			wblock->l.num--;
			wblock=NextWBlock(wblock);
		}
		window=NextWindow(window);
	}

        // Call BL_removeBlockFromPlaylist after blocklist is updated.
        BL_removeBlockFromPlaylist(removed_block);
}
Exemple #16
0
int CloseTrackerWindow(NInt place){
	struct Tracker_Windows *temp;

	temp=(struct Tracker_Windows *)ListFindElement1(&root->song->tracker_windows->l,place);

	if(temp==NULL) return 1;

	GFX_ShutDownVisual(temp);

//	temp->wblock=NULL;

	ListRemoveElement1(&root->song->tracker_windows,&temp->l);

	return 0;
}
Exemple #17
0
void UpdateSomeFXNodeLines(
	struct Tracker_Windows *window,
	struct WBlocks *wblock,
	NInt starttrack,
	NInt endtrack
){
	NInt lokke;

	struct WTracks *wtrack=ListFindElement1(&wblock->wtracks->l,starttrack);
	if(wtrack==NULL) return;

	for(lokke=0;lokke<=endtrack-starttrack;lokke++){
		UpdateFXNodeLines(window,wblock,wtrack);
		wtrack=NextWTrack(wtrack);
		if(wtrack==NULL) break;
	}

}
Exemple #18
0
static void DrawAllWTrackSliders(
                                 struct Tracker_Windows *window,
                                 struct WBlocks *wblock
                                 )
{
  struct WTracks *wtrack=(struct WTracks *)ListFindElement1(&wblock->wtracks->l,wblock->left_track);
  
  while(wtrack!=NULL && wtrack->l.num<=wblock->right_track){
    if(wtrack->x >= wblock->a.x2){
      break;
    }
    
    UpdatePanSlider(window,wblock,wtrack);
    UpdateVolumeSlider(window,wblock,wtrack);
    
    wtrack=NextWTrack(wtrack);
  }
}
void ADD_UNDO_FUNC(Block_Delete(NInt blockpos)){
	struct Tracker_Windows *window=root->song->tracker_windows;
	struct WBlocks *wblock=window->wblock;

	struct Undo_Block_InsertDelete *ubi=talloc(sizeof(struct Undo_Block_InsertDelete));
	ubi->blockpos=blockpos;
	ubi->wblock=(struct WBlocks *)ListFindElement1(&window->wblocks->l,blockpos);
        ubi->sequencer_state=SEQUENCER_get_state();

	Undo_Add(
		window->l.num,
		wblock->l.num,
		window->curr_track,
		wblock->curr_realline,
		ubi,
		Undo_Do_Block_Delete,
                "Block delete"
	);
}
void Undo_Block_Delete(
	NInt blockpos
){
	struct Tracker_Windows *window=root->song->tracker_windows;
	struct WBlocks *wblock=window->wblock;

	struct Undo_Block_InsertDelete *ubi=talloc(sizeof(struct Undo_Block_InsertDelete));
	ubi->blockpos=blockpos;
	ubi->wblock=(struct WBlocks *)ListFindElement1(&window->wblocks->l,blockpos);
        ubi->playlist=BL_copy();

	Undo_Add(
		window->l.num,
		wblock->l.num,
		window->curr_track,
		wblock->curr_realline,
		ubi,
		Undo_Do_Block_Delete
	);
}
Exemple #21
0
void InvertRange(
	struct WBlocks *wblock
){
	struct Tracks *track;
	int lokke;
	Place *p1,*p2;

	if( ! wblock->isranged) return;

	p1=getRangeStartPlace(wblock);
	p2=getRangeEndPlace(wblock);

	track=ListFindElement1(&wblock->block->tracks->l,wblock->rangex1);

	for(lokke=0;lokke<=wblock->rangex2-wblock->rangex1;lokke++){
		Invert_notes(track->notes,p1,p2,true,0);
		track=NextTrack(track);
	}

}
Exemple #22
0
void CutRange(
	struct Blocks *block,
	NInt starttrack,
	NInt endtrack,
	Place *p1,
	Place *p2
){
	struct Tracks *track;
	int lokke;

        endtrack = R_MIN(block->num_tracks-1, endtrack);
        if (endtrack < starttrack)
          return;
        
	track=ListFindElement1(&block->tracks->l,starttrack);

        PC_Pause();{

          for(lokke=0;lokke<=endtrack-starttrack;lokke++){
            CutRange_notes(&track->notes,track->notes,p1,p2);
            CutRange_stops(&track->stops,track->stops,p1,p2);
            track=NextTrack(track);
            if(track==NULL) break;
          }
          
          Place *startplace = p1;
          Place *endplace = p2;

          SCHEME_eval(
                      talloc_format("(cut-fx-range! %d %d %d (+ %d (/ %d %d)) (+ %d (/ %d %d)))",
                                    block->l.num,
                                    starttrack,
                                    endtrack,
                                    startplace->line, startplace->counter, startplace->dividor,
                                    endplace->line, endplace->counter, endplace->dividor
                                  )
                      );
          
        }PC_StopPause(NULL);
}
Exemple #23
0
void Undo_Range(
	struct Tracker_Windows *window,
	struct Blocks *block,
	NInt starttrack,
	NInt endtrack,
	int realline
){
	Place *p1=PlaceGetFirstPos();
	Place p2;
	struct Range *undo_range;
	NInt num_tracks;
	NInt lokke;
	struct Tracks *track;
	NInt num_tracks_in_block=block->num_tracks;

	if(endtrack>=num_tracks_in_block){
		num_tracks=num_tracks_in_block-1;
	}else{
		num_tracks=endtrack-starttrack+1;
	}

	undo_range=talloc(sizeof(struct Range));
	undo_range->notes=talloc((size_t)(sizeof(struct Notes *)*num_tracks));
	undo_range->stops=talloc((size_t)(sizeof(struct Stops *)*num_tracks));
	undo_range->num_tracks=num_tracks;

	PlaceSetLastPos(block,&p2);

	for(lokke=0;lokke<num_tracks;lokke++){
		track=ListFindElement1(&block->tracks->l,lokke+starttrack);
		CopyRange_stops(&undo_range->stops[lokke],track->stops,p1,&p2);
		CopyRange_notes(&undo_range->notes[lokke],track->notes,p1,&p2);
	}

	Undo_Add(window->l.num,block->l.num,starttrack,realline,
                 undo_range,Undo_Do_Range,
                 "Range",
                 LOC()
                 );
}
Exemple #24
0
void *Undo_Do_Block_Insert(
	struct Tracker_Windows *window,
	struct WBlocks *wblock,
	struct WTracks *wtrack,
	int realline,
	void *pointer
){
	struct Undo_Block_InsertDelete *ubi=(struct Undo_Block_InsertDelete *)pointer;

	if(ubi->wblock!=NULL){
		return Undo_Do_Block_Delete(window,wblock,wtrack,realline,pointer);
	}

	ubi->wblock=(struct WBlocks *)ListFindElement1(&window->wblocks->l,ubi->blockpos);
	DeleteBlock(ubi->blockpos);

        SEQUENCER_create_from_state(ubi->sequencer_state);
	BS_UpdateBlockList();
	BS_UpdatePlayList();

	return ubi;
}
Exemple #25
0
struct Blocks *InsertBlock_CurrPos(
                                   struct Tracker_Windows *window
                                   )
{
	struct WBlocks *wblock=window->wblock;
	NInt blockpos=wblock->l.num;

	ADD_UNDO(Block_Insert(blockpos));

        struct Blocks *ret;
        
        PC_Pause();{
          ret = InsertBlock(blockpos,wblock->block->num_tracks,wblock->block->num_lines,"NN");

          SelectWBlock(window,(struct WBlocks *)ListFindElement1(&window->wblocks->l,blockpos));

          BS_UpdateBlockList();
          BS_UpdatePlayList();

        }PC_StopPause(window);

        return ret;
}
Exemple #26
0
static void handleDirtyBlock(int blocknum){
  struct Tracker_Windows *window = root->song->tracker_windows;

  while(window!=NULL){
    struct WBlocks *wblock=ListFindElement1(&window->wblocks->l,blocknum);

    UpdateAllWTracksCoordinates(window,wblock);
    UpdateAndClearSomeTrackReallinesAndGfxWTracks(
                                                  window,
                                                  wblock,
                                                  0,
                                                  window->wblock->block->num_tracks-1
                                                  );


    if(wblock->curr_realline>=wblock->num_reallines){
      wblock->curr_realline=wblock->num_reallines-1;
    }

    UpdateReallinesDependens(window,wblock);
    window=NextWindow(window);
  }
}
Exemple #27
0
/************************************************************************
  FUNCTION
    These two functions works just like GetXSubTrack1 and 2, except
    that they also accept the tracks that contains to the block. Which
    is the signature-track, lpb-track, tempo-track, and the temponode-track.
************************************************************************/
int GetXSubTrack_B1(
	const struct WBlocks *wblock,
	NInt track,
	int subtrack
){
	if(track>=0) return GetXSubTrack1(ListFindElement1(&wblock->wtracks->l,track),subtrack);
	switch(track){
		case SIGNATURETRACK:
			return wblock->signaturearea.x;
			break;
		case LPBTRACK:
			return wblock->lpbarea.x;
			break;
		case TEMPOTRACK:
			return wblock->tempoarea.x;
			break;
		case TEMPONODETRACK:
			return wblock->temponodearea.x;
			break;
	};
	RError("Error in function GetXSubTrack_B1 in file gfx_subtrack.c\n");
	return 0;
}
Exemple #28
0
static void DrawAllWTrackNames(
                               struct Tracker_Windows *window,
                               struct WBlocks *wblock
                               )
{  
  struct WTracks *wtrack1 = (struct WTracks *)ListFindElement1(&wblock->wtracks->l,wblock->left_track);
  if (wtrack1==NULL)
    return;

  int tracknum1 = wtrack1->l.num;

  int channelnum1 = ATOMIC_GET(wtrack1->track->midi_channel);
  struct Patch   *patch1   = wtrack1->track->patch;
  struct WTracks *wtrack2  = NextWTrack(wtrack1);
  int tracknum2            = tracknum1;
  
  for(;;){
    int channelnum2 = wtrack2==NULL ? 0 : ATOMIC_GET(wtrack2->track->midi_channel);
    if (wtrack2==NULL || wtrack2->track->patch==NULL || patch1==NULL || wtrack2->track->patch != patch1 || channelnum2 != channelnum1){
      
      DrawWTrackNames(window, wblock, tracknum1, tracknum2);
      tracknum1 = tracknum2 = tracknum2+1;
      channelnum1 = channelnum2;
      patch1 = wtrack2==NULL ? NULL : wtrack2->track->patch;
      
    } else {
      tracknum2++;
    }

    if (wtrack2==NULL)
      break;
    else
      wtrack2 = NextWTrack(wtrack2);
  }

}
Exemple #29
0
void MIDIGetEvents(
		   struct Instruments *instrument,
		   int arg0,
		   int arg1,
		   int arg2,
		   int arg3
		   )
{
  struct Tracker_Windows *window=root->song->tracker_windows;
  struct Patch *patch=g_currpatch;
  struct PatchData *patchdata;
  int channel;

  switch(arg0){
  case MIDIEVENT_USE0x90FORNOTEOFF:
    useOx90ForNoteOff=arg1;
    break;
  case MIDIEVENT_NEWPATCH:
    SelectPatch(window,window->wblock->wtrack->track);
    return;
    break;
  case MIDIEVENT_SETSTANDARDVEL:
    if(g_currpatch==NULL){
      root->standardvel=arg1;
    }else{
      g_currpatch->standardvel=arg1;
    }
    break;
  case MIDIEVENT_CHANGECURRENTPATCH:
    {
      struct Patch *patch=NULL;
      
      if(arg1!=0){
	patch=ListFindElement1(&instrument->patches->l,arg1);
      }
      
      if( ! is_playing()){
	window->wblock->wtrack->track->patch=patch;
        if (patch != NULL)
          patch->has_been_assigned_to_editor_track = true;
	DrawWTrackHeader(window,window->wblock,window->wblock->wtrack);
      }
      instrument->PP_Update(instrument,patch,false);
    }
    break;
  case MIDIEVENT_CHANGECURRENTPORT:
    printf("MIDIEVENT_CHANGE.. %d\n",arg1);
    break;
  default:
    break;
  }

  if(g_currpatch==NULL) return;

  patchdata=(struct PatchData *)patch->patchdata;
  channel=patchdata->channel;
  struct MidiPort *midi_port = patchdata->midi_port;

  printf("Got MidiEvent %d, %d,%d,%d\n",arg0,arg1,arg2,arg3);


  if(arg0>0x7f){
    R_PutMidi3(midi_port,arg0,arg1,arg2);
  }else{
    switch(arg0){
    case MIDIEVENT_SETMIDIINPUT:
      break;
    case MIDIEVENT_CHANGEPATCHNAME:
      break;    
    case MIDIEVENT_SETPORT:
      break;
    case MIDIEVENT_CHANGEPORT:
      break;
    case MIDIEVENT_SETCHANNEL:
      if(arg1<1 || arg1>16){
	MIDIGFX_SetChannel(patchdata->channel);
      }else{
	patchdata->channel=arg1-1;
	MIDIGFX_UpdateAll();
      }
      break;
    case MIDIEVENT_SETMSB:
      if(arg1>=-1 && arg1<128){
	patchdata->MSB=arg1;
      }else{
	MIDIGFX_SetMSB(patchdata->MSB);
      }
      break;
    case MIDIEVENT_SETLSB:
      if(arg1>=-1 && arg1<128){
	patchdata->LSB=arg1;
      }else{
	MIDIGFX_SetLSB(patchdata->LSB);
      }
      break;
    case MIDIEVENT_SETPRESET:
      patchdata->preset=arg1-1;
      break;
    case MIDIEVENT_PANNINGONOFF:
      patchdata->panonoff=patchdata->panonoff?false:true;
      MIDIGFX_SetPanSlider(patchdata->panonoff,patchdata->pan);
      break;
    case MIDIEVENT_SETPANNING:
      patchdata->pan=arg1;
      D_PutMidi3(midi_port,0xb0|channel,0xa,patchdata->pan);
      break;
    case MIDIEVENT_SETVOLONOFF:
      patchdata->volumeonoff=patchdata->volumeonoff?false:true;
      MIDIGFX_SetVolumeSlider(patchdata->volumeonoff,patchdata->volume);
      break;
    case MIDIEVENT_SETVOL:
      patchdata->volume=arg1;
      D_PutMidi3(midi_port,0xb0|channel,0x7,patchdata->volume);
      break;
    case MIDIEVENT_CC_ONOFF:
      patchdata->ccsonoff[arg1]=arg2==1?true:false;
      MIDIGFX_SetCCSlider(arg1,patchdata->ccsonoff[arg1],patchdata->ccvalues[arg1]);
      break;
    case MIDIEVENT_CC_VAL:
      patchdata->ccvalues[arg1]=arg2;
      break;
    default:
      printf("Unknown MIDIEVENT message: %d\n",arg0);
      break;
    }
  }
}
Exemple #30
0
int MoveWTrackBorder_Mouse(
	struct Tracker_Windows *window,
	float x,float y
){
	struct WBlocks *wblock=window->wblock;
	struct WTracks *wtrack=(struct WTracks *)ListFindElement1_r0(&wblock->wtracks->l,(NInt)window->prevaction.eint1);

        if(window->prevaction.action==NOACTION)
          window->must_redraw=true; // fix up slightly skewed gradient caused by the direct blitting. (blitting is wrong, but it's faster)

	if(wtrack==NULL) return 0;

	x=R_BOUNDARIES(wtrack->fxarea.x+3, x, wblock->t.x2-3);

	int oldfxwidth=wtrack->fxwidth;

	wtrack->fxwidth=x - wtrack->fxarea.x;
	wtrack->fxwidth=R_MAX(wtrack->fxwidth,2);

	if(oldfxwidth==wtrack->fxwidth && window->prevaction.action!=NOACTION){
	  return 0;
	}

#if !USE_OPENGL
        NInt oldrighttrack=wblock->right_track;

	GFX_BitBlt(window,wtrack->fxwidth-oldfxwidth,0,
		     wtrack->fxarea.x2-2,wblock->a.y1,
		     wblock->a.x2,wblock->t.y2
		     );
#endif

	UpdateWBlockCoordinates(window,wblock);

	DrawAllWTrackHeaders(window,wblock);

#if !USE_OPENGL
	DrawUpWTrack(window,wblock,wtrack);
	
	struct WTracks *wtrack2;

	if(oldfxwidth>wtrack->fxwidth){
	  wtrack2=ListFindElement1(&wblock->wtracks->l,oldrighttrack);
	  while(wtrack2!=NULL && wtrack2->l.num<=wblock->right_track){
	    DrawUpWTrack(window,wblock,wtrack2);
	    DrawWTrackHeader(window,wblock,wtrack2);
	    wtrack2=NextWTrack(wtrack2);
	  }
	}else{
	  while(GetXSubTrack_B2(wblock,window->curr_track,window->curr_track_sub)+3>=wblock->a.x2){
	    window->curr_track_sub--;
	    if(window->curr_track_sub==-2){
	      wblock->wtrack=ListFindElement1(&wblock->wtracks->l,window->curr_track-1);
	      window->curr_track_sub=wblock->wtrack->num_vel-1;
	      window->curr_track--;
	    }
	  }
	}
	
	wtrack2=ListLast1(&wblock->wtracks->l);
	if(wtrack2->fxarea.x2<wblock->a.x2){
          GFX_FilledBox(window,0,
                        wtrack2->fxarea.x2+1,wblock->a.y1,
                        wblock->a.x2,wblock->t.y1,
                        PAINT_BUFFER);
	  GFX_FilledBox(window,0,wtrack2->fxarea.x2+3,wblock->a.y1,wblock->a.x2,wblock->t.y2,PAINT_BUFFER);
          EraseAllLines(window,wblock,
                        wtrack2->x, wtrack2->x2);
	}

	UpdateBottomSlider(window);
	
	if(wtrack->fxarea.x2<wblock->a.x2){
	  Blt_mark(window,wblock->top_realline,wblock->bot_realline,
		   wtrack->fxarea.x2,wblock->a.x2
		   );
	  Blt_marktrackheader(window,wtrack->l.num,wblock->right_track);
	}

#else
	UpdateBottomSlider(window);
        {
            struct WTracks *wtrack2=wtrack;
	    while(wtrack2!=NULL && wtrack2->l.num<=wblock->right_track){
	      DrawAllWTrackHeaders(window,wblock);
	      wtrack2=NextWTrack(wtrack2);
	    }
	  }

#endif
                   //window->must_redraw=true;
	
	return 0;
}