@fretfall/player 0.2.2 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/mount.js ADDED
@@ -0,0 +1,1020 @@
1
+ let l=null;const d=e=>l??=i(e);async function i(e){const a=Object.assign(document.createElement("style"),{textContent:'[data-fretfall]:not([data-fretfall-dock]),:where([data-fretfall-dock]){--bg: #0e1014;--ink: #0e1014;--text: #e8eaef;--muted: #7b8190;--accent: #c8f04a;--chip: #171a20;--chip-border: #2a2f38;--done: #e8eaef;--todo: #23272f;--ui: system-ui, sans-serif;--num: system-ui, sans-serif;--lyric: system-ui, sans-serif;--lyric-style: normal}:where([data-fretfall]) *{box-sizing:border-box}:where([data-fretfall]) [hidden]{display:none!important}[data-fretfall]:not([data-fretfall-dock]){height:100%}[data-fretfall]:not([data-fretfall-dock]){margin:0;overflow:hidden;background:var(--bg);color:var(--text);font:14px/1.4 var(--ui);accent-color:var(--accent)}:where([data-fretfall]) canvas{position:fixed;inset:0;width:100%;height:100%;display:block}:where([data-fretfall]) button{font:inherit;color:inherit}:where([data-fretfall]) .bar{position:fixed;z-index:3;left:32px;right:32px;top:18px;height:40px;display:flex;align-items:center;justify-content:space-between;gap:24px;transition:transform .25s ease,opacity .25s ease,visibility .25s}:where([data-fretfall]) .group{display:flex;align-items:center;gap:10px;min-width:0}:where([data-fretfall]) .group:last-child{flex:none}:where([data-fretfall]) .wordmark{display:flex;align-items:center;gap:7px;font:700 15px var(--num);letter-spacing:.22em}:where([data-fretfall]) :is(.wordmark,.welcome-mark) .fall{transform-box:fill-box;transform-origin:center;transform:rotate(14deg);animation:fall .75s .8s both}@keyframes fall{0%{transform:translate(-3.5px,-1.42px) rotate(0);animation-timing-function:cubic-bezier(.55,0,.85,.35)}40%{transform:translate(0) rotate(18deg);animation-timing-function:cubic-bezier(.2,.7,.4,1)}56%{transform:translateY(-.35px) rotate(11.5deg);animation-timing-function:ease-in-out}74%{transform:translateY(.08px) rotate(15.2deg);animation-timing-function:ease-in-out}88%{transform:translate(0) rotate(13.6deg);animation-timing-function:ease-in-out}to{transform:translate(0) rotate(14deg)}}@media(prefers-reduced-motion:reduce){:where([data-fretfall]) .wordmark .fall{animation:none}}:where([data-fretfall]) .seg{display:flex;gap:2px;padding:3px;border-radius:9px;background:var(--chip);border:1px solid var(--chip-border);overflow-x:auto;scrollbar-width:none}:where([data-fretfall]) .seg button{border:0;background:none;cursor:pointer;padding:5px 12px;border-radius:6px;font:500 13px var(--ui);color:var(--muted);white-space:nowrap}:where([data-fretfall]) .seg button[aria-pressed=true]{background:var(--text);color:var(--ink);font-weight:600}:where([data-fretfall]) .seg select{max-width:22cqw;border:0;padding:4px 6px;background:none;color:var(--text);font:600 13px var(--ui)}:where([data-fretfall]) .seg option{background:var(--ink);color:var(--text)}:where([data-fretfall]) .icon{flex:none;cursor:pointer;width:36px;height:36px;display:grid;place-items:center;padding:0;border-radius:8px;background:var(--chip);border:1px solid var(--chip-border);color:var(--text)}:where([data-fretfall]) .icon[aria-pressed=true],:where([data-fretfall]) .icon[aria-expanded=true]{background:var(--accent);border-color:var(--accent);color:var(--ink)}:where([data-fretfall]) button:focus-visible,:where([data-fretfall]) input:focus-visible{outline:2px solid var(--accent);outline-offset:2px}:where([data-fretfall]) .speed{height:36px;display:flex;align-items:center;padding:0 2px;border-radius:8px;background:var(--chip);border:1px solid var(--chip-border);color:var(--muted)}:where([data-fretfall]) .speed button{cursor:pointer;width:28px;height:32px;display:grid;place-items:center;padding:0;border:0;background:none;color:inherit}:where([data-fretfall]) .speed #speed{width:auto;min-width:46px;font:600 14px var(--num);color:var(--text)}:where([data-fretfall]) .time{margin-right:6px;font:14px var(--num);color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap}:where([data-fretfall]) .divider{width:1px;height:24px;margin:0 4px;background:var(--chip-border)}:where([data-fretfall]) .menu{display:contents}:where([data-fretfall]) #menuButton{display:none}:where([data-fretfall]) #phrases{position:fixed;left:32px;right:32px;top:74px;height:54px;cursor:pointer;touch-action:none;-webkit-user-select:none;user-select:none}:where([data-fretfall]) #phrases div{position:absolute;bottom:0;min-width:2px;border-radius:2px;background:var(--todo)}:where([data-fretfall]) #phrases div.done{background:var(--done)}:where([data-fretfall]) #phraseTime{position:absolute;top:calc(100% + 16px);transform:translate(-50%);padding:2px 7px;border-radius:6px;background:var(--ink);border:1px solid var(--chip-border);font:600 11px var(--num);font-variant-numeric:tabular-nums;color:var(--text);pointer-events:none}:where([data-fretfall]) #loopBox{position:absolute;top:-6px;bottom:-17px;border:1.5px solid var(--accent);background:color-mix(in srgb,var(--accent) 10%,transparent);box-shadow:0 0 18px color-mix(in srgb,var(--accent) 22%,transparent)}:where([data-fretfall]) #loopBox:before,:where([data-fretfall]) #loopBox:after{content:"";position:absolute;top:-11px;bottom:-11px;width:4px;border:4px solid transparent;border-radius:6px;background:var(--accent) padding-box;cursor:ew-resize}:where([data-fretfall]) #loopBox:before{left:-6.75px}:where([data-fretfall]) #loopBox:after{right:-6.75px}:where([data-fretfall]) #progress{position:fixed;left:32px;right:32px;top:134px;height:5px;border-radius:3px;overflow:hidden;background:var(--todo)}:where([data-fretfall]) #progress div{width:0;height:100%;background:var(--accent);opacity:.9}[data-fretfall][data-docked] #phrases{top:18px}[data-fretfall][data-docked] #progress{top:78px}[data-fretfall][data-docked] #lyrics{top:108px}[data-fretfall][data-docked] .sheet{top:18px}:where([data-fretfall]) #lyrics{position:fixed;left:40px;top:164px;max-width:min(560px,46cqw);display:flex;flex-direction:column;gap:8px;pointer-events:none;font-family:var(--lyric);font-style:var(--lyric-style);text-shadow:0 2px 14px var(--ink),0 0 4px var(--ink)}:where([data-fretfall]) #section{min-height:16px;font:600 12px var(--num);letter-spacing:.18em;color:var(--accent)}:where([data-fretfall]) #lines{position:relative;height:2.45em;font-size:clamp(20px,2.3cqw,32px);line-height:1.15}:where([data-fretfall]) #lines div{position:absolute;top:0;left:0;white-space:nowrap;color:var(--muted);transition:transform .45s cubic-bezier(.22,1,.36,1),opacity .35s ease}:where([data-fretfall]) #lines .low{transform:translateY(1.3em);opacity:.5}:where([data-fretfall]) #lines .gone{opacity:0;transition-duration:.45s,.25s}:where([data-fretfall]) #lines .gone.up{transform:translateY(-.8em)}:where([data-fretfall]) #lines span{transition:color .15s}:where([data-fretfall]) #lines .sung{color:var(--text)}@media(prefers-reduced-motion:reduce){:where([data-fretfall]) #lines div{transition-property:opacity}}:where([data-fretfall]) #info{position:fixed;left:40px;right:226px;bottom:14px;display:flex;align-items:center;font-size:13px;white-space:nowrap;color:var(--muted);pointer-events:none}:where([data-fretfall]) #info b{color:var(--text);font-weight:600}:where([data-fretfall]) #info>span+span:before{content:"";display:inline-block;width:1px;height:12px;margin:0 14px;vertical-align:-1px;background:var(--chip-border)}:where([data-fretfall]) #info .tuning{position:relative;pointer-events:auto;cursor:help}:where([data-fretfall]) #info .tuning>b{text-decoration:underline dotted var(--muted);text-underline-offset:3px}:where([data-fretfall]) #info .tip{left:0;right:auto;white-space:normal}:where([data-fretfall]) #info .tuning:is(:hover,:focus)>.tip{opacity:1;visibility:visible;transform:none}:where([data-fretfall]) .pegs{display:flex;align-items:flex-start;gap:4px;margin:10px 0 8px}:where([data-fretfall]) .peg{display:flex;flex-direction:column;align-items:center;min-width:26px;gap:2px;font:600 13px var(--num)}:where([data-fretfall]) .peg i{font-style:normal;font-size:11px;color:var(--muted)}:where([data-fretfall]) .peg .move:before{content:"";display:block;width:3px;height:calc(6px + var(--d) * 3px);margin:2px auto 3px;border-radius:2px;background:var(--c)}:where([data-fretfall]) .peg strong{color:var(--c)}:where([data-fretfall]) .peg.same{opacity:.45}:where([data-fretfall]) .tip small{display:block;font-size:11px}[data-fretfall]:fullscreen .bar{transform:translateY(calc(-100% - 18px));opacity:0;visibility:hidden;transition-delay:.4s}[data-fretfall]:fullscreen:has(#phrases:hover,#progress:hover,.bar:hover) .bar{transform:none;opacity:1;visibility:visible;transition-delay:0s}:where([data-fretfall]) .seg.views{margin-left:4px}:where([data-fretfall]) .seg.views button{padding:5px 11px;font-size:12px}:where([data-fretfall]) .icon:disabled{cursor:default;color:var(--muted)}:where([data-fretfall]) .icon:disabled svg{opacity:.5}:where([data-fretfall]) #loopTools{position:fixed;z-index:4;display:flex;transform:translate(-50%,calc(-50% + 3px))}:where([data-fretfall]) #loopTools .icon{width:32px;height:26px;background:var(--ink);border-color:var(--accent)}:where([data-fretfall]) #loopTools svg{width:15px;height:15px}:where([data-fretfall]) #trainer{border-radius:13px 0 0 13px}:where([data-fretfall]) #clearLoop{border-left:0;border-radius:0 13px 13px 0;color:var(--muted)}:where([data-fretfall]) #clearLoop:hover{color:var(--text)}:where([data-fretfall]) #loopTools .icon[aria-pressed=true]{background:var(--accent);color:var(--ink)}:where([data-fretfall]) .tip{position:absolute;right:0;bottom:calc(100% + 10px);width:max-content;max-width:250px;padding:8px 10px;border-radius:8px;background:var(--ink);border:1px solid var(--chip-border);box-shadow:0 12px 30px #00000073;color:var(--muted);font:12px/1.45 var(--ui);text-align:left;pointer-events:none;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .12s ease,transform .12s ease,visibility .12s}:where([data-fretfall]) .tip b{display:flex;justify-content:space-between;gap:12px;margin-bottom:2px;color:var(--text);font-weight:600}:where([data-fretfall]) .tip kbd{padding:0 5px;border:1px solid var(--chip-border);border-radius:4px;color:var(--muted);font:inherit}:where([data-fretfall]) :is(.icon,.speed):hover>.tip,:where([data-fretfall]) .icon:focus-visible>.tip,:where([data-fretfall]) .speed:focus-within>.tip{opacity:1;visibility:visible;transform:none}[data-fretfall]:where([data-fretfall-dock]){display:flex;align-items:center;gap:10px}:where([data-fretfall]) .bar :is(.icon,.speed),[data-fretfall]:where([data-fretfall-dock]) :is(.icon,.speed){position:relative}:where([data-fretfall]) .bar .tip,[data-fretfall]:where([data-fretfall-dock]) .tip{top:calc(100% + 10px);bottom:auto;transform:translateY(-4px)}:where([data-fretfall]) .bar [aria-expanded=true]>.tip,[data-fretfall]:where([data-fretfall-dock]) [aria-expanded=true]>.tip{display:none}:where([data-fretfall]) #loopTools .tip{top:calc(100% + 10px);bottom:auto;left:var(--tip, 50%);right:auto;transform:translate(calc(-1 * var(--tip, 50%)),-4px)}:where([data-fretfall]) #loopTools .icon:hover>.tip,:where([data-fretfall]) #loopTools .icon:focus-visible>.tip{transform:translate(calc(-1 * var(--tip, 50%)))}[data-fretfall]:fullscreen #info{display:none}[data-fretfall].minimal :is(.bar>:not(#minimalBack),#phrases,#progress,#loopTools,#info){display:none}[data-fretfall].minimal .bar{background:none;border:0;box-shadow:none;pointer-events:none}[data-fretfall].minimal #minimalBack{display:inline-flex;pointer-events:auto;margin-left:auto}:where([data-fretfall]) #minimalBack{display:none}[data-fretfall].tab2d .only-3d,[data-fretfall]:not(.tab2d) .only-2d{display:none}[data-fretfall].tab2d .only-3d+.only-3d+h3{padding-top:0;border-top:0}[data-fretfall].notation .not-notation,[data-fretfall]:not(.notation) .only-notation{display:none}[data-fretfall].minimal #lyrics{top:24px}:where([data-fretfall]) #status{position:fixed;left:50%;top:42%;transform:translate(-50%,-50%);display:flex;align-items:center;gap:12px;max-width:min(560px,90cqw);padding:10px 16px;border-radius:10px;background:var(--chip);border:1px solid var(--chip-border);backdrop-filter:blur(10px);text-align:center}[data-fretfall].banding :is(#highway,#phrases,#progress,#loopTools,#lyrics,#info,#intro,#time){display:none}:where([data-fretfall]) #bandNote{position:fixed;left:50%;top:56%;transform:translate(-50%,-50%);display:grid;justify-items:center;gap:8px;max-width:min(440px,90cqw);padding:14px 20px;border-radius:10px;background:var(--chip);border:1px solid var(--chip-border);text-align:center}:where([data-fretfall]) #bandNote .text-button{justify-self:center}:where([data-fretfall]) #status:not(.loading) .bars{display:none}:where([data-fretfall]) .bars{flex:none;display:inline-flex;align-items:flex-end;gap:3px;height:16px}:where([data-fretfall]) .bars i{width:3px;height:100%;border-radius:2px;background:var(--accent);transform:scaleY(.3);transform-origin:bottom}:where([data-fretfall]) .bars.moving i{animation:bars .8s ease-in-out infinite alternate}:where([data-fretfall]) .bars.moving i:nth-child(2){animation-duration:1.1s;animation-delay:-.5s}:where([data-fretfall]) .bars.moving i:nth-child(3){animation-duration:.7s;animation-delay:-.2s}:where([data-fretfall]) .bars.moving i:nth-child(4){animation-duration:1s;animation-delay:-.7s}@keyframes bars{0%{transform:scaleY(.2)}to{transform:scaleY(1)}}@media(prefers-reduced-motion:reduce){:where([data-fretfall]) .bars.moving i{animation:none;transform:scaleY(.6)}}:where([data-fretfall]) #intro{position:fixed;left:50%;top:36%;transform:translate(-50%,-50%);display:grid;justify-items:center;gap:6px;max-width:min(640px,90cqw);padding:22px 30px;border-radius:16px;background:color-mix(in srgb,var(--ink) 72%,transparent);border:1px solid var(--chip-border);text-align:center;pointer-events:none;opacity:0;visibility:hidden;transition:opacity .5s ease,visibility .5s}:where([data-fretfall]) #intro.show{opacity:1;visibility:visible}:where([data-fretfall]) #introTitle{font:700 clamp(22px,3cqw,38px) / 1.15 var(--num);color:var(--text)}:where([data-fretfall]) #introFacts{font-size:14px;color:var(--muted)}:where([data-fretfall]) #introState{display:flex;align-items:center;gap:10px;margin-top:10px;font:600 12px var(--num);letter-spacing:.14em;text-transform:uppercase;color:var(--accent)}:where([data-fretfall]) .sheet{position:fixed;right:32px;top:66px;z-index:2;width:min(400px,calc(100cqw - 32px));max-height:calc(100cqh - 118px);display:flex;flex-direction:column;border-radius:14px;overflow:hidden;background:color-mix(in srgb,var(--ink) 94%,transparent);backdrop-filter:blur(18px);border:1px solid var(--chip-border);box-shadow:0 24px 60px #0000008c}:where([data-fretfall]) .sheet-head{display:flex;align-items:center;justify-content:space-between;padding:12px 12px 10px 18px}:where([data-fretfall]) .sheet-head h2{margin:0;font:600 15px var(--ui)}:where([data-fretfall]) .close{width:30px;height:30px;display:grid;place-items:center;padding:0;border:0;border-radius:8px;background:none;color:var(--muted);cursor:pointer}:where([data-fretfall]) .close:hover{background:var(--chip);color:var(--text)}:where([data-fretfall]) .tabs{display:grid;grid-template-columns:repeat(5,1fr);gap:2px;margin:0 14px;padding:3px;border-radius:9px;background:var(--chip);border:1px solid var(--chip-border)}:where([data-fretfall]) .tabs button{padding:6px 0;border:0;border-radius:6px;background:none;font:500 13px var(--ui);color:var(--muted);cursor:pointer}:where([data-fretfall]) .tabs button:hover{color:var(--text)}:where([data-fretfall]) .tabs button[aria-selected=true]{background:var(--text);color:var(--ink);font-weight:600}:where([data-fretfall]) .pane{display:grid;align-content:start;gap:18px;padding:18px 18px 20px;overflow:hidden auto}:where([data-fretfall]) .pane h3{margin:0 0 -6px;font:600 11px var(--num);letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}:where([data-fretfall]) .pane h3~h3{padding-top:16px;border-top:1px solid var(--chip-border)}:where([data-fretfall]) .setting{display:grid;gap:8px}:where([data-fretfall]) .pair{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:18px 20px}:where([data-fretfall]) .setting-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;font-size:13px;font-weight:500}:where([data-fretfall]) .setting-head output{font:600 12px var(--num);color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap}:where([data-fretfall]) .setting .seg{overflow:visible}:where([data-fretfall]) .setting .seg button{flex:1}:where([data-fretfall]) .scale{display:flex;justify-content:space-between;margin-top:-4px;font-size:11px;color:var(--muted)}:where([data-fretfall]) .hint{margin:-2px 0 0;font-size:12px;line-height:1.4;color:var(--muted)}:where([data-fretfall]) .text-button{justify-self:start;padding:4px 0;border:0;background:none;font:500 12px var(--ui);color:var(--muted);text-decoration:underline;text-underline-offset:3px;cursor:pointer}:where([data-fretfall]) .text-button:hover{color:var(--text)}:where([data-fretfall]) :is(#settings,.volume) input[type=range]{-webkit-appearance:none;appearance:none;height:18px;margin:0;background:none;cursor:pointer}:where([data-fretfall]) #settings input[type=range]{width:100%}:where([data-fretfall]) :is(#settings,.volume) input[type=range]::-webkit-slider-runnable-track{height:4px;border-radius:2px;background:linear-gradient(90deg,var(--accent) var(--fill, 50%),var(--chip-border) var(--fill, 50%))}:where([data-fretfall]) :is(#settings,.volume) input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:16px;height:16px;margin-top:-6px;border-radius:50%;background:var(--text);border:3px solid var(--accent);box-shadow:0 1px 4px #0006}:where([data-fretfall]) :is(#settings,.volume) input[type=range]::-moz-range-track{height:4px;border-radius:2px;background:var(--chip-border)}:where([data-fretfall]) :is(#settings,.volume) input[type=range]::-moz-range-progress{height:4px;border-radius:2px;background:var(--accent)}:where([data-fretfall]) :is(#settings,.volume) input[type=range]::-moz-range-thumb{width:10px;height:10px;border-radius:50%;background:var(--text);border:3px solid var(--accent)}:where([data-fretfall]) .toggle{display:flex;align-items:center;justify-content:space-between;gap:16px;font-size:13px;font-weight:500;cursor:pointer}:where([data-fretfall]) .toggle small{display:block;margin-top:2px;font-size:12px;font-weight:400;line-height:1.4;color:var(--muted)}:where([data-fretfall]) .toggle input{-webkit-appearance:none;appearance:none;flex:none;position:relative;width:36px;height:20px;margin:0;border-radius:10px;background:var(--chip-border);cursor:pointer;transition:background .15s}:where([data-fretfall]) .toggle input:after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:var(--text);transition:transform .15s}:where([data-fretfall]) .toggle input:checked{background:var(--accent)}:where([data-fretfall]) .toggle input:checked:after{transform:translate(16px);background:var(--ink)}:where([data-fretfall]) .cards{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px}:where([data-fretfall]) .cards.three{grid-template-columns:repeat(3,minmax(0,1fr))}:where([data-fretfall]) .cards button{display:grid;gap:8px;justify-items:start;padding:10px;border-radius:9px;border:1px solid var(--chip-border);background:var(--chip);font:500 12px var(--ui);color:var(--muted);text-align:left;cursor:pointer}:where([data-fretfall]) .cards button:hover{color:var(--text)}:where([data-fretfall]) .cards button[aria-pressed=true]{border-color:var(--accent);box-shadow:inset 0 0 0 1px var(--accent);color:var(--text)}:where([data-fretfall]) .dots{display:flex;gap:4px}:where([data-fretfall]) .dots i{width:10px;height:10px;border-radius:50%;box-shadow:inset 0 0 0 1px #ffffff2e}:where([data-fretfall]) .headstock{width:100%;height:52px}:where([data-fretfall]) .order{font:600 12px var(--num);letter-spacing:.12em;color:var(--text)}:where([data-fretfall]) #legend{width:min(430px,calc(100cqw - 32px))}:where([data-fretfall]) .legend-find{padding:0 14px 6px}:where([data-fretfall]) .legend-find input{width:100%;height:34px;padding:0 12px;border-radius:9px;border:1px solid var(--chip-border);background:var(--chip);color:var(--text);font:13px var(--ui)}:where([data-fretfall]) .legend-find input::placeholder{color:var(--muted)}:where([data-fretfall]) .legend{gap:4px;padding-top:10px}:where([data-fretfall]) .legend h3{margin:14px 0 4px}:where([data-fretfall]) .legend h3:first-child{margin-top:0}:where([data-fretfall]) .legend-item{display:grid;grid-template-columns:64px 1fr;gap:12px;align-items:center;padding:4px 0}:where([data-fretfall]) .legend-item b{display:block;font-size:13px;font-weight:500}:where([data-fretfall]) .legend-item span{display:block;font-size:12px;line-height:1.4;color:var(--muted)}:where([data-fretfall]) .legend-item .keys{display:flex;justify-content:center;gap:4px}:where([data-fretfall]) .legend-item kbd{min-width:22px;padding:2px 6px;border:1px solid var(--chip-border);border-bottom-width:2px;border-radius:5px;background:var(--chip);font:600 12px var(--num);text-align:center;white-space:nowrap}:where([data-fretfall]) .legend-item svg{width:64px;height:36px;border-radius:8px;background:var(--chip);border:1px solid var(--chip-border);fill:none;stroke-linecap:round;stroke-linejoin:round}:where([data-fretfall]) .legend-item text{font-family:var(--num);font-weight:700;text-anchor:middle;dominant-baseline:central}:where([data-fretfall]) .legend-empty{margin:8px 0;font-size:13px;color:var(--muted)}:where([data-fretfall]) .f0{fill:var(--s0)}:where([data-fretfall]) .f1{fill:var(--s1)}:where([data-fretfall]) .f2{fill:var(--s2)}:where([data-fretfall]) .f3{fill:var(--s3)}:where([data-fretfall]) .f4{fill:var(--s4)}:where([data-fretfall]) .l0{stroke:var(--s0)}:where([data-fretfall]) .l1{stroke:var(--s1)}:where([data-fretfall]) .l2{stroke:var(--s2)}:where([data-fretfall]) .l3{stroke:var(--s3)}:where([data-fretfall]) .l4{stroke:var(--s4)}:where([data-fretfall]) .lm{stroke:var(--muted)}:where([data-fretfall]) .li{stroke:var(--ink)}:where([data-fretfall]) .ft{fill:var(--text)}:where([data-fretfall]) .lt{stroke:var(--text)}:where([data-fretfall]) .fi{fill:var(--ink)}:where([data-fretfall]) .fa{fill:var(--accent)}:where([data-fretfall]) .fl{fill:var(--lane)}:where([data-fretfall]) .ll{stroke:var(--lane)}:where([data-fretfall]) .lw{stroke:#fff}:where([data-fretfall]) .fm{fill:var(--muted)}:where([data-fretfall]) .la{stroke:var(--accent)}:where([data-fretfall]) .fw{fill:#fff}:where([data-fretfall]) .volume{position:relative}:where([data-fretfall]) .volume .icon.muted{color:var(--muted)}:where([data-fretfall]) .volume-panel{position:absolute;top:calc(100% + 8px);left:50%;transform:translate(-50%);display:flex;align-items:center;gap:8px;padding:6px 14px 6px 6px;border-radius:10px;background:var(--ink);border:1px solid var(--chip-border);box-shadow:0 12px 30px #00000073}:where([data-fretfall]) .volume-panel input{width:150px}:where([data-fretfall]) .volume-panel output{min-width:36px;font:600 12px var(--num);color:var(--muted);text-align:right;font-variant-numeric:tabular-nums}:where([data-fretfall]) .volume-mute{flex:none;width:30px;height:30px;display:grid;place-items:center;padding:0;border:0;border-radius:7px;background:none;color:var(--text);cursor:pointer}:where([data-fretfall]) .volume-mute:hover{background:var(--chip)}:where([data-fretfall]) .volume-mute[aria-pressed=true]{color:var(--muted)}:where([data-fretfall]) #drop{position:fixed;inset:12px;z-index:5;display:grid;place-items:center;border:2px dashed var(--accent);border-radius:16px;background:#00000073;font:600 20px var(--num)}:where([data-fretfall]) #tab{position:fixed;left:-10000px;top:0;width:1000px}@media(max-width:900px){:where([data-fretfall]) .time{display:none}[data-fretfall]:where([data-fretfall-dock]) .time{display:block}:where([data-fretfall]) #menuButton{display:grid}:where([data-fretfall]) .volume{position:static}:where([data-fretfall]) .volume-panel{left:auto;right:0;transform:none}:where([data-fretfall]) .menu{display:none;position:absolute;top:calc(100% + 8px);right:0;width:230px;flex-direction:column;gap:2px;padding:6px;border-radius:12px;background:var(--ink);border:1px solid var(--chip-border);box-shadow:0 12px 30px #00000073}:where([data-fretfall]) #menuButton[aria-expanded=true]+.menu{display:flex}:where([data-fretfall]) .menu .icon{width:100%;height:38px;display:flex;justify-content:flex-start;gap:12px;padding:0 10px;border:0;border-radius:7px;background:none;font:500 13px var(--ui)}:where([data-fretfall]) .menu .icon:after{content:attr(data-label)}:where([data-fretfall]) .menu .icon:hover{background:var(--chip)}:where([data-fretfall]) .menu .icon[aria-pressed=true],:where([data-fretfall]) .menu .icon[aria-expanded=true]{background:none;color:var(--accent)}:where([data-fretfall]) .menu .tip{display:none}:where([data-fretfall]) .menu .divider{width:auto;height:1px;margin:4px}}@media(max-width:560px){:where([data-fretfall]) .bar{flex-wrap:wrap;height:auto;row-gap:8px}:where([data-fretfall]) .bar>.group:first-child,:where([data-fretfall]) .bar>.group:last-child{flex:1 1 100%;height:40px}:where([data-fretfall]) .speed{margin-left:auto}:where([data-fretfall]) #menuButton{position:absolute;top:2px;right:0}:where([data-fretfall]) .menu{top:48px}:where([data-fretfall]) #phrases{top:122px}:where([data-fretfall]) #info{flex-direction:column;align-items:flex-start;gap:2px;font-size:12px}:where([data-fretfall]) #info>span+span:before{display:none}:where([data-fretfall]) #info>span:first-child{max-width:100%;overflow:hidden;text-overflow:ellipsis}:where([data-fretfall]) #progress{top:182px}:where([data-fretfall]) #lyrics{top:212px}:where([data-fretfall]) .sheet{top:114px;max-height:calc(100cqh - 166px)}}@media(max-width:520px){:where([data-fretfall]) .sheet{right:16px}}[data-fretfall]:not([data-fretfall-dock]){contain:layout;container-type:size}'}),n=Object.assign(document.createElement("link"),{id:"fonts",rel:"stylesheet"});if(!e.isConnected)throw new Error("mount(element): the element has to be in the page");e.innerHTML=`<div data-fretfall><canvas id="highway"></canvas>
2
+ <header class="bar">
3
+ <div class="group" style="gap: 20px">
4
+ <div class="wordmark">
5
+ <svg
6
+ width="18"
7
+ height="18"
8
+ viewBox="0 0 24 24"
9
+ fill="currentColor"
10
+ aria-hidden="true"
11
+ >
12
+ <rect x="4" y="3" width="4.5" height="18" rx="1.5" />
13
+ <rect x="4" y="3" width="16" height="4.5" rx="1.5" />
14
+ <rect
15
+ class="fall"
16
+ x="10.5"
17
+ y="11.67"
18
+ width="9"
19
+ height="4.5"
20
+ rx="1.5"
21
+ />
22
+ </svg>
23
+ FRETFALL
24
+ </div>
25
+ <div
26
+ class="seg"
27
+ id="arrangements"
28
+ role="group"
29
+ aria-label="Arrangement"
30
+ ></div>
31
+ <div
32
+ class="seg views"
33
+ id="view"
34
+ role="group"
35
+ aria-label="View"
36
+ >
37
+ <button value="highway" aria-pressed="true">Highway</button>
38
+ <button value="tablature" aria-pressed="false">Tablature</button>
39
+ <button value="notation" aria-pressed="false">Notation</button>
40
+ </div>
41
+ </div>
42
+ <div class="group">
43
+ <span class="time" id="time">0:00 / 0:00</span>
44
+ <div class="speed">
45
+ <button
46
+ id="slower"
47
+ aria-label="Slower"
48
+ aria-describedby="speedTip"
49
+ >
50
+ <svg
51
+ width="16"
52
+ height="16"
53
+ viewBox="0 0 20 20"
54
+ fill="none"
55
+ stroke="currentColor"
56
+ stroke-width="1.6"
57
+ stroke-linecap="round"
58
+ >
59
+ <path d="M5 10h10" />
60
+ </svg>
61
+ </button>
62
+ <button id="speed" aria-describedby="speedTip">100%</button>
63
+ <button
64
+ id="faster"
65
+ aria-label="Faster"
66
+ aria-describedby="speedTip"
67
+ >
68
+ <svg
69
+ width="16"
70
+ height="16"
71
+ viewBox="0 0 20 20"
72
+ fill="none"
73
+ stroke="currentColor"
74
+ stroke-width="1.6"
75
+ stroke-linecap="round"
76
+ >
77
+ <path d="M10 5v10M5 10h10" />
78
+ </svg>
79
+ </button>
80
+ <span class="tip" role="tooltip" id="speedTip"
81
+ ><b
82
+ >Speed <span><kbd>−</kbd> <kbd>+</kbd></span></b
83
+ >Slow the song down to practise it, or speed it up, in
84
+ 10% steps. The number goes back to 100%
85
+ <kbd>0</kbd></span
86
+ >
87
+ </div>
88
+ <div class="volume">
89
+ <button
90
+ class="icon"
91
+ id="volumeButton"
92
+ aria-expanded="false"
93
+ aria-controls="volumePanel"
94
+ aria-label="Volume"
95
+ aria-describedby="volumeTip"
96
+ >
97
+ <span class="tip" role="tooltip" id="volumeTip"
98
+ ><b
99
+ >Volume
100
+ <span><kbd>↑</kbd> <kbd>↓</kbd></span></b
101
+ >Opens a slider. <kbd>M</kbd> mutes</span
102
+ >
103
+ </button>
104
+ <div class="volume-panel" id="volumePanel" hidden>
105
+ <button
106
+ class="volume-mute"
107
+ id="volumeMute"
108
+ aria-pressed="false"
109
+ ></button>
110
+ <input
111
+ id="volume"
112
+ type="range"
113
+ min="0"
114
+ max="1"
115
+ step="0.02"
116
+ aria-label="Volume"
117
+ />
118
+ <output id="volumeOut" for="volume"></output>
119
+ </div>
120
+ </div>
121
+ <button
122
+ class="icon"
123
+ id="minimalBack"
124
+ aria-label="Back from the minimal view"
125
+ title="Back from the minimal view (H)"
126
+ >
127
+ <svg width="18" height="18" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M3 10s2.5-4.5 7-4.5 7 4.5 7 4.5-2.5 4.5-7 4.5-7-4.5-7-4.5z"/><circle cx="10" cy="10" r="2"/></svg>
128
+ </button>
129
+ <button
130
+ class="icon"
131
+ id="menuButton"
132
+ aria-expanded="false"
133
+ aria-controls="menu"
134
+ aria-label="Menu"
135
+ >
136
+ <svg
137
+ width="18"
138
+ height="18"
139
+ viewBox="0 0 20 20"
140
+ fill="none"
141
+ stroke="currentColor"
142
+ stroke-width="1.6"
143
+ stroke-linecap="round"
144
+ >
145
+ <path d="M4 6h12M4 10h12M4 14h12" />
146
+ </svg>
147
+ </button>
148
+ <div class="menu" id="menu">
149
+ <button
150
+ class="icon"
151
+ id="loop"
152
+ data-label="Loop"
153
+ aria-pressed="false"
154
+ aria-label="Loop"
155
+ aria-describedby="loopTip"
156
+ >
157
+ <svg
158
+ width="18"
159
+ height="18"
160
+ viewBox="0 0 20 20"
161
+ fill="none"
162
+ stroke="currentColor"
163
+ stroke-width="1.6"
164
+ stroke-linecap="round"
165
+ stroke-linejoin="round"
166
+ >
167
+ <path d="M13.5 3.5l2.5 2.5-2.5 2.5" />
168
+ <path d="M4 10V9a3 3 0 0 1 3-3h9" />
169
+ <path d="M6.5 16.5L4 14l2.5-2.5" />
170
+ <path d="M16 10v1a3 3 0 0 1-3 3H4" />
171
+ </svg>
172
+ <span class="tip" role="tooltip" id="loopTip"
173
+ ><b>Loop <kbd>L</kbd></b
174
+ >Loop the phrase you are in. Drag across the phrase
175
+ bars to loop a stretch, hold shift while dragging to
176
+ loop exactly what you pick, or shift-click a bar to
177
+ stretch the loop to it</span
178
+ >
179
+ </button>
180
+ <button class="icon" id="play" aria-describedby="playTip">
181
+ <span class="tip" role="tooltip" id="playTip"
182
+ ><b>Play and pause <kbd>Space</kbd></b
183
+ >Play the song from where the highway is</span
184
+ >
185
+ </button>
186
+ <div class="divider"></div>
187
+ <button
188
+ class="icon"
189
+ id="open"
190
+ data-label="Open file"
191
+ aria-label="Open file"
192
+ aria-describedby="openTip"
193
+ >
194
+ <svg
195
+ width="18"
196
+ height="18"
197
+ viewBox="0 0 20 20"
198
+ fill="none"
199
+ stroke="currentColor"
200
+ stroke-width="1.6"
201
+ stroke-linecap="round"
202
+ stroke-linejoin="round"
203
+ >
204
+ <path
205
+ d="M3 6.5V15a1.5 1.5 0 0 0 1.5 1.5h11A1.5 1.5 0 0 0 17 15V8.5A1.5 1.5 0 0 0 15.5 7H10L8.5 5H4.5A1.5 1.5 0 0 0 3 6.5z"
206
+ />
207
+ </svg>
208
+ <span class="tip" role="tooltip" id="openTip"
209
+ ><b>Open a song <kbd>O</kbd></b
210
+ >A Guitar Pro file, or a tab with its recording. You
211
+ can also drop them anywhere</span
212
+ >
213
+ </button>
214
+ <div class="divider"></div>
215
+ <button
216
+ class="icon"
217
+ id="metronome"
218
+ data-label="Metronome"
219
+ aria-pressed="false"
220
+ aria-label="Metronome"
221
+ aria-describedby="metronomeTip"
222
+ >
223
+ <svg
224
+ width="18"
225
+ height="18"
226
+ viewBox="0 0 20 20"
227
+ fill="none"
228
+ stroke="currentColor"
229
+ stroke-width="1.6"
230
+ stroke-linecap="round"
231
+ stroke-linejoin="round"
232
+ >
233
+ <path d="M7.8 3h4.4l3.3 13.5h-11z" />
234
+ <path d="M5.6 12.5h8.8M10 12.5l4-7" />
235
+ </svg>
236
+ <span class="tip" role="tooltip" id="metronomeTip"
237
+ ><b>Metronome <kbd>K</kbd></b
238
+ >A click on every beat, higher on the first of each
239
+ bar</span
240
+ >
241
+ </button>
242
+ <button
243
+ class="icon"
244
+ id="band"
245
+ data-label="Play as a band"
246
+ aria-label="Play as a band"
247
+ aria-describedby="bandTip"
248
+ disabled
249
+ >
250
+ <svg
251
+ width="18"
252
+ height="18"
253
+ viewBox="0 0 20 20"
254
+ fill="none"
255
+ stroke="currentColor"
256
+ stroke-width="1.6"
257
+ stroke-linecap="round"
258
+ stroke-linejoin="round"
259
+ >
260
+ <circle cx="7.5" cy="7" r="2.5" />
261
+ <path d="M3 16.5a4.5 4.5 0 0 1 9 0" />
262
+ <circle cx="13.8" cy="7.5" r="2" />
263
+ <path d="M13.5 12.2a3.8 3.8 0 0 1 4 4.3" />
264
+ </svg>
265
+ <span class="tip" role="tooltip" id="bandTip"
266
+ ><b>Play as a band</b>Opens every part in a window of its
267
+ own, side by side, all in time. Play, pause, jump and loop
268
+ from any of them; the sound comes from this window, which
269
+ stays open behind them</span
270
+ >
271
+ </button>
272
+ <button
273
+ class="icon"
274
+ id="minimal"
275
+ data-label="Minimal view"
276
+ aria-pressed="false"
277
+ aria-label="Minimal view"
278
+ aria-describedby="minimalTip"
279
+ >
280
+ <svg
281
+ width="18"
282
+ height="18"
283
+ viewBox="0 0 20 20"
284
+ fill="none"
285
+ stroke="currentColor"
286
+ stroke-width="1.6"
287
+ stroke-linecap="round"
288
+ stroke-linejoin="round"
289
+ >
290
+ <path
291
+ d="M2.5 10s2.8-5 7.5-5 7.5 5 7.5 5-2.8 5-7.5 5-7.5-5-7.5-5z"
292
+ />
293
+ <circle cx="10" cy="10" r="2.2" />
294
+ </svg>
295
+ <span class="tip" role="tooltip" id="minimalTip"
296
+ ><b>Minimal view <kbd>H</kbd></b
297
+ >Just the highway and the lyrics: the header, phrase bars
298
+ and song info make way. Press again to bring them back</span
299
+ >
300
+ </button>
301
+ <div class="divider"></div>
302
+ <button
303
+ class="icon"
304
+ id="legendButton"
305
+ data-label="Notation and shortcuts"
306
+ aria-expanded="false"
307
+ aria-controls="legend"
308
+ aria-label="Notation and shortcuts"
309
+ aria-describedby="legendTip"
310
+ >
311
+ <svg
312
+ width="18"
313
+ height="18"
314
+ viewBox="0 0 20 20"
315
+ fill="none"
316
+ stroke="currentColor"
317
+ stroke-width="1.6"
318
+ stroke-linecap="round"
319
+ stroke-linejoin="round"
320
+ >
321
+ <circle cx="10" cy="10" r="7.5" />
322
+ <path
323
+ d="M7.8 7.6a2.3 2.3 0 0 1 4.4.9c0 1.5-2.2 1.9-2.2 3.2"
324
+ />
325
+ <path d="M10 14.4h.01" />
326
+ </svg>
327
+ <span class="tip" role="tooltip" id="legendTip"
328
+ ><b>Notation and shortcuts <kbd>?</kbd></b
329
+ >What every mark on the highway means, and the
330
+ keyboard shortcuts</span
331
+ >
332
+ </button>
333
+ <button
334
+ class="icon"
335
+ id="settingsButton"
336
+ data-label="Settings"
337
+ aria-expanded="false"
338
+ aria-controls="settings"
339
+ aria-label="Settings"
340
+ aria-describedby="settingsTip"
341
+ >
342
+ <svg
343
+ width="18"
344
+ height="18"
345
+ viewBox="0 0 20 20"
346
+ fill="none"
347
+ stroke="currentColor"
348
+ stroke-width="1.6"
349
+ stroke-linecap="round"
350
+ >
351
+ <path d="M3.5 6h8M15.5 6h1M3.5 14h2M9.5 14h7" />
352
+ <circle cx="13.5" cy="6" r="2" />
353
+ <circle cx="7.5" cy="14" r="2" />
354
+ </svg>
355
+ <span class="tip" role="tooltip" id="settingsTip"
356
+ ><b>Settings <kbd>S</kbd></b
357
+ >The view of the highway and what shows on it, the
358
+ strings' colours and order, and the audio
359
+ delay</span
360
+ >
361
+ </button>
362
+ <button
363
+ class="icon"
364
+ id="fullscreen"
365
+ data-label="Full screen"
366
+ aria-label="Full screen"
367
+ aria-describedby="fullscreenTip"
368
+ >
369
+ <span class="tip" role="tooltip" id="fullscreenTip"
370
+ ><b>Full screen <kbd>F</kbd></b
371
+ >The highway, the phrase bars and the lyrics. Point
372
+ at the phrase bars to bring the header back</span
373
+ >
374
+ </button>
375
+ </div>
376
+ </div>
377
+ </header>
378
+ <div id="phrases">
379
+ <span id="loopBox" hidden></span
380
+ ><span id="phraseTime" hidden></span>
381
+ </div>
382
+ <div id="loopTools" role="group" aria-label="Loop" hidden>
383
+ <button
384
+ class="icon"
385
+ id="trainer"
386
+ aria-pressed="false"
387
+ aria-label="Speed trainer"
388
+ aria-describedby="trainerTip"
389
+ disabled
390
+ >
391
+ <svg
392
+ width="18"
393
+ height="18"
394
+ viewBox="0 0 20 20"
395
+ fill="none"
396
+ stroke="currentColor"
397
+ stroke-width="1.6"
398
+ stroke-linecap="round"
399
+ stroke-linejoin="round"
400
+ >
401
+ <path d="M3.5 14.5a6.5 6.5 0 1 1 13 0" />
402
+ <path d="M10 14.5l3.2-4.2" />
403
+ </svg>
404
+ <span class="tip" role="tooltip" id="trainerTip"
405
+ ><b>Speed trainer</b
406
+ ><span id="trainerHint"
407
+ >Slow down to 90% or less to use it</span
408
+ ></span
409
+ >
410
+ </button>
411
+ <button
412
+ class="icon"
413
+ id="clearLoop"
414
+ aria-label="Clear the loop"
415
+ aria-describedby="clearLoopTip"
416
+ >
417
+ <svg
418
+ width="16"
419
+ height="16"
420
+ viewBox="0 0 20 20"
421
+ fill="none"
422
+ stroke="currentColor"
423
+ stroke-width="1.8"
424
+ stroke-linecap="round"
425
+ >
426
+ <path d="M5.5 5.5l9 9M14.5 5.5l-9 9" />
427
+ </svg>
428
+ <span class="tip" role="tooltip" id="clearLoopTip"
429
+ ><b>Clear the loop <kbd>L</kbd></b
430
+ >Play on through the whole song</span
431
+ >
432
+ </button>
433
+ </div>
434
+ <div id="progress"><div></div></div>
435
+ <div id="lyrics">
436
+ <div id="section"></div>
437
+ <div id="lines"></div>
438
+ </div>
439
+ <div id="info"></div>
440
+ <div
441
+ id="settings"
442
+ class="sheet"
443
+ role="dialog"
444
+ aria-labelledby="settingsTitle"
445
+ hidden
446
+ >
447
+ <div class="sheet-head">
448
+ <h2 id="settingsTitle">Settings</h2>
449
+ <button
450
+ class="close"
451
+ id="settingsClose"
452
+ aria-label="Close settings"
453
+ >
454
+ <svg
455
+ width="16"
456
+ height="16"
457
+ viewBox="0 0 20 20"
458
+ fill="none"
459
+ stroke="currentColor"
460
+ stroke-width="1.8"
461
+ stroke-linecap="round"
462
+ >
463
+ <path d="M5 5l10 10M15 5L5 15" />
464
+ </svg>
465
+ </button>
466
+ </div>
467
+ <div class="tabs" role="tablist" aria-label="Settings sections">
468
+ <button
469
+ role="tab"
470
+ id="tab-view"
471
+ aria-controls="pane-view"
472
+ data-tab="view"
473
+ >
474
+ View
475
+ </button>
476
+ <button
477
+ role="tab"
478
+ id="tab-highway"
479
+ aria-controls="pane-highway"
480
+ data-tab="highway"
481
+ >
482
+ Highway
483
+ </button>
484
+ <button
485
+ role="tab"
486
+ id="tab-strings"
487
+ aria-controls="pane-strings"
488
+ data-tab="strings"
489
+ >
490
+ Strings
491
+ </button>
492
+ <button
493
+ role="tab"
494
+ id="tab-style"
495
+ aria-controls="pane-style"
496
+ data-tab="style"
497
+ >
498
+ Style
499
+ </button>
500
+ <button
501
+ role="tab"
502
+ id="tab-audio"
503
+ aria-controls="pane-audio"
504
+ data-tab="audio"
505
+ >
506
+ Audio
507
+ </button>
508
+ </div>
509
+ <section
510
+ class="pane"
511
+ id="pane-view"
512
+ role="tabpanel"
513
+ aria-labelledby="tab-view"
514
+ >
515
+ <h3 class="only-3d">Camera</h3>
516
+ <div class="pair only-3d">
517
+ <div class="setting">
518
+ <div class="setting-head">
519
+ <label for="viewAngle">View angle</label
520
+ ><output id="viewAngleOut" for="viewAngle"></output>
521
+ </div>
522
+ <input
523
+ id="viewAngle"
524
+ type="range"
525
+ min="10"
526
+ max="65"
527
+ step="1"
528
+ />
529
+ <div class="scale" aria-hidden="true">
530
+ <span>Flat</span><span>Top-down</span>
531
+ </div>
532
+ </div>
533
+ <div
534
+ class="setting"
535
+ title="Look at the highway from one side: it runs off that way, and the frets on that side come closer"
536
+ >
537
+ <div class="setting-head">
538
+ <label for="sideAngle">Side angle</label
539
+ ><output id="sideAngleOut" for="sideAngle"></output>
540
+ </div>
541
+ <input
542
+ id="sideAngle"
543
+ type="range"
544
+ min="-20"
545
+ max="20"
546
+ step="1"
547
+ />
548
+ <div class="scale" aria-hidden="true">
549
+ <span>Left</span><span>Right</span>
550
+ </div>
551
+ </div>
552
+ </div>
553
+ <h3>Neck</h3>
554
+ <div class="pair">
555
+ <div
556
+ class="setting only-3d"
557
+ title="How wide each fret is on screen. The strings keep their spacing, and your hand position always stays in view"
558
+ >
559
+ <div class="setting-head">
560
+ <label for="fretWidth">Fret width</label
561
+ ><output id="fretWidthOut" for="fretWidth"></output>
562
+ </div>
563
+ <input
564
+ id="fretWidth"
565
+ type="range"
566
+ min="0.5"
567
+ max="2"
568
+ step="0.05"
569
+ />
570
+ <div class="scale" aria-hidden="true">
571
+ <span>More of the neck</span
572
+ ><span>Bigger frets</span>
573
+ </div>
574
+ </div>
575
+ <div
576
+ class="setting"
577
+ title="How far apart the strings are. The notes grow with them, and the fret numbers stay where they are"
578
+ >
579
+ <div class="setting-head">
580
+ <label for="boardHeight">Fretboard height</label
581
+ ><output
582
+ id="boardHeightOut"
583
+ for="boardHeight"
584
+ ></output>
585
+ </div>
586
+ <input
587
+ id="boardHeight"
588
+ type="range"
589
+ min="0.5"
590
+ max="2"
591
+ step="0.05"
592
+ />
593
+ <div class="scale" aria-hidden="true">
594
+ <span>Strings closer</span
595
+ ><span>Strings apart</span>
596
+ </div>
597
+ </div>
598
+ </div>
599
+ <h3 class="not-notation">Notes</h3>
600
+ <div class="pair not-notation">
601
+ <div class="setting">
602
+ <div class="setting-head">
603
+ <label for="noteSpeed">Note speed</label
604
+ ><output id="noteSpeedOut" for="noteSpeed"></output>
605
+ </div>
606
+ <input
607
+ id="noteSpeed"
608
+ type="range"
609
+ min="0.25"
610
+ max="2"
611
+ step="0.05"
612
+ />
613
+ <div class="scale" aria-hidden="true">
614
+ <span>Close together</span><span>Far apart</span>
615
+ </div>
616
+ </div>
617
+ <div
618
+ class="setting only-3d"
619
+ title="How far down the highway notes show up. Shown as the seconds of notes in view, which faster notes also shorten"
620
+ >
621
+ <div class="setting-head">
622
+ <label for="drawDistance">Drawing distance</label
623
+ ><output
624
+ id="drawDistanceOut"
625
+ for="drawDistance"
626
+ ></output>
627
+ </div>
628
+ <input
629
+ id="drawDistance"
630
+ type="range"
631
+ min="0.2"
632
+ max="2"
633
+ step="0.05"
634
+ />
635
+ <div class="scale" aria-hidden="true">
636
+ <span>Near</span><span>Far</span>
637
+ </div>
638
+ </div>
639
+ </div>
640
+ <button class="text-button" id="resetSettings">
641
+ Reset settings
642
+ </button>
643
+ </section>
644
+ <section
645
+ class="pane"
646
+ id="pane-highway"
647
+ role="tabpanel"
648
+ aria-labelledby="tab-highway"
649
+ hidden
650
+ >
651
+ <div
652
+ class="setting only-2d not-notation"
653
+ title="Notes scrolling in to the play line, or a page of bars that holds still while the play line moves across it"
654
+ >
655
+ <div class="setting-head">
656
+ <span id="tabLayoutLabel">Tablature</span>
657
+ </div>
658
+ <div
659
+ class="seg"
660
+ data-setting="tabLayout"
661
+ role="group"
662
+ aria-labelledby="tabLayoutLabel"
663
+ ></div>
664
+ </div>
665
+ <div
666
+ class="setting only-notation"
667
+ title="The page the notation is written on: the theme's dark card, or white paper"
668
+ >
669
+ <div class="setting-head">
670
+ <span id="paperLabel">Paper</span>
671
+ </div>
672
+ <div
673
+ class="seg"
674
+ data-setting="paper"
675
+ role="group"
676
+ aria-labelledby="paperLabel"
677
+ ></div>
678
+ </div>
679
+ <label class="toggle only-notation"
680
+ ><span
681
+ >Beat highlight<small
682
+ >The beat being played, filled across the system</small
683
+ ></span
684
+ ><input id="beatBox" type="checkbox" role="switch"
685
+ /></label>
686
+ <label class="toggle only-notation"
687
+ ><span
688
+ >Notes<small
689
+ >The notes on a staff over each system, as guitar music is written</small
690
+ ></span
691
+ ><input id="sheetNotes" type="checkbox" role="switch"
692
+ /></label>
693
+ <div
694
+ class="setting only-notation"
695
+ title="Whether the page turns with the beat, keeping the system being played second from the top, or only when you scroll it"
696
+ >
697
+ <div class="setting-head">
698
+ <span id="sheetScrollLabel">Scroll</span>
699
+ </div>
700
+ <div
701
+ class="seg"
702
+ data-setting="sheetScroll"
703
+ role="group"
704
+ aria-labelledby="sheetScrollLabel"
705
+ ></div>
706
+ </div>
707
+ <div
708
+ class="setting only-2d"
709
+ title="What is written around a note: the finger to press with, and the techniques, chord names and hand positions over and under the staff"
710
+ >
711
+ <div class="setting-head">
712
+ <span id="tabMarksLabel">Marks</span>
713
+ </div>
714
+ <div
715
+ class="seg"
716
+ data-setting="tabMarks"
717
+ role="group"
718
+ aria-labelledby="tabMarksLabel"
719
+ ></div>
720
+ </div>
721
+ <div class="setting not-notation">
722
+ <div class="setting-head">
723
+ <span id="lookLabel">Notes</span>
724
+ </div>
725
+ <div
726
+ class="seg"
727
+ data-setting="look"
728
+ role="group"
729
+ aria-labelledby="lookLabel"
730
+ ></div>
731
+ </div>
732
+ <label class="toggle only-3d"
733
+ ><span
734
+ >3D notes<small
735
+ >Notes a few pixels deep, lit on top</small
736
+ ></span
737
+ ><input id="notes3d" type="checkbox" role="switch"
738
+ /></label>
739
+ <div
740
+ class="setting only-3d"
741
+ title="The white line on the floor under each note and chord, where it's played"
742
+ >
743
+ <div class="setting-head">
744
+ <label for="noteLines">Note lines</label
745
+ ><output id="noteLinesOut" for="noteLines"></output>
746
+ </div>
747
+ <input
748
+ id="noteLines"
749
+ type="range"
750
+ min="0"
751
+ max="1"
752
+ step="0.05"
753
+ />
754
+ <div class="scale" aria-hidden="true">
755
+ <span>Hidden</span><span>Solid</span>
756
+ </div>
757
+ </div>
758
+ <div class="setting only-3d">
759
+ <div class="setting-head">
760
+ <span id="framesLabel">Chord frames</span>
761
+ </div>
762
+ <div
763
+ class="seg"
764
+ data-setting="frames"
765
+ role="group"
766
+ aria-labelledby="framesLabel"
767
+ ></div>
768
+ </div>
769
+ <div class="setting only-3d">
770
+ <div class="setting-head">
771
+ <span id="repeatMarksLabel">Repeated chords</span>
772
+ </div>
773
+ <div
774
+ class="seg"
775
+ data-setting="repeatMarks"
776
+ role="group"
777
+ aria-labelledby="repeatMarksLabel"
778
+ ></div>
779
+ </div>
780
+ <div
781
+ class="setting only-3d"
782
+ title="The fret of each note, on the floor in front of it, and a ruler of inlay frets on every bar line"
783
+ >
784
+ <div class="setting-head">
785
+ <label for="fretNumbers">Fret numbers</label
786
+ ><output id="fretNumbersOut" for="fretNumbers"></output>
787
+ </div>
788
+ <input
789
+ id="fretNumbers"
790
+ type="range"
791
+ min="0"
792
+ max="1"
793
+ step="0.05"
794
+ />
795
+ <div class="scale" aria-hidden="true">
796
+ <span>Hidden</span><span>Solid</span>
797
+ </div>
798
+ </div>
799
+ <div
800
+ class="setting not-notation"
801
+ title="The finger numbers on a note, and the fret numbers in the tab. The mutes' crosses are white either way"
802
+ >
803
+ <div class="setting-head">
804
+ <span id="markingsLabel">Markings on notes</span>
805
+ </div>
806
+ <div
807
+ class="seg"
808
+ data-setting="markings"
809
+ role="group"
810
+ aria-labelledby="markingsLabel"
811
+ ></div>
812
+ </div>
813
+ <label class="toggle not-notation"
814
+ ><span
815
+ >Hand position guides<small
816
+ >Where your hand goes: a band down the highway, or
817
+ its fret under the tab</small
818
+ ></span
819
+ ><input id="guides" type="checkbox" role="switch"
820
+ /></label>
821
+ </section>
822
+ <section
823
+ class="pane"
824
+ id="pane-strings"
825
+ role="tabpanel"
826
+ aria-labelledby="tab-strings"
827
+ hidden
828
+ >
829
+ <div class="setting">
830
+ <div class="setting-head">
831
+ <span id="stringOrderLabel">String order</span>
832
+ </div>
833
+ <div
834
+ class="cards"
835
+ data-setting="stringOrder"
836
+ role="group"
837
+ aria-labelledby="stringOrderLabel"
838
+ ></div>
839
+ </div>
840
+ <div class="setting">
841
+ <div class="setting-head">
842
+ <span id="stringsLabel">String colours</span>
843
+ </div>
844
+ <div
845
+ class="cards"
846
+ data-setting="strings"
847
+ role="group"
848
+ aria-labelledby="stringsLabel"
849
+ ></div>
850
+ </div>
851
+ </section>
852
+ <section
853
+ class="pane"
854
+ id="pane-style"
855
+ role="tabpanel"
856
+ aria-labelledby="tab-style"
857
+ hidden
858
+ >
859
+ <div class="setting">
860
+ <div class="setting-head">
861
+ <span id="colorsLabel">Colours</span>
862
+ </div>
863
+ <div
864
+ class="cards three"
865
+ data-setting="colors"
866
+ role="group"
867
+ aria-labelledby="colorsLabel"
868
+ ></div>
869
+ </div>
870
+ <div class="setting">
871
+ <div class="setting-head">
872
+ <span id="fontsLabel">Fonts</span>
873
+ </div>
874
+ <div
875
+ class="seg"
876
+ data-setting="fonts"
877
+ role="group"
878
+ aria-labelledby="fontsLabel"
879
+ ></div>
880
+ </div>
881
+ <div class="setting only-3d">
882
+ <div class="setting-head">
883
+ <span id="headstockLabel">Headstock</span>
884
+ </div>
885
+ <div
886
+ class="cards"
887
+ data-setting="headstock"
888
+ role="group"
889
+ aria-labelledby="headstockLabel"
890
+ ></div>
891
+ </div>
892
+ <label class="toggle"
893
+ ><span
894
+ >Song intro<small
895
+ >The title and "Get ready" before the first notes
896
+ come into view</small
897
+ ></span
898
+ ><input id="songIntro" type="checkbox" role="switch"
899
+ /></label>
900
+ </section>
901
+ <section
902
+ class="pane"
903
+ id="pane-audio"
904
+ role="tabpanel"
905
+ aria-labelledby="tab-audio"
906
+ hidden
907
+ >
908
+ <label class="toggle"
909
+ ><span
910
+ >Autoplay<small
911
+ >Start playing as soon as a song has opened</small
912
+ ></span
913
+ ><input id="autoplay" type="checkbox" role="switch"
914
+ /></label>
915
+ <div class="setting">
916
+ <div class="setting-head">
917
+ <label for="offset">Audio delay</label
918
+ ><output id="offsetOut" for="offset"></output>
919
+ </div>
920
+ <input
921
+ id="offset"
922
+ type="range"
923
+ min="-1000"
924
+ max="1000"
925
+ step="10"
926
+ />
927
+ <div class="scale" aria-hidden="true">
928
+ <span>Notes earlier</span><span>Notes later</span>
929
+ </div>
930
+ <p class="hint">
931
+ Move it right if notes reach the strings before you hear
932
+ them.
933
+ </p>
934
+ </div>
935
+ <button class="text-button" id="resetOffset">
936
+ Reset delay
937
+ </button>
938
+ <label class="toggle"
939
+ ><span
940
+ >Mute my part<small
941
+ >Guitar Pro files played by the synth: hear the
942
+ other tracks without yours</small
943
+ ></span
944
+ ><input id="mute" type="checkbox" role="switch"
945
+ /></label>
946
+ </section>
947
+ </div>
948
+ <div
949
+ id="legend"
950
+ class="sheet"
951
+ role="dialog"
952
+ aria-labelledby="legendTitle"
953
+ hidden
954
+ >
955
+ <div class="sheet-head">
956
+ <h2 id="legendTitle">Notation and shortcuts</h2>
957
+ <button
958
+ class="close"
959
+ id="legendClose"
960
+ aria-label="Close notation"
961
+ >
962
+ <svg
963
+ width="16"
964
+ height="16"
965
+ viewBox="0 0 20 20"
966
+ fill="none"
967
+ stroke="currentColor"
968
+ stroke-width="1.8"
969
+ stroke-linecap="round"
970
+ >
971
+ <path d="M5 5l10 10M15 5L5 15" />
972
+ </svg>
973
+ </button>
974
+ </div>
975
+ <div class="legend-find">
976
+ <input
977
+ id="legendFind"
978
+ type="search"
979
+ placeholder="Find a notation or shortcut, like bend or loop"
980
+ aria-label="Find a notation or shortcut"
981
+ />
982
+ </div>
983
+ <div class="pane legend" id="legendList"></div>
984
+ </div>
985
+ <div id="intro" aria-hidden="true">
986
+ <div id="introTitle"></div>
987
+ <div id="introFacts"></div>
988
+ <div id="introState">
989
+ <span class="bars" id="introBars"
990
+ ><i></i><i></i><i></i><i></i
991
+ ></span>
992
+ <span id="introText"></span>
993
+ </div>
994
+ </div>
995
+ <div id="status" role="status" class="loading">
996
+ <span class="bars moving" aria-hidden="true"
997
+ ><i></i><i></i><i></i><i></i
998
+ ></span>
999
+ <span id="statusText">Loading the player…</span>
1000
+ </div>
1001
+ <div id="bandNote" hidden>
1002
+ <span
1003
+ >Playing as a band: every part is in a window of its own, and
1004
+ the sound comes from this one</span
1005
+ >
1006
+ <button class="text-button" id="bandBack">
1007
+ Close the band windows
1008
+ </button>
1009
+ </div>
1010
+ <div id="drop" hidden>
1011
+ Drop a Guitar Pro file, or a tab with its recording
1012
+ </div>
1013
+ <input
1014
+ type="file"
1015
+ id="file"
1016
+ hidden
1017
+ multiple
1018
+ accept=".gp,.gp3,.gp4,.gp5,.gpx,.musicxml,.mxl,.xml,.atex,.mp3,.m4a,.aac,.ogg,.oga,.wav,.flac"
1019
+ />
1020
+ <div id="tab"></div></div>`;const o=[...e.querySelectorAll("[id]")].map(t=>t.id).filter(t=>document.querySelectorAll(`[id="${t}"]`).length>1);if(document.getElementById(n.id)&&o.push(n.id),o.length)throw e.innerHTML="",new Error(`The page around the player uses ids that are the player's: ${o.join(", ")}`);return document.head.append(a,n),window.alphaTab||await new Promise((t,r)=>document.head.append(Object.assign(document.createElement("script"),{src:"https://cdn.jsdelivr.net/npm/@coderline/alphatab@1.8.4/dist/alphaTab.min.js",onload:t,onerror:()=>r(new Error("Could not load https://cdn.jsdelivr.net/npm/@coderline/alphatab@1.8.4/dist/alphaTab.min.js"))}))),await import("./player.js"),window.fretfall}export{d as mount};