2012-10-29 2 views
1

SoundPool에서 재생 속도를 사용하여 피아노 사운드를 합성하려고합니다. 나는 소리가 나긴하지만 ... 그렇게 못 생겼어. 올바른 사운드 주파수 근처에서 들리지만 정확하게는 아닙니다. 내가 (조금) 때로는 낮은 필요보다 때로는 더 높은 소리 - 그러나 그것은 어디 :Android : 피아노 사운드 합성 방법

float shift; 
for (int i = 0; i < 13; i++) { 
    shift = (float) i/12f; 
    soundPool.play(soundID, 1, 1, 1, 0, (float) 1f + shift); 
    try { 
     Thread.sleep(1500); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

이상한 소리 : soundID이 -로드 피아노 C4 노트입니다.

안드로이드에서 피아노 사운드를 합성하는 법을 누군가가 알 수 있습니까?

답변

2

당신의 가장 큰 문제는 대신, 소리의 피치를 변경 잘못된 연산을 사용하고 있습니다 :

shift = (float) i/12f; 

사용한다 : 그런

shift = pow(pow(2.0, 1/12.0), (float) i) 

또는 무언가를.

당신의 또 다른 문제는 실시간 변환의 품질이 보통 나쁘다는 것입니다. 12 가지 키 톤을 사전 설정 한 다음 2x, 3x 등 피치를 변경하는 것이 좋습니다. 간단히 매 n 번째를 삭제하면됩니다. 견본. 또한 내가 너라면, 전체 키보드를 미리 샘플링 할 것이다. (화면 공간이 제한되어 있기 때문에 애플리케이션에 20-25 개 이상의 키가 거의 필요 없다.)이 모든 소리를 SoundPool에로드하고 언제든지.

+0

와우. 그것은 작동합니다 :)이 포뮬러는 어디서 났습니까? : – JavaRunner

+3

음악 학교 7 년 =) – lenik

-1

MIDI를 사용하여이 작업을 수행 할 수 있습니다.

http://docs.oracle.com/javase/1.4.2/docs/api/javax/sound/midi/package-summary.html

+1

Android에 javax.sound.midi가 없습니다. – Simon

+1

하지만 안드로이드는 미디 파일을 재생할 수 있습니다. 일반 자바에서 모든 미디 파일을 생성하면 안드로이드에서 재생할 수 있습니다 :) – JavaRunner

+0

일부 장치에서는 항상 추가되거나 추가되지 않는 타사 라이브러리가 있습니다. 나는 안드로이드가 MIDI에 대한 네이티브 지원을하지 않는다고 간단히 말하고있다. – Simon

관련 문제