2009-12-11 6 views
8

Comment puis-je implémenter la fonction suivante en C#?Comment puis-je implémenter la fonction de fréquence de touches de piano en C#?

alt text

+0

Je vous suggère de vous familiariser avec System.Math.Pow - http://msdn.microsoft.com/en-us/library/system .math.pow (VS.71) .aspx - cela vous permettra de gérer à la fois les exposants et les n-racines. –

+16

Construire un piano, êtes-vous? –

+0

Comment est-ce un piano? Quelqu'un veut-il expliquer les pls? –

Répondre

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

+1 pour appeler Math.Pow une seule fois – ram

+0

Vous avez raison, l'équation peut être simplifiée à votre réponse, mais j'ai fait une mise en œuvre directe. –

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

+1, strict au point –

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) 

so ....

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

Et depuis la racine 12 2 = 1.0594630943592952645618252949463, puis

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

so ...

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

J'espère que si cette solution est utilisée, un commentaire est placé pour la maintenabilité. –

+0

Vous êtes sûr que les maths ont raison? Essayez n = 49. Vous devriez obtenir 440. –

+0

bonne prise 12e racine de 2 = 1,059463094359295264562525949463, pas .083333333333333 ... J'ai couru Windows mal calc ... J'ai édité pour corriger. –

Questions connexes