Sound Effect Override System

Configure clap, wet, hand, mouth, and clap impulse behavior per target, race, penetrator race, skeleton predicates, and penetrator girth.

Overview

The main [SoundEffects] section defines global defaults. Files in ppa-sound-effect-configs can override or layer target-specific sound lists and clap impulse tuning at runtime.

Sound effect overrides use the same inheritance modes as RaceConfig overrides, but named sound overrides can use a Name field in addition to the file stem.

Root SoundEffects

The root section lives in Data/SKSE/Plugins/accurate-penetration.toml.

PropertyTypeDescription
EnabledboolMaster switch for sound effects.
RumbleboolEnables rumble handling where supported.
ClapMinIntervalfloatMinimum seconds between clap sounds.
ClapThrustVelocityfloatVelocity threshold for clap sounds.
ClapMinDepthfloatMinimum penetration depth for clap sounds.
WetMinIntervalfloatMinimum seconds between wet sounds.
WetVelocityThresholdfloatVelocity threshold for starting wet sounds.
WetStopVelocityfloatVelocity threshold below which wet sounds stop.
VelocitySmoothFactorfloatSmoothing factor for sound velocity.
MinFrequencyfloatLowest playback frequency multiplier.
MaxFrequencyfloatHighest playback frequency multiplier.
MinVolumefloatLowest volume multiplier.
MaxVolumefloatHighest volume multiplier.
SpeedScaleMaxfloatVelocity value used as the top of speed-based scaling.
[SoundEffects]
Enabled = true
ClapMinInterval = 0.10
WetMinInterval = 0.15
MinVolume = 0.6
MaxVolume = 1.0

[SoundEffects.Vagina]
ClapSounds = ["Sound\\PPA\\vagina_clap_*.wav"]
WetSounds = ["Sound\\PPA\\wet_*.wav"]
ClapSoundVolumeScale = 0.8
WetSoundVolumeScale = 0.6
Auto Disable

After loading root and override configs, sound effects are disabled if no configured clap or wet sound files exist under Data. A clap-impulse-only override does not keep the sound system enabled by itself.

Override Files

Sound override files are loaded from:

Data/SKSE/Plugins/ppa-sound-effect-configs/

Like RaceConfig overrides, files are loaded in reverse alphabetical order, then sorted by priority with the later-loaded entries winning. Later [[Override]] entries inside the same file receive higher priority than earlier entries.

A file can be one root-level override or multiple [[Override]] tables. Each override must specify a valid Target.

# Single override file
Target = "Vagina"
Races = ["Skyrim.esm|013745"]

[Config]
ClapSounds = ["Sound\\PPA\\human_clap_*.wav"]
WetSounds = ["Sound\\PPA\\human_wet_*.wav"]
# Multi override file
[[Override]]
Target = "Mouth"
Name = "oral_light"

[Override.Config]
WetSounds = ["Sound\\PPA\\oral_light_*.wav"]

[[Override]]
Target = "Mouth"
Inherits = "oral_light"
PenisGirthMin = 1.4

[Override.Config]
WetSoundVolumeScale = 0.85

Targets

Target selects both the scene site and the config data type.

Target ValuesConfig TypeNotes
Vagina, VaginalOrificeSoundConfigUsed for vaginal penetration.
Anus, AnalOrificeSoundConfigAlso used for combined/both site resolution.
Mouth, OralOrificeSoundConfigUsed for oral penetration.
Hands, Hand, HandjobOrificeSoundConfigUsed for left, right, and both hand sites.
ClapImpulse, clap_impulse, ImpulseClapImpulseConfigControls cheek/body impulse response instead of sound file lists.

Inheritance

ValueModeBehavior
missingDefaultStarts from the root config for the same target.
"default"DefaultSame as missing.
""NoneStarts from blank sound or impulse config.
"any"Any overlayLayers only specified fields onto the runtime-selected base.
"name"NamedStarts from a named override with the same target.

The name lookup uses lowercase Name when present. If Name is missing, the first override in a file can be referenced by file stem, and later array entries fall back to stem#index internally.

Target Boundaries

Named sound inheritance is target-specific. A Target = "Mouth" override cannot inherit from a Target = "Vagina" override; the loader falls back to the root config for the requested target.

Resolution

At runtime, orifice sounds resolve within the active target bucket, while clap impulse resolves against the clap impulse list.

1

The system scans matching overrides from highest priority to lowest.

2

The first matching non-any override becomes the base. If none matches, the root target config is used.

3

Matching any overlays with higher priority than the base are applied lowest priority first, so higher priority overlays win conflicts.

If there are no matching overlays, the resolver can return the root or base config directly. If overlays match, it returns a composed snapshot.

Predicates

Sound predicates can check the penetrated actor, penetrator race, and girth. The root override table is interpreted as penetrated-actor predicates by default.

LocationKeysActor Checked
Override rootRaces, Race, PenetratedRaces, PenetratedRacePenetrated actor
[Predicates]Races, Race, PenetratedRaces, PenetratedRace, IsSex, HasAllBones, HasOneBonePenetrated actor
[Predicates.Penetrated]Races, Race, PenetratedRaces, PenetratedRacePenetrated actor race
Override root or [Predicates]PenetratorRace, PenetratorRacesPenetrator actor race
[Predicates.Penetrator]Race, Races, PenetratorRace, PenetratorRacesPenetrator actor race
Target = "Anus"
PenetratorRaces = ["Skyrim.esm|0131E7"]

[Predicates]
IsSex = [1]
HasAllBones = ["NPC LB Anus2", "NPC RB Anus2"]

[Config]
ClapSounds = ["Sound\\PPA\\anal_wolf_*.wav"]

Girth Rules

PenisGirthMin and PenisGirthMax can be placed at the override root or inside [Predicates]. If either is non-zero, girth matching is enabled.

FieldBehaviorNotes
PenisGirthMinRequires girth at least this value.A girth value of 0 fails when a range is enabled.
PenisGirthMaxRequires girth at most this value.If max is less than or equal to min, there is no upper cap.
Target = "Mouth"
PenisGirthMin = 1.3

[Config]
WetSounds = ["Sound\\PPA\\oral_large_*.wav"]
WetSoundVolumeScale = 0.9

Orifice Sounds

Targets Vagina, Anus, Mouth, and Hands use OrificeSoundConfig.

PropertyTypeDescription
ClapSoundsstring[]Data-relative clap sound paths. Replaces the inherited list when present.
WetSoundsstring[]Data-relative wet sound paths. Replaces the inherited list when present.
ClapSoundVolumeScalefloatPer-target clap volume scale.
WetSoundVolumeScalefloatPer-target wet volume scale.

Fields can be placed directly on the override or under [Config]. The [Config] form is clearer because it separates matching metadata from sound data.

Clap Impulse

Target = "ClapImpulse" uses ClapImpulseConfig.

PropertyTypeDescription
EnabledboolEnables clap impulse response for this resolved config.
OverallStrengthfloatGlobal multiplier for impulse strength.
SpeedSensitivityfloatHow strongly thrust speed affects impulse.
RotationScalefloatRotation contribution scale.
VariationfloatRandom variation, clamped by the loader to 0.0 through 0.5.
CheekDelayfloatDelay between paired cheek/body impulse application.

Wildcards

Sound arrays support one * wildcard in each path. Wildcards are expanded under the game's Data directory and sorted alphabetically.

ClapSounds = [
    "Sound\\PPA\\clap_light_*.wav",
    "Sound\\PPA\\single_extra.wav",
]

The text before and after * is still part of the match. thrust_*.wav matches thrust_01.wav, but not vagina_01.wav, my_thrust_01.wav, or thrust_01.WAV.

If a wildcard directory does not exist or no filenames match, that entry expands to nothing. Non-wildcard entries are kept as written and checked later against Data.

Example: Targeted Sounds

50_human_vaginal.toml

Starts from the root vaginal sound config and replaces both sound lists for the listed races.

Target = "Vagina"
Races = ["Skyrim.esm|013745", "Skyrim.esm|013746"]

[Config]
ClapSounds = ["Sound\\PPA\\human_vaginal_clap_*.wav"]
WetSounds = ["Sound\\PPA\\human_vaginal_wet_*.wav"]
ClapSoundVolumeScale = 0.75
WetSoundVolumeScale = 0.65

Example: Any Overlay

This high-priority overlay keeps the selected base sound lists and only boosts wet volume for large girth mouth scenes.

Target = "Mouth"
Inherits = "any"
PenisGirthMin = 1.4

[Config]
WetSoundVolumeScale = 0.9

Example: Impulse Override

This override changes clap impulse behavior when the penetrator race matches a canine race.

Target = "ClapImpulse"
PenetratorRaces = ["Skyrim.esm|0131E7", "Skyrim.esm|0131E9"]

[Config]
Enabled = true
OverallStrength = 1.4
SpeedSensitivity = 3.0
RotationScale = 0.45
Variation = 0.25
CheekDelay = 0.016

Full Examples

Use these as complete snippets for the file paths shown. Sound effect override files go under Data/SKSE/Plugins/ppa-sound-effect-configs/. The paths inside ClapSounds and WetSounds are relative to the game's Data directory.

Common Mixup

[[Override]] files are not pasted under [SoundEffects] in accurate-penetration.toml. If you are editing the main TOML instead, use the root format shown in the second example.

For hand sounds, use the canonical target Hands. Hand is accepted as an alias, but Hands matches the root config name and menu label.

Data/SKSE/Plugins/ppa-sound-effect-configs/50_ppa_sound_pack.toml

One override file containing all four site configs. This is the correct multi-override shape when each site should use a different folder of sounds.

[[Override]]
Target = "Vagina"

[Override.Config]
ClapSounds = ["Sound\\fx\\ppa\\vagina\\thrust_*.wav"]
WetSounds = ["Sound\\fx\\ppa\\vagina\\wet_*.wav"]
ClapSoundVolumeScale = 0.8
WetSoundVolumeScale = 0.5

[[Override]]
Target = "Anus"

[Override.Config]
ClapSounds = ["Sound\\fx\\ppa\\anus\\plap_*.wav"]
WetSounds = ["Sound\\fx\\ppa\\anus\\wet_*.wav"]
ClapSoundVolumeScale = 0.8
WetSoundVolumeScale = 0.5

[[Override]]
Target = "Mouth"

[Override.Config]
ClapSounds = ["Sound\\fx\\ppa\\mouth\\suck_*.wav"]
WetSounds = ["Sound\\fx\\ppa\\mouth\\wet_*.wav"]
ClapSoundVolumeScale = 0.8
WetSoundVolumeScale = 0.5

[[Override]]
Target = "Hands"

[Override.Config]
WetSounds = ["Sound\\fx\\ppa\\hands\\fap_*.wav"]
WetSoundVolumeScale = 0.8
Data/SKSE/Plugins/accurate-penetration.toml

The same sound lists as root defaults in the main settings file. Use this shape only when editing the main accurate-penetration.toml.

[SoundEffects]
Enabled = true

[SoundEffects.Vagina]
ClapSounds = ["Sound\\fx\\ppa\\vagina\\thrust_*.wav"]
WetSounds = ["Sound\\fx\\ppa\\vagina\\wet_*.wav"]
ClapSoundVolumeScale = 0.8
WetSoundVolumeScale = 0.5

[SoundEffects.Anus]
ClapSounds = ["Sound\\fx\\ppa\\anus\\plap_*.wav"]
WetSounds = ["Sound\\fx\\ppa\\anus\\wet_*.wav"]
ClapSoundVolumeScale = 0.8
WetSoundVolumeScale = 0.5

[SoundEffects.Mouth]
ClapSounds = ["Sound\\fx\\ppa\\mouth\\suck_*.wav"]
WetSounds = ["Sound\\fx\\ppa\\mouth\\wet_*.wav"]
ClapSoundVolumeScale = 0.8
WetSoundVolumeScale = 0.5

[SoundEffects.Hands]
WetSounds = ["Sound\\fx\\ppa\\hands\\fap_*.wav"]
WetSoundVolumeScale = 0.8
Equivalent split override files

If each target gets its own file, do not use [[Override]] or [Override.Config]. A one-override file uses Target at the file root and puts sound fields under [Config].

Data/SKSE/Plugins/ppa-sound-effect-configs/50_vagina.toml

Target = "Vagina"

[Config]
ClapSounds = ["Sound\\fx\\ppa\\vagina\\thrust_*.wav"]
WetSounds = ["Sound\\fx\\ppa\\vagina\\wet_*.wav"]
ClapSoundVolumeScale = 0.8
WetSoundVolumeScale = 0.5

Data/SKSE/Plugins/ppa-sound-effect-configs/50_anus.toml

Target = "Anus"

[Config]
ClapSounds = ["Sound\\fx\\ppa\\anus\\plap_*.wav"]
WetSounds = ["Sound\\fx\\ppa\\anus\\wet_*.wav"]
ClapSoundVolumeScale = 0.8
WetSoundVolumeScale = 0.5

Data/SKSE/Plugins/ppa-sound-effect-configs/50_mouth.toml

Target = "Mouth"

[Config]
ClapSounds = ["Sound\\fx\\ppa\\mouth\\suck_*.wav"]
WetSounds = ["Sound\\fx\\ppa\\mouth\\wet_*.wav"]
ClapSoundVolumeScale = 0.8
WetSoundVolumeScale = 0.5

Data/SKSE/Plugins/ppa-sound-effect-configs/50_hands.toml

Target = "Hands"

[Config]
WetSounds = ["Sound\\fx\\ppa\\hands\\fap_*.wav"]
WetSoundVolumeScale = 0.8
Data/SKSE/Plugins/ppa-sound-effect-configs/50_mouth_with_large_girth_overlay.toml

Use Inherits = "any" when you want to change one or two fields on top of whatever config already matched. Here, the large-girth rule keeps the selected mouth sound lists and only raises wet volume.

Use default inheritance when the override should start from the root target config. Use Inherits = "" when the override should start blank. Use any when you do not want to duplicate or replace the selected sound lists.

[[Override]]
Target = "Mouth"

[Override.Config]
ClapSounds = ["Sound\\fx\\ppa\\mouth\\suck_*.wav"]
WetSounds = ["Sound\\fx\\ppa\\mouth\\wet_*.wav"]
ClapSoundVolumeScale = 0.8
WetSoundVolumeScale = 0.5

[[Override]]
Target = "Mouth"
Inherits = "any"
PenisGirthMin = 1.4

[Override.Config]
WetSoundVolumeScale = 0.9
Data/SKSE/Plugins/ppa-sound-effect-configs/60_predicated_anal_sounds.toml

Predicates limit when an override can match. This example only uses these anal sounds when the penetrated actor is one of the listed races, has the required anus bones, and the penetrator is one of the listed races.

Target = "Anus"

[Predicates]
Races = ["Skyrim.esm|013745", "Skyrim.esm|013746"]
PenetratorRaces = ["Skyrim.esm|0131E7", "Skyrim.esm|0131E9"]
HasAllBones = ["NPC LB Anus2", "NPC RB Anus2"]

[Config]
ClapSounds = ["Sound\\fx\\ppa\\anus\\canine_plap_*.wav"]
WetSounds = ["Sound\\fx\\ppa\\anus\\canine_wet_*.wav"]
ClapSoundVolumeScale = 0.9
WetSoundVolumeScale = 0.7
Custom filenames must match the wildcard

If your files use different names than the example pack, change the wildcard too. The loader does not search for every .wav in the folder unless the pattern says to.

# These files:
# Data/Sound/fx/ppa/vagina/custom_vag_01.wav
# Data/Sound/fx/ppa/vagina/custom_vag_02.wav
# Data/Sound/fx/ppa/vagina/slosh_01.wav

Target = "Vagina"

[Config]
ClapSounds = ["Sound\\fx\\ppa\\vagina\\custom_vag_*.wav"]
WetSounds = ["Sound\\fx\\ppa\\vagina\\slosh_*.wav"]

For a folder where every .wav should be eligible, use *.wav. This is broader and may mix clap and wet sounds together if both lists point at the same folder.

Target = "Vagina"

[Config]
ClapSounds = ["Sound\\fx\\ppa\\vagina\\*.wav"]
Sanity Check

At least one configured sound path must resolve to a real file under Data. For example, Sound\\fx\\ppa\\vagina\\thrust_*.wav must match files such as Data/Sound/fx/ppa/vagina/thrust_01.wav. If no configured clap or wet files exist anywhere, the sound system disables itself after loading configs.