diff --git a/index.html b/index.html
index 45981d6..95f91db 100644
--- a/index.html
+++ b/index.html
@@ -197,6 +197,7 @@ canvas{display:block;}
+
@@ -4915,6 +4916,7 @@ var edPlayhead=-1,edPlayheadStart=0,edPlayheadRAF=0,edPlayheadOffset=0; // previ
var edShowLabels=false; // toggle note labels on canvas
var edShowPitch=false; // toggle pitch names on notes
var edPlayFromMarker=-1; // click-to-play marker position in seconds
+var edDraggingMarker=false; // true when dragging the play-from marker
var ED_LANE_H=50,ED_KICK_H=40,ED_HEAD=32,ED_NOTE_W=14,ED_NOTE_H=16,ED_MIN_DUR=0.05;
var ED_COLORS=["#e53e3e","#d69e2e","#3182ce","#38a169","#805ad5"];
var ED_NAMES=["Red","Yellow","Blue","Green","Kick"];
@@ -5412,14 +5414,16 @@ function edMouseDown(e){
var cv=getEdCanvas(),rect=cv.getBoundingClientRect();
var mx=e.clientX-rect.left,my=e.clientY-rect.top;
- // Click on header/timeline area = set play-from marker
+ // Click on header/timeline area = set play-from marker and start dragging it
if(my0){edScrollX=Math.max(0,edScrollX-10);}
+ if(mx>cv2.width-30){edScrollX+=10;}
+ edDraw();
+ return;
+ }
+
// Range selecting
if(edSelecting&&edSelRange){
edSelRange.end=edXToTime(mx);
@@ -5528,6 +5545,11 @@ function edMouseMove(e){
cv.style.cursor=(hit2>=0&&edIsOnRightEdge(mx,hit2))?"ew-resize":(hit2>=0?"grab":"crosshair");
}
function edMouseUp(){
+ if(edDraggingMarker){
+ edDraggingMarker=false;
+ edDraw();
+ return;
+ }
if(edSelecting){
edSelecting=false;
// If range is too small, clear it
@@ -5614,6 +5636,17 @@ function edKeyDown(e){
edSelRange=null;edSelected=-1;edPlayFromMarker=-1;edDraw();e.preventDefault();return;
}
+ // Home key — scroll to start and reset play-from marker
+ if(e.key==="Home"){edGoToStart();e.preventDefault();return;}
+
+ // End key — scroll to end of piece
+ if(e.key==="End"){
+ var cv=getEdCanvas();
+ var endT=edIsClassical?(edPiece&&edPiece.duration||90):4;
+ edScrollX=Math.max(0,endT*edPxPerUnit()-cv.width+50);
+ edDraw();e.preventDefault();return;
+ }
+
if((e.key==="Delete"||e.key==="Backspace")&&edSelected>=0){
edMelody.splice(edSelected,1);
edSelected=-1;
@@ -5753,6 +5786,12 @@ function edDurInfo(durSec){
return {sym:"\u266C\u266C",name:"32nd",val:0.125};
}
+function edGoToStart(){
+ edScrollX=0;
+ edPlayFromMarker=-1;
+ edDraw();
+}
+
function edStopPlayhead(){
edPlayhead=-1;
if(edPlayheadRAF)cancelAnimationFrame(edPlayheadRAF);