home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / music / soundexp / sounder.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-10-07  |  9.1 KB  |  419 lines

  1. /*--------------------------------*/
  2. /*     Sounder.c                  */
  3. /*--------------------------------*/
  4. #include <gemdefs.h> /* normal includes */
  5. #include <stdio.h>
  6. #include <osbind.h>
  7. #include <obdefs.h>
  8.  
  9. #include "sound.h"   /* rsrc */
  10.  
  11. #define  extern
  12. #include "soundef.h" /* globals and  defines */
  13. #undef   extern
  14.  
  15. #define PUT 0x80
  16.  
  17. #define NUMNOTES 12 
  18. #define NUMOCTS 5  
  19.    
  20. char notes[NUMNOTES][3] = { "B ","A#","A ", "G#","G ","F#",
  21.                       "F ","E ","D#", "D ", "C#","C " };
  22. int notelow[NUMOCTS][NUMNOTES] = {
  23.       63,  67,  71,  75,  79,  84,  89,  95, 100, 106, 112, 119,        
  24.      127, 134, 142, 150, 159, 169, 179, 190, 201, 213, 225, 239,
  25.      253,  12,  28,  45,  63,  82, 102, 123, 146, 170, 195, 222,
  26.      250,  24,  56,  90, 126, 164, 204, 246,  36,  83, 134, 188,
  27.      244,  49, 112, 180,   9,  71, 152, 237,  71, 167,  12, 119  } ;
  28.  
  29. int notehi[NUMOCTS][NUMNOTES] = {
  30.      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,        
  31.      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
  32.      0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  33.      1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 
  34.      3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 7  } ;
  35.  
  36. int save7;
  37.  
  38. /*  lineaport *Aport;  */
  39.  
  40. /*
  41.     main - executes initialization code and the starts the application.
  42. */
  43. main()
  44. {
  45.     /* 
  46.         Initialize 
  47.  */
  48.  init_app();
  49.     /*
  50.         Handle events for application.
  51.     */
  52.     multi(); 
  53.  
  54.     /*
  55.         bye...  Note: This will never be executed.
  56.     */
  57.  shut_app(0); /* was shutdown(0);? */
  58. }
  59.  
  60. /*--------------------------------*/
  61. /*     init_app                   */
  62. /*--------------------------------*/
  63. init_app()
  64. {
  65. int  dummy;
  66.  
  67.     /*
  68.         Initiailize the ROMs.
  69.     */
  70.     appl_init();
  71.  
  72.     /*
  73.         Load resources.
  74.     */
  75.     init_resources();
  76. /*
  77.         Get the Physical work station handle.
  78.     */
  79.     phys_handle = graf_handle(&dummy, &dummy, &dummy, &dummy);
  80.  
  81.  /*  init_paths();  init filepaths? */
  82.     /*
  83.         Initialize the mouse.
  84.     */
  85.  POINT
  86. }  /* end init_app  */
  87. /*--------------------------------*/
  88.  
  89. /*--------------------------------*/
  90. /*    init_resources              */
  91. /*--------------------------------*/
  92. init_resources()
  93. {
  94. OBJECT *tree;
  95.  
  96.     if (!rsrc_load("sound.rsc")) {
  97.         form_alert(1, "[0][Can't find resource|Terminating ...][Eh?]");
  98.         exit(2);
  99.     }
  100.  
  101.  rsrc_gaddr( R_TREE, REGS, &tree);
  102.  /*  Init dialog strings */
  103.  sprintf( OBSPEC( tree, LOSSTR), "48");
  104.  sprintf( OBSPEC( tree, HISSTR), "3");
  105.  /* end init dialog strings */
  106.  
  107. /*  Init menu  */
  108. /*     rsrc_gaddr(0, MEN, &menu1);
  109.        menu_bar(menu1, 1);
  110. */
  111.  
  112.  /*  Init dialog placement */
  113.  /* end init object placement */
  114.  
  115. } /* end init_resources */
  116. /*--------------------------------*/
  117.  
  118. /*--------------------------------*/
  119. /*
  120.     shut_app - is the code that closes down the application.  This routine
  121.         is called when errors occurs and guarantees that all window's will
  122.         be closed properly before exiting.
  123. */
  124. /*--------------------------------*/
  125. shut_app(code)
  126.     int code;
  127. {
  128.     /*
  129.         Clean up memory.
  130.     */
  131.     cleanup();
  132.  
  133.     /*
  134.         Shut down the application.
  135.     */
  136.     appl_exit();
  137.  
  138.     /*
  139.         bye ...
  140.     */
  141.     exit(code);
  142. } /* end shut_app */
  143. /*--------------------------------*/
  144.  
  145. /*--------------------------------*/
  146. /*
  147.     cleanup - releases the memory used by the application.
  148. */
  149. /*--------------------------------*/
  150. cleanup()
  151. {
  152.   
  153.     /*
  154.         Free memory used by resource.
  155.     */
  156.     rsrc_free();
  157. } /* end cleanup */
  158. /*--------------------------------*/
  159.  
  160. /*--------------------------------*/
  161. /*  multi (one form node)         */
  162. /*--------------------------------*/
  163. multi()
  164. {
  165. int done=0, type, flags, dad, obid, tedid, val, doitnow,dclick;
  166. OBJECT *tree;
  167.  char *ted;
  168. GRECT ob;
  169.  
  170.  save7 = Giaccess( 0, 7);
  171.  show_dial( REGS );
  172.     rsrc_gaddr( R_TREE, REGS, &tree );
  173.  objc_xywh( tree, 0, &ob);
  174. do{
  175. obid = form_do( tree,0);
  176.    doitnow = 1;
  177.    dclick = val = 0;
  178.    if( obid & 0x8000 ){
  179.      dclick = 1;
  180.      obid &= ~0x8000;  /* mask off any double clicks */
  181.      }
  182.    flags = OBFLAGS( tree, obid );
  183.    type = EXTYPE( tree, obid );
  184.    dad = get_parent( tree, obid);
  185.  
  186.     if ( flags & TOUCHEXIT ){
  187.    switch( dad ){
  188.      case NABOX:
  189.      case NBBOX:
  190.      case NCBOX:
  191.        do_note( tree, obid, dad, flags, type);
  192.        break;
  193.      case VOLA:   /* Falls through, sets maximum slider value */
  194.      case VOLB:
  195.      case VOLC:
  196.        val = 16;
  197.      case PIT:
  198.        if( !val )
  199.          val = 31;
  200.      case LOWSUS:
  201.        if( !val )
  202.          doitnow = 0;    /* wait till done sliding */
  203.      case HISUS:
  204.        if( !val ){
  205.          val = 255;
  206.          }
  207.        ted = OBSPEC( tree, dad + 2);
  208.        tedid = dad + 2; 
  209.        touchslide( tree, ted, tedid, 0, val, type);
  210.        break;  /* end fall-through */
  211.               case NOISE:
  212.        OBSTAT( tree, obid) ^= CHECKED;
  213.           objc_draw( tree, obid, 8, ob.g_x,ob.g_y,ob.g_w,ob.g_h);
  214.                    break;
  215.      default:  
  216.        break;    
  217.       } /* end switch dad */
  218.     } /* end if touchexit */
  219.  else{
  220.    switch( obid ){  /* catch the rest, selectables? */
  221.             case SEND: /* re-does the chip */
  222.     break;
  223.             case SNDCANC:
  224.     do_gee( save7, 0);
  225.    objc_dsel( tree, NA);
  226.    objc_dsel( tree, NB);
  227.    objc_dsel( tree, NC); /* turn off notes */
  228.     doitnow = 0;
  229.                 break;
  230.             case EX:
  231.     do_gee( save7, 0);
  232.     doitnow = 0;
  233.     done = 1;
  234.                 break;
  235.             default:
  236.                 break;    
  237.    }
  238.    if( dad != ENVBOX )
  239.      objc_dsel( tree, obid);
  240.    } 
  241.    if( doitnow )
  242.      do_gee( save7, 1); /* how fast is it?  Fast enough */
  243.      }
  244.   while( !done );
  245.  
  246.  hide_dial( REGS );
  247.  
  248.  /* rest_soundregs(); */
  249.  
  250.  return( type );
  251. }  /* end form_do of Multi */
  252.  
  253. do_gee( mask, on )
  254. int mask, on;
  255. {
  256.   int regvals[14];
  257.   int i;
  258.  
  259.   if ( on ){
  260.     mask &= 0xc0;
  261.     set_regvals( regvals );
  262.     /* play tone */
  263.     for( i = 0; i<14; i++){
  264.       if( i == 7 )
  265.         Giaccess( (char)regvals[i]|mask, PUT|i);
  266.       else
  267.         Giaccess( (char)regvals[i], PUT|i);
  268.      }
  269.    }
  270.   else{
  271.     for( i = 0; i < 3; i++)       /* just sets volume to zero */
  272.       Giaccess( 0, PUT|( 8 + i ) );
  273.     }
  274.  return( 0 );
  275. }  /* end do_gee */
  276.  
  277. set_regvals( vals )     /* sets values by reading the form */
  278. int  *vals;
  279. {
  280.  OBJECT *tree;
  281.  int id,note,octave,i;
  282.  static int vols[3] = { VOLASTR, VOLBSTR, VOLCSTR };
  283.  static int tones[3] = { NA, NB, NC };
  284.  
  285.  rsrc_gaddr( R_TREE, REGS, &tree);
  286.  
  287.  vals[7] = 0x3f;   /* all voices off? */
  288.  for( i=0; i<3; i++) /* all volumes down */
  289.    vals[8 + i] = 0;
  290.  for( i=0; i<3; i++){
  291.  if( selectp( tree, tones[i])){
  292.    get_note( tree, tones[i], ¬e, &octave);
  293.    vals[0 + ( i*2 )] = notelow[octave][note];
  294.    vals[1 + ( i*2 )] = notehi[octave][note];
  295.    vals[8 + i] = atoi( OBSPEC( tree, vols[i]) );
  296.    setbit( &vals[7], i, 0);
  297.    }
  298.   if( statep( tree, NOISE1 + i, CHECKED) )
  299.     setbit( &vals[7], 3 + i, 0);
  300.   else
  301.     setbit( &vals[7], 3 + i, 1 );
  302.  }
  303.  vals[6] = atoi( OBSPEC( tree, PITSTR));
  304.  vals[11] = atoi( OBSPEC( tree, LOSSTR));
  305.  vals[12] = atoi( OBSPEC( tree, HISSTR));
  306.  vals[13] = EXTYPE( tree, ENV1 + decode( tree, ENV1, 10, SELECTED));
  307.  
  308.  return( 0 );
  309. }  /* end set_regs */
  310.  
  311. get_note( tree, ob, n, o)
  312. OBJECT *tree;
  313. int ob, *n, *o;
  314. {
  315.   char note[3],*p;
  316.   int dex;
  317.  
  318.   p = OBSPEC( tree, ob);
  319.   note[0] = p[0];
  320.   note[1] = p[1];
  321.   note[2] = '\0';
  322.   for( dex = 0; dex < NUMNOTES; dex++ )
  323.     if( !strcmp( note, notes[dex]) )
  324.       break;
  325.   *n = dex;
  326.   *o = (int)(p[2]-'1');
  327.  return( 0 );
  328. } /* end get_note */
  329.  
  330. setbit( i, bit, onff)
  331. int *i, bit, onff;
  332. {
  333.   if( onff )
  334.      *i |= (1 << bit);
  335.   else
  336.      *i &= ( 0xFFFF - ( 1 << bit ));
  337. } /* end setbit */ 
  338.  
  339. do_note( tree, obid, dad, flags, type)  
  340. OBJECT *tree;
  341. int obid, dad, flags, type;
  342. {
  343.   if( flags & SELECTABLE )
  344.     /* it's the note itself, so just return */
  345.     return( 1 );
  346.   else{
  347.     /* else it's the slider */
  348.     note_slide( tree, dad+2, type);  /* dad + 2 is notestring */
  349.     }
  350.  return( selectp( tree, dad+2));  /* don't send sound if note's off */
  351. }  /* end do_note */
  352.  
  353. set_note( tree, ob, n, o)
  354. OBJECT *tree;
  355. int ob, n, o;
  356. {
  357.   char *p;
  358.  
  359.   p = OBSPEC( tree, ob);
  360.   sprintf( p, notes[n]); /* Copy C# to first two chars */
  361.   p[2] = (char)o + '1';
  362.  
  363.  return( 0 );
  364. } /* end set_note */
  365.  
  366. note_slide( tree, obid , up)
  367. OBJECT *tree;
  368. int obid, up;
  369. {
  370.  GRECT ob;
  371.  int note,octave;
  372.  
  373.  get_note( tree, obid, ¬e, &octave);
  374.  note += (up)? -1:1;  /* reverse direction to match keyboard? */
  375.  if( note<0 ){
  376.    note += NUMNOTES;
  377.    if( octave > 0)
  378.      octave -= 1;
  379.    }
  380.  else if( note == NUMNOTES ){
  381.    note = 0;
  382.    if( octave < NUMOCTS - 1 )
  383.      octave += 1;
  384.    }
  385.  
  386.  set_note( tree, obid, note, octave);
  387.     objc_xywh( tree, obid, &ob);
  388.  objc_draw( tree, obid, 8, ob );
  389.  return( note );    
  390. }  /* end note_slide */
  391.  
  392. touchslide( tree, datated ,dataid, minval, maxval, upflag)
  393. register OBJECT *tree;
  394. char *datated;
  395. int dataid, minval, maxval, upflag;
  396. {
  397.     GRECT ob;
  398.     int val;
  399.  
  400.  val = atoi( datated );
  401.  if( upflag ){
  402.    if( val == maxval)
  403.      return( val );
  404.    val += 1;
  405.    }
  406.  else{
  407.    if( val == minval)
  408.      return( val );
  409.    val -= 1;
  410.    }
  411.  
  412.     objc_xywh( tree, dataid, &ob);
  413.  sprintf( datated,"%d",val);
  414.     objc_draw( tree, dataid, 8, ob.g_x,ob.g_y,ob.g_w,ob.g_h);
  415.  
  416. return ( val ); /* or use decode */
  417. } /* end set sliders */
  418.  
  419.