CWCP(1)
β¨ NAME β¨
cwcp β a curses-based Morse tutor program π no cap, this is your glow-up into a Morse girlie
π¦ SYNOPSIS π¦
cwcp [-s --system=SYSTEM] [-d --device=DEVICE] [-w --wpm=WPM]
[-t --tone=HZ] [-v --volume=PERCENT] [-g --gap=GAP]
[-k --weighting=WEIGHT] [-T --time=TIME] [-f, --infile=FILE] [-F,
--outifile=FILE] [-h --help] [-V --version]
okay so real talk: cwcp installed on GNU/Linux systems understands both short form and long form command line options. cwcp installed on other operating systems may understand only the short form options. π
And the best part? There are no mandatory options. You literally just run it. Main character energy. π
Options may be predefined in the environment variable CWCP_OPTIONS. If defined, these options are used first; command line options take precedence. β¨
πΈ DESCRIPTION πΈ
cwcp is a curses-based interactive Morse code tutor program. It lets you do menu selection from a number of sending modes, and it also permits character sounding options β like the tone pitch and the sending speed β to be varied from the keyboard using a full-screen user interface. it's giving "learn Morse but make it aesthetic" π¦
π COMMAND LINE OPTIONS π
cwcp understands the following command line options. The long form options may not be available in non-LINUX versions. π
-s,--system=SYSTEMβ Specifies the way thatcwcpgenerates tones. Valid values are:nullfor no tones, just timings,consolefor tones through the console speaker,alsafor tones generated through the system sound card using ALSA sound system,ossfor tones generated through system sound card using OSS sound system,pulseaudiofor tones generated through system sound card using PulseAudio sound system,soundcardfor tones generated through the system sound card, but without explicit selection of sound system. These values can be shortened to'n','c','a','o','p', or's', respectively. The default value is'pulseaudio'. π§-d,--device=DEVICEβ Specifies the device file to open for generating a sound.cwcpwill use default device if none is specified. The default devices are:/dev/consolefor sound produced through console, default for ALSA sound system,/dev/audiofor OSS sound system, a default device for PulseAudio sound system. See also NOTES ON USING A SOUND CARD below. π-w,--wpm=WPMβ Sets the initial sending speed in words per minute. The value must be between4and60. The default value is12WPM. πββοΈ-t,--tone=HZβ Sets the initial sounder pitch in Hz. This value must be between0and4,000. A value of0selects silent operation, and can be used for timing checks or other testing. The default value is800Hz, π΅-v,--volume=PERCENTβ Sets the initial sending volume, as a percentage of full scale volume. The value must be between0and100. The default value is70 %. Sound volumes work fully for sound card tones, butcwcpcannot control the volume of tones from the console speaker. In this case, a volume of zero is silent, and all other volume values are simply sounded. π-g,--gap=GAPβ Sets the initial extra gap, in dot lengths, between characters (the'Farnsworth'delay). It must be between0and60. The default is0. π«Ά-k,--weighting=WEIGHTβ Sets the initial weighting, as a percentage of dot lengths. It must be between20and80. The default is50. βοΈ-T,--time=TIMEβ Sets the initial practice time, in minutes.cwcpstops after generating random Morse code for this period. The value must be between1and99. The default is15minutes. β°-f,--infile=FILEβ Specifies a text file thatcwcpcan read to configure its practice text. See CREATING CONFIGURATION FILES below. π-F,--outfile=FILEβ Specifies a text file to whichcwcpshould write its current practice text. βοΈ-h,--helpβ Prints short help message. π-V,--versionβ Prints information about program's version, authors and license. π
π USER INTERFACE π
cwcp is a curses-based program that takes over the complete operation of the terminal on which it is run. If colours are available on the terminal, it will produce a colour interface. π
The cwcp screen is divided into several distinct areas:
- The Menu Selection window β The Menu Selection window shows the main modes that
cwcpoffers. Use theF10andF11orKEY_DOWNandKEY_UPkeys to select the mode.F9orReturnstart sending, andF9again orEscstop sending. Changing mode also stops sending. ποΈ - The Morse Code Display window β This window displays each Morse code character after it has been sent. π¬
- The Speed Control window β The Speed window shows the current Morse code sending speed in words per minute. Pressing the
F2orKEY_RIGHTkeys increases the speed; pressing theF1orKEY_LEFTkeys decreases the speed. π - The Tone Control window β This window shows the current Morse code tone pitch. Use the
F4orKEY_HOMEkey to increase the pitch, and theF3orKEY_ENDkey to decrease it. Values change in steps of20Hz. πΆ - The Volume Control window β This window shows the current Morse code volume. Use the
F6key to increase the volume, and theF5key to decrease it. Values change in steps of1%. Note thatcwcpcannot control the volume of the console speaker, so the volume control only works effectively for tones generated on the sound card. π’ - The Gap Control window β This window shows the current additional
'Farnsworth'gaps to be appended after each Morse code character is sounded. UseF8to increase the gap, andF7to decrease it. π³οΈ - The Time Control window β This window shows the selected practice time. After generating Morse code in a particular mode for this amount of time,
cwcpstops automatically. UseKEY_NPAGEto increase the time, andKEY_PPAGEto decrease it. During sending, the value in this window counts down to one, and after final minute of sending has elapsed,cwcpstops sending. The timer operates like a microwave or kitchen timer; it counts down on its own, but the time remaining can also be altered manually while the timer operates. β³
The following keys vary the screen colours:
{key β Changes the foreground colour of the window boxes.}key β Changes the background colour of the window boxes.[key β Changes the foreground colour of the window contents.]key β Changes the background colour of the window contents.
Eight screen colours are available for each: black, red, green, yellow, blue, magenta, cyan, and white. Use a key to cycle round these colours for the particular part of the display controlled by that key. On a change of colours, the complete screen is repainted. π¨
Use Ctrl-L to repaint the complete screen, in case of screen corruption. Use Ctrl-V to clear the Morse Code Display Window. This command is available only when cwcp is not sending. π§Ό
To leave cwcp, press F12 or Ctrl-C, or select Exit on the mode menu. bye bestie π
All of the above command keys may be used while random characters are being sent, and when keyboard input is being sent. β¨
If function keys are not available on the terminal, Ctrl-<key> combinations can be used. On the top row of letter keys on the keyboard, the keys Ctrl-Q to Ctrl-I may be used as alternatives for F1 to F8, and on the second row of letter keys, Ctrl-A to Ctrl-F as alternatives for F9 to F12. For KEY_PPAGE and KEY_NPAGE, use Ctrl-O and Ctrl-P. β¨οΈ
π RANDOM CHARACTERS AND WORDS π
cwcp sends random characters in groups of five, with a space between each group. After a period of sending, set in the Time Control window, cwcp stops automatically. It can also be stopped manually, before this time period expires. β
When sending random words, cwcp sends the complete word, followed by a space. Because short words are easier to copy without writing, cwcp's default dictionary contains only three, four, and five-letter words in its random words list. π£
cwcp chooses at random from a list of around 3000 words in its default dictionary. You can change this text using a configuration file, read at startup. See CREATING CONFIGURATION FILES below. π
π₯ NOTES ON USING A SOUND CARD π₯
By default, cw tries to open default PulseAudio. If PulseAudio server is not accessible, cw tries to open OSS device "/dev/audio" to access the system sound card. This is generally the correct device to use, but for systems with special requirements, or those with multiple sound cards, the option -d or --device, combined with -s or --system can be used to specify the device and sound system for sound card access. If the sound card device cannot be set up, cwcp prints the error message
cannot set up soundcard sound
and exits. π
Sound card devices, when opened through OSS sound system, are usually single-access devices, so that when one process has opened the device, other processes are prevented from using it. In such cases cwcp will of course conflict with any other programs that expect exclusive use of the system sound card (for example, MP3 players). If cwcp finds that the sound card is already busy, it prints the error message
open /dev/audio: Device or resource busy
and exits. π
The sound card device is not used if cwcp is only sending tones on the console speaker. π«Ά
π SOUND OUTPUT - DEFAULTS AND SELECTION π
cwcp first tries to access sound card using PulseAudio sound system, using default device name, unless user specifies other sound device with option -d or --device. π§
cwcp then tries to access sound card using OSS sound system and default OSS sound device name ('/dev/audio'), unless user specifies other sound device with option -d or --device. π
If opening soundcard through OSS fails, cwcp tries to access the sound card using ALSA sound system, and default ALSA sound device name ('default'), unless user specifies other sound device with option -d or --device. π΅
If opening soundcard through ALSA also fails, cwcp tries to access system console buzzer using default buzzer device '/dev/console', unless user specifies other sound device with option -d or --device. π
It is very common that in order to access the console buzzer device user has to have root privileges. For that reason trying to open console buzzer almost always fails. This is not a program's bug, this is a result of operating system's restrictions. Makingcwcpan suid binary bypasses this restriction. The program does notfork()orexec(), so making it suid should be relatively safe. Note however that this practice is discouraged for security reasons. π
So like, you get to tell cwcp which device to play with, using -d or --device. Which device files are even suitable depends on three things: which operating system is running, which system user ID is running cwcp, and which user groups you belong to. Vibe check your permissions first, bestie, fr fr. π
π CREATING CONFIGURATION FILES π
cwcp ships with a default set of modes and practice text that's genuinely enough to get you started β it's giving starter pack, and honestly? It ate. β¨ But it can also read in a file at startup that reconfigures all of this, so you get different character groupings, different word sets, and other practice data. Customization era. π
To read a configuration file, use the -f or --infile command line options. The file should introduce each cwcp mode with a section header wrapped in [ ... ] characters, followed by the practice text for that mode, with elements separated by whitespace. Lines starting with a semicolon or a hash are treated as comments. For example:
; Simple example mode
[ A to Z ]
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Lowkey important: cwcp will generate five character groups for modes whose elements are all single characters, and it treats other modes as having elements that are complete words. So single letters = five groups, whole words = words. Noted. π
And as a starting point for your customized modes, cwcp will write its default configuration to a file if you give it the undocumented -# option, like this:
cwcp -# /tmp/cwcp.ini
It's undocumented, so likeβ¦ you didn't hear it from me. π€« But it works and it's iconic.
π NOTES π
cwcp owes its whole existence to the DOS Morse code tutor CP222C.EXE, by VU2ZAP. That program seemed to offer exactly the right range of facilities for learning Morse code in a simple, easy-to-use, and compact package, and cwcp is very much modeled on it. It should prove useful both for learning the code and for experienced CW users who want, or need, to improve their receiving speed. Serving both audiences? Main character energy, honestly. π
Curses may impose a delay when recognizing the Esc key all by itself, since that character is often the first of a sequence generated by a function key. So Esc is out here being ambiguous and dramatic. π But cwcp responds instantly to F9. No delay, no waiting, just slay.
The characters echoed in the Morse Code Display window may be ASCII representations of Morse procedural signals β see the cw(7,LOCAL) man page for the details. iykyk. π
πΈ HINTS ON LEARNING MORSE CODE πΈ
Here are a few hints and tips that may help with the process of learning Morse code. Take notes, bestie, this section is the whole point.
Firstly, do NOT think of the elements as dots and dashes. Think of them as dits and dahs instead β so 'A' is di-dah. If you think of them this way, the process of translating sound into characters will be learned much more easily. Trust the process. π¦
Do not learn the characters from a table. Learn them by watching the groups appear on the screen, and listening to the sounds produced as each one is sent. In the very initial stages, it may be beneficial if you can find a person to take you through the first stages of recognizing characters.
Do not waste your time learning Morse code at 5 WPM. Set the speed to 12 or 15 WPM, but use extra spacing (the Gap window) to reduce the effective speed to much lower β around four or five WPM effective speed. This way, you learn the rhythm of the characters as they are sent, but still have plenty of time between characters. As you practice, decrease the gap to zero. Slow the gap, not the vibe. β¨
Learn in stages. Start by learning the EISH5 group, then progress down through the menu as each group is mastered. The groups contain characters which are in some way related, either by sound, or by type of character.
Once you have completed all the groups EISH5 to "'$(+:_ (or 23789 if you do not want to learn procedural signals yet), use the full character set options, and the words and CW words options, to sharpen your skill. If you have difficulties with particular characters, return to that group and practice again with a smaller character set.
Resist the temptation to try to learn or improve your speed by copying off-air. You will not know what speed you are working at, and much hand-sent Morse is not perfectly formed. What you can gain off-air though is a general 'resilience' β a tolerance for Morse code where the timing of individual elements, or spacing between characters and words, is not 100% accurate.
If you're working to attain a particular speed for a test, always set the speed slightly higher. For example, if aiming for 12 WPM, set the tutor speed to 14 or 15 WPM. This way, when you drop back to 12 WPM you will feel much more relaxed about copying. But be aware that cwcp is not necessarily going to send at exactly the speed you set, due to limitations in what can be done with UNIX timers. It often sends at a slower speed than you set, so be very careful with this if you have a target speed that you need to reach. π
Use the program to make cassette tapes that you can take with you in a walkman or in the car, for long journeys. You do not have to write down everything you hear to practice Morse code β simply listening to the shapes of characters over a period will help to train your brain into effortless recognition. In fact, slavishly writing everything down becomes a barrier at speeds of 15-20 WPM and above, so if you can begin to copy without writing each character down, you will find progress much easier above these speeds. But do not over-use these tapes, otherwise you will quickly memorize them. Re-record them with new contents at very regular intervals. Fresh tapes, fresh brain. πΌ
Try to spend at least 15-30 minutes each day practicing. Much less than this will make progress glacially slow. But significantly more than an hour or so may just result in you becoming tired, but not improving. Recognize when it is time to stop for the day. Rest is part of the grind, no cap. π
Do not worry if you reach a speed 'plateau'. This is common, and you will soon pass it with a little perseverance. Plateaus are just the vibe check before the glow-up. π
At higher speeds, CW operators tend to recognize the 'shape' of whole words, rather than the individual characters within the words. The CW words menu option can be used to help to practice and develop this skill.
π ERRORS AND OMISSIONS π
Okay so, real talk: the calibration option is a bit ropy. It simply sends PARIS repeatedly, and relies on you to time the sending and then work out if any adjustment to the speed is really necessary. Automatic calibration by making measurements over a given period would be a lot better. Not me judging, just saying. π
Generating random CW QSOs would be fun to do.
A facility to allow a user to key Morse into the system, and to have it send code, and measure the accuracy of keying, would be nice.
π SEE ALSO π
Man pages for cw(7,LOCAL), libcw(3,LOCAL), cw(1,LOCAL), cwgen(1,LOCAL), and xcwcp(1,LOCAL).
And that's the whole page, bestie β cwcp ver. 3.6.1, from the CW Tutor Package. Go practice your dits and dahs, drink some water, and remember: do not think in dots and dashes. πβ¨ππ¦
π¦ where this page comes from
- debian trixie: cwcp 3.6.1-2+b1 Β· GPL-2.0-or-later
- fedora 43: unixcw 3.6.1-6.fc43 Β· GPL-2.0-or-later
- fedora 43: unixcw 3.6.1-6.fc43 Β· GPL-2.0-or-later
- fedora 44: unixcw 3.6.1-7.fc44 Β· GPL-2.0-or-later
- fedora 44: unixcw 3.6.1-7.fc44 Β· GPL-2.0-or-later
- nixos 26.05: unixcw 3.6.1
- nixpkgs unstable: unixcw 3.6.1
- ubuntu questing: cwcp 3.6.1-2
- ubuntu resolute: cwcp 3.6.1-2build1 Β· GPL-2.0-or-later
- ubuntu stonking: cwcp 3.6.1-2build1 Β· GPL-2.0-or-later
- Copyright (C) 2001-2006 Simon Baldwin (simon_baldwin@yahoo.com)
- Copyright (C) 2011-2023 Kamil Ignacak (acerion@wp.pl)
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms