-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
59 lines (59 loc) · 66.2 KB
/
index.html
File metadata and controls
59 lines (59 loc) · 66.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<!doctype html><html lang="en"><head><meta content=" default-src 'self'; script-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data:; style-src 'self' 'unsafe-inline'; font-src 'self' data:; media-src 'self' " http-equiv="Content-Security-Policy"><meta charset="utf-8"><link rel="apple-touch-icon" href="/apple-touch-icon.png"><script> (function () { var ua = navigator.userAgent || ""; var isMobile = /iPhone|iPad|iPod|Android/i.test(ua); var p = location.pathname; if (p === "/m" || p.startsWith("/m/")) return; if (isMobile) { location.replace(location.origin + "/m"); } })(); </script><meta content=" default-src 'self'; base-uri 'self'; object-src 'none'; frame-ancestors 'none'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:; media-src 'self'; connect-src 'self'; worker-src 'self' "><meta charset="utf-8"><meta content="width=device-width,initial-scale=1" name="viewport"><meta content="https://pv18.dim.productions/assets/pic/pianovirtuoso18.jpg" property="og:image"><meta content="website" property="og:type"><meta content="Piano Virtuoso 18" property="og:title"><meta content="piano SFX game by DIMProductions." property="og:description"><meta content="summary_large_image" name="twitter:card"><meta content="Ultra-fast piano reflex trainer for repeated-note technique." name="description"><meta content="https://pv18.dim.productions/assets/pic/pianovirtuoso18.jpg" name="twitter:image"><link href="/assets/pic/pianovirtuoso18.jpg" rel="apple-touch-icon"><link href="https://pv18.dim.productions" rel="canonical"><link href="https://pv18.dim.productions/m" rel="alternate" media="only screen and (max-width: 900px)"><link href="/assets/pic/faviconpv18.svg" rel="icon" type="image/svg+xml"><meta content="Piano Virtuoso 1.8 — 10-second burst test for speed & stability. MIDI keyboard required. Modes: Erlkönig (C only) / Diavolo (C–D alternating)." name="description"><title>Piano Virtuoso 18</title><style>:root{--startGlow:#30b0ff;--stopGlow:#ff5050}#start,#stop{transition:filter .12s ease}#start:hover{filter:brightness(1.15) drop-shadow(0 0 4px var(--startGlow)) drop-shadow(0 0 12px var(--startGlow));outline:0}#start:focus{outline:0}#start:focus-visible{filter:brightness(1.15) drop-shadow(0 0 4px var(--startGlow)) drop-shadow(0 0 12px var(--startGlow));outline:2px solid #fff;outline-offset:2px}#stop:hover{filter:brightness(1.15) drop-shadow(0 0 4px var(--stopGlow)) drop-shadow(0 0 12px var(--stopGlow));outline:0}#stop:focus{outline:0}#stop:focus-visible{filter:brightness(1.15) drop-shadow(0 0 4px var(--stopGlow)) drop-shadow(0 0 12px var(--stopGlow));outline:2px solid #fff;outline-offset:2px}*{box-sizing:border-box}body,html{height:100%}body{margin:0;background:var(--bg);color:var(--ink);image-rendering:pixelated}:root{--baseW:800;--baseH:600;--px:1;--scale:1;--bg:#000;--card:#000;--ink:#fff;--sub:#4ddeff;--mut:#5c5c5c;--pri:#6cf06c;--pri2:#2cbc2c;--danger:#ff5050;--border:#2a3347;--panel:#000;--panel2:#000;--accent:#fff;--accent2:#ff0d29;--accent3:#fff;--ok:#90ee90}#wrap{width:calc(var(--baseW)*1px);margin:12px auto;transform-origin:top center image-rendering: pixelated;image-rendering:crisp-edges}@media (min-width:320px){#wrap{margin-top:24px}}#zoom{width:calc(var(--baseW)*1px);transform:scale(var(--scale));transform-origin:top center}.pixel-frame{position:relative;background:var(--panel);padding:calc(var(--px)*3);box-shadow:0 0 0 var(--px) #fff,calc(var(--px)) calc(var(--px)) 0 0 #fff,calc(var(--px)*-1) calc(var(--px)*-1) 0 0 #fff,0 0 0 calc(var(--px)*2) #000}.pixel-inset{background:var(--panel2);padding:calc(var(--px)*3);box-shadow:inset 0 0 0 var(--px) #fff,inset calc(var(--px)) calc(var(--px)) 0 0 #000,inset calc(var(--px)*-1) calc(var(--px)*-1) 0 0 #000}.h1{font-size:calc(var(--px)*5);line-height:1.2;margin:0 0 calc(var(--px)*3);color:var(--accent);text-shadow:calc(var(--px)) calc(var(--px)) #000;text-align:center}.sub{color:var(--mut);font-size:calc(var(--px)*2.5)}.controls{display:flex;flex-direction:column;gap:calc(var(--px)*3)}.row{display:flex;gap:calc(var(--px)*3);flex-wrap:wrap;align-items:center}.seg{display:inline-flex;width:100%}.seg label{padding:calc(var(--px)*2) calc(var(--px)*3);background:#000;color:var(--mut);cursor:pointer;flex:1;text-align:center;box-shadow:0 0 0 var(--px) #fff,calc(var(--px)) calc(var(--px)) 0 0 #fff,calc(var(--px)*-1) calc(var(--px)*-1) 0 0 #fff;font-size:25px;margin-top:10px;margin-bottom:10px}.seg input:checked+label{background:#b5001e;color:#000}.seg input[type=radio]{display:none!important}.pill{display:inline-flex;align-items:center;gap:10px;padding:6px 10px;background:#000;color:#fff;border:0 solid #3b3b3b;border-radius:0;box-shadow:0 0 0 var(--px) #fff,calc(var(--px)) calc(var(--px)) 0 0 #fff,calc(var(--px)*-1) calc(var(--px)*-1) 0 0 #fff}.row{justify-content:center}.pill{width:100%;max-width:560px}#minVel{flex:1 1 240px;width:auto;min-width:300px}#minVelVal{display:inline-block;width:5ch;text-align:center;font-size:16px}.small{font-size:10px;color:var(--sub);margin-bottom:8px;text-transform:uppercase}.timebig{font:700 24px/1 "Press Start 2P",system-ui,sans-serif}.grid{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:0;border:4px solid #3b3b3b;border-radius:0;overflow:hidden}.card{background:#000;border-right:4px solid #3b3b3b;border-bottom:4px solid #3b3b3b;padding:12px;text-align:center}.card:nth-child(-n+5){background:#000}.card:nth-child(5n){border-right:none}.big{font:700 24px/1 "Press Start 2P",system-ui,sans-serif;text-align:right}.mono{font-family:"Press Start 2P",system-ui,sans-serif}.centercard{background:#fff;border:4px solid #3b3b3b;border-radius:0;margin:12px 0;content:none!important;box-shadow:none!important;border:0!important}#midiStatus.big{font-size:24px}.pianoWrap{margin-top:5px;margin-bottom:20px}#piano{width:100%;height:200px;display:block;image-rendering:pixelated;shape-rendering:crispEdges}#overlay{position:fixed;inset:0;z-index:9999;display:grid;place-items:center;background:rgba(0,0,0,.35);color:var(--accent2);font-family:"Press Start 2P",system-ui,sans-serif!important;font-size:clamp(48px, 10vw, 120px);opacity:0;pointer-events:none;transition:opacity .1s}#overlay.show{opacity:1}#overlay{color:#b5001e!important;text-shadow:0 0 8px rgba(181,0,30,.22)!important;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;filter:none!important;transform:none!important;letter-spacing:0!important}#overlay *,.big,.timebig{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;text-shadow:none!important;filter:none!important;transform:none!important;letter-spacing:0!important}#overlay{font-size:96px!important}@media (max-width:1200px){#overlay{font-size:80px!important}}@media (max-width:900px){#overlay{font-size:64px!important}}@media (max-width:600px){#overlay{font-size:48px!important}}body,html{image-rendering:pixelated}body{font-family:"Press Start 2P",system-ui,sans-serif;letter-spacing:.5px}#piano{image-rendering:pixelated}.big,.timebig{font-variant-numeric:tabular-nums}#finger1,#finger2{transform-box:fill-box;transform-origin:50% 0%}.tap{animation:fingerTap .12s ease-out}@keyframes fingerTap{0%{scale:1}50%{scale:0.96}100%{scale:1}}.vstack{display:flex;flex-direction:column;gap:calc(var(--px)*3)}.row.spread{display:flex;align-items:center;justify-content:space-between;gap:calc(var(--px)*3)}.grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:0;border:4px solid #3b3b3b;border-radius:0;overflow:hidden}.card:nth-child(-n+4){background:#000}.card:nth-child(4n){border-right:none}.badge{display:inline-block;padding:4px 8px;background:#90ee90;color:#000;border:4px solid #3b3b3b}.badge.ok{background:#113a1a;color:#b8ffca;border-color:#255c31}.badge.bad{background:#3a1111;color:#ffb8b8;border-color:#5c2525}.badge.idle{background:#222;color:#aaa;border-color:#333}.topbar{display:flex;align-items:center;justify-content:center;gap:8px;line-height:1}#sbotton{width:560px;height:100px;display:block;margin:0 auto}.pill.status{display:flex;align-items:baseline;justify-content:center;gap:8px;flex-wrap:nowrap;font-size:16px;line-height:1;color:#fff;--sub:currentColor}.pill.status .badge,.pill.status .big,.pill.status .small{font-size:inherit;line-height:inherit;margin:0;font-family:"Press Start 2P",system-ui,sans-serif}.pill.status .badge,.pill.status .small{flex:0 0 auto}.pill,.pill.status{max-width:800px;width:100%}#midiStatus{display:flex;align-items:baseline;gap:6px;flex:1 1 auto;min-width:0}#midiStatus .prefix{flex:0 0 auto;font-size:1em;line-height:1;letter-spacing:.5px}#midiStatus .dev{flex:1 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.card .big{font-size:24px;line-height:1;-webkit-font-smoothing:none;-moz-osx-font-smoothing:auto;text-rendering:optimizeSpeed}#midiStatus.big{font-size:inherit}body.muted{filter:saturate(.85) brightness(.5)}#finger1.tap,#finger2.tap{animation:none!important}#finger1,#finger2{transform-box:fill-box;transform-origin:50% 0%;pointer-events:none}.fingerDown{animation:fingerDown .12s ease-out forwards!important}.fingerUp{animation:fingerUp .12s ease-in forwards!important}@keyframes fingerDown{from{transform:translateY(0)}to{transform:translateY(4px)}}@keyframes fingerUp{from{transform:translateY(4px)}to{transform:translateY(0)}}#finger1,#finger2{pointer-events:none}#midiStatus{-webkit-font-smoothing:none;-moz-osx-font-smoothing:auto;text-rendering:optimizeSpeed}:root{--modalPadTop:calc(max(6vh, 48px) + env(safe-area-inset-top, 0px));--modalPadBot:calc(4vh + env(safe-area-inset-bottom, 0px))}.modal[hidden]{display:none}.modal{position:fixed;inset:0;z-index:10000;display:grid;align-items:start;justify-items:center;padding-top:var(--modalPadTop);padding-bottom:var(--modalPadBot);background:rgba(0,0,0,.6)}.modal__panel{width:min(720px,calc(100vw - 32px));max-height:calc(100vh - var(--modalPadTop) - var(--modalPadBot));overflow:auto;background:#000;color:#fff;padding:12px;outline:0;box-shadow:0 0 0 1px #fff,2px 2px 0 0 #fff,-2px -2px 0 0 #fff,0 0 0 6px #000}.modal__header{position:sticky;top:0;z-index:1;background:#000;display:flex;align-items:center;justify-content:space-between;gap:8px;border-bottom:4px solid #b5001e;padding-bottom:8px;margin-bottom:8px}@media (prefers-reduced-motion:reduce){.modal{padding-top:max(4vh,32px)}.modal__panel{max-height:calc(100vh - max(4vh,32px) - var(--modalPadBot))}}.footer-8bit{width:100%;display:flex;justify-content:center;align-items:center;gap:12px;margin:12px auto 0;text-align:center}.footer-8bit .footer-sep{opacity:.6}#btnManual{font-family:"Press Start 2P",system-ui,sans-serif!important;font-weight:700;font-size:14px;line-height:1;letter-spacing:.5px}.footer-8bit .copyright{font-family:"Press Start 2P",system-ui,sans-serif;font-size:12px;color:var(--mut)}#btnManual.btn-8bit{background:#1a8fff;color:#001024;border-color:#2b4e7f}#btnManual.btn-8bit:hover{filter:brightness(1.1)}#btnManual.btn-8bit:focus-visible{outline:2px solid #fff;outline-offset:3px}.modal__close{background:#b5001e;color:#000;border-color:#3b3b3b}.footer--stack{display:flex;flex-direction:column;align-items:center;gap:6px}.modal__body kbd,kbd{display:inline-block;font:700 12px/1 "Press Start 2P",system-ui,sans-serif;padding:3px 6px;margin:0 2px 0 0;background:#111;color:#fff;border:4px solid #3b3b3b;box-shadow:0 0 0 1px #fff,2px 2px 0 0 #fff,-2px -2px 0 0 #fff;vertical-align:middle;white-space:nowrap}.modal__body{line-height:1.6;font-size:14px}.modal__body p{margin:0 0 12px}.modal__body ol,.modal__body ul{margin:0 0 12px 1.2em}.modal__body li{margin:4px 0}.modal__body kbd,kbd{line-height:1;vertical-align:middle;margin:0 4px}.footer-8bit{line-height:1.3;gap:12px}#btnManual{line-height:1.2;padding-top:6px;padding-bottom:6px}.footer-8bit .copyright{line-height:1.2}body,html{height:100%;overflow:hidden}#wrap{overflow:hidden}@font-face{font-family:'Press Start 2P';src:url('assets/fonts/PressStart2P.woff2') format('woff2');font-style:normal;font-weight:400;font-display:swap}body{font-synthesis:none}.pixel-inset{position:relative}#pv18-info{position:absolute;top:150px;left:70px;width:300px;max-width:32%;font-family:"Press Start 2P",system-ui,sans-serif;font-size:10px;line-height:1.4;color:#f5f5f5;text-shadow:0 0 4px #000;pointer-events:none}#pv18-info h2{font-size:12px;margin:0 0 8px;text-transform:uppercase;letter-spacing:.05em;color:#f03}#pv18-info p{margin:0 0 8px}@media (max-width:900px){#pv18-info{display:none}}.pixel-inset{position:relative}#why-pv18-works{position:absolute;top:150px;right:70px;width:300px;max-width:36%;font-family:"Press Start 2P",system-ui,sans-serif;font-size:10px;line-height:1.5;color:#f5f5f5;text-shadow:0 0 4px #000}#why-pv18-works h2{font-size:12px;margin:0 0 8px;text-transform:uppercase;letter-spacing:.05em;color:#f03}#why-pv18-works p{margin:0 0 8px}@media (max-width:900px){#why-pv18-works{display:none}}</style></head><body><div id="pv18-info"><h2>Piano Skill Acceleration</h2><p>Piano Virtuoso 18 is a 10-second sprint-based training tool that improves piano speed, accuracy, and rhythm response.</p><p>Short, high-intensity bursts reveal your true finger limits and help you build fast, controlled technique instead of sloppy speed.</p><p>If someone asks “How can I get faster at piano?”, PV18 turns that question into a measurable game: higher score means stronger, more stable fingers.</p><p>Traditional metronome practice improves control, but it rarely shows your true physical limit. PV18 exposes that limit in 10 seconds and lets you push it safely, so your normal scales and repertoire practice start from a higher baseline of speed and stability.</p></div><section id="why-pv18-works"><h2>Why Piano Virtuoso 18 Works</h2><p>Most piano practice is slow and controlled. That is essential for learning pieces, but it does <strong>not</strong> reveal your physical limit or how fast your fingers can actually move.</p><p>Piano Virtuoso 18 adds short, 10-second sprint training on top of your normal routine. In each run you push your fingers to high speed while the game measures <strong>speed</strong>, <strong>accuracy</strong>, and <strong>rhythm stability</strong> instead of leaving everything to guesswork.</p><p>Over time this raises your speed ceiling and makes that speed more stable. Scales and repertoire start to feel easier because your hands are already trained to move faster than the music actually requires.</p><p>PV18 is not about random key mashing. It is controlled speed training for repeated notes, trills and fast finger motion, with your progress visible as a score instead of just a vague feeling.</p></section><div id="wrap"><div id="zoom"><div class="pixel-frame"><div class="pixel-inset"><h1 class="h1"><svg id="pv18logo" viewBox="0 0 211.67 26.46" xmlns="http://www.w3.org/2000/svg"><g id="bg" transform="translate(74.122 -23.225) scale(.31127)" aria-hidden="true" pointer-events="none"><path d="M287.15-1430.72h3.68v3.68h-3.68zm7.36 36.83h7.37v-11.05h-7.37v-3.68h7.37v-3.69h-7.37v-3.68h7.37v-7.36h-11.05v-3.69h3.68v-3.68h11.05v3.68h3.68v3.68h3.68v3.69h-3.68v29.46h3.68v-29.46h3.69v25.78h3.68v-29.46h-7.36v-3.69h14.73v33.14h-3.69v3.69h-7.36v3.68h-7.37v7.37h-3.68v3.68h-3.68v-14.73h-7.37zm33.15-36.83h3.68v3.68h-3.69zm-36.83 40.5h3.68v3.69h-3.68zm47.87-40.5h7.37v7.37h-7.37zm-3.68 36.83h3.68v-14.73h-3.68v-3.69h3.68v-3.68h7.37v3.68h3.68v3.68h-3.68v14.74h3.68v3.68h-3.68v3.68h-7.37v-3.68h-3.68zm18.41 0h3.68v-14.73h3.69v-3.69h3.68v18.41h7.37v-18.4h-7.37v-3.69h11.05v3.68h7.36v3.68h-3.68v14.74h3.68v3.68h-3.68v3.68h-7.36v-3.68h-3.69v3.68h-7.36v-3.68h-7.37zm36.83 0h3.68v-14.73h-7.36v-3.69h3.68v-3.68h7.36v3.68H405v-3.68h7.36v3.68h7.37v3.68h-3.68v14.74h3.68v3.68h-3.68v3.68h-3.69v-3.68h-3.68v-18.41h-7.36v14.72H405v3.69h-3.68v3.68h-7.37v-3.68h-3.68zm33.14 0h3.68v-14.73h3.69v-3.69h3.68v18.41h7.36v-14.72h-3.68v-3.69h-3.68v-3.68h11.05v3.68h7.36v3.68h-3.68v14.74h-3.68v3.68h-7.37v3.68h-7.36v-3.68h-7.37zm51.56-36.83h3.68v3.68h-3.68zm29.46 3.68h3.68v-3.68h7.36v3.68h7.37v3.68h-3.68v25.78h-3.69v3.68h-3.68v-29.45h-7.36Zm18.41-3.68h3.68v3.68h-3.68zm-36.83 22.1h7.37v-3.69H486v-3.68h7.37v-7.36h-14.73v-3.69H486v-3.68h11.05v3.68h3.68v3.68h3.69v3.69h-3.69v22.1h-7.36v-7.37H486zm-3.68 14.72h22.1v-25.77h3.68v25.78h3.68v3.68h-3.68v3.68h-11.05v-3.68h-14.73zm-3.68 3.69h3.68v3.68h-3.68zm51.55-40.51h7.37v7.37h-7.36zm-3.68 36.83h3.68v-14.73h-3.68v-3.69h3.68v-3.68h7.37v3.68h3.68v3.68h-3.68v14.74h3.68v3.68h-3.68v3.68h-7.36v-3.68h-3.69zm22.1 0h3.68v-14.73h-7.36v-3.69h3.68v-3.68h7.36v3.68h3.68v18.41h3.69v3.69h-3.69v3.68h-7.36v-3.68h-3.68zm14.73-18.42h-3.69v-3.68h11.05v7.37h-7.36zm11.04 18.41h3.69v-18.4h-3.69v-3.69h3.69v-7.36h3.68v-3.69h3.68v11.05h7.37v3.68h-7.37v18.41h7.37v3.69h-3.68v3.68h-7.37v-3.68h-7.36zm25.78 0h3.69v-14.72h-7.37v-3.69h3.68v-3.68h7.37v3.68h3.68v18.41h7.37v-14.72h-3.69v-3.69h3.69v-3.68h7.36v3.68h3.68v3.68h-3.68v14.74h7.37v3.68h-3.69v3.68h-7.36v-3.68h-7.37v3.68h-7.36v-3.68h-7.37zm36.83 0h3.68v-14.72h3.68v-3.69h3.69v18.41h7.36v-14.72h-3.68v-3.69h-3.68v-3.68h11.04v3.68h7.37v3.68h-3.68v14.74h-3.69v3.68h-7.36v3.68h-7.37v-3.68H637zm55.24-25.77h3.68v7.36h-3.68zm0 11.05h3.68v3.68h-3.68zm-18.42 14.72h3.69v-3.68h-3.69v-11.05h3.69v-3.68h3.68v-3.68h7.36v3.68h3.69v3.68h-11.05v7.37h3.68v3.68h-3.68v3.68h7.37v-7.36h-3.69v-3.68h7.37v3.68h3.68v7.37h-3.68v3.68h-3.69v3.68h-7.36v-3.68h-7.36zm-3.68 3.69h3.68v3.68h-3.68zm29.46-3.68h3.68v-14.73h3.69v-3.69h3.68v18.41H718v-14.72h-3.68v-3.69h-3.68v-3.68h11.05v3.68h7.36v3.68h-3.68v14.74h-3.68v3.68h-7.37v3.68h-7.36v-3.68h-7.37zm51.56-18.42h3.68v-3.68h7.37v25.78h-3.69v3.68h-3.68v-22.1h-3.68zm22.1-3.68h3.68v3.68h3.68v-7.36h-7.37zm7.36 14.73h-3.68v-3.68h-3.69v11.05h7.37zm-14.73-3.68h3.68v-7.37h-3.68v-7.36h3.68v-3.68h3.68v-3.69h7.37v3.68h3.68v3.69h3.68v7.36h-3.68v7.37h3.68v11.05h-3.68v3.68h-3.68v3.68h-7.37v-3.68h-3.68v-3.68h-3.68z" fill="maroon" transform="matrix(1.35775 0 0 1.35776 -627.998 2027.187)"/><path d="M287.15-1430.72h3.68v3.68h-3.68zm7.36 36.83h7.37v-11.05h-7.37v-3.68h7.37v-3.69h-7.37v-3.68h7.37v-7.36h-11.05v-3.69h3.68v-3.68h11.05v3.68h3.68v3.68h3.68v3.69h-3.68v29.46h3.68v-29.46h3.69v25.78h3.68v-29.46h-7.36v-3.69h14.73v33.14h-3.69v3.69h-7.36v3.68h-7.37v7.37h-3.68v3.68h-3.68v-14.73h-7.37zm33.15-36.83h3.68v3.68h-3.69zm-36.83 40.5h3.68v3.69h-3.68zm47.87-40.5h7.37v7.37h-7.37zm-3.68 36.83h3.68v-14.73h-3.68v-3.69h3.68v-3.68h7.37v3.68h3.68v3.68h-3.68v14.74h3.68v3.68h-3.68v3.68h-7.37v-3.68h-3.68zm18.41 0h3.68v-14.73h3.69v-3.69h3.68v18.41h7.37v-18.4h-7.37v-3.69h11.05v3.68h7.36v3.68h-3.68v14.74h3.68v3.68h-3.68v3.68h-7.36v-3.68h-3.69v3.68h-7.36v-3.68h-7.37zm36.83 0h3.68v-14.73h-7.36v-3.69h3.68v-3.68h7.36v3.68H405v-3.68h7.36v3.68h7.37v3.68h-3.68v14.74h3.68v3.68h-3.68v3.68h-3.69v-3.68h-3.68v-18.41h-7.36v14.72H405v3.69h-3.68v3.68h-7.37v-3.68h-3.68zm33.14 0h3.68v-14.73h3.69v-3.69h3.68v18.41h7.36v-14.72h-3.68v-3.69h-3.68v-3.68h11.05v3.68h7.36v3.68h-3.68v14.74h-3.68v3.68h-7.37v3.68h-7.36v-3.68h-7.37zm51.56-36.83h3.68v3.68h-3.68zm29.46 3.68h3.68v-3.68h7.36v3.68h7.37v3.68h-3.68v25.78h-3.69v3.68h-3.68v-29.45h-7.36Zm18.41-3.68h3.68v3.68h-3.68zm-36.83 22.1h7.37v-3.69H486v-3.68h7.37v-7.36h-14.73v-3.69H486v-3.68h11.05v3.68h3.68v3.68h3.69v3.69h-3.69v22.1h-7.36v-7.37H486zm-3.68 14.72h22.1v-25.77h3.68v25.78h3.68v3.68h-3.68v3.68h-11.05v-3.68h-14.73zm-3.68 3.69h3.68v3.68h-3.68zm51.55-40.51h7.37v7.37h-7.36zm-3.68 36.83h3.68v-14.73h-3.68v-3.69h3.68v-3.68h7.37v3.68h3.68v3.68h-3.68v14.74h3.68v3.68h-3.68v3.68h-7.36v-3.68h-3.69zm22.1 0h3.68v-14.73h-7.36v-3.69h3.68v-3.68h7.36v3.68h3.68v18.41h3.69v3.69h-3.69v3.68h-7.36v-3.68h-3.68zm14.73-18.42h-3.69v-3.68h11.05v7.37h-7.36zm11.04 18.41h3.69v-18.4h-3.69v-3.69h3.69v-7.36h3.68v-3.69h3.68v11.05h7.37v3.68h-7.37v18.41h7.37v3.69h-3.68v3.68h-7.37v-3.68h-7.36zm25.78 0h3.69v-14.72h-7.37v-3.69h3.68v-3.68h7.37v3.68h3.68v18.41h7.37v-14.72h-3.69v-3.69h3.69v-3.68h7.36v3.68h3.68v3.68h-3.68v14.74h7.37v3.68h-3.69v3.68h-7.36v-3.68h-7.37v3.68h-7.36v-3.68h-7.37zm36.83 0h3.68v-14.72h3.68v-3.69h3.69v18.41h7.36v-14.72h-3.68v-3.69h-3.68v-3.68h11.04v3.68h7.37v3.68h-3.68v14.74h-3.69v3.68h-7.36v3.68h-7.37v-3.68H637zm55.24-25.77h3.68v7.36h-3.68zm0 11.05h3.68v3.68h-3.68zm-18.42 14.72h3.69v-3.68h-3.69v-11.05h3.69v-3.68h3.68v-3.68h7.36v3.68h3.69v3.68h-11.05v7.37h3.68v3.68h-3.68v3.68h7.37v-7.36h-3.69v-3.68h7.37v3.68h3.68v7.37h-3.68v3.68h-3.69v3.68h-7.36v-3.68h-7.36zm-3.68 3.69h3.68v3.68h-3.68zm29.46-3.68h3.68v-14.73h3.69v-3.69h3.68v18.41H718v-14.72h-3.68v-3.69h-3.68v-3.68h11.05v3.68h7.36v3.68h-3.68v14.74h-3.68v3.68h-7.37v3.68h-7.36v-3.68h-7.37zm51.56-18.42h3.68v-3.68h7.37v25.78h-3.69v3.68h-3.68v-22.1h-3.68zm22.1-3.68h3.68v3.68h3.68v-7.36h-7.37zm7.36 14.73h-3.68v-3.68h-3.69v11.05h7.37zm-14.73-3.68h3.68v-7.37h-3.68v-7.36h3.68v-3.68h3.68v-3.69h7.37v3.68h3.68v3.69h3.68v7.36h-3.68v7.37h3.68v11.05h-3.68v3.68h-3.68v3.68h-7.37v-3.68h-3.68v-3.68h-3.68z" fill="red" transform="translate(-628.002 2022.187) scale(1.35776)"/><path d="M287.15-1430.72h3.68v3.68h-3.68zm7.36 36.83h7.37v-11.05h-7.37v-3.68h7.37v-3.69h-7.37v-3.68h7.37v-7.36h-11.05v-3.69h3.68v-3.68h11.05v3.68h3.68v3.68h3.68v3.69h-3.68v29.46h3.68v-29.46h3.69v25.78h3.68v-29.46h-7.36v-3.69h14.73v33.14h-3.69v3.69h-7.36v3.68h-7.37v7.37h-3.68v3.68h-3.68v-14.73h-7.37zm33.15-36.83h3.68v3.68h-3.69zm-36.83 40.5h3.68v3.69h-3.68zm47.87-40.5h7.37v7.37h-7.37zm-3.68 36.83h3.68v-14.73h-3.68v-3.69h3.68v-3.68h7.37v3.68h3.68v3.68h-3.68v14.74h3.68v3.68h-3.68v3.68h-7.37v-3.68h-3.68zm18.41 0h3.68v-14.73h3.69v-3.69h3.68v18.41h7.37v-18.4h-7.37v-3.69h11.05v3.68h7.36v3.68h-3.68v14.74h3.68v3.68h-3.68v3.68h-7.36v-3.68h-3.69v3.68h-7.36v-3.68h-7.37zm36.83 0h3.68v-14.73h-7.36v-3.69h3.68v-3.68h7.36v3.68H405v-3.68h7.36v3.68h7.37v3.68h-3.68v14.74h3.68v3.68h-3.68v3.68h-3.69v-3.68h-3.68v-18.41h-7.36v14.72H405v3.69h-3.68v3.68h-7.37v-3.68h-3.68zm33.14 0h3.68v-14.73h3.69v-3.69h3.68v18.41h7.36v-14.72h-3.68v-3.69h-3.68v-3.68h11.05v3.68h7.36v3.68h-3.68v14.74h-3.68v3.68h-7.37v3.68h-7.36v-3.68h-7.37zm51.56-36.83h3.68v3.68h-3.68zm29.46 3.68h3.68v-3.68h7.36v3.68h7.37v3.68h-3.68v25.78h-3.69v3.68h-3.68v-29.45h-7.36Zm18.41-3.68h3.68v3.68h-3.68zm-36.83 22.1h7.37v-3.69H486v-3.68h7.37v-7.36h-14.73v-3.69H486v-3.68h11.05v3.68h3.68v3.68h3.69v3.69h-3.69v22.1h-7.36v-7.37H486zm-3.68 14.72h22.1v-25.77h3.68v25.78h3.68v3.68h-3.68v3.68h-11.05v-3.68h-14.73zm-3.68 3.69h3.68v3.68h-3.68zm51.55-40.51h7.37v7.37h-7.36zm-3.68 36.83h3.68v-14.73h-3.68v-3.69h3.68v-3.68h7.37v3.68h3.68v3.68h-3.68v14.74h3.68v3.68h-3.68v3.68h-7.36v-3.68h-3.69zm22.1 0h3.68v-14.73h-7.36v-3.69h3.68v-3.68h7.36v3.68h3.68v18.41h3.69v3.69h-3.69v3.68h-7.36v-3.68h-3.68zm14.73-18.42h-3.69v-3.68h11.05v7.37h-7.36zm11.04 18.41h3.69v-18.4h-3.69v-3.69h3.69v-7.36h3.68v-3.69h3.68v11.05h7.37v3.68h-7.37v18.41h7.37v3.69h-3.68v3.68h-7.37v-3.68h-7.36zm25.78 0h3.69v-14.72h-7.37v-3.69h3.68v-3.68h7.37v3.68h3.68v18.41h7.37v-14.72h-3.69v-3.69h3.69v-3.68h7.36v3.68h3.68v3.68h-3.68v14.74h7.37v3.68h-3.69v3.68h-7.36v-3.68h-7.37v3.68h-7.36v-3.68h-7.37zm36.83 0h3.68v-14.72h3.68v-3.69h3.69v18.41h7.36v-14.72h-3.68v-3.69h-3.68v-3.68h11.04v3.68h7.37v3.68h-3.68v14.74h-3.69v3.68h-7.36v3.68h-7.37v-3.68H637zm55.24-25.77h3.68v7.36h-3.68zm0 11.05h3.68v3.68h-3.68zm-18.42 14.72h3.69v-3.68h-3.69v-11.05h3.69v-3.68h3.68v-3.68h7.36v3.68h3.69v3.68h-11.05v7.37h3.68v3.68h-3.68v3.68h7.37v-7.36h-3.69v-3.68h7.37v3.68h3.68v7.37h-3.68v3.68h-3.69v3.68h-7.36v-3.68h-7.36zm-3.68 3.69h3.68v3.68h-3.68zm29.46-3.68h3.68v-14.73h3.69v-3.69h3.68v18.41H718v-14.72h-3.68v-3.69h-3.68v-3.68h11.05v3.68h7.36v3.68h-3.68v14.74h-3.68v3.68h-7.37v3.68h-7.36v-3.68h-7.37zm51.56-18.42h3.68v-3.68h7.37v25.78h-3.69v3.68h-3.68v-22.1h-3.68zm22.1-3.68h3.68v3.68h3.68v-7.36h-7.37zm7.36 14.73h-3.68v-3.68h-3.69v11.05h7.37zm-14.73-3.68h3.68v-7.37h-3.68v-7.36h3.68v-3.68h3.68v-3.69h7.37v3.68h3.68v3.69h3.68v7.36h-3.68v7.37h3.68v11.05h-3.68v3.68h-3.68v3.68h-7.37v-3.68h-3.68v-3.68h-3.68z" fill="#fc0" transform="matrix(1.35775 0 0 1.35776 -627.998 2017.187)"/></g></svg></h1><div class="controls"><div class="row"><div class="seg"><input id="modeE" type="radio" value="E" name="mode" checked="checked"> <label for="modeE">Erlkönig(C)</label> <input id="modeED" type="radio" value="D" name="mode"> <label for="modeED">Diavolo(C-D)</label></div><div class="row"><div class="pill"><span>Min Velocity</span> <input id="minVel" type="range" value="25" max="127" min="1"> <span id="minVelVal">25</span></div></div><div class="row"><div class="pill status"><span class="big mono" id="midiStatus">MIDI NOT CONNECTED</span> <span class="badge" id="badge">QUALIFIED</span></div></div><svg id="sbotton" viewBox="0 0 550.12 57.97" xmlns="http://www.w3.org/2000/svg" height="57.97" width="550.12"><g id="start" transform="matrix(.8 0 0 .8 -209.825 72.287)" aria-hidden="true" pointer-events="none"><path d="M318.97-23.07h-10.35v-5.18h-5.18V-38.6h-5.17v-31.05h5.17v-10.36h5.18v-5.17h10.35v-5.18H567.4v5.18h10.35v5.17h5.18v10.36h5.18v31.05h-5.18v10.35h-5.18v5.18H567.4v5.17H318.97Z" fill="#333" id="path5845"/><path d="M562.28-85.18H319V-80h-10.38v10.35h-5.18v31.06h5.13l.05 10.35h10.35v5.18H567.4v-5.18h10.35l.05-10.35h5.13v-31.06h-5.13L577.76-80h-10.35v-5.17z" fill="#00aad4" id="path5846-1-4-78-7"/><path d="M324.24-80v5.17h-10.38v5.17h-5.18v31.06h5.13l.03 5.18h10.35v5.17h238.16v-5.17h10.35l.04-5.18h5.13v-31.06h-5.13l-.02-5.17h-10.35v-5.18z" fill="#2ad4ff" id="path5846-1-4-78-7-2"/><path d="m329.37-74.82-5.17-.01-.02 5.16q-5.18.02-10.37.01l-.04 31.06h10.37v5.18H562.3l.05-5.18h10.35v-31.06h-10.33l-.02-5.17z" fill="#aef" id="path5846-1-4-78-7-2-1"/><path d="M567.57-38.6v-10.26h5.17v10.26ZM552.1-74.83h10.27v5.17H552.1zm-5.15 41.4v-5.17h15.4v5.18M324.19-69.66v10.26h-5.18v-10.26zm30.8 0h-10.27v-5.18h10.26zm-15.4-5.18v5.18h-15.4v-5.18" fill="#fff" id="path5846-1-4-5-0-2"/><path d="m 313.44,-294.39 v -2.67 h -2.67 v -2.66 h 5.34 v 2.66 h 8 v -5.33 h -10.67 v -2.67 h -2.67 v -5.33 h 2.67 v -2.67 h 13.33 v 2.67 h 2.67 v 2.67 h -5.33 v -2.67 h -8 v 5.33 h 10.66 v 2.67 h 2.67 v 5.33 h -2.67 v 2.67 z m 26.67,0 v -16 h -5.34 v -2.67 h 16 v 2.67 h -5.33 v 16 z m 13.33,0 v -13.33 h 2.67 v -2.67 h 2.66 v -2.67 h 8 v 2.67 h 2.67 v 2.67 h 2.67 v 13.33 h -5.34 v -5.33 h -8 v 5.33 z m 5.33,-8 h 8 v -5.33 h -2.66 v -2.67 h -2.67 v 2.67 h -2.67 z m 16,8 v -18.67 h 16 v 2.67 h 2.67 v 8 h -5.33 v 2.67 h 2.66 v 2.66 h 2.67 v 2.67 h -8 v -2.67 h -2.67 v -2.66 h -2.66 v 5.33 z m 5.34,-8 h 5.33 v -2.67 h 2.67 v -5.33 h -8 z m 24,8 v -16 h -5.34 v -2.67 h 16 v 2.67 h -5.33 v 16 z" fill="#000000" id="text5846" transform="matrix(1.92455,0,0,1.92455,-253.381,532.742)" style="display:inline"/><path d="M313.44-294.39v-2.67h-2.67v-2.66h5.34v2.66h8v-5.33h-10.67v-2.67h-2.67v-5.33h2.67v-2.67h13.33v2.67h2.67v2.67h-5.33v-2.67h-8v5.33h10.66v2.67h2.67v5.33h-2.67v2.67zm26.67 0v-16h-5.34v-2.67h16v2.67h-5.33v16zm13.33 0v-13.33h2.67v-2.67h2.66v-2.67h8v2.67h2.67v2.67h2.67v13.33h-5.34v-5.33h-8v5.33zm5.33-8h8v-5.33h-2.66v-2.67h-2.67v2.67h-2.67zm16 8v-18.67h16v2.67h2.67v8h-5.33v2.67h2.66v2.66h2.67v2.67h-8v-2.67h-2.67v-2.66h-2.66v5.33zm5.34-8h5.33v-2.67h2.67v-5.33h-8zm24 8v-16h-5.34v-2.67h16v2.67h-5.33v16z" fill="#0030ff" id="text5846-4" transform="translate(-253.381 527.61)scale(1.92455)"/></g><g id="stop" transform="matrix(.8 0 0 .8 50.842 72.287)" aria-hidden="true" pointer-events="none"><path d="M318.97-23.07h-10.35v-5.18h-5.18V-38.6h-5.17v-31.05h5.17v-10.36h5.18v-5.17h10.35v-5.18H567.4v5.18h10.35v5.17h5.18v10.36h5.18v31.05h-5.18v10.35h-5.18v5.18H567.4v5.17H318.97Z" fill="#333" id="path5845-5"/><path d="M562.28-85.18H319V-80h-10.38v10.35h-5.18v31.06h5.13l.05 10.35h10.35v5.18H567.4v-5.18h10.35l.05-10.35h5.13v-31.06h-5.13L577.76-80h-10.35v-5.17z" fill="#a00" id="path5846-1-4-78-7-5"/><path d="M324.24-80v5.17h-10.38v5.17h-5.18v31.06h5.13l.03 5.18h10.35v5.17h238.16v-5.17h10.35l.04-5.18h5.13v-31.06h-5.13l-.02-5.17h-10.35v-5.18z" fill="red" id="path5846-1-4-78-7-2-17"/><path d="m329.37-74.82-5.17-.01-.02 5.16q-5.18.02-10.37.01l-.04 31.06h10.37v5.18H562.3l.05-5.18h10.35v-31.06h-10.33l-.02-5.17z" fill="#ff8080" id="path5846-1-4-78-7-2-1-1"/><path d="M567.57-38.6v-10.26h5.17v10.26ZM552.1-74.83h10.27v5.17H552.1zm-5.15 41.4v-5.17h15.4v5.18M324.19-69.66v10.26h-5.18v-10.26zm30.8 0h-10.27v-5.18h10.26zm-15.4-5.18v5.18h-15.4v-5.18" fill="#fff" id="path5846-1-4-5-0-2-4"/><path d="M535.83-374.65v-2.66h-2.67v-2.67h5.33v2.64h8v-5.31h-10.67v-2.66h-2.66v-5.34h2.66v-2.66h13.34v2.64h2.66v2.66h-5.33v-2.66l-8 .02v5.3h10.67v2.7h2.67v5.34h-2.67v2.66zm26.66 0v-16h-5.33v-2.66h16v2.66h-5.33v16zm16 0v-2.66h-2.66v-13.34h2.66v-2.66h13.34v2.66h2.66v13.34h-2.66v2.66zm2.67-2.7h8v-13.3h-8zm16 2.7v-18.66h16v2.66h2.67v8h-2.67v2.67h-10.67v5.33zm5.33-8h8v-8h-8z" id="text1" transform="matrix(1.92484 0 0 1.92246 -661 686.47)" aria-label="STOP"/><path d="M535.83-374.65v-2.66h-2.67v-2.67h5.33v2.67h8v-5.34h-10.67v-2.66h-2.66v-5.34h2.66v-2.66h13.34v2.66h2.66v2.67h-5.33v-2.67h-8v5.34h10.67v2.66h2.67v5.34h-2.67v2.66zm26.66 0v-16h-5.33v-2.66h16v2.66h-5.33v16zm16 0v-2.66h-2.66v-13.34h2.66v-2.66h13.34v2.66h2.66v13.34h-2.66v2.66zm2.67-2.66h8v-13.34h-8zm16 2.66v-18.66h16v2.66h2.67v8h-2.67v2.67h-10.67v5.33zm5.33-8h8v-8h-8z" fill="#a00" id="text1-1" transform="matrix(1.92484 0 0 1.92246 -661 681.294)" aria-label="STOP"/></g></svg></div></div><div class="card centercard"><div class="small">TIME LEFT (s)</div><div class="timebig" id="timeLeftCenter">10.00</div></div><div class="pianoWrap"><div id="svg1"> <?xml version="1.0" encoding="UTF-8"?> <svg id="piano" viewBox="0 0 169.33 55.43" xmlns="http://www.w3.org/2000/svg" height="209.5" width="640" version="1.1"><g id="bg" pointer-events="none" aria-hidden="true"><path d="m-0.00411 5.482h169.33l8e-3 49.948h-169.33z"/><path d="m2.4361 51.774h164.46v2.436h-164.46zm166.89-46.292 8e-3 49.948h-1.2181l-1.1e-4 -48.731s-111.35 8.794e-4 -166.9 0.00106l9.32e-5 48.73-1.2181-2.65e-4v-49.948zm-2.4281 43.858-4.873 2.65e-4 2e-4 -32.895-154.71 6.74e-4 -5.3e-4 32.894h-4.8726l-1.3e-4 -41.422 164.46 7.45e-5z" fill="#1a1a1a"/><path d="m2.4366 42.029h4.8727v2.4364h-4.8727zm159.59 0h4.8727v2.4364h-4.8727z" fill="#4d4d4d"/><path d="m2.4366 39.592h4.8727v2.4364h-4.8727zm159.59 0h4.8727v2.4364h-4.8727z" fill="#666"/><path d="m107.2 43.248 53.62-0.0026v2.4364l-53.621 0.0026zm-98.676-0.0011 75.529 0.0011v2.4364l-75.529-0.0011z" fill="#e6e6e6"/><path d="m8.5285 45.686 75.529 8.8e-4v4.8699l-75.529-8.8e-4zm98.675 8.8e-4 53.621-0.0021v4.8699l-53.621 0.0018z" fill="#f4eed7"/><path d="m8.5286 18.881h6.09l5e-6 17.056h6.09l0.0019-17.055h7.3096l5e-6 17.056h6.09l-5e-6 -17.056 13.402 5.5e-4 5e-6 17.056h6.09l-5e-6 -17.056h6.0917l5e-6 17.056h6.09l-5e-6 -17.056 6.0919-6e-4 5e-6 17.056h6.09l-5e-6 -17.056 6.0919-6e-4 -1.84e-4 24.366-75.529-0.0011zm98.675 0.0023 17.075-0.0014 1e-5 17.056h6.09l-1e-5 -17.056h6.0918v17.056h6.09v-17.056l6.092-6e-4v17.056h6.09l-1e-5 -17.056 6.092-5.91e-4 -1.8e-4 24.366-53.621 0.0026z" fill="#fff"/><path d="m169.33 5.4811h-2.436v1.218h1.218v1.218h1.218zm-169.34 9.151e-4h2.436v1.218h-1.218v1.218h-1.218zm2.4402 4.8729h164.46v2.4364h-164.46zm5.597e-4 34.11h4.8727v2.4364h-4.8727zm159.59 0h4.8727v2.4364h-4.8727zm-159.59-7.3094h4.8727v2.4364h-4.8727zm159.59 0h4.8727v2.4364h-4.8727z" fill="#333"/><path d="m8.5286 17.663 152.3-3.63e-4v1.2182l-152.3 3.63e-4z" fill="#800000"/><path d="m149.86 18.883h3.654v15.837h-3.654zm-12.182 0h3.654v15.837h-3.654zm-12.182 0h3.654v15.837h-3.654zm-52.403 0h3.654v15.837h-3.654zm-12.182 0.0012h3.654v15.837h-3.654zm-12.262-0.0036h3.654v15.837h-3.654zm-19.412 0.0031h3.654v15.837h-3.654zm-13.31-3e-3h3.654v15.837h-3.654z" fill="#333"/><path d="m149.86 18.883h1.2181v12.182h2.4299v1.2181h-3.648zm-12.182 0h1.2181v12.182h2.4299v1.2181h-3.648zm-12.182 0h1.2181v12.182h2.4299v1.2181h-3.648zm-52.403 0h1.2181l5e-6 12.182h2.4299v1.2181h-3.648zm-12.182 0.0012h1.2181l5e-6 12.182h2.4299v1.2181h-3.648zm-12.262-0.0036h1.2181l5e-6 12.182h2.4299v1.2181h-3.648zm-19.412 0.0031h1.2181l5e-6 12.182h2.4299v1.2181h-3.648zm-13.31-3e-3h1.2181l5e-6 12.182h2.4299v1.2181h-3.648z" fill="#4d4d4d"/><path d="m1.218 15.228h166.9v2.4364h-166.9zm115.75 3.6541h1.2181v31.674h-1.2181zm32.894 17.056h1.2181v14.618h-1.2181zm-10.964 0h1.2181v14.618h-1.2181zm-10.964 0h1.2181v14.618h-1.2181zm-54.839 0h1.2181v14.618h-1.2181zm-10.964 0h1.2181v14.618h-1.2181zm-10.964 0h1.2181v14.618h-1.2181zm-10.964-17.056h1.2181v31.674h-1.2181zm-10.964 17.055h1.2181v14.618h-1.2181zm-10.964 0h1.2181v14.618h-1.2181z"/><path d="m57.591 8.4237h-1.0107v-0.50537h4.5484v0.50537h0.50537v4.043h-0.50537v0.50537h-0.50537v-4.043h-1.0108v3.5376h-0.50535v-3.5376h-1.5162zm0 3.0322h-1.0107v-0.50537h1.0107v-0.50537h-1.0107v-0.50537h1.0107v-0.50537h1.0108v3.0322h-1.0108zm-0.50532 1.5161h3.5376v0.50537h-0.50539v0.50537h-2.0215v-0.50537h-1.0107zm-0.50539 0.50537h0.50539v0.50537h-0.50539zm5.5591-0.50537h0.5054v-4.043h-0.5054v-0.50537h0.5054v-0.50537h1.0108v0.50537h0.50537v0.50537h-0.50537v4.043h0.50537v0.50537h-0.50537v0.50537h-1.0108v-0.50537h-0.5054zm3.0323-2.0215h1.0107v-0.50537h-1.0107v-0.50537h1.0107v-1.0107h-1.0107v-0.50537h-0.50536v-0.50537h1.0107v0.50537h0.50537v-0.50537h0.50539v0.50537h1.0107v-0.50537h1.0108v0.50537h1.0107v-0.50537h1.0107v0.50537h1.0108v0.50537h-0.50539v4.043h0.50539v0.50537h-0.50539v0.50537h-0.50537v-0.50537h-0.50537v-4.5484h-1.0107v1.5161h0.50539v0.50537h-0.50539v2.0215h0.50539v0.50537h-0.50539v0.50537h-1.0108v-0.50537h-0.50537v-0.50537h0.50537v-2.0215h-0.50537v-0.50537h0.50537v-1.5161h-1.0107v3.0322h-0.50537v0.50537h-0.50539v-1.0107h-1.0107zm-0.50536 2.0215h1.0107v-0.50537h0.50537v0.50537h1.0108v0.50537h-0.50537v0.50537h-1.0108v-0.50537h-1.0107zm2.5268-0.50537h0.50537v0.50537h-0.50537zm5.0538-4.5484h0.50534v0.50537h-0.50534zm1.0107 5.0537h1.0107v-1.5161h-1.0107v-0.50537h1.0107v-0.50537h-1.0107v-0.50537h1.0107v-1.0107h-1.5161v-0.50537h0.50539v-0.50537h1.5161v0.50537h0.50539v0.50537h0.50537v0.50537h-0.50537v4.043h0.50537v-4.043h0.50536v3.5376h0.5054v-4.043h-1.0108v-0.50537h2.0215v4.5484h-0.50536v0.50537h-1.0108v0.50537h-1.0107v1.0107h-0.50539v0.50537h-0.50537v-2.0215h-1.0107zm4.5483-5.0537h0.50537v0.50537h-0.50537zm-5.0537 5.5591h0.50539v0.50537h-0.50539zm6.5698-0.50537h0.50541v-2.0215h-1.0108v-0.50537h0.50535v-0.50537h1.0108v0.50537h0.50537v2.5269h0.50537v0.50537h-0.50537v0.50537h-1.0107v-0.50537h-0.50541zm2.0215-2.5269h-0.50537v-0.50537h1.5161v1.0107h-1.0108zm1.0108 2.5269h0.50539v-2.0215h0.50535v-0.50537h0.50537v2.5269h1.0108v-2.0215h-0.5054v-0.50537h-0.50536v-0.50537h1.5161v0.50537h1.0107v0.50537h-0.50537v2.0215h-0.50536v0.50537h-1.0108v0.50537h-1.0107v-0.50537h-1.0107zm4.5484 0h0.50536v-2.5269h0.50537v-0.50537h0.50537v3.0322h1.0107v-2.5269h-0.50539v-0.50537h-0.50535v-0.50537h-0.50537v-0.50537h-0.50537v-1.0107h0.50537v0.50537h1.0107v0.50537h0.50539v0.50537h0.50539v0.50537h0.50537v3.0322h-0.50537v0.50537h-1.0108v0.50537h-1.0107v-0.50537h-1.0107zm4.5483 0h0.50539v-2.0215h-1.0108v-0.50537h0.50537v-0.50537h1.0108v0.50537h0.50535v2.5269h1.0108v-2.0215h-0.50537v-0.50537h0.50537v-0.50537h1.0107v0.50537h0.50539v0.50537h-0.50539v2.0215h1.0108v0.50537h-0.50537v0.50537h-1.0108v-0.50537h-1.0107v0.50537h-1.0107v-0.50537h-1.0108zm6.5699-3.0322h1.5161v1.0107h-1.0107v-0.50537h-0.50537zm-1.5161 3.0322h0.50539v-2.0215h0.50537v-0.50537h0.50537v2.5269h1.0108v0.50537h-1.0108v0.50537h-1.0107v-0.50537h-0.50539zm3.5376 0h0.50537v-2.5269h-0.50537v-0.50537h0.50537v-1.0107h0.50537v-0.50537h0.50536v1.5161h1.0108v0.50537h-1.0108v2.5269h1.0108v0.50537h-0.50537v0.50537h-1.0108v-0.50537h-1.0107zm3.5376-5.0537h1.0108v1.0107h-1.0108zm-0.50534 5.0537h0.50534v-2.0215h-0.50534v-0.50537h0.50534v-0.50537h1.0108v0.50537h0.5054v0.50537h-0.5054v2.0215h0.5054v0.50537h-0.5054v0.50537h-1.0108v-0.50537h-0.50534zm2.5268 0h0.50539v-2.0215h0.50537v-0.50537h0.50539v2.5269h1.0107v-2.0215h-0.50537v-0.50537h-0.50537v-0.50537h1.5161v0.50537h1.0107v0.50537h-0.50532v2.0215h-0.50541v0.50537h-1.0107v0.50537h-1.0108v-0.50537h-1.0108zm5.0538 0h0.50537v-2.0215h-1.0107v-0.50537h0.50536v-0.50537h1.0107v0.50537h1.0108v-0.50537h1.0108v0.50537h1.0107v0.50537h-0.50535v2.0215h0.50535v0.50537h-0.50535v0.50537h-0.50537v-0.50537h-0.50539v-2.5269h-1.0107v2.0215h0.50537v0.50537h-0.50537v0.50537h-1.0108v-0.50537h-0.50537zm7.5806-3.5376h0.50536v1.0107h-0.50536zm0 1.5161h0.50536v0.50537h-0.50536zm-2.5269 2.0215h0.50537v-0.50537h-0.50537v-1.5161h0.50537v-0.50537h0.50537v-0.50537h1.0108v0.50537h0.50537v0.50537h-1.5161v1.0107h0.50539v0.50537h-0.50539v0.50537h1.0108v-1.0107h-0.50537v-0.50537h1.0107v0.50537h0.50536v1.0107h-0.50536v0.50537h-0.50537v0.50537h-1.0108v-0.50537h-1.0107zm-0.50539 0.50537h0.50539v0.50537h-0.50539z" fill="#ccc"/></g><g id="C1up" transform="matrix(.64972 0 0 .42232 .81216 -8.3245)"><path d="m130 64.423h14.997v57.697h-14.997z" fill="#fff"/><path d="m130 122.12h14.997v5.7692h-14.997z" fill="#e6e6e6"/><path d="m130 127.89 14.997 1e-3 -9e-5 11.532h-14.997z" fill="#f4eed7"/></g><g id="D1up" transform="matrix(.64972 0 0 .42232 11.776 -8.5682)"><path d="m130 65h15v57.698h-15z" fill="#fff"/><path d="m130 122.7h15v5.7692h-15z" fill="#e6e6e6"/><path d="m130 128.47h15v11.532h-15z" fill="#f4eed7"/><path d="m122.5 102.5 9.3734 1e-3v2.8838l-9.3734-9.6e-4z"/><path d="m143.13 102.5h9.3725v2.8808h-9.3722z"/></g><g id="C1down" transform="matrix(.64972 0 0 .42232 .81307 -8.2495)" display="none"><path d="m130 64.244 14.999 0.0015 1e-3 66.347h-14.998z" fill="#fff"/><path d="m130 130.59h14.998l-3.1e-4 5.7692-14.997-2e-3z" fill="#e6e6e6"/><path d="m130 136.36 14.996 2e-3 9.7e-4 2.8825h-14.997z" fill="#e9ddaf"/><path d="m139.38 101.75h5.6244v5.7682h-5.6244z"/><path d="m141.25 101.74 3.7493 1e-3v2.8831l-3.7493-1e-3z" fill="#333"/></g><g id="D1down" transform="matrix(-.65075 0 0 .42232 190.6 -8.323)" display="none"><path d="m130.02 64.426 14.976-0.002893 1.1e-4 66.348h-14.976z" fill="#fff"/><path d="m130.02 130.77 14.976-0.00194v5.7692l-14.976 2e-3z" fill="#e6e6e6"/><path d="m130.02 136.54 14.976-2e-3v2.8801h-14.976z" fill="#e9ddaf"/><path d="m143.12 101.92 9.3587-1.9e-4v2.8866l-5.612-0.0165v2.8392h-3.7434z"/><path d="m128.15 101.92h3.7434v5.7737l-3.7434-2e-3z"/><path d="m128.15 96.153h1.8717l-6.2e-4 8.6537-1.8717 4e-3z" fill="#333"/><path d="m144.99 101.92 1.878-6e-3v2.8789l-1.878 6e-3z" fill="#333"/></g><g transform="matrix(.60911 0 0 .37263 15.262 -5.3387)"><path d="m124.94 65h9.9977l4e-3 42.5h-9.9982z"/><path d="m126.95 65.001h5.9989v42.5h-5.9989z" fill="#333"/><path d="m126.95 65.001h1.9998l1e-5 32.692h3.9892v3.269h-5.989z" fill="#4d4d4d"/></g><g transform="matrix(.60911 0 0 .37263 28.662 -5.3375)"><path d="m124.95 65 9.9973 2.3e-5v45.77l-5.9854 8e-3v-3.2765h-4.012z"/><path d="m126.95 65h5.9989v42.501h-5.9989z" fill="#333"/><path d="m126.95 65.001h1.9998l1e-5 32.692h3.9892v3.269h-5.989z" fill="#4d4d4d"/></g><g id="finger1" pointer-events="none" style="display:none"><path d="M 107.20383,10.964024 H 105.9856 V 9.7457963 h -3.65468 v 1.2182277 h -2.43645 v 1.218225 H 95.021572 V 10.964024 H 93.803344 V 9.7457963 H 92.585122 V 8.5275712 H 91.366899 V 7.309346 l -1.241508,-0.00482 0.02339,-1.2133961 1.218237,2.4e-6 V 2.4364527 h -1.218225 l -2.2e-5,-1.2182251 H 87.712204 V 2.4364503e-6 H 80.402851 V 1.2182276 h -2.436453 v 1.2182227 l -2.436436,2.4e-6 -1.9e-5,4.8729006 h -1.218206 l -1.9e-5,1.2182252 h -1.218225 l -0.0049,2.4510005 -1.213377,-0.01455 v 2.43645 h -1.218225 v 9.745799 h 1.21822 l 5e-6,1.218225 h 1.218225 v 1.218225 h 1.218225 v 1.218225 h 1.218216 l 9e-6,1.218225 3.654712,-2e-6 v -1.218225 h 1.218226 v 1.218225 l 1.218196,2e-6 v 1.218225 h 3.654702 v -1.218225 l 1.218169,-9e-6 5.6e-5,9.745811 h 1.218225 v 1.218225 h 1.218225 l -2.7e-5,1.218225 h 2.436451 v -1.21822 h 1.218225 v -1.218225 h 1.218225 l -3.2e-5,-7.309351 h -1.218222 v -6.091126 h -1.218223 l 2.7e-5,-4.872901 h 1.218225 v -1.218225 h 3.654675 v 1.218225 h 6.091097 v -1.218225 h 2.43645 v -1.218223 h 1.21822 l 3e-5,-1.218227 1.2182,2e-6 z" fill="#1a1a1a"/><path d="m 105.98559,10.964024 h -3.65467 v 1.218225 h -2.436452 v 1.218225 h -4.872896 v -1.218225 h -1.218225 l -3e-6,-1.218225 H 92.585117 V 9.7457988 H 91.366894 V 8.5275736 h -1.218223 l -9e-6,-1.2182251 h -1.218225 l 9e-6,-1.2182252 h 1.218225 l -2.2e-5,-2.4364503 h -1.218225 l -2.2e-5,-1.2182251 H 86.493957 V 1.2182227 l -6.091136,-2.4e-6 v 1.2182251 h -2.43645 v 1.2182227 l -1.218205,2.5e-6 -5e-6,3.6546754 -1.218206,-2.4e-6 -2e-5,1.2182251 H 74.31171 l -0.0049,2.4510013 -1.213376,-0.01455 v 2.43645 h -1.218225 v 7.309349 l -5e-6,1.218225 h 1e-5 v 1.218225 h 1.21823 v 1.218225 l 1.218215,3e-6 5e-6,1.218222 h 1.21823 v 1.218225 h 3.654651 v -1.218225 h 1.218225 v 1.218225 l 1.218196,3e-6 v 1.218225 h 3.654702 l 2.2e-5,-1.218225 h 1.218225 l -1.9e-5,1.218223 1.218247,4e-6 2.9e-5,9.745799 h 1.218225 v 1.218225 l 2.436399,-2e-6 v -1.218225 h 1.218226 l -3.2e-5,-7.309351 h -1.218223 l 2.7e-5,-6.091126 h -1.218223 v -6.091126 h 1.218225 v -1.218225 h 4.872911 v 1.218225 h 6.091113 v -1.218225 h 2.43645 v -1.218222 h 1.21823 z" fill="#fff"/><path d="m 105.98564,10.964048 h -3.6547 V 12.1822 h -2.436426 v 1.218277 h -4.872981 v 1.218276 h 2.436428 4.872979 v -1.218276 h 2.43643 V 12.1822 h 1.21827 z M 95.021533,13.400477 V 12.1822 H 93.803381 V 10.964048 H 92.585105 V 9.745772 h -1.21815 V 8.5276223 H 90.148679 V 7.309346 H 88.9304 V 6.0910673 H 87.71225 V 4.8729177 H 77.966415 V 6.0910673 H 76.748139 V 7.309346 H 75.529987 V 8.5276223 H 74.31171 l -0.0049,2.4509057 -1.213366,-0.01447 v 2.436428 h -1.218277 l 8e-6,7.309341 H 73.0934 v -6.091126 l 1.218196,6.1e-5 V 13.400486 12.18221 h 1.218276 v -1.218152 h 1.21815 V 9.7457793 h 1.218276 V 8.5276297 h 1.218279 V 7.3093533 h 8.527559 v 1.2182764 h 1.218149 v 1.2181496 h 1.218279 v 1.2182767 h 1.218276 v 1.218152 h 1.218238 v 1.218276 h 1.218276 z m 1.218276,2.436428 h -4.872854 v 1.21815 h 4.872854 z m -8.527559,4.872981 h -1.218276 v -1.218279 -1.218276 h -1.218152 v -1.21815 h -1.218276 v 1.21815 h -1.218277 v 3.654705 h 1.218277 V 26.80089 H 81.62112 v -4.872854 h -1.218279 v -1.21815 h -1.21815 v 1.21815 h -1.218276 v 3.654704 h -1.218276 v -2.436428 h -1.218152 l 2.9e-5,-2.436487 H 74.31174 l -3e-5,2.436487 h -1.218152 v 1.218152 h 1.218152 v 1.218276 h 1.218277 v 1.21815 h 3.654578 v -1.21815 h 1.218276 v 1.21815 h 1.218152 v 1.218279 h 3.654705 l 1.24e-4,-1.218279 h 1.218152 v 1.218279 h 1.218276 z m -14.618692,2.436426 h -1.218276 z" fill="#e6e6e6"/><path d="m 86.493981,21.928048 v 4.872896 h -1.21821 v -4.872896 z" fill="#999"/><path d="m 85.275749,18.273372 v 3.654673 h -1.218211 v -3.654673 z" fill="#999"/><path d="m 87.712202,6.0911087 h -9.745785 l 3e-6,1.2182398 H 76.74819 V 8.5275736 H 75.529965 V 7.3093485 h 1.21823 V 6.0911233 h 1.218225 l -3e-6,-1.2182251 h 9.745785 l 1.9e-5,1.2182251 h 1.218225 v 1.2182252 h -1.218225 z" fill="#b3b3b3"/><path d="m 80.40287,21.928048 v 3.654675 h -1.218225 v -3.654675 z" fill="#999"/><path d="m 73.093561,20.709823 h -1.218277 l 5e-6,2.436452 h 1.218225 z m 2.436404,1.218227 H 74.31174 l -3e-5,3.654693 h 1.218277 z" fill="#999"/><path d="m 77.966371,3.6546681 4.4e-5,-1.2182202 2.436406,-2.5e-6 4.4e-5,-1.2182227 h 6.091126 l -0.0049,1.2182252 H 88.93039 V 3.654673 h 1.218208 l 1.7e-5,2.4364503 h -2.43645 V 4.8728982 H 86.49394 V 3.654673 h -7.309351 v 1.2182252 h -1.223013 l 0.0049,1.2182251 -1.218276,-5.6e-5 2.7e-5,-2.4363967 z" fill="#e6e6e6"/><path d="M 86.493986,3.6546694 V 4.8728945 H 79.184635 V 3.6546694 Z" fill="#ccc"/></g><g id="finger2" pointer-events="none" style="display:none"><path d="m 84.057509,10.964021 h 1.21823 V 9.7457939 h 3.654676 v 1.2182271 h 2.43645 v 1.218226 h 4.872898 v -1.218226 h 1.218228 V 9.7457939 h 1.218222 V 8.5275687 h 1.218223 V 7.3093436 l 1.241504,-0.00482 -0.0234,-1.2133961 -1.218233,2.5e-6 V 2.4364503 h 1.218223 l 2e-5,-1.2182252 h 2.43657 V 0 h 7.30935 v 1.2182251 h 2.43645 v 1.2182228 l 2.43644,2.4e-6 2e-5,4.8729006 h 1.21821 l 1e-5,1.2182252 h 1.21823 l 0.005,2.4510009 1.21338,-0.01455 v 2.436451 h 1.21822 v 9.745798 h -1.21822 v 1.218225 h -1.21823 v 1.218226 h -1.21822 v 1.218225 h -1.21822 l -10e-6,1.218225 -3.65471,-3e-6 v -1.218225 h -1.21822 v 1.218225 l -1.21825,3e-6 v 1.218225 h -3.6547 v -1.218225 l -1.21817,-10e-6 -5e-5,9.745811 h -1.21823 v 1.218225 h -1.21822 l 2e-5,1.218225 h -2.436446 v -1.218225 h -1.218226 v -1.218225 h -1.218225 l 3.2e-5,-7.309351 h 1.218223 v -6.091126 h 1.218222 l -2.6e-5,-4.8729 H 98.676208 V 18.27338 h -3.654675 v 1.218225 H 88.930439 V 18.27338 h -2.436453 v -1.218223 h -1.218222 l -3.2e-5,-1.218228 -1.218196,3e-6 z" fill="#1a1a1a"/><path d="m 85.275742,10.964021 h 3.654675 v 1.218226 h 2.43645 v 1.218225 h 4.872896 v -1.218225 h 1.218225 l 3e-6,-1.218226 h 1.218227 V 9.7457963 h 1.218223 V 8.5275712 h 1.218219 l 10e-6,-1.2182252 h 1.21823 l -1e-5,-1.2182251 h -1.21823 l 3e-5,-2.4364503 h 1.21822 l 2e-5,-1.2182252 h 2.43645 V 1.2182203 l 6.09113,-2.5e-6 V 2.436443 h 2.43645 v 1.2182227 l 1.21821,2.4e-6 v 3.6546755 l 1.21821,-2.4e-6 2e-5,1.2182251 h 1.21822 l 0.005,2.4510007 1.21337,-0.01455 v 2.436451 h 1.21823 v 7.309348 1.218225 h -10e-6 v 1.218226 h -1.21823 v 1.218225 l -1.21821,2e-6 -1e-5,1.218223 h -1.21823 v 1.218225 h -3.65465 v -1.218225 h -1.21822 v 1.218225 l -1.2182,2e-6 v 1.218226 h -3.6547 l -2e-5,-1.218226 h -1.21823 l 2e-5,1.218223 -1.21824,5e-6 -3e-5,9.745799 h -1.21823 V 38.9832 l -2.436398,-3e-6 v -1.218225 h -1.218226 l 3.2e-5,-7.309351 h 1.218223 l -2.7e-5,-6.091125 h 1.218226 V 18.27337 h -1.218228 v -1.218225 h -4.872911 v 1.218225 h -6.091116 v -1.218225 h -2.436501 v -1.218223 h -1.218223 z" fill="#fff"/><path d="m 85.27569,10.964046 h 3.654705 v 1.218152 h 2.436426 v 1.218276 h 4.872981 v 1.218277 H 93.803374 88.930395 V 13.400474 H 86.493967 V 12.182198 H 85.27569 Z m 10.964112,2.436428 v -1.218276 h 1.218152 V 10.964046 H 98.67623 V 9.7457695 h 1.21815 V 8.5276199 h 1.21828 V 7.3093436 h 1.21828 V 6.0910648 h 1.21814 V 4.8729152 h 9.74584 v 1.2181496 h 1.21828 v 1.2182788 h 1.21815 v 1.2182763 h 1.21827 l 0.005,2.4509061 1.21336,-0.01447 v 2.436429 h 1.21828 l -10e-6,7.309341 h -1.21822 V 14.6187 l -1.2182,6.1e-5 v -1.218276 -1.218277 h -1.21836 V 10.964053 H 114.5132 V 9.7457768 h -1.21828 V 8.5276272 h -1.21828 V 7.3093509 h -8.52756 v 1.2182763 h -1.21814 v 1.2181496 h -1.21828 v 1.2182762 h -1.21828 v 1.218152 h -1.21815 v 1.218277 h -1.218276 z m -1.218276,2.436429 h 4.872854 v 1.218149 h -4.872854 z m 8.527554,4.872981 h 1.21828 v -1.218279 -1.218276 h 1.21815 v -1.21815 h 1.21828 v 1.21815 h 1.21828 v 3.654704 h -1.21828 v 4.872855 h 2.43643 v -4.872855 h 1.21827 v -1.218149 h 1.21815 v 1.218149 h 1.21828 v 3.654705 h 1.21828 V 23.14631 h 1.21815 l -3e-5,-2.436487 h 1.21828 l 2e-5,2.436487 h 1.21816 v 1.218152 h -1.21816 v 1.218276 h -1.21827 v 1.21815 h -3.65458 v -1.21815 h -1.21828 v 1.21815 h -1.21815 v 1.218278 h -3.6547 l -1.3e-4,-1.218278 h -1.21815 v 1.218278 h -1.21828 z m 14.6187,2.436426 h 1.21827 z" fill="#e6e6e6"/><rect fill="#999" height="1.2182105" transform="matrix(0,1,1,0,0,0)" width="4.8728976" x="21.928043" y="104.76736"/><rect fill="#999" height="1.2182105" transform="matrix(0,1,1,0,0,0)" width="3.6546743" x="18.273369" y="105.98558"/><path d="m 103.54913,6.0911063 h 9.74579 V 7.309346 h 1.21823 v 1.2182252 h 1.21822 V 7.309346 h -1.21823 V 6.0911209 h -1.21822 V 4.8728957 h -9.74579 l -2e-5,1.2182252 h -1.21822 V 7.309346 h 1.21822 z" fill="#b3b3b3"/><rect fill="#999" height="1.218225" transform="matrix(0,1,1,0,0,0)" width="3.654676" x="21.928043" y="110.85847"/><path d="m 118.16777,20.70982 h 1.21828 v 2.436453 h -1.21823 z m -2.4364,1.218228 h 1.21823 l 2e-5,3.654692 h -1.21827 z" fill="#999"/><path d="m 113.29496,3.6546657 -4e-5,-1.2182203 -2.43641,-2.4e-6 -4e-5,-1.2182227 h -6.09113 l 0.005,1.2182251 h -2.44128 v 1.2182252 h -1.2182 l -2e-5,2.4364503 h 2.43645 V 4.8728957 h 1.21823 V 3.6546706 h 7.30935 v 1.2182251 h 1.22301 l -0.005,1.2182252 1.21827,-5.61e-5 -2e-5,-2.4363967 z" fill="#e6e6e6"/><path d="m 104.76735,3.6546669 v 1.2182252 h 7.30935 V 3.6546669 Z" fill="#ccc"/></g></svg></div></div><div class="grid"><div class="card pixel-frame"><div class="small">HITS</div><div class="big" id="hits">0</div></div><div class="card pixel-frame"><div class="small">SPEED (HITS/S)</div><div class="big" id="speed">0.00</div></div><div class="card pixel-frame"><div class="small">STABILITY</div><div class="big" id="stability">0.000</div></div><div class="card pixel-frame"><div class="small">SCORE</div><div class="big" id="score">0</div></div></div></div></div></div></div><div id="overlay"></div><footer class="footer--stack footer-8bit"><button class="btn-8bit" id="btnManual">GAME MANUAL</button> <span class="copyright">© DIMProductions</span></footer><div class="modal" id="manualModal" aria-labelledby="manualTitle" aria-modal="true" hidden role="dialog"><div class="modal__panel" role="document" tabindex="-1"><header class="modal__header"><h2 id="manualTitle">Game Manual</h2><button class="modal__close" id="manualClose" aria-label="Close manual" type="button">×</button></header><div class="modal__body"><p><strong>Connection & Start</strong><br>Press <em>Start</em> to request MIDI access. Once connected, use your MIDI keyboard to rapidly tap the required notes (see Modes below). Before starting a run, test which physical key on your keyboard sends <strong>C</strong> (and <strong>D</strong> if needed).</p><p><strong>Modes</strong></p><ul><li><strong>Erlkönig (C)</strong>: Tap <strong>C</strong> only.</li><li><strong>Diavolo (C–D)</strong>: Alternate strictly between <strong>C</strong> and <strong>D</strong>.</li></ul><p><strong>How to Play</strong><br>After you press <em>START</em>, a short countdown begins, then a <strong>10-second</strong> burst is measured. Hit as fast and as accurately as you can within the time limit.</p><p><strong>Results</strong><br>You’ll see: <strong>HITS</strong> (total), <strong>SPEED</strong> (hits/s), <strong>STABILITY</strong> (timing consistency), and <strong>SCORE</strong> (speed × stability).</p><p><strong>Shortcuts</strong><br><kbd>Space</kbd> = Start/Stop, <kbd>M</kbd> = Mute, <kbd>←</kbd>/<kbd>→</kbd> = Mode toggle.</p><p><strong>Latency Tips</strong><br>Avoid Bluetooth audio (high latency). Use a wired output when possible.</p><p><strong>Browser</strong><br>Chrome (or Chromium-based) is recommended.</p></div></div></div><script>!function(){const e=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--baseW"))||800,t=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--baseH"))||600,n=document.getElementById("wrap");function i(){const i=Math.max(320,window.innerWidth),o=Math.max(240,window.innerHeight-24),s=Math.max(1,Math.min(Math.floor(i/e),Math.floor(o/t)));document.documentElement.style.setProperty("--scale",s),n.style.width=e*s+"px"}window.addEventListener("resize",i),i()}(),(()=>{window.AudioContext||window.webkitAudioContext;let e=null,t=!1;async function n(){const n=window.AudioContext||window.webkitAudioContext;if(n){if(!e||"closed"===e.state){e=new n({latencyHint:"interactive"});try{const t=e.createGain();t.gain.value=1,t.connect(e.destination);const n=e.createBuffer(1,32,e.sampleRate),i=e.createBufferSource();i.buffer=n,i.connect(t),i.start(e.currentTime+.002)}catch(e){}}if("suspended"===e.state)try{await e.resume()}catch(e){console.warn("resume failed",e)}return t=e&&"running"===e.state,e}console.warn("AudioContext unsupported")}window.addEventListener("click",async()=>{await n(),t=!0},{once:!0}),window.addEventListener("keydown",async()=>{t||(await n(),t=!0)},{once:!0});let i=!1;function o(e){i=!!e,document.body.classList.toggle("muted",i)}function s(n,o=100){if(!t||i)return;const s=e.currentTime,r=e.createOscillator(),a=e.createGain();r.type="square",r.frequency.value=440*Math.pow(2,(n-69)/12);const c=Math.max(.08,Math.min(1,o/127));a.gain.setValueAtTime(1e-4,s),a.gain.linearRampToValueAtTime(.25*c,s+.003),a.gain.linearRampToValueAtTime(1e-4,s+.08),r.connect(a).connect(e.destination),r.start(s),r.stop(s+.08)}async function r(){if(!("speechSynthesis"in window))return[];const e=speechSynthesis.getVoices();return e&&e.length?e:new Promise(e=>{const t=()=>{speechSynthesis.removeEventListener("voiceschanged",t),e(speechSynthesis.getVoices()||[])};speechSynthesis.addEventListener("voiceschanged",t),setTimeout(()=>e(speechSynthesis.getVoices()||[]),500)})}location.search.includes("mute=1")&&o(!0),(()=>{const e={E:60,D:62};document.querySelectorAll(".seg input").forEach(t=>{t.addEventListener("change",t=>{t.isTrusted&&t.target.checked&&s(e[t.target.value]??60,110)})})})();let a=!1,c=null;async function l(){if("speechSynthesis"in window&&!a){await r();try{speechSynthesis.cancel();const e=new SpeechSynthesisUtterance("");e.lang="en-US",e.volume=0,e.onend=()=>{a=!0},speechSynthesis.speak(e)}catch(e){}}}async function d(e,{lang:t="en-US"}={}){if(!("speechSynthesis"in window))return;if(!a&&(await l(),!a))return void setTimeout(()=>{a&&d(e,{lang:t})},80);const n=function(e){if(!e||!e.length)return null;const t=/(samantha|victoria|karen|zira|aria|ana|female|google.*english.*female)/i,n=e.filter(e=>/en[-_]US/i.test(e.lang||"")),i=n.find(e=>t.test(`${e.name} ${e.voiceURI}`));return i||(n[0]?n[0]:e.find(e=>/^en[-_]/i.test(e.lang||""))||e[0]||null)}(await r()),i=Number(e)>=7e3,o=function(e){const t=Math.max(0,0|Number(e)),n={"00":"zero","01":"one","02":"two","03":"three","04":"four","05":"five","06":"six","07":"seven","08":"eight","09":"nine",10:"ten",11:"eleven",12:"twelve",13:"thirteen",14:"fourteen",15:"fifteen",16:"sixteen",17:"seventeen",18:"eighteen",19:"nineteen",20:"twenty",21:"twenty-one",22:"twenty-two",23:"twenty-three",24:"twenty-four",25:"twenty-five",26:"twenty-six",27:"twenty-seven",28:"twenty-eight",29:"twenty-nine",30:"thirty",31:"thirty-one",32:"thirty-two",33:"thirty-three",34:"thirty-four",35:"thirty-five",36:"thirty-six",37:"thirty-seven",38:"thirty-eight",39:"thirty-nine",40:"forty",41:"forty-one",42:"forty-two",43:"forty-three",44:"forty-four",45:"forty-five",46:"forty-six",47:"forty-seven",48:"forty-eight",49:"forty-nine",50:"fifty",51:"fifty-one",52:"fifty-two",53:"fifty-three",54:"fifty-four",55:"fifty-five",56:"fifty-six",57:"fifty-seven",58:"fifty-eight",59:"fifty-nine",60:"sixty",61:"sixty-one",62:"sixty-two",63:"sixty-three",64:"sixty-four",65:"sixty-five",66:"sixty-six",67:"sixty-seven",68:"sixty-eight",69:"sixty-nine",70:"seventy",71:"seventy-one",72:"seventy-two",73:"seventy-three",74:"seventy-four",75:"seventy-five",76:"seventy-six",77:"seventy-seven",78:"seventy-eight",79:"seventy-nine",80:"eighty",81:"eighty-one",82:"eighty-two",83:"eighty-three",84:"eighty-four",85:"eighty-five",86:"eighty-six",87:"eighty-seven",88:"eighty-eight",89:"eighty-nine",90:"ninety",91:"ninety-one",92:"ninety-two",93:"ninety-three",94:"ninety-four",95:"ninety-five",96:"ninety-six",97:"ninety-seven",98:"ninety-eight",99:"ninety-nine"};if(t<10)return`${["zero","one","two","three","four","five","six","seven","eight","nine"][t]} points.`;if(t<100)return`${n[String(t).padStart(2,"0")]} points.`;const i=String(t).padStart(4,"0"),o=i.slice(0,2),s=i.slice(2);return`${["00"===o?"":n[o],"00"===s?"":n[s]].filter(Boolean).join(" ")||"zero"} points.`}(Number(e)),s=i?`${o} Excellent! You're fucking great! You're the Piano Virtuoso!`:o;try{if(c)try{speechSynthesis.cancel()}catch(e){}const t=new SpeechSynthesisUtterance(s);t.lang="en-US",t.rate=1,t.pitch=2,t.volume=1,n&&(t.voice=n),c=t,speechSynthesis.speak(t)}catch(e){console.warn("TTS failed:",e)}}window.addEventListener("pointerdown",l,{once:!0}),window.addEventListener("keydown",l,{once:!0}),document.addEventListener("visibilitychange",()=>{if("visible"===document.visibilityState&&"speechSynthesis"in window)try{speechSynthesis.resume()}catch(e){}});const u=document.getElementById("hits"),y=document.getElementById("speed"),f=document.getElementById("stability"),m=document.getElementById("score"),h=document.getElementById("badge"),g=document.getElementById("minVel"),p=document.getElementById("minVelVal"),v=document.getElementById("timeLeftCenter");function w(e){const t=document.getElementById("midiStatus");if(!t)return;const n=(e||"").trim(),i=/^CONNECTED:?\s*(.*)$/i.exec(n);if(i){const e=i[1]||"MIDI device";return t.innerHTML='<span class="prefix">MIDI ON:</span><span class="dev"></span>',t.querySelector(".dev").textContent=e,void(t.title=`MIDI ON: ${e}`)}t.textContent=n||"NOT CONNECTED",t.title=t.textContent}function E(e,t){h&&(h.textContent=e,h.className="badge"+(t?" "+t:""))}function x(e){E("CHEATER","bad"),w((document.getElementById("midiStatus")?.textContent||"").trim().startsWith("CONNECTED")?"CONNECTED (FLAGGED)":"FLAGGED")}g&&p&&(g.oninput=()=>p.textContent=g.value,p.textContent=g.value);let C=!1,I=!1,S=!1,D=null,L=[],b=[],B=-1,k=-1,M=null,T=null,A=null,N=0,q="E";document.querySelectorAll('input[name="mode"]').forEach(e=>e.onchange=()=>q=e.value);const U=/(drum|pad|td-|spd|launchpad|maschine|mpd|push|dtx|strike|pads?)/i;function O(e){const t=((e.manufacturer||"")+" "+(e.name||"")).toLowerCase();return U.test(t)}function V(){const e=[];if(!L.length)return e;const t=[];for(let e=1;e<L.length;e++)t.push(L[e]-L[e-1]);if(t.length){const n=t.reduce((e,t)=>e+t,0)/t.length,i=Math.sqrt(t.reduce((e,t)=>e+(t-n)*(t-n),0)/t.length)/n;1e3/n>20&&t.length>=30&&e.push("over_cps"),i<.02&&t.length>=40&&e.push("too_uniform")}if(b.length>=30){const t=new Map;b.forEach(e=>t.set(e,(t.get(e)||0)+1)),Math.max(...t.values())/b.length>=.95&&e.push("vel_constant")}return D?.isPad&&e.push("pad_device"),e}const _=document.getElementById("overlay");function P(){_.classList.remove("show"),_.textContent=""}let F=null,R=0,$="";function G(e){const t=document.getElementById("start"),n=document.getElementById("stop");t&&(t.style.pointerEvents=e?"none":"all",t.style.filter=e?"saturate(.85) brightness(.50)":""),n&&(n.style.pointerEvents=e?"all":"none"),J()}function H(){if(!C)return;C=!1,J(),F&&(cancelAnimationFrame(F),F=null),v&&(v.textContent="0.00");const e=L.length,t=Math.max(1,(L.at(-1)??N)-N)/1e3,n=e/Math.min(10,t);if(y.textContent=n.toFixed(2),e>=2){const t=[];for(let n=1;n<e;n++)t.push(L[n]-L[n-1]);const n=t.reduce((e,t)=>e+t,0)/t.length,i=Math.sqrt(t.reduce((e,t)=>e+(t-n)*(t-n),0)/t.length),o=Math.max(0,Math.min(1,1-i/n));f.textContent=o.toFixed(3);const s=Math.max(0,Math.min(100,e/180*100)),r=100*o;m.textContent=String(Math.round(s*r))}else f.textContent="0.000",m.textContent="0";if(V().length&&(S=!0),S)h.textContent="PRACTICE",h.className="badge practice";else try{d(m.textContent,{lang:"en-US"})}catch(e){}G(!1)}let z=null;function W(){if(!z.inputs.size)return w("NOT CONNECTED"),E("QUALIFIED","idle"),void(D=null);z.inputs.forEach(e=>{e.onmidimessage=n=>{const[o,r,a]=n.data,c=240&o,l=1+(15&o);if(D||(D={name:e.name,manu:e.manufacturer,ch:l,isPad:O(e)||10===l},D.isPad?x():w(`CONNECTED: ${D.name||"MIDI device"}`)),10===l&&x(),144===c&&0!==a){let e=!1;if(e="E"===q?60===r:(60===r||62===r)&&T!==r,e&&(60===r?ee.C||te("C"):ee.D||te("D"),C&&t&&!i&&s(60===r?84:86,a),"D"===q&&(T=r)),!C)return}else if(128===c||144===c&&0===a)return 60===r&&ne("C"),void(62===r&&ne("D"));if(144===c&&0!==a){if("E"===q){if(60!==r)return}else if(60!==r&&62!==r)return;(function(e,t){const n=performance.now();if(t<(Number(g?.value)||1))return!1;if(60===e){if(B>0&&n-B<25)return!1;B=n}if(62===e){if(k>0&&n-k<25)return!1;k=n}return("D"!==q||null==M||M!==e)&&(L.push(n),b.push(t),M=e,u.textContent=String(L.length),!0)})(r,a)&&V().length&&(S=!0,h.textContent="PRACTICE",h.className="badge practice")}}})}const Y=document.getElementById("btnStart"),j=document.getElementById("btnStop");async function Q(){if(C||I)return;G(!0),I=!0,J(),await n(),await async function(){if(!z)if(navigator.requestMIDIAccess)try{z=await navigator.requestMIDIAccess({sysex:!1}),z.onstatechange=W,W()}catch{w("PERMISSION DENIED")}else w("NOT SUPPORTED")}(),D=null,S=!1,C=!1,I=!1,L.length=0,b.length=0,B=-1,k=-1,M=null,T=null,u.textContent="0",y.textContent="0.00",f.textContent="0.000",m.textContent="0",h&&(h.textContent="QUALIFIED",h.className="badge"),v&&(v.textContent=10..toFixed(2)),J();const e=["READY","3","2","1","BURST!"],t=[null,100,100,100,84];let i=0;const o=()=>{var n;n=e[i],_.textContent=n,_.classList.add("show");const r=t[i];r&&s(r,110),i++,A=i<e.length?setTimeout(o,600):setTimeout(()=>{P(),I=!1,function(){C=!0,J(),N=performance.now(),R=N+1e4,$="";const e=()=>{if(!C)return void(F=null);const t=R-performance.now();if(t<=0)return v&&(v.textContent="0.00"),H(),void(F=null);const n=(t/1e3).toFixed(2);n!==$&&($=n,v&&(v.textContent=n)),F=requestAnimationFrame(e)};e()}()},480)};o()}function J(){const e=document.getElementById("start"),t=document.getElementById("stop"),n=C||I;e&&e.classList.toggle("svg-disabled",n),t&&t.classList.toggle("svg-disabled",!n)}Y&&Y.addEventListener("click",()=>{Y.disabled=!0,j&&(j.disabled=!1),Q()}),j&&j.addEventListener("click",()=>{I&&(clearTimeout(A),I=!1,P()),C&&H(),Y&&(Y.disabled=!1),j.disabled=!0}),function(){function e(){const e=document.getElementById("start"),t=document.getElementById("stop");return e&&!e.__wired&&(e.style.display="inline",e.style.cursor="pointer",e.style.pointerEvents="all",e.__wired=!0),t&&!t.__wired&&(t.style.display="inline",t.style.cursor="pointer",t.style.pointerEvents="all",t.__wired=!0),e&&t}if(!e()){const t=new MutationObserver(()=>{e()&&t.disconnect()});t.observe(document.body,{childList:!0,subtree:!0})}}(),window.addEventListener("keydown",e=>{if(e.repeat)return;if("Space"!==e.code&&" "!==e.key)return;const t=(e.target.tagName||"").toLowerCase();if(!/(input|textarea|select|button)/.test(t)){if(e.preventDefault(),I)return clearTimeout(A),I=!1,P(),void J();C?H():Q()}}),window.addEventListener("keydown",e=>{if(!e.repeat&&("m"===e.key||"M"===e.key)){o(!i);const e=document.getElementById("midiStatus");if(e){const t=e.textContent.replace(/\s*\(MUTED\)$/,"");e.textContent=i?t+" (MUTED)":t}}});const K=document.querySelector("#start #startHit")||document.getElementById("start"),X=document.querySelector("#stop #stopHit")||document.getElementById("stop");K&&(K.addEventListener("click",ie),K.addEventListener("keydown",e=>{"Enter"!==e.key&&" "!==e.key||ie(e)})),X&&(X.addEventListener("click",oe),X.addEventListener("keydown",e=>{"Enter"!==e.key&&" "!==e.key||oe(e)})),function(){const e=["C1up","C1down","D1up","D1down","finger1","finger2"].filter(e=>!document.getElementById(e));e.length&&console.error("[SVG] Missing IDs:",e.join(", ")),["C1up","C1down","D1up","D1down"].forEach(e=>{const t=document.getElementById(e);t&&t.transform&&t.transform.baseVal&&t.transform.baseVal.numberOfItems||console.warn(`[SVG] ${e} has no transform; using BBox fallback.`)})}();const Z={C:{up:"C1up",down:"C1down",finger:"finger1",midi:60},D:{up:"D1up",down:"D1down",finger:"finger2",midi:62}},ee={C:!1,D:!1};function te(e){if(ee[e])return;ee[e]=!0;const t=Z[e];if(!t)return;const n=document.getElementById(t.up),i=document.getElementById(t.down),o=document.getElementById(t.finger);n&&(n.style.display="none"),i&&(i.style.display="inline"),o&&(o.style.display="inline",o.classList.remove("fingerUp","fingerDown","tap"),requestAnimationFrame(()=>o.classList.add("fingerDown")))}function ne(e){if(!ee[e])return;ee[e]=!1;const t=Z[e];if(!t)return;const n=document.getElementById(t.up),i=document.getElementById(t.down),o=document.getElementById(t.finger);o&&(o.classList.remove("fingerDown","fingerUp"),requestAnimationFrame(()=>{o.classList.add("fingerUp");const e=()=>{o.style.display="none",o.removeEventListener("animationend",e)};o.addEventListener("animationend",e,{once:!0})})),i&&(i.style.display="none"),n&&(n.style.display="inline")}function ie(e){try{Q()}finally{e?.preventDefault?.(),e?.stopPropagation?.()}}function oe(e){try{if(void 0!==I&&I)return clearTimeout(A),I=!1,void P();if(void 0!==C&&!C)return;H()}finally{e?.preventDefault?.(),e?.stopPropagation?.()}}!function(){const e=[...document.querySelectorAll('input[name="mode"]')];addEventListener("keydown",t=>{var n;t.repeat||"ArrowLeft"!==t.key&&"ArrowRight"!==t.key||(q=n="E"===q?"D":"E",T=null,e.forEach(e=>{const t=e.value===n;e.checked!==t&&(e.checked=t,t&&e.dispatchEvent(new Event("change",{bubbles:!0})))}),s("E"===n?60:62,110))})}()})(),function(){const e=document.getElementById("btnManual"),t=document.getElementById("manualModal"),n=t?.querySelector(".modal__panel"),i=document.getElementById("manualClose");if(!(e&&t&&n&&i))return;let o=null,s=!1;function r(){o=document.activeElement,t.hidden=!1,s=!0,requestAnimationFrame(()=>{n.scrollTop=0,n.focus()})}function a(){t.hidden=!0,s=!1,o&&o.focus&&o.focus()}e.addEventListener("click",r),i.addEventListener("click",a),e.addEventListener("click",e=>{e.preventDefault(),r()}),window.addEventListener("keydown",e=>{if(s)return"Escape"===e.key?(e.preventDefault(),void a()):void("Space"!==e.code&&" "!==e.key||e.preventDefault())},!0)}()</script><script type="application/ld+json">{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "How can I get faster at piano?",
"acceptedAnswer": {
"@type": "Answer",
"text": "A highly effective way to get faster at piano is short-duration sprint training. Piano Virtuoso 18 uses a 10-second reaction-based tapping challenge that measures speed, accuracy, and timing. This reveals your true finger limits and helps you build fast, controlled technique in a way traditional metronome practice cannot easily measure."
}
},
{
"@type": "Question",
"name": "What skills does Piano Virtuoso 18 actually train?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Piano Virtuoso 18 focuses on three core skills: high-speed finger motion, precision of key strikes, and rhythmic reaction. Because every 10-second run is scored, you can see whether your speed, accuracy rate, or timing is improving instead of guessing based on feeling alone."
}
},
{
"@type": "Question",
"name": "How often should I use Piano Virtuoso 18 to see progress?",
"acceptedAnswer": {
"@type": "Answer",
"text": "A practical routine is 5 to 10 runs per day, 3 to 5 days per week. This adds only a few minutes to your practice, but creates a high-intensity block that pushes your maximum speed and control. Many players use PV18 as a warm-up before scales or repertoire practice so their fingers are already activated when they start playing real music."
}
},
{
"@type": "Question",
"name": "Is Piano Virtuoso 18 useful for beginners?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes, as long as beginners already know basic hand position and can press keys without pain. For beginners, Piano Virtuoso 18 is best used at slower tempos and smaller key ranges so that they learn to move cleanly first. The goal is not random mashing, but learning how to move quickly while keeping each tap clear and even."
}
},
{
"@type": "Question",
"name": "How is Piano Virtuoso 18 different from a metronome?",
"acceptedAnswer": {
"@type": "Answer",
"text": "A metronome keeps steady time but does not tell you how close you are to your physical limits or how many notes you actually played correctly. Piano Virtuoso 18 turns speed and precision into a game: every 10-second run shows how many taps you achieved and how accurate they were. This makes it easier to push your limits safely, track progress, and stay motivated."
}
}
]
}
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "Piano Virtuoso 18",
"operatingSystem": "Web",
"applicationCategory": "Game, MusicTraining",
"description": "A 10-second sprint-based piano training game that measures speed, accuracy, and timing to help players build fast, controlled technique.",
"url": "https://pv18.dim.productions/",
"publisher": {
"@type": "Organization",
"name": "DIMProductions"
}
}</script></body></html>