Implementation
Overview
Basic Concepts
We use the Creation Kit (CK) for all of our audio implementation needs, no other middleware*. The Creation Kit is Bethesda's proprietary software and official learning resources are scarce. It can definitely be an adjustment! We recommend following any basic level design tutorial to get your feet wet.
To install the build, please follow the instructions on the Installation Guide. If you have any issues with getting the game installed, please reach out on the Discord for help.
As an implementer, you will create a "plugin" which contains all of the changes you want to make. Once a month, you will submit your plugin to be merged into the build. Shortly afterwards, a new build will be created with everyone's changes, and the process repeats. More information on plugins and merges is below.
* Technically, we do use Creation Kit Platform Extended, which is an open source project that adds a few bells and whistles to the Creation Kit.
Creating a Plugin File (.esp)
When working on Skywind, you should always be saving your work into a plugin file (extension .esp). This file is what is submitted for merge at the end of each monthly development cycle. It is important that your plugin is correctly parented by the Skywind master file (extension .esm). Here are the steps for creating a new plugin file to house your work.
Open the Creation Kit and navigate to File > Data.
In the dialogue, check the boxes for both Skyrim.esm and Skywind.esm. Do not set any active file. Click OK to load the data.
Explanation: Checking these boxes tells CK to load up the Skyrim and Skywind master files. "Active file" tells CK where our changes should be written to. We want our changes written to a new plugin, so we do not select any active file at this time.
Once loaded, go to File > Save to save your new .esp plugin file. The naming convention is as follows...:
[myName]_[nextBuildNumber].esp
// Examples
gingerstork_0.9.9.62.esp
ganz_0.9.9.62.esp
You have created your plugin! When you create your plugin like this, CK will automatically set it as the active file. However, every subsequent time you open CK, you must remember to load your plugin and set it as the active file.
Again, the "active file" is the file that your changes are saved to. Now that you have an .esp plugin file, make sure it is always selected as the active file so that your changes are correctly saved.
Note, you should only have your plugin selected when loading via the CK Data window. Your plugin file should only be parented by Skyrim.esm and Skywind.esm. Any other configuration may cause your plugin to be un-mergeable!
When loading your plugin in CK: select it, set it as active, and confirm that the parent masters are correct.
How to Merge
Once a month, all Skywind developers submit their changes to be merged into the main build. It is important that every developer submit their changes (even if they are unfinished!) so that we are all in sync, working off of the same build. There is a specific delivery format that is required for your content to be merged correctly.
You are expected to deliver an archive (.zip or .7z) containing all of the assets relevant to your changes. Typically, that means you need to include your .esp plugin as well as any new or modified audio files. Files must be put into a folder structure that matches the build's, so that the merger can unzip your archive directly into their Data folder. For example...
.
└── ganz_0.9.9.62.zip
├── ganz_0.9.9.62.esp
└── sound/
└── fx/
└── morrowind/
└── water/
├── splash_01.wav
└── splash_02.wav
Once your deliverable is ready, upload it to our shared Google Drive. Then, look at the pins in the #dev-chat Discord channel to find the merger sheet. Follow the instructions there -- you'll be adding a link to your work and describing your changes in the changelog.
The end! If there's any issues with your submission then someone will reach out. Within a few days, a new build will be released. You must update your build and create a fresh new plugin or else weird conflicts might happen.
Sound Categories
Sound categories are similar to a group or bus on a mixing console. With it you can control sound descriptors that are linked to it en masse. These also determine whether the sound will play when the game is paused, when the player is underwater.
Sound Descriptors
This is where you specify the name of the ID of the sound effect, the output model, category and a few other properties of the sound. You can also set up conditions for the sound to play.
It is important to note that you have to end the name of the sound effect with the letters LP if the sound is a loop (and also select that it is a loop sound right below the static attenuation settings).
Note that the files specified in the sound descriptor will always play in sequence, top to bottom.
Examples of conditions: time of day, player gender, player race, player HP and many more.
Sound Descriptor Settings
ID: Unique name for the sound.
Descriptor Type: (not currently supported)
Sound: Paths to one or more sound files that will be played when this sound is called.
Conditions: Conditions to determine playback of the sound.
Category: See "Sound Categories".
Output Model: Defines additional playback parameters. See "Sound Output Models".
Static Attenuation (dB): Attenuate the sound's playback by this much in dBFS.
dB Variance: Sets a negative range of values in dBFS that the sound can be attenuated over. For example, if Static Attenuation is -12dB and dB Variance is 6, playback will be between -12 and -18 dBFS, randomized.
Looping:
None: The sound is a 'one shot' and does not loop.
Loop: The sound is a traditional loop (the file must end with _LP). Its playback will be looped from the start of the file to the end
Envelope Fast: The sound is a metadata loop (the file must end with _LPM and contain sustaining loop points within the file) and will play its attack portion and then loop indefinitely between its loop points. Playback will immediately jump to the file's release portion when the sound is done playing.
Envelope Slow: The sound is a metadata loop (the file must end with _LPM and contain sustaining loop points within the file) and will play its attack portion and then loop indefinitely between its loop points. Playback will continue uninterrupted to the end of the file when the sound is done playing.
% Frequency Shift: Static frequency/pitch shift to apply to the sound, positive or negative, during playback.
% Frequency Variance: Variable frequency/pitch shift (in absolute value, thus positive and negative) during playback.
Alternate For...: If a sound cannot be loaded into memory and played in time (e.g. with a time-sensitive event such as a weapon impact), play this sound as an alternate instead. NOTE: Setting up a sound as an alternate means that the sound will be kept in memory at all times, so this should only be used sparingly.
Priority: Determines a sound's priority as it relates to memory and disk i/o. Sounds that can be ignored during periods of heavy system activity (e.g. large battles) or are otherwise not time-sensitive should be given low priorities.
Rumble Send: How much of the sound's level (amplitude) determines rumble motor usage in applicable hand held controllers for both the Small and Big controller motors.
Sound Output Models
All sound descriptors use output models. You can set up a sound to act as a mono point-source sound using HRTF (head-related transfer function) for proper placement relative to the camera/listener, or as a stereo sound with radius or no radius (i.e. no apparent position), or even with specific speaker assignments and levels in mono, stereo, or surround formats.
There will be enough of these created that you will not need to create additional ones when implementing sound effects.
Sound Output Model Settings
ID: Unique name.
Uses HRTF: Select this if the sound is mono and should be played back as a point-source sound in the world relative to the listener.
Defined Speaker Output: Select this if the sound will not be placed in the world but rather have a specifically defined playback through various channel setups.
Source Input Channels: Selects between speaker assignment options (defined below for each channel) based on whether the source sound file is mono (1 input channel) or stereo (2 input channels).
Input Channel: Selects between available input channels from the source audio file. If 1 input channel (channel 0) is available (mono), specific channel outputs are defined below. If 2 input channels (channels 0 and 1, or left and right) are available, those specific channel outputs are again defined below exclusively for each input channel. % of output is defined from 0 to 100 percent.
L - Left, C - Center, R - Right
RL - Surround Left, RR - Surround Right, BL - Rear Surround Left, BR - Rear Surround Right
LFE - Low Frequency Effects
Attenuates With Distance: Select this if the sound should have an inner and outer radius setting, using a volume falloff curve between those two values.
Min Distance: Inner radius of the sound in game units. At and within this radius, the sound will play back at its max volume (its static attenuation as set in the Sound Descriptor). Between the inner radius and outer radius volume falls off according to a five-point curve as defined below.
Max Distance: Outer radius of the sound. At the outer radius, the sound's volume is fully attenuated.
Curve: The custom volume falloff curve between the sound's inner and outer radius (min and max distance). The top-most slider is the data point at the inner radius, whereas the bottom-most slider is the data point at the outer radius. Typically values might follow a slightly logarithmic falloff curve (from top to bottom: 100, 60, 30, 15, 0) or linear falloff curve (100, 75, 50, 25, 0).
Reverb Send %: Percentage of the sound sent to the Reverb Parameter as defined in the currently occupied Acoustic Space. This is equivalent to an 'aux send' on a mixing console. Any sound assigned to use this Output Model will be sending this percentage of its output to the current reverb type.
Allows Rumble: Select this if the sound should use the Rumble settings as defined in the Sound Descriptor.
Reverb Parameters
These settings define the reverb parameters that will be applied to any and all sounds played in an acoustic space that uses these reverb parameters.
You can test the reverb parameters using any sound descriptor. Just click the ‘test’ button and select the sound descriptor you want to test, and click play.
Reverb Parameter Settings
ID: Unique name.
Presets: Drop-down list of available presets. These are very useful as a starting point from which to build your own custom Reverb Types.
Reverb Amp: Output level of the wet signal.
Decay Time (ms): RT60 of the wet signal in milliseconds (800ms == 0.8s).
Reverb Delay (ms): Pre-delay of reverb signal in milliseconds.
Room Filter: High shelf attenuation at defined center frequency in next parameter ...
HF Reference (Hz): Center frequency reference (in Hz) for above high shelf Room Filter parameter.
Decay HF: Ratio defines falloff curve for decay of high frequencies defined by HF Reference center frequency.
Reflections: Gain or attenuation of early reflections.
Reflect Delay (ms): Pre-delay of early reflections.
Diffusion %: Adjusts buildup or falloff of early reflections over time.
Density %: Adjusts time spacing between early reflections and subsequent reflections.
Test: Select a Sound and then use Play/Stop to hear it auditioned with the current Reverb Type parameters.
Acoustic Spaces
Acoustic spaces link the reverb parameters and sound descriptor sets, which are defined in the regions tab, together, to be used in an interior cell (or exterior if you want to override the default reverb settings, but not the sound descriptors that play in that area).
You can add a looping sound that will play whenever you are in that acoustic space.
You can also create an acoustic space cube in any interior to override the acoustic space that is applied via the cell menu. You can do the same for exterior areas, but it will not override the sound sets used in that area, only the reverb parameters.
Exterior Worldspace SFX 101
For exterior areas the workflow is fairly simple:
Create the sound descriptors and apply the correct output models and categories to them.
Go to the region editor window and select the correct region
Click on the sound tab and check the box that says ‘Enable this type of data’
Drag in the sound descriptors into the box and fiddle around with the percentages until you are satisfied.
To open up the region editor, click on World > Regions on the toolbar of the CK. We want to be editing the Skywind worldspace which is called “WrldMorrowind”. Click on the little downwards arrow and select “WrldMorrowind” from the dropdown list.
Once we have the correct worldspace selected, select the correct region from the list. In this instance I am doing Bitter Coast sounds, so I selected the “0BitterCoastRegion”. Once you have your region selected, click on the sound tab, and check the box ‘Enable this type of data’ if you havent already.
Now its a simple case of dragging the sound descriptors into the white box. Once you’ve done that, you can double click on any sound there and tweak the percentages of the sound effect playing randomly while you are in the region.