| 974 | } |
| 975 | |
| 976 | void PlaybackManager::executeStoredEffectsSSG(int ch) |
| 977 | { |
| 978 | size_t uch = static_cast<size_t>(ch); |
| 979 | bool isNoteDelay = false; |
| 980 | |
| 981 | // Read step beginning based effects |
| 982 | auto& stepBeginBasedEffs = effOnStepBeginMem_[SoundSource::SSG].at(uch); |
| 983 | for (const auto& eff : stepBeginBasedEffs) { |
| 984 | switch (eff.type) { |
| 985 | case EffectType::NoteDelay: |
| 986 | ntDlyCntSSG_.at(uch) = eff.value; |
| 987 | isNoteDelay = true; |
| 988 | break; |
| 989 | default: |
| 990 | break; |
| 991 | } |
| 992 | } |
| 993 | stepBeginBasedEffs.clear(); |
| 994 | |
| 995 | // Read note on and step beginning based effects |
| 996 | if (!isNoteDelay) { |
| 997 | auto& keyOnBasedEffs = effOnKeyOnMem_[SoundSource::SSG].at(uch); |
| 998 | for (const auto& eff : keyOnBasedEffs) { |
| 999 | switch (eff.type) { |
| 1000 | case EffectType::Arpeggio: |
| 1001 | opnaCtrl_->setArpeggioEffectSSG(ch, eff.value >> 4, eff.value & 0x0f); |
| 1002 | break; |
| 1003 | case EffectType::PortamentoUp: |
| 1004 | opnaCtrl_->setPortamentoEffectSSG(ch, eff.value); |
| 1005 | break; |
| 1006 | case EffectType::PortamentoDown: |
| 1007 | opnaCtrl_->setPortamentoEffectSSG(ch, -eff.value); |
| 1008 | break; |
| 1009 | case EffectType::TonePortamento: |
| 1010 | opnaCtrl_->setPortamentoEffectSSG(ch, eff.value, true); |
| 1011 | break; |
| 1012 | case EffectType::Vibrato: |
| 1013 | opnaCtrl_->setVibratoEffectSSG(ch, eff.value >> 4, eff.value & 0x0f); |
| 1014 | break; |
| 1015 | case EffectType::Tremolo: |
| 1016 | opnaCtrl_->setTremoloEffectSSG(ch, eff.value >> 4, eff.value & 0x0f); |
| 1017 | break; |
| 1018 | case EffectType::VolumeSlide: |
| 1019 | { |
| 1020 | int hi = eff.value >> 4; |
| 1021 | int low = eff.value & 0x0f; |
| 1022 | if (hi && !low) opnaCtrl_->setVolumeSlideSSG(ch, hi, true); // Slide up |
| 1023 | else if (!hi) opnaCtrl_->setVolumeSlideSSG(ch, low, false); // Slide down |
| 1024 | break; |
| 1025 | } |
| 1026 | case EffectType::Detune: |
| 1027 | opnaCtrl_->setDetuneSSG(ch, eff.value - 0x80); |
| 1028 | break; |
| 1029 | case EffectType::FineDetune: |
| 1030 | opnaCtrl_->setFineDetuneSSG(ch, eff.value - 0x80); |
| 1031 | break; |
| 1032 | case EffectType::NoteSlideUp: |
| 1033 | opnaCtrl_->setNoteSlideSSG(ch, eff.value >> 4, eff.value & 0x0f); |
nothing calls this directly
no test coverage detected