示例#1
0
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);
}
示例#2
0
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);
}
示例#3
0
/**************************************************************
  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;
}
示例#4
0
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);
    
  }
  
}
示例#5
0
vector_t *TR_get(const struct WBlocks *wblock, const struct WTracks *wtrack, int realline){
  vector_t *trs = TRS_get(wblock, wtrack);
  return &trs[realline];
}
示例#6
0
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(&note->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;
}