|
|
| version 1.8, 2005/02/07 16:56:33 | version 1.9, 2008/06/02 20:07:32 |
|---|---|
| Line 12 | 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 61 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 100 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 129 void opmgen_setvol(UINT vol) { | Line 129 void opmgen_setvol(UINT vol) { |
| } | } |
| // ---- | /* ---- */ |
| static void keyon(OPMCH *ch, REG8 value) { | static void keyon(OPMCH *ch, REG8 value) { |
| Line 142 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 154 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 351 static void channelupdate(OPMCH *ch) { | Line 351 static void channelupdate(OPMCH *ch) { |
| } | } |
| //----------------------------------------------------------------------------- | /*----------------------------------------------------------------------------- */ |
| void opmgen_reset(void) { | void opmgen_reset(void) { |
| Line 398 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 428 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 448 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; |
| } | } |