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); }
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 ) ); */ }
static struct Velocities *add_velocity( int velocityvelocity, const Place *placement, struct Notes *note, int *pos ) { *pos = -1; if(PlaceLessOrEqual(placement, ¬e->l.p)) return NULL; if(PlaceGreaterOrEqual(placement, ¬e->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(¬e->velocities,&velocity->l); }PLAYER_unlock(); if (*pos==-1) return NULL; else return velocity; }
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; }
// 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); }
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; }
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; }
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; }
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; }
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; }
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); }
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 ); } }
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); }