Hola, aquí explicaré como componer la melodía de StarWars usando Console.Beep()
Actualización 28/10/2009
¿Usas GNU/Linux? ¿Mono ejecuta el binario pero no suena la bocina de tu PC? La solución esta en éste post: Imperial March Bash Beep, un script en BASH con las frecuencias de la Marcha Imperial de StarWars listo para ejecutar, incluye control de tempo para ejecutarlo al tempo (bpm, negras por minuto) que más gustes!
Continuando con el post …
Anteriormente escribí aquí como hacer crear pequeñas melodías usando una consola en GNU, ahora le tocó el turno a Microsoft Windows; usaremos Microsoft Visual Studio y programaremos en Do Sostenido (C#, C Sharp) la melodía de StarWars.
En este pseudotutorial haremos uso del método Console.Beep() de la clase System en C Sharp, si quieres conocer más a fondo como funciona éste método puedes leer >> Sobrecargas en Console.Beep();
Gerber dice:
No me hago responsable por el uso inadecuado de Console.Beep(); si exageras escribiendo frecuencias muy altas puedes llegar a dañar TUS OIDOS y probablemente también dañar el hardware de tu ordenador!
Requisitos:
- Conocimientos básicos de programación en C Sharp
Métodos y Bucles - Paciencia y Muchas ganas de programar
- Amor por la música
Comenzemos…
Programar toda la melodía escribiendo “nota por nota” nos llevaría dias, meses (y quizá años); para ello crearemos (e implementaremos) métodos y haremos uso de bucles FOR para llamar (o repetir) “ciertas secuencias musicales” las veces que sean necesarias durante la melodía!
Console.Beep(int frecuencia, int duración_sonido);
Este método de la clase consola necesita 2 parámetros, el primero es la frecuencia de tipo ENTERO (no double, no float) y la duración del sonido expresado en milésimas de segundo, ejemplo si quisieramos hacer sonar una LA (frecuencia = 440hertz) durante 3 segundos (3000 milésimas de segundo) escribiríamos asi:
Console.Beep(440, 3000) // laaaaaaaaaaaaaaaaa
Aquí tenemos una tabla de frecuencias de las notas musicales, sería bueno que echemos un vistazo para conocer las frecuencias, es necesario redondearlas (o expresar su máximo entero) para usar la frecuencia en Beep();
Se ha dividido el tema en 3 partes, cada parte es un método (método = función, procedimiento) y cada método ejecuta una secuencia de notas diferentes (estas notas están asociadas en otros métodos), los métodos son: partI_starwars(); partII_starwars(); y final();
La primera parte esta formada por 3 métodos:
- rerere(); ejecuta un tresillo (tres notas en una corchea) de la nota RE
- dosila(); ejecuta un tresillo con las notas Do Si La
- dosido(); ejecuta un tresillo con las notas Do Si Do
A continuación el código de cada método (rerere, dosila, dosido)
//tresillo re re re
static void rerere(int d)
{
//un bucle FOR repite 3 veces el Beep
for (int x = 0; x < 3; x++) {
Console.Beep(523, d); //re
}
}
//tresillo do si la
static void dosila(int d)
{
Console.Beep(1046, d); //do
Console.Beep(987, d); //si
Console.Beep(880, d);//la
}
//tresillo do si do
static void dosido(int d)
{
Console.Beep(1046, d);
Console.Beep(987, d);
Console.Beep(1046, d);
}
Cada tresillo recibe un parámetro, en esta melodía he tomado 1200 milésimas de segundo como duración de una negra, como sabemos (si es que sabemos) los tresillos se ejecutan en el lapso de una corchea, entonces nuestra corchea vale 600 (la mitad de la negra), y cada tresillo valdría 200, es por eso que el parámetro (int d) recibirá un 200; también se ha usado un bucle para que se repita el primer tresillo (rerere), ahora veremos cómo esta compuesto nuestro método partI_starwars();
static void partI_starwars()
{
rerere(200); // llamamos a la funcion rerere()
Console.Beep(783, 1200); //sol
Console.Beep(1174, 1200);//re2
dosila(200); //funcion dosila()
Console.Beep(1567, 1200); //sol2
Console.Beep(1174, 600); //re2
dosila(200); //nuevamente funcion dosila()
Console.Beep(1567, 1200); //sol2
Console.Beep(1174, 600); //re2
dosido(200); //ahora dosido()
Console.Beep(880, 1200); //la
}
La segunda parte está formada por los métodos:
- reremimi(); Como verán existe un puntillo, re … re mi… mi
- frase000(); Una larga melodía
- frase001(); Otra larga melodía
- frase002(); Y La última casi larga melodía
Estos métodos no reciben parámetros, y se ejecutan de modo secuencial, aquí el código de los métodos (reremimi, frase001…)
static void reremimi()
{
Console.Beep(523, 400); //re
Console.Beep(523, 200); //re
Console.Beep(659, 900); //mi
Console.Beep(659, 300); //mi
}
static void frase000()
{
Console.Beep(1046,300);//do
Console.Beep(987, 300);//si
Console.Beep(880, 300);//la
Console.Beep(783, 300);//sol
Console.Beep(783, 300);//sol
Console.Beep(880, 150);//la
Console.Beep(987, 150);//si
Console.Beep(880, 300);//la
Console.Beep(659, 300); //mi
Console.Beep(733, 600); //fa#
}
static void frase001()
{
Console.Beep(1046, 300);//do
Console.Beep(987, 300);//si
Console.Beep(880, 300);//la
Console.Beep(783, 300);//sol
Console.Beep(1174, 900);//re2
Console.Beep(880, 300);//la
Console.Beep(880, 600);//la
}
static void frase002()
{
Console.Beep(1174, 400); //re2
Console.Beep(1174, 200); //re2
Console.Beep(1567, 400); //sol2
Console.Beep(1396, 200); //sol2
Console.Beep(1244, 400); //mib
Console.Beep(1174, 200); //re
Console.Beep(1046, 400); //do
Console.Beep(923, 200); //sib
Console.Beep(880, 400); //la
Console.Beep(783, 200); //sol
Console.Beep(1174, 600);//re2
for (int x = 0; x < 3; x++)
{
Console.Beep(880, 200); //la
}
Console.Beep(880, 600); //la
}
Luego tendremos que asociar éstos métodos en el método principal que es partII_starwars(); solo haremos una llamada a cada método y éstos iran ejecutando sus partes!
static void partII_starwars()
{
reremimi();frase000();
reremimi();frase001();
reremimi();frase000();
frase002();
}
La parte final
Ahora solo nos queda el método final(); es tan simple y está formado por 2 bucles y 2 largas notas
static void final()
{
for (int x = 0; x < 3; x++)
{
Console.Beep(1174, 200); //re2
}
Console.Beep(1567, 1800); //sol2
for (int x = 0; x < 3; x++)
{
Console.Beep(783, 200); //re2
}
Console.Beep(783, 1800); //sol
}
Los bucles ejecutan los tresillos y las largas notas son las Blancas (equivalen a 2 negras) pero son blancas con puntillo (el puntillo equivale a la mitad de su propia duración) eso quiere decir que equivale a 1800 milésimas de segundo (1200 = blanca, 600 = mitad de blanca => 1200+600 = 1800).
Ahora solo nos queda armar el Main(), el cual se encargará de ejecutar la primera, segunda parte y la parte final, su código es:
static void Main()
{
//repetimos la primera parte 2 veces
//asi esta en la partitura
for (int x = 0; x < 2; x++) {partI_starwars();}
//ejecutamos la segunda parte 1 sola vez
partII_starwars();
//nuevamente la primera parte vuelve a ejecutarse
//2 veces
for (int x = 0; x < 2; x++) { partI_starwars(); }
//ejecutamos el final de la melodia
final();
}
El código de ésta melodía la encuentras aquí > starwars beep.cs, si quieres escuchar la melodía (sin necesidad de compilar el código) puedes descargarte el binario (libre de virus) starwars_beep.exe; para ejecutar necesitas el framework.net
¿Encontraste algún fallo? Puedes escribirme a gerber@ignoranto.info






[...] « StarWars Console.Beep() Windows Live Messenger 10 años! » [...]
FAbuloso
¿Conoces sitios donde pueda descargar este tipo de melodias para aplicaiones de consola?
¡¡Interesante articulo!!
La funcion Beep tiene los mismos parametros de la funcion Tone de Clipper, a ver trata de traducir estas notas:
http://www.youtube.com/watch?v=1wQMHsqxo_s
Cuando tenga tiempo, subire mas ejemplos en el canal de youtube.
Saludos.
brillante…podrias hacer un teclado musica con ese codigo, luego crear xml con las secuencias y luego y luego y luego implementarlo en otros programas
Hice una aplicacion musical pero en consola con c#, en cuanto tenga tiempo publico el source, por cierto no pensé en exportar xml con las notas musicales! buena idea SANU!