Volltext
Transcription
Volltext
Entropie als Parameter musikalischer Komposition Design und Programmierung einer Software mit dem Ziel Entropie als musikalischen Parameter nutzen zu können und Ermitteln der sich ergebenden Möglichkeiten anhand einer Beispiel-Komposition Dieter Kleinrath Betreuer: VProf. Clemens Gadenstätter September 2007 Inhaltsverzeichnis Einleitung 2 1.1 Einführung in die Informationstheorie 3 1.2 Kurze Einführung in die objektorientierte Programmierung 8 2. Wahl der Programmiersprache 11 3. Übersicht über den Funktionsumfang der Software 12 3.1 Die Klasse InformationSource 13 3.2 Die Klasse ProbDistrFactory 15 3.3 Die Klasse Math 22 3.4 Zusätzliche Funktionalität der Software 23 4. Probleme die sich aus dem vorgestellten Konzept ergeben 24 4.1 Was ist eigentlich Zufall? 24 4.2 Welcher kompositorische Freiraum bleibt übrig? 26 Literaturverzeichnis 29 Beispielkomposition 30 Zeichenerklärung 31 Skizzenmaterial der Beispielkomposition 33 1 Einleitung Bei der vorliegenden Arbeit handelt es sich um die Dokumentation und Präsentation einer von mir in der Programmiersprache Supercollider entwickelten Computer-Software. Die Motivation hinter diesem Projekt war es eine Software zu entwickeln, mit deren Hilfe man Entropie als musikalischen Parameter berechnen kann, um ihn auf Kompositionen und eventuell auch auf Analysen übertragen zu können. In den ersten beiden Kapiteln dieser Arbeit wird eine kurze Einführung in die Informationstheorie und die objektorientierte Programmierung gegeben. Für ein vollständiges Verständnis der verwendeten Formeln wird jedoch ein Grundwissen in Wahrscheinlichkeitstheorie vorausgesetzt. Bei Kenntnis der genannten Themen können die ersten beiden Kapitel dieser Arbeit übersprungen werden. Ich verzichte darauf in dieser Arbeit Quellenverweise anzugeben, da es sich nicht um eine wissenschaftliche Arbeit im eigentlichen Sinn handelt. Nur Originalzitate werden als solche gekennzeichnet. Dem Quellenverzeichnis kann man die für diese Arbeit relevante Literatur entnehmen. 2 1.1 Einführung in die Informationstheorie Der Begriff "Entropie" wie er im Zusammenhang mit dieser Arbeit verwendet wird geht auf Claude Elwood Shannon (1916-2001) zurück. 1948 veröffentlichte Shannon seine Arbeit A Mathematical Theory of Communication und begründete damit den neuen Wissenschaftszweig der Informationstheorie. Die Informationstheorie ist als mathematische Theorie ein Teilgebiet der Wahrscheinlichkeitstheorie und Statistik und beschäftigt sich mit Begriffen wie Information, Entropie, Informationsübertragung, Datenkompression und Kodierung. Die Begriffe Nachricht, Information und Signal spielen in der Informationstheorie eine wesentliche Rolle. Es ist schwierig eine allgemein gültige Definition dieser Begriffe zu finden, da sich unsere intuitive Vorstellung meist von der Verwendung dieser Begriffe in der Informationstheorie unterscheidet.1 Laut André Neubauer kann syntaktischen, betrachtet Information "hinsichtlich semantischen werden. Hierbei oder ihrer statistischen, pragmatischen kennzeichnet die Aspekte Statistik die wahrscheinlichkeitstheoretischen Eigenschaften von Information und Informationsquellen. Die Syntax beschreibt die Regeln zur Darstellung von Information, wie zum Beispiel die grammatikalischen Regeln einer formalen oder natürlichen Sprache. Die Semantik hingegen bezieht sich auf den Inhalt und die Bedeutung einer Information, während die Pragmatik den Wert einer Information beschreibt, den diese für den Empfänger der Information besitzt."2 Diese unterschiedlichen Definitionen des Begriffs "Information" führen häufig zu Missverständnissen. Vor allem wenn der Begriff im Sinne der Statistik auf Kunst angewendet wird, man ihn aber in diesem Zusammenhang intuitiv pragmatisch versteht. 1 2 Vgl.: André Neubauer, Informationstheorie und Quellencodierung, Eine Einführung für Ingenieure, Informatiker und Naturwissenschaftler, Wilburgstetten: 2006, S. 1 Ebd. 3 In der Informationstheorie wird Information über die statistischen Eigenschaften einer Nachricht definiert. Mit Begriffen wie "Informationsgehalt" oder "Entropie" wird also keine Aussage über den Inhalt, die Bedeutung oder den künstlerischen Wert einer Nachricht gemacht sondern allein ihre statistischen Eigenschaften beschrieben. Definition 1 (Nachricht, Information) Unter "Nachricht" versteht man eine Zusammenstellung von Zeichen, die zur Informationsübertragung dient. Dabei ist entscheidend, dass zwischen Sender und Empfänger eine verabredete Menge von Zeichen beziehungsweise Symbolen existiert, aus denen sich die übermittelte Nachricht zusammensetzt. Definition 2 (Elementarzeichenvorrat) Der Begriff "Elementarzeichenvorrat" bezeichnet alle Zeichen beziehungsweise Symbole, die eine Nachrichtenquelle aussenden kann. Ein Beispiel für eine Nachricht ist die vorliegende Arbeit. Ihr Elementarzeichenvorrat entspricht dem deutschen Alphabet. Weitere Beispiele für Elementarzeichenvorräte sind das Binäralphabet {0, 1} oder das Dezimalalphabet {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. Eine Nachrichtenquelle die Zeichen aus dem Binäralphabet ausgibt bezeichnet man als Binärquelle. Das allgemeine Modell einer Informations- beziehungsweise Nachrichtenübertragung wurde von Shannon folgendermaßen beschrieben: Abbildung 1: Allgemeines Nachrichtenübertragungssystem 4 Im Zusammenhang mit der hier vorgestellten Software ist nur die Nachrichtenquelle von Bedeutung. Als Nachrichtenquelle bezeichnet man den Ursprung einer Nachricht. Die Hauptfunktion der Software ist es eine Nachrichtenquelle zur Verfügung zu stellen, die eine Nachricht mit einer vorgegebenen Entropie erzeugt. Diese Nachricht kann dann vom Benutzer auf unterschiedliche Weise weiterverarbeitet und genutzt werden. Man unterscheidet zwischen gedächtnislosen und gedächtnisbehafteten Nachrichtenquellen. Bei einer gedächtnislosen Nachrichtenquelle ist die Wahrscheinlichkeit für die Ausgabe eines Zeichens nicht von dem zuvor ausgegebenen Zeichen abhängig, während bei gedächtnisbehafteten Nachrichtenquellen die Wahrscheinlichkeit eines Zeichens von den vorherigen abhängig ist. Ein Beispiel für eine gedächtnislose Nachrichtenquelle ist ein mehrmaliger Wurf eines idealen Würfels. Ein Beispiel einer gedächtnisbehafteten Nachrichtenquelle ist die deutsche Sprache (bzw. ein in Deutsch verfasster Wahrscheinlichkeit Text). für die – Bei der Ausgabe deutschen eines Zeichens Sprache von ist dem die zuvor ausgegebenen Zeichen abhängig. Definition 3 (Informationsgehalt) In der statistischen Betrachtungsweise der Informationstheorie wird der Informationsgehalt I(xi) eines Zeichens xi über die Wahrscheinlichkeit des Auftretens dieses Zeichens in einer Nachricht definiert. Der Informationsgehalt I(xi) eines Zeichens xi ist um so größer, je kleiner die Wahrscheinlichkeit p(xi) für die Ausgabe des Zeichens xi ist. Aus dieser Definition ergibt sich, dass der Informationsgehalt eine monoton fallende Funktion der Wahrscheinlichkeit ist. Die Formel für diese Funktion lautet: ⎛ 1 ⎞ ⎟⎟ = − log 2 ( p ( xi )) [bit] I ( xi ) = log 2 ⎜⎜ p ( x ) i ⎠ ⎝ 5 Ein Beispiel, das den Informationsgehalt eines Zeichens gut veranschaulicht, ist die deutsche Sprache. Nach dem Buchstaben "q" folgt immer der Buchstabe "u". Also ist die Wahrscheinlichkeit des Zeichens "u" nach einem "q" gleich 1. Der Informationsgehalt von "u" ist in diesem Fall gleich 0, da das Zeichen "u" keinen Kenntniszuwachs in der Nachricht erzeugt. Man sagt: das Zeichen "u" ist redundant. Das Zeichen "u" ist in der deutschen Sprache auch insgesamt weitaus häufiger als das Zeichen "q". Wenn man die deutsche Sprache als gedächtnislose Nachrichtenquelle behandeln würde bedeutet das, dass das Zeichen "q" im deutschen Alphabet einen größeren Informationsgehalt besitzt als das Zeichen "u". In Abbildung 2 sieht man den Funktionsgraphen des Informationsgehalts. Bei sehr kleiner Wahrscheinlichkeit p(xi) eines Zeichens xi geht der Informationsgehalt I(xi) gegen unendlich. Bei einer Wahrscheinlichkeit von p(xi) = 1 ist der Informationsgehalt I(xi) = 0. Abbildung 2: Funktionsgraph des Informationsgehalts Mit Hilfe des Informationsgehalts kann also jedem Zeichen einer Nachricht ein zugehöriges Maß an Information zugeordnet werden. Um zu einem Maß für die Information einer ganzen Nachricht zu gelangen, berechnet man den mittleren Informationsgehalt der Nachricht. Dieser mittlere Informationsgehalt wird als Entropie bezeichnet. 6 Die Entropie H(X) einer Nachricht beziehungsweise Zeichenkette X berechnet sich demnach nach folgender Formel: M H ( X ) = −∑ p( xi ) ⋅ log 2 ( p( xi )) [bit] i =1 Damit ist die Entropie ein Maß für die Zufälligkeit einer Information. Bei einem idealen Münzwurf, bei dem jede Seite gleich wahrscheinlich ist, beträgt die Entropie 1. Ein solcher Münzwurf entspricht einer Binärquelle mit dem Elementarzeichenvorrat {0, 1} und ist ein wichtiger Spezialfall der shannonschen Entropie. Bei Binärquellen bewegt sich die Entropie immer zwischen 0 und 1. Eine Entropie H(X) = 0 würde bedeuten, dass eines der Zeichen {0, 1} mit einer Wahrscheinlichkeit p(xi) = 1 und das andere dementsprechend mit einer Wahrscheinlichkeit p(xi) = 0 in der Nachricht vorkommt. Eine Entropie von H(X) = 1 bedeutet, dass beide Zeichen mit der gleichen Wahrscheinlichkeit p(xi) = 0,5 in der Nachricht vorkommen. Hier ein Beispiel einer Binärnachricht mit einer Entropie H(X) = 0: 11111111111111111111111111 Hier einige Beispiele für Binärnachrichten mit einer Entropie H(X) = 1 1) 0010101100010111100100110110 2) 0101010101010101010101010101 3) 0011001100110011001100110011 Wie man anhand der letzten drei Beispiele erkennt, entspricht Zufälligkeit im Bezug auf die shannonsche Entropie nicht unbedingt unserer intuitiven Vorstellung von Zufall. Die Berechnung der Entropie nach Shannon macht zwischen diesen drei Beispielen keinen Unterschied und ergibt immer 1, da die Wahrscheinlichkeit einer 1 oder 0 in jedem der Beispiele 0,5 ist. Intuitiv würde mann aber den Beispielen 2 und 3 eher eine Entropie von 0 geben, da sie uns ganz und gar nicht zufällig erscheinen. Auf diese Problematik werde ich später noch näher eingehen. 7 Bei Quellen mit einem größeren Elementarzeichenvorrat ist die maximale Entropie größer als eins. Zum Beispiel ist die Entropie der deutschen Sprache näherungsweise 4,0626. Um Verwechslungen vorzubeugen und um die Entropie unterschiedlicher Nachrichtenquellen einfacher vergleichbar zu machen, werde ich mich in dieser Arbeit allerdings immer auf die Binärentropie beziehen und im Falle von Quellen mit größerem Elementarzeichenvorrat die Entropie auf einen Ergebnisbereich zwischen 0 und 1 umrechnen. Das bedeutet, dass eine Entropie von 1 immer der maximal möglichen Entropie und damit dem maximalen Zufall in einer Nachricht entspricht. 1.2 Kurze Einführung in die objektorientierte Programmierung Die Objektorientierung ist ein Programmierparadigma, das bei den sogenannten objektorientierten Programmiersprachen (z.B. C++ oder Java) zum Einsatz kommt. Bei diesen Programmiersprachen werden zur Laufzeit nur Objekte, die den zu verarbeitenden Daten entsprechen, in den Speicher geladen. Objekte können Eigenschaften (auch Parameter genannt) und Methoden (auch Funktionen genannt) besitzen. Eigenschaften repräsentieren die Datensätze der Objekte, also Variablen und Konstanten. Methoden entsprechen mathematischen Funktionen die solche Datensätze weiterverarbeiten und denen auch Eigenschaften beziehungsweise Werte zur Verarbeitung übergeben werden können. Die Eigenschaften und Methoden eines Objekts werden in einer sogenannten Klasse definiert. Eine Klasse ist sozusagen ein Prototyp eines Objekts von dem man beliebig viele weitere Objekte erzeugen kann. Klassen können von anderen Klassen deren Eigenschaften und Methoden erben. 8 Ein Pseudocode einer Klassendefinition in einer objektorientierten Programmiersprache könnte so aussehen: Klassendefinition: Note { Eigenschaft: Tonhöhe; Eigenschaft: Lautstärke; Methode: Transponiere(Eigenschaft: Intervall); } Diese Klasse kann dann im weiteren Programmverlauf dazu genutzt werden, um Objekte zu erzeugen. Um auf die Eigenschaften und Methoden eines Objektes zuzugreifen, wird üblicherweise ein Punkt hinter den Objektnamen geschrieben. Z.B.: "Objekt.Eigenschaft" oder "Objekt.Methode()". Die runden Klammern hinter der Methode zeigen an, dass man einer Methode auch Eigenschaften übergeben kann, die diese Methode dann verarbeitet. Hier ein Pseudocode für das Erstellen von Objekten von der oben definierten Klasse: Code { Erzeuge Note: Note1; Note1.Tonhöhe = c1; Erzeuge Note: Note2; Note2.Tonhöhe = d1; Erzeuge Note: Note3; Note3.Tonhöhe = e1; Erzeuge Note: Note4; Note4.Tonhöhe = f1; Erzeuge Note: Note5; Note5.Tonhöhe = g1; Note3.Transponiere(KleineTerz); Spiele: Note1, Note2, Note3, Note4, Note5; } 9 Die Anweisung "Spiele" in diesem Pseudocode könnte zum Beispiel folgende Ausgabe am Bildschirm erzeugen: c1, d1, g1, f1, g1 Zweck dieser sehr rudimentären Einführung war es die Bedeutung der Begriffe "Klasse", "Objekt", "Methode" und "Eigenschaft" zu vermitteln, da ich diese bei der Vorstellung dieser Software öfters verwende. Ich werde allerdings darauf verzichten in dieser Arbeit auf die Algorithmen einzugehen die verwendet wurden. So ist ein genaueres Verständnis von Programmiersprachen nicht notwendig. 10 2. Wahl der Programmiersprache Die Anforderungen die ich vor der Entwicklung an die Software stellte waren Folgende: 1. Kompatibel zu einer vorhandenen Software für digitale Soundverarbeitung 2. Einfache Erweiterbarkeit 3. Im Liveeinsatz verwendbar (real time) 4. open source Diese Anforderungen führten dazu, dass Supercollider (SC) die Programmiersprache meiner Wahl für dieses Projekt wurde. Die Beschreibung von SC aus der SC-FAQ lautet: "SuperCollider is an environment and programming language for real time audio synthesis. You can write programs to generate or process sound in real time or non real time." Hinzu kommt, dass es sich bei SC um ein Open-Source-Projekt handelt. Das bedeutet, dass der Quellcode frei verfügbar ist und man so SC einfach an die eigenen Bedürfnisse anpassen kann. Supercollider ist eine objektorientierte Programmiersprache, die sowohl als kompilierte als auch interpretierte Sprache genutzt werden kann. Das bedeutet, dass jedes Mal, wenn SC neu gestartet wird, die in SC geschriebenen Klassen vom Compiler neu kompiliert und in den Speicher geladen werden. Danach kann man aber auf diese Klassen in Echtzeit zugreifen und während der Laufzeit neue Objekte von ihnen erstellen – das ist der interpretierte Anteil der Sprache SC. Es ist allerdings nicht möglich neue Klassen während der Laufzeit zu erstellen. Deshalb ist es notwendig Software für Echtzeit-Anwendung in SC so zu designen, dass es möglich ist neue Funktionalität ohne dem Erzeugen neuer Klassen hinzuzufügen. 11 3. Übersicht über den Funktionsumfang der Software Die von mir entwickelte Software besteht hauptsächlich aus 3 Klassen, welche die Funktionalität bereitstellen und miteinander interagieren. 1. Die Klasse InformationSource dient, wie ihr Name schon andeutet, als Nachrichtenquelle (nach Shannon). Ihre Aufgabe besteht darin Elemente aus einem Elementarzeichenvorrat mit einer einstellbaren Entropie auszuwählen und auszugeben bzw. dem Benutzer zur Verfügung zu stellen. Das Ergebnis ist eine Nachricht die aus Zeichen des Elementarzeichenvorrats besteht und eine vordefinierte Entropie besitzt. Die Klasse InformationSource nutzt die Klasse ProbDistrFactory um die eigentlichen Berechnungen durchzuführen. 2. Die Klasse ProbDistrFactory (ProbabilityDistributionFactory) ermöglicht es dem Benutzer aus einer Reihe von Wahrscheinlichkeitsverteilungen auszuwählen und auch neue Wahrscheinlichkeitsverteilungen zur Software hinzuzufügen. Sie ist eine unabhängige Klasse die auch ohne die Klasse InformationSource verwendet werden kann. 3. Die Klasse Math ist eine unterstützende Klasse, die verschiedene mathematische Berechnungen ermöglicht die bisher in SC noch nicht implementiert waren. Zusätzlich zu diesen Klassen habe ich zwei neue UGens3 für SC geschrieben, die hauptsächlich dazu dienen einige Möglichkeiten der Software auszutesten und zu demonstrieren. Diese Synths wurden nicht in SC geschrieben sondern in C++ und müssen als zusätzliche Module in SC geladen werden. 3 "UGen" steht in SC für "Unit-Generator" und ist ein in SC geladenes Modul welches eine Soundberechnung ermöglicht. Es handelt sich dabei um eine in C++ programmierte DLL (Dynamic Link Library). Alle Soundberechnungen in SC werden mit Hilfe von Ugens realisiert. Zum Beispiel sind Impulsgeneratoren, Sinusoszillatoren aber auch die Berechnung von Fourier-Transformationen als UGens implementiert. 12 3.1 Die Klasse InformationSource Um mit der Software eine Nachricht zu erzeugen, muss während der Laufzeit von SC ein Objekt der Klasse InformationSource vom Benutzer erzeugt werden. Diese Klasse besitzt zwei Eigenschaften (Parameter) die vom Benutzer definiert bzw. eingestellt werden müssen. Die erste Eigenschaft, die der Benutzer definieren muss, ist der Elementarzeichenvorrat. Dabei handelt es sich um eine Menge von beliebigen SC-Objekten, die als Alphabet für die Nachrichtenquelle dienen. Möchte man zum Beispiel eine binäre Nachricht erzeugen, dann übergibt man dem erstellten InformationSource-Objekt den Elementarzeichenvorrat {0, 1}. In SC-Code könnte das so aussehen: ~src = InformationSource.new([0, 1]); Die auf die Klasse InformationSource aufgerufene Methode "new()" ist eine spezielle Methode in SC, die ein neues Objekt der Klasse InformationSource erzeugt. Dieser Methode wird bei ihrem Aufruf die Menge [0, 1] übergeben. Dies ist der Elementarzeichenvorrat aus dem das erstellte Objekt "~src" später die Nachrichten erzeugt. Der Befehl "~src =" ist in diesem Code eine einfache Zuweisung, die es ermöglicht später auf das erstellte Objekt zuzugreifen. Bei diesem Beispiel besteht der Elementarzeichenvorrat aus Zahlen (in SC IntegerObjekte). Es ist jedoch möglich jedes beliebige SC-Objekt wie z.B. selbst definierte Klänge, Dateien, Buchstaben, usw. zu verwenden. Ein InformationSource-Objekt mit dem Elementarzeichenvorrat der deutschen Sprache (nur Kleinbuchstaben) würde man so erstellen: ~src = InformationSource.new(["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]); 13 Die zweite und zugleich wichtigste Eigenschaft, die der Benutzer einstellen kann, ist die Entropie mit der die Nachricht vom InformationSource-Objekt ausgegeben werden soll. Eine Entropie von 0 bedeutet bei einer Binärquelle, dass nur das erste Objekt des Elementarzeichenvorrats ausgegeben wird. Eine Entropie von 1 bedeutet, dass beide Zeichen mit einer Wahrscheinlichkeit von 0,5 ausgegeben werden – also zufällig. Die Entropie lässt sich stufenlos von 0-1 einstellen. Dadurch kann der Benutzer eine Nachricht in ihrer Entropie verändern oder einen fließenden Übergang zwischen Chaos und Ordnung herstellen. Hier einige Beispiele einer Binärnachricht mit unterschiedlicher Entropie, die vom Programm berechnet wurden: Entropie = 0 → 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 Entropie = 0.2 → 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 Entropie = 0.6 → 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1 Entropie = 1 → 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1 Die letzte Eigenschaft, die der Benutzer definieren muss, ist die Wahrscheinlichkeitsverteilung die von der Software verwendet werden soll um eine Nachricht in der gewünschten Entropie zu berechnen. Bei Binärquellen benötigt man keine vorgegebene Wahrscheinlichkeitsverteilung, da ohnehin nur zwei Elemente im Elementarzeichenvorrat vorhanden sind. Damit lässt sich die Wahrscheinlichkeitsverteilung der Elemente anhand einer vorgegebenen Entropie exakt berechnen (es handelt sich um eine Gleichung mit zwei Unbekannten: der Wahrscheinlichkeit Wahrscheinlichkeit des zweiten des ersten Elements). Elements Wenn und allerdings der der Elementarzeichenvorrat größer ist, gibt es dem entsprechend auch mehr Wahrscheinlichkeitsverteilungen über diese Elemente, die eine Nachricht mit derselben Entropie erzeugen. Deshalb kann man anhand einer gegebenen 14 Entropie in diesem Fall nicht exakt berechnen tragen, wird wie die Wahrscheinlichkeitsverteilung aussehen soll. Um diesem Problem Rechnung zu die gewünschte Wahrscheinlichkeitsverteilung erst vom Benutzer vorgegeben und dann anhand dieser Verteilung die Entropie näherungsweise berechnet. Die Wahrscheinlichkeitsverteilung ist dabei eine mathematische Funktion, deren Input solange verändert wird, bis der Output näherungsweise der vorgegebenen Entropie entspricht. Wie genau diese Berechnung sein soll, kann vom Benutzer festgelegt werden und beeinflusst, abhängig von der Prozessorleistung, die Dauer der Berechnung. Die Funktionen der Wahrscheinlichkeitsverteilung werden dem InformationSource-Objekt wieder als SC-Objekte übergeben und in dem Objekt als Parameter gespeichert. Zu diesem Zweck kann der Benutzer die Klasse ProbDistrFactory nutzen, die bereits viele Wahrscheinlichkeitsverteilungen vordefiniert hat und damit das Arbeiten mit der Klasse InformationSource erleichtert. 3.2 Die Klasse ProbDistrFactory Diese Klasse erfüllt zwei Aufgaben. Einerseits kann sie als eigenständige Klasse verwendet werden, um einer gegebenen Menge von Elementen eine bestimmte Wahrscheinlichkeitsverteilung zuzuordnen. Damit eignet sie sich gut als Hilfsklasse für unterschiedliche statistische Kompositionstechniken. Andererseits kann man sie verwenden, um einem InformationSource-Objekt eine Wahrscheinlichkeitsverteilung zuzuordnen, mit der die Entropie der ausgegebenen Nachricht berechnet wird. 15 Um diese Aufgaben zu erfüllen, enthält die Klasse ProbDistrFactory (Probability-Distribution-Factory) bereits einige vordefinierte Verteilungsfunktionen, die direkt genutzt werden können. Es ist aber auch möglich neue Funktionen während der Laufzeit von SC hinzuzufügen, da die Verteilungsfunktionen implementiert sind, nicht sondern als Methoden als der Klasse Eigenschaften ProbDistrFactory (SC-Objekte vom Typ "Function"). Diese Designentscheidung bietet mehrere Vorteile. 1. Der Benutzer kann selbst neue Funktionen während der Laufzeit von SC zur ProbDistrFactory hinzufügen. 2. Die Klasse InformationSource ist nicht direkt von der Klasse ProbDistrFactory abhängig Verteilungsfunktionen – entwerfen man könnte auch eigene diese der Klasse und InformationSource übergeben. 3. Es ist möglich Funktionen von der Klasse ProbDistrFactory als SCObjekte zu erhalten und diese Funktionen dann anderen SC-Klassen als Eigenschaften zu übergeben. Damit ist die Klasse ProbDistrFactory sehr einfach in andere Softwareprojekte integrierbar. 4. Die Software kann dadurch später sehr einfach erweitert werden. Es folgt ein Überblick über einige der bereits implementierten Verteilungsfunktionen. Die Kurvengrafiken wurden in SC erstellt und zeigen einige der möglichen Verteilungskurven für die jeweilige Formel. Die Formeln wurden von der Wikipedia entlehnt und werden dort genauer erläutert. (http://de.wikipedia.org/wiki/Wahrscheinlichkeitsverteilung) 16 Exponentialverteilung verwendete Formel: Verteilungskurven: Beta Verteilung verwendete Formel: Verteilungskurven: 17 Chi-Quadrat-Verteilung verwendete Formel: (Dabei steht Γ(r) für die Gammafunktion.) Verteilungskurven: Erlang-Verteilung verwendete Formel: Verteilungskurven: 18 Normalverteilung (Gauß-Verteilung) verwendete Formel: Verteilungskurve: Laplace-Verteilung (Doppelexponentialverteilung) verwendete Formel: Verteilungskurve: 19 Die restlichen Verteilungsfunktionen werden nur in einem kurzen Überblick ohne Verteilungskurven vorgestellt: Gammaverteilung verwendete Formel: Fisher-Tippett-Verteilung verwendete Formel: Stetige Gleichverteilung (Rechteckverteilung) verwendete Formel: Dreiecksverteilung (Simpson-Verteilung) verwendete Formel: Neben diesen in Wahrscheinlichkeitsverteilungen der Statistik wurden auch häufig noch viele verwendeten Verteilungen implementiert die auf unterschiedlichsten Funktionen beruhen. Darunter sind zum Beispiel eine quadratische und eine geometrische Verteilung, eine Verteilung die auf der Sinusfunktion beruht, eine die auf der Fibonaccifolge beruht und mehrere Verteilungen, die auf unterschiedliche Zufallsfunktionen beruhen. 20 Nicht alle der hier vorgestellten Wahrscheinlichkeitsfunktionen sind dazu geeignet jede beliebige Entropie zu erzeugen. Erschwerend kommt hinzu, dass es keinen allgemeinen Algorithmus gibt der anhand einer beliebigen Funktion die, zu einer gegebenen Entropie passende, Verteilung näherungsweise berechnen kann. (Zumindest konnte ich bisher keinen Algorithmus finden, der diese Aufgabe in einer angemessenen Zeit erledigt.) Deshalb muss für jede dieser Funktionen ein spezieller, von der Funktion abhängiger Algorithmus implementiert implementiert. werden. Bisher Dennoch wurde kann erst man einer dieser bereits Algorithmen jede dieser Wahrscheinlichkeitsfunktionen mit der Klasse InformationSource verwenden, um eine Nachricht anhand eines Elementarzeichenvorrats erzeugen zu lassen. Allerdings muss man die Parameter der Funktion dann selbst an die gewünschte Entropie anpassen. 21 3.3 Die Klasse Math Diese Klasse ist eine unterstützende Klasse. Zum Berechnen vieler Wahrscheinlichkeitsfunktionen werden einige mathematische Algorithmen und Funktionen benötigt, die in SC standardmäßig nicht implementiert sind. Die Klasse Math fügt diese Funktionen zu SC hinzu und kann unabhängig von den übrigen Klassen dieses Softwarepaketes verwendet werden. Es folgt ein Überblick über die implementierten mathematischen Funktionen: 1. Math.fact (n) – Berechnet die Fakultät von n (n!). 2. Math.integrate (f, a, b, dx) – Berechnet das Integral der übergebenen Funktion f über das Intervall a-b mit einer Genauigkeit von dx. 3. Math.betaF (x, y, dt) – Implementation der Betafunktion. 4. Math.gammaF (x, range, dt) – Implementation der Gammafunktion. Der Parameter range gibt an über welches Intervall integriert werden soll und ermöglicht so eine Feineinstellung der Genauigkeit. 5. Math.lambertW (x, prec) – Implementation der Lambert-W-Funktion, die Umkehrfunktion von: Mit dem Parameter prec lässt sich die Genauigkeit der näherungsweisen Berechnung einstellen. 22 3.4 Zusätzliche Funktionalität der Software Zusätzlich zur oben beschriebenen Hauptfunktionalität der Software habe ich zwei UGens in C++ implementiert. Diese Ugens sind ein erstes Experiment, um die Möglichkeiten der Software für den Einsatz in digitaler Soundverarbeitung zu testen. Die Ugens werden in SC über die Klassen EntropyImpulse und EntropyImpulse2 aufgerufen und sind einander in ihrer Funktionalität sehr ähnlich. Der Ugen EntropyImpulse ist ein Impulsgenerator der keinen durchgängigen Impuls erzeugt sondern der den Impuls in einem, durch die Entropie vorgegebenen, Rhythmus wiedergibt. Abhängig von der Abspielgeschwindigkeit des Impulses wird so bei Entropie = 0 ein reiner Sinuston erzeugt und bei Entropie = 1 ein Rauschen. Bei Entropie zwischen 0 und 1 wird ein fehlerhafter Sinuston (mit Geräuschanteil) erzeugt. EntropyImpulse2 funktioniert nach demselben Prinzip mit dem Unterschied, dass man statt eines Impulses ein Soundfile in einem vorgegebenen Rhythmus wiedergeben kann. Bei einer Entropie von 0 funktioniert dieser Ugen eigentlich wie ein einfacher Wavetable-Synthesizer. Bei höherer Entropie wird dem Soundfile immer mehr Störgeräusch beigemischt und bei einer Entropie von 1 verändert sich der Klang in ein Rauschen. 23 4. Probleme die sich aus dem vorgestellten Konzept ergeben Wenn man statistische Verfahren wie Wahrscheinlichkeitsverteilung oder Entropie in Kompositionen anwendet ergeben sich mehrere praxisbezogene Probleme, die sich aus der mathematisch-algorithmischen Natur des Materials und dem eingeschränkten künstlerischen Freiraum ergeben. Einige Probleme, auf die ich im Laufe des Arbeitsprozesses stieß werden im folgenden Kapitel diskutiert. 4.1 Was ist eigentlich Zufall? Ich habe bereits darauf hingewiesen, dass die Entropieberechnung nach Shannon nicht unserer intuitiven Vorstellung von Zufall entspricht. Die folgenden drei Binärnachrichten sind nach dieser Berechnung alle gleich zufällig und besitzen eine Entropie von 1. 1) 0010101100010111100100110110 2) 0101010101010101010101010101 3) 0011001100110011001100110011 Der Grund dafür, dass diese Nachrichten die gleiche Entropie besitzen liegt darin, dass die Wahrscheinlichkeit P(x) beider Elemente (0 und 1) in diesen Zeichenketten 0,5 beträgt. Die Entropieberechnung nach Shannon ist also eine Berechnung die von einer gedächtnislosen Nachrichtenquelle ausgeht. In meiner Software wird sie auch zu diesem Zweck eingesetzt – um eine gedächtnislose Nachricht zu erzeugen. Ein Computer kann prinzipiell keine wirklichen Zufallszahlen berechnen, da er immer einem vorgegebenen Algorithmus folgen muss. Deshalb gibt es verschiedene Algorithmen die es ermöglichen im Computer Zufall zu simulieren. Diese Algorithmen sind so komplex, dass es einem Menschen nicht möglich ist 24 den Algorithmus hinter den ausgegebenen Zahlen zu erkennen – die Zahlen wirken für uns zufällig. Meist wird diesen Algorithmen eine "seed"-Zahl übergeben, anhand derer die Zufallszahlen berechnet werden. Gleiche "seed"Zahlen ergeben immer die gleichen Zeichenketten. Man kann die Qualität eines Zufallszahlen-Algorithmuses anhand der statistischen Eigenschaften der erzeugten Zufallszahlen messen. Eine Möglichkeit die Zufälligkeit einer Binärfolge zu überprüfen ist der sogenannte Run-Test (Wald-Wolfowitz-Test). Im Gegensatz zur Entropieberechnung nach Shannon nimmt der Run-Test – wie der Name schon andeutet – auf Folgen (runs) von gleichen Werten Rücksicht. Ich habe in der Klasse InformationSource den Runtest in einer modifizierten Version implementiert um so die Zufälligkeit der ausgegebene Nachrichten überprüfen zu können. Nach einem Vergleich der SC-Zufallszahlen mit wirklichen Zufallszahlen4 stellte sich heraus, dass der Algorithmus, der in SC Zufallszahlen berechnet, statistisch einwandfreie Zufallszahlen erzeugt. Bei der Verwendung der Klasse InformationSource als Nachrichtenquelle muss man sich also über die Qualität der erzeugten Zufallszahlen keine Gedanken machen. Allerdings bietet die Klasse InformationSource auch analytische Möglichkeiten. Man kann mit Hilfe calcBinaryEntropyForProbs5 der die Methoden Entropie calcEntropyForProbs einer gegebenen und Nachricht berechnen lassen. Um die Ergebnisse allerdings sinnvoll interpretieren zu können, muss man sich darüber im Klaren sein, dass die Entropieberechnung nach Shannon nur einen kleinen Teil der statistischen Eigenschaften einer komplexen Nachricht darstellt. Wenn man jedoch zusätzlich noch den Run-Test zur Analyse hinzuzieht, könnte man durchaus interessante Ergebnisse erhalten – allerdings stehen Experimente in diesem Bereich noch aus. 4 5 Die zum Vergleich herangezogenen Zufallszahlen wurden von der Seite http://www.random.org/ erzeugt. Der Random-Number-Generator dieser Seite erzeugt echte Zufallszahlen nach der Zufälligkeit in atmosphärischem Rauschen. Diese Methode berechnet zuerst die Entropie und rechnet diesen Wert dann auf einen Ergebnisbereich zwischen 1 und 0 um. 25 Für zukünftige Versionen dieser Software ist es geplant auch gedächtnisbehaftete Nachrichtenquellen zu implementieren. Dies wird mit sogenannten Markov-Ketten realisiert, die in ihrer Berechnung auf der bedingten Wahrscheinlichkeit basieren. Mit dieser Erweiterung würde die Software auch als Analyse-Tool interessant werden. 4.2 Welcher kompositorische Freiraum bleibt übrig? Wenn man mit algorithmischen Techniken in Kompositionen arbeitet, sollte man sich immer erst die Frage stellen welche Arbeit der Computer einem eigentlich abnehmen soll und in wie weit man noch künstlerisch in den Prozess eingreifen kann, damit das Endprodukt der Bezeichnung "Komposition" (im Gegensatz zu einer "Berechnung") gerecht wird. Bei der Generierung von Nachrichten anhand statistischer Eigenschaften wie der Entropie ist eine der ersten kompositorischen Entscheidungen, die man treffen muss, die Wahl der Wahrscheinlichkeitsverteilung. Es gibt prinzipiell zwei Möglichkeiten eine Wahrscheinlichkeitsverteilung zu erzeugen. Die einfachere und flexiblere Möglichkeit ist es die Wahrscheinlichkeiten der Elemente in einem Elementarzeichenvorrat per Hand einzugeben. Dies bietet den Vorteil, dass man die künstlerische Kontrolle über die, von der Nachrichtenquelle ausgegebenen, Zeichen zu jedem Zeitpunkt beibehält. Es ist allerdings sehr schwer den Parameter Entropie bei dieser Vorgehensweise sinnvoll in der Komposition einzusetzen. Fließende Übergänge von einer Entropie zu einer anderen herzustellen sind auf diese Weise sehr umständlich herzustellen. Die zweite Möglichkeit ist es die Wahrscheinlichkeitsverteilung über eine Funktion berechnen zu lassen. Der künstlerische Prozess beschränkt sich hierbei auf die Auswahl oder das Erstellen der Funktionen. Allerdings wird dem Benutzer so die Entropie der Nachricht als Parameter zur Verfügung gestellt, was einen weiteren Bereich des künstlerischen Eingreifens ermöglicht. 26 In beiden Fällen ist das Ergebnis immer eine Nachricht, die aus den Zeichen eines vorgegebenen Elementarzeichenvorrats besteht. Die Auswahl dieser Zeichen ist der nächste künstlerische Eingriff und sicher einer der entscheidendsten. Jeder musikalische Parameter kann als Zeichen im Elementarzeichenvorrat verwendet werden und das Ergebnis hängt stark von dieser Auswahl ab. Wenn man zum Beispiel einen Elementarzeichenvorrat aus Tonhöhen definiert, erhält man bei maximaler Entropie eine zufällige Nachricht aus Tönen eines Tonraums. Bei einer niedrigen Entropie werden einige Töne häufiger wiedergegeben werden als andere. Wenn man die Entropie auf 0 stellt, erhält man dagegen einen einzigen Ton aus diesem Tonraum, der immer repetiert wird. Eine weitere kompositorische Entscheidung, die man treffen muss, ist der musikalische Umgang mit der erzeugten Nachricht. Da man die Nachricht als eine Reihe von Zeichen ansehen kann, entsprechen die kompositorischen Möglichkeiten den Möglichkeiten der Reihentechnik. So kann man mehrere Nachrichten kontrapunktisch neben einander ablaufen lassen oder man kann die Harmonik von der Reihe abhängig machen. Ein wichtiger Unterschied zu einer Reihe in der seriellen Musik ist jedoch, dass die Länge der Reihe nicht vorgegeben ist und, dass sich die Reihe immer wieder verändert. Eine statistisch erzeugte Reihe definiert sich nicht durch die Beziehung zwischen den aufeinander folgenden Elementen sondern durch die statistische Wahrscheinlichkeit dieser Elemente. Aus diesem Grund ist die Länge der Reihe selbst ein zusätzlicher kompositorischer Parameter. Es gilt zu entscheiden wie lange die Entropie einer Nachricht gleich bleibt und wie sich diese im Laufe der Nachricht ändert. Des Weiteren muss man entscheiden welche Elemente der Nachricht die Bevorzugten sind – also welche Elemente bei niedriger Entropie häufiger in der Nachricht erscheinen als die Anderen. 27 Bei all diesen kompositorischen Möglichkeiten darf man nie vergessen, dass man immer mit mathematischen Formeln hantiert. Diese haben allerdings manchmal ihre Tücken und liefern oft nicht das gewünschte Ergebnis. So hat jede Wahrscheinlichkeitsverteilung ihre eigenen Vorzüge und Problemstellen. Es ist nicht ratsam eine Verteilung auf gut Glück auszuprobieren, bevor man sich der mathematischen Eigenschaften der Formel bewusst ist. Auch bei der Verwendung von Entropie als kompositorischen Parameter gibt es Stolpersteine, deren man sich bewusst sein sollte. Wie bereits erwähnt, entspricht die Entropie dem durchschnittlichen Informationsgehalt einer Nachricht. Wenn man also eine Nachricht mit einer vorgegebenen Entropie von einer Nachrichtenquelle ausgeben lässt, muss diese Nachricht eine gewisse Länge besitzen, damit die tatsächliche Entropie der Nachricht sich dem Wert annähert, der von der Quelle eigentlich ausgegeben werden soll. Am Beispiel einer Binärquelle möchte ich dies verdeutlichen. Gegeben ist eine Binärquelle mit einer voreingestellten Entropie von 0,5. Von dieser Quelle werden mehrere Nachrichten unterschiedlicher Länge erzeugt und anschließend wird überprüft, wie hoch die tatsächliche Entropie dieser Nachrichten ist. Hier das Ergebnis: 1. Länge der Nachricht: 5 Berechnete Nachricht:: 1, 1, 1, 1, 1 Tatsächliche Entropie: 0 2. Länge der Nachricht: 10 Berechnete Nachricht:: 1, 1, 1, 0, 0, 1, 1, 1, 1, 1 Tatsächliche Entropie: 0,721 3. Länge der Nachricht: 20 Berechnete Nachricht:: 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1 Tatsächliche Entropie: 0,609 4. Länge der Nachricht: 100 Tatsächliche Entropie: 0,468 28 Am Ergebnis dieses Tests sieht man, dass man die berechneten Nachrichten immer kritisch betrachten muss. Außerdem wird deutlich, dass ein entropischer Prozess eine bestimmte Länge haben muss, damit man ihn als solchen wahrnehmen kann. Literaturverzeichnis GRAY, Robert M.: Entropy and Information Theory, New York 1990 MOLES, Abraham A.: Informationstheorie und ästhetische Wahrnehmung, Köln 1961 NEUBAUER, André: Informationstheorie und Quellencodierung. Eine Einführung für Ingenieure, Informatiker und Naturwissenschaftler, Wilburgstetten 2006 KULLBACK Solomon: Information Theory and Statistics, 1968 SCHULZ, Ralph-Hardo: Codierungstheorie. Eine Einführung, Wiesbaden 2003 SHANNON, Claude Elwood: A Mathematical Theory of Communication, in: The Bell System Technical Journal (Bd. 27), 1948, S. 379–423, 623–656 29 Beispielkomposition Der letzte Abschnitt dieser Arbeit enthält das Skizzenmaterial einer Komposition, an der ich gerade arbeite. Diese beruht auf dem vorgestellten Entropie-Konzept. Es handelt sich dabei um eine Komposition für Streichquartett und Elektronik. Das Konzept des ersten entropischen Prozesses dieser Komposition ist, mehrere Ebenen entropischer Prozesse nebeneinander laufen zu lassen, um so eine Verwandlung des musikalischen Materials von einem Zustand in einen anderen Zustand zu erzeugen. Die Ebenen, die bisher in der Skizze zu sehen sind, sind folgende: Ebene 1: Ein Binärrhythmus in Vierteln der sich von der Entropie 1 zur Entropie 0 verlagert. Ebene 2, 3 u. 4: Akkorde werden anhand drei verschiedener Ebenen in dem Binärrhythmus ausgesetzt. Die erste Ebene ist eine entropische Reihe, die den Intervallen entspricht. Die zweite legt fest aus wie vielen Intervallen sich ein Akkord zusammensetzt. In diesen beiden Ebenen wird die Entropie von 0 nach 1 verlagert. Eine dritte Ebene entspricht dem Fundamentschritt der Akkorde, mit einer Entropie von 0.6 bis 0.8. Ebene 5: Diese Ebene verschiebt die Akkordtöne vom Grundpuls um einen bestimmten Wert nach vorne oder nach hinten. Ebene 6: Diese Ebene dient dazu die Klangfarbe der Akkorde mittels eines Elementarzeichenvorrats von vorher definierten Klangereignissen zu ändern. Weitere Ebenen die noch hinzukommen sind Ebenen für Dynamik, Lagenwechsel, Motiventwicklung und Elektronik. 30 Die Notation enthält einige Zeichen, die das gewünschte Klangergebnis repräsentieren. Diese dienen vorläufig hauptsächlich dem Konzept und werden sich zum Teil noch ändern. Wie das gewünschte Klangergebnis letztendlich erreicht wird, entscheide ich erst, wenn das grobe Konzept der Komposition fertig ist. Die meisten in dieser Skizze vorhandenen Klänge werden wahrscheinlich mittels Spieltechniken der Streicher erreicht werden. Es ist jedoch möglich, dass diese Klänge mittels Elektronik noch weiter verändert werden. Zeichenerklärung Punktuelle Klänge: Pizzicato mit leichtem Geräuschanteil. Entspricht wahrscheinlich einem Pizzicato mit der linken Hand und zusätzlichem Klopfen auf den Korpus mit einem Fingernagel. Pizzicato mit etwas mehr Geräuschanteil. Entspricht wahrscheinlich einem Pizzicato mit der linken Hand und zusätzlichem Klopfen auf den Korpus mit der Fingerkuppe. Pizzicato mit Fingernagel. Bartók-Pizzicato 31 Flächen- Klänge: Reiner Rauschklang. Entspricht wahrscheinlich einem Streichen auf dem Steg. Rauschklang mit weniger Geräuschanteil, aber trotzdem ohne definierte Tonhöhe. Entspricht wahrscheinlich einem gedämpften Streichen. Die Tonhöhenangaben dienen nur der Archivierung der ursprünglichen Tonhöhe in der Skizze und wird später aus der Partitur entfernt. Weniger Rauschanteil als der vorherige Klang. Die Tonhöhe wird meistens noch undefiniert sein, darf aber bereits andeutungsweise durchbrechen. Flautando Sonstige Zeichen: Die Note wird etwas früher bzw. später gespielt, liegt aber noch fast auf dem Viertelpuls. Die Note wird noch früher bzw. später gespielt. Die Abweichung entspricht aber noch nicht dem Wert einer Sechzehntel-Triole. 32 Skizzenmaterial der Beispielkomposition 33 34 35 36