Präambel, Stimmen und Instrumente
Die Präambel besteht aus allen Zeilen vor der ersten Taktdefinition, das heißt, vor der ersten Dreistrichfolge (
---
).
Folgende Schlüssel haben spezielle Bedeutung, andere Schlüssel können jedoch beliebig vergeben werden als Metadaten zum Score (title, composer, interpreter, album, etc.):
stage
: definiert alle Stimmen, denen in den Taktdefinitionen Noten zu Offsets und zu benannten Figuren zugewiesen werden können.
solo
anstelle von stage
enthält eine Instrumentspezifikation (oder einen Pfad zu einer extern gespeicherten Spezifikation), das zugleich die einzige Stimme bildet. In den Taktdefinitionen werden direkt die Offsets und die benannten Figuren angegeben, oder gleich die Noten an Offset 0.
room
ist die Raumspezifikationen, falls die Töne verhallt werden sollen. scripts/sompyle
muss dafür zusätzlich mit --room
ohne Argument aufgerufen werden. Mit Argument oder ganz ohne diese Angabe wird eine eingebettete Raumdefinition ignoriert.
measures
, enthält die Takteigenschaften, mit der jeder _meta
-Schlüssel vervollständigt wird. Sie gelten also für alle Takte, die diese Eigenschaften nicht selber definieren.
articles
: stimmübergreifende Noteneigenschaften
tuning
: Angaben zur Stimmung, zu besonderen, also nicht vordefinierten Skalen und Akkordtypen.
instrument label
: Instrumentdefinition für die Stimme label
oder alle Stimmen mit label
anstelle einer Pfadangabe.
Eine Stimmendefinition besteht entweder aus einem dreiteiligen String
voicename: L|R D instrument
oder einem Mapping:
Code:
voicename:
direction: L|R
distance: D
instrument: Pfad oder Name # optional
articles: ... # optional
tuning: ... # optional
voicename
ist ein beliebiger eindeutiger Name, der in den Takten benutzt wird, um sich auf die definierte Stimme zu beziehen.
L|R
und
D
bestimmen die Position der Stimme im Raum. L ist die relative Lautstärke des linken Kanals zum rechten, bzw. R die relative Lautstärke des rechten Kanals zum linken. D gibt den n-ten hinteren Teil zwischen dem Zuhörer und der Raumgrenze an, vor dem die Stimme positioniert ist.
instrument
ist eine optionale Angabe. Fehlt sie, erwartet die Software in der Präambel einen Schlüssel
instrument voicename
mit den Daten, die das Instrument beschreiben. Ist
instrument
ein einfacher Name, etwa "abc", wird stattdessen ein Schlüssel
instrument abc
erwartet. Mehrere Stimmen können dieselbe Instrumentspezifikation verwenden. Enthält der Name Schrägstriche, hängt die Software implizit
.spli
an und sucht nach diesem Dateipfad relativ zu zwei verschiedenen Orten: Im gleichen Pfad wie die Score-Datei und, nachrangig, in dem Verzeichnis
lib/instruments
der Sompyler-Installation. Beginnt die Angabe mit einem Schrägstrich, wird die Angabe als absoluter Pfad behandelt.
Ist die Beschreibung in der Score-Datei eingebettet, so verhindert die Angabe
Code:
instrument voicename:
NOT_CHANGED_SINCE: YYYY-MM-DD HH:MM:SS
wenn das angegebene Datum in der Vergangenheit liegt, dass bereits gerenderte, zwischengespeicherte und weiterhin benötigte Einzeltöne neu gerendert werden.
Bei Instrumentspezifikationen in eigenen
.spli
-Dateien wird das Datum der letzten Änderung der Datei herangezogen.
Variationen
Ein Instrument ohne Variabilität über Notenattribute besteht aus einer Variation, deren Eigenschaften direkt zum Instrumentschlüssel, ggf. nebengeordnet zur Angabe
NOT_CHANGED_SINCE
definiert werden können. Optional können die Eigenschaften zu einem Schlüssel
character
definiert werden. character ist als übergeordneter Schlüssel nötig, sobald Notenattribute ins Spiel kommen, die das Instrument artikulatorische Freiheiten unterstützen lassen sollen. Alle Eigenschaften, die zum Tragen kommen sollen, wenn eine Note keine solchen Attribute nebst
pitch
,
length
und
stress
bestimmt (die aufgeführten sind immer vorhanden), bilden die Standardgruppe an Eigenschaften, die als erstes Listenelement zu definieren ist:
Code:
instrument voicename:
NOT_CHANCED_SINCE: ...
character:
- ... # Standardgruppe
- ATTR: attrname
...
...
Weitere Mappings, aufgeführt als zusätzliche Listenelemente enthalten grundsätzlich die Eigenschaft
ATTR: attrname
, wobei
attrname
ein frei zu wählender Name ist. attrname kann als Eigenschaft einer Note, einer Notengruppe oder eines Artikels verwendet werden:
Code:
- pitch: Eb5
length: 3
chain: ... # optionale Notengruppe
attrname: ... # gilt für Note bzw. falls angegeben, alle Artikel in chain, die nicht mit attrname: false definiert sind
Code:
stage:
voicename:
...
articles:
x:
attrname: ...
Der Wert von
ATTR
,
attrname
, kann erweitert werden durch
=one|two|three|...
(die Zahlwörter sind an der Stelle nur exemplarisch).
Im einfachen Fall, dass dies nicht der Fall ist, muss das Notenattribut den Wert
true
(der YAML-Parser erlaubt auch die Synonyme
yes
und
on
, wobei die Groß/Kleinschreibung hier keine Rolle spielt),
false
(bzw.
no
,
off
) oder einen numerischen Wert besitzen. Hat es einen numerischen Wert, muss die Variation Eigenschaften unter numerischen Schlüsseln aufführen. Gibt es dann in der Variation gibt es einen exakt gleichen Schlüssel, so gelten schlicht die diesem zugeordneten Eigenschaften. Die gelten auch dann, wenn es im konkreten Fall der numerisch kleinste Schlüssel in der Variation ist, der vom Wert des Notenattributs noch unterboten wird; bzw. wenn es der größte Wert ist und der Wert des Notenattributs ist noch größer. Liegt der Wert des Notenattributs zwischen zwei numerischen Schlüsseln in der Variation, werden die Subvariationen gewichtet gemittelt. Als Wichtung beider Subvariationen dient das Verhältnis zwischen der jeweils eigenen Differenz zum Wert des Notenattributs und der Differenz der jeweils anderen Subvariation zum Wert des Notenattributs. Die Summe beider Gewichte ist somit stets 1.
In dem Fall einer
attrname=...|...|...
-Erweiterung werden die Eigenschaften aller in der Liste des entsprechenden Notenattributs angegebenen Variationen, die als Subvariation in diese unter den gleichen Schlüsseln eingehängt sind, übereinandergelegt, und zwar stets in der unter
ATTR
festgelegten Reihenfolge, unabhängig von der Reihenfolge der Werteliste zum Notenattributs.
Jede Variation kann die eigene Ausgestaltung mit untergeordneten Variationen erweitern, die wiederum von anderen Notenattributen abhängig sind. Diese untergeordneten Variationen sind als Liste unter dem Schlüssel
variations
zu definieren.
Eigenschaften einer Variation
Jedes Instrument besteht mindestens aus der
root variation, von der ggf. untergeordnete Variationen Eigenschaften erben.
Layer-Eigenschaften
- A: Attack shape
- S: Decay/Sustain shape
- T: Tail shape, intern wird das angewand zwischen Sustain und Release. Manchmal Prerelease genannt.
- R: Release shape, A/S/T/R Fließkomma-Länge in Sekunden.
- O: sine | square | sawtooth | triangle | noise | slopy
- AM: Amplitude modulation
- FM: Frequency modulation
- FV: Frequency variation shape
- WS: Wave shape
Shape - Polynominalkurven
Die
Länge der zu rendernden Kurve kommt zum Anfang, erkennbar daran, dass sie ein Doppelpunkt vom folgenden trennt. Handelt es sich um eine Fließkommazahl, bezieht sich diese als Faktor auf die Abtastrate, qua Voreinstellung also 44.100 Frames pro Sekunde.
Beginnt die Attack-Kurve folglich mit
0.025:...
so wird der Maximalpegel in einer 40stel-Sekunde erreicht, also in 1103 Frames.
Ist die Länge nicht angegeben, nimmt die Software 1 Einheit an. Bei den Hüllkurvensegmenten ist die Einheit die Sekunde. Wenn sie fehlt, oft bei einer Sustainphase, die den Verlauf einer Sekunde beschreibt. Die Sustainphase wird allerdings stets so gekürzt oder verlängert mit der Steigung des originär letzten Kurvensegments, dass der Klang die Solllänge erreicht. Die Releasephase wird nicht mitgezählt.
Das erste folgende Glied bestimmt, falls in diesem keine zwei Zahlen von einander durch ein Komma getrennt sind, den vertikalen Startpunkt an x=0. Außerdem lässt sich dieses Element erweitern auf zwei Zahlen, die durch ihre Vorzeichen (+/-) getrennt sind. Die erste Zahl gibt den Sockel an, auf den alle y-Koordinaten aufaddiert werden. Die zweite Zahl gibt die Orientierung der Kurve nach oben oder unten an, sowie die Standardausdehnung zur Nulllinie. Beträgt sie etwa 5, so ist jede y-Koordinate der Folgeglieder, die ebenfalls 5 beträgt, effektiv 1,0 – wenn man mal den Sockelbetrag als 0 ansetzt. Jedes Folgeglied mit y=4 wird zu 0,8 normiert, jedes mit y=7 zu 1,4. Beträgt der Sockelbetrag, die erstere Zahl, -3, die zweitere wäre stattdessen zu rechnen (7 + -3) / 5 = 0,8. Ist der Sockelbetrag positiv, wird er auch auf die Standardausdehnung angewendet: (7 + +3) / (5 + +3) = 10/8 = 1,25!
Die nächsten Folgeglieder sind aufgebaut nach dem Schema
x,y(*w|!)
. Auf das Koordinatenpaar x,y kann ein ganzzahliges Gewicht folgen (weggelassen implizit *1), unendliches Gewicht wird durch ein Ausrufezeichen signaliert: An dieser x-Position ist y exakt der nominelle Wert, nähert sich ihm nicht nur an. Im Sinne der Polynomberechnung entspricht das Gewicht der z-Koordinate.
Die Folgeglieder werden miteinander verbunden mit dem Semikolon.
Modulationen
Definitionen von Modulationen sind aufgebaut nach dem Schema
x(f|F)(@label)([Shape]);i:b
. Die rundgeklammerten Teile sind optional. "f" multipliziert die Modulationsfrequenz x mit der Grundfrequenz, "F" dagegen mit der Frequenz des Layers. @label bezieht sich auf die Oszillation, deren Eigenschaften in der Eigenschaftsgruppe "label" definiert ist. i ist der Modulationsindex als Ganzzahl relativ zur Basis b.
Benannte Eigenschaftsgruppen
Layereigenschaften können in beliebiger Zusammenstellung unter beliebigen Namen gruppiert werden. Eigenschaften anderer Gruppen derselben Variation können referenziert werden durch (z.B. Attack)
A: @label
– dies definiert, dass die geltende Attackphase bereits in der Gruppe "label" definiert worden ist. Reziproke und Zirkelbezüge werden als Fehler erkannt. Ist die Gruppe "label" nicht in der aktuellen Variation definiert, wird in der übergeordneten Variation nachgeguckt, und dann in der über-übergeordneten und so weiter.
Eine Gruppe kann den Schlüssel "other" haben. Der Wert ist der Name einer Gruppe, aus der andere definierte Eigenschaften zu beziehen sind.
Werte von O(szillator) werden, wenn sie von einem "@" eingeleitet sind, aus dieser Gruppe übernommen. Von "@@" eingeleitet, wird die Oszillator-Schwingung mit den darin definierten Modulationen AM und FM, mit FV und WS angereichert.
PROFILE
Eigenschaften der Partialtöne oder besser gesagt "Layer" (Synonym in Sompyler-Terminologie: Sympartial), denn Partialtöne sind streng genommen nur Sinus-Schwingungen unter einer Hüllkurve.
Liste von "@label"-Angaben oder Mappings oder beides gemischt. Im ersteren Fall kann vor dem @ oder allein eine Ganzzahl stehen. Der Betrag steht in der Einheit dBFS + 100 und gilt zusätzlich zum Wert, der sich aus der VOLUMES-Kurve oder Liste an der entsprechenden Indexposition ergibt.
Ein Mapping kann ein Schlüssel "match" enthalten. Der Wert von "match" ist entweder eine Ganzzahl oder eine Teilbarkeitsregel nach dem Schema "
mn±
o", das zu lesen ist wie folgt: Eigenschaften gelten für alle Layer, deren Ordnungszahl nach Abzug von o noch größer ist als 0 aber kleiner ist als die Zahl aller Layer (maßgeblich ist die größte ganzzahlige match-Angabe), und ohne Rest teilbar ist durch m. Für alle Listenelemente ohne match-Angabe gilt implizit ein fortlaufendes Inkrement ab dem letzten Element mit ganzzahliger match-Angabe, oder 0. Der Buchstabe "n" wird als solcher erwartet.
Ist in einem Mapping "deviance" bestimmt, beziehen sich alle Eigenschaften auf einen zusätzlichen Layer mit einem Faktor der Grundtonfrequenz, der ausgehend von der Ordnungszahl soundso viele Cent weitere Abweichung von der harmonischen Obertonreihe beträgt – und zwar zusätzlich zu dem Wert, der sich aus dem entsprechenden Index der SPREAD-Kurve/Liste ergibt.
Eine zusätzliche bzw. abgezogene Stärke kann angegeben werden unter dem Schlüssel
V
. Bei vielen Tasteninstrumenten ist jeder 8. Teilton gedämpft. Das Mapping enthält entsprechend zwei Angaben,
match: 8n
und
V: -30
.
Auf alle weiteren Eigenschaften im Mapping eines Listen-Elements vom PROFILE trifft das zu den Eigenschaftsgruppen beschriebene zu.
Ist ein Listenelement als String angegeben, z.B. "2@label", so ist { V: 2, other: "@label" } lediglich das Mapping-Äquivalent.
TIMBRE
Verstärkung und Dämpfung von Partialtönen in Abhängigkeit ihrer tatsächlichlichen Frequenz. Angegeben als Shape (Polynominalkurve(n)). Die Shape-Gesamtlänge bezieht sich auf das abgedeckte Spektrum 0 bis n Hz.
VOLUMES
Angegeben als Liste von Werten (angegeben in der Einheit dBFS + 100) oder als Shape. Im letzteren Fall bezieht sich die ganzzahlige Längenangabe auf die Anzahl der Partialtöne.
MORPH
Ähnlich PROFILE, nur können hier die gesamten Hüllkurven der Layer mit einem Shape multipliziert werden.
Das syntaktische Schema eines Listenelements:
- match (w:)shape
- match: s.o. bei PROFILE
- w: optionales ganzzahliges Gewicht anstelle der Längenangabe eines shapes. Relevant bei der Mischung mehrerer Shapes, deren zugehörige Matches auf die Ordnungsnummer eines Layers zutreffen.
- shape: Die Koordinaten beziehen sich auf die konkreten Gesamtlängen der betreffenen Layer.
SPREAD
Abweichungen von der harmonischen Obertonreihe. Je Layer ein Wert in Cent. Ein Cent ist der 1200. Teil einer Oktave oder ein hundertstel Halbton.
RAILSBACK
Stimmungskorrekturwerte pro Taste eines gedachten Klaviers, jeweils in Cent. Als Liste angegeben. Dabei geben die ersten beiden Werte dieser Liste die Frequenzspanne an, von wo bis wo sie gelten (0 bis 4186). Ist der dritte Wert eine Kurve, wird diese intern in eine Liste von 88 Werten umgewandelt. Sonst werden 88 Ganzzahlen in dieser Liste erwartet.
Wird häufig benötigt, wenn exzessiv von Frequenzmodulationen und SPREAD-Angaben Gebrauch gemacht wird. Die so verursachten Verstimmungen sollten nach Gehör berichtigt werden.
Beispiel
Code:
solo:
FM: 3f[1;1,0];1:2
PROFILE:
- match: 1
V: 100
A: 0.02:1,70;2,75;4,80;8,85;16,90;32,95
S: 0.75:100;1,93;3,88;5,85
R: 0.3:5;2,3;3,0
- [92, 95, 93, 87, 85, 81, 75]
- match: 9
V: 71
A: 0.025:1,3;2,4
S: 0.75:100;1,93;3,83;5,82
R: 0.3:4;2,4;3,0
FV: 10;0,5;4,3;5,7
O: slopy
---
Cs3
Anhang anzeigen mellowday.mp3
Code:
stage:
left: 1|0 0 foo
right: 0|1 0 foo
instrument foo:
character:
- FM: 3f[1;1,0];1:2
PROFILE:
- match: 1
V: 100
A: 0.025:1,3;2,4
S: 0.75:100;1,93;3,88;5,85
R: 0.35:3;2,3;3,0
- [92, 95, 93, 87, 85, 81, 75]
- match: 9
A: 0.02:1,70;2,75;4,80;8,85;16,90;32,95
V: 71
S: 0.75:100;1,93;3,83;5,82
R: 0.25:4;2,4;3,0
FV: 10;0,5;4,3;5,7
O: triangle
- ATTR: fiber
0:
MORPH:
- 3n 4:10;1,11;3,10
- 1 1;1,1
- 9 1;1,1
100:
MORPH:
- 2n+1 5:8;4,7;5,8
- 1 1;1,1
- 9 1;1,1
articles:
o: { fiber: 36 }
f: { fiber: 90 }
---
left: Cs3 o
---
right: Cs3 f
---
left: Cs3 o
right: Cs3 f
Anhang anzeigen twotones.mp3