From 2b40842eeca7386f6bfe9b1b39760c8a4d69ca71 Mon Sep 17 00:00:00 2001 From: Simon Howard Date: Sat, 12 Sep 2009 23:04:57 +0000 Subject: Remove separate volume calculations for non-feedback (separate operator) voices. Doom writes the same value to both operators. Subversion-branch: /branches/opl-branch Subversion-revision: 1671 --- src/i_oplmusic.c | 69 ++++++++++++++++++++++++-------------------------------- 1 file changed, 29 insertions(+), 40 deletions(-) (limited to 'src') diff --git a/src/i_oplmusic.c b/src/i_oplmusic.c index a6c03f6f..ce255ff7 100644 --- a/src/i_oplmusic.c +++ b/src/i_oplmusic.c @@ -150,9 +150,8 @@ struct opl_voice_s // The volume of the note being played on this channel. unsigned int note_volume; - // The current volume that has been set for this channel. - unsigned int carrier_volume; - unsigned int modulator_volume; + // The current volume (register value) that has been set for this channel. + unsigned int reg_volume; // Next in linked list; a voice is always either in the // free list or the allocated list. @@ -636,42 +635,15 @@ static void SetVoiceInstrument(opl_voice_t *voice, // Hack to force a volume update. - voice->carrier_volume = 999; - voice->modulator_volume = 999; -} - -// Calculate the volume level to use for a given operator. - -static void SetOperatorVolume(genmidi_op_t *op, unsigned int volume, - unsigned int opnum, - unsigned int *current_volume) -{ - unsigned int op_volume; - unsigned int reg_volume; - - // The volume of each instrument can be controlled via GENMIDI: - - op_volume = 0x3f - op->level; - - // The volume value to use in the register: - - reg_volume = (op_volume * volume) / 128; - reg_volume = (0x3f - reg_volume) | op->scale; - - // Update the register, if neccessary: - - if (*current_volume != reg_volume) - { - *current_volume = reg_volume; - - WriteRegister(OPL_REGS_LEVEL + opnum, reg_volume); - } + voice->reg_volume = 999; } static void SetVoiceVolume(opl_voice_t *voice, unsigned int volume) { genmidi_voice_t *opl_voice; unsigned int full_volume; + unsigned int op_volume; + unsigned int reg_volume; voice->note_volume = volume; @@ -682,16 +654,33 @@ static void SetVoiceVolume(opl_voice_t *voice, unsigned int volume) full_volume = (volume_mapping_table[voice->note_volume] * volume_mapping_table[voice->channel->volume]) / 127; - SetOperatorVolume(&opl_voice->carrier, full_volume, - voice->op2, &voice->carrier_volume); + // The volume of each instrument can be controlled via GENMIDI: + + op_volume = 0x3f - opl_voice->carrier.level; - // If we are using non-modulated feedback mode, we must set the - // volume for both voices. + // The volume value to use in the register: - if ((opl_voice->feedback & 0x01) != 0) + reg_volume = (op_volume * full_volume) / 128; + reg_volume = (0x3f - reg_volume) | opl_voice->carrier.scale; + + // Update the volume register(s) if necessary. + + if (reg_volume != voice->reg_volume) { - SetOperatorVolume(&opl_voice->modulator, full_volume, - voice->op1, &voice->modulator_volume); + voice->reg_volume = reg_volume; + + WriteRegister(OPL_REGS_LEVEL + voice->op2, reg_volume); + + // If we are using non-modulated feedback mode, we must set the + // volume for both voices. + // Note that the same register volume value is written for + // both voices, always calculated from the carrier's level + // value. + + if ((opl_voice->feedback & 0x01) != 0) + { + WriteRegister(OPL_REGS_LEVEL + voice->op1, reg_volume); + } } } -- cgit v1.2.3