Skip to content
 

C Sharp Morse Code Console.Beep()

Hola! En este post explicaré como crear un pequeño programita en C# (c Sharp) para convertir un texto cualquiera  a código morse y también para “pitar” el beep del ordenador con dicho código!

Codigo Morse

Primero… ¿Qué es el codigo Morse?

El Codigo Morse son la representación de nuestro alfabeto en “puntos y rayas“, ello permite la trasmisión de mensaje a través de dispositivos capaces de emitir sonidos o imprimir puntos y rayas (como el telégrafo), si quieres una explicación mas profunda podemos recurrir a la wikipedia: Código Morse

¿Como funciona?

Lo que haremos con nuestro pequeño programa es reconocer cada caracter de una cadena de texto, luego enviaremos cada caracter a un método (funcion/procedimiento) y éste nos retornará su representación en código morse (nos retorna un string), la funcion recibe como parámetros una variable de tipo char (solo un caracter) y retorna un string (cadena de texto, en este caso una cadena de puntos y rayas)

static string morseCode(char txt)
{
 string morse = "" ;
 switch (txt)
 {
 case 'a': morse = "·-"; break;
 case 'b': morse = "-···"; break;
 case 'c': morse = "-·-·"; break;
 case 'd': morse = "-··"; break;
 case 'e': morse = "·"; break;
 case 'f': morse = "··-·"; break;
 case 'g': morse = "--·"; break;
 case 'h': morse = "····"; break;
 case 'i': morse = "··"; break;
 case 'j': morse = "·---"; break;
 case 'k': morse = "-·-"; break;
 case 'l': morse = "·-··"; break;
 case 'm': morse = "--"; break;
 case 'n': morse = "-·"; break;
 case 'ñ': morse = "--·--"; break;
 case 'o': morse = "---"; break;
 case 'p': morse = "·--·"; break;
 case 'q': morse = "--·-"; break;
 case 'r': morse = "·-·"; break;
 case 's': morse = "···"; break;
 case 't': morse = "-"; break;
 case 'u': morse = "··-"; break;
 case 'v': morse = "···-"; break;
 case 'w': morse = "·--"; break;
 case 'x': morse = "-··-"; break;
 case 'y': morse = "-·--"; break;
 case 'z': morse = "--··"; break;
 case ' ': morse = " "; break;
 case '0': morse = "-----"; break;
 case '1': morse = "·----"; break;
 case '2': morse = "··---"; break;
 case '3': morse = "···--"; break;
 case '4': morse = "····-"; break;
 case '5': morse = "·····"; break;
 case '6': morse = "-····"; break;
 case '7': morse = "--···"; break;
 case '8': morse = "---··"; break;
 case '9': morse = "----·"; break;
 case '.': morse = "·-·-·-"; break;
 case ',': morse = "--··--"; break;
 case '?': morse = "··--··"; break;
 case '\"': morse = "·-··-·"; break;
 default: morse = ""; break;
 }
 return morse;
}

Eso viene a ser practicamente todo, ahora solo nos queda pedir la cadena, extraer cada caracter y enviarlo a la función anterior:

Para leer una cadena ingresada por teclado usamos el método Console.ReadLine(); si queremos algo mas “bonito” entonces lo ideal sería solicitar la cadena de texto con un mensaje:

Console.Write(“Escriba aqui su texto a convertir : “);
string txt = Console.ReadLine();

Como nuestra funcion morseCode() solo trabaja con caracteres en minúscula, entonces necesitamos convertir a minúscula todos los caracteres de nuestra cadena, para ello usamos el método ToLower();

txt = txt.ToLower();

Ahora recorreremos nuestra cadena de texto con un bucle y extraeremos cada caracter, al mismo tiempo enviaremos el caracter extraido a nuestra funcion morseCode() e imprimiremos la respuesta de la función:

char tmp; int p;
for (p = 0; p < txt.Length; p++)
{
 tmp = char.Parse(txt.Substring(p, 1));
 Console.Write("{0} ", morseCode (tmp));
}

Creamos las variables TMP y P, haciendo uso del bucle FOR (para) recorremos toda la cadena mientras P sea menor que la longitud de la cadena (txt.Length), TMP tomará el valor de la cadena en la posicion P y convertimos la salida a tipo Char (char.Parse), luego imprimimos en pantalla la salida de morseCode(tmp)…

Ahora construiremos nuestra funcion para pitar el altavoz del sistema (beep)

Las normas del código Morse nos dice que…

  1. Un guión es igual a tres puntos
  2. El espacio entre las partes de la misma letra es igual a un punto
  3. El espacio entre dos letras es igual a tres puntos
  4. El espacio entre dos palabras es igual a siete puntos
static void beepMorseCode(string morse)
{
 int f = 600; //frecuencia en hz del pitido
 int dot = 50; //duracion del pitido PUNTO
 int x = 0;
 char t = ' ';
 while (x < morse.Length)
 {
  t = char.Parse(morse.Substring(x, 1));
  if (t == '·')
  {
   Console.Beep(f, dot); //tono punto
   Thread.Sleep(dot); //separacion entre partes de la letra
  }
  else if (t == '-')
  {
   Console.Beep(f, dot * 3); //tono raya 3 puntos
   Thread.Sleep(dot); //separacion entre partes
  }
  else
  {
   //genera una pausa de 6 puntos
   Thread.Sleep(dot * 6); //en total 7 contando las pausas anteriores
  }
  x++;
 }
 //pausa de 3 puntos, equivale a separacion de frase
 Thread.Sleep(dot * 2);
}

En nuestro método beepMorsCode recibimos una variable de tipo string, al comienzo declaramos la frecuencia de cada pitido y la duración del mismo, tambien declaramos la duración de cada silencio.
Iniciamos un bucle diciendo: “mientras X sea menor que la longitud de la variable MORSE”; iniciamos condiciones, si T (el char “actual”) es un PUNTO entonces pitamos F con duración L, si es RAYA pitamos F con el doble de L y si es un ESPACIO hacemos PAUSA (con Thread.Sleep();), incrementamos X;

Para usar la opción SLEEP debemos colocar “using System.Threading;” en las primeras lineas de nuestro codigo!

Ahora nuestro pequeño programa ya puede reproducir sonidos según el codigo morse, para llamar al método beepMorseCode() solo hace falta enviarle el string generado por morseCode(), nuestro método beepMorseCode se encargará de generar la secuencia de beeps y pausas adecuadas!

Eso es todo, aquí tienen el código fuente de: Console.Beep Morse Code listo para compilar y probar! :D

3 Comments

  1. ROSA dice:

    Hola!! Realmente todo esta en clave morse.

  2. Eduardo Diaz dice:

    *Insisto, este muchacho está cagado del cerebelo!.

    Morse beep!
    *Esperando q haga una para #beep
    tiru tiru tuu tuu tuu ti ru.. la kgada :D

  3. gerWare(); dice:

    Ing. Eduardo Diaz (aka Oakenfold)
    Favor de expresarse con propiedad a través de éste medio

Leave a Reply