首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言中的音符长度计算器

C语言中的音符长度计算器
EN

Code Review用户
提问于 2016-09-23 00:02:34
回答 1查看 379关注 0票数 4

这是我第一个用C语言编写的程序,我只是在修改这个想法,因为我在一个基于音乐的课程上,而synth插件都使用毫秒作为它的时间。

任何改进,以使它更有效率或更少的依赖与一点解释,将是非常感谢的。

代码语言:javascript
复制
/* declarations */
int crotchet(int);
int semibreve(int);
int minim(int);
int quaver(int);
int semiquaver(int);
int demisemiquaver(int);

int main() {

int bpm;

/* Ask for note bpm */
printf("Enter bpm value:\n");
scanf("%d", &bpm);

/* returns note lengths from functions */
printf("Semibreve would last for... ");
printf("%d", semibreve(bpm));
printf(" miliseconds! \n");

return 0;
}

int crotchet(int bpm)
{
/*  1 second = 1000
 1 min = 60 seconds = 6000 miliseconds
 */

int crotchet;
crotchet = 6000 / bpm;

return crotchet;
}

int semibreve(int bpm)
{
int crot;
crot = crotchet(bpm);
int semibreve;
semibreve = crot * 4;

return semibreve;
}

int minim(int bpm)
{
int crot;
crot = crotchet(bpm);
int minim;
minim = crot * 2;

return minim;
}

同样适用于quaver (用2除以crot )、半quaver(除以4)和半quaver(除以8)。

对音乐理论的任何其他解释,我也会补充,如果要求。

EN

回答 1

Code Review用户

回答已采纳

发布于 2016-09-23 05:07:41

你的计算都是10倍:一分钟是60000毫秒,而不是6000毫秒。与其使用注释解释6000,不如将其写在代码中,编译器将为您解决这个问题。这种计算根本不会花费任何运行时性能。

我不推荐这种设计,每种类型的注释定义一个函数。我认为,一项功能应该涵盖一切。

既然使用printf()scanf(),就应该使用#include <stdio.h>

通常将main()放在末尾,这样您就不必事先声明它使用的函数。

代码语言:javascript
复制
#include <stdio.h>

#define SEMIBREVE       (1.0)
#define MINIM           (1.0/2)
#define CROTCHET        (1.0/4)
#define QUAVER          (1.0/8)
#define SEMIQUAVER      (1.0/16)
#define DEMISEMIQUAVER  (1.0/32)

int millisec(int bpm, double note) {
    return (int)(
        60      /* seconds */
        * 1000  /* milliseconds per second */
        * 4     /* crotchets per semibreve */
        * note
        / bpm
    );  
}    

int main() {
    int bpm;
    printf("Enter tempo (crotchets per minute): ");
    scanf("%d", &bpm);

    printf("Semibreve would last for... %d milliseconds!\n", millisec(bpm, SEMIBREVE));
    printf("Dotted crotchet would last for... %d milliseconds!\n", millisec(bpm, 1.5 * CROTCHET));
    printf("Demisemiquaver would last for... %d milliseconds!\n", millisec(bpm, DEMISEMIQUAVER));
}
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/142190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档