Linux Synthesizer



  • Ich würde gerne mal zurÜbung einen einfachen Synthesizer unter Linux programmieren.

    Leider finde ich keine guten Quellen dazu und bestehende Software (bristol, timidy, ...) finde ich für den einstieg zu schwer.

    Kann mir jemand ein paar Tipps geben, was ich alles lernen sollte?

    Mein Ziel:

    2 einfache Oszillatoren mit Soundausgabe, standard Wellenformen (sinus, säge, ..)

    Das ganze muss nicht unbedingt gleich jack nutzen, wenn es eine einfachere alternative gibt.

    Hauptsache ich krieg mal ein paar Töne hin



  • minimoog schrieb:

    Kann mir jemand ein paar Tipps geben, was ich alles lernen sollte?

    Es kommt ein bisschen darauf an wie dein Vorwissen aussieht und wie viel Theorie du dahinter wissen möchtest. PCM ist das Grundprinzip dahinter wie aus einer Folge von Werten am Ende wieder ein Ton entsteht (und umgekehrt). Letztendlich braucht man davon aber auch nur das Verständnis was die Abtastrate bedeutet. Ansonsten musst du mathematisch halt soweit sein das du die Wellenformen in dem passenden Definitions- und Wertebereich berechnen kannst.

    Ansonsten würde ich dir empfehlen irgendeine Lib für Audio zu verwenden. Alsa und konsorten sind viel zu kompliziert, wenn man eigentlich nur ein paar Samples an die Soundkarte schicken möchte. Mit SFML gibts ein Tutorial das genau das in wenigen Zeilen tut: http://www.sfml-dev.org/tutorials/2.3/audio-streams.php


  • Mod

    Paul Hudak hatte ein Buch zu Haskell geschrieben wo es u.a. um die Grundlagen der Synthesizererstellung geht
    (The Haskell School of Music -> http://www.cs.yale.edu/homes/hudak/Papers/HSoM.pdf



  • Ich würde mit einfacher subtraktiver Synthese starten. a) weil einfach und b) weil eigentlich immer noch der Standard. Dazu brauchst du auch nicht viel:

    - Oszillator Sägezahn und Rechteck (mit optionaler PWM)
    - Ein Filter zweiter Ordnung mit Anpassung Cutoff-Frequenz und Güte (Resonanz)

    Filter höherer Ordnung kannst du dann durch Reihenschaltung der Filter 2. Ordnung hinbekommen (Standard dürfte 24dB/Oktave sein, also Filter 4. Ordnung). Einen Sinusoszillator brauchst du dann erstmal nicht, weil er bei subtraktiver Synthese keinen direkten Sinn ergibt.

    Als Filter würde ich genau sowas nehmen: http://www.earlevel.com/main/2003/03/02/the-digital-state-variable-filter/

    Denn damit hast du nicht nur den offensichtlichen Tiefpass, sondern die anderen Filter gleich mit am Start.

    Jack fand ich im übrigen recht easy. Aber wenn man nicht auf C steht, gibts auch andere, einfachere Sprachen. Fällt mir aber gerade nicht mehr der Name ein welches ich konkret meine...



  • Subtraktive Synthese kann man natürlich beliebig kompliziert machen. Es ist z.B. gar nicht so einfach, einen Alias-freien Sägezahn zu erzeugen. 😉

    Bzgl Audio-Schnittstelle, ich hatte mich mal mit PortAudio beschäftigt. Die Idee ist jedenfalls nett: PortAudio will eine "portable Schnittstelle" sein. Du programmierst gegen PortAudio und kannst im damit Prinzip alles mögliche benutzen (mindestens alsa, vielleicht auch jack, das gibt's sogar für windows). Allerdings fand ich die PortAudio API suboptimal und die dazugehörige Mailingliste reagierte nie auf meine Frage, wie man denn die Versionsnummer, die die Bibliothek über eine Funktion zurück liefert richtig zu behandeln hat. Das sagt dir die Doku auch nicht. Es gibt da auch leichte Inkonsistenzen zwischen Version "1.99" und "2.00" in den Struct-Definitionen.

    Dann gibt es noch LADSPA (linux audio developer's simple plugin architecture). Man kann einen simplen Synthesizer oder Filter als LADSPA plugin schreiben und diese dann von einem "Host"-Programm benutzen lassen. Für Klangquellen bzw virtuelle Instrumente ist LADSPA aber nicht wirklich ausgelegt. Da gibt es glaub'ich auch Weiterentwicklungen von, die dann besser für virtuelle Instrumente geeignet sein sollen. Da bin ich aber nicht auf dem aktuellen Stand. Ich hatte nur mal einen Kopfhörer-Filter gebastelt, der Stereo auf Stereo so mappt, dass sich das über den Kopfhörer so anhört, als wenn man in einem Raum steht und ein Stereoboxen-Paar anhat. Für sowas ist LADSPA auch brauchbar. Du kannst sogar LADSPA-Plugins in ALSA einbauen oder mplayer ein LADSPA-Filter benutzen lassen. Es gibt da auch schon viel Quellcode zu. Zum Beispiel LADSPA-Oszillatoren für Sägezahn und Rechteck, die sogar was tauen. 🙂

    Wenn Du Sägezahn und Rechteck selbst Alias-frei erzeugen willst, such mal nach BLEP (steht für "band-limited step").

    Viel Erfolg!



  • krümelkacker schrieb:

    Dann gibt es noch LADSPA (linux audio developer's simple plugin architecture). Man kann einen simplen Synthesizer oder Filter als LADSPA plugin schreiben und diese dann von einem "Host"-Programm benutzen lassen. Für Klangquellen bzw virtuelle Instrumente ist LADSPA aber nicht wirklich ausgelegt. Da gibt es glaub'ich auch Weiterentwicklungen von, die dann besser für virtuelle Instrumente geeignet sein sollen. Da bin ich aber nicht auf dem aktuellen Stand.

    https://lwn.net/Articles/502183/
    https://en.wikipedia.org/wiki/LV2
    http://dssi.sourceforge.net/
    https://soundcloud.com/adhesivewombat


Log in to reply