【问题标题】:CS50 Pset3 music final calculationCS50 Pset3 音乐最终计算
【发布时间】:2018-09-25 15:33:07
【问题描述】:

我试图了解为什么我对此 Pset 的频率部分的最终计算没有正确计算。我正在通过调试器,它显示“步骤”计数正确,但计算不起作用。

#include <cs50.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
   string note = get_string("note:");
   {
      if (strlen(note) == 2)
      {
         int key = note[0];
         int octave = atoi(&note[1]);
         int steps = 0;

         if(key == 'A')
            {
               steps = (key - 65) + ((octave - 4) * 12);
            }

         float frequencyf = (440 * (pow(2, (steps / 12))));
         int frequency = (round(frequencyf));
         printf("%i", frequency);
      }

      else if (strlen(note) == 3)
      {
         int key = note[0];
         int accidental = note[1];
         int octave = atoi(&note[2]);
         int steps = 0;

         if(accidental == '#')
           {
               if(key == 'A')
               {
                  steps = ((key - 65) + ((octave - 4) * 12) + 1);
               }
            }
        else if(accidental == 'b')
            {
               if(key == 'A')
               {
                  steps = ((key - 65) + ((octave - 4) * 12) - 1);
               }
            }

         float frequencyf = (440 * (pow(2, (steps / 12))));
         int frequency = (round(frequencyf));
         printf("%i", frequency);
      }
   }
}

【问题讨论】:

  • 有一个cs50 stack exchange site如果你有兴趣。
  • 啊没看到,抱歉!
  • 请记住,在 C 语言中,整数除法会产生整数结果:1/2 == 05/2 == 2 等。如果您希望除法的结果是浮点值,则至少以下之一操作数必须是浮点类型。尝试将steps 除以12.0 看看是否没有帮助。

标签: c cs50


【解决方案1】:

在问题中,A4 的标准音高是 440 Hz。由于我们从 A4 键开始,我们创建一个半音数组并从 ASCII 中找到音值:

A  B  C  D  E  F  G
0  2 -9 -7 -5 -4 -2

int semitones[] = {0, 2, -9, -7, -5, -4, -2};
float tone = semitones[note[0] - 'A'];

变声记号#b 将音符升高或降低一个半音。但是我们不确定八度在音符中的位置,我们还需要找到它与第四个八度的区别。有不同的场景,所以 switch 语句效果很好:

int octave;
switch(note[1])
{
    case '#':
        tone++;
        octave = note[2];
        break;
    case 'b':
        tone--;
        octave = note[2];
        break;
    default:
        octave = note[1];
        break;
}
octave -= '4';

八度音阶的频率是 2 倍。A3 为 220 Hz,而 A5 为 880 Hz。所以

if (octave > 0)
    hz *= octave * 2;
else if (octave < 0)
    hz /= abs(octave * 2);

最后,一个音符的频率是 2^(n/12),其中 n 是 A4 的半音数:

if (tone < 0)
{
    tone *= -1;
    hz /= pow(2, tone / 12);
}
else if (tone > 0)
    hz *= pow(2, tone / 12);

【讨论】:

    猜你喜欢
    • 2019-04-22
    • 2020-09-04
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多