Uncensoring Songs in Rocksmith
Rocksmith 2014 is a great game, but some of the DLC songs are mangled; radio-friendly, soulless, censored caricatures of rock music:
Let's fix that, so we can enjoy playing along to the (well-tabbed song) as it was meant to be heard.
Makeup of a RS track
Each song/DLC is a PSARC, a kind of encrypted zip file. The psarc has inside:
- The audio track
- Metadata
- The tab/arragement for each guitar part (lead, rhythm, bass, etc..)
- The lyrics
- Artwork
- Other bits we don't care about
In order to uncensor a song, we'll need to unpack it, replace the audio file and lyrics, then repack it. We'll want to touch the track as little as possible; we just want to fix the lyrics and replace the audio track. We don't want to touch any metadata or guitar parts, so that all progress in the song is saved and it still works on the leaderboards and such.
Prerequisites / Tools Used
Rocksmith Custom Song Toolkit
The Rocksmith Custom Song Toolkit is the primary tool used. In theory, you could use it for everything. Just unpack, swap, repack.
However, it does a lot more when it unpacks - it also converts some of the propriety audio and tab formats; this conversion is not loseless.
Since the toolkit is mostly intended to be used for the creation of new tracks, that's understandable.
We'll just use some of it's command line tools. Grab the latest build from the builds page, and just extract to /Applications
Python3 Rocksmith tools
There's a fantastic python library for working with PSARCs. We'll be using this for loseless unpacking/repacking.
Various Command Line Tools
- Homebrew
- Install by doing:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
- Tools used by the RSCT:
brew cask install mono-mdk
brew install wine winetricks ffmpeg
- Python3 Rocksmith Tools
brew install pip
pip3 install git+https://github.com/0x0L/rocksmith.git
WWise
Annoyingly enough, you have first download a bloated launcher, then you can download the version needed.
We'll need the 2016.2.4.6098 edition.
wav2wem.rb
wav2wem.rb
is a little Ruby script I wrote. It has no dependencies so should be easy to run.
Install like this:
# Download to somewhere in $PATH
wget https://gist.githubusercontent.com/JustinAiken/aed8f3d08c0e90e6d148f315df462482/raw/b4d9c18628caf0cc995232b994ae87ce2d10a565/wav2wem.rb \
--output-document=/usr/local/sbin/wav2wem.rb
# Make it executable:
chmod +x /usr/local/sbin/wav2wem.rb
Working on a song
First, setup a work area:
# Make a work area in /tmp (wine gets confused about ~/, so we'll use a global path):
mkdir -p /tmp/rs_uncensor
# Your DLC is probably stored here:
cd ~/Library/Application\ Support/Steam/SteamApps/common/Rocksmith2014/dlc
Now we'll unpack the song and move it to the work area
# "Unzips" ragekilling_m.psarc into ragekilling_m/
pyrocksmith --unpack ragekilling_m.psarc --no-crypto
# Move it to the to work area:
mv ragekilling_m /tmp/rs_uncensor
The file structure looks like this:
ragekilling_m
├── appid.appid
├── audio
│ └── mac
│ ├── 1010334697.wem # The main audio track - we need to replace this.
│ ├── 776360560.wem # The short preview audio track
│ ├── song_ragekilling.bnk
│ └── song_ragekilling_preview.bnk
├── flatmodels
│ └── rs
│ ├── rsenumerable_root.flat
│ └── rsenumerable_song.flat
├── gamexblocks
│ └── nsongs
│ └── ragekilling.xblock
├── gfxassets
│ └── album_art
│ ├── album_ragekilling_128.dds
│ ├── album_ragekilling_256.dds
│ └── album_ragekilling_64.dds
├── manifests
│ └── songs_dlc_ragekilling
│ ├── ragekilling_bass.json
│ ├── ragekilling_lead.json
│ ├── ragekilling_rhythm.json
│ ├── ragekilling_vocals.json # We won't edit this, but it's used to unpack/repack lyrics
│ └── songs_dlc_ragekilling.hsan
├── ragekilling_aggregategraph.nt
└── songs
├── arr
│ └── ragekilling_showlights.xml
└── bin
└── macos
├── ragekilling_bass.sng
├── ragekilling_lead.sng
├── ragekilling_rhythm.sng
└── ragekilling_vocals.sng # The lyrics - we'll fix these.
14 directories, 22 files
Fix the Lyrics
The lyrics will be found in the unpacked directory under songs/bin/macos/ragekilling_vocals.sng
.
Since the sng is an encrypted, proprietary format, we need to convert it to something editable, like XML.
To do this we'll use the Rocksmith Custom Song Toolkit's sng2014.exe
tool.
It'll need the manifest - easy enough to find in the manifests
dir.
wine /Applications/RocksmithCustomSongToolkit.app/Contents/Resources/sng2014.exe \
--sng2xml \
--manifest=/tmp/rs_uncensor/ragekilling_m/manifests/songs_dlc_ragekilling/ragekilling_vocals.json \
--input=/tmp/rs_uncensor/ragekilling_m/songs/bin/macos/ragekilling_vocals.sng \
--arrangement=Vocal \
--platform=Mac
This creates /tmp/rs_uncensor/ragekilling_m/songs/bin/macos/ragekilling_vocals.xml
.
Open that file up, and put in all the missing fucks:
- <vocal time="264.751" note="84" length="0.115" lyric="You" />
+ <vocal time="264.751" note="84" length="0.115" lyric="Fuck You" />
...
- <vocal time="267.588" note="84" length="0.127" lyric="You" />
+ <vocal time="267.588" note="84" length="0.127" lyric="Fuck You" />
...
- <vocal time="270.539" note="84" length="0.248" lyric="You" />
+ <vocal time="270.539" note="84" length="0.248" lyric="Fuck You" />
...
- <vocal time="273.4" note="84" length="0.176" lyric="You" />
+ <vocal time="273.4" note="84" length="0.176" lyric="Fuck You" />
...
- <vocal time="276.188" note="84" length="0.17" lyric="You" />
+ <vocal time="276.188" note="84" length="0.17" lyric="Fuck You" />
...
- <vocal time="278.937" note="84" length="0.175" lyric="You" />
+ <vocal time="278.937" note="84" length="0.175" lyric="Fuck You" />
...
- <vocal time="281.808" note="84" length="0.188" lyric="You" />
+ <vocal time="281.808" note="84" length="0.188" lyric="Fuck You" />
...
- <vocal time="284.615" note="84" length="0.088" lyric="You" />
+ <vocal time="284.615" note="84" length="0.088" lyric="Fuck You" />
...
- <vocal time="287.408" note="84" length="0.081" lyric="You" />
+ <vocal time="287.408" note="84" length="0.081" lyric="Fuck You" />
...
- <vocal time="290.017" note="84" length="0.083" lyric="You" />
+ <vocal time="290.017" note="84" length="0.083" lyric="Fuck You" />
...
- <vocal time="292.663" note="84" length="0.083" lyric="You" />
+ <vocal time="292.663" note="84" length="0.083" lyric="Fuck You" />
...
- <vocal time="295.314" note="84" length="0.082" lyric="You" />
+ <vocal time="295.314" note="84" length="0.082" lyric="Fuck You" />
...
- <vocal time="297.942" note="84" length="0.083" lyric="You" />
+ <vocal time="297.942" note="84" length="0.083" lyric="Fuck You" />
...
- <vocal time="300.59" note="84" length="0.083" lyric="You" />
+ <vocal time="300.59" note="84" length="0.083" lyric="Fuck You" />
...
- <vocal time="303.223" note="84" length="0.082" lyric="You" />
+ <vocal time="303.223" note="84" length="0.082" lyric="Fuck You" />
...
- <vocal time="305.837" note="84" length="0.082" lyric="You" />
+ <vocal time="305.837" note="84" length="0.082" lyric="Fuck You" />
...
- <vocal time="310.221" note="84" length="0.219" lyric="er+" />
+ <vocal time="310.221" note="84" length="0.219" lyric="er Fucker+" />
Convert back to SNG:
wine /Applications/RocksmithCustomSongToolkit.app/Contents/Resources/sng2014.exe \
--xml2sng \
--manifest=/tmp/rs_uncensor/ragekilling_m/manifests/songs_dlc_ragekilling/ragekilling_vocals.json \
--input=/tmp/rs_uncensor/ragekilling_m/songs/bin/macos/ragekilling_vocals.xml \
--arrangement=Vocal \
--platform=Mac
# And clean up our XML:
rm /tmp/rs_uncensor/ragekilling_m/songs/bin/macos/ragekilling_vocals.xml
Fix the audio track
Convert the .wem file inside to .ogg, so you can use it as a guide track. Always use the bigger of the 2 .wem files.
# First do the actual conversion:
wine /Applications/RocksmithCustomSongToolkit.app/Contents/Resources/ww2ogg.exe \
/tmp/rs_uncensor/ragekilling_m/audio/mac/1010334697.wem \
--pcb /Applications/RocksmithCustomSongToolkit.app/Contents/Resources/packed_codebooks_aoTuV_603.bin
# It'll be a little messed up, use revorb to fix it:
wine /Applications/RocksmithCustomSongToolkit.app/Contents/Resources/revorb.exe \
/tmp/rs_uncensor/ragekilling_m/audio/mac/1010334697.ogg
Load up that file in an audio editor, as well as the original album version (try to use a lossless format, like flac or wav). Line them up as close as you possibly can!
Delete the guide track, save the shifted original audio as fixed.wav
.
Now we have to convert that back to a .wem
file:
# And back!
wav2wem.rb ~/Desktop/fixed.wav
mv audio.wem /tmp/rs_uncensor/ragekilling_m/audio/mac/1010334697.wem
mv preview.wem /tmp/rs_uncensor/ragekilling_m/audio/mac/776360560.wem
Replace
Now we can repack our fixes files back into a single .psarc
, and move it back to the DLC dir.
First, delete any .DS_Store
, leftover .xml
, etc dirs you may have created whilst working on it.
# Repack the folder into the archive:
pyrocksmith --pack /tmp/rs_uncensor/ragekilling_m --no-crypto
# Rename the original:
mv ~/Library/Application\ Support/Steam/SteamApps/common/Rocksmith2014/dlc/ragekilling_m.psarc \
~/Library/Application\ Support/Steam/SteamApps/common/Rocksmith2014/dlc/ragekilling_m.censored.bak
# Move our repack to the DLC dir:
mv ragekilling_m.psarc ~/Library/Application\ Support/Steam/SteamApps/common/Rocksmith2014/dlc/
Ready to rock
Success! Now we have uncensored lyrics and original audio:
Since we haven't touched the guitar arrangement or the manifest, everything else is intact: - Any previous progress on the track should be intact - Should still work with the leaderboards (if you care about that sort of thing)
Other Uses
Besides uncensoring, this method of audio swapping could also:
- Replace audio with pitch-shifted version - no more tightening your strings until they almost pop to play old Kinks songs.
- Replace audio with a guitar-less version crafted from multitracks
- There won't be many of these available, but for those that are, will be a much nicer audio experience.
I'm a Ruby/Rails developer currently working for UserTesting, living in Southern Utah. More about the author →