Audio/Sound erzeugen/programmieren ohne Aufnahme?



  • Hallo alle miteinander,
    Wie der Titel schon sagt, lautet meine Frage diesmal, wäre es (zumindest grundsätzlich) möglich, irgend wie Audio/Sound zu erzeugen/programmieren ohne vorher irgend welche Töne aufzunahmen?

    Nähre Erklärung meiner Frage:
    Man kann ja zB. einen Stuhl Fotografieren, das Bild als .jpg speichern und dann auf dem Monitor anzeigen lassen.
    Man kann jedoch auch ganz ohne Input von außen ein Bild erzeugen und auf dem Monitor anzeigen lassen.
    Neben der Nutzung eines Zeichenprogramms, gibt es dabei sogar die Möglichkeit im Programm selbst fest zu legen wie das Bild aussehen soll (die einfachste Form davon wäre eine ASCII-Zeichnung mit Ausgabe in der Konsole).

    Wäre letzteres auch irgend wie mit Tönen/Klang möglich?

    Mein wissen über Musik, begrenzt sich derzeit noch auf: mit einem Klavier können Töne erzeugt werden.
    Wenn es jedoch möglich wäre zB. der Soundkarte zu sagen erzeuge 50ms 1000Hz (oder Ton C oder irgend etwas anders)
    um auf diese weise Töne zu erzeugen, dann würde ich mich natürlich auch mal gründlich damit Auseinandersetzen: welcher Ton = wie viel Hz = wie lange = welche Kombination = welche Melodie OR welches Wissen halt sonst so für die Erzeugung einer Soundausgabe nötig wäre.

    Ich suche dabei jedoch kein fertiges Programm mit dem so etwas möglich wäre, sonder wenn, würde ich es gerne irgend wie Quellcode-Mässig lösen.

    Zusatzfrage: Also, falls so etwas grundsätzlich machbar wäre, in welche Richtung könnte ich mich dann Informieren? Welche Suchbegriffe wären dabei hilfreich?
    (Am liebsten wären mir Lösungen die auf C/C++ aufbauen, bzw. Bezug dazu haben.)



  • Kommt drauf an wie kompliziert du es haben willst. Von https://www.szynalski.com/tone-generator/ über einfachste APIs die die meisten Programmiersprachen mitbringen über Sound-Libraries wie FMOD bis hin zu Programmen die das für dich bereits machen bspw. FL Studio.

    MfG SideWinder



  • @SideWinder
    Viele Dank, genau das wollte ich hören 🙂 {grins}{happy}
    Dann werd ich mich mal dahingehend schlau machen (jetzt wo ich weiß daß es möglich ist, und die Suche somit keine Zeitverschwendung).



  • Ton an die Soundkarte zu schicken ist mit den richtigen Bibliotheken gar nicht so schwer. FMOD wurde ja schon erwähnt. Ich hatte vor Ewigkeiten mal Bass (https://www.un4seen.com/) verwendet. Am Ende geht es grundsätzlich darum das du eine Folge von Werten bereitstellst, die in eine Schwingung darstellen. Wikipedia hat da einfache Beispiele: https://de.wikipedia.org/wiki/Waveform

    Komplizierter wird es aber, wenn du damit Instrumente nachbauen willst. Auch wenn Noten auf feste Frequenzen basieren, ist so ziemlich jeder Ton eines Instruments eine Kombination verschiedener Frequenzen (siehe https://de.wikipedia.org/wiki/Oberton).



  • @axam sagte in Audio/Sound erzeugen/programmieren ohne Aufnahme?:

    Wenn es jedoch möglich wäre zB. der Soundkarte zu sagen erzeuge 50ms 1000Hz (oder Ton C oder irgend etwas anders)

    Du kannst den Sinus auch berechnen.
    Oder was immer du willst.



  • PC-Lautsprecher unter Linux:

    #include <fcntl.h>
    #include <linux/kd.h>
    #include <sys/ioctl.h>
    #include <unistd.h>
    
    
    int main()
    {
    int fd = open("/dev/tty1", O_RDONLY);
    int hertz=100;	//Tonhöhe
    
    for(int c=1; c<50; c++)
    	{
    	ioctl(fd,KIOCSOUND,1193046/(hertz*c));
    	usleep(100000);	//Dauer
    	}
    ioctl(fd,KIOCSOUND,0);
    }
    

    oder( müsste auch unter Windows laufen, wenn man get_ioperm() anpasst):

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/io.h>
    
    void get_ioperm()
    {
    if( ioperm(0x61, 1, 1) )
    	{
    	printf("error ioperm\n");
    	exit(0);
    	}
    if( ioperm(0x42,2 , 1) )
    	{
    	printf("error ioperm\n");
    	exit(0);
    	}
    }
    
    void speaker_on( int freq  )
    {
    
    int scale = 1193046 / freq ;
    
    outb( 0xb6  ,  0x43 );
    outb( scale & 0xff  ,  0x42 );
    outb( scale >> 8  ,  0x42 );
    outb( inb(0x61) | 3  ,  0x61 );
    
    }
    
    void speaker_out()
    {
    outb( inb(0x61) & ~3  ,  0x61 );
    }
    
    int main()
    {
    get_ioperm();
    int hertz=100;	//Tonhöhe
    
    for(int c=1; c<50; c++)
    	{
    	speaker_on( hertz * c);
    	usleep(100000);	//Dauer
    	}
    speaker_out();
    }
    


  • This post is deleted!


  • Hier: https://www.gaeckler.at/Software/software.htm gibt's nen Synthesizer im Quelltext. Der macht genau das.


Log in to reply