Kann man mit C++ eine Tonleiter ausgeben?



  • Kann man mit C++ eine Tonleiter ausgeben?



  • Ja, das ist unter Einbindung einer Bibliothek, die Sounds ausgibt möglich. Halbtöne liegen jeweils um den Faktor 2 ^ 1/12 auseinander, unter Windows erfüllt dies folgender Soourcecode:

    #include <windows.h> //Beep(...) ab Win NT, es gibt auch ein Beep98
    #include <cmath> //pow
    #include <iostream> // cout, endl
    #include <conio.h> // getch
    
    int main()
    {
      for(int i=1; i<20; ++i)
      {  
        static double j = 440.0; //Kammerton a
        std::cout << j << " Hz" << std::endl; 
        j *= pow(2.0,1.0/12.0);      
        Beep(j,200);
      }
      getch();
    }
    

    Für eine Tonleiter musst Du eben je nach Dur oder Moll Halbtöne auslassen und die Basis-Frequenz auswählbar machen.

    Hiermit könnt ihr einen Hörtest machen:

    #include <windows.h>
    #include <cmath>
    #include <iostream>
    #include <conio.h>
    
    int main()
    {
      for(int i=0; i<=80; ++i)
      {  
        static double j = 1000.0;
        std::cout << j << " Hz" << std::endl; 
        Beep(j,500);
        //j *= pow(2.0,1.0/12.0);      
        j += 200;
      }
      getch();
    }
    


  • Hallo,

    /* beep.c - for Linux and DOS/Windows */
    
    #include <stdio.h>
    #include <stdlib.h>
    #ifdef __DJGPP__
    #include <dos.h>
    #include <pc.h>
    #endif
    #define ESC 27
    
    void beep (int frequency, int duration)
    {
    #ifdef __DJGPP__
      sound (frequency);
      delay (duration);
      nosound ();
    #else  /* Linux */
      FILE *tty;
      if ( NULL == (tty = fopen ("/dev/console", "w")) ) {
        fprintf (stderr, "Cannot write to /dev/console!\n" );
        exit (1);
      }
      fprintf(tty, "%c[10;%d]%c[11;%d]\a", ESC, frequency, ESC, duration);
    #endif
    }
    
    int main (int argc, char *argv[])
    {
      int frequency, duration;
      if (argc != 3) {
        fprintf (stderr, "Usage: beep <frequency> <duration>\n" );
        exit (1);
      }
      frequency = atoi (argv [1]);
      duration = atoi (argv [2]);
      beep (frequency, duration);
      return (0);
    }
    
    /* end of beep.c */
    

    MFG winexec*



  • Hallo,

    @Erhard Henkes:

    Man unterteilt Moll nochmal in 3 Arten 🙂

    MFG winexec*



  • Ja, das ist richtig:
    Reines Moll (Halbtonschritte zwischen der zweiten und dritten sowie der fünften und sechsten Stufe)
    Harmonisches Moll (Halbtonschritte zwischen der zweiten und dritten sowie der fünften und sechsten Stufe, siebte Stufe um Halbton erhöht (Leitton), dadurch 3-Halbtonsschritt)
    Melodisches Moll (aufsteigend im hinteren Teil wie Dur, absteigend wie reines Moll, dadurch Leitton aber kein 3-Halbtonsschritt)

    Darüber hinaus gibt es noch mehr ältere Tonarten. 😉



  • dorisch find ich toll..
    Aaalso der Kammerton a1 hat 440 Hz.
    Der Unterschied zwischen einem Ton und dem nächst höheren Halbtonschritt ist die zwölfte Wurzel aus zwei. Daraus ergibt sich übrigens, dass ein Oktavsprung von der Frequenz her immer genau das Doppelte ist.

    Soooviel zur Theorie.. Leider klingt das sehr mechanisch. Die Akkorde sind etwas schief.

    Ich würd mir die Frequenzen der 7 Oktaven in eine Liste oder Datei speichern und damit arbeiten.



  • Hallo,

    will nicht kleinlich sein, aber es gibt neben Dur, 3*moll und dorisch auch
    noch phrygisch, lydisch und mixolydisch.
    Darauf sollte kein PC-Beeper verzichten 🙂

    meint

    so'n Hobbyprogrammierer.


Anmelden zum Antworten