diff options
author | Wohlstand <admin@wohlnet.ru> | 2017-11-25 03:59:25 +0300 |
---|---|---|
committer | Wohlstand <admin@wohlnet.ru> | 2017-11-25 03:59:25 +0300 |
commit | 9166fd48255c7002ba9fbc7a4679a49da544e8c3 (patch) | |
tree | f6e836fc6f644600cfcc9218eec833bbd16f3845 /src/adlmidi_opl3.cpp | |
parent | b456f06aaf89b4db0ddbba86bba2e141a46bec2b (diff) | |
download | libADLMIDI-9166fd48255c7002ba9fbc7a4679a49da544e8c3.tar.gz libADLMIDI-9166fd48255c7002ba9fbc7a4679a49da544e8c3.tar.bz2 libADLMIDI-9166fd48255c7002ba9fbc7a4679a49da544e8c3.zip |
Experimental: Added Brightness CC74 controller support
Diffstat (limited to 'src/adlmidi_opl3.cpp')
-rw-r--r-- | src/adlmidi_opl3.cpp | 19 |
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): |