VIRTUAL PIANO
It's a very simple sound program , Input device is mouse.
Sound function is used to produce output.Working is very simple
based on seven natural freqencies.Move mouse over keys for sounds.
Change range and note the difference.

125 Views
#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 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 FOUND !\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);
			}
			else if(key>6)
			     {
				 sound(freq[12-key]*(a/2));
			     }
		}
		nosound();
		check_keys(x,y);
	}
 }
 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");
 gotoxy(33,6);textcolor(11);cprintf("DEVLOPED BY");
 gotoxy(32,7);textcolor(15);cprintf("ANURAG PAREEK");
 gotoxy(27,8);cprintf("pareek.anurag@gmail.com");
}
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 keys
  if(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 keys
  if(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;else if(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;
}
//***************************************************************************
About the Author

nothing sure i think i m searching myself i love to c life changing