Willkommen zurück zum zweiten Teil des Tutorials(Zum ersten Teil)
Hier werdet ihr lernen wie ihr Soundscapes selbst schreibt.
Ein Soundscape steht zusammen mit allen anderen in der Map vorkommenden Soundscapes in einer Textdatei, dem Soundscape-Script. Diese Datei ist in einer von Valve entwickelten, sehr einfachen Scriptsprache geschrieben. Wenn ihr noch keinerlei Erfahrung mit Programmieren oder dem Schreiben in irgendeiner Scriptsprache habt, kann ich euch Notepad++ empfehlen. Das Programm kann mit den VDFSprachen(Für soundscapes, .vmt, .qc ...etc) ausgerüstet werden. Dadurch werden die Fehlersuche und das Schreiben selbst stark erleichtert. Auch als Anfänger kann man das Ganze natürlich einfach im Editor(Windows-Standard-Programm) schreiben
§1
Grundregeln zu Scriptsprachen allgemein:(Wenn ihr bereits Erfahung mit Scriptsprachen oder Programmieren habt, könnt ihr diesen Punkt überspringen)
-Alle Werte die zu einer Klasse/Methode/etc gehören, stehen innerhalb von Klammern hinter/unter der Klasse/Methode/etc
-Innerhalb dieser äußeren Klammern können weitere untergeordnete "Regeln" stehen, deren Werte, meist ebenfalls in Klammern stehen
-Auf jede geöffnete Klammer muss irgendwann eine zugehörige, geschlossene Klammer folgen. Also: Jede Klammer die ich öffne muss ich
irgendwann wieder schließen.
§2
Grundregeln zu Soundscapes:
-Alle Werte, Namen, rules etc sind in Anführungszeichen zu setzen
-Es werden nur geschweifte Klammern verwendet
-Die Formatierung wirkt sich nicht auf das Script aus. Es ist also egal ob und wie viele Zeilenumbrüche und Leerzeichen(jedoch mindestens ein Leerzeichen zwischen allen Werten)ihr in eurem Script habt. Für einen übersichtlichen und nachvollziehbaren Script sind sie jedoch unerlässlich.
-Laut Valve-Wiki sind nicht mehr als 30 Soundscapes pro Map/Script möglich.
-Kommentare werden beim compilen ignoriert. Sie stehen hinter doppelten Slashs.
-Kommazahlen haben wie im Englischen üblich einen Punkt statt wie im Deutschen ein Komma
-Manche keyvalues der Regel "playrandom" akzeptieren zufällige Werte. Dafür werden einfach ein Maximalwert und ein Minimalwert durch ein Komma abgetrennt angegeben.
Beispiel:
Die Engine wählt so bei jedem Ausführen der Regel einen zufälligen Wert zwischen Minimum und Maximum.

[schematischer Aufbau eines Soundscapes]
§3
Gebräuchliche keyvalues:
1) "wave"
Gibt den Pfad eines Sounds innerhalb des "Sound"-Ordners im HL2 Verzeichnis an. MP3s können nicht verwendet werden!
Code:
"wave" "ambient/misc/flush1.wav"
2) "volume"
Gibt die Lautstärke eines Sounds an. Der Wert darf zwischen "0" und "1" liegen. "1" entspricht 100% - volle Lautstärke
3) "pitch"
Gibt per Prozentzahl die Tonhöhe des Sounds an. Hiermit kann ein Sound von der Engine aus höher/tiefer gemacht werden.
"100" entspricht der normalen Tonhöhe. Die Valve-Wiki schlägt vor, Werte zwischen 70 und 130 zu verwenden.
4) "position"
Wenn diese keyvalue gesetzt ist wird der Sound an der angegebenen Position abgespielt, wenn nicht, ist der Sound einfach überall zu hören.
Die Position wird später im Feld "Sound Position 0-7" im entity selbst festgelegt. Dafür wird der Name eines entities(gebräuchlich sind info_targets)
in das Feld geschrieben
5) "position" "random"
Der Sound wird einfach irgendwo in der Nähe des Spielers abgespielt. Diese Stelle in der Nähe des Spielers wird an den Spieler geparentet. Sinnvoll zum Beispiel für Fliegensummen.
Code:
"position" "random"
6) "attenuation"(nur bei der Regel "playlooping")
Wenn eine Position angegeben ist, bestimmt dieser Wert wie schnell der Sound aufhört zu spielen sobald der Spieler sich von der angegebenen Position wegdreht.
Diese Zeit wird in Sekunden angegeben. Der Wert kann zwischen 0 und Unendlich(?) liegen.
Code:
"attenuation" "1.4"
7) "soundlevel"(nur bei der Regel "playlooping")
Funktioniert wie "attenuation", verwendet jedoch auch von der Engine vorgefertige Werte.
(Wird selbst von Valve nur relativ selten verwendet)
Code:
"soundlevel" "SNDLVL_140dB"
§4
Rules/Regeln
Wichtige Bemerkungen befinden sich innerhalb der Codes als Kommentare
1) "dsp"
Es gibt 29 verschiedene, vorgegebene DSP-types, von denen man sich immer nur einen für sein Soundscape aussuchen kann. Sie sind für Hall, Echo und ähnliches zuständig
So wird der dsp-type festgelegt:
Anbei eine Liste mit allen DSP-types der SourceEngine
2) "playlooping"
Diese Regel legt fest, dass der Sound der unter "wave" angegeben wird, geloopt wird, also als Endlosschleife läuft.
Das bedeutet aber auch, dass der verwendete Sound loopfähig sein muss.
Valve hat uns das bei den Standard-Sounds meistens mit einem "_loop" hinter dem Soundname signalisiert.
Code:
"playlooping"
{
"volume" "0.3" //30% der Maximallautstärke
"pitch" "100" //100% Pitch, also normale Tonhöhe
"wave" "ambient/atmosphere/underground_hall_loop1.wav" //ein dumpfes Dröhnen
}
3) "playrandom"
Eine sehr hilfreiche Regel: Mit ihr können zufällige Sounds in festgelegten oder auch zufälligen Zeitabständen abgespielt werden.
Selbstverständlich ist es auch möglich nur einen einzelnen Sound in zufälligen Zeitabständen abzuspielen.
Code:
"playrandom"
{
"volume" "0.2"
"pitch" "100"
"time" "3,15"
"rndwave" //"rndwave" und die geschweiften Klammern müssen in Verbindung mit "playrandom" immer
//verwendet werden, auch wenn nur ein Sound eingebunden wird.
{
"wave" "ambient/animal/bird9.wav"
"wave" "ambient/animal/bird8.wav"
"wave" "ambient/animal/bird7.wav"
"wave" "ambient/animal/bird6.wav"
"wave" "ambient/animal/bird2.wav"
"wave" "ambient/animal/bird13.wav"
"wave" "ambient/animal/bird14.wav"
"wave" "ambient/animal/bird19.wav"
"wave" "ambient/animal/bird20.wav"
}
}
4) "playsoundscape"
Spielt das unter "name" angegebene Soundscape. Der DSP-type des Unter-Soundscapes wird überschrieben. Ausserdem gibt es folgende keyvalues speziell für diese Regel:
-"position" lässt in diesem Fall alle Sounds des Unter-Soundscapesa an einer Stelle spielen
-"positionoverride" lässt alle positionierten Sounds des Unter-Soundscapes an einer Stelle spielen
-"ambientpositionoverride" lässt alle unpositionierten Sounds des Unter-Soundscapes an einer Stelle spielen
Code:
"playsoundscape"
{
"name" "combine.computer"
"volume" "1.0"
"positionoverride" "0" //alle Sounds die im Untersoundscape "combine.computer" auf eine Position
//zugewiesen waren spielen jetzt an der Position "0"
}
5) "soundmixer"

Zitat von
Valve-Wiki
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)
Da ich diese Funktion noch nie benötigt habe und auch nicht wirklich verstehe, wozu sie gebraucht wird, werde ich nicht näher darauf eingehen.
§5
BEISPIEL:
Das war jetzt schonmal ganz schön viel. Für ein gutes Soundscape brauchen wir aber lang nicht alle Funktionen.
Wir werden erstmal mit kleinen Soundscapes anfangen.
Dazu erstellen wir eine Textdatei, das Soundscape-Script, in das die Soundscapes geschrieben werden. Für jede Map muss diese Textdatei neu erstellt werden, denn jede Map kann nur die Soundscapes aus ihrem zugehörigen Soundscape-Script nutzen. Also gehen wir in den Ordner "...\SteamApps\Steam-Name\HL2-Modifikation\Spiel\" bei mir wäre das am Beispiel CS:S: "C:\Programme\Steam\SteamApps\XXX\counter-strike source\cstrike"
Dort wird, falls er nicht schon vorhanden ist, ein neuer Ordner mit dem Namen "scripts" erstellt. Hier wird das Soundscape-Script für eure Map platziert. Wenn eure Map "de_dust2" heisst, muss eure Datei "soundscapes_de_dust2.txt" heissen.
Jetzt können wir direkt mit dem Schreiben anfangen:
Und zwar mit dem Namen des ersten Soundscapes, das in meinem Beispiel die Geräuschkulisse in einem kleinen Garten sein soll. Ich nenne es also "soundscape.garden". Der Name ist allerdings völlig egal, solange keine Sonderzeichen oder Ähnliches darin vorkommt... Ich denke ihr wisst was ich meine.
Darauf folgt überlicherweise der "dsp-type" als erste Regel. Wir suchen uns also aus der Liste einen passenden aus; in meinem Fall z.B. "Bright Large" - "13" für eine helle, freundliche Atmosphäre.
Dann folgt schon unsere zweite Regel - in meinem Beispiel soll das "playlooping" sein. Verwenden werde ich sie, um einen Grundsound zu erzeugen, der immer zu hören sein soll. So eine Art Fundament für mein Soundscape.
Jetzt brauchen wir einen Sound für die Regel. Also starten wir den "Sound Browser" im Hammer-Editor und suchen per Filter einen Sound der uns gefällt. In das Soundscape muss der komplette Pfad geschrieben werden, der im Feld "Sound Name" angezeigt wird.


Hilfreiche Filter sind beispielweise:
-"atmosphere"
-"nature"
-"industrial"
-"wind"
-"animal"
-"tone"
...
Schließlich wird noch ein pitch-Wert angegeben und die erste Regel ist fertig.
Aber Achtung!: Jeder Sound, der in der Regel "playlooping" verwendet wird muss, wie gesagt, loopgfähig sein.
Mein Soundscape sieht bis jetzt so aus:
Code:
"soundscape.garden"
{
"dsp" "13"
"playlooping"
{
"volume" "0.2"
"pitch" "100"
"wave" "ambient/wind/wind_outdoors_1.wav"
}
}
In meinem Garten sollen aber auch Grillen zirpen und Vögel zwitschern, das kommt jetzt... Zuerst zu den Grillen: Für die erstelle ich eine weitere playlooping-Regel, weise dieses Mal aber zusäzlich noch eine Position zu, denn meine Grillen sollen nur an bestimmten Stellen im Garten zirpen. Für jede meiner Positionen(in meinem Fall drei) muss eine neue playlooping-Regel erstellt werden, denn für einen Sound kann immer nur eine Position angegeben werden. Für meine Grillen nehme ich folgenden Sound: "ambient/animal/crickets.wav"
Jetzt zu den Vögeln: Die sollen überall zu hören sein und in zufälligen Zeitabständen zwitschern, ich brauche also "playrandom". Als passende Sounds habe ich einige der "ambient/animal/birdX.wav"-Sounds herausgesucht. Mit der keyvalue "time" geben wir dann noch an, wie lang die Zeit zwischen den Sounds sein soll. In meinem Fall sollen die Intervalle recht klein sein.
Mein Soundscape sieht jetzt so aus:
Code:
"soundscape.garden"
{
"dsp" "13"
"playlooping" //Soundscape-Basis: Windrauschen
{
"volume" "0.2"
"pitch" "100"
"wave" "ambient/wind/wind_outdoors_1.wav"
}
"playlooping" //an Position 0 ist ein gelooptes Grillenzirpen zu hören
{
"volume" "0.2"
"pitch" "100"
"position" "0"
"wave" "ambient/animal/crickets.wav"
}
"playlooping" //an Position 1 ist ein gelooptes Grillenzirpen zu hören
{
"volume" "0.2"
"pitch" "100"
"position" "1"
"wave" "ambient/animal/crickets.wav"
}
"playlooping" //an Position 2 ist ein gelooptes Grillenzirpen zu hören
{
"volume" "0.2"
"pitch" "100"
"position" "2"
"wave" "ambient/animal/crickets.wav"
}
"playrandom" //Zufällige Vogel-Sounds die überall zu hören sind
{
"volume" "0.2"
"pitch" "100"
"time" "3,15"
"rndwave"
{
"wave" "ambient/animal/bird9.wav"
"wave" "ambient/animal/bird8.wav"
"wave" "ambient/animal/bird7.wav"
"wave" "ambient/animal/bird6.wav"
"wave" "ambient/animal/bird2.wav"
"wave" "ambient/animal/bird13.wav"
"wave" "ambient/animal/bird14.wav"
"wave" "ambient/animal/bird19.wav"
"wave" "ambient/animal/bird20.wav"
}
}
}
Für den Garten sollte das erstmal reichen. Vom Garten gelangt man über einen Schacht in einen Abwasserkanal. Eine passende Stelle für das zweite Soundscape.
Ich nenne es "soundscape.canal" und werde als Basis dieses Mal drei verschieden Sounds verwenden: Das Geräusch eines Baches, ein Tropfen und ein Plätschern
. Zusätzlich soll an zwei verschiedenen Stellen, an denen Rohre in den Kanal münden, ein besonders lautes Plätschern zu hören sein.
Es sieht also folgendermaßen aus:
Code:
"soundscapes.canal"
{
"dsp" "5"
"playlooping" //das Geräusch des Bachs
{
"volume" "0.3"
"pitch" "100"
"wave" "ambient/levels/canals/water_rivulet_loop2.wav"
}
"playlooping" //das Tropfen
{
"volume" "0.35"
"pitch" "100"
"wave" "ambient/water/drip_loop1.wav"
}
"playlooping" //das Plätschern
{
"volume" "0.4"
"pitch" "100"
"wave" "ambient/nature/water_gently_lapping.wav"
}
"playlooping" //lautes Plätschern an Position 0
{
"volume" "0.9"
"pitch" "100"
"position" "0"
"wave" "ambient\nature\water_streamloop3.wav"
}
"playlooping" //lautes Plätschern an Position 1
{
"volume" "0.9"
"pitch" "100"
"position" "1"
"wave" "ambient\nature\water_streamloop3.wav"
}
}
Dieses Beispiel-Script wird nun gespeichert und wir können die in ihm enthaltenen Soundscapes, wie im ersten Teil des Tutorials beschrieben, in die Map einbauen.

[So werden die im Soundscape verwendeten Postionen auf info_targets verlinkt]
Wie bei jeglichem sonstigen Custom-Content, muss auch bei den Soundscapes jeder Client das Soundscape-Script auf seinem Rechner haben. Es reicht also nicht, wenn nur der Server über die Soundscapes verfügt. Ich empfehle daher das Einbinden der "soundscapes_MAPNAME.txt" in die .bsp per MAN.
Das war der zweite Teil des Tutorials. Ich hoffe ich konnte euch dieses Thema näherbringen und ihr werdet in Zukunft eure Maps auch mit eigenen Soundscapes bereichern!
mfG novice
Lesezeichen