Score_To_MML / static /corrector.html
Coconuttttt's picture
Add staff interpolation, manual adjustment, hover tooltip, i18n
a211376
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>OMR Corrector</title>
<link rel="stylesheet" href="corrector.css">
</head>
<body>
<!-- Feedback Banner -->
<div id="feedback-bar">
<a id="feedback-btn" href="https://docs.google.com/forms/d/e/1FAIpQLScDoM53RMjDLlftORYHXmZ5kmkN4TTZOIyFIRuVsZhp4RGjEA/viewform" target="_blank" rel="noopener">Feedback</a>
</div>
<!-- Upload Bar -->
<div id="upload-bar">
<label><span data-i18n="images">이미지</span>: <input type="file" id="image-input" accept=".png,.jpg,.jpeg" multiple></label>
<label>MusicXML: <input type="file" id="xml-input" accept=".xml,.musicxml,.mxl" multiple></label>
<label>DPI: <input type="number" id="dpi-input" value="300" min="72" max="1200" step="1"></label>
<button id="load-btn" data-i18n="load">뢈러였기</button>
<span id="page-nav">
<button id="btn-prev-page" data-i18n-title="prev_page" title="이전 νŽ˜μ΄μ§€">&laquo;</button>
<span id="page-indicator">-</span>
<button id="btn-next-page" data-i18n-title="next_page" title="λ‹€μŒ νŽ˜μ΄μ§€">&raquo;</button>
</span>
<span id="load-status"></span>
</div>
<!-- Toolbar -->
<div id="toolbar">
<div class="tool-group">
<button id="btn-undo" data-i18n-title="undo_title" title="μ‹€ν–‰μ·¨μ†Œ (Ctrl+Z)">&#8617;</button>
<button id="btn-redo" data-i18n-title="redo_title" title="λ‹€μ‹œμ‹€ν–‰ (Ctrl+Y)">&#8618;</button>
</div>
<div class="tool-group">
<button id="btn-up" data-i18n-title="pitch_up" title="μŒλ†’μ΄ 올림 (↑)">&#9650;</button>
<button id="btn-down" data-i18n-title="pitch_down" title="μŒλ†’μ΄ λ‚΄λ¦Ό (↓)">&#9660;</button>
</div>
<div class="tool-group">
<button id="btn-dblsharp" data-i18n-title="dblsharp" title="κ²Ήμ˜¬λ¦Όν‘œ (π„ͺ)">π„ͺ</button>
<button id="btn-sharp" data-i18n-title="sharp" title="μ˜¬λ¦Όν‘œ (#)">#</button>
<button id="btn-flat" data-i18n-title="flat" title="λ‚΄λ¦Όν‘œ (b)">b</button>
<button id="btn-dblflat" data-i18n-title="dblflat" title="κ²Ήλ‚΄λ¦Όν‘œ (𝄫)">𝄫</button>
<button id="btn-natural" data-i18n-title="natural" title="μ œμžλ¦¬ν‘œ (n)">&#9838;</button>
<button id="btn-delete" data-i18n-title="delete_note" title="μŒν‘œ μ‚­μ œ (Del)">&#128465;</button>
</div>
<div class="tool-group">
<button id="btn-dur-whole" data-i18n-title="whole" title="μ˜¨μŒν‘œ (1)">&#119133;</button>
<button id="btn-dur-half" data-i18n-title="half" title="2λΆ„μŒν‘œ (2)">&#119134;</button>
<button id="btn-dur-quarter" data-i18n-title="quarter" title="4λΆ„μŒν‘œ (4)">&#119135;</button>
<button id="btn-dur-eighth" data-i18n-title="eighth" title="8λΆ„μŒν‘œ (5)">&#119136;</button>
<button id="btn-dur-16th" data-i18n-title="sixteenth" title="16λΆ„μŒν‘œ (6)">&#119137;</button>
<button id="btn-dur-dot" data-i18n-title="dot" title="점 ν† κΈ€ (.)">&#8226;</button>
</div>
<div class="tool-group">
<button id="btn-prev" data-i18n-title="prev_note" title="이전 μŒν‘œ (Shift+Tab)">&lt;</button>
<button id="btn-next" data-i18n-title="next_note" title="λ‹€μŒ μŒν‘œ (Tab)">&gt;</button>
</div>
<div class="tool-group">
<button id="btn-play" data-i18n-title="play_note" title="μŒν‘œ μž¬μƒ">&#9835;</button>
<button id="btn-playall" data-i18n-title="play_all" title="전체 μž¬μƒ (Space)">&#9654;</button>
<button id="btn-stop" data-i18n-title="stop" title="μ •μ§€">&#9632;</button>
<label><span data-i18n="bpm">BPM</span>: <input type="number" id="bpm-input" value="120" min="20" max="300" step="5" style="width:94px"></label>
<label><span data-i18n="vol">μŒλŸ‰</span>: <input type="range" id="vol-slider" min="0" max="100" value="50" step="5" style="width:80px"><span id="vol-label">50%</span></label>
</div>
<div class="tool-group">
<label><span data-i18n="zoom">ν™•λŒ€</span>: <input type="range" id="zoom-slider" min="25" max="200" value="100" step="5"><span id="zoom-label">100%</span></label>
</div>
<div class="tool-group">
<label><span data-i18n="x_off">X μ˜€ν”„μ…‹</span>: <input type="number" id="offset-x" value="0" step="1" style="width:84px"></label>
<label><span data-i18n="y_off">Y μ˜€ν”„μ…‹</span>: <input type="number" id="offset-y" value="0" step="1" style="width:84px"></label>
</div>
<div class="tool-group">
<label><span data-i18n="staff_dist">λ³΄ν‘œ 간격</span>: <input type="number" id="staff-dist-input" value="65" step="1" style="width:84px"></label>
<label><span data-i18n="sys_dist">단 간격 보정</span>: <input type="number" id="sys-dist-adj" value="0" step="1" style="width:84px"></label>
</div>
<div class="tool-group">
<button id="btn-debug-lines" data-i18n="staff_lines" title="μ˜€μ„  ν‘œμ‹œ/μˆ¨κΉ€">μ˜€μ„  ν‘œμ‹œ</button>
<button id="btn-adjust-staves" data-i18n="adjust_staves" title="μ˜€μ„  μœ„μΉ˜ μˆ˜λ™ μ‘°μ •">μ˜€μ„  μ‘°μ •</button>
</div>
<div class="tool-group">
<button id="btn-lang" title="ν•œκ΅­μ–΄/English">EN</button>
</div>
<div class="tool-group right">
<button id="btn-download" data-i18n="download">XML λ‹€μš΄λ‘œλ“œ</button>
</div>
</div>
<!-- Progress Bar -->
<div id="progress-bar-container">
<div id="progress-bar-fill"></div>
<span id="progress-time">0:00 / 0:00</span>
</div>
<!-- Shortcut Reference -->
<div id="shortcut-bar">
<span><b data-i18n="sc_select">선택</b>: Click / Tab</span>
<span><b data-i18n="sc_pitch">μŒλ†’μ΄</b>: ↑↓ / Drag</span>
<span><b>#/b/n:</b> <span data-i18n="sc_acc">μž„μ‹œν‘œ</span></span>
<span><b>1/2/4/5/6:</b> <span data-i18n="sc_dur">λ°•μž</span></span>
<span><b>.</b> <span data-i18n="sc_dot">점</span></span>
<span><b>Del:</b> <span data-i18n="sc_del">μ‚­μ œ</span></span>
<span><b>r:</b> <span data-i18n="sc_rest">μŒν‘œβ†”μ‰Όν‘œ</span></span>
<span><b>Shift+N:</b> <span data-i18n="sc_add">μΆ”κ°€ λͺ¨λ“œ</span></span>
<span><b>Shift+A:</b> <span data-i18n="sc_chord">ν™”μŒ μΆ”κ°€</span></span>
<span><b>Space:</b> <span data-i18n="sc_play">μž¬μƒ</span></span>
<span><b>Shift+Click:</b> <span data-i18n="sc_seek">탐색</span></span>
<span><b>DblClick:</b> <span data-i18n="sc_dblclick">탐색+μž¬μƒ</span></span>
<span><b>PgUp/Dn:</b> <span data-i18n="sc_page">νŽ˜μ΄μ§€</span></span>
<span><b>Ctrl+Z/Y:</b> <span data-i18n="sc_undo">μ‹€ν–‰μ·¨μ†Œ/λ‹€μ‹œμ‹€ν–‰</span></span>
</div>
<!-- Main Canvas Area -->
<div id="canvas-wrapper">
<div id="canvas-container">
<img id="score-image" alt="Score image">
<svg id="marker-svg" xmlns="http://www.w3.org/2000/svg"></svg>
</div>
</div>
<!-- Chord Popup -->
<div id="chord-popup" class="hidden">
<div id="chord-popup-title" data-i18n="chord_select">μŒν‘œ 선택:</div>
<ul id="chord-popup-list"></ul>
</div>
<!-- Status Bar -->
<div id="status-bar">
<span id="status-mode" style="color:#ffff66;font-weight:bold;"></span>
<span id="status-selection" data-i18n="no_sel">선택 μ—†μŒ</span>
<span id="status-total"></span>
</div>
<script src="corrector.js"></script>
</body>
</html>