#include<stdio.h>
#include<dos.h>
#include<conio.h>
#include<stdlib.h>
#define SHOW 1
#define HIDE 2
union REGS input,output;
class piano
{
public:int BIGKEY,MIDKEY,back,border;
piano()//init constructor
{
BIGKEY=15;
MIDKEY=1;
back=7;
border=15;
}
}color;
void drawpiano(int x,int y);
int check_xy(int x,int y);
void BOX(int c,int r,int c1,int r1,int col);
int initmouse();
void setupscreen();
void pointer(int on);
void restrictmouse(int x1,int y1,int x2,int y2);
void check_keys(int x,int y);
void getmouse(int *button,int *x,int *y);
float freq[7] = {130.81, 146.83, 164.81, 174.61,196, 220, 246.94 } ;
int n=0,a=4,backcolor=2,exitcode=1;
void showbar(int t)
{
if(t>65) t=65;
if(t<1) t=1;
textcolor(15);
for(int q=0;q<=t;t++)
{
gotoxy(3+q,4);
cprintf("Û");
}
}
void main()
{
int b,x,y,key;
char ch;
if(initmouse()==-1)
{
clrscr();
printf("\n\nNO MOUSE !\n\n");
exit(1);
}
pointer(SHOW);
setupscreen();
exitcode=1;
while(exitcode)
{
if(kbhit())
{
ch=getch();
if(ch==27) break;
if(ch==75) a--;
if(ch==77) a++;
check_keys(x,y);
switch(ch)
{
case'a':case'A':key=0;break;
case's':case'S':key=1;break;
case'd':case'D':key=2;break;
case'f':case'F':key=3;break;
case'j':case'J':key=4;break;
case'k':case'K':key=5;break;
case'l':case'L':key=6;break;
}
sound(freq[key]*a);
delay(80);
nosound();
}
getmouse(&b,&x,&y);
//gotoxy(2,2);cprintf("%d,%d ",x,y);if(b==1)
{
while(b==1)
{
getmouse(&b,&x,&y);
key=check_xy(x,y);
if(key!=-1 && key<7)
{
sound(freq[key]*a);
}
elseif(key>6)
{
sound(freq[12-key]*(a/2));
}
}
nosound();
check_keys(x,y);
}
}//while(1)
textbackground(0);
clrscr();
_setcursortype(_NORMALCURSOR);
}
void setupscreen()
{
_setcursortype(_NOCURSOR);
textbackground(backcolor);
clrscr();
drawpiano(9,17);
BOX(4,5,8,5,0);
BOX(5,5,7,5,1);
textcolor(15);
gotoxy(70,5);
cprintf(">Quit<");
gotoxy(4,4);
cprintf("Range");
textbackground(0);
gotoxy(8,5);
cprintf("");
gotoxy(4,5);
cprintf("");
gotoxy(6,5);
cprintf("%d",a);
textcolor(14);
textbackground(backcolor+7);
gotoxy(30,4);
cprintf("VIRTUAL PIANO v1.0");
}
void pianokey(int x,int y)
{
textbackground(color.MIDKEY);
textcolor(color.BIGKEY);
gotoxy(x,y);
cprintf("ÛÛÛ ÛÛÛ");
gotoxy(x,y+1);
cprintf("ÛÛÛ ÛÛÛ");
gotoxy(x,y+2);
cprintf("ÛÛÛ ÛÛÛ");
gotoxy(x,y+3);
cprintf("ÛÛÛÛÞÛÛÛ");
gotoxy(x,y+4);
cprintf("ÛÛÛÛÞÛÛÛ");
gotoxy(x,y+5);
cprintf("ÛÛÛÛÞÛÛÛ");
gotoxy(x,y+6);
cprintf("ÛÛÛÛÞÛÛÛ");
gotoxy(x,y);
}
void drawpiano(int x,int y)
{
int t=9;
BOX(x-5,y-3,75,y+8,color.border);
BOX(x-4,y-2,74,y+7,color.back);
pianokey(x,y);
pianokey(x+t,y);
pianokey(x+t*2,y);
pianokey(x+t*3,y);
pianokey(x+t*4,y);
pianokey(x+t*5,y);
pianokey(x+t*6,y);
}
void BOX(int c,int r,int c1,int r1,int col)
{
int i,j;
textcolor(col);
for(i=r;i<=r1;i++)
{
for(j=c;j<=c1;j++)
{
gotoxy(j,i);
cprintf("Û");
}
}
}
int initmouse()
{
input.x.ax=0;
int86(0x33,&input,&output);
return(output.x.ax==0 ? -1 : 0);
}
void pointer(int on)
{
input.x.ax=on;
int86(0x33,&input,&output);
}
void restrictmouse(int x1,int y1,int x2,int y2)
{
input.x.ax=7;
input.x.cx=x1/8;
input.x.dx=x2/8;
int86(0x33,&input,&output);
input.x.ax=8;
input.x.cx=y1/8;
input.x.dx=y2/8;
int86(0x33,&input,&output);
}
void getmouse(int *button,int *x,int *y)
{
input.x.ax=3;
int86(0x33,&input,&output);
*button=output.x.bx;
*x=output.x.cx/8;
*y=output.x.dx/8;
}
int check_xy(int x,int y)
{
//mid keysif(x>=11 && y>=16 && x<=12 && y<=18)
return 7;
if(x>=20 && y>=16 && x<=21 && y<=18)
return 8;
if(x>=29 && y>=16 && x<=30 && y<=18)
return 9;
if(x>=38 && y>=16 && x<=39 && y<=18)
return 10;
if(x>=47 && y>=16 && x<=48 && y<=18)
return 11;
if(x>=56 && y>=16 && x<=57 && y<=18)
return 0;
if(x>=65 && y>=16 && x<=66 && y<=18)
return 12;
// big keysif(x>=8 && y>=16 && x<=15 && y<=22)
return 0;
if(x>=17 && y>=16 && x<=24 && y<=22)
return 1;
if(x>=26 && y>=16 && x<=33 && y<=22)
return 2;
if(x>=35 && y>=16 && x<=42 && y<=22)
return 3;
if(x>=44 && y>=16 && x<=51 && y<=22)
return 4;
if(x>=53 && y>=16 && x<=60 && y<=22)
return 5;
if(x>=62 && y>=16 && x<=69 && y<=22)
return 6;
return (-1);//no key pressed
}
void check_keys(int x,int y)
{
if(x==7 && y==4) a++;
if(x==3 && y==4) a--;
if(a<1) a=1;elseif(a>30) a=30;
textcolor(15);textbackground(1);
gotoxy(5,5);cprintf(" ");
if(a<10) gotoxy(6,5);
else gotoxy(5,5);
cprintf("%d",a);
if(x>=69 && y>=4 && x<=74 && y<=4) exitcode=0;
}