Yeah, me

Foto: Uwe Pirr

Informatik


previous Page home toc next Page

Programmieren in HyperTalk, Teil V

In den letzten beiden Folgen unseres kleinen HyperTalk-Kurses haben wir Bilder gezeichnet und Animationen erstellt. Jetzt fehlt uns zum Multimedia-Entwickler nur noch der Umgang mit Tönen. HyperCard bietet natürlich auch hierzu einiges an Möglichkeiten, die wir, wie alles in HyperCard, in HyperTalk programmieren können. "Sound und Music" mit HyperTalk ist daher das Thema dieses Artikels. Im Wesentlichen benötigen wir nur ein einziges HyperTalk-Kommando, um Geräusche und Musik in HyperTalk zu programmieren: play. Dieses Kommando hat aber eine Syntax, die es in sich hat:
	play [sound] [tempo <zahl>] [note, note, ...]
In der einfachsten Form haben wir dieses Kommando schon öfter kennengelernt: play boing ist der System- und Warnton von HyperCard. Drei Sounds sind normalerweise in HyperCard schon eingebaut, das erwähnte Boing, Harpsichord (eine Art schwachbrüstiges Piano) und Flute. Default-Tempo ist die Einstellung 100. Sie ist in der Regel - zumindest auf Power-Macs - etwas zu langsam. Alle HyperCard-Sounds werden normalerweise in der Tonhöhe eines mittleren C gespielt. Das ist das C, das auf Klavieren in der Nähe des Schlosses liegt. Mit note kann die Tonhöhe verändert werden. Eine Note besteht aus folgenden Komponenten:

Notenname: c, d, e, f, g, a, b, c. Das "b" ist englisch zu lesen, entspricht also dem deutschen "h". Das deutsche "b" wird durch das Vorzeichen "b" ausgedrückt. In HyperTalk heißt es also "bb". Seltsamerweise müßte das Vorzeichen in HyperTalk eigentlich "Nachzeichen" heißen, da es nach der Note eingegeben wird (siehe unten).

Vorzeichen: # oder b.

Oktave: 1 bis 8. Wird keine Oktave angegeben, wird per Default die Oktave vier gespielt.

Dauer: w (whole): ganze Note, h (half): halbe Note, q (quarter): viertel Note und e (eight) für achtel Note. Wenn keine Notenlänge eingegeben wird, spielt HyperCard eine viertel Note.

Spiel mir eine kleine Melodie...

Mit folgendem Kommando
	play harpsichord tempo 180 "c4 d4 e4 f4 g4 a4 b4 c5w"
wird die C-Dur Tonleiter gespielt. Das play-Kommando läuft dabei im Hintergrund ab, d.h. darauffolgende Kommandos werden sofort ausgeführt, ohne Rücksicht darauf, ob das Musikstück zu Ende gespielt worden ist. Das hat den Vorteil, daß z.B. ein Spiel weiterarbeitet, obwohl noch eine Musik erklingt. Wenn das nicht gewünscht wird, kann mit der Befehlsfolge
	wait until the sound is done
HyperCard angewiesen werden, erst weiterzuarbeiten, wenn die Musik zu Ende gespielt wurde. Das ist dann sinnvoll, wenn z.B. nach einer einleitenden Musik ein weiterer Sound - wie etwa ein Interview - abgespielt werden soll.

Der String mit den Noten kann in HyperTalk von überall her kommen, etwa aus einem Feld oder aus einer Funktion. Das folgende Codefragment spielt etwas, das von Ferne an den Entertainer, Scott Joplins berühmten Ragtime, erinnert:

	on mouseUp
		play harpsichord tempo 240 Entertainer()
	end mouseUp
	
	function Entertainer
		put "d4e d#4e e4e c5q e4e c5q e4e c5w" &&~
		"c5e d5e d#5e e5e c5e d5e e5q b4e d5q c5w" &&~
		"d4e d#4e e4e c5q e4e c5q e4e c5w" &&~
		"a4e g4e gb4e a4e c5e e5q d5e c5e a4e d5w"~
		into phrase
		RETURN phrase
	end Entertainer
Nun ja, um eine kleine Automatenmelodie nach einem gewonnenen Spielchen zu starten, reicht dies wohl aus, größere musikalische Ansprüche lassen sich damit leider nicht verwirklichen.

Bis zur HyperCard Version 2.2 war der play-Befehl einstimmig, Mehrstimmigkeit ließ sich mit den Mitteln von HyperTalk nicht erreichen. Dies hat sich, zumindest ansatzweise, mit HyperCard 2.3 verbessert. Maximal acht verschiedene Sound-Kanäle können nun quasi gleichzeitig angesprochen werden - einen leistungsfähigen Macintosh vorausgesetzt. Zumindest theoretisch verspricht folgender Programmauszug einen C-Dur-Akkord:

	on akkord
		set soundChannel to 1
		play harpsichord c
		set soundChannel to 2
		play harpsichord e
		set soundChannel to 3
		play harpsichord g
	end akkord
Bei mir klingt das aber eher wie ein Apreggio denn wie ein Akkord, und auch das Handbuch zu HyperCard 2.3 verspricht nur einen "fast" gleichzeitigen Klang: "By immediately switching channels and playing new sounds, several sounds can be played nearly simultaneously." (Hervorhebung von mir.) Und da HyperTalk auch keine Möglichkeit bietet, die Kanäle zu synchronisieren, muß der Traum von der Mehrstimmigkeit wohl erst einmal unerfüllt bleiben.

Mit play stop kann der Sound auf dem aktuellen Kanal gestoppt werden. Falls kein Kanal gewählt ist, da sowieso nur einstimmig gespielt wurde, wird damit - wie in den HyperCard Versionen vor 2.3 - jeder Sound gestoppt. Neu in 2.3 ist das Kommando stop sound, mit dem die Sound-Ausführung auf allen Kanälen unterbrochen werden kann.

Achtung, Aufnahme!

Nun sind die drei "mitgelieferten" Sounds Boing, Harpsichord und Flute sicher etwas wenig, um eine komplette Multimedia-Anwendung zu realisieren. HyperCard erlaubt es daher einmal, Sounds selber aufzunehmen, zum anderen können Sie auch fertige Sounds in HyperCard übernehmen. Doch zuerst einmal zu der Aufnahme. Im Menü "Edit" finden wir den Befehl "Audio...". Dieser stellt die Audiopalette zur Verfügung, die ein kleines Aufnahmestudio innerhalb von HyperCard bildet.

Abb. 1: Die Audiopalette

Die Bedienung ist wie bei einem herkömmlichen Kassettenrecorder. In obiger Beispielabbildung (Abb. 1) habe ich gerade die Worte "Hallo HyperCard" in das eingebaute Mikrofon meines Duos gesprochen. Die Palette stellt einige Funktionen zur Nachbearbeitung zur Verfügung. Es können nicht benötigte Teile herausgeschnitten werden, Teile aus anderen Sounds hereinkopiert usw. Die Qualität ist besser, als beim Telefon. Für viele einfache Anwendungen reicht das sicher aus. Wer aber HiFi-Sounds in seinen Stack bekommen will, kommt um zusätzliche Hard- und Softwareanschaffung nicht herum.

Die Audiopalette speichert die aufgenommenen Sounds direkt in der Ressource Fork des aktuellen Stacks ab und erzeugt auch gleichzeitig einen Button, der diesen Sound abspielt. Bitte experimentieren Sie ruhig einmal mit der Audiopalette. Sprechen Sie einen kurzen Satz oder ein prägnantes Wort und spielen Sie dieses dann in verschiedenen Tonhöhen und Geschwindigkeiten ab. Ihr aufgenommener Sound läßt sich nämlich wie jeder andere HyperCard-Sound mit HyperTalk manipulieren. Mit oben aufgenommenem Sound ist daher folgendes möglich:

	play "Hallo HyperCard" tempo 100 c5
Sie werden sich wundern, über was für ein "Micky-Maus-Stimmchen" sie verfügen. Gut klingen kann aber auch, wenn Sie ein kurzes Geräusch, z.B. aufeinanderschlagende Löffel, aufnehmen und mit diesem dann eine kurze Melodie spielen. Hier ist Ihre Phantasie gefragt.

Mit Hilfe von ResEdit lassen sich aber auch beliebige, im snd-Format vorliegende Sounds in die Ressource Fork eines HyperCard-Stapels einfügen. Eine Bitte jedoch vorweg: Gerade wenn Sie im Umgang mit ResEdit noch unerfahren sind, arbeiten Sie immer nur mit Kopien Ihres Stacks, wenn Sie mit ResEdit experimentieren. Erfahrene ResEdit-Benutzer wissen das sowieso und halten sich daran, oder?

Abb. 2: ResEdit

In obiger Abbildung (Abb. 2) wird gerade ein Sound (bye bye baby) in den Stapel SoundTest importiert. Dazu werden beide Dateien in ResEdit geöffnet. Über das Klemmbrett können dann beliebige Ressourcen zwischen den beiden Dateien hin und her kopiert werden. Falls Ihr Stapel noch keine Ressource Fork besitzt, erscheint zu Beginn eine Warnung von ResEdit, daß es dem Stack diese hinzufügen wird. Diese Warnung ist ausnahmsweise einmal harmlos und kann ignoriert werden. (Normalerweise enthalten HyperCard Stacks selten Ressourcen, die Standardressourcen sind im Home Stack und in HyperCard selber enthalten. Nur Ressourcen, die der Benutzer/Programmierer dem Stack selber hinzufügt, z.B. eigene Icons oder Sounds) werden im Stapel gespeichert. Dazu wird dann auch eine Ressource Fork im Stapel von HyperCard angelegt.)

Alle in der Ressource Fork eines Stapels gespeicherten Sounds können mit der Audiopalette weiterverarbeitet werden. Und da es genügend (kommerzielle und public domain) Tools gibt, die Sounds aus anderen Formaten (z.B. AIFF oder WAV) in das snd-Format konvertieren, stehen Ihnen im Prinzip alle Geräusche der Welt offen.

HyperTalk kann SmallTalk

Nein, nicht die Programmiersprache Smalltalk ist gemeint, HyperCard kann sprechen! Seit der Version 2.3 existiert das Kommando speak mit folgender Syntax:
	speak <phrase> [with {<genderLiteral> voice | voice
<voice>}]
Um dieses Kommando nutzen zu können, muß PlainTalk installiert sein. Diese Systemerweiterung funktioniert leider nur mit Prozessoren ab dem 68020er. Classic oder SE30 Besitzer sind daher ausgeschlossen.

Doch zurück zu den Parametern von speak: <phrase> ist ein beliebiger Container, der einen String in Hochkommata enthält. Aus Verständnisgründen sollte der String eine englische Phrase enthalten, denn leider kann HyperCard noch kein Deutsch (oder Französisch oder Spanisch...). speak "Hello World" klingt noch ganz akzeptabel, speak "Hallo Jörg, wie geht es Dir?" bestenfalls seltsam. (Probieren Sie es ruhig einmal selber aus - einen Lacher ist es allemal wert.) <genderLiteral> ist entweder male, female oder neuter. Dies muß buchstäblich so vor voice stehen, meine Versuche, das Geschlecht der Stimme über einen Container zu bestimmen, schlugen fehl. Also:

	put female into gender
	speak "Hello World" with gender voice
funktioniert nicht! Es geht nur:
	speak "Hello World" with female voice
Alternativ kann eine Stimme angegeben werden, die im PlainTalk-Ordner oder im Voice-Ordner liegt. <voice> kann wiederum ein beliebiger Container sein, so daß folgendes Code-Frament funktioniert.
	on mouseUp
		put "Hello HyperCard!" into phrase
		put the selectedText of cd button "Stimmen" into speakers
		speak phrase with voice speakers
	end mouseUp
Der Knopf Stimmen ist dabei ein "PopUp-Menü" mit folgenden Einträgen:

Albert, Bad News, Bah, Bells, Boing, Bubbles, Cellos, Deranged, Good News, Hysterical, Junior, Kathy, Pipe Organ, Princess, Ralph, Trinoids, Whisper, Zarvox.

Ich müßte allerdings lügen, wenn ich behaupten würde, daß mich die bisher mit PlainTalk mitgelieferten Stimmen vom Hocker gerissen hätten. Die besten Ergebnisse habe ich immer noch mit male, female oder neuter erzielt. Doch experimentieren Sie ruhig selber ein bißchen. Vielleicht ist ja doch unter diesen Stimmen eine, die gerade zu Ihrer Anwendung paßt.

Die (englische) Aussprache des speak-Befehls ist allerdings verblüffend. Bis auf wenige Ausnahmen lieferte er eine überaus verständliche (mehr amerikaniche denn englische) Aussprache. Verbunden mit der neuter-Stimme, die ein wenig an die Computerstimmen früher Science-Fiction-Filme erinnert, lassen sich interessante Effekte erzielen. Und auch die Aussprache der female-Stimme überzeugt. Sie erinnert mich ein bißchen an Hal, dem berühmten Computer aus 2001 oder an die philosophierende Bombe aus Dark Star.

Ein Hauch von Las Vegas

Abb. 3: Ein "einarmiger Bandit"

Doch nun zu einer ersten Anwendung, die all die verschiedenen Möglichkeiten, mit HyperTalk Geräusche zu machen, enthält. Was ist dazu besser geeignet, als ein Spielautomat aus den Hallen von Las Vegas, ein einarmiger Bandit. Da meistens Obst auf den verschiedenen Gewinnscheiben abgebildet ist, wird solch ein einarmiger Bandit auch Fruit Machine genannt. Die Bildchen sind wiederum als Icons realisiert, dabei wurde strikt darauf geachtet, daß die ID-Nummern eine aufsteigende Reihenfolge bilden (Abb. 4).

Abb. 4: Die Icons der "Obstmaschine"

Auch für die Auszahlungstabelle mußten diese Icons noch einmal herhalten, der Rest der "schreienden" grafischen Ausgestaltung stammt wiederum von dem Background-Art-Stack, der zur mitgelieferten Ausstattung von HyperCard gehört. Zur Funktion des Stacks sind aber nur folgende Knöpfe und Felder notwendig: Einmal die Knöpfe Fenster1, Fenster2 und Fenster3, die die drei Gewinnscheiben simulieren. Dann das PopUp Menü Insert Coin, der Knopf Start und der Knopf PayOff. Das Feld Summe zeigt den verbleibenden Spielbetrag an, das Feld PayOff den aktuellen Gewinn. Dann existiert noch ein verstecktes Feld Phrasen, das 8 Zeilen mit sarkastischen Kommentaren für den Verlierer enthält:
	Oh, Shit!
	I'm so sorry, but you lost this game.
	You're a looser.
	Are you shure, that you know how to play?
	I think, it's better you go home and sleep.
	You're a kiddy and this is a game for man!
	Why didn't you try to play Bridge?
	Another game, another luck.
Der Knopf Insert Coin, der ein PopUp Menü bringt, ist eine Neuerung von HyperCard 2.2. Wie wir weiter oben schon gesehen haben, läßt sich auf das ausgewählte Item mit the selectedText of {cd|bg} button <name> zugreifen.

Solange keine Münze eingeworfen wurde oder der Restbetrag kleiner dem Spielbetrag (2 Cent) ist, bittet HyperTalk mündlich und schriftlich um den Einwurf einer Münze:

	if item 1 of cd fld "Summe" <= 1 then
		speak "Please insert a coin first!" with female voice
		answer "Please insert a coin first" with "Thank You!"
		exit mouseUp
	end if
Der answer-Befehl öffnet eine Dialogbox mit dem Text, der hinter answer in Anführungszeichen steht und den Buttons mit dem Text hinter with. Dabei können maximal drei verschiedene Buttons (durch "or" getrennt) angezeigt werden, der letzte Button ist als Default-Button ausgelegt. Der Inhalt des selektierten Buttons ist in der Systemvariablen it abgelegt, wird aber in unserem Beispiel - da wir sowieso nur einen Knopf benötigen - nicht abgefragt. Bevor die Dialogbox erscheint, bittet jedoch auch eine freundliche weibliche Stimme um den Münzeinwurf. Hierbei können Sie sehen, daß auch speak (wie play) im Hintergrund arbeitet. Noch während die Stimme spricht, erscheint - ein genügend schneller Macintosh vorausgesetzt - die Dialogbox.

Auch am Ende eines Spieles geizen wir nicht mit Geräuschen:

	if payOff = 0 then
		put "Nothing" into cd fld "PayOff"
		put random(8) into choice
		put line choice of cd fld "Phrasen" into phrase
		speak phrase with female voice
	else
		put payOff into cd fld "PayOff"
		play "Trumpets"
		wait until the sound is done
		speak "You won" && payOff && "Cents." with neuter voice
	end if
Hier sehen Sie eine Anwendung für den oben erwähnten Befehl "wait until the sound is done". "Trumpets" ist ein fanfarenähnlicher Sound, den ich auf einer CD mit Public Domain Software gefunden habe. Ohne den Wartebefehl würde der Sprecher mitten in den Fanfarenstoß hineinreden und damit unverständlich werden.

Wichtig für viele Anwendungen ist die Formulierung des speak-Befehls, wie sie nach der Fanfare angewandt wurde. Obwohl payOff eigentlich eine numerische Variable ist, die den Auszahlungsbetrag enthält, läßt sie sich ohne weiteres in den zu sprechenden String einbinden. Die Zahl wird von HyperCard tatsächlich korrekt als Ziffer ausgesprochen. Dies ist der schon häufiger erwähnten Tatsache geschuldet, daß HyperTalk eigentlich nur den String als Datentyp kennt.

Beim Verlassen des Stacks verabschiedet sich das Programm mit Marylin Monroe (Knopf PayOff, vgl. Listing 1). Diesen Sound habe ich ebenfalls auf oben erwähnter CD-ROM gefunden. Mit go recent card wird dafür gesorgt, daß Marylin zu Ende singen darf. Der Stack ist so designed, daß er normalerweise von einem darüberliegenden Startstapel aufgerufen wird. Nachdem der Knopf PayOff betätigt wurde, wird mit go recent card zu diesem Stapel zurückgesprungen. Wurde der Stapel aber direkt aufgerufen, sorgt go recent card dafür, daß der Home-Stapel angesprungen wird. In keinem Fall wird dabei HyperCard verlassen. Würde nämlich mit doMenu "Quit HyperCard" der Stack beendet, würde Marylin ziemlich brutal der Ton abgedreht. Beim Sprung von einen Stapel in den anderen arbeiten die Sound-Befehle speak und play weiter, beim Verlassen von HyperCard natürlich nicht.

Die vielen geschachtelten "if ... then ... else if ... then ... end if" im gleichen Handle zeigen deutlich, daß es in HyperTalk leider keine case-Anweisung, wie Sie sie sicher aus anderen Programmiersprachen kennen, gibt.

Seien Sie sparsam mit Geräuschen

Obige Anwendung ist sicher kein gutes Beispiel für eine Anwendung von Geräuschen und Musik in HyperCard-Stapeln. Um Ihnen alle Möglichkeiten der Tonprogrammierung vorzuführen, habe ich alle Register gezogen und ziemlich übertrieben. Denken Sie bei Ihren eigenen Programmen immer an den klassischen Vers von Wilhelm Busch:

Musik wird störend oft empfunden
Weil stets sie mit Geräusch verbunden.

Seien Sie also sparsam mit Geräuschen. Denken Sie daran, daß der mögliche Anwender Ihres Stapels in einem Großraumbüro sitzt oder das Arbeitszimmer mit seiner Ehefrau teilt. Und während die Ehefrau oder der Kollege angestrengt nachdenkt, ist er sicher nicht sehr erfreut, wenn vom Computer am Nebentisch der Entertainer erklingt. Sehen sie also auf jeden Fall eine Möglichkeit vor, den Ton abzustellen. Und wählen Sie wenige Geräusche, die in der Regel auch nicht aufdringlich sein sollten (von Warntönen einmal abgesehen). Selbst bei den Warntönen gilt: Weniger ist mehr! Abgesehen davon, daß einen auch die ständige Piepserei auf die Nerven gehen kann, habe ich von Computer-Anfängern gehört, die den Ton abgeschaltet hatten, da sie nicht wollten, daß ihre Kollegen merken, wenn sie etwas falsch gemacht haben.

Ein gutes Beispiel für eine sparsame und diskrete Anwendung von Musik und Tönen ist das Kultspiel Myst. Und zur Motivierung für diesen Kurs: Myst ist in HyperCard programmiert! Sie können also durchaus professionelle Anwendungen in HyperCard erstellen.

Computer-Kompositionen

Zunächst eine Vorbemerkung: Im folgenden Stack machen wir intensiv von den Routinen Gebrauch, die wir in der vorletzten Ausgabe für den Stack Business Graph entwickelt haben. Natürlich wollen wir diese Routinen nicht noch einmal schreiben müssen. Wir haben daher zwei Möglichkeiten. Erst einmal können wir natürlich über das Klemmbrett all diese Routinen in unseren neuen Stack kopieren. Das ist aber unvorteilhaft, denn sollten wir einen Fehler entdecken, müssen wir ihn nun schon an zwei Stellen ausbessern, und mit jedem Stack, in den wir unsere Routinen einbauen steigt die Anzahl der Stellen, an der wir die Korrekturen vornehmen müssen. HyperTalk bietet daher die Möglichkeit, mit
	start using <stackname>
den Programmcode eines anderen Stacks mitbenutzen. Der Message-Pfad eines Programms ändert sich dadurch ein bißchen, wie Abbildung 5 zeigt.

Abb. 5: Erweiterter Kommandopfad

Dies ist der vollständige Pfad. Es lassen sich auch mehrere Stacks einbinden, so daß der engagierte HyperTalk-Programmierer im Laufe der Zeit verschiedene Stacks mit immer wieder benötigten Programmodulen fertigstellen kann und sie im Baukastenprinzip für seine Programme verwendet. Sie sollten aus Performance-Gründen jedoch nicht vergessen, mit
	stop using <stackname>
nicht mehr benötigte Stapel aus dem Kommandopfad wieder herauszunehmen.

Da wir nun eine Möglichkeit gefunden haben, unserem Macintosh die (Flöten-) Töne beizubringen, stellt sich natürlich als nächstes die Frage, ob er nicht auch komponieren kann. Darüber haben sich schon viele Künstler und Programmierer den Kopf zerbrochen und teilweise sehr komplexe Algorithmen ausgearbeitet. Doch wie diese Algorithmen auch immer geartet sind, die meisten haben irgend etwas mit dem Zufall zu tun.

Sie können natürlich die Noten einfach auswürfeln. Wenn Sie mit dem Zufallszahlengenerator ein Intervall auswählen und diese Noten spielen lassen, erhalten Sie im Regelfalle sehr seltsam klingende Tonfolgen. Natürlich, wenn Sie den Computer lange genug laufen lassen (so bis etwas über das Ende der Welt hinaus), müssen auch hier mindestens einmal die Anfangstöne der siebten Sinfonie von Beethoven erklingen, dazwischen liegt aber viel Zufallsrauschen. Diese Form des Zufallsrauschens wird in der Physik weißes Rauschen (white noise) genannt und kann in HyperTalk mit folgender einfacher Befehlsfolge erzeugt werden:

	on whiteMusic
		global maxIter
		repeat with i = 0 to maxIter
			put random(16) - 4 into tune
			put random(4) into beat
			playMusic tune, beat
		end repeat
	end whiteMusic
playMusic ist dabei ein Handle, daß die 16 erzeugten Töne einer Tonleiter zuordnet und sie spielt. (Auch hier fehlt dem Programmierer wieder die case-Anweisung, vgl. Listing 2.) Tonhöhe (tune) wie auch Tondauer (beat) werden direkt von Zufallszahlengenerator übernommen. Entsprechend seltsam klingt die dabei zu hörende Musik.

Eine daraus resultierende Überlegung ist die, daß ja die so erzeugten Zufallstöne in keinem Zusammenhang miteinander stehen. In wirklichen Kompositionen dagegen ist mit Sicherheit jeder Ton von seinen Vorgängern abhängig. Eine Zufallsfolge, die abhängig von den vorhergehenden Werten ist, haben wir im Laufe dieses Kurses schon kennengelernt: den Random Walk aus dem Stack Bill-O-Meter. Jeder neu erzeugte Wert wird entweder dem vorherigen zugezählt oder abgezogen. Beim einfachen Random Walk wird entweder eines addiert oder eines subtrahiert. Solch eine Folge entspricht sicher nur wenigen Kompositionen, daher erlauben wir unserem Kompositionsprogramm, mehr als eine Note von der vorherigen abzuweichen:

	on brownMusic
		global maxIter
		repeat with i = 0 to maxIter
			put random(7) - 4 into dist
			add dist to tune
			put random(4) into beat
			playMusic tune, beat
		end repeat
	end brownMusic
Der neue Ton kann bis zu drei Tönen über oder unter dem vorherigen Ton liegen. Im Originalprogramm (Listing 2) haben wir auch noch Vorkehrungen getroffen, die dafür sorgen, daß unsere Komposition nicht den vorgegebenen Rahmen von zwei Oktaven verläßt, das Prinzip ist aber in obigem Programmfragment wiedergegeben. Diese Art von Zufallsbewegungen wird Brownsche Bewegung (Brownian Motion) genannt, nach ihrem Entdecker Robert Brown, der sie im 19. Jahrhundert in einem Wassertropfen unter dem Mikroskop entdeckte. Auch Albert Einstein schrieb eine berühmte Abhandlung über die Brownsche Bewegung. Wir dürfen daher Martin Gardner [1] folgen, der vorschlug, diese Art von Zufallsmusik "Brownsche Musik" zu nennen.

Während uns die "weiße Musik" zu wild vorkommt, erscheint den meisten von uns die "braune Musik" zu eintönig. "Wirkliche" Musik scheint irgendwo dazwischen zu liegen. Und in der Tat, Physiker sprechen von einem Zufallsrauschen, das sie rosa Rauschen nennen, das zwischen diesen beiden Extremen liegt und das viele natürliche Entsprechungen hat. Die Form von Küstenlinien oder Bergketten entspricht ebenso eher einer "rosa" Bewegung, denn einer Brownschen. Und auch die meiste komponierte Musik entspricht, wenn man die Abweichungen der einzelnen Töne untereinander betrachtet, eher dieser Bewegung zwischen den beiden Extremen. Man nennt diese Bewegung auch 1/f-Motion, weißes Rauschen wird dann 1/f0 genannt, die Brownsche Bewegung heißt 1/f2. So natürlich das rosa Rauschen auch zu sein scheint, so schwierig ist es algorithmisch zu erzeugen. Alle bekannten Algorithmen - der bekannteste ist der Midpoint-Displacement-Algorithmus [2, 3] - erzeugen nur Näherungen und sind recht komplex. Wir folgen hier wiederum Gardner, der für kleinere Folgen einen Algorithmus von Voss mitgeteilt bekam, der sich auch leicht in HyperTalk implementieren läßt. Wir geben hier den Algorithmus im HyperTalk-(Pseudo-)Code wieder, die vollständige Implementierung entnehmen Sie bitte dem Listing 2:

	on pinkMusic
		global maxIter
		repeat with i = 0 to maxIter
			put i MOD 7 into j
			if j = 0 then
				put random(6) into blue
				put random(6) into green
				put random(6) into red
				put blue + green + red - 6 into tune
			else if j = 1 then
				put random(6) into red
				put blue + green + red - 6 into tune
			else if j = 2 then
				put random(6) into green
				put random(6) into red
				put blue + red + green - 6 into tune
			else if j = 3 then
				put random(6) into red
				put blue + red + green - 6 into tune
			else if j = 4 then
				put random(6) into blue
				put random(6) into green
				put random(6) into red
				put blue + red + green - 6 into tune
			else if j = 5 then
				put random(6) into red
				put blue + red + green - 6 into tune
			else if j = 6 then
				put random(6) into green
				put random(6) into red
				put blue + red + green - 6 into tune
			else
				put random(6) into red
				put blue + red + green - 6 into tune
			end if
			put random(4) into beat
			playMusic tune, beat
		end repeat
	end pinkMusic
Die Grundidee ist, daß mit drei verschiedenfarbigen Würfeln gewürfelt wird. Dazu werden die Zahlen von Null bis Sieben binär dargestellt. Dies geht bekanntermaßen mit drei Bit. Jedem Bit wird nun eine Würfelfarbe zugeordnet. Dann werden erst einmal alle drei Würfel geworfen. Die aufaddierte Summe ergibt den ersten Ton. Im folgenden werden dann nur diejenigen Würfel neu geworfen, deren zugeordnetes Bit sich ändert. Zur Summenbildung werden aber immer alle drei - auch die liegengebliebenen Würfel - herangezogen. Dadurch entsteht eine Mischung von Abhängigkeit vom vorangegangenen Wurf und statistischer Unabhängigkeit, die ziemlich genau dem rosa Rauschen entspricht. (Genaue Einzelheiten sind in [1] nachzulesen.)

Gardner berichtet außerdem, daß an einem amerikanischen Institut über zwei Jahre lang Versuche gelaufen sind, in denen Personen immer wieder Musiken vorgespielt wurden, die als weißes, rosa oder "braunes" Rauschen erzeugt wurden. Die "rosa Musik" ging dabei eindeutig als Sieger hervor. Sie wurde von der überwiegenden Mehrheit der Versuchspersonen als die angenehmste Musik empfunden.

Doch nun zur Implementierung:

Abb. 6: Zufallsmusiken

All diese drei Zufallsmusiken stellen wir auf einer einzigen Karte dar. Die jeweilige Auswahl erfolgt über das PopUp-Menü "Color of Music". Zur Darstellung der Musik habe ich eine etwas eigenwillige Darstellung gewählt: Die Tonhöhe wird durch die Kurve dargestellt, die Tonlänge durch die Größe der Kreise. Wie oben schon erwähnt, wird ziemlich viel Code aus der vorletzten Folge dieses Kurses wiederverwendet. Der Stack selber enthält daher folgende zwei Handles:
	on openStack
		start using "Business Graph"
	end openStack

	on closeStack
		stop using "Business Graph"
	end closeStack
Der gesamte restliche Programmcode ist hinter dem Button "Play Music" verborgen (Listing 2). Außerdem habe ich noch zwei zusätzliche Sounds, Saxophone und Choir (wieder aus der schon zweimal erwähnten CD-ROM) eingebunden. Ich möchte allerdings nicht verhehlen, daß meiner Meinung nach das Instrument Flute das beste Ergebnis bringt. Wird dagegen das "Instrument" Silent gewählt, wird nur die Kurve gezeichnet, ohne daß Töne gespielt werden (das schont manchmal die Nerven).

Und weiter?

Wie der aufmerksame Leser sicher beim Durchlesen des Quellcodes bemerken wird, habe ich ein wenig gemogelt. Zwar wird die Tonhöhe jeweils entsprechend des gewählten Zufallsrauschens erzeugt, die Tondauer ist aber immer als weißes Rauschen programmiert. Der geneigte Leser ist daher aufgefordert, zur Übung die Tondauer der Farbe des Rauschens anzupassen. Außerdem könnten Sie eine Notendarstellung programmieren. Das dazu notwendige Rüstzeug hat Ihnen (hoffentlich) dieser Programmierkurs bisher vermittelt. Drittens ist es für musikalisch gebildete Leser ein leichtes, die Funktion scaleMusic so abzuändern, daß andere Tonarten und Skalen als die C-Dur Tonleiter zum Klingen kommen. Molltonleitern, Blues-Skalen, pentatonische Tonleitern oder auch die sogenannte Zigeunertonleiter produzieren ebenfalls interessante Melodien.

Und wer das Gebiet besonders interessant findet, der sei auf die Aufsätze von Pickover in [4] und [5] hingewiesen. Er berichtet dort u.a. über japanische Forscher, die Gensequenzen hörbar machen. Die einzelnen Bausteine G, C, T und A werden dort z.B. auf d, e, g und a abgebildet, eine Skala, die Gen-Musik ähnlich der koreanischen, japanischen oder mongolischen Musik liefern soll. Andere Mappings wurden von den Forschern ebenfalls untersucht. Die Abbildung von G, C, T, A auf c, d, e, g soll eine "stabile und optimistische" Tonfolge liefern, wie sie in der westlichen und chinesischen Volksmusik üblich sei, eine Abbildung auf e, g, a, b wiederum produziere sentimentale Töne wie in der indonesischen Musik und der Musik von Okinawa. Die Programmierung ist recht einfach und entsprechende Gensequenzen finden Sie in den schon erwähnten Büchern von Pickover ebenso wie in vielen Lehrbüchern der modernen Biologie.

Die japanischen Autoren der obigen Versuche berichten, daß sie zur Erzeugung der Töne entweder den "amerikanischen" Macintosh mit HyperCard benutzt haben oder den "deutschen" (sic!) Atari samt MIDI-Equipment. Das wird viele der Leser, die vermutlich ebenso wie ich über den Atari zum Apple gestoßen sind, ebenso freuen wie auch ins Bewußtsein rufen, was HyperCard zur "richtigen" Musik- und Multimedia-Maschine noch fehlt: Eine einfache Möglichkeit via HyperTalk MIDI-Befehle abzusetzen und insbesondere QuickTime Musical Instruments direkt aus HyperCard anzusprechen. Aber vielleicht dürfen wir ja auf HyperCard 3.0 hoffen?

Literatur:

[1] Gardner, Martin: Fractal Music, Hypercards and More ... Mathematical Recreations from Scientific American Magazine, New York (W.H. Freeman and Company) 1992

[2] Peitgen, Heinz-Otto; Saupe, Dietmar (Eds.): The Science of Fractal Images, New York (Springer-Verlag) 1988

[3] Scholl, Reinhard; Pfeiffer, Olaf: Natur als fraktale Graphik. Stochastische Fraktale und L-Systeme mit Turbo Pascal, München (Markt & Technik) 1991

[4] Pickover, Clifford A.: Mazes for the Mind: Computers and the Unexpected, New York (St. Martin's Press) 1992

[5] Pickover, Clifford A. (Ed.): The visual Display of Biological Information, Singapore (World Scientific Pub) 1995


previous Page home toc next Page

This pages need no frames
This site is edited with Radio UserLand, the first personal Web Application server for Windows and Macintosh. © 1996 - 2001 by Jörg Kantel
Last modified: JK, 04.09.2001; 20:33:30 Uhr
email:joerg@kantel.de
This page is best viewed with a computer and a monitor

Site Meter