피아노 물리 모델 실험 — C4 한 음
펠트 해머(비선형 스프링) + 강성 현 유한차분(FDTD). 매개변수 = Chaigne & Askenfelt 1994 의 C4. 샘플 없음. 향판 없음(현이 브리지에 주는 힘을 그대로 들음). 실행 40초.
0. 들어보기
모든 파일은 최대 음량을 같게 맞췄다. 세기 차이는 음량이 아니라 음색으로 들린다.
E1. 배음이 정수배보다 위로 늘어나는가
피아노 현은 뻣뻣하다. 그래서 높은 배음이 정수배보다 올라간다. 이론식은 fn = n·f0·√(1+B·n²) 이다. 모델 소리에서 배음 16개를 찾아 정수배와 비교했다.
모델은 이론과 같은 방향으로 늘어난다. 그러나 높은 배음일수록 이론보다 조금 낮다(16번 −10.8 cent). 이것은 유한차분 격자가 만드는 수치 분산이다. 그래서 측정한 B 가 입력보다 13% 작다.
오버샘플을 2배로 하면 오차가 약 절반이 되고 계산 시간은 2배가 된다. 현재 기본값은 2배(오디오 1초에 약 0.7초). 대안: 입력 B 를 미리 키워 보정한다(다음 단계 후보).
E2. 해머가 친 자리에서 배음이 사라지는가
현의 길이 β 지점을 치면, 그 지점이 마디(움직이지 않는 점)인 배음은 거의 울리지 않는다. β=1/8 이면 8·16번, β=1/5 이면 5·10·15번이 사라져야 한다. 실제 피아노는 1/7~1/9 근처를 쳐서 귀에 거슬리는 7·9번 배음을 줄인다.
β=1/8 에서 8번 배음이 이웃보다 29.5 dB 낮다. β=1/5 에서는 5·10·15번이 꺼지고 8번은 거의 그대로다(2.1 dB). 반대 대조가 통과했다 — 골이 아무 데나 생기는 것이 아니다.
E3. 세게 칠수록 밝아지는가
해머 펠트는 누를수록 단단해진다(힘 ∝ 압축2.5). 그래서 세게 치면 접촉이 짧아지고 고음 성분이 늘어난다. 이것이 피아노의 세기별 음색 차이다.
벽을 칠 때 접촉 시간은 속도의 -0.43 제곱에 비례했다. 이론값 -0.43 과 같다(수치 풀이 검증). 현을 칠 때는 -0.13 제곱으로 훨씬 덜 줄었다. 현이 밀려나며 해머를 받아주기 때문이다. 벽 모델로 피아노 해머를 예측하면 틀린다.
E4. 배음마다 감쇠 시간이 맞는가
| 배음 | 이론 T60 (s) | 측정 T60 (s) | 오차 |
|---|---|---|---|
| 1 | 10.00 | 10.00 | +0.00% |
| 2 | 8.89 | 8.89 | +0.00% |
| 4 | 6.14 | 6.15 | +0.04% |
| 8 | 2.75 | 2.76 | +0.33% |
이 검사는 "스킴이 입력한 손실식을 그대로 구현했는가"만 확인한다. 실제 피아노의 두 단계 감쇠(빠른 초기 감쇠 → 긴 여운)는 한 음에 현 2~3줄이 함께 울려야 생긴다. 이 모델은 현이 1줄이라 그 현상이 없다.
남은 것
- 향판: 지금은 브리지 힘을 바로 듣는다. 그래서 소리가 얇고 "현만" 들린다. @dsedb 는 판 FDTD, @tnayuki 는 샘플 기반 파라미터로 이 부분을 풀었다.
- 현 2~3줄(유니즌): 미세하게 어긋난 현들이 맥놀이와 두 단계 감쇠를 만든다.
- 수치 분산 보정: 입력 B 를 미리 키워 측정 B 를 목표에 맞춘다.
- 다른 음: 저음(감긴 현)과 고음의 매개변수.
코드: ~/projects/instrument-physics · 테스트 python3 -m pytest tests · 실험 python3 experiments/run_piano.py