'compositeur' de morceaux (par fichier ou console) en 'script' avec la fonction beep()

Description

utilisation de la fonction Beep de <windows.h> pour jouer des petits morceaux (diatoniques pour l'instant)
le clavier correspond aux touches du piano: 'q' est un sol --> 'j': fa dièse, 'k': sol à l'octave
p: pause. Dans un morceaux, vous allez placer la lettre de la note et la durée (1 == 1 temps, c'est à dire 100 ms)

Vous pouvez taper votre morceau directement dans la console, ou dans le fichier "music.txt". 'd' va jouer une démo
Amusez-vous!!! (vous êtes libres d'enrichir le programme)

Source / Exemple :


//code réalisé par Alberto Bietti

#include <iostream>
#include <fstream>
#include <sstream>
#include <windows.h>

using namespace std;

//fréquences des notes
enum {SOL=200, LA=220, SI=250, DO=265, RE=300, MI=340, FA_DIESE=380, SOL2=400, PAUSE=0};

int tofreq(char ch)    //retourne la fréquence d'un note avec le caractère donné
{
     switch(ch)
     {
               case 'Q': case 'q': return SOL;
               case 'S': case 's': return LA;
               case 'D': case 'd': return SI;
               case 'F': case 'f': return DO;
               case 'G': case 'g': return RE;
               case 'H': case 'h': return MI;
               case 'J': case 'j': return FA_DIESE;
               case 'K': case 'k': return SOL2;
               case 'P': case 'p': return PAUSE;
               default: return 0;
     }                          
}

int tonb(char ch)
{
    switch(ch)
    {
              case '1': return 1;
              case '2': return 2;
              case '3': return 3;
              case '4': return 4;
              case '5': return 5;
              case '6': return 6;
              case '7': return 7;
              case '8': return 8;
              case '9': return 9;
              default: return 1;
    }
}
              

                                
int main()                      
{
    istream* stream;            //pointeur vers la input stream principale
    
    char res;
    cout <<"load from file ('a'), demo ('d') or input (else)? "; //choix de la source
    cin >> res;
    if (res == 'a') stream = new ifstream("music.txt");       //source: fichier 'music.txt'
    else if (res == 'd') stream = new istringstream(          //source: démo: frère Jacque!! :
                         "Q2S2D2Q2Q2S2D2Q2D2F2G4D2F2G4G1H1G1F1D2Q2G1H1G1F1D2Q2S2G2Q4S2G2Q4");
    else stream = &cin;  //source: entrée par l'utilisateur dans la console
    
    char ch;
    int freq;                      //fréquence
    int dur;                       //durée
    while (stream->get(ch))
    {
          freq = tofreq(ch);
          if (ch != '\n') {
             stream->get(ch);
             dur = tonb(ch);
          }
          else dur = 1;
          Beep(freq, 100*dur);     //faire un Beep
           
          
    }

    system("pause");
    return 0;
}

Conclusion :


Pour changer la source du script du morceau, j'ai utilisé un pointeur vers une input stream, qui pointera soit vers un cin classique, soit vers une ifstream (input file stream) soit vers une istringstream (la source étant une chaine de caractères)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.