/*************************************************************************
*                                                                        *
*                        MacLibrary Music Example                        *
*                                                                        *
*************************************************************************/             
#include "intuall.h"
#include "maclib.h"

extern struct TextAttr _FRSNormFont;   /*  set up in OpenRegScreen()  */

struct Window *window1;
struct IntuiMessage *message;

long pitch,lastpitch;
APTR address;
USHORT class,code,qualifier;
UBYTE Endflag,octaveOffset;
BOOL MouseDownFlag;

main()
{

   SHORT i,j;
   static SHORT bn[] = {25,46,88,109,130,172,193,235,256,277};
   static SHORT wnote[] = {0x00,0x02,0x04,0x05,0x07,0x09,0x0B,
                           0x10,0x12,0x14,0x15,0x17,0x19,0x1B};
   static SHORT bnote[] = {0x01,0x03,0x06,0x08,0x0A,0x11,0x13,0x16,0x18,0x1A};

   struct Screen *screen1;
   struct RastPort *rp1;
   struct Rectangle rect;
   struct Point point;

   Initialize();
   pitch = -1;  MouseDownFlag = Endflag = FALSE;
   octaveOffset = 0x40;
   screen1 = (struct Screen *)OpenRegScreen("Music Example",0,4);
   window1 = (struct Window *)OpenRegWindow(screen1,"Keyboard",0,20,320,100);
   window1->IDCMPFlags |= MOUSEMOVE;
   window1->Flags |= REPORTMOUSE;
   rp1 = window1->RPort;
   InitWindow1Menus();
   SetRGB4(rp1,1,9,9,9);

   if( StartAudio(10) != TRUE) 
    printf("\nNot able to open the FRS Audio system properly") ;

   SetWave( 3,0 ) ;

   SetRect(&rect,10,20,303,90);
   PaintRect(rp1,&rect);

   for (i=10;i<290;i+=21)
      {
      SetAPen(rp1,0);
      SetRect(&rect,i,20,i+20,90);
      FrameRect(rp1,&rect);
      }
   for (i=0;i<10;i++)
      {
      SetRect(&rect,bn[i],20,bn[i]+12,60);
      EraseRect(rp1,&rect);
      }

   do {
      WaitPort(window1->UserPort);
      message = (struct IntuiMessage *)GetMsg(window1->UserPort);
      class = message->Class;
      code = message->Code;
      qualifier = message->Qualifier;
      address = message->IAddress;
      ReplyMsg(message);
      GetMouse(window1,&point);
      for (i=0;i<10;i++)
         {
         SetRect(&rect,bn[i],20,bn[i]+12,60);
         if (PtInRect(&point,&rect)) break;
         }
      if (i<10) pitch = bnote[i]+octaveOffset;
      else
         {  /*  find white note  */
         j = 10;
         for (i=0;i<14;i++)
            { 
            SetRect(&rect,j,20,j+20,90);
            if (PtInRect(&point,&rect)) break;
            j += 21;
            }
         if (i<14) pitch = wnote[i]+octaveOffset;
         else pitch = -1;
         }
      Window1Control();
      if (MouseDownFlag && pitch>=0 && pitch!=lastpitch)
         {
         PlayNote(pitch,0);
         lastpitch = pitch;
         }
      } while (!Endflag);

   FinishAudio();
   CloseWindow(window1);
   CloseScreen(screen1);
   Finalize();
}


Window1Control()
{
   switch(class)
	   {
      case CLOSEWINDOW:
         Endflag = TRUE;                                                  
	      break;

      case MENUPICK:
         CSMenuStuff();
         break;

      case RAWKEY:
         break;

      case GADGETDOWN:
         break;

      case GADGETUP:
         break;

      case MOUSEBUTTONS:
         if (code==SELECTDOWN)
            {
            MouseDownFlag = TRUE;
            break;
            }
         if (code==SELECTUP)
            {
            MouseDownFlag = FALSE;
            PlayNote(0x0F,0);  /* > B is rest */
            lastpitch = -1;
            break;
            }

      default:
         break;
      }

return(TRUE);         
}

/**************************************************************************

                        MENUSTRIP EXAMPLE

***************************************************************************/


#define frontpen 11
#define backpen 3


struct Menu Window1Menu[2];		/* major menu items present */

struct MenuItem Window1Project[4];
struct MenuItem Window1Edit[7];    

struct IntuiText Window1ProjectText[4];
struct IntuiText Window1EditText[7];

InitWindow1Menus()
{
SHORT i,n;

	i = 0;

	Window1Menu[0].NextMenu = &Window1Menu[1];
	Window1Menu[0].LeftEdge = i; 	/* first menu at left edge */
	Window1Menu[0].TopEdge = 0;
	Window1Menu[0].Width = 70;
	Window1Menu[0].Height = 10;
	Window1Menu[0].Flags = MENUENABLED;
	Window1Menu[0].MenuName = "Waveform";
	Window1Menu[0].FirstItem = &Window1Project[0];

	Window1Menu[1].NextMenu = NULL;
	Window1Menu[1].LeftEdge = (i += 70);
	Window1Menu[1].TopEdge = 0;
	Window1Menu[1].Width = 60;
	Window1Menu[1].Height = 10;
	Window1Menu[1].Flags = MENUENABLED;
	Window1Menu[1].MenuName = "Octave";
	Window1Menu[1].FirstItem = &Window1Edit[0];


  for(n=0; n<4; n++)
	{
	Window1Project[n].NextItem = &Window1Project[n+1];
	Window1Project[n].LeftEdge = 5;
	Window1Project[n].TopEdge = 10 * n;
	Window1Project[n].Width = 70;
	Window1Project[n].Height = 10;
	Window1Project[n].Flags = ITEMTEXT | ITEMENABLED | HIGHBOX;
	Window1Project[n].MutualExclude = 0;
	Window1Project[n].ItemFill = &Window1ProjectText[n];
	Window1Project[n].SelectFill = NULL;
	Window1Project[n].Command =  0;
	Window1Project[n].SubItem = NULL;	/* there are no subitems on any */
	Window1Project[n].NextSelect = 0;	/* not providing for drag select */
	}
	Window1Project[3].NextItem = NULL;


  for(n=0; n<7; n++)
	{
	Window1Edit[n].NextItem = &Window1Edit[n+1];
	Window1Edit[n].LeftEdge = 5;
	Window1Edit[n].TopEdge = 10 * n;
	Window1Edit[n].Width = 60;
	Window1Edit[n].Height = 10;
	Window1Edit[n].Flags = ITEMTEXT | ITEMENABLED | HIGHBOX |COMMSEQ;
	Window1Edit[n].MutualExclude = 0;
	Window1Edit[n].ItemFill = &Window1EditText[n];
	Window1Edit[n].SelectFill = NULL;
	Window1Edit[n].Command = n+0x30;
	Window1Edit[n].SubItem = NULL;	/* there are no subitems on any */
	Window1Edit[n].NextSelect = 0;	/* not providing for drag select */
	}
	Window1Edit[6].NextItem = NULL;


   for(n=0; n<4; n++)
	{
	Window1ProjectText[n].FrontPen = frontpen;
	Window1ProjectText[n].BackPen = backpen;
	Window1ProjectText[n].DrawMode = JAM1;
	Window1ProjectText[n].LeftEdge = 5;
	Window1ProjectText[n].TopEdge = 1;
	Window1ProjectText[n].ITextFont = &_FRSNormFont;
	Window1ProjectText[n].NextText = NULL;
	}

	Window1ProjectText[0].IText = "Square";
	Window1ProjectText[1].IText = "Triangle";
	Window1ProjectText[2].IText = "Sawtooth";
	Window1ProjectText[3].IText = "Pulse";

   for(n=0; n<7; n++)
	{
	Window1EditText[n].FrontPen = frontpen;
	Window1EditText[n].BackPen = backpen;
	Window1EditText[n].DrawMode = JAM1;
	Window1EditText[n].LeftEdge = 10;
	Window1EditText[n].TopEdge = 1;
	Window1EditText[n].ITextFont = &_FRSNormFont;
	Window1EditText[n].NextText = NULL;
	}

	Window1EditText[0].IText = "0";
	Window1EditText[1].IText = "1";
	Window1EditText[2].IText = "2";
	Window1EditText[3].IText = "3";
	Window1EditText[4].IText = "4";
	Window1EditText[5].IText = "5";
	Window1EditText[6].IText = "6";

   SetMenuStrip(window1,Window1Menu);

	return(TRUE);
}

CSMenuStuff()
{
   switch (MENUNUM(code)) { 
      case 0:					/* Project */
         SetWave(ITEMNUM(code), 0 );
         break;

		case 1:					/* Octave */
         octaveOffset = ITEMNUM(code) <<4 ;
         break;

		case 2:					/* Options */
         break;

		case 3:					/* Windows */
   		break;

		default:
			break;
		}

return(TRUE);
}




