void RemoveNoteCurrPos(struct Tracker_Windows *window){ struct WBlocks *wblock = window->wblock; struct WTracks *wtrack = wblock->wtrack; struct Tracks *track = wtrack->track; struct LocalZooms *realline = wblock->reallines[wblock->curr_realline]; int curr_realline = wblock->curr_realline; const Trs &trs = TRS_get(wblock, wtrack, curr_realline); ADD_UNDO(Notes_CurrPos(window)); if (trs.size()==0) { InsertStop(window,wblock,wtrack,&realline->l.p); maybe_scroll_down(window); return; } const TrackRealline2 &tr2 = trs[0]; if (tr2.pitch != NULL) { DeletePitch(track, tr2.note, tr2.pitch); if (trs.size()==1) maybe_scroll_down(window); return; } if (tr2.is_end_pitch) { struct Pitches *pitch = (struct Pitches*)ListLast3(&tr2.note->pitches->l); if (pitch!=NULL) tr2.note->pitch_end = pitch->note; else tr2.note->pitch_end = 0; return; } if (tr2.note != NULL) { PLAYER_lock();{ ListRemoveElement3(&track->notes,&tr2.note->l); LengthenNotesTo(wblock->block,track,&realline->l.p); }PLAYER_unlock(); SetNotePolyphonyAttributes(wtrack->track); ValidateCursorPos(window); if (trs.size()==1) maybe_scroll_down(window); return; } const struct Stops *stop = tr2.stop; PLAYER_lock();{ ListRemoveElement3(&track->stops, &stop->l); LengthenNotesTo(wblock->block,track,&realline->l.p); }PLAYER_unlock(); if (trs.size()==1) maybe_scroll_down(window); }
void InsertNoteCurrPos(struct Tracker_Windows *window, float notenum, bool polyphonic, float velocity){ if(notenum<0.001 || notenum>127.9) return; ADD_UNDO(Notes_CurrPos(window)); struct WBlocks *wblock = window->wblock; struct WTracks *wtrack = wblock->wtrack; struct Tracks *track = wtrack->track; int curr_realline = wblock->curr_realline; const Trs &trs = TRS_get(wblock, wtrack, curr_realline); if (polyphonic==false && trs.size() > 0) { const TrackRealline2 &tr2 = trs[0]; if (tr2.pitch != NULL) { tr2.pitch->note = notenum; // lock not necessary maybe_scroll_down(window); return; } if (tr2.note != NULL) { // lock not necessary if (tr2.is_end_pitch) tr2.note->pitch_end = notenum; else tr2.note->note = notenum; maybe_scroll_down(window); return; } const struct Stops *stop = tr2.stop; PLAYER_lock();{ ListRemoveElement3(&track->stops, &stop->l); }PLAYER_unlock(); } struct LocalZooms *realline = wblock->reallines[curr_realline]; InsertNote( wblock,wtrack,&realline->l.p,NULL,notenum, velocity < 0.0 ? NOTE_get_velocity(wtrack->track) : velocity*MAX_VELOCITY, polyphonic ); if(wtrack->l.num==wblock->right_track && polyphonic) UpdateAllWTracksCoordinates(window,wblock); if (!polyphonic) maybe_scroll_down(window); }
/************************************************************** FUNCTION Returns the current note (under the cursor). **************************************************************/ struct Notes *GetCurrNote(struct Tracker_Windows *window){ struct WBlocks *wblock = window->wblock; struct WTracks *wtrack = wblock->wtrack; Trs trs = TRS_get(wblock, wtrack, wblock->curr_realline); if (trs.size()==0) return NULL; const TrackRealline2 &tr2 = trs[0]; return tr2.note; }
void EditNoteCurrPos(struct Tracker_Windows *window){ struct WBlocks *wblock = window->wblock; struct WTracks *wtrack = wblock->wtrack; int curr_realline = wblock->curr_realline; const Trs &trs = TRS_get(wblock, wtrack,curr_realline); if (trs.size()==0) { struct LocalZooms *realline = wblock->reallines[curr_realline]; Place *p = &realline->l.p; struct Notes *note = FindNote(wtrack->track, p); if (note != NULL) { if (is_at_last_line_of_note(wblock, note, wblock->curr_realline)) r_add_last_pitch(window, note); else r_add_pitch(window, wblock, wtrack, note, p); } else r_add_note(window, wblock, wtrack, p); } else { const TrackRealline2 &tr2 = trs[0]; if (tr2.pitch != NULL) r_edit_pitch(window, wblock, wtrack, tr2.pitch); else if (tr2.is_end_pitch) r_edit_end_pitch(window, wblock, wtrack, tr2.note); else if(tr2.note != NULL) r_edit_note(window, wblock, wtrack, tr2.note); } }
vector_t *TR_get(const struct WBlocks *wblock, const struct WTracks *wtrack, int realline){ vector_t *trs = TRS_get(wblock, wtrack); return &trs[realline]; }
bool CHANCETEXT_keypress(struct Tracker_Windows *window, struct WBlocks *wblock, struct WTracks *wtrack, int realline, Place *place, int key){ int subsubtrack = CHANCETEXT_subsubtrack(window, wtrack); if (subsubtrack==-1) return false; const Trs &trs = TRS_get(wblock, wtrack, realline); ADD_UNDO(Notes_CurrPos(window)); if (trs.size() > 1) { // MORE THAN ONE ELEMENT if (key == EVENT_DEL){ for (const TrackRealline2 &tr2 : trs){ struct Notes *note = tr2.note; struct Pitches *pitch = tr2.pitch; if (pitch!=NULL) safe_int_write(&pitch->chance, 0x100); else if (note!=NULL) safe_int_write(¬e->chance, 0x100); } } else { Undo_CancelLastUndo(); } } else if (trs.size() == 0) { // NO ELEMENTS Undo_CancelLastUndo(); } else { // ONE ELEMENT const TrackRealline2 &tr2 = trs[0]; struct Notes *dasnote = tr2.note; struct Pitches *pitch = tr2.pitch; if (key == EVENT_DEL) { if (pitch!=NULL) safe_int_write(&pitch->chance, 0x100); else if (pitch!=NULL) safe_int_write(&dasnote->chance, 0x100); else return false; } else { int chance; if (pitch!=NULL) chance = pitch->chance; else if (dasnote!=NULL) chance = dasnote->chance; else return false; data_as_text_t dat = DAT_get_overwrite(chance, 0, subsubtrack, key, 0, 0xff, true, false); if (dat.is_valid==false) return false; //double new_note = floor(note) + ((double)dat.value / 100.0); printf("new_chance: %d\n",dat.value); if (pitch!=NULL) safe_int_write(&pitch->chance, dat.value); else safe_int_write(&dasnote->chance, dat.value); } } return true; }