Spielereien mit dem PC-Speaker



  • Hallo.

    Mein Ziel ist es, ein Programm zu schreiben, dass bestimmte Frequenzen (die der C-Pentatonik) mit einer bestimmten Dauer (viertel- , halbe note usw) via PC-Speaker wiedergibt. Welche Note und welche Dauer wiedergegeben wird wird dabei zufällig gewählt.

    Das Problem war zunächst, dass er beim Kompilieren die windows.h nicht fand ... nun hab ich mir die besorgt ... und bekomme natürlich durch die internen Verlinkungen darin weitere Fehlermeldungen. Nur ohne die Bibliothek funktioniert die Funktion "Beep()" nicht, also tut es ein einfaches weglassen nicht. Hat irgendjemand eine Idee, wie man dieses Problem beheben / umgehen kann? Kann man sich denn irgendwo die nötigen Bibliotheken besorgen? Bei Google habe ich dazu nichts Nützliches gefunden... Zumal ich mir auch gut vorstellen kann, dass in diesen Bibliotheken wieder auf weitere verlinkt wird, die ich nicht haben werde.

    Entwicklungsumgebung : Turbo C++ Version 3.0

    #include <stdio.h>
    #include <conio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <windows.h>
    
    int main ()
    {
    int zufall, dauer, wiederholungen, frequenz;
    float takt;
    int c = 262;
    int d = 294;
    int e = 330;
    //int f = 349;
    int g = 392;
    int a = 440;
    //int h = 494;
    int ganze = 2000;
    int halbe = 1000;
    int viertel = 500;
    int achtel = 250;
    int sechzehntel = 125;
    
    randomize();
    
    takt = 0;
    
    while (takt < 16)
    {
    
    zufall = random(6) + 1;
    if (zufall == 1)
    	frequenz = c;
    if (zufall == 2)
    	frequenz = d;
    if (zufall == 3)
    	frequenz = e;
    if (zufall == 4)
    	frequenz = g;
    if (zufall == 5)
    	frequenz = a;
    if (zufall == 6)
    	frequenz = 0;
    
    zufall = random(5) + 1;
    
    if (zufall == 1)
    	{
    	dauer = ganze;
    	takt = takt + 1;
    	}
    if (zufall == 2)
    	{
    	dauer = halbe;
    	takt = takt + 0.5;
    	}
    if (zufall == 3)
    	{
    	dauer = viertel;
    	takt = takt + 0.25;
    	}
    if (zufall == 4)
    	{
    	dauer = achtel;
    	takt = takt + 0.125;
    	}
    if (zufall == 5)
    	{
    	dauer = sechzehntel;
    	takt = takt + 0.0625;
    	}
    
    Beep(dauer,frequenz);
    
    }
    
    getch();
    return 0;
    }
    

    Fehlende Bibliotheken (Jedenfalls die, die bisher Angezeigt werden):
    EXCPT.H
    WINDEF.H
    WINBASE.H
    WINGDI.H
    WINUSER.H
    WINNLS.H
    WINCON.H
    WINVER.H
    WINREG.H
    WINNETWK.H
    CDERR.H
    DDE.H
    DDEML.H
    DLGS.H
    LZEXPAND.H
    MMSYSTEM.H
    NB30.H
    RPC.H
    SHELLAPI.H
    WINPERF.H
    WINSOCK.H
    WINCRYPT.H
    COMMDLG.H
    WINSPOOL.H
    OLE2.H

    p.s.: Falls sich Jemand über die ausgeklammerten Variablen oder die nicht genutzten Bibliotheken wundern sollte: Das Programm ist ja noch nicht fertig, das wird noch erweitert 😉 nur solange "Beep()" nicht funktioniert brauche ich da nicht groß weiterzumachen. Also ... wer weiß Rat? *g*



  • Insanctus schrieb:

    Entwicklungsumgebung : Turbo C++ Version 3.0

    ist das so'n alter dos-compiler?
    besorg dir was aktuelles, gibt's genug umsonst:
    http://www.thefreecountry.com/compilers/cpp.shtml
    http://www.christian-heffner.de/
    http://www.cs.virginia.edu/~lcc-win32/
    ...usw.
    🙂



  • Hm, also wenn ich das richtig sehe hat bisher weder "Bloodshet Dev C++" noch "Pelles C" noch "Quincy C" noch "Visual C++ Explorer" diese elende bibliothek. Werd mir morgen mal "Turbo C++ Explorer" besorgen und schauen, ob sie da dabei ist. Das mag man bei 300+ MB doch wohl erwarten -.- Jedenfalls half mir das bisher nicht wirklich weiter *g* Hätte ich mir mal Den aus der Schule mitgenommen. zwar auch nur ein alter Dos-Compiler, aber da funktioniert diese Bibliothek wenigstens.

    EDIT: Problem gelöst.
    1. Die DOS.H ist von Nöten, nicht die WINDOWS.H
    2. Die Funktion ist nicht Beep(), da das eine C++ Funktion ist.

    Der richtige Code sieht dann an dem Abschnitt wie folgt aus:

    sound(frequenz);
    delay(dauer);
    nosound();
    


  • also wenn mich nicht alles täuscht, dann brauchst du für die entsprechenden header und librarys das windows plattform sdk.
    und zu deinem code: der ist extremst hässlich. anstatt der ganzen if-anweisungen würde es zB durch einen switch-block um einiges eleganter aussehen.



  • Insanctus schrieb:

    EDIT: Problem gelöst.

    Ne, umgangen 😃

    Insanctus schrieb:

    [...]
    2. Die Funktion ist nicht Beep(), da das eine C++ Funktion ist.

    Verbreite bitte keinen Blödsinn. Beep() hat nix, garnix, niente mit C oder C++ zu tun. Es ist eine Funktion der Windows API ➡ Beep().

    greetz, Swordfish



  • Ich bitte um Verzeihung, das war mir nicht bewusst ^^ dann habe ich das falsch aufgenommen.
    Wie dem auch sei: ich stehe was das angeht vor einem weiteren Problemchen 😉
    Folgendes:
    Ich hab mir überlegt, da mir einige Melodien gefallen haben, dass ich mir diese erneut anhören möchte bzw von vornherein Melodien über eine .txt einlesbar machen will.

    Die Datei würde in ihrem Aufbau dann folgendermaßen aussehen:

    halbe
    c
    viertel
    d
    achtel
    a

    Meine Idee ist nun, per fgetc() so lange auszulesen, bis ein Zeilenumbruch erfolgt, und diesen Wert in eine Variable zu schreiben, welche dann immer mit sich selbst ergänzt wird. Sind 2 zeilen vorbei, wird der Ton ausgegeben und es geht weiter, bis EOF erreicht ist.

    Momentan siehts so aus:

    char repeatnote[2];
    char repeatdauer[3];
    char repeatc;
    
    repeatc = fgetc(fRepeat);
    
    if (wahldauer == 1000)
    {
     printf("\n\n Letzte Melodie:");
         while(repeatc != feof(fRepeat))
        {   
    	i = 0;
    	while (repeatc != '\n')
    	      {
    	      repeatdauer[i] = repeatc;
    	      repeatc = fgetc(fRepeat);
    	      i = i + 1;
    	      }
    	repeatc = fgetc(fRepeat);
    	i = 0;
    	while (repeatc != '\n')
    	      {
    	      repeatnote[i] = repeatc;
    	      repeatc = fgetc(fRepeat);
    	      i = i + 1;
    	      }
    	sound(repeatnote[]);  delay(repeatdauer[]);  nosound();
    	repeatc = fgetc(fRepeat);
        } 
    }
    

    Funktioniert jedoch nicht, ich vermute ich mache da etwas bei den Arrays falsch. Oder gehe ich grundsätzlich einen falschen Weg? Habt Nachsicht, was das angeht bin ich leider ziemlicher Anfänger was das angeht 😃

    Post Scribtum: Die jeweiligen Frequenzen und Notenlängen wurden natürlich vorab deklariert und werden mit dem entsprechenden Variablennamen in die repeat.txt geschrieben.


Anmelden zum Antworten