From 6deee95d87dbf5c73148e79e338fb7f2583c334b Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 10 Mar 2025 19:31:05 -0500 Subject: [PATCH] GUI: prepare to improve note input timing the idea is to snap to the closest Y position... --- src/gui/gui.cpp | 90 +++++++++++++++++++++++++++++-------------------- 1 file changed, 53 insertions(+), 37 deletions(-) diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index b93e513ba..1e982db9d 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -1254,54 +1254,62 @@ void FurnaceGUI::stopPreviewNote(SDL_Scancode scancode, bool autoNote) { } void FurnaceGUI::noteInput(int num, int key, int vol) { - DivPattern* pat=e->curPat[cursor.xCoarse].getPattern(e->curOrders->ord[cursor.xCoarse][curOrder],true); + int ch=cursor.xCoarse; + int ord=curOrder; + int y=cursor.y; + + if (e->isPlaying()) { + e->getPlayPos(ord,y); + } + + DivPattern* pat=e->curPat[ch].getPattern(e->curOrders->ord[ch][ord],true); bool removeIns=false; prepareUndo(GUI_UNDO_PATTERN_EDIT); if (key==GUI_NOTE_OFF) { // note off - pat->data[cursor.y][0]=100; - pat->data[cursor.y][1]=0; + pat->data[y][0]=100; + pat->data[y][1]=0; removeIns=true; } else if (key==GUI_NOTE_OFF_RELEASE) { // note off + env release - pat->data[cursor.y][0]=101; - pat->data[cursor.y][1]=0; + pat->data[y][0]=101; + pat->data[y][1]=0; removeIns=true; } else if (key==GUI_NOTE_RELEASE) { // env release only - pat->data[cursor.y][0]=102; - pat->data[cursor.y][1]=0; + pat->data[y][0]=102; + pat->data[y][1]=0; removeIns=true; } else { - pat->data[cursor.y][0]=num%12; - pat->data[cursor.y][1]=num/12; - if (pat->data[cursor.y][0]==0) { - pat->data[cursor.y][0]=12; - pat->data[cursor.y][1]--; + pat->data[y][0]=num%12; + pat->data[y][1]=num/12; + if (pat->data[y][0]==0) { + pat->data[y][0]=12; + pat->data[y][1]--; } - pat->data[cursor.y][1]=(unsigned char)pat->data[cursor.y][1]; + pat->data[y][1]=(unsigned char)pat->data[y][1]; if (latchIns==-2) { if (curIns>=(int)e->song.ins.size()) curIns=-1; if (curIns>=0) { - pat->data[cursor.y][2]=curIns; + pat->data[y][2]=curIns; } } else if (latchIns!=-1 && !e->song.ins.empty()) { - pat->data[cursor.y][2]=MIN(((int)e->song.ins.size())-1,latchIns); + pat->data[y][2]=MIN(((int)e->song.ins.size())-1,latchIns); } - int maxVol=e->getMaxVolumeChan(cursor.xCoarse); + int maxVol=e->getMaxVolumeChan(ch); if (latchVol!=-1) { - pat->data[cursor.y][3]=MIN(maxVol,latchVol); + pat->data[y][3]=MIN(maxVol,latchVol); } else if (vol!=-1) { - pat->data[cursor.y][3]=e->mapVelocity(cursor.xCoarse,pow((float)vol/127.0f,midiMap.volExp)); + pat->data[y][3]=e->mapVelocity(ch,pow((float)vol/127.0f,midiMap.volExp)); } - if (latchEffect!=-1) pat->data[cursor.y][4]=latchEffect; - if (latchEffectVal!=-1) pat->data[cursor.y][5]=latchEffectVal; + if (latchEffect!=-1) pat->data[y][4]=latchEffect; + if (latchEffectVal!=-1) pat->data[y][5]=latchEffectVal; } if (removeIns) { if (settings.removeInsOff) { - pat->data[cursor.y][2]=-1; + pat->data[y][2]=-1; } if (settings.removeVolOff) { - pat->data[cursor.y][3]=-1; + pat->data[y][3]=-1; } } makeUndo(GUI_UNDO_PATTERN_EDIT); @@ -1310,28 +1318,36 @@ void FurnaceGUI::noteInput(int num, int key, int vol) { } void FurnaceGUI::valueInput(int num, bool direct, int target) { - DivPattern* pat=e->curPat[cursor.xCoarse].getPattern(e->curOrders->ord[cursor.xCoarse][curOrder],true); + int ch=cursor.xCoarse; + int ord=curOrder; + int y=cursor.y; + + if (e->isPlaying()) { + e->getPlayPos(ord,y); + } + + DivPattern* pat=e->curPat[ch].getPattern(e->curOrders->ord[ch][ord],true); prepareUndo(GUI_UNDO_PATTERN_EDIT); if (target==-1) target=cursor.xFine+1; if (direct) { - pat->data[cursor.y][target]=num&0xff; + pat->data[y][target]=num&0xff; } else { - if (pat->data[cursor.y][target]==-1) pat->data[cursor.y][target]=0; + if (pat->data[y][target]==-1) pat->data[y][target]=0; if (!settings.pushNibble && !curNibble) { - pat->data[cursor.y][target]=num; + pat->data[y][target]=num; } else { - pat->data[cursor.y][target]=((pat->data[cursor.y][target]<<4)|num)&0xff; + pat->data[y][target]=((pat->data[y][target]<<4)|num)&0xff; } } if (cursor.xFine==1) { // instrument - if (pat->data[cursor.y][target]>=(int)e->song.ins.size()) { - pat->data[cursor.y][target]&=0x0f; - if (pat->data[cursor.y][target]>=(int)e->song.ins.size()) { - pat->data[cursor.y][target]=(int)e->song.ins.size()-1; + if (pat->data[y][target]>=(int)e->song.ins.size()) { + pat->data[y][target]&=0x0f; + if (pat->data[y][target]>=(int)e->song.ins.size()) { + pat->data[y][target]=(int)e->song.ins.size()-1; } } if (settings.absorbInsInput) { - curIns=pat->data[cursor.y][target]; + curIns=pat->data[y][target]; wavePreviewInit=true; updateFMPreview=true; } @@ -1349,17 +1365,17 @@ void FurnaceGUI::valueInput(int num, bool direct, int target) { } } else if (cursor.xFine==2) { if (curNibble) { - if (pat->data[cursor.y][target]>e->getMaxVolumeChan(cursor.xCoarse)) pat->data[cursor.y][target]=e->getMaxVolumeChan(cursor.xCoarse); + if (pat->data[y][target]>e->getMaxVolumeChan(ch)) pat->data[y][target]=e->getMaxVolumeChan(ch); } else { - pat->data[cursor.y][target]&=15; + pat->data[y][target]&=15; } makeUndo(GUI_UNDO_PATTERN_EDIT); if (direct) { curNibble=false; } else { - if (e->getMaxVolumeChan(cursor.xCoarse)<16) { + if (e->getMaxVolumeChan(ch)<16) { curNibble=false; - if (pat->data[cursor.y][target]>e->getMaxVolumeChan(cursor.xCoarse)) pat->data[cursor.y][target]=e->getMaxVolumeChan(cursor.xCoarse); + if (pat->data[y][target]>e->getMaxVolumeChan(ch)) pat->data[y][target]=e->getMaxVolumeChan(ch); editAdvance(); } else { curNibble=!curNibble; @@ -1377,7 +1393,7 @@ void FurnaceGUI::valueInput(int num, bool direct, int target) { editAdvance(); } else { if (settings.effectCursorDir==2) { - if (++cursor.xFine>=(3+(e->curPat[cursor.xCoarse].effectCols*2))) { + if (++cursor.xFine>=(3+(e->curPat[ch].effectCols*2))) { cursor.xFine=3; } } else {