Diff for /np2/sound/opngenc.c between versions 1.7 and 1.10

version 1.7, 2003/11/28 08:01:33 version 1.10, 2004/07/26 18:52:55
Line 31  static SINT32 decaytable[94]; Line 31  static SINT32 decaytable[94];
 static const SINT32     decayleveltable[16] = {  static const SINT32     decayleveltable[16] = {
                                         SC( 0),SC( 1),SC( 2),SC( 3),SC( 4),SC( 5),SC( 6),SC( 7),                                          SC( 0),SC( 1),SC( 2),SC( 3),SC( 4),SC( 5),SC( 6),SC( 7),
                                         SC( 8),SC( 9),SC(10),SC(11),SC(12),SC(13),SC(14),SC(31)};                                          SC( 8),SC( 9),SC(10),SC(11),SC(12),SC(13),SC(14),SC(31)};
 static const BYTE multipletable[] = {  static const UINT8 multipletable[] = {
                                 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30};                                  1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30};
 static const SINT32 nulltable[] = {  static const SINT32 nulltable[] = {
                                         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,                                          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                                         0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};                                          0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 static const BYTE kftable[16] = {0,0,0,0,0,0,0,1,2,3,3,3,3,3,3,3};  static const UINT8 kftable[16] = {0,0,0,0,0,0,0,1,2,3,3,3,3,3,3,3};
 static const BYTE dttable[] = {  static const UINT8 dttable[] = {
                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,                                          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,                                          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                                         0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,                                          0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
Line 52  static const int fmslot[4] = {0, 2, 1, 3 Line 52  static const int fmslot[4] = {0, 2, 1, 3
   
 void opngen_initialize(UINT rate) {  void opngen_initialize(UINT rate) {
   
           UINT    ratebit;
         int             i;          int             i;
         int             j;          int             j;
         double  pom;          double  pom;
         double  freq;          double  freq;
         UINT32  calcrate;          UINT32  calcrate;
   
         calcrate = rate * 55466 / 44100;          if (rate == 44100) {
                   ratebit = 0;
         opncfg.calc1024 = FMDIV_ENT * 44100 / 55466;          }
           else if (rate == 22050) {
                   ratebit = 1;
           }
           else {
                   ratebit = 2;
           }
           calcrate = (OPNA_CLOCK / 72) >> ratebit;
           opncfg.calc1024 = FMDIV_ENT * 44100 / (OPNA_CLOCK / 72);
   
         for (i=0; i<EVC_ENT; i++) {          for (i=0; i<EVC_ENT; i++) {
 #ifdef OPNGENX86  #ifdef OPNGENX86
Line 177  void opngen_setvol(UINT vol) { Line 186  void opngen_setvol(UINT vol) {
 #endif  #endif
 }  }
   
 void opngen_setVR(BYTE channel, BYTE value) {  void opngen_setVR(REG8 channel, REG8 value) {
   
         if ((channel & 3) && (value)) {          if ((channel & 3) && (value)) {
                 opncfg.vr_en = TRUE;                  opncfg.vr_en = TRUE;
Line 195  void opngen_setVR(BYTE channel, BYTE val Line 204  void opngen_setVR(BYTE channel, BYTE val
 static void set_algorithm(OPNCH *ch) {  static void set_algorithm(OPNCH *ch) {
   
         SINT32  *outd;          SINT32  *outd;
         BYTE    outslot;          UINT8   outslot;
   
         outd = &opngen.outdc;          outd = &opngen.outdc;
         if (ch->stereo) {          if (ch->stereo) {
Line 270  static void set_algorithm(OPNCH *ch) { Line 279  static void set_algorithm(OPNCH *ch) {
         ch->outslot = outslot;          ch->outslot = outslot;
 }  }
   
 static void set_dt1_mul(OPNSLOT *slot, BYTE value) {  static void set_dt1_mul(OPNSLOT *slot, REG8 value) {
   
         slot->multiple = (SINT32)multipletable[value & 0x0f];          slot->multiple = (SINT32)multipletable[value & 0x0f];
         slot->detune1 = detunetable[(value >> 4) & 7];          slot->detune1 = detunetable[(value >> 4) & 7];
 }  }
   
 static void set_tl(OPNSLOT *slot, BYTE value) {  static void set_tl(OPNSLOT *slot, REG8 value) {
   
 #if (EVC_BITS >= 7)  #if (EVC_BITS >= 7)
         slot->totallevel = ((~value) & 0x007f) << (EVC_BITS - 7);          slot->totallevel = ((~value) & 0x007f) << (EVC_BITS - 7);
Line 285  static void set_tl(OPNSLOT *slot, BYTE v Line 294  static void set_tl(OPNSLOT *slot, BYTE v
 #endif  #endif
 }  }
   
 static void set_ks_ar(OPNSLOT *slot, BYTE value) {  static void set_ks_ar(OPNSLOT *slot, REG8 value) {
   
         slot->keyscale = (BYTE)(((~value)>>6)&3);          slot->keyscale = ((~value) >> 6) & 3;
         value &= 0x1f;          value &= 0x1f;
         slot->attack = (value)?(attacktable + (value << 1)):nulltable;          slot->attack = (value)?(attacktable + (value << 1)):nulltable;
         slot->env_inc_attack = slot->attack[slot->envraito];          slot->env_inc_attack = slot->attack[slot->envratio];
         if (slot->env_mode == EM_ATTACK) {          if (slot->env_mode == EM_ATTACK) {
                 slot->env_inc = slot->env_inc_attack;                  slot->env_inc = slot->env_inc_attack;
         }          }
 }  }
   
 static void set_d1r(OPNSLOT *slot, BYTE value) {  static void set_d1r(OPNSLOT *slot, REG8 value) {
   
         value &= 0x1f;          value &= 0x1f;
         slot->decay1 = (value)?(decaytable + (value << 1)):nulltable;          slot->decay1 = (value)?(decaytable + (value << 1)):nulltable;
         slot->env_inc_decay1 = slot->decay1[slot->envraito];          slot->env_inc_decay1 = slot->decay1[slot->envratio];
         if (slot->env_mode == EM_DECAY1) {          if (slot->env_mode == EM_DECAY1) {
                 slot->env_inc = slot->env_inc_decay1;                  slot->env_inc = slot->env_inc_decay1;
         }          }
 }  }
   
 static void set_dt2_d2r(OPNSLOT *slot, BYTE value) {  static void set_dt2_d2r(OPNSLOT *slot, REG8 value) {
   
         value &= 0x1f;          value &= 0x1f;
         slot->decay2 = (value)?(decaytable + (value << 1)):nulltable;          slot->decay2 = (value)?(decaytable + (value << 1)):nulltable;
Line 314  static void set_dt2_d2r(OPNSLOT *slot, B Line 323  static void set_dt2_d2r(OPNSLOT *slot, B
                 slot->env_inc_decay2 = 0;                  slot->env_inc_decay2 = 0;
         }          }
         else {          else {
                 slot->env_inc_decay2 = slot->decay2[slot->envraito];                  slot->env_inc_decay2 = slot->decay2[slot->envratio];
         }          }
         if (slot->env_mode == EM_DECAY2) {          if (slot->env_mode == EM_DECAY2) {
                 slot->env_inc = slot->env_inc_decay2;                  slot->env_inc = slot->env_inc_decay2;
         }          }
 }  }
   
 static void set_d1l_rr(OPNSLOT *slot, BYTE value) {  static void set_d1l_rr(OPNSLOT *slot, REG8 value) {
   
         slot->decaylevel = decayleveltable[(value >> 4)];          slot->decaylevel = decayleveltable[(value >> 4)];
         slot->release = decaytable + ((value & 0x0f) << 2) + 2;          slot->release = decaytable + ((value & 0x0f) << 2) + 2;
         slot->env_inc_release = slot->release[slot->envraito];          slot->env_inc_release = slot->release[slot->envratio];
         if (slot->env_mode == EM_RELEASE) {          if (slot->env_mode == EM_RELEASE) {
                 slot->env_inc = slot->env_inc_release;                  slot->env_inc = slot->env_inc_release;
                 if (value == 0xff) {                  if (value == 0xff) {
Line 337  static void set_d1l_rr(OPNSLOT *slot, BY Line 346  static void set_d1l_rr(OPNSLOT *slot, BY
         }          }
 }  }
   
 static void set_ssgeg(OPNSLOT *slot, BYTE value) {  static void set_ssgeg(OPNSLOT *slot, REG8 value) {
   
         value &= 0xf;          value &= 0xf;
         if ((value == 0xb) || (value == 0xd)) {          if ((value == 0xb) || (value == 0xd)) {
Line 346  static void set_ssgeg(OPNSLOT *slot, BYT Line 355  static void set_ssgeg(OPNSLOT *slot, BYT
         }          }
         else {          else {
                 slot->ssgeg1 = 0;                  slot->ssgeg1 = 0;
                 slot->env_inc_decay2 = slot->decay2[slot->envraito];                  slot->env_inc_decay2 = slot->decay2[slot->envratio];
         }          }
         if (slot->env_mode == EM_DECAY2) {          if (slot->env_mode == EM_DECAY2) {
                 slot->env_inc = slot->env_inc_decay2;                  slot->env_inc = slot->env_inc_decay2;
Line 357  static void channleupdate(OPNCH *ch) { Line 366  static void channleupdate(OPNCH *ch) {
   
         int             i;          int             i;
         UINT32  fc = ch->keynote[0];                                            // ver0.27          UINT32  fc = ch->keynote[0];                                            // ver0.27
         BYTE    kc = ch->kcode[0];          UINT8   kc = ch->kcode[0];
         BYTE    evr;          UINT    evr;
         OPNSLOT *slot;          OPNSLOT *slot;
         int             s;          int             s;
   
Line 366  static void channleupdate(OPNCH *ch) { Line 375  static void channleupdate(OPNCH *ch) {
         if (!(ch->extop)) {          if (!(ch->extop)) {
                 for (i=0; i<4; i++, slot++) {                  for (i=0; i<4; i++, slot++) {
                         slot->freq_inc = (fc + slot->detune1[kc]) * slot->multiple;                          slot->freq_inc = (fc + slot->detune1[kc]) * slot->multiple;
                         evr = (BYTE)(kc >> slot->keyscale);                          evr = kc >> slot->keyscale;
                         if (slot->envraito != evr) {                          if (slot->envratio != evr) {
                                 slot->envraito = evr;                                  slot->envratio = evr;
                                 slot->env_inc_attack = slot->attack[evr];                                  slot->env_inc_attack = slot->attack[evr];
                                 slot->env_inc_decay1 = slot->decay1[evr];                                  slot->env_inc_decay1 = slot->decay1[evr];
                                 slot->env_inc_decay2 = slot->decay2[evr];                                  slot->env_inc_decay2 = slot->decay2[evr];
Line 381  static void channleupdate(OPNCH *ch) { Line 390  static void channleupdate(OPNCH *ch) {
                         s = extendslot[i];                          s = extendslot[i];
                         slot->freq_inc = (ch->keynote[s] + slot->detune1[ch->kcode[s]])                          slot->freq_inc = (ch->keynote[s] + slot->detune1[ch->kcode[s]])
                                                                                                                 * slot->multiple;                                                                                                                  * slot->multiple;
                         evr = (BYTE)(ch->kcode[s] >> slot->keyscale);                          evr = ch->kcode[s] >> slot->keyscale;
                         if (slot->envraito != evr) {                          if (slot->envratio != evr) {
                                 slot->envraito = evr;                                  slot->envratio = evr;
                                 slot->env_inc_attack = slot->attack[evr];                                  slot->env_inc_attack = slot->attack[evr];
                                 slot->env_inc_decay1 = slot->decay1[evr];                                  slot->env_inc_decay1 = slot->decay1[evr];
                                 slot->env_inc_decay2 = slot->decay2[evr];                                  slot->env_inc_decay2 = slot->decay2[evr];
Line 426  void opngen_reset(void) { Line 435  void opngen_reset(void) {
                 ch++;                  ch++;
         }          }
         for (i=0x30; i<0xc0; i++) {          for (i=0x30; i<0xc0; i++) {
                 opngen_setreg(0, (BYTE)i, 0xff);                  opngen_setreg(0, (REG8)i, 0xff);
                 opngen_setreg(3, (BYTE)i, 0xff);                  opngen_setreg(3, (REG8)i, 0xff);
                 opngen_setreg(6, (BYTE)i, 0xff);                  opngen_setreg(6, (REG8)i, 0xff);
                 opngen_setreg(9, (BYTE)i, 0xff);                  opngen_setreg(9, (REG8)i, 0xff);
         }          }
 }  }
   
 void opngen_setcfg(BYTE maxch, UINT flag) {  void opngen_setcfg(REG8 maxch, UINT flag) {
   
         OPNCH   *ch;          OPNCH   *ch;
         UINT    i;          UINT    i;
Line 460  void opngen_setcfg(BYTE maxch, UINT flag Line 469  void opngen_setcfg(BYTE maxch, UINT flag
         }          }
 }  }
   
 void opngen_setextch(UINT chnum, BYTE data) {  void opngen_setextch(UINT chnum, REG8 data) {
   
         OPNCH   *ch;          OPNCH   *ch;
   
Line 468  void opngen_setextch(UINT chnum, BYTE da Line 477  void opngen_setextch(UINT chnum, BYTE da
         ch[chnum].extop = data;          ch[chnum].extop = data;
 }  }
   
 void opngen_setreg(BYTE chbase, BYTE reg, BYTE value) {  void opngen_setreg(REG8 chbase, REG8 reg, REG8 value) {
   
         UINT    chpos;          UINT    chpos;
         OPNCH   *ch;          OPNCH   *ch;
         OPNSLOT *slot;          OPNSLOT *slot;
         UINT    fn;          UINT    fn;
         BYTE    blk;          UINT8   blk;
   
         chpos = reg & 3;          chpos = reg & 3;
         if (chpos == 3) {          if (chpos == 3) {
Line 549  void opngen_setreg(BYTE chbase, BYTE reg Line 558  void opngen_setreg(BYTE chbase, BYTE reg
                                 break;                                  break;
   
                         case 0xb0:                          case 0xb0:
                                 ch->algorithm = (BYTE)(value & 7);                                  ch->algorithm = (UINT8)(value & 7);
                                 value = (value >> 3) & 7;                                  value = (value >> 3) & 7;
                                 if (value) {                                  if (value) {
                                         ch->feedback = 8 - value;                                          ch->feedback = 8 - value;
Line 561  void opngen_setreg(BYTE chbase, BYTE reg Line 570  void opngen_setreg(BYTE chbase, BYTE reg
                                 break;                                  break;
   
                         case 0xb4:                          case 0xb4:
                                 ch->pan = (BYTE)(value & 0xc0);                                  ch->pan = (UINT8)(value & 0xc0);
                                 set_algorithm(ch);                                  set_algorithm(ch);
                                 break;                                  break;
                 }                  }
         }          }
 }  }
   
 void opngen_keyon(UINT chnum, BYTE value) {  void opngen_keyon(UINT chnum, REG8 value) {
   
         OPNCH   *ch;          OPNCH   *ch;
         OPNSLOT *slot;          OPNSLOT *slot;
         BYTE    bit;          REG8    bit;
         UINT    i;          UINT    i;
   
         sound_sync();          sound_sync();
Line 609  void opngen_keyon(UINT chnum, BYTE value Line 618  void opngen_keyon(UINT chnum, BYTE value
                 slot++;                  slot++;
                 bit <<= 1;                  bit <<= 1;
         }          }
         keydisp_fmkeyon((BYTE)chnum, value);          keydisp_fmkeyon((UINT8)chnum, value);
 }  }
   

Removed from v.1.7  
changed lines
  Added in v.1.10


RetroPC.NET-CVS <cvs@retropc.net>