Empire Sunrise:Music for Bear Stearns BravoAvailable on BravoNET for $5

If you’ve experienced Bear Stearns Bravo, you may have wondered about the music: synthesized yet expressive, and reminiscent of games of the FMV era. I think the key is a choice we made early in the game’s development: to compose the music almost entirely for a 4 MB wavetable synthesizer from 1996, the Yamaha S-YXG50.

When released, Yamaha XG synths were some of the most powerful tools available for computer musicians, particularly the SW1000XG sound card. Although now considered obsolete, there is still an active XG community. A few features, often missing from modern samplers, remain useful:

Filters: no need to insert a plugin — every channel has a low-pass filter with Resonance and Cutoff controls

Vibrato: instead of riding the Modulation wheel through a phrase, there are Vibrato Rate and Vibrato Delay controls to add feeling — automatically!

Expression: to give legato phrases their shape there’s an Expression control, freeing up Volume control for what it was intended (balance within the overall mix)

The track used in the trailer, Move Objects and People, has examples of the Vibrato and Expression controls (guitar and saxophone) and Filter controls (bass and arpeggios)

Harnessing the full power of the S-YXG50 would not be possible without some great software, some new, some old:

Screenshot of XGedit95 configuration for Move Objects and People

XGedit95: its primary function is to save and recall XG synth configurations — it also provides interfaces to features only accessible with SysEx (System Exclusive) messages, including the ADSR envelope, reverb, chorus, and special effects

This was my first experience writing comments for machine-generated documentation (RDoc). I think it looks great, and could prove very useful on other projects.

I learned that one of my go-to Ruby methods for test automation, choice, has been deprecated. Thankfully, it was simply renamed to sample, which is available in backports.

This was my first experience with RSpec, too. I like it — it seems very similar to Test::Unit (which I’m more familiar with), but with a more human-readable syntax. As a result, you end up with more meaningful tests and test failures, because behaviors are being defined instead of functions.

#3: Examples

I shared 3 examples where Sinatra saved the day:

An e-commerce payment gateway that we had to work with was in many respects a “black box”, and it was drastically limiting our ability to test. We understood how the requests and responses worked well enough to build a replica in Sinatra, however, giving us the testability features we needed, including:

The diverse set of tools used by my team at Interactive Partners led to an unfortunate case of information siloing, but thankfully they all had APIs, so a Sinatra application named iP Relay was created to help “glue” them all together, for example:

When David, one of our developers, does a deployment using Capistrano:

> cap deploy

Our faithful chat servant Botsworth announces it to the team:

Botsworth: David Stamm deployed 3.16.1 (023c968) to SHO production

Or, when he makes a commit with a message in this format (with the square brackets at the end):

When hiring, without access to old bug reports or test plans, it was difficult to evaluate how well candidates could find and report on bugs, so a Sinatra application named Testing Test was created to help test the testers. The person we ended up hiring found all of the bugs we intended to be in there, and even some we didn’t!