论坛: 编程破解 标题: 让你的键盘变成电子琴(源程序) 复制本贴地址    
作者: 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号