Hola gente del mundo. Muchos hemos curioseado o visto, aunque otros no, la posibilidad que tiene la máquina de emitir sonidos sin necesidad de parlantes (estereos), ya que posee un beep interno, el típico que oimos cuando inicia sobre todo las PC antiguas. En las PC modernas se suele silenciar, pero la opción es configurable desde el BIOS para que lo siga haciendo.

En fin, éste tutorial no habla de ello, lo que les traigo hoy es como poder aprovechar ese «beep» para crear tu propia música, utilizandolo como una suerte de piano o sonidos con diferentes notas y tonalidades en C++. Así inclusive vas a poder crear tu beep tone de navidad.

Lo primero que voy a hacer entonces es mantener la aplicación abierta indeterminadamente, para poder ejecutar todas las notas que quiera sin que se cierre.

int main(int argcchar *argv[]) {

    bool game_over = false;

    while(!game_over)
    {
        
    }
        
    return 0;
}

Lo segundo que voy a hacer es fijarme si se presionó una tecla, para ello haciéndolo con kbhit. Si es afirmativo, vamos a proceder a llamar a una funcion que vamos a crear, llamada tocar_nota, en la cual vamos a ejecutar la nota segun la tecla presionada.

 

    while(!game_over)
    {
        if(kbhit()) tocar_nota();   
    }

Ahora en la funcion tocar_nota, vamos a determinar con un switch cual nota se tocó, y segun el caso reproducir entonces el sonido. Para eso tenemos que saber cual es la tecla presionada, y ésta es devuelta en código ASCII. Podes buscar la tabla de códigos ASCII en Google, sin embargo te facilito el teclado numérico para que te ahorres un paso, así como las teclas ESCAPE (al principio) y ENTER (al final):

 

void tocar_nota()
{
    
    switch(getch()) //Obtener codigo tecla presionada
    {
        
    case 27: //Escape
        break;
        
        
    case 49: //1
        break;
        
    case 50: //2
 
        break;
        
    case 51: //3
 
        break;
        
    case 52: //4
 
        break;
        
    case 53: //5
 
        break;
    
    case 54: //6
 
        break;
        
    case 55: //7
 
        break;
        
    case 56: //8
 
        break;
        
    case 57: //2
 
        break;
    
    case 48: //2
 
        break;
        
    case \r:
 
        break;
        
    }
}

Luego a cada caso le tenemos que asignar que sonido beep va a emitir. Hay que entender que «vulgarmente dicho» para configurar la tonalidad, debemos especificarle cuanta «carga eléctrica» va a enviar, ya que se basa en la electricidad para emitir los diferentes sonidos. Así que como primer parámetro nuestra funcion Beep recibirá una suerte de «voltaje» o frecuencia, y como segundo el tiempo o velocidad.

void tocar_nota()
{
    
    switch(getch()) //Obtener codigo tecla presionada
    {
        
    case 27: //Escape
        exit(1);
        
        
    case 49: //1
        Beep(80,200);
        break;
        
    case 50: //2
        Beep(100,200);
        break;
        
    case 51: //3
        Beep(110,200);
        break;
        
    case 52: //4
        Beep(120,200);
        break;
        
    case 53: //5
        Beep(150,200);
        break;
    
    case 54: //6
        Beep(170,200);
        break;
        
    case 55: //7
        Beep(190,200);
        break;
        
    case 56: //8
        Beep(210,200);
        break;
        
    case 57: //2
        Beep(230,200);
        break;
    
    case 48: //2
        Beep(250,200);
        break;
        
    case \r:
        break;
        
    }
}

Con ésto tenemos nuestro piano. Ahora te voy a mostrar como podemos crear una función «cancion», donde vamos a poner una canción ya hecha segun sonidos que fui sacando (y utilicé para mi Arkanoid). Lo que tenemos que hacer es reproducir los sonidos con beep, pero como habrá una pausa entre cada sonido, la haremos con usleep.

void cancion_1()
{
    
    usleep(100); //Nuestro «FPS» 
    Beep(100,200);
    usleep(150000); //Nuestro «FPS» 
    Beep(100,200);
    usleep(10000); //Nuestro «FPS» 
    Beep(190,600);
    usleep(500000); //Nuestro «FPS» 
    Beep(150,200);
    usleep(100); //Nuestro «FPS» 
    Beep(170,200);
    usleep(100); //Nuestro «FPS»
    Beep(210,250);
    usleep(1500);
    Beep(190,700);
    usleep(600000); //Nuestro «FPS» 
    
    
    
    usleep(100); //Nuestro «FPS» 
    Beep(120,150);
    usleep(100); //Nuestro «FPS» 
    Beep(100,200);
    usleep(100); //Nuestro «FPS» 
    Beep(110,200);
    usleep(100); //Nuestro «FPS» 
    Beep(120,200);
    usleep(100); //Nuestro «FPS» 
    Beep(100,150);
    usleep(100); //Nuestro «FPS» 
    Beep(110,200);
    
    usleep(160000);
    Beep(100,200);
    usleep(300000); //Nuestro «FPS» 
    Beep(100,200);
    usleep(10000); //Nuestro «FPS» 
    Beep(190,700);
    usleep(500000); //Nuestro «FPS»
    
    Beep(210,100);
    usleep(50); //Nuestro «FPS» 
    Beep(190,100);
    usleep(50); //Nuestro «FPS» 
    Beep(170,100);
    usleep(50); //Nuestro «FPS» 
    Beep(210,100);
    usleep(100); //Nuestro «FPS» 
    Beep(190,700);
    
}

 

Si queres, podes hacer que en nuestro ejemplo, al presionar ENTER se reproduzca dicha canción. Tambien podes incluirla al principio de tu juego o donde quieras. Acá va el ejemplo completo del código con piano y canción:

#include <iostream>
#include <conio2.h>
#include <cstdlib>
#include <unistd.h>
#include <fstream>
#include <windows.h>
using namespace std;

void cancion_1()
{
    
    usleep(100); //Nuestro «FPS» 
    Beep(100,200);
    usleep(150000); //Nuestro «FPS» 
    Beep(100,200);
    usleep(10000); //Nuestro «FPS» 
    Beep(190,600);
    usleep(500000); //Nuestro «FPS» 
    Beep(150,200);
    usleep(100); //Nuestro «FPS» 
    Beep(170,200);
    usleep(100); //Nuestro «FPS»
    Beep(210,250);
    usleep(1500);
    Beep(190,700);
    usleep(600000); //Nuestro «FPS» 
    
    
    
    usleep(100); //Nuestro «FPS» 
    Beep(120,150);
    usleep(100); //Nuestro «FPS» 
    Beep(100,200);
    usleep(100); //Nuestro «FPS» 
    Beep(110,200);
    usleep(100); //Nuestro «FPS» 
    Beep(120,200);
    usleep(100); //Nuestro «FPS» 
    Beep(100,150);
    usleep(100); //Nuestro «FPS» 
    Beep(110,200);
    
    usleep(160000);
    Beep(100,200);
    usleep(300000); //Nuestro «FPS» 
    Beep(100,200);
    usleep(10000); //Nuestro «FPS» 
    Beep(190,700);
    usleep(500000); //Nuestro «FPS»
    
    Beep(210,100);
    usleep(50); //Nuestro «FPS» 
    Beep(190,100);
    usleep(50); //Nuestro «FPS» 
    Beep(170,100);
    usleep(50); //Nuestro «FPS» 
    Beep(210,100);
    usleep(100); //Nuestro «FPS» 
    Beep(190,700);
    
}

void tocar_nota()
{
    
    switch(getch()) //Obtener codigo tecla presionada
    {
        
    case 27: //Escape
        exit(1);
        
        
    case 49: //1
        Beep(80,200);
        break;
        
    case 50: //2
        Beep(100,200);
        break;
        
    case 51: //3
        Beep(110,200);
        break;
        
    case 52: //4
        Beep(120,200);
        break;
        
    case 53: //5
        Beep(150,200);
        break;
    
    case 54: //6
        Beep(170,200);
        break;
        
    case 55: //7
        Beep(190,200);
        break;
        
    case 56: //8
        Beep(210,200);
        break;
        
    case 57: //2
        Beep(230,200);
        break;
    
    case 48: //2
        Beep(250,200);
        break;
        
    case \r:
    cancion_1();
        break;
        
    }
}



int main(int argcchar *argv[]) {

    bool game_over = false;

    while(!game_over)
    {
        if(kbhit()) tocar_nota();   
    }
        
    return 0;
}


Espero les haya gustado y que estén disfrutando todas las sorpresas y eventos de éstas magníficas fiestas, que ya nunca terminaran. Ho ho hoooo

Compartir

Dejar un comentario