啊哈,又是我ziwulan,一个没有固定开场白的小编!
最近闲在家里,有事没事就发篇博文
希望你能给点赞
好的,进入主题——如何用C++制作电子琴呢?
很简单,这是我们主要的一个头文件:
#include
它包含了我们的主角——Beep
那么Beep是什么呢?
它在Windows.h里的定义是
WINBASEAPI BOOL WINAPI Beep(DWORD,DWORD);
翻译成人话,就是
Beep ( 音高 , 持续时间) ;
注意,这里的时间以毫秒为单位!!!
举个例子——
Beep(523,250);//523是音符do的音高
那么这就是演奏音符do,持续250毫秒
关于颜色函数呢,我也在之前的博文里有讲过
但我还是十分贴心地把注释放了过来
其主要目的是为了美观
为了省时间请自动忽略
void color(int a)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
/*
0 黑色 1 深蓝
2 绿色 3 青色
4 深红 5 深紫
6 深黄 7 浅灰(原色)
8 灰色 9 深青(深青比深蓝浅)
10亮绿 11亮蓝
12亮红 13粉色
14亮黄 15亮白
*/
音高表:
音符 | 对应音高 |
---|---|
do | 523 |
#do | 554 |
re | 578 |
#re | 622 |
mi | 659 |
fa | 698 |
#fa | 740 |
so | 784 |
#so | 831 |
la | 880 |
#la | 932 |
si | 988 |
注:#代表将原音符音高升高半音
说真的这应该让音乐老师告诉你们
两种方法——
前者简便,但是会出现这种情况:
啊啊啊啊啊,那个管理员是谁?!
所以,后者就好多了:
所以选哪个大家应该很清楚了~
#include
这个头文件到底有什么用呢?
记住这个函数——
getch();
getch的优点就是:可以不按回车键给变量赋值
但是getch也有缺点:只支持字符类变量
它也可以起到类似system(“pause”); 的作用,按任意键继续,但是并不会提示“请按任意键继续. . .”
#include
#include
#include
using namespace std;
void color(int a)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
int main()
{
SetConsoleTitle("电子琴");
char p;
int i = 0,a=523,ab=554,b=578,bc=622,c=659,d=698,de=740,e=784,ef=831,f=880,fg=932,g=988;color(11);
printf("Input 1,2,3,4,5,6,7,w(up),s(down)\n");color(10);
printf("Space to exit\n");color(14);printf("Shift up a half step");color(12);
printf("(only 1,2,4,5,6)\n");color(15);
while(i<100)
{
p = getch();
switch(p)
{
case '1':
Beep(a,250);
break;
case '!':
Beep(ab,250);
break;
case '2':
Beep(b,250);
break;
case '@':
Beep(bc,250);
break;
case '3':
Beep(c,250);
break;
case '4':
Beep(d,250);
break;
case '$':
Beep(de,250);
break;
case '5':
Beep(e,250);
break;
case '%':
Beep(ef,250);
break;
case '6':
Beep(f,250);
break;
case '^':
Beep(fg,250);
break;
case '7':
Beep(g,250);
break;
case 'w':
a*=2;ab*=2;b*=2;bc*=2;c*=2;d*=2;de*=2;e*=2;ef*=2;f*=2;fg*=2;g*=2;
break;
case 's':
a/=2;ab/=2;b/=2;bc/=2;c/=2;d/=2;de/=2;e/=2;ef/=2;f/=2;fg/=2;g/=2;
break;
case ' ':
return 0;break;
default:
break;
}
}
}
那么,感谢您对小编的支持,
我们下一篇博客见~
您的赞是对小编的最大支持!