Projects & Experience
Work Experience
MobilityWare (Mobile Games, Objective-C/C#) June 2014 - Present
Mobile Audio Relay (PC->Mobile audio mirror, C#/Objective-C) August 2019
|
During a short period of time between projects at work, I was inspired by an audio producer's offhand comments to create a tool that would allow our audio team to hear the sound coming from their computer through a mobile device, as if it were a speaker attached to the computer. I created a system that relays audio from a Windows PC to an iOS phone or tablet. The host program was written in C# and sends audio data from a Windows output device (no need to change any system settings) to an iOS device plugged into the computer. The iOS client app was written in Objective-C with a UIKit interface and shows a few basic pieces of information about the audio stream. I was able to bring latency down to inaudible levels and it truly does feel like a wired speaker. Our audio producer was very impressed by and thankful for my efforts, and I was awarded one of our company core values all-star awards for this initiative.
|
|
Ants! (Ant Simulation, Unity / C#) May 2019
Programming
BOTB WebBuzzer (Quiz Buzzer, C++/Javascript) May 2020
Hoggit Bogey Dope (Virtual AWACS, C#) September 2018 - October 2018
|
This was a tool that I wrote along with a friend for us to use when playing DCS World, a combat flight simulation. The multiplayer server we used had a website set up that would show the positions of enemy aircraft for use by radar intercept controllers. At the time there were not often human controllers online, and the built-in AI controller in the game was very basic. We decided to make our own and wrote this utility in C# to parse the JSON data file used by the online tool in order to handle some basic queries. Our program generated text "radio calls" that got sent to Google's cloud TTS and then played back in the form of audio. I also integrated a hotword detector with P/Invoke so that the system could be triggered by various keywords heard over the PC's microphone. We regularly utilized this tool for a few months until human controllers became more generally available and the game recieved updates adding an in-cockpit map display that provided us with similar information.
|
|
DOSI 3D Visualizer (3D Visualizer, C++) November 2014 - June 2015
Marker (4kb Realtime Intro, C++) October 2013
Source Engine Parallax-Corrected Cubemaps (Reflection Experiments, C++/HLSL) July 2013
The Wings of Rage (2D Bullet Hell Shooter, C++) February 2013 - June 2013
Loki (3D Horror, Unity / C#) October 2012 - December 2012
Race of Spades (2D Racing, Java) October 2011 - June 2012
TT-Stranded (3D Survival and Building, Lua) June 2010 - June 2012
Lunar Lander (2D Flight Simulation, ActionScript 3) February 2012 - April 2012
MiniTank Wars (3D Tank Combat, Lua) January 2010 - April 2010
Web Programming and Design
Shadowbox Signature Generator (Image Generator, PHP/MySQL) May 2013
BMcms (Content Management System, PHP/SQLite) August 2009
Other / Miscellaneous
Wifi Coffee (IoT Coffee Maker, C / Objective-C) September 2016
Miscellaneous Electronics Projects (generally C/C++)
|
I have long had an interest in electronics and I'd like to share a few smaller projects here:
- I developed a C++ driver library for a 512x32 VFD to utilize its high-speed parallel interface, capable of driving the display in pixel mode at over 80 fps (the 33 fps photo is due to ADC limitations in the shown application). I also reimplemented my own replacement text features on top of my driver so that text and graphics can be freely mixed.
- After modifying an Agilent 6624A power supply to have front-panel connections, I wanted to control it with my PC. However, it only had a GPIB interface. Using the protocol specifications, I programmed an Arduino board (directly programming the AVR in C using Atmel Studio) to act as a simple USB serial <-> GPIB interface.
- While restoring an early-1980's studio tape deck I noticed that the tape counter board stored its firmware on UV-erasable EPROMs. Wanting to backup the data in case of age-related degradation, I developed a quick tool using an Arduino-compatible microcontroller to read the data off of the EPROM chips and onto an SD card.
- Many flight simulator enthusiasts use TrackIR (an optical motion tracking peripheral) to control their in-game head motion. Most people use the active tracking clip which uses IR LEDs arranged in a way known to the tracking software. However, these LEDs require power, which is normally delivered with a USB power cable that some find annoying, especially if they are using a wireless headset. An offhand discussion with a coworker led me to wondering whether I could design and build my own wireless tracking clip (there are some avaialble but to me the prices felt high for the feature set). I ended up designing a custom circuit and PCB, in addition to designing the 3D-printed clip itself. The final device uses USB to charge an internal battery that provides over 13 hours of runtime.
- One of my hobbies is photography, mostly with medium and large format film. Large format lenses rely on in-lens leaf shutters, and in addition to mechanical timing tolerances, at higher speeds and wider apertures the opening and closing movement can be a significant part of the exposure time. With slide film it is important to expose correctly as there is little room for adjustment after the fact. With these two facts in mind, I designed and built a small PCB to allow incoming light on a photodiode to be converted into a linear output voltage, which allowed me to connect an oscilloscope and characterize the effective exposure times of my lenses at various shutter speed and aperture combinations. From this data I created correction charts that allow me to set exact exposures without any guesswork.
|
|
dr_industrialist (Game Level, Valve's Hammer) October 2009
gm_skydive2008 (Game Level, Valve's Hammer) May 2008 - June 2008
Other Images (various technologies)
|