Music for Bear Stearns Bravo
Available 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
- SAVIHost: a standalone VSTi (virtual instrument) host (used to host the S-YXG50)
- Cakewalk SONAR: a MIDI sequencer (for recording and playing back notes)
- LoopBe1/LoopBe30 (a Windows 7 compatible replacement for MIDI Yoke): allows for virtual MIDI routing (used to connect all of the above together)
November 10, 2013 at 12:01 pm
The CANYON.MID simulator
Want to relive the moment you first heard the dulcet FM synthesizer tones of the Yamaha OPL3 on your fancy new multimedia computer with Windows 3.1? Take a Trip Through the Grand Canyon again at http://canyonmid.com!
Special thanks to:
September 24, 2011 at 2:51 pm
My pull request was accepted, so random credit card type and number generation is now available in the Forgery gem!
# => "Visa"
# => "4539750423451972"
Forgery(:credit_card).number(:type => 'Visa', :length => 13)
# => "4556180133982"
A few interesting things I picked up along the way:
Finally, big props to Graham King and Celestino Gomes, whose knowledge and code I borrowed heavily from.
Categories: Development, Testing.
September 9, 2011 at 10:11 am
When I attended CAST 2011 this year, I was given a really neat opportunity: to present! I selected Sinatra as my topic, for a few reasons:
- Its low barrier to entry (easy to learn and free)
- I had a few interesting experiences with Sinatra to share
- I wanted to demonstrate that testers could write useful code that wasn’t automation
The presentation (in 3 parts) went something like this:
#1: What’s Sinatra?
Since the audience was potentially a mix of coders, non-coders, etc., I wanted to lay some groundwork, including:
- What’s a DSL?
- What’s a web application, exactly?
- Why Ruby: its readability, the robust native string manipulation library, how regular expressions are tightly integrated, the vast repository of helpful gems
An early idea was to play “Final Countdown” while coding
#2: Live demo
Next, I gave a live coding demonstration (I’ve since been told that I was…brave for trying this). There were four distinct steps:
- A static response (essentially, the example on the Sinatra home page)
- A dynamic response
- A dynamic view (ERB)
- Dynamic data (JSON)
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:
- Recall of past transactions
- “Magic” functionality (ex. getting any gift certificate amount you wanted)
- Error simulations (ex. internal server errors, connection timeouts, etc.)
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):
Bug #1941 (a bug that will live in infamy) — Fixed incorrect link URL. [bug: 1941, status: resolved]
Screenshot of the "Testing Test"
- The following actions are carried out in our bug tracker, Bugzilla:
- Add comment to bug #1941, change status to “RESOLVED”.
- 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!
Finally, the slides shown to the audience, for your viewing pleasure:
August 21, 2011 at 4:28 pm