Spiel, Satz und Sieg
Brahms – Notensatz und Sequencer
Brahms ist erweiterbar
Der große Vorzug dieser Architektur liegt in der Erweiterbarkeit von Brahms. Es können Erweiterungen (Addons) geschrieben und kompiliert werden, ohne die gesamte Brahms-Applikation neu zu übersetzten – sogar ohne sie neu zu starten. Ein übersichtliches API bietet eine einfache Schnittstelle, über die ein Musikstück mit allen seinen Komponenten bearbeitet werden kann.
Die drei Funktionen Quantize, QuantizeLength und FixedLength (dürfen in keinem Sequencer fehlen) sind als solche Erweiterungen implementiert. Wie andere Operationen sind auch sie umkehrbar, es ist also eine undo-Methode enthalten. Die zurzeit vorhandenen Erweiterungen sind in Tabelle 2 zusammengestellt.
Tabelle 2: Erweiterungen für Brahms
| Name | Kategorie | Funktion |
|---|---|---|
| QuantizeAll | Quantize | Rundet die Startpositionen und die Länge von Noten und anderen Ereignissen. |
| QuantizeLength | Quantize | Rundet die Länge von Noten. |
| FixedLength | Quantize | Setzt die Notenlänge auf einen konstanten Wert, der im Editor gewählt wird. |
| Dump | Testing | Gibt den gesamten Inhalt des Musikstücks auf der Standardausgabe aus. |
| Debug | Testing | Gibt weitere Information an die Standardausgabe weiter. |
| ExtractLyrics | Output | Gibt die den Noten zugeordneten Texte (Lyrics) aus. |
| Stretch | Edit | Multipliziert jede Startposition und jede Länge mit Zwei. |
| Revert | Edit | Kehrt die Zeitrichtung eines Musikstücks um. |
| EarTraining | Harmony | Trainiert Intervalle und Akkorde (beliebig ausbaufähig). |
| Parallels | Harmony | Sucht aus einem Musikstück Quint- und Oktav-Parallelen. Legt dazu eine neue Tonspur an und füllt sie mit Kopien der verbotenen Noten. Verdeckte Parallelen werden (durch Setzen des MIDI-Kanals) eingefärbt. Stellt eine große Hilfe bei Eigenkompositionen und bei der Analyse von Werken dar. |
| Riemann | Harmony | Ordnet einem Musikstück zu verschiedenen Zeiten die passenden Harmonien zu. |
Die
Riemann-Erweiterung ist vorerst noch ein Prototyp und nicht vollständig implementiert. Bemerkenswert an diesem Modul ist, dass es zur Berechnung der Harmonien nicht nur das Tonmaterial zum jeweiligen Zeitpunkt (vertikal) heranzieht, sondern zusätzlich den musikalischen Kontext (horizontal) beachtet. Ein Klang, der aus Fis und C besteht, ist im G-Dur Kontext vermutlich eher als D-Dur mit kleiner Septime aufzufassen und seltener als vermindertes Fis.
Darüber hinaus zeigt die Riemann-Erweiterung, dass Brahms-Erweiterungen neue Tonspur-Typen (Harmony, durch ein Herz symbolisiert) und neue Ereignis-Typen (RiemannEvents) einführen können. Die Ereignisse werden im unteren Teil des Editors angezeigt. Das Auswahl-Menü, das sonst die Anschlagswerte als einzigen Eintrag enthält, bietet nun auch die Riemann-Werte an (Abbildungen 17 und 18).
Eine Erweiterung wird entweder als Option beim Aufruf von Brahms angegeben
brahms -a dump -a riemann -a stretch
oder zur Laufzeit geladen (Menüpunkt File/Load Addon...). Die zu ladenden Bibliotheken befinden sich nach der Installation im Verzeichnis $KDEDIR/lib und beginnen mit libBrahmsAddon. Ist eine Erweiterung erfolgreich geladen, findet sie sich in den Kontextmenüs des Musikstücks, der Tonspur, des Abschnitts oder im Auswahl-Menü der Editor-Werkzeugleiste wieder (Abbildung 19).
Selbst ist der Musiker
Für diejenigen, die selbst eine Erweiterung schreiben möchten, bietet sich die gut dokumentierte Dump-Erweiterung als Vorlage an. In den Quellen von Brahms befindet sich die Erweiterungen im Verzeichnis brahms/addons. Außerdem ist die API-Dokumentation sehr hilfreich. Sie wird mit Brahms installiert, ist aber auch auf der Brahms-Homepage zu finden.
Ein kleines Beispiel zeigt, wie wenig Arbeit eine solche Erweiterung macht. Neben der Deklaration einiger Formalitäten wie Kontext, Kategorie und Namensgebung besteht der wesentliche Teil der Revert-Erweiterung aus der song()-Methode (siehe Listing 1).
Listing 1
Revert-Erweiterung
01 void Revert::song(Song @L: * song) {
02 Position endpos = (new SongIterator(song))->endPosition();
03 int sz = song->size();
04 for (int i=0; i<sz; i++) {
05 Track @L: * track = (Track @L: *) song->get(0); if (track==0) return;
06 Part @L: * part = (Part @L: *) track->first(); if (part==0) return;
07 Track @L: * newTrack = song->createTrack(track->isA(),0);
08 newTrack->setName(strdup(track->name()->getValue()));
09 if (track->isA()==SCORETRACK) {
10 ((ScoreTrack@L: *) newTrack)->setProgram(track->program());
11 ((ScoreTrack@L: *) newTrack)->setChannel(track->channel());
12 }
13 Part @L: * newPart = new Part(newTrack);
14 newPart->setKey(part->key()); newPart->setClef(part->clef());
15 // ——————————————————–
16 for (Iterator i = Iterator(track); !i.done(); i++) {
17 Event @L: * event = (Event@L: *) (@L: *i)->copy();
18 newPart->setStart(event, endpos - i.part()->end(event));
19 newPart->add(event);
20 }
21 newTrack->add(newPart); song->add(newTrack);
22 song->remove(track); delete track;
23 }
24 }
Zunächst ermittelt das Modul die Endposition des Musikstücks. Die äußere Schleife führt durch alle Tonspuren (Zeile 4), die innere Schleife iteriert durch alle Ereignisse (Zeile 16). Die Position eines jeden Ereignisses wird von der Endposition abgezogen und dadurch in der Zeit gespiegelt. Schließlich werden nicht die Ereignisse selbst, sondern Kopien davon bearbeitet und in einer neuen Tonspur mit einem neuen Abschnitt abgelegt (Zeile 19). Sobald eine Spur bearbeitet ist, wird in Zeile 22 das Original entfernt.
Installation
Auf der Homepage von Brahms ist das Quell-Paket brahms-1.02-kde2.tgz für KDE 2 verfügbar. Folgende Befehle entpacken, konfigurieren und installieren das Programm:
tar xzvf brahms-1.02-kde2.tgz cd Brahms ./configure make su make install
Der letzte Schritt muss als root-User durchgeführt werden (daher das su-Kommando). Auf einigen Distributionen (zum Beispiel SuSE 7.3) ist bei der Konfiguration eine Option nötig, der dritte Schritt ändert sich dann:
./configure --prefix=/opt/kde2
Links
Glossar
Doppelte Alteration
Das doppelte Alterieren ändert einen Ton um zwei Halbtonschritte. Dabei ist harmonisch betrachtet beispielsweise ein doppelt erhöhtes G ebenso wenig ein A, wie ein Fis ein Ges ist. Erst mit der wohltemperierten Stimmung, die in der Computermusik und bei Tasteninstrumenten heute üblich ist, entfallen diese Unterschiede. Folglich ist weder die enharmonische Verwechslung (Fis/Ges) noch die doppelte Alteration Gegenstand des MIDI-Formats. MIDI beschreibt ausschließlich den Klang, nicht aber die Darstellung.
Mixdown
Mischt die Noten aus mehreren Spuren in einer einzelnen Spur zusammen.
aRts-builder
Der aRts-builder ist Bestandteil des aRts-Projekts und dient zur Erstellung von synthetischen Instrumenten. Verschiedene Module, etwa Effekte, Ein- und Ausgänge, lassen sich mit einer grafischen Oberfläche einfach zusammensetzen und ausführen.
Hugo Riemann
Der Musikforscher Riemann (1849-1919) entwickelte eine Funktionenlehre, die besagt, dass jedes akkordische Gebilde auf eine der drei Funktionen Tonika, Subdominante und Dominante zurückgeführt werden kann und dass jeder dieser Dreiklänge durch einen seiner Einzeltöne vertreten werden kann.



