midiviz

02 — Automatic piano fingering & pianist-hand simulation: algorithms, research, software

Research brief, Oct 2026. Every reference below was opened (paper PDF, publisher page, arXiv abstract or source repo) while writing this; where a detail comes from a secondary source (e.g. a re-implementation rather than the original paper) that is said explicitly. “Verified in source” = read in the PDF text or code; “per abstract” = only the abstract/landing page was accessible.

Contents

  1. Taxonomy and the one-paragraph answer
  2. Rule/cost-based models (Parncutt 1997, Jacobs 2001, Sloboda 1998, Hart 2000, Al Kasimi 2007, Viana, Lin & Liu, Radicioni, Robine, Balliauw 2015/2017, Badgerow)
  3. Statistical / learned models (Yonebayashi 2007, Nakamura 2014/2020 + PIG, Guan/Zhao 2022, Ramoneda 2022, Srivatsan 2022, Randolph CRF 2023, 2023–2026 work)
  4. Datasets & evaluation metrics (PIG format, licence, M_gen/M_high/M_soft/M_rec, fluency metrics)
  5. Software (pydactyl, pianoplayer, Nakamura’s HMM code, Balliauw VNS, others; MuseScore)
  6. Hand motion / animation (pianoplayer-vedo, RoboPianist, PianoMime, RP1M/OmniPianist, FürElise, PianoMotion10M, Unity roboPianist) and how they go from fingering to pose
  7. Comparison table
  8. Recommended design for our implementation (JS, in-browser, polyphonic, full MIDI files)
  9. Reference list with URLs/DOIs

1. Taxonomy and short answer

Short answer for us: the gap between a well-tuned cost model and the best neural model on PIG is only a few points of M_gen (all are ~5–10 points below inter-annotator agreement), while a cost model is tiny, explainable, hand-size-adjustable and fast. A per-hand Viterbi over chord-fingering states with Parncutt/Jacobs/Balliauw costs (physical distances, time-aware) is the right core for an in-browser real-time system (section 8).


2. Rule / cost-based models

2.1 Parncutt, Sloboda, Clarke, Raekallio & Desain (1997)

“An ergonomic model of keyboard fingering for melodic fragments”, Music Perception 14(4):341–382. DOI 10.2307/40285730 (resolves to UC Press). Author PDF: https://static.uni-graz.at/fileadmin/_Persoenliche_Webseite/parncutt_richard/Pdfs/PaSlClRaDe97_FingeringModel.pdf (all rules/table below verified in that PDF).

Approach. Monophonic, right hand (LH by mirroring). (1) Generate all fingerings whose consecutive intervals lie within [MinPrac, MaxPrac] for the finger pair (hard constraint; same finger on different consecutive notes not allowed). (2) Score each with 12 additive rules (weights all 1 in the paper). (3) Rank. For longer passages the same rules are evaluated on a layered graph (nodes = note×finger, trigram rules folded in) and solved with a Dijkstra-style left-to-right sweep; worst case ≤ n·5·4·4+2 nodes, ~linear time.

Span table (Table 1, RH, semitones; f-g = finger on first note → finger on second; positive = rising). Values below match both the PDF and pydactyl’s FINGER_SPANS:

Pair MinPrac MinComf MinRel MaxRel MaxComf MaxPrac
1-2 -5 -3 1 5 8 10
1-3 -4 -2 3 7 10 12
1-4 -3 -1 5 9 12 14
1-5 -1 1 7 10 13 15
2-3 1 1 1 2 3 5
2-4 1 1 3 4 5 7
2-5 2 2 5 6 8 10
3-4 1 1 1 2 2 4
3-5 1 1 3 4 5 7
4-5 1 1 1 2 3 5

Derivation rules stated in the paper: MaxComf = MaxPrac − 2 (all pairs); MinComf = MinPrac + 2 for thumb pairs, = MinPrac otherwise; non-thumb MaxRel = 2·(finger difference), MinRel = MaxRel − 1; thumb MaxRel = MaxComf − 3, thumb MinRel = 2·(finger difference) − 1. Reverse pair g-f: negate and swap Min/Max (e.g. MaxPrac(2-1) = +5, MinPrac(2-1) = −10). LH: reverse the pair order (LH 2-1 uses RH 1-2 row). Same-finger pairs are all 0. Paper notes ~13.7 mm per semitone (165 mm octave) and suggests mm instead of semitones (done by Jacobs).

The 12 rules (exact wording paraphrased tightly; costs exact):

# Name (pydactyl tag) Scope Cost
1 Stretch (str) consecutive pair 2 per semitone the interval exceeds MaxComf or is below MinComf
2 Small-Span (sma) pair interval < MinRel: 1/semitone if thumb in pair, 2/semitone otherwise (includes thumb-passing: E4→G4 played 3-1 = 3+3 = 6 pts)
3 Large-Span (lar) pair interval > MaxRel: 1/semitone with thumb, 2/semitone without
4 Position-Change-Count (pcc) trigram (n1,n2,n3) if interval n1→n3 > MaxComf or < MinComf for (f1,f3): “full change” = 2 pts if f2 is thumb AND n2 lies between n1,n3 AND n1→n3 > MaxPrac or < MinPrac; otherwise “half change” = 1 pt
5 Position-Change-Size (pcs) trigram n1→n3 < MinComf: MinComf − interval; > MaxComf: interval − MaxComf (points = semitones)
6 Weak-Finger (wea) note 1 each time finger 4 or 5 is used
7 Three-Four-Five (345) trigram 1 each time fingers 3,4,5 occur consecutively in any order (overlapping groups count)
8 Three-to-Four (3t4) pair 1 each time 3 is immediately followed by 4
9 Four-on-Black (bl4) pair 1 each time 3 and 4 are consecutive (either order) with 3 on white, 4 on black
10 Thumb-on-Black (bl1) note+neighbours 1 if thumb on black; +2 if previous note white; +2 if next note white
11 Five-on-Black (bl5) note+neighbours finger 5 on black: 0 base; +2 if previous white; +2 if next white
12 Thumb-Passing (pa1) pair 1 per thumb/finger pass on same level (W→W or B→B); 3 if lower note white by non-thumb and upper black by thumb

Evaluation. 28 pianists fingered the openings of 7 Czerny studies (op. 821 etc.); most pianist fingerings were among the model’s lowest-cost ones, but the model also ranks many fingerings pianists don’t use (Table 4 in the PDF lists per-rule scores of the top-10). Factor analysis (reported from Sloboda et al. 1998): rules 1,3,10,11 = “stretch” factor; 2,4,5 = “position change”; 6,7,8 = “agility”; 9 and 12 separate; five factors explained 78 % of variance. Known gaps (stated by authors): no tempo, no polyphony, no LH/RH interaction, semitone units ignore missing black keys (E–F, B–C), no finger substitution, rules not orthogonal. Code: none from the authors; pydactyl Parncutt class reproduces it (section 5).

2.2 Jacobs (2001)

“Refinements to the ergonomic model for keyboard fingering of Parncutt, Sloboda, Clarke, Raekallio, and Desain”, Music Perception 18(4):505–511. DOI 10.1525/mp.2001.18.4.505. Publisher PDF behind a 403 wall for us; details below are from the abstract plus pydactyl’s Jacobs class and Balliauw 2017’s description (secondary).

2.3 Sloboda, Clarke, Parncutt & Raekallio (1998)

“Determinants of finger choice in piano sight-reading”, J. Exp. Psychol.: Human Perception and Performance 24(1):185–203. DOI 10.1037/0096-1523.24.1.185 (verified to resolve; text not read). Empirical companion to 2.1, as quoted in Parncutt 1997 fn. 22: 17 pianists sight-read 7 Czerny studies twice (~30 000 fingered notes). Finger transition 4→3 occurred 1663× vs 3→4 1142× (45 % more, p<.01) — the evidence for rule 8; other asymmetries (3→1 > 1→3, …) not modelled. Factor-analysis result above. Useful for us as priors for asymmetric transition costs.

2.4 Hart, Bosch & Tsai (2000)

“Finding optimal piano fingerings”, The UMAP Journal 21(2):167–177 (COMAP, members only: https://comap.org/membership/member-resources/item/finding-optimal-piano-fingerings-umap). Monophonic DP: total cost = Σ local cost(finger pair, interval, key colours). Cost tables are indexed by (white/black → white/black) × finger pair × interval 0..12 semitones, values 1–4, 999 = forbidden (pydactyl ships the table as data/tables_0.dat, verified). Classic textbook DP example (MIT 6.006 lecture notes cite it). Code: pydactyl Hart/HartK; also https://github.com/tphamdo/fingerfy-slimmed (web DP demo).

2.5 Al Kasimi, Nichols & Raphael (2007)

“A simple algorithm for automatic generation of polyphonic piano fingerings”, ISMIR 2007 (Vienna), pp. 355–356. PDF: https://ismir2007.ismir.net/proceedings/ISMIR2007_p355_kasimi.pdf (verified; 2-page late-breaking paper; earlier 2005 ISMIR version cited by Yonebayashi).

2.6 Other rule-based work (brief)

2.7 Balliauw, Herremans, Palhazi Cuervo & Sörensen (2015, 2017)

Pair MinPrac MinComf MinRel MaxRel MaxComf MaxPrac
1-2 -10 -8 1 6 9 11
1-3 -8 -6 3 9 13 15
1-4 -6 -4 5 11 14 16
1-5 -2 0 7 12 16 18
2-3 1 1 1 2 5 7
2-4 1 1 3 4 6 8
2-5 2 2 5 6 10 12
3-4 1 1 1 2 2 4
3-5 1 1 3 4 6 8
4-5 1 1 1 2 4 6

Small and medium hands in their appendix (also in pydactyl as BALLIAUW_SMALL/MEDIUM_FINGER_SPANS, e.g. small 1-5: −2,0,7,10,12,14; medium 1-5: −2,0,7,12,14,16).

2.8 Badgerow variant (pydactyl)

Pianist Justin Badgerow’s edits to Parncutt in pydactyl (Badgerow class): adjusted spans (e.g. 1-2 MaxComf 9, 1-3 MinRel 1, MaxComf 11), plus new rules: Alternation-Pairing (+1 for 3-4-3, 4-3-4, 4-5-4, 5-4-5), Alternation-Finger-Change (+1 when n1==n3 but f1≠f3), Thumb-on-Black-to-Weak, Black-Thumb-Pivot. Unpublished as a paper; documented in code.


3. Statistical and learned models

3.1 Yonebayashi, Kameoka & Sagayama (2007)

“Automatic decision of piano fingering based on a hidden Markov models”, IJCAI 2007, pp. 2915–2921. PDF: http://ijcai.org/Proceedings/07/Papers/469.pdf (verified).

3.2 Nakamura, Ono & Sagayama (2014) — merged-output HMM

“Merged-output HMM for piano fingering of both hands”, ISMIR 2014, pp. 531–536. Jointly decides hand assignment and fingering from a single note stream (two hand HMMs whose outputs are merged). Still the reference for statistical hand separation.

3.3 Nakamura, Saito & Yoshii (2020) — “Statistical learning and estimation of piano fingering”

Information Sciences 517:68–85, DOI 10.1016/j.ins.2019.12.068; arXiv:1904.10237 (verified v2). Accompanying page with source code (C++), trained results and visualiser: https://statpianofingering.github.io/demo.html

Method M_gen M_high M_soft M_rec
1st HMM 61.7 68.3 82.8 74.0
2nd HMM 64.3 70.8 85.3 77.6
3rd HMM 64.5 71.0 85.5 77.8
Chord HMM 61.2 67.7 81.7 73.8
DNN FF 61.5 66.2 82.5 69.5
DNN LSTM 61.3 66.1 82.8 69.5
Human 71.4 79.1 90.8 84.3

Conclusions: high-order HMMs best; DNNs weaker on sequential consistency (M_rec); limitations = ignores phrase boundaries/rests and inter-hand dependence. Learning-curve: ~2 % more M_gen expected from more data.

3.4 Zhao, Guan & Li (Guan et al.) 2022 — PdF model

“Estimation of playable piano fingering by pitch-difference fingering match model”, EURASIP J. Audio, Speech, Music Process. 2022 (preprint arXiv:2108.09058, verified). Input = pitch-difference sequence; BiLSTM learns PdF mapping; combined with prior finger-transfer rules to guarantee playability; new metric IFR (“incapable-performing fingering rate”, fraction of unplayable transitions). Claims +3 % M_gen and +1.6 % M_high over 3rd-order HMM with IFR = 0. Code: not found.

3.5 Ramoneda, Jeong, Nakamura, Serra & Miron (2022)

“Automatic piano fingering from partially annotated scores using autoregressive neural networks”, ACM Multimedia 2022, DOI 10.1145/3503161.3548372. PDF: https://eita-nakamura.github.io/articles/Ramoneda_PianoFingeringFromPartiallyAnnotatedScores_2022.pdf (verified). Code https://github.com/PRamoneda/Automatic-Piano-Fingering, eval framework https://github.com/PRamoneda/APF_eval, ThumbSet data https://doi.org/10.5281/zenodo.6433702.

3.6 Srivatsan & Berg-Kirkpatrick (2022) — checklist models

“Checklist models for improved output fluency in piano fingering prediction”, ISMIR 2022, arXiv:2209.05622 (verified). BiLSTM encoder + “checklist” of recently used fingers and their keyboard positions fed to an autoregressive MLP; trained with cross-entropy then REINFORCE to penalise disfluent patterns. Inputs: relative-distance or lattice encoding beats one-hot MIDI (Bi-LSTM M_gen 66.7 → 69.6). New fluency metrics: anchored 4-gram precision, thumb crosses, thumbless crosses, crossed chords, hops (same finger, different consecutive notes), smears (one finger, 2 chord notes), step spread / chord spread (semitones per finger). HMM-3 has the best M_gen (70.2 in their protocol) and 4-gram (39.5) but many thumbless crosses; checklist + REINFORCE cut hops/smears drastically (e.g. 334→53 smears) at similar M_gen; human raters preferred it. Lesson: per-note accuracy alone hides unplayable output — measure fluency too. Code: not located.

3.7 Randolph, Di Eugenio & Badgerow (2023) — CRF

“Modeling piano fingering decisions with conditional random fields” (2023): http://nlp.lab.uic.edu/wp-content/uploads/sites/314/2023/06/Randolph_CRF2.pdf (verified). Linear-chain CRF with hand-engineered features (Parncutt-style); new corpora (scales, arpeggios, broken chords, Beringer, “L1full”); on PIG 5-fold CV of training set, weighted M_gen 67.07 %; on the official test split CRF slightly ahead on M_gen, HMM ahead on relaxed metrics. Important critique: PIG’s “channel” field is the hand that actually played the note, not the staff — so evaluating on PIG with given hands leaks hand assignment. Earlier: Randolph & Di Eugenio, “Dactylize” data collection; DHCS 2014 paper (http://nlp.cs.uic.edu/PS-papers/DRandolph-DHCS14.pdf).

3.8 2023–2026 work (selection)


4. Datasets and evaluation

4.1 PIG (PIano fingerinG) dataset

Page: http://beam.kisarazu.ac.jp/research/PianoFingeringDataset/ (verified; v1.12, 2022-05-12).

4.2 Metrics (Nakamura 2020 §6.2)

With ground truths G_1..G_K for a piece of N notes and estimate E:

4.3 Other data

ThumbSet (2523 partial, Zenodo), Moryossef 150 K-note video set, PianoVAM, FürElise (HF: https://huggingface.co/datasets/rcwang/for_elise; 153 pieces, 15 pianists, ~10 h, 3-D MANO motion + MIDI), PianoMotion10M (116 h, 10 M frames, MANO from bird’s-eye video, CC BY-NC-SA).


5. Software

Tool Lang / licence What it does
pydactyl (David Randolph) https://github.com/dvdrndlph/pydactyl Python, MIT Framework: Parncutt, Jacobs, Badgerow, Balliauw (approx.), Hart, Sayegh, Random; rulers (semitone, physical mm, imaginary-black-key); networkx k-shortest paths; PIG/abcD I/O; Nakamura metrics. Best reference for exact rule code.
pianoplayer (Marco Musy) https://github.com/marcomusy/pianoplayer Python, MIT, v3.0.x 2026, ~900★ Velocity-minimising combinatorial search; MusicXML/MIDI/PIG in; vedo 3-D playback; hand sizes XXS–XXL.
Nakamura HMM code https://statpianofingering.github.io/demo.html C++ (README in zip) 1st–3rd-order HMM, chord HMM, training, all four metrics.
Balliauw VNS http://dorienherremans.com/automatic-piano-fingerings C++ Polyphonic VNS, MusicXML I/O, hand sizes.
Ramoneda APF https://github.com/PRamoneda/Automatic-Piano-Fingering Python/PyTorch ArLSTM/ArGNN, PIG split, eval.
Kanma/piano-fingering https://github.com/Kanma/piano-fingering Python Older generator with VPython 3-D player (pianoplayer’s ancestor style).
fingerfy-slimmed https://github.com/tphamdo/fingerfy-slimmed JS web Hart-style DP in the browser.
MuseScore — Displays/edits fingering (MusicXML <fingering>) but has no automatic fingering generator (pianoplayer is the usual add-on, -m opens output in MuseScore).

pianoplayer algorithm details (from hand.py, verified):


6. Hand motion and animation: from fingering to pose

System Hand model Fingering source Pose generation
pianoplayer + vedo Stylised boxes/spheres per finger own optimiser Each finger’s x = its tracked position (above), key press = vertical dip; hand body follows finger 3; no joint IK.
Kanma piano-fingering VPython primitives own same idea, chords as rapid sequence.
emrecancubukcu/roboPianist (Unity, GPL-3.0) https://github.com/emrecancubukcu/roboPianist Rigged character (Mixamo/Fuse) C# port of Kanma’s fingering Full-body IK (SAFullBodyIK) to fingertip targets; unfinished (wrist rotation, IK reach issues listed as TODO). Closest to what we want visually.
RoboPianist (Zakka et al., CoRL 2023, arXiv:2304.04150, https://github.com/google-research/robopianist) 2 × Shadow Hand (22 actuators each) in MuJoCo, 88 spring keys PIG fingerings → “REPERTOIRE-150” MIDI with labels Deep RL (DroQ); rewards = key press + fingering (fingertip-to-assigned-key distance) + energy; lookahead of future goals; without the fingering reward F1 stays ≈ 0.
PianoMime (Qian et al., 2024, arXiv:2407.18178, OpenReview t0LkF9JnVb) Shadow Hands YouTube top-view video: MediaPipe fingertips + MIDI IK + residual RL with style reward (track human fingertips) + task reward; distilled to generalist (≈ 56 % F1 unseen songs).
RP1M / OmniPianist (2024–25) robot hands per-step optimal transport fingertip→key RL specialists → 1 M trajectories → flow-matching transformer.
FürElise (Wang, Xu, Shi, Schumann, Liu, SIGGRAPH Asia 2024, DOI 10.1145/3680528.3687703, https://for-elise.github.io/) MANO implicit (diffusion output gives finger order/placement) Capture: multi-view video → 2-D keypoints → triangulate → MANO fit → IK refinement with Disklavier key events. Synthesis: diffusion model (score → reference motion), music-similarity motion retrieval, then physics policy with discriminators (imitation + RL). Code “to be released”.
PianoMotion10M (Gan et al., 2024, arXiv:2406.09326, https://github.com/agnjason/pianomotion10m) MANO none explicit Audio → position predictor (hand x/z) → position-guided diffusion gesture generator; metrics FGD/WGD/FID, position distance, smoothness.
Cascaded synthesis via fingertip priors (arXiv:2604.09692, 2026), PianoFlow (arXiv:2604.12856) MANO — Fingertip-first then full-hand; streaming.

Recurring patterns worth copying:


7. Comparison

Method Year Type Polyphony Hands Eval Code
Parncutt et al. 1997 12 rules + shortest path no RH (LH mirror) Czerny openings vs 28 pianists pydactyl
Hart, Bosch, Tsai 2000 cost table + DP no one qualitative pydactyl
Jacobs 2001 refined rules, mm distances no one Czerny, better top-k pydactyl
Yonebayashi et al. 2007 HMM, Gaussian outputs, hand-set (ext.) RH qualitative no
Al Kasimi et al. 2007 chord trellis, vertical+horizontal yes one (given) qualitative no
Lin & Liu 2006 online Parncutt no — tutor demo no
Nakamura et al. MO-HMM 2014 merged-output HMM yes both, joint split own data (Nakamura)
Balliauw et al. 2015/17 15 rules, tabu/VNS yes both (given) qualitative; PIG M_gen 56.7 (14 pcs) C++
Nakamura et al. 2020 1–3rd-order HMM, chord HMM yes (30 ms) given PIG M_gen 64.5 C++
Zhao/Guan et al. 2022 BiLSTM PdF + priors partial given PIG +3 % M_gen vs HMM3 no
Ramoneda et al. 2022 ArGNN/ArLSTM, beam yes (GNN) given PIG M_gen 66.8 yes
Srivatsan & B-K 2022 checklist + REINFORCE yes given PIG M_gen ~69 (their protocol), fluency no
Randolph et al. 2023 CRF yes given PIG M_gen ≈ HMM pydactyl
pianoplayer 2017–26 velocity search, window 5–9 yes both (given parts) none published MIT
Penner & Hindle 2026 HMM/N-gram/rules yes joint split 90.8 % PIG joint 56.6 % ?

(M_gen values across papers use slightly different protocols — e.g. Srivatsan’s HMM-3 reads 70.2 vs Nakamura’s 64.5 — compare only within a table.)


Goal: JavaScript, in-browser, fingering for full MIDI files (both hands, chords, pedalled textures) fast enough to compute on load (< ~200 ms for a typical piece) and, optionally, incrementally while playing; output drives 3-D hands on the 028 grand piano.

8.1 Pipeline

  1. Parse MIDI → notes {pitch, on, off, vel, track, channel}. Merge sustain pedal only for audio; for fingering use key-up times (pedal doesn’t hold fingers).
  2. Slice: group onsets within Δ = 30 ms (Nakamura) into slices; each slice also lists notes still held from earlier slices (they keep their finger — Al Kasimi constraint).
  3. Hand split (section 8.2) → two note streams.
  4. Per hand: Viterbi / beam DP over chord-fingering states (8.3–8.5).
  5. Post-process: smooth isolated oddities (optional 2nd pass with trigram rules), emit per-note {hand, finger}; also emit per-slice hand anchor x for the animator.
  6. Animation layer (8.7) consumes {note, hand, finger, t_on, t_off}. Run steps 2–5 in a Web Worker; transfer typed arrays.

8.2 Hand split

8.3 State space (per hand, per slice)

8.4 Cost model (sum, all weights tunable)

Distances: physical. Key centre x in mm (pydactyl offsets, or our 028 piano’s key geometry), converted to “equivalent semitones” by dividing by 13.7 mm (Parncutt fn. 8) — or adopt Balliauw’s imaginary-black-key units and their 3 hand-size tables directly. Expose a hand-size scale factor (pianoplayer-style 0.6–1.2) that scales all Prac/Comf/Rel limits.

Vertical (inside a slice; Al Kasimi + Balliauw rule 14): for every finger pair in the chord, 2 × Stretch(Comf) + 2 × Rel-violation + 10 × Prac-violation, using the ascending-pair rows.

Horizontal (slice a → slice b): average over all (i∈a, j∈b) pairs (Al Kasimi) of

Time awareness (missing from Parncutt, present in pianoplayer and implicitly in data): multiply movement-related terms (stretch, position change, impractical) by g(Δt) = clamp(t0 / (Δt + 0.05 s), 0.2, 2) with t0 ≈ 0.25 s, so slow passages tolerate leaps and fast runs force compact positions; if the gap between slices > ~0.6 s or a rest occurs, replace horizontal cost with a small “re-position” cost (hand can lift; Nakamura’s identified failure mode: ignoring rests/phrase boundaries).

Optional learned layer: replace/augment horizontal cost with −log P(Δlattice | f1, f2) from a PIG-trained table (Nakamura 1st-order output probs, 5×5×31 numbers) — a lookup table, no runtime model. Only for local experiments, since PIG is non-commercial (see licence).

8.5 Decoding modes

8.6 Evaluation plan

8.7 Animation mapping (fingering → hand pose)

  1. Hand anchor per slice: x_hand = mean over pressed notes of (x_key − rest_offset[finger]), rest offsets from pianoplayer’s frest × hand scale; between slices move it with a critically damped spring whose time constant shrinks with Δt (arrive ~60–80 ms before the next onset). Wrist height/yaw: slight yaw toward the direction of travel; lower and pronate for thumb on black / passes.
  2. Fingertip targets: on press, tip at the key’s striking point (white keys ~10–15 mm from the front edge in our model, black keys at their front third), depressed with the key; free fingers relax toward rest offsets around the anchor, hovering ~8–12 mm above keys; thumb passes: thumb target moves under the palm (lower y, tucked z) before landing.
  3. Timing keyframes per note: lift-off of the previous use, approach (≈ 50–80 ms before t_on, scaled by tempo), contact at t_on synced to the key animation that already exists in grandpiano/grand-piano.js, hold until t_off, release.
  4. IK: per finger analytic planar 3-link solve (MCP flexion + PIP/DIP with DIP ≈ 2/3 PIP coupling) in the finger’s plane, plus MCP abduction to aim at the key; thumb as 3-link with CMC 2-DOF. Clamp joint limits; if unreachable, push the anchor (wrist) instead — the “fingertips first, hand second” scheme of PianoMime/FürElise refinement.
  5. Proportions: hand length L ≈ 18–19 cm (adult), segment lengths from Buchholz 1992 coefficients × L; scale with the same hand-size factor used by the fingering cost so that reach and fingering agree. Data-driven alternative later: FürElise (MANO trajectories + MIDI) could supply pose priors or retrieval clips; check its dataset licence on Hugging Face before using.

8.8 Summary of choices


9. References (URLs / DOIs checked Oct 2026)

  1. Parncutt R., Sloboda J.A., Clarke E.F., Raekallio M., Desain P. (1997). Music Perception 14(4):341–382. DOI 10.2307/40285730. PDF (author): see 2.1.
  2. Jacobs J.P. (2001). Music Perception 18(4):505–511. DOI 10.1525/mp.2001.18.4.505.
  3. Sloboda J.A., Clarke E.F., Parncutt R., Raekallio M. (1998). JEP:HPP 24(1):185–203. DOI 10.1037/0096-1523.24.1.185.
  4. Hart M., Bosch R., Tsai E. (2000). UMAP Journal 21(2):167–177. COMAP link in 2.4.
  5. Al Kasimi A., Nichols E., Raphael C. (2007). ISMIR 2007. https://ismir2007.ismir.net/proceedings/ISMIR2007_p355_kasimi.pdf
  6. Yonebayashi Y., Kameoka H., Sagayama S. (2007). IJCAI 2007. http://ijcai.org/Proceedings/07/Papers/469.pdf
  7. Lin C.-C., Liu D.S.-M. (2006). VRCIA 2006. DOI 10.1145/1128923.1128986.
  8. Viana et al. (2003). SBCM. https://compmus.ime.usp.br/sbcm/2003/researchpapers/sbcm-researchpaper-2003-0.pdf
  9. Radicioni D., Anselma L., Lombardo V. (2004). CIM04. URL in 2.6; Radicioni & Lombardo (2007) Constraints, DOI 10.1007/s10601-007-9015-y.
  10. Balliauw M. et al. (2015). MCM 2015, DOI 10.1007/978-3-319-20603-5_15.
  11. Balliauw M., Herremans D., Palhazi Cuervo D., Sörensen K. (2017). ITOR 24(3):509–535. DOI 10.1111/itor.12211.
  12. Nakamura E., Ono N., Sagayama S. (2014). Merged-output HMM for piano fingering of both hands. ISMIR 2014, 531–536.
  13. Nakamura E., Saito Y., Yoshii K. (2020). Information Sciences 517:68–85. DOI 10.1016/j.ins.2019.12.068; arXiv:1904.10237; code https://statpianofingering.github.io/demo.html
  14. PIG dataset: http://beam.kisarazu.ac.jp/research/PianoFingeringDataset/
  15. Zhao H., Guan X., Li Q. (2022). Estimation of playable piano fingering by pitch-difference fingering match model. EURASIP JASMP; arXiv:2108.09058.
  16. Ramoneda P., Jeong D., Nakamura E., Serra X., Miron M. (2022). ACM MM. DOI 10.1145/3503161.3548372.
  17. Srivatsan N., Berg-Kirkpatrick T. (2022). ISMIR. arXiv:2209.05622.
  18. Randolph D.A., Di Eugenio B., Badgerow J. (2023). CRF paper, URL in 3.7.
  19. pydactyl: https://github.com/dvdrndlph/pydactyl (MIT).
  20. pianoplayer: https://github.com/marcomusy/pianoplayer (MIT), PyPI pianoplayer.
  21. Zakka K. et al. (2023). RoboPianist. CoRL 2023. arXiv:2304.04150; https://github.com/google-research/robopianist
  22. Qian C., Urain J., Zakka K., Peters J. (2024). PianoMime. arXiv:2407.18178 (OpenReview t0LkF9JnVb); https://pianomime.github.io/
  23. Zhao Y. et al. (2024). RP1M. arXiv:2408.11048. Chen L., Zhao Y. et al. (2025) OmniPianist, arXiv:2511.02504.
  24. Wang R., Xu P., Shi H., Schumann E., Liu C.K. (2024). FürElise. SIGGRAPH Asia 2024. DOI 10.1145/3680528.3687703; arXiv:2410.05791; https://for-elise.github.io/
  25. Gan Q., Wang S., Wu S., Zhu J. (2024/25). PianoMotion10M. arXiv:2406.09326; https://github.com/agnjason/pianomotion10m
  26. Moryossef A. et al. (2023). Extracting piano fingering instructions from videos. arXiv:2303.03745.
  27. Kim Y. et al. (2025). PianoVAM. ISMIR 2025. arXiv:2509.08800.
  28. Penner D., Hindle A. (2026). arXiv:2609.28787.
  29. PiAnnotate (2026) arXiv:2605.23982; Cascaded piano hand motion synthesis (2026) arXiv:2604.09692; PianoFlow (2026) arXiv:2604.12856.
  30. Buchholz B., Armstrong T.J., Goldstein S.A. (1992). Ergonomics 35(3):261–273. https://pubmed.ncbi.nlm.nih.gov/1572336/
  31. emrecancubukcu/roboPianist (Unity, GPL-3.0): https://github.com/emrecancubukcu/roboPianist ; Kanma/piano-fingering: https://github.com/Kanma/piano-fingering