Diff for /xmil/sound/opmgenc.c between versions 1.3 and 1.9

version 1.3, 2004/08/05 11:46:26 version 1.9, 2008/06/02 20:07:32
Line 1 Line 1
 #include        "compiler.h"  #include        "compiler.h"
   
   #if defined(SUPPORT_TURBOZ) || defined(SUPPORT_OPM)
   
   #ifndef         PALMOS
 #include        <math.h>  #include        <math.h>
   #endif
 #include        "sound.h"  #include        "sound.h"
 #include        "sndctrl.h"  #include        "sndctrl.h"
   
Line 7 Line 12
 #define OPM_ARRATE               399128L  #define OPM_ARRATE               399128L
 #define OPM_DRRATE              5514396L  #define OPM_DRRATE              5514396L
   
 #define EG_STEP (96.0 / EVC_ENT)                                        // dB step  #define EG_STEP (96.0 / EVC_ENT)                                        /* dB step */
 #define SC(db)  (SINT32)((db) * ((3.0 / EG_STEP) * (1 << ENV_BITS))) + EC_DECAY  #define SC(db)  (SINT32)((db) * ((3.0 / EG_STEP) * (1 << ENV_BITS))) + EC_DECAY
 #define KF(sn)  ((sn) << KF_BITS)  #define KF(sn)  ((sn) << KF_BITS)
 #define D2(value)               (SINT32)(((double)(6 << KF_BITS)*log((double)value) / \  #define D2(value)               (SINT32)(((double)(6 << KF_BITS)*log((double)value) / \
Line 56  void opmgen_initialize(UINT rate) { Line 61  void opmgen_initialize(UINT rate) {
         UINT    rate1;          UINT    rate1;
         UINT    rate2;          UINT    rate2;
   
         rate1 = rate;   // 44100          rate1 = rate;   /* 44100 */
         rate2 = 62500;          rate2 = 62500;
         while((rate1 * 2) < rate2) {          while((rate1 * 2) < rate2) {
                 rate2 >>= 1;                  rate2 >>= 1;
Line 95  void opmgen_initialize(UINT rate) { Line 100  void opmgen_initialize(UINT rate) {
         }          }
         for (i=4; i<64; i++) {          for (i=4; i<64; i++) {
                 freq = (double)(EVC_ENT << ENV_BITS) * FREQBASE4096;                  freq = (double)(EVC_ENT << ENV_BITS) * FREQBASE4096;
                 if (i < 8) {                                                    // 忘れてます。                  if (i < 8) {                                                    /* 忘れてます。 */
                         freq *= 1.0 + (i & 2) * 0.25;                          freq *= 1.0 + (i & 2) * 0.25;
                 }                  }
                 else if (i < 60) {                  else if (i < 60) {
Line 118  void opmgen_initialize(UINT rate) { Line 123  void opmgen_initialize(UINT rate) {
         detune2table[3] = D2(3.0);          detune2table[3] = D2(3.0);
 }  }
   
   void opmgen_setvol(UINT vol) {
   
           opmcfg.fmvol = vol;
   }
   
   
 // ----  /* ---- */
   
 static void keyon(OPMCH *ch, REG8 value) {  static void keyon(OPMCH *ch, REG8 value) {
   
Line 132  static void keyon(OPMCH *ch, REG8 value) Line 142  static void keyon(OPMCH *ch, REG8 value)
         slot = ch->slot;          slot = ch->slot;
         bit = 0x08;          bit = 0x08;
         for (i=0; i<4; i++) {          for (i=0; i<4; i++) {
                 if (value & bit) {                                                      // keyon                  if (value & bit) {                                                      /* keyon */
                         if (slot->env_mode <= EM_RELEASE) {                          if (slot->env_mode <= EM_RELEASE) {
                                 slot->freq_cnt = 0;                                  slot->freq_cnt = 0;
                                 if (i == OPMSLOT1) {                                  if (i == OPMSLOT1) {
Line 144  static void keyon(OPMCH *ch, REG8 value) Line 154  static void keyon(OPMCH *ch, REG8 value)
                                 slot->env_end = EC_DECAY;                                  slot->env_end = EC_DECAY;
                         }                          }
                 }                  }
                 else {                                                                          // keyoff                  else {                                                                          /* keyoff */
                         if (slot->env_mode > EM_RELEASE) {                          if (slot->env_mode > EM_RELEASE) {
                                 slot->env_mode = EM_RELEASE;                                  slot->env_mode = EM_RELEASE;
                                 if (!(slot->env_cnt & EC_DECAY)) {                                  if (!(slot->env_cnt & EC_DECAY)) {
Line 175  static void set_algorithm(OPMCH *ch, REG Line 185  static void set_algorithm(OPMCH *ch, REG
                 ch->feedback = 0;                  ch->feedback = 0;
         }          }
   
         switch(value & 0xc0) {          switch((value >> 6) & 3) {
                 case 0x40:                  case 0:
                           outd = &opmgen.feedback4;
                           break;
   
                   case 1:
                         outd = &opmgen.outdl;                          outd = &opmgen.outdl;
                         break;                          break;
   
                 case 0x80:                  case 2:
                         outd = &opmgen.outdr;                          outd = &opmgen.outdr;
                         break;                          break;
   
                 default:                  case 3:
                         outd = &opmgen.outdc;                          outd = &opmgen.outdc;
                         break;                          break;
         }          }
Line 337  static void channelupdate(OPMCH *ch) { Line 351  static void channelupdate(OPMCH *ch) {
 }  }
   
   
 //-----------------------------------------------------------------------------  /*----------------------------------------------------------------------------- */
   
 void opmgen_reset(void) {  void opmgen_reset(void) {
   
Line 384  void opmgen_setreg(REG8 reg, REG8 value) Line 398  void opmgen_setreg(REG8 reg, REG8 value)
         switch(reg & 0xe0) {          switch(reg & 0xe0) {
                 case 0x00:                  case 0x00:
                         switch(reg) {                          switch(reg) {
                                 case 0x08:                              // key on/off                                  case 0x08:                              /* key on/off */
                                         keyon(opmch + (value & 7), value);                                          keyon(opmch + (value & 7), value);
                                         break;                                          break;
   
                                 case 0x14:                              // mode                                  case 0x14:                              /* mode */
                                         opmgen.mode = value;                                          opmgen.mode = value;
                                         if ((value & 0x81) == 0x81) {                                          if ((value & 0x81) == 0x81) {
                                                 opmgen.playing++;                                                  opmgen.playing++;
Line 414  void opmgen_setreg(REG8 reg, REG8 value) Line 428  void opmgen_setreg(REG8 reg, REG8 value)
   
                 case 0x20:                  case 0x20:
                         switch(reg & 0x18) {                          switch(reg & 0x18) {
                                 case 0x00:                      // pan feedback connection                                  case 0x00:                      /* pan feedback connection */
                                         set_algorithm(ch, value);                                          set_algorithm(ch, value);
                                         break;                                          break;
   
                                 case 0x08:                      // keycode                                  case 0x08:                      /* keycode */
                                         ch->kcode = (UINT8)((value >> 2) & 0x1f);                                          ch->kcode = (UINT8)((value >> 2) & 0x1f);
                                         ch->keynote = (((value >> 4) & 7) * (12 << KF_BITS)) +                                          ch->keynote = (((value >> 4) & 7) * (12 << KF_BITS)) +
                                                                         halftunetable[value & 0x0f] + ch->keyfunc;                                                                          halftunetable[value & 0x0f] + ch->keyfunc;
                                         channelupdate(ch);                                          channelupdate(ch);
                                         break;                                          break;
   
                                 case 0x10:                      // keyfunction                                  case 0x10:                      /* keyfunction */
                                         ch->keyfunc = (UINT8)(value >> (8 - KF_BITS));                                          ch->keyfunc = (UINT8)(value >> (8 - KF_BITS));
                                         ch->keynote &= (((UINT32)-1) << KF_BITS);                                          ch->keynote &= (((UINT32)-1) << KF_BITS);
                                         ch->keynote += ch->keyfunc;                                          ch->keynote += ch->keyfunc;
Line 434  void opmgen_setreg(REG8 reg, REG8 value) Line 448  void opmgen_setreg(REG8 reg, REG8 value)
                         }                          }
                         break;                          break;
   
                 case 0x40:                                      // DT1 MUL                  case 0x40:                                      /* DT1 MUL */
                         set_dt1_mul(slot, value);                          set_dt1_mul(slot, value);
                         channelupdate(ch);                          channelupdate(ch);
                         break;                          break;
   
                 case 0x60:                                      // TL                  case 0x60:                                      /* TL */
                         set_tl(slot, value);                          set_tl(slot, value);
                         break;                          break;
   
                 case 0x80:                                      // KS AR                  case 0x80:                                      /* KS AR */
                         set_ks_ar(slot, value);                          set_ks_ar(slot, value);
                         channelupdate(ch);                          channelupdate(ch);
                         break;                          break;
   
                 case 0xa0:                                      // D1R                  case 0xa0:                                      /* D1R */
                         set_d1r(slot, value);                          set_d1r(slot, value);
                         break;                          break;
   
                 case 0xc0:                                      // DT2 D2R                  case 0xc0:                                      /* DT2 D2R */
                         set_dt2_d2r(slot, value);                          set_dt2_d2r(slot, value);
                         channelupdate(ch);                          channelupdate(ch);
                         break;                          break;
   
                 case 0xe0:                                      // D1L RR                  case 0xe0:                                      /* D1L RR */
                         set_d1l_rr(slot, value);                          set_d1l_rr(slot, value);
                         break;                          break;
         }          }
 }  }
   
   #endif
   

Removed from v.1.3  
changed lines
  Added in v.1.9


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