int addNote2(float notenum,int velocity, int line,int counter,int dividor, int end_line,int end_counter,int end_dividor, int windownum, int blocknum, int tracknum) { struct Tracker_Windows *window; struct WBlocks *wblock=getWBlockFromNumA(-1,&window,blocknum); struct WTracks *wtrack=getWTrackFromNum(windownum,blocknum,tracknum); if(wblock==NULL || wtrack==NULL) { GFX_Message(NULL, "unknown wblock(%p) or wtrack(%p) %d/%d/%d\n",wblock,wtrack,windownum,blocknum,tracknum); return -1; } Place *place = PlaceCreate(line,counter,dividor); ValidatePlace(place); if (!PlaceLegal(wblock->block, place)) { GFX_Message(NULL, "Place %d + %d/%d is not legal", line, counter, dividor); return -1; } Place *end_place = end_line==-1 ? NULL : PlaceCreate(end_line,end_counter,end_dividor); ValidatePlace(end_place); if (end_place != NULL && !PlaceLegal(wblock->block, end_place)) { GFX_Message(NULL, "Place %d + %d/%d is not legal", end_line, end_counter, end_dividor); return -1; } struct Notes *note = InsertNote(wblock, wtrack, place, end_place, notenum, velocity, true); window->must_redraw=true; return ListFindElementPos3(&wtrack->track->notes->l,¬e->l); }
void NOTE_validate(const struct Blocks *block, struct Tracks *track, struct Notes *note){ R_ASSERT_RETURN_IF_FALSE(block!=NULL); R_ASSERT_RETURN_IF_FALSE(note!=NULL); R_ASSERT(track==NULL || PLAYER_current_thread_has_lock() || is_playing()==false); if (note->note<=0.0f){ RError("notenum<=0.0f: %f. Setting to 0.01",note->note); note->note=0.01f; } if(note->note>=128.0f){ RError("notenum>=128.0f: %f. Setting to 127.99",note->note); note->note=127.99; } set_legal_start_and_end_pos(block, track, note); ValidatePlace(¬e->l.p); ValidatePlace(¬e->end); }
/************************************************************** FUNCTION Set the _end attributes for note 'note'. Finds next note to stop at, or block length. **************************************************************/ void SetEndAttributes( const struct Blocks *block, const struct Tracks *track, struct Notes *note ){ Place *place; Place *p1=NULL,*p2=NULL; bool endSetEarlier = PlaceGreaterThan(¬e->end, ¬e->l.p); Place *earliest = endSetEarlier ? ¬e->end : ¬e->l.p; struct ListHeader3 *nextnote=note->l.next; while(nextnote!=NULL){ if(PlaceGreaterThan(&nextnote->p, earliest)){ p1 = &nextnote->p; break; } nextnote=nextnote->next; } struct ListHeader3 *stop= &track->stops->l; while(stop!=NULL){ if(PlaceGreaterThan(&stop->p, earliest)){ p2 = &stop->p; break; } stop=stop->next; } place=PlaceMin(p1,p2); if(place!=NULL){ note->end.line=place->line; note->end.counter=place->counter; note->end.dividor=place->dividor; }else{ PlaceSetLastPos(block, ¬e->end); note->noend=1; } ValidatePlace(¬e->end); }