aboutsummaryrefslogtreecommitdiff
path: root/src/adlmidi_opl3.cpp
diff options
context:
space:
mode:
authorWohlstand <admin@wohlnet.ru>2017-11-26 03:08:47 +0300
committerWohlstand <admin@wohlnet.ru>2017-11-26 03:08:47 +0300
commitb92cc8e942b91268b096757fe22aca8368ea3de6 (patch)
tree086ee97fed7ed2aad2e64e8870021ba032fd9c59 /src/adlmidi_opl3.cpp
parent52bbba002d7f39334e833f3ec9e1de010d161bdf (diff)
parent5fa684bd2732f638763cd62bed831ccc6aafc0bf (diff)
downloadlibADLMIDI-b92cc8e942b91268b096757fe22aca8368ea3de6.tar.gz
libADLMIDI-b92cc8e942b91268b096757fe22aca8368ea3de6.tar.bz2
libADLMIDI-b92cc8e942b91268b096757fe22aca8368ea3de6.zip
Merge branch 'master' into get-rid-of-backup-buffer
Diffstat (limited to 'src/adlmidi_opl3.cpp')
-rw-r--r--src/adlmidi_opl3.cpp19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/adlmidi_opl3.cpp b/src/adlmidi_opl3.cpp
index 421148d..2d1f3e8 100644
--- a/src/adlmidi_opl3.cpp
+++ b/src/adlmidi_opl3.cpp
@@ -271,7 +271,7 @@ void OPL3::NoteOn(unsigned c, double hertz) // Hertz range: 0..131071
}
}
-void OPL3::Touch_Real(unsigned c, unsigned volume)
+void OPL3::Touch_Real(unsigned c, unsigned volume, uint8_t brightness)
{
if(volume > 63)
volume = 63;
@@ -332,9 +332,22 @@ void OPL3::Touch_Real(unsigned c, unsigned volume)
{
bool do_modulator = do_ops[ mode ][ 0 ] || ScaleModulators;
bool do_carrier = do_ops[ mode ][ 1 ] || ScaleModulators;
- Poke(card, 0x40 + o1, do_modulator ? (x | 63) - volume + volume * (x & 63) / 63 : x);
+
+ uint32_t modulator = do_modulator ? (x | 63) - volume + volume * (x & 63) / 63 : x;
+ uint32_t carrier = do_carrier ? (y | 63) - volume + volume * (y & 63) / 63 : y;
+
+ if(brightness != 127)
+ {
+ brightness = static_cast<uint8_t>(std::round(127.0 * std::sqrt((static_cast<double>(brightness)) * (1.0 / 127.0))) / 2.0);
+ if(!do_modulator)
+ modulator = (modulator | 63) - brightness + brightness * (modulator & 63) / 63;
+ if(!do_carrier)
+ carrier = (carrier | 63) - brightness + brightness * (carrier & 63) / 63;
+ }
+
+ Poke(card, 0x40 + o1, modulator);
if(o2 != 0xFFF)
- Poke(card, 0x40 + o2, do_carrier ? (y | 63) - volume + volume * (y & 63) / 63 : y);
+ Poke(card, 0x40 + o2, carrier);
}
// Correct formula (ST3, AdPlug):