Piano Checklist

ํ”ผ์•„๋…ธ MIDI ์ˆ˜์ • ์ฒดํฌ๋ฆฌ์ŠคํŠธ v1

Version: 1.0

Date: 2026-02-11

Purpose: MIDI ๋ Œ๋”๋ง ์ „ ๊ธฐ๊ณ„์Œ ์ œ๊ฑฐ ์ฒดํฌ๋ฆฌ์ŠคํŠธ. Claude B ๋ถ„์„ ๊ฒฐ๊ณผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ.

---

์‚ฌ์šฉ ํƒ€์ด๋ฐ

MIDI ์ดˆ์•ˆ ์™„์„ฑ
    โ†“
Claude B ๋ถ„์„ (midi-analysis-prompt.md)
    โ†“
โ˜… ์ด ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋กœ ์ˆ˜์ • ํ•ญ๋ชฉ ํ™•์ธ โ˜…
    โ†“
humanize-midi.py ์‹คํ–‰ (์ž๋™ ์ˆ˜์ •)
    โ†“
๋ Œ๋”๋ง (FluidSynth)
    โ†“
๊ท€๋กœ ํŒ์ •

---

์ฒดํฌ๋ฆฌ์ŠคํŠธ

1. ๋ฒจ๋กœ์‹œํ‹ฐ (Velocity)

| # | ํ•ญ๋ชฉ | ๊ธฐ์ค€ | ์ž๋™ ์ˆ˜์ •? |

|---|------|------|-----------|

| V1 | ๋ฒจ๋กœ์‹œํ‹ฐ ํ‘œ์ค€ํŽธ์ฐจ ฯƒ โ‰ฅ 12 | ฯƒ < 5 = ๊ธฐ๊ณ„ | YES โ€” humanize-midi.py |

| V2 | ๋ฒจ๋กœ์‹œํ‹ฐ ๋ฒ”์œ„ โ‰ฅ 60 (min~max) | range < 30 = ์ฃฝ์€ ๋‹ค์ด๋‚˜๋ฏน | YES |

| V3 | ํ”„๋ ˆ์ด์ฆˆ ์‹œ์ž‘ ๋…ธํŠธ ๋ฒจ๋กœ์‹œํ‹ฐ ์•ฝ๊ฐ„ ๋†’์Œ | ํ”„๋ ˆ์ด์ฆˆ ์ฒซ ์Œ +5~+10 | ์ˆ˜๋™ ๊ถŒ์žฅ |

| V4 | ํ”„๋ ˆ์ด์ฆˆ ๋ ๋…ธํŠธ ๋ฒจ๋กœ์‹œํ‹ฐ ์•ฝ๊ฐ„ ๋‚ฎ์Œ | ํ”„๋ ˆ์ด์ฆˆ ๋งˆ์ง€๋ง‰ ์Œ -5~-10 | ์ˆ˜๋™ ๊ถŒ์žฅ |

| V5 | ์—ฐ์† ๋™์ผ ๋ฒจ๋กœ์‹œํ‹ฐ 3๊ฐœ ์ด์ƒ ์—†์Œ | ๊ฐ™์€ ๊ฐ’ 3์—ฐ์† = ๊ธฐ๊ณ„ | YES |

2. ํƒ€์ด๋ฐ (Timing)

| # | ํ•ญ๋ชฉ | ๊ธฐ์ค€ | ์ž๋™ ์ˆ˜์ •? |

|---|------|------|-----------|

| T1 | ๊ทธ๋ฆฌ๋“œ ์ •๋ ฌ๋ฅ  < 70% | > 90% = ๋กœ๋ด‡ | YES โ€” humanize-midi.py |

| T2 | ํ‰๊ท  ํƒ€์ด๋ฐ ํŽธ์ฐจ 10~30ms | < 5ms = ๋กœ๋ด‡, > 50ms = ๋ฐ•์ž ๋ฌด๋„ˆ์ง | YES |

| T3 | ์™ผ์†/์˜ค๋ฅธ์† ๋ฏธ์„ธ ์‹œ์ฐจ (3~10ms) | ๋™์‹œ ํƒ€๊ฑด = ๊ธฐ๊ณ„ | YES |

| T4 | ์•ฝ๋ฐ• ๋ฏธ์„ธ ์ง€์—ฐ (5~15ms late) | ์™„๋ฒฝํ•œ ์•ฝ๋ฐ• = ๊ธฐ๊ณ„ | ์ˆ˜๋™ ๊ถŒ์žฅ |

| T5 | ๋ฃจ๋ฐ”ํ†  ๊ตฌ๊ฐ„ (ํ…œํฌ ยฑ3~5%) | ์™„์ „ ์ •๋ฐ• = ๊ธฐ๊ณ„ | ์ˆ˜๋™ ๊ถŒ์žฅ |

3. ํŽ˜๋‹ฌ (Pedal)

| # | ํ•ญ๋ชฉ | ๊ธฐ์ค€ | ์ž๋™ ์ˆ˜์ •? |

|---|------|------|-----------|

| P1 | ์„œ์Šคํ…Œ์ธ ํŽ˜๋‹ฌ(CC64) ์ด๋ฒคํŠธ ์กด์žฌ | ์—†์Œ = ๋น„ํ˜„์‹ค | ์ˆ˜๋™ ์ถ”๊ฐ€ |

| P2 | ํŽ˜๋‹ฌ on/off ํƒ€์ด๋ฐ ๋ถˆ๊ท ์ผ | ์ •ํ™•ํžˆ ๋งˆ๋””์„  = ๊ธฐ๊ณ„ | ์ˆ˜๋™ |

| P3 | ํ•˜ํ”„ํŽ˜๋‹ฌ(CC64 ๊ฐ’ 0~127 ์‚ฌ์ด) ์‚ฌ์šฉ | on(127)/off(0)๋งŒ = ๋‹จ์กฐ | ์„ ํƒ |

4. ํ”„๋ ˆ์ด์ง• (Phrasing)

| # | ํ•ญ๋ชฉ | ๊ธฐ์ค€ | ์ž๋™ ์ˆ˜์ •? |

|---|------|------|-----------|

| F1 | ํ”„๋ ˆ์ด์ฆˆ ์‚ฌ์ด ๋ฏธ์„ธ ๊ฐญ (20~100ms) | ๋นˆํ‹ˆ ์—†์Œ = ๊ธฐ๊ณ„ | YES โ€” humanize-midi.py |

| F2 | ์ˆจ ์‰ฌ๋Š” ๊ตฌ๊ฐ„ ์‹๋ณ„ | 4~8๋งˆ๋””๋งˆ๋‹ค ์ž์—ฐ์Šค๋Ÿฌ์šด ๋Š๊น€ | ์ˆ˜๋™ |

| F3 | ํฌ๋ ˆ์„ผ๋„/๋””ํฌ๋ ˆ์„ผ๋„ ๋ฒจ๋กœ์‹œํ‹ฐ ๊ณก์„  | ์ง์„  ๋ณ€ํ™” = ๊ธฐ๊ณ„ | ์ˆ˜๋™ ๊ถŒ์žฅ |

5. ๊ธˆ์ง€ ์‚ฌํ•ญ (Do NOT Fix)

| # | ํ•ญ๋ชฉ | ์ด์œ  |

|---|------|------|

| X1 | ์Œ์ • ์ˆ˜์ • | ์Œ์ •์€ ์›๊ณก ๊ทธ๋Œ€๋กœ. ํ‹€๋ฆฌ๋ฉด MIDI ์ž์ฒด๊ฐ€ ์ž˜๋ชป๋œ ๊ฒƒ |

| X2 | ๋ฆฌ๋ฒ„๋ธŒ/์ดํŽ™ํŠธ ์ถ”๊ฐ€ | MIDI ๋‹จ๊ณ„์—์„œ ํ•˜์ง€ ๋งˆ๋ผ. ๋ Œ๋”๋ง ํ›„ ์ฒ˜๋ฆฌ |

| X3 | ๋…ธํŠธ ์ถ”๊ฐ€/์‚ญ์ œ | ํŽธ๊ณก ๋ณ€๊ฒฝ์€ ์ด ์ฒดํฌ๋ฆฌ์ŠคํŠธ ๋ฒ”์œ„ ๋ฐ– |

| X4 | ๊ณผ๋„ํ•œ ํœด๋จธ๋‚˜์ด์ฆˆ (ฯƒ > 25, dev > 40ms) | ์„œํˆฐ ์—ฐ์ฃผ โ‰  ์ทจํ•œ ์—ฐ์ฃผ |

| X5 | ๋ฒจ๋กœ์‹œํ‹ฐ 127 ์ œ๊ฑฐ | ํฌ๋ฅดํ‹ฐ์‹œ๋ชจ๋Š” ์‚ด๋ ค์•ผ ํ•œ๋‹ค |

---

ํŒ์ • ๊ธฐ์ค€

| ์ƒํƒœ | ์กฐ๊ฑด | ํ–‰๋™ |

|------|------|------|

| PASS | FAIL ํ•ญ๋ชฉ 0๊ฐœ | ๋ Œ๋”๋ง ์ง„ํ–‰ |

| NEEDS_WORK | FAIL 1~2๊ฐœ | humanize-midi.py ์‹คํ–‰ ํ›„ ์žฌ๋ถ„์„ |

| MACHINE | FAIL 3๊ฐœ+ | ์ˆ˜๋™ ์ˆ˜์ • ํ•„์š”. ์Šคํฌ๋ฆฝํŠธ๋งŒ์œผ๋กœ ๋ถˆ์ถฉ๋ถ„ |

---

์ดํ„ฐ๋ ˆ์ด์…˜ ๋กœ๊ทธ (์ˆ˜๊ธฐ)

| Iter | Date | File | Claude B ํŒ์ • | ๋‚ด ํŒ์ • | ์กฐ์น˜ |

|------|------|------|--------------|---------|------|

| | | | | | |

---

Built between shifts.