Offline-Synthesizer "Sompyler" generiert still Audiodateien aus Klang und Musik definiert als YAML/JSON

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
gotridofmyphone
User
Beiträge: 33
Registriert: Mittwoch 15. März 2017, 08:54

Mittwoch 17. Januar 2018, 08:41

Hallo,

(Bitte an die Moderation: Könntet ihr bitte den alten Thread Melosynth – ein ziemlich einfacher Synthesizer (116 Codezeilen) löschen oder die Themen vereinigen, aber mit dem Betreff des neueren? :) )

Es war schon immer ein Traum von mir, Musik und Klang aus Text zaubern zu können, wie überhaupt alles, was man mit dem Computer aus reinem Text rendern kann, die Aura von Zauber hat, mit dem Text als Zauberspruch. So gesehen ist das einfach archaischer, mystischer als diese in meinen Augen stupide Klickerei, vergleichsweise eine Bevormundung, Einhegung der Nutzer durch diejenigen, die diese Oberflächen entwickeln, Oberflächen, die die Tiefe verdecken, das echte Verständnis erschweren von dem, was man da tut. Stattdessen lernt der GUI-Bediener – auch ich bin einer, gezwungenermaßen, denn ich kann ja nicht alles selbst machen – wie eine Laborratte, die im Labyrinth auf der Suche nach dem Futterknopf ist. Der Profi-Texteditor, also emacs, vim und andere, oder umgekehrt, als universelles Interface, diese Arbeitsweise ist für mich alles andere als veraltet und überkommen, sondern gerade zeitlos. Vielleicht wird man eines Tages von den semantischen und akustischen Missverständnissen von Siri & Co. die Nase voll haben, auch von "ach so einfachen", aber letztlich nur unübersichtlichen und verdummenden Benutzeroberflächen irgendwelcher Handyapps. Computer sind zu programmieren, damit sie dem Menschen dienen, denn der Mensch ist nicht dazu da, den Computer zu bedienen. Oops, ich merke, ich rede mich gerade in revolutionäre Rage, aber hey, ich will nur sagen: Ich entwickle Sompyler als textbasiertes Tool, damit es genauso lang Bestand hat wie HTML und Konsorten. Der Pythoncode drumrum diene dabei nur als Referenzimplementierung, um zu beweisen, dass Musikinstrumente aus YAML-Text zum Klingen gebracht werden können.

Damit schwimme ich quasi gegen den Strom der Synthesizer und DAWs, die mit überladenen GUIs zu beeindrucken versuchen. Für mich ist das nichts. Damit habe ich nur immer gelangweilt rumgespielt, aber Ambitionen Musik zu machen sind damit keine erwacht. Mir ist aber auch klar, dass der Ansatz der textuellen Definition nur eine kleine nerdige Zielgruppe gewinnen dürfte in der Szene der elektronischen Musik (im weiteren Sinne, nicht nur Techno), denn es ist auch abseits musikalischen Denkens recht anspruchsvoll so zu arbeiten.

Sompyler unterscheidet sich von anderen Audioprogrammiersprachen dadurch, dass es mit blanken hierarchischen Datenstrukturen gefüttert wird. Ist also eine rein deklarative Sache. Diese Datenstrukturen werden im YAML-Format erwartet, oder JSON, das ja von ersterem nur eine Teilmenge ist.

Zur Zeit arbeite ich besonders am Klavierton. Bin zwar weder in der Lage noch ambitioniert, Klavierbauern ernsthafte Konkurrenz zu machen. Der Klang meines billigen Stage-Pianos, das ich mein eigen nenne, genügt mir "nur", aber seit ich bei meinem Klavierlehrer die Bodenständigkeit und den Klangreichtum eines echten Flügels kennenlernen darf, hab ich höhere Ansprüche. Sompyler hat die Fähigkeit, virtuelle Klänge kontinuierlich bézierkurvenförmig in beliebiger Auflösung, und natürlich teiltonweise unabhängig zu produzieren, ebenso unabhängig ist jeder Teilton darüber hinaus modulierbar. Zudem können die Klangeigenschaften notenspezifisch variiert werden, wie bei einem echten Klavier jede Taste ihren eigenen Klangcharakter hat.

Musikalisch wird jeder Takt in einem eigenen YAML-Dokument definiert, wobei mehrere aneinander gehangen werden (YAML-Streams). Unendlich viele Stimmen sind möglich. Das gleiche Instrument kann mehrere Stimmen umsetzen. Jede Stimme kann eine eigene Dynamik und einen eigenen Dynamikumfang besitzen, und natürlich frei auf der virtuellen Bühne positioniert werden, woraus sich die Stereoposition ergibt (Surround wird derzeit noch nicht unterstützt). Der Rhythmus wird als Offset und Notenlängen über Ganzzahlen in der Einheit "Tick" angegeben. Wie lang ein Tick ist, kann taktweise statisch festgelegt werden, oder als von-bis-Kontinuum. So ändert sich das Tempo langsam, ohne dass an den Tickwerten herumgeschraubt werden muss. Ähnliches gilt für die Dynamik. Stimmen können lauter und leiser werden.

So habe ich die Hoffnung, dass man mit Sompyler auf einem stinknormalen PC Musik machen kann, die klingt als käme sie aus einem Studio mit Geräten, die in der Summe mehr kosten als S(olo-)U(mweltschänder-)V(ehikel). Gut, natürlich haben andere Projekte den gleichen Anspruch, das ist ja überhaupt der typische Anspruch aller Software-DAWs. Das Rad neu zu erfinden hat für mich nunmal schon immer Spaß bedeutet.

Sompyler ist unter der GPL auf Github publiziert: https://github.com/flowdy/sompyler/

Eine typische Befehlszeile sieht so aus:

Code: Alles auswählen

scripts/sompyle test_examples/loreley.spls /tmp/loreley.flac
Voraussetzungen: Python 3, numpy, soundfile. (scripts/render-single-sound benötigt zusätzlich matplotlib).

Es wird keine spezielle Soundhardware benötigt, allerdings sollte eine gute Soundkarte/Lautsprecher vorhanden sein, damit niemand sage, die Ergebnisse klingen schlecht und dann liegt es an schlechten Voraussetzungen.

Wer Cython installiert, kann Sompyler mit dem folgenden einmalig auszuführenden Befehl aufs ca. 2,5-fache beschleunigen. Sompyler ist aber nicht darauf angewiesen.

Code: Alles auswählen

python3 Sompyler/synthesizer/shape/cythonize-bezier-gradient.py build_ext --inplace
Resonanz, natürlich auch kritische und konstruktive, erwünscht und dankend angenommen. Mitarbeit? Sehr gerne :)
gotridofmyphone
User
Beiträge: 33
Registriert: Mittwoch 15. März 2017, 08:54

Samstag 1. Juni 2019, 15:13

Nach dem Microsoft-Deal habe ich meinen Code auf Gitlab umgezogen.

Wo ich schon mal hier bin, wollte ich etwas Musik hier einstellen, die ich mit dem Sompyler gemacht habe. Da ich ein Fan klassischer Musik bin ...
  • Beethovens »Mondscheinsonate«
    Die Noten habe ich übrigens aus originaler Klavierliteratur händisch übertragen. Habe garantiert den einen oder anderen Fehler gemacht, denn das Stück ist 13:22 Minuten lang und umfasst 8891 Noten, die mit 3810 Samples umgesetzt werden. Ein Sample wird ggf. für mehrere gleiche Noten wiederverwendet. Eine Note unterscheidet sich von der anderen ja nicht nur durch ihre Tonhöhe, sondern ja auch durch ihre Länge und ihre Intensität. Letztere geht meist nicht explizit aus der Literatur hervor, sondern ergibt sich aus dem dynamischen Taktlevel und der Position im Takt. Deshalb sind es so viele. Und selbst wenn der Code auf einem Vierkerner lief, und das Berechnen von Hüllkurven mit Cython entsprechend schnell geht, brauchte er für das Stück 12 Minuten.
  • Das Spiel mehrerer Instrumente wird auch unterstützt. Mit dem Klang eines echten Orchesters nicht wirklich vergleichbar, aber mir gefällt es schon mal ganz gut: »Lascia ch'io pianga« aus Georg Friedrich Händels Oper »Rinaldo«.
Dafür, dass der Code keine MIDI-Abhängigkeiten hat und auch keine Samples von außen laden muss, sondern die Musik komplett selbst berechnet mithilfe der primitiven Operationen sin(), Addition und Multiplikation, Potenz und Division, die jedes Kind lernt, kann ich schon sagen, dass sich die Mühe gelohnt hat. Da kann noch wer sagen, dass doch nix über richtige Instrumente geht, das stimmt, aber sich Themen am und mit dem Computer zu erarbeiten, idealerweise ohne einen Funken künstlicher Intelligenz, dafür mit etwas natürlicher Intelligenz und Beschäftigung mit der Materie, das hat eine eigene Qualität. Auch das ist »Musik machen«, aber hätte eigentlich eine eigene Bezeichnung verdient: »Mathematextmusik« würd ich sagen.
Antworten