The motivation for inventing a tap code was simply the desire to learn Morse code. There's a big disadvantage to Morse code however: you need to be able to discern long and short notes. This is not always possible. Tapping however is always possible. The differentiation between short and long taps is easy if you get the feel for a certain rhythm pattern. In the end you don't hear short and long notes, but only the rhythm pattern, similar to reading text, where you don't read single letters, but entire words at a time, just by identifying the rough outline shape and letter content of the word.
Why would you have to invent a tap code, there surely already is one. Yes, the Polybius square, but it isn't optimized. The great thing about the Morse code is, that it is based on the letter frequency of the english language. So, for instance the letter e is more frequent than the letter x and thus gets a shorter code. I am not aware of a tap code, that does that. The Polybius square is totally stupid in this regard. And as you might already know, I don't let stupid things into my brain once I have identified them as being stupid.
And why not use the Morse code and tap it? Yes, the professionals in Morse code can recognize letters or words by their rhythm, but it is still ambiguous, they have to guess. I wanted a code that is unambiguous, letter by letter, where no guessing is needed.
The solution to the problem is simply to let the code lengths be always even. You have a two tap pause between letters and a four tap pause between words. Musicians will have no trouble with these notions, when they think of eighth and sixteenth notes and rests. You get a set of unambiguous codes and simply have to define them to the letters in the order of their frequency. In my case I chose a self calculated german letter frequency, but if you like, you can take my set of codes and define it to the english letter frequency.
The program lets you practice hearing and writing. You can choose a subset of all letters, so if you want to practice only the short codes first, then you can do that. Later, when you know the short codes, you can practice only the long codes. That's what the "choose subset" menu is for. The chosen subset is saved in the "subset.txt" file. You can choose predefined subsets with the 0-9 keys or you can toggle on and off single letters by pressing the appropriate key.
In "learning" you see a letter sequence and hear it tapped at the same time. Press any button and you get the next sequence.
In "training" the purpose is to press the appropriate key as fast as possible after hearing the letter tapped. If you have a particularly long reaction time for some letters this shows up here and you should concentrate on learning them better. The last five reaction times per letter are saved in the "stats.txt" file. You can reset this file by pressing "R" in the main menu.
In "hearing" you can choose between listening to an arbitrary letter sequence that you give in, a randomly generated one or a randomly chosen word from a word list. The words are stored in the "WordList.txt" file. You can store up to 10000 words. The list I included has only german words. Feel free to make your own list in your language. If you give in an empty word, i.e. just press return, you return to the main menu. The words from the list have to contain letters from the chosen subset. So it can happen that there is no word found.
Similarly, in "writing" you can write arbitrary sequences, randomly generated ones, or words from the word list. With "q" you return to the main menu. If the computer got confused and didn't recognize your code, you can press "w" to reset the code recognizer, or you can just wait a few taps, then it will reset automatically. Your tapping key is any other key except these two.
"number of letters" determines how long the words or randomly generated sequences are. If both numbers are 1, then all the lengths are possible. This setting is also stored in the "subset.txt" file.
The "pause between letters" gives the number of eighths notes between letters. 1 is optimal, but may be too fast for the beginning, so you can choose a longer pause here. This setting is stored in the "subset.txt" file, too.
The "tap duration" is the duration of a sixteenth note in seconds. As you get more proficient you will want to make this value smaller and smaller probably. A good start is 0.166 seconds, i.e. 1/6th of a second, which means that you can write on average one letter per second.
"recognize space" allows you to let the computer recognize pause intervals. This is necessary if you want to practice writing letters with a minimal pause of two taps inbetween. Two empty taps will be recognized as letter ending, four taps, i.e. the supposed pause between two words, will be recognized as pause and displayed as an underscore "_". This way you can practice letting no space between letters and exactly one space between words. If you have difficulties with that, you can make the tap duration longer and tap the eighth beat with your feet to it.
"input sound" turns the playback of the tap .wav on or off whenever you press a button. You may not want that, as it is slightly delayed compared to the sound of the real keyboard button pressing.
"signal type" lets you choose between the tap .wav audio signal or a visual signal instead. (The visual signal is not of a very good quality at the moment and will have to be synced to the screen refresh rate in the future.)
"audio input" turns on audio recording of your microphone. In writing mode you will see the recorded audio level at the bottom of the screen scrolling from right to left. The noise level is supposed to be well below the red line and the signal level well over it when you tap (i.e. with a finger on a table or with clapping). You can use this method as input now, although the keyboard input still works. Interferences from background sounds are of course not filtered out, this would be a non-trivial signal processing task and well out of the scope of this little program.
You can use your own tapping sound by replacing the "klopf.wav" file.
The sound output uses OpenAL, i.e. OpenAL32.dll and alut.dll (similar to OpenGL's OpenGL32.dll and GLUT.dll). If you haven't got it installed already on your system, you can get both dll's from the sites mentioned below. Contrary to what I've stated before, it is not enough to copy the dll's to the tapcode directory. At least for the OpenAL32.dll you'll probably have to use the installer.
OpenAL site: http://connect.creativelabs.com/openal/Downloads/
Alternatively there is also an open source version, OpenAL soft: http://kcat.strangesoft.net/openal.html