|
![]() | 作者: 286 [unique]
![]() |
登录 |
1 作这样的程序,关键点就是两个,一为按键处理.一为发声处理. 2 按键处理定义如下: 低音1,2,3,4,5,6,7 : Shift+1,2,3,4,5,6,7 中音1,2,3,4,5,6,7 : 1,2,3,4,5,6,7 高音1,2,3,4,5,6,7 : Ctrl+1,2,3,4,5,6,7 3 TC2.0中有一个函数sound()可以使扬声器发出指定频率的音.这样以来只是找到对应的频率就可以发音了.关闭声音是nosound()函数. 4 完整的源程序如下: /******************************************/ /** Electron by 286 1997.10.31 **/ /******************************************/ #include <graphics.h> #define ESC 27 #define SHIFT_1 33 #define SHIFT_2 64 #define SHIFT_3 35 #define SHIFT_4 36 #define SHIFT_5 37 #define SHIFT_6 94 #define SHIFT_7 38 #define CTRL_1 376 #define CTRL_2 377 #define CTRL_3 378 #define CTRL_4 379 #define CTRL_5 380 #define CTRL_6 381 #define CTRL_7 382 #define F1 315 void Init(); void Select(); void Quit(); int GeyKey(); void Sound(int level,int no); void Quit(); void Help(); int i,j,Key; unsigned int Seconds=0; int Freq[3][7]={131,147,165,176,196,220,247, 262,296,330,349,392,440,494, 523,587,659,699,784,880,988}; /*每个音的频率*/ int main() { Init();/*初始化图形并画出键盘*/ for(;;) { Seconds++; if (Seconds==50000) {Seconds=0;nosound();} /*对每个频率的音都要有一定的延时*/ if (kbhit()) Select();/*判断按了什么键*/ } } void Select() { Seconds=0; nosound(); Key=GetKey(); if (Key>48 && Key<56) Sound(1,Key-49); if (Key>375 && Key<383) Sound(2,Key-376); switch(Key) { case SHIFT_1:Sound(0,0);break; case SHIFT_2:Sound(0,1);break; case SHIFT_3:Sound(0,2);break; case SHIFT_4:Sound(0,3);break; case SHIFT_5:Sound(0,4);break; case SHIFT_6:Sound(0,5);break; case SHIFT_7:Sound(0,6);break; case ESC:nosound();Quit();break; case F1:Help();break; default:break; } } void Sound(int level,int no) { int frequant=Freq[level][no]; sound(frequant); /*以下为在键盘上画按键*/ setfillstyle(9,BLACK); bar((level*7+no)*30+8,210,(level*7+no)*30+32,257); for (i=0;i<20;i++) { if (kbhit()) { nosound(); delay(100); break; } else delay(200); } setfillstyle(1,WHITE); bar((level*7+no)*30+8,210,(level*7+no)*30+32,257); } void Quit() { int ch; setcolor(YELLOW); outtextxy(400,280,"Are You Sure (Yes/no)?"); ch=getche(); if (ch=='y'||ch=='Y') { closegraph(); delay(100); exit(0); } setcolor(DARKGRAY); outtextxy(400,280,"Are You Sure (Yes/no)?"); } void Help() { unsigned Save; void *Buf; Save=imagesize(160,120,500,360); Buf=(void *)malloc(Save); getimage(160,120,500,360,Buf); setfillstyle(1,YELLOW); bar(160,120,500,280); setcolor(RED); rectangle(160,120,500,280); rectangle(161,121,499,279); outtextxy(170,130," Help "); outtextxy(170,140," "); outtextxy(170,190," NOT everyone can be the Firstman"); outtextxy(170,250," "); outtextxy(170,260," Good Luckly to You !!! "); getch(); putimage(160,120,Buf,0); free(Buf); } void HotKey() { setusercharsize(3,3,1,1); setcolor(RED); outtextxy(280,70,"Dian Zi Qin"); outtextxy(310,90,"Ver 1.0"); outtextxy(440,300,"Copyright(c) by"); outtextxy(450,320,"Mr. Unique"); outtextxy(440,340,"1997.10.31"); } void Init() { int GraphDriver=DETECT,GraphMode; initgraph(&GraphDriver,&GraphMode,""); setfillstyle(1,DARKGRAY); bar(0,30,640,400); setcolor(WHITE); rectangle(0,30,640,400); rectangle(1,31,639,399); setfillstyle(1,WHITE); bar(5,130,635,260); setcolor(BLACK); for (i=0;i<21;i++) rectangle(i*30+5,130,(i+1)*30+5,260); setfillstyle(1,0); for (i=0;i<21;i++) if (i%7!=0 && i%7-3!=0) bar(i*30-5,130,i*30+15,200); HotKey(); } int GetKey(void) { int Ch,Low,Hig; Ch=bioskey(0); Low=Ch&0x00ff; Hig=(Ch&0xff00)>>8; return(Low==0?Hig+256:Low); } |
地主 发表时间: 09/27 16:22 |
![]() | 回复: ceo_8008 [ceo_8008] ![]() |
登录 |
把键盘挎在键盘上,按着1234567,发现 耶~~~~~ 原来电脑也可以当笛子用 ![]() 感谢286,一把字:棒!!! |
B1层 发表时间: 09/27 16:29 |
![]() | 回复: gududelang [gududelang] ![]() |
登录 |
是不是太复杂点了,没那么麻烦吧 |
B2层 发表时间: 09/27 19:29 |
![]() | 回复: ceo_8008 [ceo_8008] ![]() |
登录 |
To楼上:如果说这程序麻烦的话,我倒想见识见识您的高见或者是大作 该不会也要用一条语句编出个电子琴吧? |
B3层 发表时间: 09/28 08:44 |
![]() | 回复: blindeaf [blindeaf] ![]() |
登录 |
不可有些可惜,我运行后,你按一个键,系统就一直发声,不会停止,直到你再按另一个键。 我改了一下程序 void Sound(int level,int no) { int frequant=Freq[level][no]; sound(frequant); /*以下是我加的*/ delay(800); nosound(); /*--------------*/ /*以下为在键盘上画按键*/ setfillstyle(9,BLACK); bar((level*7+no)*30+8,210,(level*7+no)*30+32,257); 问题解决~~~~~~~~~~~~~~~~~ [此贴被 海鬼(blindeaf) 在 10月07日20时05分 编辑过] [此贴被 海鬼(blindeaf) 在 10月07日21时27分 编辑过] |
B4层 发表时间: 10/07 20:54 |
![]() | 回复: honyry [honyry] ![]() |
登录 |
#include <graphics.h> #define ESC 27 #define SHIFT_1 33 #define SHIFT_2 64 #define SHIFT_3 35 #define SHIFT_4 36 #define SHIFT_5 37 #define SHIFT_6 94 #define SHIFT_7 38 #define CTRL_1 376 #define CTRL_2 377 #define CTRL_3 378 #define CTRL_4 379 #define CTRL_5 380 #define CTRL_6 381 #define CTRL_7 382 #define F1 315 void Init(); void Select(); void Quit(); int GeyKey(); void Sound(int level,int no); void Quit(); void Help(); int i,j,Key; unsigned int Seconds=0; int Freq[3][7]={131,147,165,176,196,220,247, 262,296,330,349,392,440,494, 523,587,659,699,784,880,988}; /*每个音的频率*/ int main() { Init();/*初始化图形并画出键盘*/ while(key!=27) { Seconds++; if (Seconds==50000) {Seconds=0;nosound();} /*对每个频率的音都要有一定的延时*/ if (kbhit()) Select();/*判断按了什么键*/ } } void Select() { Seconds=0; nosound(); Key=GetKey(); if (Key>48 && Key<56) Sound(1,Key-49); if (Key>375 && Key<383) Sound(2,Key-376); switch(Key) { case SHIFT_1:Sound(0,0);break; case SHIFT_2:Sound(0,1);break; case SHIFT_3:Sound(0,2);break; case SHIFT_4:Sound(0,3);break; case SHIFT_5:Sound(0,4);break; case SHIFT_6:Sound(0,5);break; case SHIFT_7:Sound(0,6);break; case ESC:nosound();Quit();break; case F1:Help();break; default:break; } } void Sound(int level,int no) { int frequant=Freq[level][no]; sound(frequant); /*以下为在键盘上画按键*/ setfillstyle(9,BLACK); bar((level*7+no)*30+8,210,(level*7+no)*30+32,257); for (i=0;i<20;i++) { if (kbhit()) { nosound(); delay(100); break; } else delay(200); } setfillstyle(1,WHITE); bar((level*7+no)*30+8,210,(level*7+no)*30+32,257); } void Quit() { int ch; setcolor(YELLOW); outtextxy(400,280,"Are You Sure (Yes/no)?"); ch=getche(); if (ch=='y'||ch=='Y') { closegraph(); delay(100); exit(0); } setcolor(DARKGRAY); outtextxy(400,280,"Are You Sure (Yes/no)?"); } void Help() { unsigned Save; void *Buf; Save=imagesize(160,120,500,360); Buf=(void *)malloc(Save); getimage(160,120,500,360,Buf); setfillstyle(1,YELLOW); bar(160,120,500,280); setcolor(RED); rectangle(160,120,500,280); rectangle(161,121,499,279); outtextxy(170,130," Help "); outtextxy(170,140," "); outtextxy(170,190," NOT everyone can be the Firstman"); outtextxy(170,250," "); outtextxy(170,260," Good Luckly to You !!! "); getch(); putimage(160,120,Buf,0); free(Buf); } void HotKey() { setusercharsize(3,3,1,1); setcolor(RED); outtextxy(280,70,"Dian Zi Qin"); outtextxy(310,90,"Ver 1.0"); outtextxy(440,300,"Copyright(c) by"); outtextxy(450,320,"Mr. Unique"); outtextxy(440,340,"1997.10.31"); } void Init() { int GraphDriver=DETECT,GraphMode; initgraph(&GraphDriver,&GraphMode,""); setfillstyle(1,DARKGRAY); bar(0,30,640,400); setcolor(WHITE); rectangle(0,30,640,400); rectangle(1,31,639,399); setfillstyle(1,WHITE); bar(5,130,635,260); setcolor(BLACK); for (i=0;i<21;i++) rectangle(i*30+5,130,(i+1)*30+5,260); setfillstyle(1,0); for (i=0;i<21;i++) if (i%7!=0 && i%7-3!=0) bar(i*30-5,130,i*30+15,200); HotKey(); } int GetKey(void) { int Ch,Low,Hig; Ch=bioskey(0); Low=Ch&0x00ff; Hig=(Ch&0xff00)>>8; return(Low==0?Hig+256:Low); } 没有c语言编译程序所以只能改这么多了! 建议加入半音就是说应该有12半音才是真正的电子琴呢! 还有就是应该屏掉不起作用的键 |
B5层 发表时间: 10/07 21:28 |
![]() | 回复: realpope [realpope] ![]() |
登录 |
要什么时候才能达到这种境界阿 |
B6层 发表时间: 10/13 11:46 |
![]() | 回复: 286 [unique] ![]() |
登录 |
TO 海鬼: 这个程序作的很早了。当时我用的计算机都是286,速度与现在的计算机速度难以相比,我在发布时只是简单把sound()后面的延时delay(),加长了。加长到了我现在计算机合适的速度。你只需要把那个时间调整到合适你计算机的速度就可以了。 这样当前一个音按下,后一个音未按时, 过一定时间也会自动停。 TO 〖流氓の兔〗: 我对音乐不是太懂,没明白你说的半音是什么意思,我的理解是4比3高半音的半音,还是2分音符方面的半音,不好意思,谢谢你的建议。 对于其它键我原来的设计就是使当前的音马上停下来。所以并没作屏蔽。 :) |
B7层 发表时间: 10/13 13:01 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号