|
|
(38 intermediate revisions by 15 users not shown) |
Line 1: |
Line 1: |
− | ==Introduction==
| + | '''Music''' in the [[Creatures series]] of games started out in ''[[Creatures]]'' as a variety of synthesized chimes, chords, bloops and other non-specific ambient sounds, simply combined together into audio files (MU01[[WAV files|.WAV]] to MU28.WAV in the Sounds folder on Windows) and played at certain points in the game or as certain [[applet]]s were opened. |
− | '''Music''' in the [[Creatures]] series of games started out in [[Creatures 1]] as a variety of synthesized chimes, chords, bloops and other non-specific sounds. For [[Creatures 2]], a far more capable system was created, as outlined below. This information was gained by [[User:GreenReaper|GreenReaper]] during a university project and should not be considered official - no details of the MNG format were ever released by [[Creatures Labs]], only a three-page article [http://web.archive.org/web/20020614201723/http://www.creatures.co.uk/library/science/lib_science_musicbehind1.htm The Music of Creatures] describing some features. | |
| | | |
− | ==Editing and Playing Creatures Music==
| + | [[Image:Creaturesmontage.jpg|right|frame|[[Creatures Montage]] is an 11-minute track of music by [[Andrew Barnabas]]]]The ''Creatures'' music was created on a Roland JV-1080 synthesizer by [[Andrew Barnabas]], who also made an album of computer music called ''Shades'' whle in the [http://web.archive.org/web/19970719115059/www.crusaders.no/members/nightshade/si.htm Cyberlife music studio] - one track of this (now available for download on the [[Creatures Wiki]]) was called ''[[Creatures Montage]]'', and contained music from the game's introductory movie. See also [[Andrew Barnabas|Andrew's wiki page]], and the '''[http://www.bobandbarn.com/ Bob and Barn]''' home page. |
− | Two tools are desinged to handle MNG files, '''MNGPlayer''' and '''MNGPad''' - MNGPlayer lets you play music in the background (or foreground), while MNGPad allows you to edit existing MNG files and create your own. Both can be found at the [https://sourceforge.net/projects/mngedit/ MNGEdit] project page. They require the Microsoft .NET Framework to be installed, available from [http://www.windowsupdate.com/ Windows Update].
| |
| | | |
− | ==Outline==
| + | For ''[[Creatures 2]]'', a far more capable dynamic music system was created—MNG—and this system was also used in ''[[Creatures 3]]'' and ''[[Docking Station]]''. You can read about [[MNG files]], which changed depending on factors such as location and the mood of [[creature]]s. |
− | Music is stored in 'munge' files, with the extension ''MNG'' (at the time, the MNG extension was not in use - it was later appropriated as a replacement for PNG). The music is formed of separate samples in a partial WAV format combined with a script which is interpreted by the music engine. The sample format is a standard Windows WAV format with the first 16 bytes removed - typically in '''16-bit 22kHz mono'''. The file starts off with an index of samples, then the script data chunk, then sample chunks. The ''names'' of samples are stored implicitly - the first name in the script refers to the first sample chunk, the second name is the second, and so on, ignoring names that are already associated with samples.
| |
| | | |
− | ==File Structure==
| + | [[Creatures Adventures]], [[Creatures Playground]] and [[Amazing Virtual Sea-Monkeys]] used non-dynamic [[Wikipedia:MIDI|MIDI]] music instead, which was far easier (and hence cheaper) to produce than using the complex MNG system. |
− | <table cellspacing="0" width="559">
| |
− | <tr>
| |
− | <td style="border-width: thin; border-style: dashed;width: 68.3pt;" valign="top" width="91">
| |
− | <p> Position</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 55.45pt;" valign="top" width="74">
| |
| | | |
− | <p> Length</p>
| + | Both [[Creatures PS1|Creatures]] and [[Creatures - Raised in Space]] on the Sony Playstation and Gameboy Advance simply used wave recordings for their music. Both games share the same soundtrack, most likely due to budget restrictions, and it is unknown who was responsible for composing the music, although given the nature of the games it is indeed possible that the tracks are probably royalty free and were not composed particularly for the games. Some songs are [https://www.youtube.com/watch?v=Oi4zfJ9F3uI available] on [[wikipedia:YouTube|YouTube]]. |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 142.65pt;" valign="top" width="190">
| |
− | <p> Description</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 153pt;" valign="top" width="204">
| |
− | <p> Notes</p>
| |
| | | |
− | </td>
| + | ==Editing and Playing Creatures Music== |
− | </tr>
| + | For games which use the MNG format, two tools are designed to edit the music, [[MNGPlayer]] and [[MNGPad]] - MNGPlayer lets you play music in the background (or foreground), while MNGPad allows you to edit existing MNG files and create your own. You will probably want to read the first part of [[MNG file format]] to see how the scripts work, although a tutorial is included with the programs. |
− | <tr>
| |
− | <td style="border-width: thin; border-style: dashed;width: 68.3pt;" valign="top" width="91">
| |
− | <p> 0</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 55.45pt;" valign="top" width="74">
| |
− | <p> 4</p>
| |
− | | |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 142.65pt;" valign="top" width="190">
| |
− | <p> Number of samples</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 153pt;" valign="top" width="204">
| |
− | <p> </p>
| |
− | </td>
| |
− | </tr>
| |
− | | |
− | <tr>
| |
− | <td style="border-width: thin; border-style: dashed;width: 68.3pt;" valign="top" width="91">
| |
− | <p> 4</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 55.45pt;" valign="top" width="74">
| |
− | <p> 4</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 142.65pt;" valign="top" width="190">
| |
− | | |
− | <p> Position of
| |
− | script</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 153pt;" valign="top" width="204">
| |
− | <p> Zero-based byte
| |
− | position</p>
| |
− | </td>
| |
− | </tr>
| |
− | <tr>
| |
− | <td style="border-width: thin; border-style: dashed;width: 68.3pt;" valign="top" width="91">
| |
− | | |
− | <p> 8</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 55.45pt;" valign="top" width="74">
| |
− | <p> 4</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 142.65pt;" valign="top" width="190">
| |
− | <p> Length of script</p>
| |
− | | |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 153pt;" valign="top" width="204">
| |
− | <p> Length in bytes</p>
| |
− | </td>
| |
− | </tr>
| |
− | <tr>
| |
− | <td style="border-width: thin; border-style: dashed;width: 68.3pt;" valign="top" width="91">
| |
− | <p> 12</p>
| |
− | | |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 55.45pt;" valign="top" width="74">
| |
− | <p> 4</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 142.65pt;" valign="top" width="190">
| |
− | <p> Position of first
| |
− | sample</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 153pt;" valign="top" width="204">
| |
− | | |
− | <p> Zero-based byte
| |
− | position</p>
| |
− | </td>
| |
− | </tr>
| |
− | <tr>
| |
− | <td style="border-width: thin; border-style: dashed;width: 68.3pt;" valign="top" width="91">
| |
− | <p> 16</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 55.45pt;" valign="top" width="74">
| |
− | | |
− | <p> 4</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 142.65pt;" valign="top" width="190">
| |
− | <p> Length of first
| |
− | sample</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 153pt;" valign="top" width="204">
| |
− | <p> Length in bytes</p>
| |
− | | |
− | </td>
| |
− | </tr>
| |
− | <tr>
| |
− | <td style="border-width: thin; border-style: dashed;width: 68.3pt;" valign="top" width="91">
| |
− | <p> 20</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 55.45pt;" valign="top" width="74">
| |
− | <p> 4</p>
| |
− | | |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 142.65pt;" valign="top" width="190">
| |
− | <p> Position of
| |
− | second sample</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 153pt;" valign="top" width="204">
| |
− | <p> Zero-based byte
| |
− | position</p>
| |
− | </td>
| |
− | </tr>
| |
− | | |
− | <tr>
| |
− | <td style="border-width: thin; border-style: dashed;width: 68.3pt;" valign="top" width="91">
| |
− | <p> …</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 55.45pt;" valign="top" width="74">
| |
− | <p> …</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 142.65pt;" valign="top" width="190">
| |
− | | |
− | <p> …</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 153pt;" valign="top" width="204">
| |
− | <p> </p>
| |
− | </td>
| |
− | </tr>
| |
− | <tr>
| |
− | <td style="border-width: thin; border-style: dashed;width: 68.3pt;" valign="top" width="91">
| |
− | | |
− | <p> N * 8 + 8</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 55.45pt;" valign="top" width="74">
| |
− | <p> 4</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;width: 142.65pt;" valign="top" width="190">
| |
− | <p> Position of last sample</p>
| |
− | </td>
| |
− | | |
− | <td style="border-width: thin; border-style: dashed;width: 153pt;" valign="top" width="204">
| |
− | <p> N is the number
| |
− | of samples</p>
| |
− | </td>
| |
− | </tr>
| |
− | <tr>
| |
− | <td style="border-width: thin; border-style: dashed;width: 68.3pt;" valign="top" width="91">
| |
− | <p> N * 8 + 12</p>
| |
− | </td>
| |
− | | |
− | <td style="border-width: thin; border-style: dashed;width: 55.45pt;" valign="top" width="74">
| |
− | <p> Variable</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;" valign="top" width="190">
| |
− | <p> First sample</p>
| |
− | </td>
| |
− | <td style="border-width: thin; border-style: dashed;" valign="top" width="204">
| |
− | <p> Followed by the
| |
− | rest of the samples</p>
| |
− | </td>
| |
− | | |
− | </tr>
| |
− | </table>
| |
− | ==Script Encryption==
| |
− | The music scripts of MNG files are saved in a 'scrambled' format, encrypted with an XOR function. This function works on a byte level, with a starting operand value of 0x5 and an increment of 0xC1. Sample routines follow - as XOR is a reversible operation, they can be used to both scramble and descramble scripts.
| |
− | | |
− | ===Visual Basic Routine===
| |
− | <pre>
| |
− | Private Function Scramble(ByVal data As Byte()) As Byte()
| |
− | Dim hb as Byte, count as Integer
| |
− | hb = 5
| |
− | For count = 0 to data.Length – 1
| |
− | data(count) = data(count) Xor hb
| |
− | If hb < &H3F Then
| |
− | hb = CByte(hb + &HC1)
| |
− | Else
| |
− | hb = Cbyte(hb + (&HC1 - &H100))
| |
− | End If
| |
− | Next count
| |
− | Return data
| |
− | End Function
| |
− | </pre>
| |
− | | |
− | ===Assembly Routine===
| |
− | <pre>
| |
− | .text:00543400 sub_0_543400 proc near .text:00543400
| |
− | .text:00543400 arg_0 = dword ptr 8
| |
− | .text:00543400 arg_4 = dword ptr 0Ch
| |
− | .text:00543400
| |
− | .text:00543400 push ebp
| |
− | .text:00543401 mov ebp, esp
| |
− | .text:00543403 push esi
| |
− | .text:00543404 mov esi, [ebp+arg_4]
| |
− | .text:00543407 xor eax, eax
| |
− | .text:00543409 mov cl, 5
| |
− | .text:0054340B test esi, esi
| |
− | .text:0054340D jle short loc_0_543424
| |
− | .text:0054340F mov edx, [ebp+arg_0]
| |
− | .text:00543412 push ebx
| |
− | .text:00543413
| |
− | .text:00543413 loc_0_543413: ; CODE XREF: sub_0_543400+21
| |
− | .text:00543413 mov bl, [eax+edx]
| |
− | .text:00543416 xor bl, cl
| |
− | .text:00543418 add cl, 0C1h
| |
− | .text:0054341B mov [eax+edx], bl
| |
− | .text:0054341E inc eax
| |
− | .text:0054341F cmp eax, esi
| |
− | .text:00543421 jl short loc_0_543413
| |
− | .text:00543423 pop ebx
| |
− | .text:00543424
| |
− | .text:00543424 loc_0_543424: ; CODE XREF: sub_0_543400+D
| |
− | .text:00543424 pop esi
| |
− | .text:00543425 pop ebp
| |
− | .text:00543426 retn
| |
− | .text:00543426 sub_0_543400 endp
| |
− | </pre>
| |
− | | |
− | ==Script Format==
| |
− | ===Tracks===
| |
− | The basic unit of music is a Track, which in the game is associated with either a specific event - for example, the death of a creature - or an area, like the Volcano track. Typically only one track plays at once; switching between tracks is accomplished by fading in and out, adhering to the FadeIn and FadeOut track parameters. Each Track has one or more Layers, which are played simultaneously.
| |
− | Comments are indicated by a double slash (//) and may be placed within Track, Effect, Voice or Update declarations, as well as at the top level.
| |
− | | |
− | <pre>
| |
− | Track(UpperTemple)
| |
− | {
| |
− | FadeIn(5)
| |
− | FadeOut(5)
| |
| | | |
− | LoopLayer(Chord)
| + | The music of other games can be manipulated using normal audio or music editors. |
− | {
| |
− | …
| |
− | }
| |
− | | |
− | AleotoricLayer(StickMelody)
| |
− | {
| |
− | …
| |
− | }
| |
− | }
| |
− | </pre>
| |
− | | |
− | ===Variables===
| |
− | MNG scripts have a concept of local variables, which reside within these layers. Variables must be declared before use, with the name and an initial value. The variables are floating point values associated with names. Some variables are special – Pan and Volume because they affect the samples to be played, and Interval because it affects the length of the track.
| |
− | | |
− | <pre>
| |
− | AleotoricLayer(Pad)
| |
− | {
| |
− | Variable(temp,4.0)
| |
− | …
| |
− | </pre>
| |
| | | |
− | ===Layers=== | + | ==DJ_G== |
− | Layers are the “instruments�? of a track, in that they either play one sample repeatedly (in the case of LoopLayers) or one or more samples, enclosed within Voices (AleotoricLayers).
| + | Hidden within the audio directory of Creatures 2, an amusing musical track entitled 'DJ_G' is to be found, consisting of a [[Grendel]] repeatedly hitting a [[Norn]] to the sound of a techno remix of some of the sounds from the game. Upon the release of [[Creatures 3]] a similar track was found in there. These may have been made by [[Mark Ashton]]. See also [[Defiant Doosers]]. |
| | | |
− | ====LoopLayers==== | + | ==Docking Station events music== |
− | A LoopLayer consists of a single Wave and an Update block. The Wave is played constantly and repeatedly. The Update is called at regular intervals and typically causes some change in the presentation of the samples (for example, it may pan the output from side to side, or alter the volume).
| + | Admittedly, Docking Station's birth and death music was rather lacking - for the sake of size the [[Hub]] uses the same music as death (and it is annoying after a while) - the birth music was original, but not terribly good either. [[Gryph]] provides a tutorial to make Docking Station use Creatures 3's birth music instead: |
| | | |
| + | #Copy ../Creatures 3/Sounds/Events.mng to your ../Docking Station/Sounds folder |
| + | #Open ../Docking Station/Bootstrap/010 Docking Station/DS life events factory - PHOTOGRAPHS THE DEAD.cos. You may want to make a backup first, but you'll only be changing a couple of lines |
| + | #Scroll down until you see the comment '* music' |
| + | #Change |
| <pre> | | <pre> |
− | LoopLayer(HighBreath)
| + | *music |
− | {
| + | doif va00 = 3 |
− | Variable(counter,0.0)
| + | strk 30 "ds_music.mng\\TremeloBleep" |
− | Variable(temp,0.0)
| + | elif va00 = 7 |
− | Update
| + | strk 20 "ds_music.mng\\MetallicChords" |
− | {
| |
− | // Gradually, pan around at a random rate
| |
− | temp = Random(0.0, 0.1)
| |
− | counter = Add(counter, temp)
| |
− | Pan = CosineWave(counter, 30)
| |
− | // Scale the volume according to mood
| |
− | Volume = Multiply(Mood,0.4)
| |
− | Volume = Add(Volume,0.6)
| |
− | }
| |
− | UpdateRate(0.1)
| |
− | Wave(HighBreathG)
| |
− | }
| |
| </pre> | | </pre> |
− | | + | to |
− | ====AleotoricLayers and Voices====
| |
− | An AleotoricLayer consists of one or more Voices to be played sequentially. Effects and Volume may be specified for the layer. The Interval of a layer specifies how long it is before the next Voice of an AleotoricLayer is to be played – it is possible to change this within the Voice.
| |
− | | |
− | Voices are individual Waves with optional Conditions and Intervals. Conditions are used to decide whether or not the Wave should be played – the value of the specified variable must be between the two specified values. Intervals allow the script to specify how long to wait before the next sample.
| |
− | | |
| <pre> | | <pre> |
− | AleotoricLayer(BendyEcho)
| + | *music |
− | {
| + | doif va00 = 3 |
− | Volume(0.4)
| + | strk 30 "Events.mng\\Birth" |
− | Effect(PingPong160)
| + | elif va00 = 7 |
− | Interval(4)
| + | strk 20 "Events.mng\\Death" |
− | Voice
| |
− | {
| |
− | Condition(Mood,0.2,0.6)
| |
− | Wave(Bnd0)
| |
− | Interval ( Random( 4.0, 9.4) )
| |
− | }
| |
− | Voice
| |
− | {
| |
− | Condition(Mood,0.4,1.0)
| |
− | Wave(Bnd1)
| |
− | Interval ( Random( 4.0, 9.4) )
| |
− | }
| |
− | }
| |
| </pre> | | </pre> |
| + | Now, create a new world and Creatures 3's music should play upon birth and death [[life event|events]]. |
| | | |
− | ===Update Blocks===
| + | Editing the near death music is similar: |
− | Both the LoopLayer and AleotoricLayer structures may have one Update block. This block consists of assignments to variables (which may be special variables such as Volume or Pan) that are carried out each time an update is called, and also when beginning to play a layer. The time period for updates is set by the UpdateRate or BeatSynch statement in LoopLayers, or each time the last Voice is considered for AleotoricLayers. The Update blocks may also be placed within Voice blocks, in which case the update takes effect after the voice’s Wave has been played.
| + | #Open ../Docking Station/Bootstrap/010 Docking Station/!DS_game variables.cos after doing step 1 of the previous process. |
− | | + | #Change |
| <pre> | | <pre> |
− | AleotoricLayer(Pad)
| + | * track for near death |
− | {
| + | sets game "engine_near_death_track_name" "ds_music.mng\\MetallicChords" |
− | // The track sparsely plays pads ranging from the gentle (drm)
| |
− | // for low threat, with harsher (vce) for heigher threats
| |
− | // Volume increases with mood and threat,
| |
− | // The interval is decreased with threat
| |
− | Volume(0.4)
| |
− | Variable(temp,0.0)
| |
− | Update
| |
− | {
| |
− | // Volume = 0.5 + 0.25 * (Mood + Threat)
| |
− | temp = Multiply(Mood, 0.25)
| |
− | Volume = Add(0.5,temp)
| |
− | temp = Multiply(Threat, 0.25)
| |
− | Volume = Add(Volume,temp)
| |
− | Interval = Random ( 4.0, 6.0 )
| |
− | temp = Multiply( Threat, 2.0)
| |
− | Interval = Subtract( Interval, temp)
| |
− | }
| |
− | …
| |
| </pre> | | </pre> |
− | | + | to |
− | ===Intervals===
| |
− | Intervals represent a pause in the output of a layer, either between Voices if specified for a particular voice or between iterations of a layer if in the main body. Processing of a layer does not continue until a pause for the length of the interval has taken place. The expression is evaluated anew each time.
| |
− | | |
− | ===Beats, BeatLength and BeatSynch===
| |
− | Beats are an alternative method of specifying intervals between periods of music. Instead of directly specifying a length in seconds, the BeatLength is specified in the Track, and a BeatSynch is given that measures an Interval in this number of beats. The following specifies an interval of 0.3 * 16 = 4.8 seconds for the Guitar:
| |
− | | |
| <pre> | | <pre> |
− | Track(Underwater)
| + | * track for near death |
− | {
| + | sets game "engine_near_death_track_name" "events.mng\\NearDeath" |
− | BeatLength(0.3)
| |
− | | |
− | AleotoricLayer(Guitar)
| |
− | {
| |
− | BeatSynch(16.0)
| |
− | …
| |
| </pre> | | </pre> |
| | | |
− | ===Effects===
| + | After this, create a new world and the C3 Near Death music should play whenever the situation arises. |
− | The script also specifies Effects, which are preset sequences of setting changes applied to AleotoricLayers (not LoopLayers). An Effect has one or more Stages, each of which may make changes to the panning or volume for that layer. After a specified delay, the effect moves onto the next Stage in the sequence.
| |
| | | |
− | Effects are applied to the output of a Layer; they essentially take this output and repeat it several times . How many times is defined by the number of Stage declarations in the Effect. As an example, a simple effect might “bounce�? the sound from one side to the other, slowly fading the volume at the same time.
| + | ''If you're looking for musical objects, try [[Instrument]].'' |
| | | |
− | Each Stage contains a declaration for the Volume to play the output at, the Pan value (how far to the left or right of centre the sound should be played) and either a Delay or TempoDelay, indicating how long to pause before moving on to start the next effect. Values may be expressions or constants. TempoDelays are present in effects intended for layers using the BeatSynch and are measured in beats as defined in the Track currently playing, whilst Delay is measured in seconds.
| + | ==Related links== |
− | <pre>
| + | *[[MNG files]] |
− | Effect(RandomPad)
| + | *[[WAV files]] |
− | {
| + | *[[MNGPlayer]] and [[MNGPad]] |
− | // Produces randomly panned echoes, staggered at close
| |
− | // random times
| |
− | Stage
| |
− | {
| |
− | Pan(Random(-1.0,1.0)) Volume(1) Delay(Random(0.25,0.4))
| |
− | }
| |
− | Stage
| |
− | {
| |
− | Pan(Random(-1.0,1.0)) Volume(0.92) Delay(Random(0.25,0.4))
| |
− | }
| |
− | Stage
| |
− | {
| |
− | Pan(Random(-1.0,1.0)) Volume(0.84) Delay(Random(0.25,0.4))
| |
− | }
| |
− | }
| |
− | </pre>
| |
| | | |
| ==External links== | | ==External links== |
− | | + | __NOTOC__ |
− | * [http://www.gamewaredevelopment.co.uk/creatures_more.php?id=459_0_6_0_M27 The Music Behind Creatures] | + | *[http://www.gamewareeurope.com/GWDev/creatures_more.php?id=459_0_6_0_M27 The Music Behind Creatures] |
| + | *[http://web.archive.org/web/19970719115059/www.crusaders.no/members/nightshade/si.htm See the Cyberlife recording studio!] |
| + | [[Category:Internals]] |
Music in the Creatures series of games started out in Creatures as a variety of synthesized chimes, chords, bloops and other non-specific ambient sounds, simply combined together into audio files (MU01.WAV to MU28.WAV in the Sounds folder on Windows) and played at certain points in the game or as certain applets were opened.
The Creatures music was created on a Roland JV-1080 synthesizer by Andrew Barnabas, who also made an album of computer music called Shades whle in the Cyberlife music studio - one track of this (now available for download on the Creatures Wiki) was called Creatures Montage, and contained music from the game's introductory movie. See also Andrew's wiki page, and the Bob and Barn home page.
For Creatures 2, a far more capable dynamic music system was created—MNG—and this system was also used in Creatures 3 and Docking Station. You can read about MNG files, which changed depending on factors such as location and the mood of creatures.
Creatures Adventures, Creatures Playground and Amazing Virtual Sea-Monkeys used non-dynamic MIDI music instead, which was far easier (and hence cheaper) to produce than using the complex MNG system.
Both Creatures and Creatures - Raised in Space on the Sony Playstation and Gameboy Advance simply used wave recordings for their music. Both games share the same soundtrack, most likely due to budget restrictions, and it is unknown who was responsible for composing the music, although given the nature of the games it is indeed possible that the tracks are probably royalty free and were not composed particularly for the games. Some songs are available on YouTube.
Editing and Playing Creatures Music
For games which use the MNG format, two tools are designed to edit the music, MNGPlayer and MNGPad - MNGPlayer lets you play music in the background (or foreground), while MNGPad allows you to edit existing MNG files and create your own. You will probably want to read the first part of MNG file format to see how the scripts work, although a tutorial is included with the programs.
The music of other games can be manipulated using normal audio or music editors.
DJ_G
Hidden within the audio directory of Creatures 2, an amusing musical track entitled 'DJ_G' is to be found, consisting of a Grendel repeatedly hitting a Norn to the sound of a techno remix of some of the sounds from the game. Upon the release of Creatures 3 a similar track was found in there. These may have been made by Mark Ashton. See also Defiant Doosers.
Docking Station events music
Admittedly, Docking Station's birth and death music was rather lacking - for the sake of size the Hub uses the same music as death (and it is annoying after a while) - the birth music was original, but not terribly good either. Gryph provides a tutorial to make Docking Station use Creatures 3's birth music instead:
- Copy ../Creatures 3/Sounds/Events.mng to your ../Docking Station/Sounds folder
- Open ../Docking Station/Bootstrap/010 Docking Station/DS life events factory - PHOTOGRAPHS THE DEAD.cos. You may want to make a backup first, but you'll only be changing a couple of lines
- Scroll down until you see the comment '* music'
- Change
*music
doif va00 = 3
strk 30 "ds_music.mng\\TremeloBleep"
elif va00 = 7
strk 20 "ds_music.mng\\MetallicChords"
to
*music
doif va00 = 3
strk 30 "Events.mng\\Birth"
elif va00 = 7
strk 20 "Events.mng\\Death"
Now, create a new world and Creatures 3's music should play upon birth and death events.
Editing the near death music is similar:
- Open ../Docking Station/Bootstrap/010 Docking Station/!DS_game variables.cos after doing step 1 of the previous process.
- Change
* track for near death
sets game "engine_near_death_track_name" "ds_music.mng\\MetallicChords"
to
* track for near death
sets game "engine_near_death_track_name" "events.mng\\NearDeath"
After this, create a new world and the C3 Near Death music should play whenever the situation arises.
If you're looking for musical objects, try Instrument.
Related links
External links