Kann man mit Mathcad Musik machen?
Diese Frage stellte ich mir, nachdem ich die Ausstellung „Musik und Mathematik“ im L’Agora besucht hatte, einem Museum in der Stadt der Künste und Wissenschaften hier in Valencia, Spanien. Die Stadt der Künste und Wissenschaften ist ein futuristischer Komplex aus Museen und Veranstaltungsorten – so futuristisch, dass er für mehrere Drehorte auf Coruscant in der Disney-Star-Wars-Serie „Andor“ genutzt wurde.
Da ich mich seit mehreren Jahren an der Mathcad Community Challenge beteilige, musste ich mir diese Ausstellung einfach ansehen. Dort erfuhr ich von dem musikalischen Würfelspiel, das Wolfgang Amadeus Mozart zugeschrieben wird. Das Spiel generiert anhand von Würfelwürfen ein Menuett. Das Menuett umfasst 16 Takte. Für jeden Takt gibt es 11 verschiedene musikalische Arrangements, die den Werten der gewürfelten Augen entsprechen – von „Snake Eyes“ (2) bis „Boxcars“ (12). Man setzt die Takte entsprechend den Würfelergebnissen zu einer neuen Komposition zusammen. Das ergibt über 45 Billiarden verschiedene musikalische Kombinationen!
Könnte ich dieses Spiel in Mathcad nachbilden? Ich wusste es nicht, aber es würde sicher Spaß machen, es zu versuchen.
Die Vorbereitung
Ich wusste aus der Registerkarte „Funktionen“ in Mathcad Prime, dass man das WAV-Audioformat lesen und beschreiben kann. Verschiedene Noten haben unterschiedliche Frequenzen. Die Noten werden zu einem bestimmten Zeitpunkt für eine bestimmte Dauer gespielt. Theoretisch sollte ich, wenn ich die Original-Noten finden könnte, in der Lage sein, jede der 176 WAV-Dateien zu erstellen.
Ich suchte online nach Mozarts Noten. Das machte mir das Leben um einiges leichter: Ich fand Kevin Waynes Seite auf der Website der Stanford University zu einem Programmierwettbewerb, die eine ZIP-Datei mit WAV-Dateien für Klavier, Flöte, Klarinette und sogar die Mbira aus Simbabwe enthält.
Anmerkung der Redaktion: Wenn Sie die Dateien über die Schaltfläche oben im Blog herunterladen, erhalten Sie eine ZIP-Datei mit Ordnern für jedes der Instrumente. In jedem Ordner befinden sich die WAV-Sammlungen sowie das PTC Mathcad Prime 12-Arbeitsblatt.
Bevor ich mein Arbeitsblatt erstellte, musste ich meine Kenntnisse zu drei grundlegenden Aufgaben in Mathcad auffrischen: Zufallszahlen generieren, WAV-Dateien lesen und schreiben sowie Matrizen stapeln.
Erstellung der Arbeitsblätter
An einem Samstagmorgen machte ich mich daran, ein Arbeitsblatt zu erstellen, das auf „Brute-Force“-Weise Musik erzeugte. Es erfüllte folgende Aufgaben:
- 16 Mal zwei Zufallszahlen mithilfe einer Bereichsvariablen und der Funktion rnd() generieren.
- Mithilfe von Zeichenfolgenfunktionen bestimmen, welche WAV-Dateien eingelesen werden sollen.
- Die WAV-Dateien in einer neuen Matrix zusammenführen.
- Erstellen eines Dateinamens mit einer Zufallszahl.
- Schreiben der Matrix in die Datei.
Überraschenderweise hat es auf Anhieb funktioniert! Ich konnte auf die resultierende Datei doppelklicken und etwas von Mozart abspielen.
Allerdings gab es zwei Dinge, die ich an meinem Brute-Force-Ansatz als unelegant empfand. Beim Öffnen der Arbeitsmappe wurde ein neues Menuett erstellt. Um ein weiteres Menuett zu generieren, musste ich in der Multifunktionsleiste auf den Befehl „Neu berechnen“ klicken. Ich wollte, dass der Benutzer auf eine Schaltfläche klicken kann, um neue Musik zu generieren. Außerdem wollte ich etwas Besseres als eine Zufallszahl, um einen eindeutigen Dateinamen zu generieren. Schließlich garantiert eine zufällige sechsstellige Ganzzahl keinen eindeutigen Dateinamen.
Zweiter Versuch
Nach ein paar Wochen beschloss ich, mich zunächst mit dem Problem der eindeutigen Dateinamen zu befassen. Ich wollte keine Zufallszahl, sondern unbedingt einen Zeitstempel im Dateinamen. Bei meiner sonstigen Arbeit mit Mathcad hatte ich herausgefunden, dass es eine time()-Funktion gibt. Diese gab jedoch nicht das Datum und die Uhrzeit in der uns bekannten Form zurück. Sie gibt die Anzahl der Sekunden seit dem 1. Januar 1970 zurück, auch bekannt als „Unix-Epoche“.
Bei der Suche in der PTC-Wissensdatenbank stieß ich in der PTC-Community auf eine Diskussion zur „time()“-Funktion. Darin war ein Mathcad-15-Arbeitsblatt mit einer Sammlung von Programmen enthalten, die nützliche Informationen zum aktuellen Datum lieferten.
Ich habe das Arbeitsblatt über den in Mathcad integrierten Konverter laufen lassen. Ich fand ein Programm, das das Datum ausgab, und habe es an mein bevorzugtes Format angepasst. Ich habe ein neues Arbeitsblatt erstellt, um mithilfe der Funktion „time()“ die Uhrzeit zu berechnen. Mit der Funktion „Arbeitsblatt einbinden“ habe ich diese beiden Arbeitsblätter in mein neues Mozart-Arbeitsblatt geladen. Nun wurde ein eindeutiger Dateiname mit einem Zeitstempel generiert. Ein Problem gelöst … dachte ich zumindest.
Dritter Versuch
Nun war es an der Zeit, ein erweitertes Eingabeelement in Form einer Schaltfläche zu erstellen, mit der der Benutzer würfeln kann. (Übrigens war eine meiner ersten Ideen, den Benutzer 16 Mal würfeln zu lassen. Davon habe ich aber schnell Abstand genommen.)
Es war schon eine Weile her, dass ich in Mathcad Prime Schaltflächen verwendet hatte. Ich kramte das Arbeitsblatt hervor, das ich in meinem Kanalvideo verwendet hatte. Ich hatte völlig vergessen, dass ich eine Schaltfläche geschrieben hatte, um das Würfeln in „Dungeons and Dragons“ zu simulieren! Wieder einmal wurde mir der Großteil der Arbeit abgenommen – diesmal von mir selbst in der Vergangenheit. Diese Schaltfläche nutzte die JScript-Funktion Math.random(). JScript-Funktionen werden in dieser Geschichte noch öfter auftauchen.
Erweiterte Steuerelemente in PTC Mathcad Prime
Dieser Ressourcen-Blog enthält Arbeitsblätter zum Herunterladen für jedes Steuerelement.
Jetzt herunterladenIch musste herausfinden, wie ich eine „for“-Schleife in die Schaltfläche einprogrammieren (um den Würfel 16 Mal zu werfen) und als Ergebnis eine Matrix ausgeben konnte. Wieder einmal durchsuchte ich die PTC-Wissensdatenbank. Ich nutzte sowohl die Mathcad-Hilfe als auch einige Arbeitsblätter zu den verschiedenen fortgeschrittenen Eingabesteuerungsklassen.
Die Schaltfläche funktionierte! Allerdings stellte ich fest, dass ich den Dateinamen nicht mit dem Zeitstempel aktualisieren konnte, wenn der Benutzer auf die Schaltfläche klickte. Zurück ans Reißbrett.
Abschließendes Arbeitsblatt (vorläufig)
In einer meiner ursprünglichen Ideen für das Arbeitsblatt wollte ich, dass der Benutzer zweimal auf eine Schaltfläche klickt – einmal, um den Würfel zu werfen, und dann, um einen Dateinamen zu generieren. Vielleicht sollte ich auf diese Idee zurückkommen. Dann dachte ich mir: Wenn JScript einen Zufallszahlengenerator hat, dann hat es doch sicher auch eine Zeit- und Datumsfunktion, oder?
Tatsächlich hat es das. Ich programmierte eine Schaltfläche, die das Datum abrief, die einzelnen Teile von Datum und Uhrzeit extrahierte und eine Zeichenkette als Dateinamen ausgab. Ich schrieb sogar meine eigene Funktion, die Monat, Tag, Stunde, Minute und Sekunden in zweistellige Zahlen umwandelte und bei Bedarf eine führende Null hinzufügte. (Da ich kein Programmierer bin, war ich ziemlich stolz auf mich.)
Mit den beiden Schaltflächen war mein Arbeitsblatt fertig. Ich war zufrieden.
Anmerkung der Redaktion: Die Skriptsprachen für die erweiterten Steuerelemente von Mathcad Prime sind VBScript, JScript und Python. JScript hat denselben Ursprung wie JavaScript, und Dave hat für sein Projekt nach JavaScript-Funktionen gesucht, die zufällig auch mit JScript funktionierten. Allerdings sind JavaScript und JScript hinsichtlich ihres Funktionsumfangs nicht vollständig identisch. Ihre eigenen Erfahrungen können davon abweichen.
Was habe ich gelernt?
Wenn Sie den Umgang mit Mathcad Prime erlernen möchten, ist es hilfreich, an Projekten zu arbeiten, die Ihnen etwas bedeuten. Formulieren Sie Ihre eigenen Anforderungen und überlegen Sie sich, wie Sie diese umsetzen können. Und vor allem: Haben Sie Spaß dabei.
PTC stellt zahlreiche Ressourcen zur Verfügung, die dir bei deinen Projekten in Mathcad Prime helfen. Dazu gehören die Knowledge Base, die Hilfe und die PTC Community. Nutze sie!
Außerdem habe ich gelernt, dass es sich lohnt, bei der Arbeit mit Mathcad Prime die Augen offen zu halten. Es gibt eine ganze Reihe von Befehlen und Funktionen, auf die ich in der Vergangenheit schon gestoßen bin, die ich aber selbst nie verwendet habe. Das Zusammenführen all dieser Einzelteile hat das Arbeitsblatt erst möglich gemacht.
Möchtet ihr ein wenig damit experimentieren, mit Mathcad Mozart-Musik zu erstellen? Ladet euch das fertige Arbeitsblatt mit den Instrumentendateien herunter, das ihr oben in diesem Artikel findet. Ich habe meinen Arbeitsprozess außerdem in einer YouTube-Playlist festgehalten, falls ihr euch die Entstehung der Arbeitsblätter ansehen möchtet.
Ich hoffe, das inspiriert euch dazu, ein paar tolle und interessante Projekte in Mathcad Prime zu realisieren!