Action Arcade Sounds and Reality

2021.06.08   prev     next

NO video/demo to see here — sorry! — this is just a personal recollection of how I made sound work correctly in a frenzied, action-arcade-style game, on a personal computer, once upon a time in the 1990s. I hope you enjoy reading it.

Space Invaders

The original, coin-op Space Invaders (which looked much better than any emulation I’ve ever seen; the video image was reflected by glass over a psychedelic, pop-art moonscape, and looked great in a dark arcade) played exactly seven different sounds. Those were:

  • your base exploding
  • your base firing a shot
  • your shot killing an invader
  • the flying saucer cruising across the top of the screen
  • your shot killing the flying saucer
  • winning an extra life
  • the background thump-thump-thump-thump of the marching invaders

These sounds were achieved via a custom sound board, that had seven separate chips on it, one chip for each of those sounds. When the main processor, running the Space Invaders game program, asked the sound board to play one of the seven sounds, the appropriate chip would be invoked to play the requested sound. Each chip made only one sound, which sounded exactly the same every time it was asked to play it. (Except for the “thump” chip: it rotated its thumping sound among four different pitches, and could be asked to play that cycle at many different rates.)

Each sound chip could be asked to start or stop its sound at any time, but couldn’t be asked to play the same sound more than once over itself. So the same sound couldn’t play simultaneously with itself — but other than that, all seven sounds could play simultaneously, because they were being generated by separate chips running in parallel, and the analog output from those seven chips was mixed together into a single audio signal for the mono speaker at the base of the unit.

Williams

The popular Williams arcade games that came several years later — Defender, Robotron, Joust, and a few others that used similar hardware (not Moon Patrol) — were much more sophisticated than Space Invaders in many ways. For their sound, they used a DAC (Digital-to-Analog Converter), and all the sounds were digital recordings in the ROM of the machine. This allowed for a much richer variety of different sounds, including the human speech in Sinistar, for example.

But it did come with a big limitation: The DAC could play only one sound at a time. It could instantly stop a sound and start a new one at any moment, but it could only play one at a time. So those Williams games really only ever played one sound at a time! If you actually played those games when they were current, you might have a hard time believing that this was true — but go back and find them at some retro arcade, and you’ll soon be convinced. Many of the sounds were short, and if they got cut off a little early by another sound, you might not notice. Plus, so many things were going on in the game, and so many sounds were being played, that it was easy to be unaware of the one-sound-at-a-time limitation.

As a programmer myself, keenly interested in games and how they worked, I did notice the one-sound limitation when I was playing those games. But I also realized that the game had some clever way of deciding when to start a new sound (replacing the currently playing one), and when not to do that, in order to minimize the noticeability of the one-sound limitation. I never tried to figure out exactly what rule it was following, but I knew it was doing something to make smart decisions about when to play a sound, and when to skip a sound to let the currently playing sound continue.

Simple Solution?

So when I decided to write a little, fast-action, Williams-esque, arcade-style game for my 1990s personal computer — mainly for my own entertainment, but also in the vain hope that it would make some money — I thought to myself: this computer can play six sounds at a time. So if I just rotate among those six sound channels, I should be fine. The Williams guys had to do something smarter than that, because they had just one channel. But I have six. So channel rotation will probably be just great.

Sound was the last thing I dealt with, so the game was essentially completed and functional by the time I started working on the sound part of it. Then reality hit.

Reality, Dose 1

The first time I opened six sound channels in my game (not even trying to play any sounds on them yet), I discovered to my horror that the performance of the game suffered dramatically. Experimentation with different numbers of sound channels revealed that three was the ideal, sweet-spot number of sound channels: not significantly degrading game performance, but much more than just two or one channel. Four channels seemed like overkill compared to three (can’t I probably get by with three sounds at a time, when the Williams guys made it work with just one?), and four channels did noticeably start to hurt game performance.

So I had three channels to work with, not six. Oh well, I can just rotate among three channels, can’t I? (Not as confident now.)

Reality, Dose 2

When I tried playing my game with sounds, the sounds seemed a little sporadic and inconsistent, but then quickly became very sparse, and then stopped playing altogether. Restarting the game app cured this problem temporarily, but in much less than a minute of game play, it became all silent again.

Experimenting and guessing for quite a while, I finally discovered the cause. The OS worked on “ticks,” each of which represented 1/60 of a second of time. If the same sound channel was asked to play more than one sound before the next tick passed, then that sound channel would lock up and become silent until the app was shut down and re-launched. Some sort of OS oversight, I suppose. A minor system bug.

This problem was easily fixed by changing my code so that playSound(), my sound-playing function, would never ask a channel to play more than one sound within the same tick. I don’t remember for sure, but I think I made it keep a list of what it wanted to play on each channel, then submit to the OS’s actual sound channel only the last (most recent) request that occurred in one round (tick’s worth) of game logic execution. That was a perfect simulation of the sound channel as it would function if the lock-up-silence bug did not exist.

Reality, Dose 3

The problem of sound channels going permanently silent was now completely cured. But the results were still gravely disappointing. Sounds abruptly cut off at random, sometimes before they even barely started to play, or noticeably didn’t seem to play at all, and the overall effect was of a game with a badly broken, dysfunctional, sound system. It was totally unacceptable. Sigh. So now I knew that even with three sound channels to work with, some sort of rudimentary AI was going to be needed to make it sound decent.

What to do? I thought about it for a while, and came up with this plan:

Tables

My plan hinged on three critical tables of information. The first table was just an enumeration list (numbers: 1, 2, 3, etc.) for each of the names of the twenty-or-so sounds in my game. This list already existed, but was in an arbitrary order. So I made its order non-arbitrary, representing the priority of the sounds. Sound #1 was the lowest priority (least important to play), and sound #20 was the highest priority (most important to play).

That order was based partially on the game-related importance of playing a particular sound. E.g. the extra-life-earned sound was the highest priority sound in the entire game, sound #20. The zooming-to-the-next-wave sound was the next-highest, sound #19. And so on. Sounds that were deemed more important for the user to actually hear were given the higher priorities.

But also, much of the ordering had to do with the sound itself: A loud, punchy sound got a higher priority than a softer, more subtle sound, on the theory that if a punchy sound abruptly replaced a softer sound, the user wouldn’t even notice that the softer sound had stopped playing. But if the reverse happened, it would sound jarring and wrong.

Surprisingly, figuring out this order proved to be easy: Several quick choices, and it all made good sense.

The second table was a list of sound durations (in ticks). The audio system of the OS didn’t allow you to ask a sound channel if it was currently playing a sound or not. You could tell it to start playing a sound, and if it was already playing one, then you would be replacing that one with the new one. But you couldn’t see if a channel was done playing and was sitting idle. So this sound duration table I created would allow the program to know whether a sound channel was idle, simply by comparing how long it had been since that channel was asked to play a sound, to the duration of the sound it had been asked to play.

The third table was another list of sound durations, but this one represented the important part of the sound. So if a sound was, say, 60 ticks (1 second) long, then the important part might be 20 ticks (the first 1/3 of a second). This was based on my subjective judgment, examining the sound in my sound app, playing limited subsets of it, and deciding how much of it was the important part. The important part might be all or most of the sound, or it might be a small fraction of it, depending on what that sound sounded like. The basic idea was that the important part is the part that needed to play to give the user the impression that they heard the sound play, and it wasn’t cut off.

playSound() Logic

When my game wanted to play a sound, it would call my playSound() function, passing it the enum constant of that sound (a value from the first table). The playSound() function would decide how to pass that request on to the three sound channels, then it would return to the calling code (with no return value).

Previously, this playSound() function had simply used the three sound channels in a rotating order, but that profoundly unsatisfactory technique was now replaced with logic that went like this:

Preference 1 — Of the three sound channels, find any one of them that is currently idle, and start the requested sound on that channel. Then exit to the calling code.

If no idle channel exists, then proceed to Preference 2:

Preference 2 — Find which of the three sound channels is playing the lowest-priority sound. (Settle a tie by choosing the one that’s been playing longest.) If that channel’s sound is of lower-or-equal priority to the newly requested sound, then start the new sound on that channel, replacing what it was doing. Then exit.

If all three channels are playing sounds of higher priority than the requested sound, then proceed to Preference 3:

Preference 3 — Find which sound channels are playing the unimportant part of their sound, and choose the lowest-priority of these. (Settle a tie by choosing the one that’s been playing longest.) Start the newly requested sound on that channel, replacing what it was doing. Then exit.

If all three channels are playing the important part of their sounds, then proceed to Preference 4:

Preference 4 — Do not play the newly requested sound. Simply return to the calling code without doing anything.

And there it was. My new sound system.

Careful

Even in the ’90s, I had enough experience under my belt to realize that if there was any kind of accidental mistake (bug) in the coding of the above-described logic, I might never know it. I would just listen to the results, and think, “I guess this is how good this technique is,” not realizing that it wasn’t actually working completely correctly. So before even trying to run it, I scrutinized this new code line-by-line, making absolutely sure it was correctly coded to do what I had planned.

The Miracle

All looked good, so I gave it a whirl. Wow!!! What an incredible difference. It seemed that all the issues with sound had just vanished into thin air, and my computer suddenly had unlimited ability to play any sound, at any time! It didn’t seem like it was performing any sort of complex triage; every action in the game just made its sound, like magic. I could scarcely believe it myself. Even knowing exactly what it was really doing, I could hardly even tell. It really felt like it had suddenly been ported to a machine with infinite audio channels that all ran at once.

No further work on the game’s sound system was required. It was done. From that moment on, all my testing/playing of the game never exposed any issue with the playing of sounds.

Lessons Learned

I gleaned a few bits of valuable knowledge from this experience:

  • Things that you assume to be dead simple (play a sound and it just plays, right?) can turn out to be hiding a lot of complexity and practicality that you didn’t even know was necessary.
  • Simple solutions (just rotate among the sound channels, right?) sometimes don’t work even at a moderately acceptable level of utility.
  • Solutions that seem overly complex, even kludgy, can turn out to be amazingly good in practice.
  • And of course, I now know how I’ll be coding sounds for any arcade style game, if I ever again create one. Fingers crossed; that might actually happen before I die. 😉

 

Update 2021.06.09 — Preference 2 and Preference 3 might need to be swapped. I honestly can’t remember now which of those two came first!

 

See also:
Rock-Solid iOS App Stability

 

prev     next

 

 

Hear, hear

prev     next

Best recent articles

Make Your Own FBI Backdoor, Right Now

Polygon Triangulation With Hole

The Legacy of Windows Phone

Palm Fan

Vivek Wadhwa, Scamster Bitcoin Doomsayer

Fanboy Features (regularly updated)

When Starting A Game of Chicken With Apple, Expect To Lose — hilarious history of people who thought they could bluff Apple into doing whatever they wanted.

A Memory of Gateway — news chronology of Apple’s ascendancy to the top of the technology mountain.

iPhone Party-Poopers Redux and Silly iPad Spoilsports — amusing litanies of industry pundits desperately hoping iPhone and iPad will go away and die.

Embittered Anti-Apple Belligerents — general anger at Apple’s gi-normous success.

RSS FEED

My books

Now available on Apple Books!

   

Links

Daring Fireball

The Loop

RoughlyDrafted

Macalope

Red Meat

Despair, Inc.

Real Solution #9 (Mambo Mania Mix) over stock nuke tests. (OK, somebody made them rip out the music — try this instead.)

Ernie & Bert In Casino

Great Explanation of Star Wars

Best commercials (IMO) from Super Bowl 41, 43, 45, 46, 47, 53 and 55

Kirk & Spock get Closer

American football explained.

TV: Succession; Better Call Saul; Homeland; Survivor; The Jinx; Breaking Bad; Inside Amy Schumer

God’s kitchen

Celebrity Death Beeper — news you can use.

Making things for the web.

RedQueenCoder.

My vote for best commercial ever. (But this one’s a close second, and I love this one too.)

Recent commercials I admire: KFC, Audi, Volvo

Best reggae song I’ve discovered in quite a while: Virgin Islands Nice

d120 dice: You too (like me) can be the ultimate dice nerd.

WiFi problems? I didn’t know just how bad my WiFi was until I got eero.

Favorite local pad thai: Pho Asian Noodle on Lane Ave. Yes, that place; blame Taco Bell for the amenities. Use the lime, chopsticks, and sriracha. Yummm.

Um, could there something wrong with me if I like this? Or this?

This entire site as a zip file — last updated 2023.10.06

Previous articles

Engström’s Motive

Google’s Decision

Warrening

The Two Envelopes Problem, Solved

The Practical Smartphone Buyer

Would Apple Actually Exit the EU Or UK?

See You Looked

Blackjack Strategy Card (Printable)

Swan Device 1956 — Probable Shape

Pu

RGB-To-Hue Conversion

Polygon Triangulation With Hole

One-Point Implosion: “Palm Fan”

Implosion: Were Those Two-Speed Lenses Really Necessary?

Apple Wants User/Developer Choice; Its Enemies Want Apple Ruin

Tim Sweeney Plays Dumb

The Jury of One

The Lesson of January 6

Amnesia Is Not A Good Plot

I Was Eating for 300 lbs, Not 220

Action Arcade Sounds and Reality

The Flea Market and the Retail Store

Squaring the Impossible

Yes, Crocodiles Are Dinosaurs — Duh

Broccoli and Apples Are Not the Antidote To Donuts and Potato Chips

Cydia and “Competition”

The Gift of Nukes

Prager University and the Anti-Socialists’ Big Blind Spot

In Defense of Apple’s 30% Markup, Part 2

In Defense of Apple’s 30% Markup

Make Your Own FBI Backdoor, Right Now

Storm

The Legacy of Windows Phone

Mindless Monsters

To the Bitter End

“Future Shock” Shock

Little Plutonium Boy

The iPhone Backdoor Already Exists

The Impulse To Be Lazy

HBO’s “Meth Storm” BS

Judos vs. Pin Place

Vizio M-Series 65" LCD (“LED”) TV — Best Settings (IMHO)

Tasting Vegemite (Bucket List)

The IHOP Coast

The Surprise Quiz Paradox, Solved

Apple, Amazon, Products, and Services — Not Even Close

Nader’s Open Blather

Health — All Or Nothing?

Vivek Wadhwa, Scamster Bitcoin Doomsayer

Backwards Eye Wiring — the Optical Focus Hypothesis

Apple’s Cash Is Not the Key

Nothing More Angry Than A Cornered Anti-Apple

Let ’Em Glow

The Ultimate, Simple, Fair Tax

Compassion and Vision

When Starting A Game of Chicken With Apple, Expect To Lose

The Caveat

Superb Owl

NavStar

Basic Reproduction Number

iBook Price-Fixing Lawsuit Redux — Apple Won

Delusion Made By Google

Religion Is A Wall

It’s Not A Criticism, It’s A Fact

Michigan Wolverines 2014 Football Season In Review

Sprinkler Shopping

Why There’s No MagSafe On the New MacBook

Sundar Pichai Says Devices Will Fade Away

The Question Every Apple Naysayer Must Answer

Apple’s Move To TSMC Is Fine For Apple, Bad For Samsung

Method of Implementing A Secure Backdoor In Mobile Devices

How I Clip My Cat’s Nails

Die Trying

Merger Hindsight

Human Life Decades

Fire and the Wheel — Not Good Examples of A Broken Patent System

Nobody Wants Public Transportation

Seasons By Temperature, Not Solstice

Ode To Coffee

Starting Over

FaceBook Messenger — Why I Don’t Use It

Happy Birthday, Anton Leeuwenhoek

Standard Deviation Defined

Not Hypocrisy

Simple Guide To Progress Bar Correctness

A Secure Backdoor Is Feasible

Don’t Blink

Predictive Value

Answering the Toughest Question About Disruption Theory

SSD TRIM Command In A Nutshell

The Enderle Grope

Aha! A New Way To Screw Apple

Champagne, By Any Other Maker

iOS Jailbreaking — A Perhaps-Biased Assessment

Embittered Anti-Apple Belligerents

Before 2001, After 2001

What A Difference Six Years Doesn’t Make

Stupefying New Year’s Stupidity

The Innovator’s Victory

The Cult of Free

Fitness — The Ultimate Transparency

Millions of Strange Devotees and Fanatics

Remember the iPod Killers?

Theory As Simulation

Four Analysts

What Was Christensen Thinking?

The Grass Is Always Greener — Viewing Angle

Is Using Your Own Patent Still Allowed?

The Upside-Down Tech Future

Motive of the Anti-Apple Pundit

Cheating Like A Human

Disremembering Microsoft

Security-Through-Obscurity Redux — The Best of Both Worlds

iPhone 2013 Score Card

Dominant and Recessive Traits, Demystified

Yes, You Do Have To Be the Best

The United States of Texas

Vertical Disintegration

He’s No Jobs — Fire Him

A Players

McEnroe, Not Borg, Had Class

Conflict Fades Away

Four-Color Theorem Analysis — Rules To Limit the Problem

The Unusual Monopolist

Reasonable Projection

Five Times What They Paid For It

Bypassable Security Certificates Are Useless

I’d Give My Right Arm To Go To Mars

Free Advice About Apple’s iOS App Store Guidelines

Inciting Violence

One Platform

Understanding IDC’s Tablet Market Share Graph

I Vote Socialist Because...

That Person

Product Naming — Google Is the Other Microsoft

Antecessor Hypotheticum

Apple Paves the Way For Apple

Why — A Poem

App Anger — the Supersized-Mastodon-In-the-Room That Marco Arment Doesn’t See

Apple’s Graphic Failure

Why Microsoft Copies Apple (and Google)

Coders Code, Bosses Boss

Droidfood For Thought

Investment Is Not A Sure Thing

Exercise is Two Thirds of Everything

Dan “Real Enderle” Lyons

Fairness

Ignoring the iPod touch

Manual Intervention Should Never Make A Computer Faster

Predictions ’13

Paperless

Zeroth — Why the Century Number Is One More Than the Year Number

Longer Than It Seems

Partners: Believe In Apple

Gun Control: Best Arguments

John C. Dvorak — Translation To English

Destructive Youth

Wiens’s Whine

Free Will — The Grand Equivocation

What Windows-vs.-Mac Actually Proved

A Tale of Two Logos

Microsoft’s Three Paths

Amazon Won’t Be A Big Winner In the DOJ’s Price-Fixing Suit

Infinite Sets, Infinite Authority

Strategy Analytics and Long Term Accountability

The Third Stage of Computing

Why 1 Isn’t Prime, 2 Is Prime, and 2 Is the Only Even Prime

Readability BS

Lie Detection and Psychos

Liking

Steps

Microsoft’s Dim Prospects

Humanity — Just Barely

Hanke-Henry Calendar Won’t Be Adopted

Collatz Conjecture Analysis (But No Proof; Sorry)

Rock-Solid iOS App Stability

Microsoft’s Uncreative Character

Microsoft’s Alternate Reality Bubble

Microsoft’s Three Ruts

Society’s Fascination With Mass Murder

PlaysForSure and Wikipedia — Revisionism At Its Finest

Procrastination

Patent Reform?

How Many Licks

Microsoft’s Incredible Run

Voting Socialist

Darwin Saves

The Size of Things In the Universe

The Self-Fulfilling Prophecy That Wasn’t

Fun

Nobody Was In Love With Windows

Apples To Apples — How Anti-Apple Pundits Shoot Themselves In the Foot

No Holds Barred

Betting Against Humanity

Apple’s Premium Features Are Free

Why So Many Computer Guys Hate Apple

3D TV With No Glasses and No Parallax/Focus Issues

Waves With Particle-Like Properties

Gridlock Is Just Fine

Sex Is A Fantasy

Major Player

Why the iPad Wannabes Will Definitely Flop

Predators and Parasites

Prison Is For Lotto Losers

The False Dichotomy

Wait and See — Windows-vs-Mac Will Repeat Itself

Dishonesty For the Greater Good

Barr Part 2

Enough Information

Zune Is For Apple Haters

Good Open, Bad Open

Beach Bodies — Who’s Really Shallow?

Upgrade? Maybe Not

Eliminating the Impossible

Selfish Desires

Farewell, Pirate Cachet

The Two Risk-Takers

Number of Companies — the Idiocy That Never Dies

Holding On To the Solution

Apple Religion

Long-Term Planning

What You Have To Give Up

The End of Elitism

Good and Evil

Life

How Religion Distorts Science

Laziness and Creativity

Sideloading and the Supersized-Mastodon-In-the-Room That Snell Doesn’t See

Long-Term Self-Delusion

App Store Success Won’t Translate To Books, Movies, and Shows

Silly iPad Spoilsports

I Disagree

Five Rational Counterarguments

Majority Report

Simply Unjust

Zooman Science

Reaganomics — Like A Diet — Works

Free R&D?

Apple’s On the Right Track

Mountains of Evidence

What We Do

Hope Conquers All

Humans Are Special — Just Not That Special

Life = Survival of the Fittest

Excuse Me, We’re Going To Build On Your Property

No Trademark iWorries

Knowing

Twisted Excuses

The Fall of Google

Real Painters

The Meaning of Kicking Ass

How To Really Stop Casual Movie Disc Ripping

The Solitary Path of the High-Talent Programmer

Fixing, Not Preaching

Why Blackmail Is Still Illegal

Designers Cannot Do Anything Imaginable

Wise Dr. Drew

Rats In A Too-Small Cage

Coming To Reason

Everything Isn’t Moving To the Web

Pragmatics, Not Rights

Grey Zone

Methodologically Dogmatic

The Purpose of Language

The Punishment Defines the Crime

Two Many Cooks

Pragmatism

One Last Splurge

Making Money

What Heaven and Hell Are Really About

America — The Last Suburb

Hoarding

What the Cloud Isn’t For

Diminishing Returns

What You’re Seeing

What My Life Needs To Be

Taking An Early Retirement

Office Buildings

A, B, C, D, Pointless Relativity

Stephen Meyer and Michael Medved — Where Is ID Going?

If You Didn’t Vote — Complain Away

iPhone Party-Poopers Redux

What Free Will Is Really About

Spectacularly Well

Pointless Wrappers

PTED — The P Is Silent

Out of Sync

Stupid Stickers

Security Through Normalcy

The Case For Corporate Bonuses

Movie Copyrights Are Forever

Permitted By Whom?

Quantum Cognition and Other Hogwash

The Problem With Message Theory

Bell’s Boring Inequality and the Insanity of the Gaps

Paying the Rent At the 6 Park Avenue Apartments

Primary + Reviewer — An Alternative IT Plan For Corporations

Yes Yes Yes

Feelings

Hey Hey Whine Whine

Microsoft About Microsoft Visual Microsoft Studio Microsoft

Hidden Purple Tiger

Forest Fair Mall and the Second Lamborghini

Intelligent Design — The Straight Dope

Maxwell’s Demon — Three Real-World Examples

Zealots

Entitlement BS

Agenderle

Mutations

Einstein’s Error — The Confusion of Laws With Their Effects

The Museum Is the Art

Polly Sooth the Air Rage

The Truth

The Darkness

Morality = STDs?

Fulfilling the Moral Duty To Disdain

MustWinForSure

Choice

Real Design

The Two Rules of Great Programming

Cynicism

The End of the Nerds

Poverty — Humanity’s Damage Control

Berners-Lee’s Rating System = Google

The Secret Anti-MP3 Trick In “Independent Women” and “You Sang To Me”

ID and the Large Hadron Collider Scare

Not A Bluff

The Fall of Microsoft

Life Sucks When You’re Not Winning

Aware

The Old-Fashioned Way

The Old People Who Pop Into Existence

Theodicy — A Big Stack of Papers

The Designed, Cause-and-Effect Brain

Mosaics

IC Counterarguments

The Capitalist’s Imaginary Line

Education Isn’t Everything

I Don’t Know

Funny iPhone Party-Poopers

Avoiding Conflict At All Costs

Behavior and Free Will, Unconfused

“Reduced To” Absurdum

Suzie and Bubba Redneck — the Carriers of Intelligence

Everything You Need To Know About Haldane’s Dilemma

Darwin + Hitler = Baloney

Meta-ware

Designed For Combat

Speed Racer R Us

Bold — Uh-huh

Conscious of Consciousness

Future Perfect

Where Real and Yahoo Went Wrong

The Purpose of Surface

Eradicating Religion Won’t Eradicate War

Documentation Overkill

A Tale of Two Movies

The Changing Face of Sam Adams

Dinesh D’Souza On ID

Why Quintic (and Higher) Polynomials Have No Algebraic Solution

Translation of Paul Graham’s Footnote To Plain English

What Happened To Moore’s Law?

Goldston On ID

The End of Martial Law

The Two Faces of Evolution

A Fine Recommendation

Free Will and Population Statistics

Dennett/D’Souza Debate — D’Souza

Dennett/D’Souza Debate — Dennett

The Non-Euclidean Geometry That Wasn’t There

Defective Attitude Towards Suburbia

The Twin Deficit Phantoms

Sleep Sync and Vertical Hold

More FUD In Your Eye

The Myth of Rubbernecking

Keeping Intelligent Design Honest

Failure of the Amiga — Not Just Mismanagement

Maxwell’s Silver Hammer = Be My Honey Do?

End Unsecured Debt

The Digits of Pi Cannot Be Sequentially Generated By A Computer Program

Faster Is Better

Goals Can’t Be Avoided

Propped-Up Products

Ignoring ID Won’t Work

The Crabs and the Bucket

Communism As A Side Effect of the Transition To Capitalism

Google and Wikipedia, Revisited

National Geographic’s Obesity BS

Cavemen

Theodicy Is For Losers

Seattle Redux

Quitting

Living Well

A Memory of Gateway

Is Apple’s Font Rendering Really Non-Pixel-Aware?

Humans Are Complexity, Not Choice

A Subtle Shift

Moralism — The Emperor’s New Success

Code Is Our Friend

The Edge of Religion

The Dark Side of Pixel-Aware Font Rendering

The Futility of DVD Encryption

ID Isn’t About Size or Speed

Blood-Curdling Screams

ID Venn Diagram

Rich and Good-Looking? Why Libertarianism Goes Nowhere

FUV — Fear, Uncertainty, and Vista

Malware Isn’t About Total Control

Howard = Second Coming?

Doomsday? Or Just Another Sunday

The Real Function of Wikipedia In A Google World

Objective-C Philosophy

Clarity From Cisco

2007 Macworld Keynote Prediction

FUZ — Fear, Uncertainty, and Zune

No Fear — The Most Important Thing About Intelligent Design

How About A Rational Theodicy

Napster and the Subscription Model

Intelligent Design — Introduction

The One Feature I Want To See In Apple’s Safari.