User:Soundscapes cn

From Valve Developer Community
Jump to: navigation, search
English (en)

Soundscape(音景)是一种音效脚本,用于向地图添加环境音效,它在地图中的数量没有严格限制,只需一个实体即可完成所有步骤,并且不会产生任何网络开销。音景通常为循环音效和随机音效的组合,这些声音可以通过从8个可分配的目标位置之一发出;同时还可以强制使用DSPSoundmixer

每次只能同时播放一个音景,并且其中的任何声音都无法用I/O系统控制,当另一个音景启用时,游戏会自动淡入淡出

Tip.pngTip:
  • 过渡时间由控制台指令soundscape_fadetime定义,或者在更新的游戏中由fadetime键值定义。
  • 使用控制台指令soundscape_debug来检查哪个音景处于活动状态以及原因
Note.pngNote:
  • 在不正常编译VVIS的情况下(如:以快速模式(-fast)编译),音景将无法正常工作
  • 除非音频文件有标记点,否则它们无法作为循环音效,详见Looping a Sound
  • 大部分起源游戏中,音景无法同时播放统一音效,即便音调,音量和Sound Level不同,有关解决方法详见下方
  • 玩家出生点至少应位于一个音景的半径范围内(或边界框),否则玩家将在没有音景播放的情况下生成

音景

浏览音景

音景通常位于游戏的scripts\文件夹下多个以soundscapes_为前缀的文本文件。每一个音景都由全局清单scripts\soundscapes_manifest.txt控制,其中列出了游戏应读取的所有音景脚本。通过这种方法加载的音景可以用于游戏中的任何地方,即便它们是为某个场景专门设计的

音景同时还可以以地图专用的方法进行使用

scripts\soundscapes_<地图名>.txt

此处的<地图名>应为它们所对应的BSP文件名称。这种音景可以在不修改全局清单的情况由地图自动读取,但也只能用于该地图中。

Note.pngNote:Mapbase Mapbase中,此方法变为maps/<地图名>_soundscapes.txt
Note.pngNote:在官方起源游戏中,这些文件通常被打包到VPK中,但可以被同路径下的未打包版本自动覆盖

你可以在页面底部找到部分游戏的音景列表链接,以及社区对部分音景效果的描述

You can browse through all the available soundscapes in a current game first hand, using the in-game console command PlaySoundscape. After typing in the first letter as the commands parameter, the auto-complete feature will list them as suggestions. You can then scroll through this list using the arrow keys.

Configuring Soundscapes

Soundscapes can only be configured through these entities:

There are other entities which can activate the soundscape, but these are the only entities which actually define soundscape properties. The other entities will point to these and use them as masters to remotely trigger the soundscape.

Whenever these entities activate a soundscape, any positional audio will originate from the targets defined under their properties.

Tip.pngTip: Many soundscapes define positions for sounds to emanate from, so it is always a good idea to peek into the soundscape entry and get a feel for what you can do. Most entries are found in the text files listed in the <game>/scripts/soundscapes_manifest.txt file. To better understand soundscape entries, see below.

Activating Soundscapes

Any soundscape entity that is enabled and becomes triggered by the player, activates its - or its master's - specified soundscape. Soundscapes remain active until a map change occurs, or another soundscape is activated, even if the entity that originally activated it becomes disabled.

Tip.pngTip:The soundscape_flush console command will cancel an active soundscape.


Soundscape entities

Soundscapes can be activated by any of the following entities:

Soundscape entities are themselves point-based, but trigger when the player enters their specified radius and the entity has a line of sight to them.

The two exceptions to this are env_soundscape_proxy (that is triggered through an env_soundscape or an env_soundscape_triggerable), and env_soundscape_triggerable (that is typically set to also be triggered by a trigger_soundscape).

As only one soundscape can be active at any one time, if one or more soundscape entities are triggered simultaneously, the closest one is given precedence. (The radius of soundscape entities always take precedence over trigger_soundscape brushes.)

Note that a soundscape will not stop playing just because a player exits its radius or it loses line of sight to them.


Tip.pngTip:Use the cvar soundscape_debug to examine which entity is active and why.


Soundscape Placement

At first, a good rule is to place only as many soundscapes as you absolutely need. Try to choose from a similar set of soundscapes to be played, and then pick one that will be your primary soundscape. After that, place your secondary soundscapes at every contrasting location (e.g. house, generator room). Make sure that every location with localized sound effects has its own master soundscape that is tied to the proper targets.

Once you've gotten a general idea of where your soundscapes will be located, you'll then be able to start adding/configuring the entities that will trigger your soundscapes and create a kind of blueprint for how soundscapes will flow from one to another. In many cases, you'll be placing entities that block off all exits from your contrasting locations with triggers to your primary soundscapes. Basically, the goal is to anticipate the player's movement throughout the map, and to block off each area in such a way that it will always have the proper soundscape activated.

After your flow is organized, you'll be able to specialize your soundscapes/triggers to behave in complex ways (e.g responding to game events).

Multiple instances of one sound in one soundscape

Currently, in most Source engine branches, it is impossible to play two or more identical sounds at same time in the same soundscape, even if the volume, the pitch or the sound level is different.

This issue has been remedied (in all games since Counter-Strike: Global Offensive), allowing soundscapes to play multiple instances of identical sounds concurrently.

Clarify: Has this been fixed in any pre-CS:GO branches?

A possible solution is to create a copy of the first sound and name it differently. This can be a workaround for really short sounds like light hum, but not recommended for others due to the fact that it increase the overall size uselessly. This is the solution that Valve has chosen in cs_militia, in Counter-Strike Source. In the kitchen, there are two fluorescent lights with hum sounds, but the first one is "ambient/machines/fluorescent_hum_1.wav" and the second one is "ambient/machines/fluorescent_hum_2.wav". Those two sounds are completely identical, but need to be two different name in order to be used in the same soundscape.

Another example is the situation below. We have 3 fluorescent lights and we want hum sounds at their locations. In order to work correctly, soundscape file and Hammer entities should be configured like below.

Soundscape identicalsounds.jpg
Hammer identicalsounds.jpg
"soundscape.demovdc"
{
	"playlooping"
	{
		"volume"	".65"
		"pitch"		"92"
		"channel"	"CHAN_AUTO"
		"position"	"0"
		"attenuation"	"1.2"
		"wave"		"ambient\machines\fluorescent_hum_1.wav"
	}
	
	"playlooping"
	{
		"volume"	".65"
		"pitch"		"92"
		"channel"	"CHAN_AUTO"
		"position"	"1"
		"attenuation"	"1.2"
		"wave"		"ambient\machines\fluorescent_hum_2.wav"
	}
	
	"playlooping"
	{
		"volume"	".65"
		"pitch"		"92"
		"channel"	"CHAN_AUTO"
		"position"	"2"
		"attenuation"	"1.2"
		"wave"		"ambient\machines\fluorescent_hum_3.wav"
	}
}

Despite the fact that most Source engine branches cannot play more than one identical sound at once, in some situations, it appears that it is possible to play the same sound multiple time at different locations using channels. After many tests in various situations and source code exploration, it seems to be possible by using different channels. For example, instead of using different names, we use different channels like CHAN_STATIC, CHAN_STREAM, CHAN_AUTO, etc. For an unknown reason at the moment, this won't work every time or for each time the map is loaded. See Soundscript for more information.

Custom Soundscapes

Creation

Soundscape scripts are very similar to soundscripts, but still remain entirely different things.

Soundscapes require a few of their own rules, and are placed in plain text files that are separate from normal soundscript files. A typical soundscape file might be named soundscape_mall.txt and may contain anywhere from 5-30 different soundscapes that take on the following format.

Icon-Bug.pngBug:If a soundscape's name is too long, soundscape entities will not be able to trigger it, although it will still be triggerable through console. Character limit unknown.  [todo tested in?]
<name>
{
	<rule>
	{
		<keyvalue>
		...
	}

	...
}

Common keyvalues

wave <string>
The path and filename of the sound to play, relative to game\sound\.
Tip.pngTip:Despite the name, this KV is used to play any supported audio filetype, not just WAV files.
volume <normal>
1 is full power, 0 is silent.
pitch <integer>
Percentage value. 70-130 is the useful range.
music <boolean> (only in The Ship: Murder Party)
The sound is considered "music", and will be affected by the music volume setting. Akin to setting the # sound character, only it is affected by DSP and is directional.
Sound attenuation.jpg
position <0-7>
One of eight locations in the world (defined by the mapper) from which a sound can be emitted.
position random
As above, but the sound emits from a completely random location near the player.
origin <origin> (in all games since Left 4 Dead)
Plays a sound at this origin, for example "0,0,0". The coordinates must be comma-delimited but may contain preceding and following spaces.
Note.pngNote:Similar to position but the script itself decides where to play this sound. Only useful for soundscapes intended for one single map, because on other maps you won't have any way of changing the location of the sound.
attenuation <float>
How quickly the sound's volume drops as the camera moves away from it. Only relevant with a position specified. Default value is: "1.00". The lower the value is, greater the radius of the sound will be. And the opposite, higher the value is, smaller the radius of the sound will be. See the image above for illustrated example.
soundlevel <string>
Can be used instead of attenuation. Accepts one of the engine's pre-set values.
Warning.pngWarning:Remember to enclose any values with space characters in "quote marks".
suppress_on_restore <0 or 1>
Prevents sound from restarting upon loading a saved game.
Tip.pngTip:It's intended for music played inside soundscape.

Randomized values

Some rules accept 'upper' and 'lower' parameter values. For example:

"pitch"	"80,120"

Whenever the rule is executed the value will be randomly selected within the given range.

Rules

playlooping

"playlooping"
{
	"volume"	"0.98"
	"pitch"		"110"
	"soundlevel"	"SNDLVL_85dB"

	"position"	"0"

	"wave"	"ambient/swamps/water_Lap_loop_st.wav"
}

Plays a sound constantly. Does not allow random values.

Note.pngNote:Sound files will not properly loop unless they have a cue point. See Looping a Sound.
Icon-Bug.pngBug:If another soundscape containing the same "playlooping" sound is triggered, but the sound has a different "pitch" value, the sound will cease to play unless the soundscape is re-triggerred from the one not containing said sound.  [todo tested in?]

playrandom

"playrandom"
{
        // Play every 1 to 4 seconds
	"time"		"1,4"

	"volume"	"0.4,1"
	"pitch"		"90,105"
	"soundlevel"	"SNDLVL_85dB"
	
	"position"	"0"
	
	"rndwave"
	{
		"wave"	"ambient/wind/wind_med1.wav"
		"wave"	"ambient/wind/wind_hit1.wav"
	}
}

Plays a sound after the given range of the minimum and maximum numbers of seconds specified in the time KV. Allows random values.

Playrandom requires all wave KVs to be inside rndwave (even if there is only one). A random selection will be made every time the rule is executed.

Warning.pngWarning:Be careful not to specify any looping sounds in a playrandom group as they may not stop even if a different soundscape is activated.
Note.pngNote:Even non-looping sounds such as mp3s will not stop if a different soundscape is activated. (Tested in Counter-Strike: Source)

playsoundscape

"SubScape"
{
	"playsoundscape"
	{
		"name"	"GenericIndoor"
		
		// Overall sub-scape volume to 50%
		"volume"	"0.5"
		
		// Emit all positioned sounds from position 0
		"positionoverride"	"0"
		
		// Emit all ambient sounds from position 1
		"ambientpositionoverride"	"1"
	}
}

Plays a complete soundscape. DSP presets in the 'sub-scape' are ignored.

name
Name of the soundscape to play.
position <int>
Offsets each position index of the sub-scape.
For example, if set to 2, then sounds at positions 0, 1, 2, and 3 from the sub-scape would be played at positions 2, 3, 4, and 5 respectively.
positionoverride <int>
Forces all positioned sounds in the sub-scape to emit from one location.
ambientpositionoverride <int>
Forces all unpositioned (i.e. ambient) sounds in the sub-scape to emit from one location.

dsp <integer>

// Disable DSP and play no ambient sounds
"Empty"
{
	"dsp"	"0"
	"dsp_volume"	"1.0"
}

//DSP room type with a DSP spatial type
"Empty2"
{ 
	"dsp"	"40"
        "dsp_spatial"	"119"
	"dsp_volume"	"1.0"
}
dsp_spatial <integer>
dsp_volume <float>

Set the current DSP preset. "dsp" "1" derives from the $surfaceprop of nearby materials.

For a list of values, open scripts\dsp_presets.txt. You may need to extract this from the relevant engine VPK with GCFScape. To preview a DSP preset, submit room_type <int> to the console.

Note.pngNote:Be careful when setting presets in soundscapes that could be used in many different locations.
Note.pngNote:You can also use dsp_volume to define how loud the dsp effect is.
Note.pngNote:In newer branches of Source (2009+) the cvar for room_type is dsp_room with the addition of a spatial dsp preset dsp_spatial.
Note.pngNote:A dsp spatial type can also be assigned to a soundscape in conjunction with dsp room type ("dsp") with "dsp_spatial" "n"

fadetime <float>

"SoundScapeName"
{
	"fadetime"  "1.0"
	"playlooping"
	{
		// ...
	}
}

(in all games since Left 4 Dead 2)

The amount of time, in seconds, at which a soundscape fades in.

Note.pngNote:In games without fadetime such as Counter-Strike: Source you can partially control it by setting a volume higher than 1 which will increase fadeout time from that soundscape.

soundmixer <string>

"quiet"
{
	"soundmixer"	"Citadel_Dialog_Only"
	
	// ...
}

Selects a custom soundmixer. Soundmixers manage the priority and volume of groups of sounds; create new ones in scripts\soundmixers.txt (ALWAYS use Default_Mix as a template).

Example

"swamp.water.slow"
{
	"dsp" "1"
	"dsp_spatial" "20"
	"dsp_volume"  "1.0"
	"fadetime"  "1.0"
	"soundmixer" "outside_swap_mixer"
	"playlooping"
	{
		"volume"	"0.98"
		"pitch"		"110"
		"soundlevel"	"SNDLVL_85dB"
		
		"position"	"0"
		
		"wave"	"ambient/swamps/water_Lap_loop_st.wav"
	}
	
	"playrandom"
	{
		"time"		"1,4"
		"volume"	"0.4,1"
		"pitch"		"90,105"
		"soundlevel"	"SNDLVL_85dB"
		"origin"	"3424.676025, 381.604095, 152.927948"
		
		"rndwave"
		{
			"wave"	"ambient/wind/wind_med1.wav"
			"wave"	"ambient/wind/wind_hit1.wav"
		}
	}
}

Looping MP3 Files

MP3 files cannot be looped in Source, and are only recommended for non-looping sounds. Nonetheless, it is possible to somewhat simulate looping using rndwave with identical files and set the time to the length of those files:

//////////// Outside bird sounds (loop mp3 sound file trick by gtamike_TSGK) ////////////
//////////// The 2 .mp3 files are the same as each other just not the same file name ////////////
//////////// MP3 Sound file runtime 3.29mins = 3 X 60 + 29 = 209secs ////////////

// mp3_loop

"mp3_loop"
{
	"dsp" "1"
	"playlooping"
	{
		"volume"	"1.0"
		"pitch"		"100"
		"soundlevel"	"SNDLVL_150dB"

		"wave"	"loop_mp3_soundscape/outside_1MB_20KB_part_1.mp3"
	}

	"playrandom"
	{
		"time"		"209"
		"volume"	"1.0"
		"pitch"		"100"	
		"soundlevel"	"SNDLVL_150dB"

		"rndwave"
		{
			"wave"	"loop_mp3_soundscape/outside_1MB_20KB_part_1.mp3"
			"wave"	"loop_mp3_soundscape/outside_1MB_20KB_part_2.mp3"
		}
	}
} 
Warning.pngWarning:Mp3 soundscapes might save filesize for custom maps but are not recommended for looping sounds. It can happen that the FIRST file at "rndwave" plays after the half of the time value has passed. In this case you have to double the value (418 in this case, but live with the consequence that there will be a pause after the soundfile has played twice. Consider using an ADPCM-compressed WAV instead; see Compression_(Source_1)#Audio_Compression.

Storing and using custom soundscapes

The engine uses scripts/soundscapes_manifest.txt to find soundscapes files, but you could also use scripts/soundscapes_%mapname%.txt to load soundscapes on a map-by-map basis. All soundscapes are loaded on map start.

Note.pngNote:In Mapbase Mapbase, this method has been changed to maps/%mapname%_soundscapes.txt

The soundscapes_%mapname% method should be used when modifying the manifest is unnecessary or impossible (e.g. on custom maps without their own mod directories). This file can be zipped into the BSP itself as well.

New soundscapes can be added to the manifest by adding a new "file" line at the bottom, like this:

	"file"		"<file location>"
Icon-Important.pngImportant:All soundscape names must be globally unique within a game.
Warning.pngRisk of Confusion:Although map-specific soundscripts are mounted in a similar way through maps/%mapname%_level_sounds.txt, soundscapes are mounted through the scripts folder and start with soundscapes_ instead of starting in the maps folder with %mapname% at the beginning. You can still use both map-specific soundscripts and map-specific soundscapes at the same time.

Creating Soundscapes using XBLAH's Modding Tool

Soundscapes can now be easily created or modified using XBLAH's Modding Tool XBLAH's Modding Tool. The UI provides an intuitive way to create new soundscapes, using the integrated file explorer. This allows the user to browse all the files mounted (VPKs and loose files), let the user preview the files individually and let the user preview how the whole soundscape is gonna play in-game.


Where to find it
This can be accessed within the tool through Sounds > Soundscape Editor.

XBLAH's Modding Tool - Soundscape Editor.png

See also