2009-12-11 58 views
8

如何在C#中實現以下功能?如何在C#中實現鋼琴鍵頻率功能?

alt text

+0

我建議你熟悉System.Math.Pow - http://msdn.microsoft.com/en-us/library/system .math.pow(VS.71).aspx - 這將允許你處理指數和第n根。 – 2009-12-11 23:37:10

+16

製造一架鋼琴,是嗎? – 2009-12-12 00:25:19

+0

這是一架鋼琴嗎?任何人都在意解釋嗎? – 2009-12-14 22:54:48

回答

34
double F = 440.0 * Math.Pow(2.0, (n-49.0)/12.0); 
+3

+1,僅用於調用Math.Pow一次 – ram 2009-12-11 23:44:03

+0

你是對的,方程可以簡化爲你的答案,但我做了一個直接的實現。 – 2009-12-11 23:44:53

13
440 * Math.Pow(Math.Pow(2, 1.0/12), n - 49) 
+0

+1,嚴格指向 – 2009-12-11 23:39:48

2
440 * 12th root of 2 raised to n-49 
= 440 * (2^1/12) ^(n-49) 
= 440 * 2^(n/12)/2^(49/12) 
= 440 * 2^(n/12)/(2^4 * 2^1/12) 
= 440 * (1/2^4) * 2^((n-1) /12) 
= 8 * 55 * (1/16) * 2^((n-1) /12) 
= 27.5 * 2^((n-1) /12) 

所以....

double d = 27.5 * Math.Pow(2, (n-1)/12.0) 

而且,由於2 = 1.0594630943592952645618252949463 12根, 然後

double d = 27.5 * Math.Pow(1.0594630943592952645618252949463, (n-1)) 

所以......

double d = 27.5 * Math.Pow(1.059463094359295, (n-1)); 
+0

我希望如果使用這個解決方案,就可維護性發表評論。 – 2009-12-12 03:06:39

+0

你確定數學是正確的?嘗試n = 49.你應該得到440. – 2009-12-12 05:27:56

+0

良好的抓住12的根2 = 1.0594630943592952645618252949463,而不是.083333333333333 ...我跑了Windows calc嚴重...我編輯糾正。 – 2009-12-12 16:11:52