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.
| Property | Type | Description |
|---|---|---|
| Enabled | bool | Master switch for sound effects. |
| Rumble | bool | Enables rumble handling where supported. |
| ClapMinInterval | float | Minimum seconds between clap sounds. |
| ClapThrustVelocity | float | Velocity threshold for clap sounds. |
| ClapMinDepth | float | Minimum penetration depth for clap sounds. |
| WetMinInterval | float | Minimum seconds between wet sounds. |
| WetVelocityThreshold | float | Velocity threshold for starting wet sounds. |
| WetStopVelocity | float | Velocity threshold below which wet sounds stop. |
| VelocitySmoothFactor | float | Smoothing factor for sound velocity. |
| MinFrequency | float | Lowest playback frequency multiplier. |
| MaxFrequency | float | Highest playback frequency multiplier. |
| MinVolume | float | Lowest volume multiplier. |
| MaxVolume | float | Highest volume multiplier. |
| SpeedScaleMax | float | Velocity 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
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 Values | Config Type | Notes |
|---|---|---|
| Vagina, Vaginal | OrificeSoundConfig | Used for vaginal penetration. |
| Anus, Anal | OrificeSoundConfig | Also used for combined/both site resolution. |
| Mouth, Oral | OrificeSoundConfig | Used for oral penetration. |
| Hands, Hand, Handjob | OrificeSoundConfig | Used for left, right, and both hand sites. |
| ClapImpulse, clap_impulse, Impulse | ClapImpulseConfig | Controls cheek/body impulse response instead of sound file lists. |
Inheritance
| Value | Mode | Behavior |
|---|---|---|
| missing | Default | Starts from the root config for the same target. |
| "default" | Default | Same as missing. |
| "" | None | Starts from blank sound or impulse config. |
| "any" | Any overlay | Layers only specified fields onto the runtime-selected base. |
| "name" | Named | Starts 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.
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.
The system scans matching overrides from highest priority to lowest.
The first matching non-any override becomes the base. If none matches, the root target config is used.
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.
| Location | Keys | Actor Checked |
|---|---|---|
| Override root | Races, Race, PenetratedRaces, PenetratedRace | Penetrated actor |
| [Predicates] | Races, Race, PenetratedRaces, PenetratedRace, IsSex, HasAllBones, HasOneBone | Penetrated actor |
| [Predicates.Penetrated] | Races, Race, PenetratedRaces, PenetratedRace | Penetrated actor race |
| Override root or [Predicates] | PenetratorRace, PenetratorRaces | Penetrator actor race |
| [Predicates.Penetrator] | Race, Races, PenetratorRace, PenetratorRaces | Penetrator 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.
| Field | Behavior | Notes |
|---|---|---|
| PenisGirthMin | Requires girth at least this value. | A girth value of 0 fails when a range is enabled. |
| PenisGirthMax | Requires 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.
| Property | Type | Description |
|---|---|---|
| ClapSounds | string[] | Data-relative clap sound paths. Replaces the inherited list when present. |
| WetSounds | string[] | Data-relative wet sound paths. Replaces the inherited list when present. |
| ClapSoundVolumeScale | float | Per-target clap volume scale. |
| WetSoundVolumeScale | float | Per-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.
| Property | Type | Description |
|---|---|---|
| Enabled | bool | Enables clap impulse response for this resolved config. |
| OverallStrength | float | Global multiplier for impulse strength. |
| SpeedSensitivity | float | How strongly thrust speed affects impulse. |
| RotationScale | float | Rotation contribution scale. |
| Variation | float | Random variation, clamped by the loader to 0.0 through 0.5. |
| CheekDelay | float | Delay 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
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.
[[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.
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
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
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
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
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
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"]
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.