Reality is harsh. Money is scarce. The price of mechanical keyboards leaves penniless folk left in the shadows of their mechnical-keyboard possessing brethren. The exalted clicks of mechanical switches are but a pipe dream for most people. Until now.
reject membrane, embrance monke
What it does
Much like the visionaries that created DownloadMoreRam, we present to you monke. One simple click is all you need to have a mechanical keyboard at your fingertips (auditorily).
Don't believe us? Take a look at how monke fares against the average mechanical keyboard.
- Customizable key press sounds (no more hotswapping switches and spending money)
- Built-in state of the art subtitle system as an accessibility feature
- High-fidelity -- keyboard sounds are routed through your speakers, even when using earphones
- Simplistic, modern user interface
- Absolutely none at all
How we built it
C# and Windows Forms were used for the GUI and the magic that holds monke together. Low latency sounds routed using the NAudio package as a wrapper around the DirectSound interface of Windows API.
Challenges we ran into
- Routing audio to a specific device is challenging; audio drivers and scarcely documented APIs pushed our keys at every turn
- NAudio WASAPI and mmeapi.h "worked", but these older APIs had higher latencies and made the user experience intolerable
- Global Windows Hook callback gives us the chance to listen on key strokes while minimized, and also gives us the wonderful learning opportunities in the form of crashes
Accomplishments that we're proud of
- Sounds wonderful
- Audio works in a performant manner with minimal lag for most reasonable typing speeds
- Sounds wonderful
- Sounded so great we actually used this during our development cycles
What we learned
C#, WinForms, Windows API, Audio interfaces in Windows
What's next for monke
- Some keyboard presets have different sounds for the spacebar, backspace and enter key. We look to expand this configurable sounds for every key.
- Store user preferences (but you shouldn't be closing the app in the first place)