Narrative-Led PC Games

80 days poster

When I first started getting into computer roleplaying games in the 90s/00s I remember playing the Infinity Engine games by Bioware and Black Isle, such as Baldur’s Gate 2, the original Fallout games, and of course Planescape: Torment. It was the quality of writing that drew me in and took me to another world, the graphics were just a background setting to that writing.

Somewhere in the 2000s RPGs became more action orientated and prioritised mechanics and visual appeal and combat over branching stories. Nowadays a lot of popular RPGs are those such as Dark Souls, which seem more about combat and atmosphere than anything else. Blockbuster games such as Dragon Age: Inquisition and The Witcher 3 still show that great writing, characterisation and real player choices can still be popular.

I still prefer the classic RPGs of yesteryear, those with mountains of dialogue and that take direct influence from fantasy novels and pen and paper, Dungeons and Dragons type games, which I grew up with. Here are some games which capture some of that great writing for me, although some are more interactive fiction than technically RPGs:

80 Days
You are the butler of Philleas Fogg, the man Jules Verne writes about in ‘Around the World in 80 Days’. Your task is to choose how to get around the world not more than 80 days, as you plan routes between cities, buy and sell items and manage the finances of the trip. It really captures a sense of adventure in the world, and builds on Jules Verne’s steampunk theme as you encounter fantastical means of transport such as mechanical ostriches, airships and others. Every route is different and you can choose how the story unfolds by selecting different actions your character will take. The writing is the best I’ve ever seen in a mainstream game.

http://store.steampowered.com/app/381780/

Sunless Sea
In this game which also takes influence from Jules Verne, the city of London has fallen through the crust of the earth into hell, where there is a giant underwater cavern called the Underzee. You sail across this underground sea, exploring islands and immersing yourself in this Vernesque/Victorian/Lovecraftian setting. The writing again is amazing; it reads like poetry.

http://store.steampowered.com/app/304650

Torment: Tides of Numenera
Another outlandish game, this time set in the world of Monte Cook’s Numenera, the writer behind the Planescape world which Planescape: Torment was set in. It hasn’t fully been realised yet but this game in early access form is already weird and wonderful, and much more interesting to me than yet another copy of on the elves and dwarves Tolkien formulaic settings.

http://store.steampowered.com/app/272270/

Eurorack 2016

eurorack

So.. the problem, as so many people have said, with getting into building a Eurorack modular synthesizer is that it becomes addictive, and you inevitably spend more than you can really afford. That said.. I now have a great fully customised synthesiser for what I want to do 🙂 The layout is:

Top shelf:

3 oscilators and noise generator in the top left, 4 VCAs and S&H and Ring Mod sections in the mid center, LFOs in the top right.

Middle shelf:

Filters! I love filters. 3 large format filter modules, and a Triple Resonance Filter which consists of an additional 3 filters packed into one unit. A quantizer is also there which I currently don’t use much.

Bottom shelf:

Envelopes in the bottom left, Voltage Controlled Slew Generator and Make Noise’s Maths in the center left, center right is my trigger sequencer setup from LADIK, bottom right is attenuators and linear and exponential mixers.

OSX Fish Functions to open Chrome from the Shell

These functions are quite handy, and allow you to do things such as copy and paste errors and google for them without having to manually open a browser. You have to enclose arguments to both functions in single quotes, e.g. ‘chrome ‘http://www.google.co.uk’ and google ‘one two three four’. You should add these to your config file at ~/.config/fish/config.fish and make sure Google Chrome is already installed.

function chrome
  /usr/bin/open -a '/Applications/Google Chrome.app' $argv[1:]
end
function google
  /usr/bin/open -a '/Applications/Google Chrome.app' "https://www.google.co.uk/search?q=$argv[1]"
end

My vIM Configuration

Screen Shot 2016-03-26 at 04.00.46

I use a heavily customised setup for vIM, the text editor that annoys me the least in ~30 years of using a computer. You can see my exact setup in my dotfiles repo on github, https://github.com/wordswords/-.

Here are the plugins I use:

  • ConqueTerm – Opens a shell window inside vIM, allowing you to have a REPL environment within vIM.
  • NERDTree – A filetree plugin that you can see on the left of the window above. It replicates the Sublime text editor’s filetree.
  • vim-airline – This is a statusline plugin for vIM that allows for a nicer status view for windows and buffers.
  • vim-devicons – Allows for UTF-8 icons to make vIM editing slightly more graphical. Used by airline to display more info in less space, and by NERDTree to show filetype information.
  • vim-fish – Syntax highlighting for fish shell script editing.
  • vim-rails – Syntax highlighting and more for rails.
  • vim-ruby – Syntax highlighting for Ruby.

Working with Fish Shell, ffmpeg, MP4Box and sox to generate audio files

More adventures with Fish shell. I have scripted the generation of a bunch of test asset audio files in mp4 format suitable for dash streaming. I have used the audio file commandline tools ffmepg MP4Box and sox in this script, they are pretty powerful and worth installing via homebrew on OSX.

Thoughts: I think that instead of quoting you can just output $variable, which is probably better coding style. I’m still working out good way to return variables from functions, it seems that you need to echo out the output and that gets picked up by the calling function, which is a bit messy.

#!/usr/bin/env fish
# move to the asset output directory..
cd ..

# Generate .m4a file for file, and all the associated .mp4 dash assets
function generateDash
  set bitrate $argv[1]
  set input_filename $argv[2]
  set output_filename "$input_filename"-"$bitrate".m4a
  ffmpeg -i "$input_filename" -ab "$bitrate"k "$output_filename"
  MP4Box -dash 10000 "$output_filename"
end

# Generate 3 second sine wave in a specified bitrate at a specified frequency
function generateWav
  set bitrate $argv[1]
  set filename $argv[2]
  set frequency $argv[3]
  set wavfilename "$filename"-"$bitrate".wav
  sox -n --norm=-3 -b "$bitrate" "$wavfilename" synth 3 sine "$frequency"
  echo $wavfilename
end

# Main loop, generate 128,192 and 320 bitrate dashed .mp4s for 16bit and 32bit 3 second sine waves
for i in (seq 24)
  set freq (math "$i * 64.5")
  set wavfilename (generateWav 16 "output$i" "$freq")
  generateDash 128 "$wavfilename"
  generateDash 192 "$wavfilename"
  generateDash 320 "$wavfilename"
  set wavfilename (generateWav 24 "output$i" "$freq")
  generateDash 128 "$wavfilename"
  generateDash 192 "$wavfilename"
  generateDash 320 "$wavfilename"
end

Audio Routing for my PC

For my own benefit as much as anyone elses, I thought I’d document my PC audio setup. I have two soundcards and two sets of speakers, one surround soundcard and speaker set for gaming and watching surround sound movies, and one audio interface linked up to my studio monitor speakers for music production. I also have a Digi 002 mixer which I use to mix in the outputs from my synthesisers to my recording interface. When I want to record, I usually record one track at a time from a synthesier to the audio input of the audio interface, via the Digi 002 mixer:

Untitled Diagram

These are the audio cables needed for this setup, some of which I will need to order in shorter sizes than the 3m ones I already have, to reduce cable clutter:

single phono to phono
2x phono to 2x phono
single phono to phono
single 3.5mm jack to phono
single 3.5mm jack to phono
2x phono to 2x phono
2x phono to 2x phono
2x phono to 2x phono
2x phono to 2x phono
2x phono to 2x phono
2x phono to 2x phono

Fish Shell Scripting

A few months ago I switched across from Bash onto the Fish shell, on my main development machine. I can’t get enough of its fast autosuggestions and its sane scripting language. Compared to Bash it is very fun to use.

Today I wrote a script to automate the backup of my development workspace onto a private bitbucket account. Bitbucket is good because it allows unlimited private repositories, but it caps the size of these repos at 2GB max, with some features disabled after 1GB. This means that I want to find out the size of my repo before automatically backing it up. This script does this:

#!/usr/bin/env fish

set size (du -sm . | awk '{print $1}')
echo "Workspace is $size MB"
if math "$size > 1000"
  echo "Workspace too big to commit!"
  exit
else
  echo "Workspace is under 1GB, OK to commit"
end

git add .
git commit -m "Automated backup"
git push origin master

Each individual directory additionally usually has its own git config which is synced to the separate repos for the code I’m actually working on. But if my development machine is stolen or somehow destroyed, or I want to quickly replicate my environment on another machine with access to the original repos, then I can regenerate the associations between the different directories. It also makes me mindful of not committing images or other video assets.

ADAT with Digi 002 Consoles – Don’t throw them away just yet!

So I got given a Digi 002 console version, which looks like this:

Digi 002 Console

A fairly old style digital audio interface and mixer, which was all the rage back in 2002 when it first came out, but now is often found sitting in the skip. Why? Because it is a Pro-Tools inteface, and Avid stopped supporting it about 5 years ago, so it won’t actually work under Pro Tools and Windows 10 (believe me, I’ve tried!). It only works as a recording interface through Pro Tools, so you can’t just connect it via firewire to your PC and expect it to work.

It does have a stand-alone mode though, which allows you to use it as an analogue mixer, and that is pretty useful in itself if you want to drive monitors or record things from the master out. However after digging around on internet forums for a while, I figured out a way of actually using it as a recording interface! This is through use of the ADAT output, allowing you to plug it into a ADAT capable soundcard and record seperate channels over optical.

Caveats: it has to be 44.1khz sample rate, and you still have to use the Digi 002’s analogue to digital coverters in the chain, which are pretty old now!

If you’re willing to live with this, and I was considering what the console cost me, you get an extra 8 audio input channels in your soundcard! Well worth the effort I’d say.

To set it up with my Focusrite Sapphire 24 Pro, I followed the following advice from the Focusrite forum. This should work on most of the Sapphire range of soudcards.

A Basic Eurorack Technique

I thought it might be of some interest to describe how I use my Eurorack, at lot of the time, in making tracks. I have a 3 oscilator – 3 VCA – 3 filter Eurorack which I use primarily so that the oscilators initially work in unison mode with some slight detuning. I typically use a single loop, arpeggio or pattern that I repeat over the song. Then, partway through a track, I will transpose the octaves of the oscilators and vary the sustain of the envelopes, along with the filters and pulse-width modulation amount, to make a morphing yet harmonious sound texture progression.

Here is my Doepfer Eurorack, which has 2 oscilators, the third is provided by a Doepfer Dark Energy MK1 semi-modular synthesiser that is wired into the Eurorack.

eurorack

 

Here is the patch I almost always use:

 

Eurorack Patch Diagram

Here are some examples of where this same basic technique has been used:

Goals of 2015 Summary

2015 goals written on a whiteboard

At the start of 2015, I wrote down some goals for 2015. Around half-way through the year, I revisited these goals with some thoughts on how well I’d done. Now 2015 is over, I want to reflect on what has been achieved and what hasn’t.

I also want to comment on the fact that I am discussing personal things here. A few years ago I was decided that I was going to keep this blog professional and pretty much dry of any thoughts or feelings on my personal life. I have moved away from that though, inspired by blogs such as Iain’s, where personal thoughts and feelings are mixed with technical observations. I would like to think that this isn’t a bad move; after all if potential employers come to look at this 5 years from now, and don’t like what I’ve done here, then I probably don’t want to work for them anyway. There is the argument that blogs should be ‘themed’ or targetted towards a particular subject to garner followers, and that too much sharing is possibly a bad thing. However, my current thoughts are that dry techncial info is boring, and I’d rather mix it with other things that are important to me.

Retrospective for 2015

With that said.. 2015 was an eventful year, some things were awesome, some not.

The “Not Awesome”

My mum started treatment for cancer, which is a non-curable kind, Myeloma. The treatment was a success and she is currently in remission for the time being, so that is a good thing, but how long she will stay in remission we do not know. Both my remaining grandparents also sadly passed away. I also split up with my girlfriend of 5 years, which was difficult and still haunts me to a certain degree.

The “Awesome”

The money that my parents were going to put towards the wedding of the ex-girlfriend, they gave to me so I could put a deposit down on a house. So in August I bought and moved into a house in Withington, which I am in the process of doing up. It is *incredibly* cheap to buy in Manchester compared to the south-east of England, where I’m originally from, where the dream of having my own 3 bed, semi-detached house would not be possible in any area with a reasonable number of IT jobs in short distance. I don’t drive, so the fact that the tram stop is 10 minutes walk away is great for getting to work.

I met my current girlfriend, Conny in May, and things seem to be going very well; she is even planning to move from Berlin to Manchester to live with me. This is obviously great, and I don’t know where I would be without her support.

Work

With all these things happening in my personal life, work took a secondary focus as I got things sorted. It also made me rethink what I wanted from my career. At the start of 2015 I had a new role, as Test Manager; the first level of technical management in my area at the BBC, and a big career move for me. Although I liked some aspects of the management role, I missed the technical challenges that had pretty much characterised the last 10 years of my career. There was not much direct coding, and I felt I was in danger of losing that aspect of my work. I took a 6 month attachment to R&D, which had me working in an extremely challenging technical role, on a HTML5 360 VR engine. In April when this attachment ends, I am looking to continue in a technical role of some description, and not return to pure management, at least for the meantime.

Goals of 2015 – How Did I Do?

Work Goals

  • Settle into my new role at the BBC as Test Manager – As I mentioned before I’ve taken a move towards another route in my career
  • Pushing for a place to be opened up in Platform Test to employ someone from the Extend Scheme – This was achieved, and Ben has joined the BBC on an Extend placement.

Creative Goals

Social Goals

Financial Goals

  • Saving more over the course of the year – Partly achieved. I have bought a house, so now I am in a quite a bit of debt, but the money I will be putting towards my mortgage will be money I am effectively ‘saving’ because it will be put into the value of the house.
  • Joining a pension scheme – Achieved.

Health Goals

  • Adopt a regular form of keeping fit – Partly achieved. I have now setup a return commute which involves walking past a gym that I’m a member of, so it is quite easy to go in there for 30 mins on the treadmill 2-3 times a week. I’ve just got to maintain the discipline.