2012-10-29 144 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音。

也許有人可以告訴我如何在Android中合成鋼琴聲音?

回答

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