home *** CD-ROM | disk | FTP | other *** search
/ Carousel / CAROUSEL.cdr / mactosh / code / c_sqwave.sit < prev    next >
Text File  |  1988-06-20  |  7KB  |  374 lines

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