Commit Graph

226 Commits

Author SHA1 Message Date
3dtours d2993eee69 fix: brush drawing smooth - track pitch + beat delta 2026-07-26 10:44:37 +07:00
3dtours fe379c45e2 fix: brush shape draw + remove transport + loop repeat sound 2026-07-26 10:41:31 +07:00
3dtours d20fafb75e fix: velocity flicker - grid canvas useLayoutEffect sync 2026-07-26 10:29:23 +07:00
3dtours 0b7dd82407 fix: scroll speed matches mouse + CC flicker useLayoutEffect 2026-07-26 10:26:00 +07:00
3dtours 7107a0cc14 fix: brush scroll speed + CC snap + non-selected flicker 2026-07-26 10:21:31 +07:00
3dtours 8ec4b05e21 fix: brush pitch-based scroll + CC velocity per-note paint 2026-07-26 10:14:40 +07:00
3dtours 9237d01f35 fix: auto-scroll continuous + batch CC velocity for selected notes 2026-07-26 10:09:55 +07:00
3dtours a7417b9bfa fix: đã sửa lỗi bị mất không hiển thị midi piano grid 2026-07-26 10:05:23 +07:00
3dtours bd55d035de fix: đã sửa lỗi MIDI loop 2026-07-26 07:16:17 +07:00
3dtours c917db200e fix: ruler doc-level drag, remove onMouseMove/onMouseLeave from element, comma fix 2026-07-25 22:50:16 +07:00
3dtours e5196e79c8 fix: use refs for selectionMarquee and notes in doc-level drag handler to avoid stale closure 2026-07-25 22:37:30 +07:00
3dtours ce30289f46 fix: loop reschedule midi, note select in doc-level handler, ctrl+click ruler clear loop 2026-07-25 22:35:23 +07:00
3dtours 89f2fed1d9 fix: blue marquee for note select on grid, green loop overlay from ruler drag, notes play once 2026-07-25 22:31:42 +07:00
3dtours 4306ff302a fix: marquee survive mouseleave, loop reschedule midi notes, separate leave/up handlers 2026-07-25 22:20:58 +07:00
3dtours fccdb15ad7 fix: piano roll selection marquee green full-height, edge resize, body move, playback min 16 beats, doc-level drag 2026-07-25 22:13:50 +07:00
3dtours 9bfcd1870c fix: loop range playback via st.selectionStart/End + isLooping 2026-07-25 21:21:03 +07:00
3dtours 39680cb95c fix: ruler close needed 4 parens (was 3), closing parent div properly 2026-07-25 21:14:44 +07:00
3dtours 2ce731e6a9 fix: Ctrl+S piano roll + ruler drag selection + paren balance 2026-07-25 21:09:34 +07:00
3dtours 57fd110fe3 fix: add capture flag to Ctrl+S keydown handler to prevent browser save 2026-07-25 20:57:43 +07:00
3dtours c1a3d3a6dd feat: Ctrl+S saves current tab (piano roll, section, audio) or project + all dirty tabs 2026-07-25 20:54:23 +07:00
3dtours f2d02a358f fix: skip st.notes sync when draggedNote active (prevents brush flicker) 2026-07-25 20:45:24 +07:00
3dtours ce319573ab fix: move Ctrl+A useEffect after selectedNoteIds declaration 2026-07-25 20:39:54 +07:00
3dtours 29b682e3ba fix: move Ctrl+A useEffect after notes declaration to avoid TDZ error 2026-07-25 20:38:53 +07:00
3dtours f4ec769650 fix: restore useEffect sync for st.notes, remove render-phase TDZ error 2026-07-25 20:36:21 +07:00
3dtours 966e673fae fix: replace sync useEffect with render-phase guard to prevent flicker 2026-07-25 20:31:17 +07:00
3dtours a9f56d0fcd fix: drag clamp, pitch anchor, Ctrl+A, marquee dir, resize snap 2026-07-25 20:30:01 +07:00
3dtours 8d83a46e08 fix: MIDI item playback respects visual duration + scale flicker guard 2026-07-25 20:14:53 +07:00
3dtours 8849f33d07 fix: extend piano roll playhead duration to 10min during recording 2026-07-25 20:03:09 +07:00
3dtours 97855f47d1 fix: add try-catch + nextMetronomeBeatRef init to startPianoRollRecording 2026-07-25 19:56:19 +07:00
3dtours d858628a8f fix: sync notes from st.notes + set isPlaying for playhead + metronome count-in 2026-07-25 19:53:45 +07:00
3dtours f3ad111376 fix: set subTab buffer + fix double stop() call + realtime playhead 2026-07-25 19:48:00 +07:00
3dtours 6cc3ae6ab8 fix: use startSubTabPlayback for piano roll recording + pass recTempMidiNotes prop 2026-07-25 19:39:55 +07:00
3dtours e6dd7ff13c fix: realtime note display + MIDI key sound via refs 2026-07-25 18:58:30 +07:00
3dtours da760dbb86 fix: MIDI record + key highlight on MIDI key press 2026-07-25 18:55:31 +07:00
3dtours c3edda5c81 fix: call midiRec.start() so MIDI recorder receives messages 2026-07-25 18:44:33 +07:00
3dtours 68eb6d5261 fix: replace stale snapToScale ref with st.snapToScale 2026-07-25 18:39:47 +07:00
3dtours 513a6b082c fix: record midi - setSelectedMidiInputId, snapToScale persist, space stops recording 2026-07-25 18:37:02 +07:00
3dtours 5af8536e53 fix: add recTempMidiNotes to PianoRollTabEditor props 2026-07-25 18:31:35 +07:00
3dtours dffb8562df fix: piano roll recording - playhead, realtime notes, recording display 2026-07-25 18:30:16 +07:00
3dtours 9498a0d4b0 fix: piano roll record via ARM + INPUT routes to piano roll tab 2026-07-25 18:25:29 +07:00
3dtours 2c91c0156a feat: add Omni MIDI option in piano roll INPUT select 2026-07-25 18:20:42 +07:00
3dtours 1b711ef014 feat: piano roll transport, ARM/INPUT, AI bar range, MIDI recording
- Transport: play/stop/back/next/record buttons in piano roll toolbar
- ARM toggle + MIDI input device selector next to Snap to Scale
- AI bar range selector (bar X to bar Y) for Copilot MIDI generation
- handleAISend detects active piano roll tab and routes MIDI prompt
- Added selectedMidiInputId state + handleMidiInputSelect for MIDI input
2026-07-25 17:22:24 +07:00
3dtours a59a36ec90 fix: use configured AI provider for piano roll prompt, not hardcoded
Piano roll AI prompt now selects provider via same logic as main AI
handler (aiProviders, selectedProviderId, baseUrl, apiKey, model).
No longer hardcodes provider:'openai', model:'gpt-4o'.
2026-07-25 16:26:47 +07:00
3dtours 7dd6300500 fix: guard AI response parse against undefined textResponse 2026-07-25 16:21:59 +07:00
3dtours 5628802e08 refactor: remove piano roll AI prompt, reuse Copilot for MIDI gen
- Removed aiPrompt/aiLoading state and handleAIPrompt from PianoRollTabEditor
- Removed AI prompt input UI from piano roll toolbar
- handleAISend now detects active piano roll tab and routes
  prompts to MIDI note generation, appends notes to the tab
2026-07-25 16:19:44 +07:00
3dtours eaedfebdf0 fix: snap to scale now works on initial click + use refs
- Initial click note pitch now snaps when snapToScale is on
- Added snapToScaleRef and selectedScaleRef for stale-closure safety
- All brush-draw snap paths (mousedown + mousemove) use refs
2026-07-25 12:42:50 +07:00
3dtours f5bc0a8810 feat: Snap to Scale toggle + remove tool buttons + no menu on erase sweep
- Added snapToScale state + toggle switch in piano roll toolbar
- snapPitchToScale only applies when snapToScale is true
- Removed Select/Pen/Eraser tool buttons
- Right-click drag erase sweep sets swallowContextMenuRef=true
  so context menu won't appear during sweep
2026-07-25 12:39:32 +07:00
3dtours 221561d58a fix: right-click delete no menu + scale only for brush drag
- Separate swallowContextMenuRef (not tied to rightClickDragRef) so
  menu is skipped on right-click delete
- Initial click draw uses raw pitch, not snapPitchToScale (scale only
  applies during brush-drag in mousemove)
2026-07-25 12:34:12 +07:00
3dtours 0a17cc91ea fix: right-click delete note no longer shows context menu
Set rightClickDragRef.erasedNote=true on delete. handleContextMenu
checks and skips menu when true.
2026-07-25 12:30:08 +07:00
3dtours 7174773cb3 fix: separate right-click menu vs drag-erase behavior
Right-click on note = delete.
Right-click empty space (no drag) = context menu only (no erase sweep).
Right-click empty space + drag >5px = erase sweep (starts on mousemove).
Uses rightClickDragRef to track pending right-click state.
2026-07-25 12:28:44 +07:00