Пример #1
0
static void increase_note_velocity(struct Notes *note, int inc){
  int maxvelocity=MAX_VELOCITY;
  
  note->velocity=R_BOUNDARIES(0,note->velocity+inc,maxvelocity);
  
  struct Velocities *velocity = note->velocities;
  while(velocity != NULL){
    velocity->velocity = R_BOUNDARIES(0,velocity->velocity+inc,maxvelocity);
    velocity = NextVelocity(velocity);
  }
  note->velocity_end=R_BOUNDARIES(0,note->velocity_end+inc,maxvelocity);
}
Пример #2
0
static void MIDIchangeTrackPan(int newpan,const struct Tracks *track){
	struct PatchData *patchdata=(struct PatchData *)track->patch->patchdata;

        if(patchdata==NULL)
          return;

	D_PutMidi3(
		patchdata->midi_port,
		0xb0|patchdata->channel,
		10,
		R_BOUNDARIES(
                             0,
                             (127*(newpan+MAXTRACKPAN)/(MAXTRACKPAN*2)),
                             127
		)
	);
/*
	RError("newpan: %d, pan: %d\n",
		newpan,
		boundaries(
			0,
			(127*(newpan+MAXTRACKPAN)/(MAXTRACKPAN*2)),
			127
		)
	);
*/
}
Пример #3
0
static struct Velocities *add_velocity(
                                int velocityvelocity,
                                const Place *placement,
                                struct Notes *note,
                                int *pos
                                )
{
  *pos = -1;
  
  if(PlaceLessOrEqual(placement, &note->l.p)) return NULL;
  if(PlaceGreaterOrEqual(placement, &note->end)) return NULL;
  struct Velocities *velocity=(struct Velocities*)talloc(sizeof(struct Velocities));
  PlaceCopy(&velocity->l.p,placement);
  velocity->velocity=R_BOUNDARIES(0,velocityvelocity,MAX_VELOCITY);
  
  /* ListAddElement3_ns returns -1 (and doesnt do anything else)
     if there allready is an element with the same placement. */

  PLAYER_lock();{
    *pos = ListAddElement3_ns(&note->velocities,&velocity->l);
  }PLAYER_unlock();

  if (*pos==-1)
    return NULL;
  else
    return velocity;
}
Пример #4
0
static int MoveRelTempoSlider_Mouse(
	struct Tracker_Windows *window,
	float x,float y
){
	struct WBlocks *wblock=window->wblock;

	if(wblock!=(struct WBlocks *)window->prevaction.pointer1) return 0;

	wblock->block->reltempo=R_BOUNDARIES(
		MINBLOCKRELTIME,
		MINBLOCKRELTIME+(((MAXBLOCKRELTIME-MINBLOCKRELTIME)*((float)(x-wblock->reltempo.x1)))/((float)(wblock->reltempo.x2-wblock->reltempo.x1))),
		MAXBLOCKRELTIME
	);

        update_statusbar(window);

	DrawBlockRelTempo(window,wblock);

        TRACKREALLINES_update_peak_tracks(window,NULL);

#if !USE_OPENGL
        WBLOCK_DrawTempoColor(window,wblock,0,wblock->num_reallines);

        DrawUpAllWTracks(window,wblock,NULL);
#endif

	return 0;
}
Пример #5
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);
}
Пример #6
0
void GFX_SetBrightness(struct Tracker_Windows *tvisual, float how_much){
  EditorWidget *editorwidget=(EditorWidget *)tvisual->os_visual.widget;
  if(is_starting_up)
    return;
  return;
#if 0
  float threshold = QColor(SETTINGS_read_string(talloc_format("color%d",15),"#d0d5d0")).valueF();
  
  for(int i=0;i<15;i++){
    QColor color = QColor(SETTINGS_read_string(talloc_format("color%d",i),"#d0d5d0"));
      
    //QColor color = editorwidget->colors[i];
    float value = color.valueF();
    if (value > threshold)
      color = color.lighter(scale(how_much, 0, 1, 0, 200));
    else
      color = color.darker(scale(how_much, 0, 1, 0, 200));

    if (i!=11)
      setColor((enum ColorNums)i, color.rgb());
    printf("value for %d: %f\n",i,value);
    //color.setLightntess(lightness
  }
#else
  
  how_much = scale(how_much,0,1,-1,1);

  for(int i=0;i<16;i++){
    QColor color = QColor(SETTINGS_read_string(talloc_format("color%d",i),"#d0d5d0"));

    qreal h,s,v,a;
    color.getHsvF(&h,&s,&v,&a);

    float value = R_BOUNDARIES(0,v+how_much,1);
    color.setHsvF(h, s, value, a);
    
    //QColor color = editorwidget->colors[i];
    setColor((enum ColorNums)i, color.rgb());
    
    printf("value for %d: %f. s: %f, how_much: %f\n",i,value,s,how_much);
    //color.setLightntess(lightness
  }
#endif
  
  updateAll(editorwidget);
  tvisual->must_redraw = true;
}
Пример #7
0
void setPianorollLowKey(int key, int tracknum, int blocknum, int windownum){
  struct Tracker_Windows *window;
  struct WBlocks *wblock;
  struct WTracks *wtrack = getWTrackFromNumA(windownum, &window, blocknum, &wblock, tracknum);
  if (wtrack==NULL)
    return;

  int newkey = R_BOUNDARIES(0, key, 127);

  if (wtrack->pianoroll_highkey - newkey < 5)
    return;
  
  wtrack->pianoroll_lowkey = newkey;
  
  UpdateWBlockCoordinates(window,wblock);
  window->must_redraw=true;
}
Пример #8
0
void GFX_Point(
               struct Tracker_Windows *window,
               int color,
               int brightness,
               int x,int y,
               int where
               )
{
  if(where==PAINT_DIRECTLY){
    RError("GFX_Point can not be called with where==PAINT_DIRECTLY");
    return;
  }

  if(color>=16 || color<0){
    RError("Illegal color: %d",color);
    color = R_ABS(color) % 16;
  }

  brightness = R_BOUNDARIES(0, brightness, MAX_BRIGHTNESS);

#if 0
  OS_GFX_Point(window,color,brightness,x,y,where);
  return;
#endif

  struct Points *point=points[color][brightness];
  if(point==NULL)
    points[color][brightness] = point = calloc(1,sizeof(struct Points));

  int pos = point->pos;

  if(point->pos==point->size){
    point->size = R_MAX(128,point->size*2);
    point->x=realloc(point->x,point->size*sizeof(uint16_t));
    point->y=realloc(point->y,point->size*sizeof(uint16_t));
  }

  point->x[pos] = x;
  point->y[pos] = y;
  point->pos = pos+1;

  is_dirty=true;
}
Пример #9
0
int AddFXNodeLine(
                  struct Tracker_Windows *window,
                  struct WBlocks *wblock,
                  struct WTracks *wtrack,
                  int fxnum,
                  int val,
                  const Place *p1
){
	struct FXs *fxs=ListFindElement1_r0(&wtrack->track->fxs->l,fxnum);
	struct FXNodeLines *fxnodeline=talloc(sizeof(struct FXNodeLines));

        int ret;
        
        PLAYER_lock();{
          fxnodeline->val=R_BOUNDARIES(fxs->fx->min, val, fxs->fx->max);
          PlaceCopy(&fxnodeline->l.p,p1);
          ret = ListAddElement3_ns(&fxs->fxnodelines,&fxnodeline->l);
        }PLAYER_unlock();

        return ret;
}
Пример #10
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;
}
Пример #11
0
void TBOX_within(TBox *in,TBox *within){
  in->x1=R_BOUNDARIES(within->x1,in->x1,within->x2);
  in->x2=R_BOUNDARIES(within->x1,in->x2,within->x2);
  in->y1=R_BOUNDARIES(within->y1,in->y1,within->y2);
  in->y2=R_BOUNDARIES(within->y1,in->y2,within->y2);
}
Пример #12
0
void DrawSlider_old(
	struct Tracker_Windows *window,
	TBox *box,
	float f_val,
	float f_min,
	float f_max,
	bool onoff,
	bool t
){

	int y1=box->y1+1;
	int y2=box->y2-1;

	int max=(int)(1000*(f_max-f_min));
	int val=(int)(1000*(f_val-f_min));

	if(y2<y1){
		y1--;
		y2++;
	}

	if(t){
          GFX_T_Box(
		window,1,
		box->x1,box->y1,
		box->x2,box->y2,
                PAINT_BUFFER
	);

	if(!onoff){
		GFX_T_FilledBox(
			window,0,
			box->x1+1,y1,
			box->x2-1,y2,
                        PAINT_BUFFER
		);
		GFX_T_FilledBox(
			window,3,
			R_BOUNDARIES(
				box->x1+1,
				box->x1+((box->x2-box->x1)*val/max)-3,
				box->x2-1
			),
			y1,
			R_BOUNDARIES(
				box->x1+1,
				box->x1+((box->x2-box->x1)*val/max)+3,
				box->x2-1
			),
			y2,
                        PAINT_BUFFER
		);
		GFX_T_FilledBox(
			window,1,
			R_BOUNDARIES(
				box->x1+1,
				box->x1+((box->x2-box->x1)*val/max),
				box->x2-1
			),
			y1,
			R_BOUNDARIES(
				box->x1+1,
				box->x1+((box->x2-box->x1)*val/max),
				box->x2-1
			),
			y2,
                        PAINT_BUFFER
		);
		return;
	}

	GFX_T_FilledBox(
		window,2,
		box->x1+1,y1,
		box->x2-1,y2,
                PAINT_BUFFER
	);

	GFX_T_FilledBox(
		window,3,
		R_BOUNDARIES(
			box->x1+1,
			box->x1+((box->x2-box->x1)*val/max)-9,
			box->x2-1
		),
		y1,
		R_BOUNDARIES(
			box->x1+1,
			box->x1+((box->x2-box->x1)*val/max)+9,
			box->x2-1
		),
		y2,
                PAINT_BUFFER
	);

	GFX_T_FilledBox(
		window,1,
		R_BOUNDARIES(
			box->x1+1,
			box->x1+((box->x2-box->x1)*val/max)-3,
			box->x2-1
		),
		y1,
		R_BOUNDARIES(
			box->x1+1,
			box->x1+((box->x2-box->x1)*val/max)+3,
			box->x2-1
		),
		y2,
                PAINT_BUFFER
	);

	GFX_T_FilledBox(
		window,2,
		R_BOUNDARIES(
			box->x1+1,
			box->x1+((box->x2-box->x1)*val/max),
			box->x2-1
		),
		y1,
		R_BOUNDARIES(
			box->x1+1,
			box->x1+((box->x2-box->x1)*val/max),
			box->x2-1
		),
		y2,
                PAINT_BUFFER
                          );
	}else{
	GFX_Box(
		window,1,
		box->x1,box->y1,
		box->x2,box->y2,
                PAINT_DIRECTLY
	);

	if(!onoff){
		GFX_FilledBox(
			window,0,
			box->x1+1,y1,
			box->x2-1,y2,
                        PAINT_DIRECTLY

		);
		GFX_FilledBox(
			window,3,
			R_BOUNDARIES(
				box->x1+1,
				box->x1+((box->x2-box->x1)*val/max)-3,
				box->x2-1
			),
			y1,
			R_BOUNDARIES(
				box->x1+1,
				box->x1+((box->x2-box->x1)*val/max)+3,
				box->x2-1
			),
			y2,
                        PAINT_DIRECTLY
		);
		GFX_FilledBox(
			window,1,
			R_BOUNDARIES(
				box->x1+1,
				box->x1+((box->x2-box->x1)*val/max),
				box->x2-1
			),
			y1,
			R_BOUNDARIES(
				box->x1+1,
				box->x1+((box->x2-box->x1)*val/max),
				box->x2-1
			),
			y2,
                        PAINT_DIRECTLY
		);
		return;
	}

	GFX_FilledBox(
		window,2,
		box->x1+1,y1,
		box->x2-1,y2,
                PAINT_DIRECTLY

	);

	GFX_FilledBox(
		window,3,
		R_BOUNDARIES(
			box->x1+1,
			box->x1+((box->x2-box->x1)*val/max)-9,
			box->x2-1
		),
		y1,
		R_BOUNDARIES(
			box->x1+1,
			box->x1+((box->x2-box->x1)*val/max)+9,
			box->x2-1
		),
		y2,
                PAINT_DIRECTLY
	);

	GFX_FilledBox(
		window,1,
		R_BOUNDARIES(
			box->x1+1,
			box->x1+((box->x2-box->x1)*val/max)-3,
			box->x2-1
		),
		y1,
		R_BOUNDARIES(
			box->x1+1,
			box->x1+((box->x2-box->x1)*val/max)+3,
			box->x2-1
		),
		y2,
                PAINT_DIRECTLY
	);

	GFX_FilledBox(
		window,2,
		R_BOUNDARIES(
			box->x1+1,
			box->x1+((box->x2-box->x1)*val/max),
			box->x2-1
		),
		y1,
		R_BOUNDARIES(
			box->x1+1,
			box->x1+((box->x2-box->x1)*val/max),
			box->x2-1
		),
		y2,
                PAINT_DIRECTLY
	);
	}
}
Пример #13
0
static void RT_set_effect_value(struct SoundPlugin *plugin, int block_delta_time, int effect_num, float floatvalue, enum ValueFormat value_format, FX_when when){
  Data *data = (Data*)plugin->data;

  int minval;
  int maxval;
  
  get_minval_and_maxval(effect_num, &minval, &maxval);
  
  int value;
  
  if(value_format==PLUGIN_FORMAT_SCALED)
    value = scale(floatvalue, 0, 1, minval-1, maxval+1);
  else
    value = floatvalue;

  value = R_BOUNDARIES(minval, value, maxval);

  data->values[effect_num] = value;

  //printf("minval: %d, maxval: %d, floatvalue: %f, value: %d (%d)\n",minval,maxval,floatvalue,value,(int)scale(floatvalue, 0, 1, minval, maxval));
  
  switch(effect_num){
  case CHANNEL:
    break;
  case PROGRAM_CHANGE:
    if (value!=-1)
      send_msg(plugin, block_delta_time, 0xc0, value, -1);
    break;
  case CHANNEL_AFTERTOUCH:
    if (value!=-1)
      send_msg(plugin, block_delta_time, 0xd0, value, -1);
    break;
  case PITCH_BEND:
    {
      if (value!=-8193) {
        uint32_t val = value;
        val += 0x2000;
        send_msg(plugin, block_delta_time, 0xe0, val&127, val>>7);
      }
      break;
      }
#define CASE(a,b)                                                       \
    case a:                                                             \
      if (value!=-1) send_msg(plugin, block_delta_time, 0xb0, b, value); \
      break;
    
    CASE(MSB,0);
    CASE(LSB,0x20);
    CASE(MODULATION_WHEEL,1);
    CASE(BREATH_CONTROLLER, 2);
    CASE(FOOT_CONTROLLER,4);
    CASE(PORTAMENTO_TIME,5);
    CASE(CHANNEL_VOLUME,7);
    CASE(BALANCE,9);
    CASE(PAN,0xa);
    CASE(EXPRESSION_CONTROLLER,0xb);
    CASE(EFFECT_CONTROLLER_1,0xc);
    CASE(EFFECT_CONTROLLER_2,0xd);
    CASE(GENERAL_PURPOSE_CONTROLLER_1,80);
    CASE(GENERAL_PURPOSE_CONTROLLER_2,81);
    CASE(GENERAL_PURPOSE_CONTROLLER_3,82);
    CASE(GENERAL_PURPOSE_CONTROLLER_4,83);

    CASE(REVERB,0x5b);
    CASE(TREMOLO,0x5c);
    CASE(CHORUS,0x5d);
    CASE(CELESTE,0x5e);
    CASE(PHASER,0x5f);
#undef CASE

#define CASE(a, b)                            \
    case a:                                      \
      if (value!=-1) send_msg(plugin, block_delta_time, 0xb0, b, value*64); \
      break;
    
    // booleans:
    CASE(DAMPER_ONOFF,0x40);
    CASE(PORTAMENTO_ONOFF,0x41);
    CASE(SOSTENUTO_ONOFF,0x42);
    CASE(SOFT_PEDAL_ONOFF,0x43);
    CASE(LEGATO_FOOTSWITCH,0x44);
    CASE(HOLD2_ONOFF,0x45);
#undef CASE

  default:
    RError("Unknown effect_num %d for Midi Message",effect_num);
  }