home *** CD-ROM | disk | FTP | other *** search
/ Otherware / Otherware_1_SB_Development.iso / mac / developm / source / sqwavsnd.c / SW Sound.c
Encoding:
C/C++ Source or Header  |  1992-11-05  |  5.9 KB  |  360 lines

  1. /*
  2. Square Wave Sound
  3. */
  4.  
  5. # include <qd.h>
  6. # include <qdvars.h>
  7. # include <event.h>
  8. # include <toolbox.h>
  9. # include <menu.h>
  10. # include <event.h>
  11. # include <sound.h>
  12. # include <win.h>
  13. # include <dialog.h>
  14.  
  15.  
  16. # define TRUE    1
  17. # define FALSE 0
  18.  
  19.  
  20. swsynthptr             myswptr ;
  21. ptr                         myptr, dstorage ;
  22. handle                     myhandle, itemhandle ;
  23. int                         lp, soundlength = 226, program = TRUE, itemhit, itemtype ;
  24. menuhandle            applemenu, soundmenu ;
  25. eventrecord            event ;
  26. windowptr                soundwin, whichwin ;
  27. windowrecord        soundrec ;
  28. rect                        rect1, utilrect ;
  29. point                        mpoint ;
  30. dialogptr                apdialog ;
  31.  
  32.  
  33. init ()
  34.     {
  35.         qdsetup () ;
  36.         windowsetup () ;
  37.         menusetup () ;
  38.         eventsetup () ;
  39.         dasetup () ;
  40.     }
  41.  
  42.  
  43. qdsetup ()
  44.     {
  45.         initgraf ( &theport ) ;
  46.         initcursor () ;
  47.     }
  48.  
  49.  
  50. dasetup ()
  51.     {
  52.         initdialogs () ;
  53.         teinit () ;
  54.     }
  55.  
  56.  
  57. eventsetup ()
  58.     {
  59.         flushevents ( everyevent, 0 ) ;
  60.     }
  61.  
  62.  
  63. windowsetup ()
  64.     {
  65.         initwindows () ;
  66.         
  67.         setrect ( &rect1, 20, 35, 493, 323 ) ;
  68.         
  69.         soundwin = newwindow ( &soundrec, &rect1,  "Sound",  TRUE, altdboxproc,
  70.                                         (long) 0, FALSE, (long) 1) ;
  71.         
  72.         setrect ( &rect1, 0, 0, 473, 288 ) ;
  73.     
  74.         setport ( soundwin ) ;
  75.     }
  76.     
  77.  
  78. menusetup ()
  79.     {
  80.         static char apple[2] = { '\024', '\000' } ;
  81.         initmenus () ;
  82.         initfonts () ;
  83.         
  84.         applemenu = newmenu ( 1, apple ) ;
  85.         soundmenu = newmenu ( 2, "Sound" ) ;
  86.         
  87.         appendmenu ( applemenu, "About Soundâ•”^1" ) ;
  88.         appendmenu ( soundmenu,
  89.     "Make Sound/S;Modify Sound/C;Repeat-Modify/R;Stop Sound/X;(-;Quit/Q" ) ;
  90.         
  91.         insertmenu ( applemenu, 0) ;
  92.         insertmenu ( soundmenu, 0) ;
  93.         
  94.         drawmenubar () ;
  95.     }
  96.  
  97.  
  98. dallpurp ( dlgid ) /* general purpose dialog opener and bolder of item 1 */
  99.     int dlgid ;
  100.     {
  101.         apdialog = getnewdialog ( dlgid, dstorage, -1L ) ;
  102.         
  103.         getditem ( apdialog, 1, &itemtype, &itemhandle, &utilrect ) ;
  104.         
  105.         setport ( apdialog ) ;
  106.         pensize ( 3, 3 ) ; /* draw 'default' border */
  107.         insetrect ( &utilrect, -4, -4 ) ;
  108.         frameroundrect ( &utilrect, 16, 16 ) ;
  109.         
  110.         modaldialog ( 0L, &itemhit ) ;
  111.         
  112.         closedialog ( apdialog ) ;
  113.         
  114.         setport ( soundwin ) ;
  115.     }
  116.  
  117.  
  118. doclick ()
  119.     {
  120.         switch ( findwindow ( &event.where, &whichwin ) )
  121.             {
  122.                 case inmenubar :
  123.                     
  124.                     domenu ( menuselect ( &event.where ) ) ;
  125.                     break ;
  126.             }
  127.     }
  128.  
  129.  
  130. domenu (menuitem)
  131.     long int menuitem ;
  132.     {
  133.         int menu, item ;
  134.         
  135.         menu = hiword ( menuitem ) ;
  136.         item = loword ( menuitem ) ;
  137.         switch ( menu )
  138.             {
  139.                 case 1 : /* apple menu */
  140.                     domenu1 ( item ) ;
  141.                     break ;
  142.                 case 2 : /* file menu */
  143.                     domenu2 ( item ) ;
  144.                     break ;
  145.             }
  146.         hilitemenu ( 0 ) ;
  147.     }
  148.  
  149.  
  150. domenu1 (item)
  151.     int item ;
  152.     {
  153.         int a, b ;                                        
  154.         switch ( item )
  155.             {
  156.                 case 1 : /* About Sound */
  157.                     
  158.                     dallpurp ( 1 ) ;
  159.                     drawwindow () ;
  160.                     break ;
  161.             }
  162.     }
  163.  
  164.  
  165. domenu2 (item)
  166.     int item ;
  167.     {
  168.         switch ( item )
  169.             {
  170.                 case 1 :
  171.                     
  172.                     stopsound () ;
  173.                     startsound ( myptr, 1362L, 0L ) ;
  174.                     break ;
  175.                 
  176.                 case 2 :
  177.                     
  178.                     /*setcursor ( cross ) ;*/
  179.                     
  180.                     do
  181.                         {
  182.                             getmouse ( &mpoint ) ;
  183.                             
  184.                             newpoint () ;
  185.                         }
  186.                     while ( ! button () ) ;
  187.                     
  188.                     /*setcursor ( arrow ) ;*/
  189.                     
  190.                     domenu2 ( 1 ) ;
  191.                     
  192.                     break ;
  193.                 
  194.                 case 3 :
  195.                     
  196.                     /*setcursor ( cross ) ;*/
  197.                     
  198.                     stopsound () ;
  199.                     startsound ( myptr, 1362L, 0L ) ;
  200.                     
  201.                     do
  202.                         {
  203.                             if ( sounddone () )
  204.                                     startsound ( myptr, 1362L, 0L ) ;
  205.                             
  206.                             getmouse ( &mpoint ) ;
  207.                             
  208.                             newpoint () ;
  209.                         }
  210.                     while ( ! button () ) ;
  211.                     
  212.                     /*setcursor ( arrow ) ;*/
  213.                     
  214.                     break ;
  215.                 
  216.                 case 4 :
  217.                     
  218.                     stopsound () ;
  219.                     break ;
  220.                 
  221.                 case 6 :
  222.                     
  223.                     stopsound () ;
  224.                     program = FALSE ;
  225.                     break ;
  226.             }
  227.     }
  228.         
  229.         
  230. newpoint ()
  231.     {
  232.         int             h, v, holder ;
  233.         point         m1point ;
  234.         
  235.         if ( mpoint != m1point )
  236.             {
  237.                 m1point.a.h = mpoint.a.h ;
  238.                 m1point.a.v = mpoint.a.v ;
  239.         
  240.                 h = mpoint.a.h / 2 * 2 ;
  241.                 v = ( mpoint.a.v - 10 ) * 50 + 300 ;
  242.                 lp = ( mpoint.a.h - 10 ) / 2 ;
  243.                 
  244.                 if ( mpoint.a.v > 10 && mpoint.a.v < 278
  245.                     && mpoint.a.h > 10 && mpoint.a.h < 464 )
  246.                     {
  247.                         holder = 
  248.                                 ( myswptr->triplets[lp].count - 300 ) / 50 + 10 ;
  249.                         
  250.                         if ( mpoint.a.v < holder )
  251.                             {
  252.                                 penpat ( black ) ;
  253.                                 moveto ( h, holder ) ;
  254.                                 line ( 0, mpoint.a.v - holder ) ;
  255.                             }
  256.                         else if ( mpoint.a.v > holder )
  257.                             {
  258.                                 penpat ( white ) ;
  259.                                 moveto ( h, mpoint.a.v - 1 ) ;
  260.                                 lineto ( h, 10 ) ;
  261.                             }
  262.                         
  263.                         myswptr->triplets[lp].count = v ;
  264.                     }
  265.             }
  266.     }
  267.             
  268.             
  269. setupsound ()
  270.     {
  271.         myhandle = newhandle ( 5000L ) ;
  272.         hlock ( myhandle ) ;
  273.         myptr = *myhandle ;
  274.         myswptr = ( swsynthptr ) myptr ;
  275.         
  276.         myswptr->mode = swmode ;
  277.         
  278.         for ( lp = 0 ; lp <= soundlength ; ++lp )
  279.             {
  280.                 myswptr->triplets[lp].count = 300 + lp * 50 ;
  281.                 myswptr->triplets[lp].amplitude = 120 ;
  282.                 myswptr->triplets[lp].duration = 1 ;
  283.             }
  284.         
  285.         myswptr->triplets[lp].count = 0 ;
  286.         myswptr->triplets[lp].amplitude = 0 ;
  287.         myswptr->triplets[lp].duration = 0 ;        
  288.     }
  289.     
  290.  
  291. drawwindow ()
  292.     {
  293.         int h = 10 ;
  294.         
  295.         penpat ( gray ) ;
  296.         
  297.         pensize ( 8, 268 ) ;
  298.         moveto ( 1, 10 ) ;
  299.         line ( 0, 0 ) ;
  300.         moveto ( 464, 10 ) ;
  301.         line ( 0, 0 ) ;
  302.  
  303.         pensize ( 453, 8 ) ;
  304.         moveto ( 10, 1 ) ;
  305.         line ( 0, 0 ) ;
  306.         moveto ( 10, 279 ) ;
  307.         line ( 0, 0 ) ;
  308.         
  309.         pensize ( 8, 8 ) ;
  310.         penpat ( black ) ;
  311.         
  312.         moveto ( 1, 1 ) ;
  313.         line ( 0, 0 ) ;
  314.         moveto ( 464, 1 ) ;
  315.         line ( 0, 0 ) ;
  316.         moveto ( 1, 279 ) ;
  317.         line ( 0, 0 ) ;
  318.         moveto ( 464, 279 ) ;
  319.         line ( 0, 0 ) ;
  320.         
  321.         pensize ( 1, 1 ) ;
  322.         
  323.         for ( lp = 0 ; lp <= soundlength ; ++lp, h += 2 )
  324.             {
  325.                 moveto ( h, ( myswptr->triplets[lp].count - 300 ) / 50 + 10 ) ;
  326.                 lineto ( h, 277 ) ;
  327.             }
  328.     }
  329.     
  330.     
  331. main ()
  332.     {
  333.         init () ;
  334.         
  335.         setupsound () ;
  336.         
  337.         drawwindow () ;
  338.         
  339.         /*cross = getcursor ( 2 ) ;*/
  340.         
  341.         while ( program )
  342.             {
  343.                 getnextevent ( everyevent, &event ) ;
  344.                 
  345.                 switch ( event.what )
  346.                     {
  347.                         case mousedown :
  348.                             
  349.                             doclick () ;
  350.                             break ;
  351.                             
  352.                         case keydown :
  353.                         if ( event.modifiers && cmdkey )
  354.                             domenu ( menukey ( (char) ( loword ( event.message ) ) ) ) ;
  355.                             
  356.                             break ;
  357.                     }
  358.             }
  359.         hunlock ( myhandle ) ;
  360.     }