Welcome, Please Register or Login

Search Tags

  1. Converting engine sounds from Shift 2 to SLRR
    Sections: Tutorials \ Street Legal Modding
    Tags: Custom Sounds

    Hi, i wanted to share my experience how to properly and fairly easily convert sounds from Need for speed Shift 2(could also work with other games which are also using .fsb/.fev sound file)

    If you want to convert sounds from shift2, you're going to need these tools:
    1.BFF Tools, BFF unpacker specifically(to unpack car files, since all of sounds and models are in one file)
    NFS Shift BFF Tools v1_45 by japamd
    2.FSB extractor(for extracting .fsb obviously Here
    3.Audacity Here
    4.FMOD Studios Here

    For RPK creating you can use my program
    If it doesn't start, try downloading THIS

    Ok, lets start.
    For .rpk file you can edit engines .rpk or create an external one.
    For creating external .rpk you can use this as a base:

    Then for adding files to it use my rpk creator.

    Now lets start converting:
    First step. Open BFF unpacker and open the car you want to take sounds from. Scroll down till you see audio/cars/somecar.fsb and somecar.fev.

    select both, .fsb and .fev files, right click and press Extract selected files.

    Second step. Open .fsb file and extract all sounds.

    Entries->Extract to folder

    Third step. FSB extractor's .wav file is somehow different, slrr doesn't want to play it. So i use Audacity to reconvert sounds. So you just need to open the file and then export it back.

    Also this is very useful to fix sound looping if it's doesn't loop properly(had this problem with 350z limiter sound)

    Fourth step. Since you know how to make .rpk file, so it's time to make one.

    Fifth step.This is the tricky part. Open FMOD Event Player and load somecar.fev file(File->Load project)

    Double click somecar_EngineInt or _Engine, doesn't mater. So now you see two sliders(if there's a third one, ignore it). One for rpm, second for engine load(thanks captain obvious). This is the way to determine rpm for every sound(for some cars it's very tricky to determine it). Here's what you do, open for example somecar_idle.wav with any audio player, listen attentively to that sound. Now adjust the rpm slider to make the same sound with Event player. Set load slider at 0 for idle and all off(low, mid, high, ect...) sounds, then set it to 1 for on(again low, mid, high, ect...) sounds.

    Sixth step. Scripting. Open engineblock.java, scroll down till you see SfxTables, tabs and other stuff. If you don't know how sound scripting works, i'll explain to you. There's a function tab = the_car.getSfxTable() and a value in it(0,1,2). 0 - is used for engine reving up(for the "on" sounds), 1 - for reving down("off" sounds), 2 - exhaust(plays always, you can use samples from FM4, but recomend not to).
    IMPORTANT! there's difference between sound source on the_car.getSfxTable(0,1) and the_car.getSfxTable(2). (0,1) sounds comes from engine, (2) sounds comes from exhaust header.

    Ok, now you see this line:
    tab.addItem(new ResourceRef(something:0x00000AA0r), 6000.0, 500.0, 2000.0, 0.6, 1.00);
    0x00000AA0 - type id of your sound file
    6000.0 - sound pitch(this is the value you found on fifth step, but might need some adjusting)
    500.0 - rpm when the sounds starts playing
    2000.0 - rpm when the sounds ends
    0.6 - sound start volume
    1.00 - sound end volume
    Now you know how to add sounds, but now you need to know how to loop them nicely. Here's my tips:
    *Don't use more than 2 sounds at the same rpm, the game just doesn't support it, it just cut the sound.
    **Don't put all the sounds from .fsb, 3-5 is enough, though it depends on engine rpm limit, so you can use more.
    ***Make at least 1500 RPM gap between sounds, if you use less than 1500, you'll hear looping.

    If you try to be a smartass and make another SfxTable variable to make the game to play more than two sounds, i'll say it right away it won't work. Why? Object-Oriented Programming, that's why. No matter how much SfxTable variable you'll make, they still link to the same the_car.getSfxTable()
    function and it would be the same as using one SfxTable variable. If you want proper turbo sounds ant other cool stuff, you need to figure it out how to make a deep copy of the_car variable(o whatever it is), or get the game's exe source(which is not possible without separating the game from the engine). If you're not a programmer, just ignore this paragraph.

    Here's a example of my RTRX Mustang sound script

    Once you done everything try it in game, if looping sounds like shit, recheck sounds with FMOD Event player, if it's still sounds oddly then adjust sound pitch a bit and try again. Some sounds might work for the first time, some needs more adjusting, you need to be prepared for anything :)

    Another thing, i know most of you want turbo sounds and stuff. But as i said, game doesn't support more than two sounds at once. But if you still want loud turbo whistle and bov instead of nice engine sounds, i can help you do that, but i'm not an expert on that, you'll need to master it yourself. Since you know what getSfxTables does, you might know that turbo whistle should go to getSfxTable(0), and bov to getSfxTable(1). For determining if there's a turbo or not you can use these lines:
    Also you can edit the engine sound with audacity by making engine and turbo sound as one.
    not much help, but still something.

    i hope explained it clearly enough :D good luck with making slrr a better game :)


Several comma-separated tags will be considered as logical AND between them. You can also use semicolon for logical OR. AND has a priority over OR and you cannot use parentheses for logical grouping. Asterisk (*) within a tag will be regarded as a mask for "any string".