home *** CD-ROM | disk | FTP | other *** search
/ Audio Version 4.94 / audioversion4.94knowledgemediaresourcelibraryoctober1994.iso / amiga / utils / exp_iv / commands.c < prev    next >
C/C++ Source or Header  |  1991-05-12  |  5KB  |  244 lines

  1. /* commands.c */
  2.  
  3. /*
  4.  * $Author: Espie $
  5.  * $Date: 91/05/12 19:58:07 $
  6.  * $Revision: 1.1 $
  7.  * $Log:    commands.c,v $
  8.  * Revision 1.1  91/05/12  19:58:07  Espie
  9.  * Initial revision
  10.  * 
  11.  *
  12.  */
  13.  
  14. #include <exec/types.h>
  15. #include <custom/cleanup.h>
  16. #include "player.h"
  17. #include "song.h"
  18. #include "lproto.h"
  19.  
  20.  
  21. /***
  22.  *
  23.  *        Possible commands
  24.  *
  25.  ***/
  26.  
  27. /* the void operations */
  28.     
  29. void ignore(struct priv_play *private, struct automaton *cst)
  30.     {
  31.     }
  32.     
  33. void do_nothing(struct priv_play *private, struct automaton *cst)
  34.     {
  35.     }
  36.  
  37.  
  38.  
  39.  
  40.  
  41. void setup_porta_up(struct priv_play *private, struct automaton *cst)
  42.     {
  43.         cst->pursue = do_porta_up;
  44.         if (private->e->parameters)
  45.             cst->rate = private->e->parameters;
  46.     }
  47.     
  48. void do_porta_up(struct priv_play *private, struct automaton *cst)
  49.     {
  50.         cst->period-= cst->rate;
  51.         if (cst->period < 113)
  52.             {
  53.                 cst->period = 113;
  54.                 cst->pursue = do_nothing;
  55.             }
  56.         new_period(private, cst);
  57.     }
  58.     
  59.  
  60.  
  61.  
  62. void setup_porta_down(struct priv_play *private, struct automaton *cst)
  63.     {
  64.         cst->pursue = do_porta_down;
  65.         if (private->e->parameters)
  66.             cst->rate = private->e->parameters;
  67.     }
  68.  
  69. void do_porta_down(struct priv_play *private, struct automaton *cst)
  70.     {
  71.         cst->period+= cst->rate;
  72.         new_period(private, cst);
  73.     }
  74.  
  75.  
  76. void setup_portamento(struct priv_play *private, struct automaton *cst)
  77.     {
  78.         if (private->e->parameters)
  79.             cst->rate = private->e->parameters;
  80.         if (private->e->note != NO_NOTE)
  81.             {
  82.                 cst->note = private->e->note;
  83.                 cst->pergoal = compute_period(private, cst);
  84.             }
  85.         if (cst->period < cst->pergoal)
  86.             cst->pursue = do_porta0;
  87.         if (cst->period > cst->pergoal)
  88.             cst->pursue = do_porta1;
  89.     }
  90.  
  91. void do_porta0(struct priv_play *private, struct automaton *cst)
  92.     {
  93.         cst->period += cst->rate;
  94.         if (cst->period > cst->pergoal)
  95.             {
  96.                 cst->period = cst->pergoal;
  97.                 cst->pursue = do_nothing;
  98.             }
  99.         new_period(private, cst);
  100.     }
  101.  
  102. void do_porta1(struct priv_play *private, struct automaton *cst)
  103.     {
  104.         cst->period -= cst->rate;
  105.         if (cst->period < cst->pergoal)
  106.             {
  107.                 cst->period = cst->pergoal;
  108.                 cst->pursue = do_nothing;
  109.             }
  110.         new_period(private, cst);
  111.     }
  112.     
  113.  
  114.  
  115. void setup_volume_slide(struct priv_play *private, struct automaton *cst)
  116.     {
  117.         if (private->e->parameters>>4)
  118.             {
  119.                 cst->rate = private->e->parameters>>4;
  120.                 cst->pursue = do_vol_slide0;
  121.             }
  122.         else
  123.             {
  124.                 cst->rate = private->e->parameters;
  125.                 cst->pursue = do_vol_slide1;
  126.             }
  127.     }
  128.  
  129. void do_vol_slide0(struct priv_play *private, struct automaton *cst)
  130.     {
  131.         cst->volume += cst->rate;
  132.         if (cst->volume > 64)
  133.             {
  134.                 cst->volume = 64;
  135.                 cst->pursue = do_nothing;
  136.             }
  137.         new_volume(private, cst);
  138.     }
  139.  
  140. void do_vol_slide1(struct priv_play *private, struct automaton *cst)
  141.     {
  142.         if (cst->volume <= cst->rate)
  143.             {
  144.                 cst->volume = 0;
  145.                 cst->pursue = do_nothing;
  146.             }
  147.         else
  148.             cst->volume -= cst->rate;
  149.         new_volume(private, cst);
  150.     }
  151.     
  152.  
  153.  
  154.  
  155. void setup_arpeggio(struct priv_play *private, struct automaton *cst)
  156.     {
  157.         if (private->e->parameters == 0)
  158.             cst->pursue = do_nothing;
  159.         else
  160.             {                    
  161.                 /* we need the instrument period table
  162.                  * to retrieve periods for arpeggio
  163.                  */            
  164.                 cst->arp1 = cst->note + (private->e->parameters >> 4);
  165.                 cst->arp2 = cst->note + (private->e->parameters & 0xf);
  166.                     /* the arpeggio command is implemented
  167.                      * as a 3-state automaton
  168.                      */
  169.                 cst->pursue = do_arpeggio1;
  170.             }
  171.     }
  172.  
  173. void do_arpeggio0(struct priv_play *private, struct automaton *cst)
  174.     {
  175.         change_period(private, cst->channel, cst->p_table[cst->note]);
  176.         cst->pursue = do_arpeggio1;
  177.     }
  178.     
  179.     
  180. void do_arpeggio1(struct priv_play *private, struct automaton *cst)
  181.     {
  182.         change_period(private, cst->channel, cst->p_table[cst->arp1]);
  183.         cst->pursue = do_arpeggio2;
  184.     }
  185.     
  186. void do_arpeggio2(struct priv_play *private, struct automaton *cst)
  187.     {
  188.         change_period(private, cst->channel, cst->p_table[cst->arp2]);
  189.         cst->pursue = do_arpeggio0;
  190.     }
  191.     
  192.  
  193.  
  194.     
  195. void setup_vibrato(struct priv_play *private, struct automaton *cst)
  196.     {
  197.         cst->pursue = do_vibrato;
  198.         cst->speed = (private->e->parameters & 0xf0)>>3;
  199.         cst->depth = private->e->parameters & 0xf;
  200.     }
  201.  
  202. void do_vibrato(struct priv_play *private, struct automaton *cst)
  203.     {
  204.         change_period(private, cst->channel, cst->period
  205.             + ( (private->sine_table[(cst->offset>>2) & 31]
  206.             * cst->depth) >> 5));
  207.         cst->offset += cst->speed;
  208.     }
  209.     
  210.  
  211. /* 
  212.  * the following commands don't set up anything 
  213.  */
  214.  
  215. void do_fastskip(struct priv_play *private, struct automaton *cst)
  216.     {
  217.         private->fastskip = private->e->parameters;
  218.     }
  219.     
  220. void do_change_volume(struct priv_play *private, struct automaton *cst)
  221.     {
  222.         cst->volume = private->e->parameters;
  223.         new_volume(private, cst);
  224.     }
  225.  
  226.  
  227. void do_skip(struct priv_play *private, struct automaton *cst)
  228.     {
  229.             /* another quirk, this parameter is BCD */
  230.         private->skip = (private->e->parameters)&0xf
  231.                 + 10 * (private->e->parameters>>4);
  232.     }
  233.  
  234. void do_change_speed(struct priv_play *private, struct automaton *cst)
  235.     {
  236.         private->newspeed = private->e->parameters;
  237.     }
  238.         
  239. void do_change_filter(struct priv_play *private, struct automaton *cst)
  240.     {
  241.         private->filter = !private->e->parameters;
  242.         install_filter(private);
  243.     }
  244.