Wie macht ein Computernerd Musik?

Der musikinteressierte Nerd spielt entweder ein richtiges Instrument, oder er benutzt Tonstudio-Utensilien aus Materie, »Hardware«, Digital Audio Workstations und sogar Apps – aber ist er dann noch ein “Nerd”?

Oder er macht sich etwas ganz eigenes, so wie ich Sompyler, der ganz ohne Abhängigkeiten zu Fremdprogrammen und -bibliotheken speziell für Musiker und Musikaffine auskommt. Auf diesem Wege lerne ich durch Programmieren, Experimentieren, Komponieren und Literaturstudium – nebst Besuchen echter Konzerte und konventionellem Instrumentalunterricht – viel über Musik. Es ist eine große Befriedigung, mit selbst geschriebenen Programmen Dinge zu erschaffen. So ernerd man sich heute intellektuell. Wenn sonst nichts, ist es auf jeden Fall das, was ich mit »echten« Musikern gemein habe: Der Spaß am Selbermachen, nicht nur zu konsumieren.

Beispiele

Das Anfängerstück 2 befindet sich wie einige andere Stücken aus der Public Domain oder meiner Hand in meinem Gitlab-Repository “text-music”. Der grundsätzliche Workflow sieht aus wie folgt:

$ $EDITOR $SOMPYLER/lib/instruments/dev/piano.spli
  # ... und/oder andere Instrumente erstellen, dann ...
$ $EDITOR $SOMPYLER/scores/anfaengerstueck_2.spls
  # Ich empfehle einen Editor, der Syntax-Highlighting für YAML-Dateien
  # anbietet. Nachdem die Datei erstellt ist:
$ sompyle anfaengerstueck_2
Synthesizing tones ... [⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛⬛] 159 of 159 (ETA 0s)
Assembling all samples to one ...
0 unused notes remain untouched in cache
-- PLEASE NOTE: ---------------------------------------------
Do you want to reuse samples in subsequent runs to save time?
Just do not pass *.spls path as argument, but the cache directory instead:
       /tmp/sompyler_cached-notes-82c4gjob
       The directory contains "./score", a symbolic link to the initially used score.
       You may want to change the score, be welcome. You can add other derived scores
       with different names, which of course need to be appended to the directory on
       the command line. The same notes and note registry will then be used.
       Tones for new notes will be rendered and cached as they occur. Tones  
       no longer used have been added to the unused-tones.files list, so you
       them if you need to free some disk space:
         for i in unused-tones.files; do rm $i; done
        
LAME 3.99.5 64bits (http://lame.sf.net)
Using polyphase lowpass filter, transition band: 16538 Hz - 17071 Hz
Encoding /tmp/anfaengerstueck_2.wav to /tmp/anfaengerstueck_2.mp3
Encoding as 44.1 kHz j-stereo MPEG-1 Layer III (11x) 128 kbps qval=3
   Frame          |  CPU time/estim | REAL time/estim | play/CPU |    ETA  
 2725/2725  (100%)|    0:01/    0:01|    0:01/    0:01|   39.222x|    0:00  
-----------------------------------------------------------------------------
  kbps        MS  %     long switch short %
 128.0      100.0        99.9   0.0   0.0
Writing LAME Tag...done
ReplayGain: -3.5dB

Und hier die Datei, die das Programm erstellt hat:

Statt Eigenkompositionen kann man natürlich auch andere Stücke auf diese Art vertonen – immer vorausgesetzt, man hat das rechtliche geklärt bzw. vom Urheber die Erlaubnis dazu erhalten. Unproblematisch ist das bei Urhebern, die schon länger als 70 Jahre tot sind. Zum Beispiel habe ich auch das Rondo alla turca von Wolfgang Amadeus Mozart von Noten, die ich in der International Music Score Library Project / Petrucci Music Library (IMSLP) fand, einer freien Musikbibliothek im Netz, händisch übersetzt in eine YAML-Datei und diese an Sompyler verfüttert. Heraus kam folgendes:

 

Ist das denn aber Musik?

Musiker mögen die mit Sompyler erstellte Musik nicht für vollwertige Musik erachten, und sie haben durchaus recht, wenn sie etwa sagen, Tofu aus der Konservendose sei schließlich auch kein richtiges Fleisch. Den Vergleich mit Fleisch mag ich nicht, denn Musik ist gesünder.

Schließlich halte ich im Gegenzug, in der Tat aber natürlich unabhängig davon, die Bedienung von “benutzerfreundlichen” Computerprogrammen nicht für vollwertige Computerbenutzung. Sondern für unreflektierte, willfährige Selbstassimilierung an das hyperdeterministische Weltbild von Nerds, ihrerseits unterm Joch der Großkonzerne, in dem Menschen nur noch Daten- (und indirekt Geld-) Lieferanten sind. Würde man Computer üblicher programmieren als »bedienen«, müsste man sich nicht als Opfer von scheinbarer Magie begreifen – und würde vielleicht auch Sompyler-Musik als das nehmen, was sie objektiv ist: als geordnete Folge und Zusammenwirkung von Klangereignissen zur Unterhaltung und Affektkommunikation mit einem Publikum, in der Hinsicht genau wie andere Musik, ganz gleich. Wenn auch die Sompyler-Musik nicht unmittelbar handgemacht ist, sondern anhand vorab handgemachter Textdefinitionen erstellt wurde, kann man sich darauf einlassen.

Noch schwieriger wird die Frage, wenn irgendeiner auf die Idee kommt, die Rohdaten für den Sompyler, mit einem neuronalen Netz zu fabrizieren. Ist das dann noch Musik, auf die ich selber mich einlassen würde? Keine Ahnung. Nur weiß ich, dass so zu arbeiten mir keinen Spaß machen würde. Die Textdefinitionen sind von einer Vorlage handgetippt. Die Vorlage gibt es in Form von ausakkordierten allgemeinen konventionellen Notation, von Melodienoten mit Begleithinweisen (Akkordsymbolen), teilweise habe ich sogar selbst diese Noten gemacht, also komponiert.

Trotzdem: Herz- und handgemachte Musik ist noch mal ein anderes Kaliber!

Paradox, aber das finde ich auch. Die Arbeit an und mit Sompyler ergänzt konventionellem Klavierunterricht, den ich seit Oktober 2017 nehme. Genaugenommen verhält es sich umgekehrt: Ich merkte bald, was mir beim Sompyler immer fehlen wird, nämlich den “Körperkontakt” mit der Musik, ich sie mit dem nüchternen Eintippen von Daten eben doch nicht fühlen kann, was zunächst eine Enttäuschung für mich war. Deshalb lasse ich mich unterrichten. Das war mir schon das halbe Leben vorgeschwebt, und aber jetzt, da im Zuge der Weltpolitik es unwahrscheinlich macht, dass ich im Alter dazu Gelegenheit habe, gab ich mir einen Ruck, meiner benachteiligten rechten Hand zum Trotz, und ich habe großen Spaß daran, lerne schnell. Dadurch, dass ich zweigleisig fahre, sollten sich in puncto Lernen Synergieeffekte ergeben.

Ambitionen, Konzertpianist zu werden, wären indes illusorisch aufgrund meines Alters und weil ich bisher praktisch nur sehr wenig Berührungspunkte mit Musik hatte (meine Schuld, mochte ich eben nur mäßig gern hören, was andere sich angeeignet haben, was ich mir nicht zutraute). Wenn es je ein Talent zum Musizieren in mir gab, bleibt mir heute nur noch ein Rest vor dem Verkümmern zu bewahren, aber so ist das Leben.

Kleiner netter Nebeneffekt: Ich lerne, wie ein echter, mechanischer Flügel klingt und es ist ein Faszinosum ganz eigener Art, zwanzig Tonnen Saitenzugkraft unter eigener Kontrolle zu haben.

Warum ist der Sompyler so …erfrischend »uneinfach«?

Jede Software wirbt mit »Einfachheit«, »Benutzerfreundlichkeit« und vergleichbaren Buzzwords. Mich stößt solche Werbung eher ab. »Funktionale« Software ist mir lieber. Und das, obwohl ich mich schon selbst habe fluchen hören über allzu eigenwillige Bedienkonzepte. Davor ist kein Programm gefeit. Insbesondere ist es nur Millionenbudgets für die konzerneigene Forschungs- und Marketingabteilung zu verdanken, wenn ein Programm mal (unter mehr oder weniger Fluchen) vom Gros der Zielgruppe angenommen wird. Oder sie es durch von höherer Ebene aufoktroyiert bekommt.

Ich arbeite mich nicht sehr gern in neue Benutzeroberflächen ein, die bekanntlich gerne bestimmte Funktionen verstecken oder zumindest umständlich erreichbar machen. Sie müssen das tun, weil neue Anwender nicht mit »komplizierten« Oberflächen in die Flucht geschlagen werden sollen. Allgemein fühle ich mich gegängelt durch graphische Benutzeroberflächen.

Lieber nutze ich universelle “Interfaces”, vorzugsweise die Shell und leistungsfähige Texteditoren, deren Bedienung sich lohnt wirklich umfassend zu begreifen. Auch wenn ich keine kompilierten Sprachen wie C/C++ schreibe, mag ich den Workflow, der vor der Erfindung des Integrated Desktop Environments (IDE) üblich war: Quellcode schreiben, kompilieren, linken, ausführen, debuggen; später, wenn das Programm gereift ist, ggf. einmalig kompilieren und dann nur noch starten müssen. Fast ein bisschen schade, dass Programmiersprachen, die ich gelernt und liebgewonnen habe, alle interpretiert sind, sprich, die Kompilierung und die Verknüpfung entfällt. Allerdings hat das andere unstreitige Vorteile, nun, ich möchte nicht abschweifen …

Wie ein Compiler hat Sompyler keine Benutzeroberfläche im gewohnten Sinne. Es ist im Prinzip eines dieser »kryptischen«, auf den ersten Blick undurchschaubaren Kommandozeilentools, wie sie typisch sind für unixoide Betriebssysteme. Der Sompyler liest angegebene Eingabedaten aus Textdateien, die der Anwender vorab erstellt hat. Eine eigene Syntax muss er dazu nicht unbedingt lernen, das Programm erwartet YAML, ein auf Lesbarkeit für Menschen optimiertes Serialisierungsformat für hierarchische Datenstrukturen.

Hierbei sind drei Typen von Dateien zu unterscheiden:

  1. Instrumentendefinitionsdateien (*.spli, vor allem in lib/instruments) spezifizieren, wie eine Stimme klingen soll, und zwar nach Belieben des Konstrukteurs abhängig von Eigenschaften einer Note wie Dauer, Tonhöhe und Intensität.
  2. Tondefinitionsliste (*.splt, meist lib/tones_de+en_euro.splt, die implizit angenommen wird): Frequenz des Referenztons und seine Position auf der Klaviatur, wie viele Stufen es pro Oktave gibt, die Intervalle zwischen den Tönen, sowie den oder die Namen für jeden Ton.
  3. Score-Dateien (*.spls, vor allem in scores/ und Unterverzeichnissen): Definieren die Stimmen, also die für sie geltende *.spli-Datei und ihre Position auf der Stereobühne; danach in einzelnen Dokumenten des YAML-Streams werden jeweils die Takte definiert, und zwar
    • Direktiven wie das Tempo, die für alle Stimmen und alle Noten im Takt gelten, darüberhinaus für alle weitere Takte, soweit jene diese Direktiven nicht überschreiben (implizite Übernahme),
    • einige Direktiven können auch auf einzelne Stimmen beschränkt werden, zum Beispiel das Betonungsmuster stress_pattern.
    • für jede im Takt vertretene Stimme die zu spielenden Noten, gruppiert nach ihrer Position im Takt. So stehen die Noten eines Akkords immer zusammen.

Sompyler ist in Python 3 implementiert und benötigt als Abhängigkeiten nur eine Handvoll universeller Python-Bibliotheken (numpy, soundfile, yaml, optional matplotlib und cython). Die Software untersteht der General Public License, Version 3. Das Repository steht auf Gitlab. Lade den Code gerne herunter oder forke ihn.