home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1999 February / PCO_0299.ISO / filesbbs / linux / mikmod-3.000 / mikmod-3 / mikmod-3.1.2 / playercode / s3m_it.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-12-07  |  5.4 KB  |  202 lines

  1. /*    MikMod sound library
  2.     (c) 1998 Miodrag Vallat and others - see file AUTHORS for complete list
  3.  
  4.     This library is free software; you can redistribute it and/or modify
  5.     it under the terms of the GNU Library General Public License as
  6.     published by the Free Software Foundation; either version 2 of
  7.     the License, or (at your option) any later version.
  8.  
  9.     This program is distributed in the hope that it will be useful,
  10.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.     GNU Library General Public License for more details.
  13.  
  14.     You should have received a copy of the GNU Library General Public
  15.     License along with this library; if not, write to the Free Software
  16.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. */
  18.  
  19. /*==============================================================================
  20.  
  21.   $Id: s3m_it.c,v 1.12 1998/12/07 06:00:50 miod Exp $
  22.  
  23.   Non-protracker player parts (common functions between S3Ms and ITs)
  24.  
  25. ==============================================================================*/
  26.  
  27. #ifdef HAVE_CONFIG_H
  28. #include "config.h"
  29. #endif
  30.  
  31. #include <mikmod_internals.h>
  32.  
  33. SBYTE  remap[64];           /* for removing empty channels */
  34. UBYTE* poslookup=NULL;      /* lookup table for pattern jumps after blank
  35.                                pattern removal */
  36. UBYTE  poslookupcnt;
  37.  
  38. BOOL   filters;             /* resonant filters in use */
  39. UBYTE  activemacro;         /* active midi macro number for Sxx,xx<80h */
  40. UBYTE  filtermacros[16];    /* midi macros settings */
  41. FILTER filtersettings[256]; /* computed filter settings */
  42.  
  43. void S3MIT_ProcessCmd(UBYTE cmd,UBYTE inf,BOOL oldeffect)
  44. {
  45.     UBYTE hi,lo;
  46.  
  47.     lo=inf&0xf;
  48.     hi=inf>>4;
  49.  
  50.     /* process S3M / IT specific command structure */
  51.  
  52.     if(cmd!=255) {
  53.         switch(cmd) {
  54.             case 1: /* Axx set speed to xx */
  55.                 UniWrite(UNI_S3MEFFECTA);
  56.                 UniWrite(inf);
  57.                 break;
  58.             case 2: /* Bxx position jump */
  59.                 if (inf<poslookupcnt)
  60.                     UniPTEffect(0xb,poslookup[inf]);
  61.                 break;
  62.             case 3: /* Cxx patternbreak to row xx */
  63.                 if(oldeffect & 1)
  64.                     UniPTEffect(0xd,(((inf&0xf0)>>4)*10)+(inf&0xf));
  65.                 else
  66.                     UniPTEffect(0xd,inf);
  67.                 break;
  68.             case 4: /* Dxy volumeslide */
  69.                 UniWrite(UNI_S3MEFFECTD);
  70.                 UniWrite(inf);
  71.                 break;
  72.             case 5: /* Exy toneslide down */
  73.                 UniWrite(UNI_S3MEFFECTE);
  74.                 UniWrite(inf);
  75.                 break;
  76.             case 6: /* Fxy toneslide up */
  77.                 UniWrite(UNI_S3MEFFECTF);
  78.                 UniWrite(inf);
  79.                 break;
  80.             case 7: /* Gxx Tone portamento, speed xx */
  81.                 UniWrite(UNI_ITEFFECTG);
  82.                 UniWrite(inf);
  83.                 break;
  84.             case 8: /* Hxy vibrato */
  85.                 if(oldeffect & 1)
  86.                     UniPTEffect(0x4,inf);
  87.                 else {
  88.                     UniWrite(UNI_ITEFFECTH);
  89.                     UniWrite(inf);
  90.                 }
  91.                 break;
  92.             case 9: /* Ixy tremor, ontime x, offtime y */
  93.                 if(oldeffect & 1)
  94.                     UniWrite(UNI_S3MEFFECTI);
  95.                 else                     
  96.                     UniWrite(UNI_ITEFFECTI);
  97.                 UniWrite(inf);
  98.                 break;
  99.             case 0xa: /* Jxy arpeggio */
  100.                 UniPTEffect(0x0,inf);
  101.                 break;
  102.             case 0xb: /* Kxy Dual command H00 & Dxy */
  103.                 if(oldeffect & 1)
  104.                     UniPTEffect(0x4,0);    
  105.                 else {
  106.                     UniWrite(UNI_ITEFFECTH);
  107.                     UniWrite(0);
  108.                 }
  109.                 UniWrite(UNI_S3MEFFECTD);
  110.                 UniWrite(inf);
  111.                 break;
  112.             case 0xc: /* Lxy Dual command G00 & Dxy */
  113.                 if(oldeffect & 1)
  114.                     UniPTEffect(0x3,0);
  115.                 else {
  116.                     UniWrite(UNI_ITEFFECTG);
  117.                     UniWrite(0);
  118.                 }
  119.                 UniWrite(UNI_S3MEFFECTD);
  120.                 UniWrite(inf);
  121.                 break;
  122.             case 0xd: /* Mxx Set Channel Volume */
  123.                 UniWrite(UNI_ITEFFECTM);
  124.                 UniWrite(inf);
  125.                 break;       
  126.             case 0xe: /* Nxy Slide Channel Volume */
  127.                 UniWrite(UNI_ITEFFECTN);
  128.                 UniWrite(inf);
  129.                 break;
  130.             case 0xf: /* Oxx set sampleoffset xx00h */
  131.                 UniPTEffect(0x9,inf);
  132.                 break;
  133.             case 0x10: /* Pxy Slide Panning Commands */
  134.                 UniWrite(UNI_ITEFFECTP);
  135.                 UniWrite(inf);
  136.                 break;
  137.             case 0x11: /* Qxy Retrig (+volumeslide) */
  138.                 UniWrite(UNI_S3MEFFECTQ);
  139.                 if((inf) && (!lo) && !(oldeffect & 1))
  140.                     UniWrite(1);
  141.                 else
  142.                     UniWrite(inf); 
  143.                 break;
  144.             case 0x12: /* Rxy tremolo speed x, depth y */
  145.                 UniWrite(UNI_S3MEFFECTR);
  146.                 UniWrite(inf);
  147.                 break;
  148.             case 0x13: /* Sxx special commands */
  149.                 if (inf>=0xf0) {
  150.                     /* change resonant filter settings if necessary */
  151.                     if((filters)&&((inf&0xf)!=activemacro)) {
  152.                         activemacro=inf&0xf;
  153.                         for(inf=0;inf<0x80;inf++)
  154.                             filtersettings[inf].filter=filtermacros[activemacro];
  155.                     }
  156.                 } else {
  157.                     UniWrite(UNI_ITEFFECTS0);
  158.                     UniWrite(inf);
  159.                 }
  160.                 break;
  161.             case 0x14: /* Txx tempo */
  162.                 if(inf>0x20) {
  163.                     UniWrite(UNI_S3MEFFECTT);
  164.                     UniWrite(inf);
  165.                 }
  166.                 break;
  167.             case 0x15: /* Uxy Fine Vibrato speed x, depth y */
  168.                 if(oldeffect & 1)
  169.                     UniWrite(UNI_S3MEFFECTU);
  170.                 else
  171.                     UniWrite(UNI_ITEFFECTU);
  172.                 UniWrite(inf);
  173.                 break;
  174.             case 0x16: /* Vxx Set Global Volume */
  175.                 UniWrite(UNI_XMEFFECTG);
  176.                 UniWrite(inf);
  177.                 break;
  178.             case 0x17: /* Wxy Global Volume Slide */
  179.                 UniWrite(UNI_ITEFFECTW);
  180.                 UniWrite(inf);  
  181.                 break;
  182.             case 0x18: /* Xxx amiga command 8xx */
  183.                 if(oldeffect & 1)
  184.                     UniPTEffect(0x8,(inf==128)?255:(inf<<1));
  185.                 else
  186.                     UniPTEffect(0x8,inf);
  187.                 break;
  188.             case 0x19: /* Yxy Panbrello  speed x, depth y */
  189.                 UniWrite(UNI_ITEFFECTY);
  190.                 UniWrite(inf);
  191.                 break;
  192.             case 0x1a: /* Zxx midi/resonant filters */
  193.                 if(filtersettings[inf].filter) {
  194.                     UniWrite(UNI_ITEFFECTZ);
  195.                     UniWrite(filtersettings[inf].filter);
  196.                     UniWrite(filtersettings[inf].inf);
  197.                 }
  198.                 break;
  199.         }
  200.     }
  201. }
  202.