Startseite » Uncategorized (Seite 2)
Archiv der Kategorie: Uncategorized
Magdalena Preißler und Undine Unger: Guten Blutes
Im (Corona-)Sommersemester 2020 haben Leipziger Studierende darüber nachgedacht, was Musik in der Werbung ist, wie sie funktioniert und was sie aussagt. Dem besonderen Semester mit E-Learning entsprechend, sollten die Ergebnisse auf besondere Weise präsentiert werden, also in einem Format abseits der akademischen Hausarbeit. Blog und VLog, Erklärvideo und Lernplattform, Comic und Hörbuch, alles war erlaubt. – Hier ist das Ergebnis von Magdalena Preißler und Undine Unger zur Musik in der Werbung für Hygieneprodukte.
Magdalena Preißler und
Undine Unger
HMT Leipzig
Guten Blutes
Teil 1
Teil 2
Teil 3
Johanna Merker: Musik in den „Allianz“-Werbeclips aus den 1980er Jahren
Im (Corona-)Sommersemester 2020 haben Leipziger Studierende darüber nachgedacht, was Musik in der Werbung ist, wie sie funktioniert und was sie aussagt. Dem besonderen Semester mit E-Learning entsprechend, sollten die Ergebnisse auf besondere Weise präsentiert werden, also in einem Format abseits der akademischen Hausarbeit. Blog und VLog, Erklärvideo und Lernplattform, Comic und Hörbuch, alles war erlaubt. – Hier ist das Ergebnis von Johanna Merker zur Musik der „Allianz-Versicherungen“.
Johanna Merker
HMT Leipzig
Musik in den „Allianz“-Werbeclips aus den 1980er Jahren

Link zur Lernplattform: https://docs.google.com/presentation/d/1pBB_UHrYeQ8pDlQGFWoBmB-5q-H_-IHkBGSVhGc7nBA/edit#slide=id.gc6f980f91_0_10
Anna Tunger: Gleich und doch nicht gleich
Im (Corona-)Sommersemester 2020 haben Leipziger Studierende darüber nachgedacht, was Musik in der Werbung ist, wie sie funktioniert und was sie aussagt. Dem besonderen Semester mit E-Learning entsprechend, sollten die Ergebnisse auf besondere Weise präsentiert werden, also in einem Format abseits der akademischen Hausarbeit. Blog und VLog, Erklärvideo und Lernplattform, Comic und Hörbuch, alles war erlaubt. – Hier ist das Ergebnis von Anna Tunger zur Musik von Airlines.
Anna Tunger
HMT Leipzig
Gleich und doch nicht gleich
Betrachtet man Werbungen nationaler Airlines (also Flugzeuggesellschaften, welche sich in Besitz eines Staates befinden oder befanden) aus den letzten Jahrzehnten, so findet man auf einschlägigen Videoplattformen eine Menge in ihrer Machart, Strategie und Originalität teils sehr unterschiedliche Clips.
Gerade in den letzen 15 Jahren spielten viele dieser Werbungen offensiv mit nationalen Klischees, sodass sich zuerst die Frage aufdrängt, warum gerade ein Produkt, welches im wahrsten Sinne des Wortes auf Internationalität angelegt, mit solch einer Strategie beworben wird, und auf welchen Ebenen sich dies zeigt. Wie eine nationale Flugzeuggesellschaft ihr Land in der Werbung darstellt (und damit auch andere), ist eine nähere Betrachtung für sich wert.
Bei der Materialsuche fiel dann aber ein Phänomen auf, das im folgenden aus einem etwas anderen Blickwinkel dargestellt werden soll: Drei Airlines nutzten im Abstand von einigen Jahren oder gar Jahrzehnten das gleiche Musikstück.
Betrachten wir zuerst eine Werbung von El Al aus dem Jahr 2013…
…und eine aus dem Jahr 2015:
Beide sind mit einem Ausschnitt aus dem israelischen Popsong תמיד יחכו לך (tamid jechaku lecha: „Sie werden immer auf dich warten“) von Lea Schabbat[1] unterlegt, das erste Mal gesungen von Liran Danino, das zweite Mal von Yuval Dayan. Bis auf das Geschlecht des_der Sänger_in_s ändert sich musikalisch nichts, charakterlich bleibt es bei der typischen Spannung der aufbauenden, dramatisch-sehnsüchtigen Steigerung, die zum Höhepunkt (der Verkündung der Werbebotschaft) hinführt und sich am Ende wieder beruhigt.
Auch bei den folgenden Clips wird sich zeigen, dass die Wirkung der Musik in engem Zusammenhang mit der Botschaft steht, gerade dann, wenn im Gegensatz zu diesen beiden zwei unterschiedliche Arrangements verwendet werden.
Hier preist El Al zweimal etwas Neues an: neue Flugzeuge in der Flotte und eine neue Flugverbindung nach Boston. Zu beidem passt die prominent platzierte Liedzeile „sie warten auf dich!“ am Ende. Der Song liefert dabei nicht nur die erwartungsvolle Atmosphäre, sondern spricht den Adressaten persönlich an: Nur für „dich“ machen wir das alles! Im Sinne von „Never change a winning team“ bietet es sich also geradezu an, das Lied zwei Jahre später noch einmal zu verwenden.
Unfreiwillig komisch wirkt nur die Liedzeile כל מטוס שטס בשמיים (kol matoss, sche-tass ba-schamajim: „jedes Flugzeug, dass am Himmel fliegt“), wo doch in beiden Videos kein Flugzeug den Boden verlässt, von der Endcard abgesehen.
Deutlich spannender sind zwei Werbungen von British Airways. Die erste stammt aus dem Jahr 1989:
Die hier verwendete Musik ist „Aria“ von Yanni, einer Bearbeitung des Blumenduetts aus der Oper „Lakmé“ von Léo Delibes.
Diese Werbung sticht durch ihre ungewöhnliche Bildebene heraus – das Element Flugzeug taucht überhaupt nicht auf! Stattdessen werden aufeinanderzukommende und sich begrüßende Menschen gezeigt. Ikonisch tauchen ein lachendes Gesicht und die Weltkugel auf, welche von den Menschen gebildet werden. Die Botschaft wird am Ende explizit formuliert: British Airways bringt Menschen der ganzen Welt zusammen. Das Musikzitat aus einer populären französischen Oper, arrangiert von einem griechischen „Weltmusik“-Komponisten, unterstreicht diese Aussage. Die durch die vielen synthetischen Klänge beinahe abstrakt wirkende Bearbeitung korrespondiert dabei mit dem kubistisch anmutenden Gesicht.
Aus dem Jahr 2006 stammt eine weitere Werbung von British Airways, die den Refrain des Blumenduetts verwendet:
Anstatt der mit vorrangig synthetischen Klängen produzierten Yanni-Variante, die dadurch und durch die „Triolisierung“ der Melodie sehr statisch wirkt, liegt hier eine fast rein orchestrale Bearbeitung vor. Die Präsenz des Schlagwerkes ist aber ähnlich hoch. Besonders durch die Streicher und den sparsamen, auf dem Höhepunkt eingesetzten Vokalise-Gesang wirkt diese Fassung viel sehnsüchtiger, enthält viel mehr Steigerung.
Warum British Airways 17 Jahre später das gleiche Musikstück verwendet, lässt sich leicht mit der Popularität des Clips von 1989 erklären (vgl. die Kommentare unter dem YouTube-Video): Wer diesen kennt, hat ihn auch bei der neuen Werbung im Hinterkopf. Und auch die Botschaft scheint auf den ersten Blick gleich: British Airways bringt Menschen zusammen. 1989 wird das geradezu plakativ global dargestellt: alle Menschen auf der ganzen Welt. 2006 geschieht dies aber auf einer sehr viel persönlicheren Ebene, eine Familie fliegt von zwei verschiedenen Punkten der Welt zu einem dritten in den Urlaub. So einfach ist es also doch nicht: Wie die Musik beider Clips sind auch die Aussagen nicht völlig deckungsgleich.
Hier zeigt sich noch etwas anderes: In Werbung ist Mentalitätsgeschichte eingeschrieben.[2] Wenn 1989, am Ende des Kalten Krieges im 20. Jahrhundert, solch eine Werbung entsteht, dann werden hier gezielt Träume der vergangenen Jahrzehnte angesprochen und abgebildet. Ersteres ist das, was sie will und womit der Kunde zum Kauf animiert werden soll; letzteres tut jede Werbung unfreiwillig. 2006 scheint das Um-die-Welt-Jetten normaler, das für immer mehr Menschen zugängliche Internet macht alle und alles erreichbar – global mit allen vernetzt zu sein ist keine Vision mehr. Der internationale Terrorismus lässt die Welt ebenfalls zusammenrücken, hat aber auch zu einem unsanften Erwachen geführt: Anstelle von Träumen und Visionen herrscht angesichts der nicht greifbaren Gefahr und Angst bei den Millenials, die mittlerweile schon erwachsen sind, quasi Biedermeierstimmung. Entsprechend zieht sich auch die Werbung ins Private zurück und die globale Familie will einfach nur zu viert Urlaub am Strand machen; rührselige, weil an hoffnungsvollere Zeiten erinnernde Musik, inklusive.
Noch deutlicher zeigt sich der Zusammenhang von Werbung, Musik und Mentalitätsgeschichte in zwei Videos von Alitalia.
Zuerst ein Musikvideo[3] von 1977, einer Latin Jazz-Nummer gesungen von Raffaela Carrà, die mit einem Männerballet über Rollfeld und Flugzeug tanzt:
„Nel blu dipinto di blu“ war, schon lange bevor ihn Alitalia 1977 genutzt hat, ein bekannter italienischer Popsong,[4] besser bekannt als „Volare“, nach dem markanten ersten Wort des Refrains. In dieser Zeit wurde Italien beliebtes Urlaubsland (gerade von Deutschen). Alles „Italienische“, das das Flair von Ferien in den Alltag hinübertrug, war angesagt. Ein solch mitreißender Popsong wird so zu einem Schlager, der mit „Sonne, Strand, italienischem Essen, Urlaub, Spaß, Leichtigkeit, Ungezwungenheit“ (usw.) assoziiert wird. In diese Aufzählung passt eine Fluglinie, welche einen dort hinbringt, perfekt hinein.
Auffällig ist nun aber, dass Alitalia den Song in der Nuova-Kampagne von 2016 mit einem völlig anderen Charakter verwendet:
Eine Popballade, nachdenklich und ruhig von Malika Ayane zur dezenten Klavierbegleitung gehaucht, statt flottem Latin Jazz mit Bigband und Tanz. Der Musikcharakter unterstreicht nicht nur die Werbebotschaft der Oberfläche (auch die Musik ist altbekannt und doch neu), sondern spiegelt den Unterschied in der Mentalität wieder: Nicht der den vermeintlich ungezwungeneren mediterranen Lebensstil verehrende deutsche/ kalteuropäische Urlauber wird angesprochen, der für zwei Wochen Anzug und Büro entfliehen will, sondern Businessmenschen: Vielflieger, die keinen Spaß suchen, sondern die unvermeidliche Reise so entspannt wie möglich verbringen wollen. Man beachte auf der Bildebene das Zeigen der Lounge, des bequemen Flugzeugsitzes und des erlesenen Essens, auf der Tonebene das Versinken in der Musik und Ausblenden aller störenden Umgebungsgeräusche.
Hier stellt sich weniger die Frage, warum zweimal das gleiche Lied verwendet wurde, sondern warum man nicht einen ganz anderen Song nutzt, wenn doch die Botschaft so anders ist – weil die Businessmenschen von heute als Kinder „Volare“ aus dem Fernseher tönen hörten und damit Italien inklusive aller dazugehörigen Assoziationen und Emotionen verknüpft haben. Und auch wenn sie jetzt beherrscht und ernst ihrem Leben nachgehen (viel mehr als ihre Eltern), schwingen diese Gefühle beim Hören mit und wecken unbewusst Sehnsüchte. Ein Flug mit Alitalia scheint dann den Druck und den Ernst der Selbstoptimierungsgesellschaft mindern zu können – aber natürlich nur ein bisschen, man will sich ja nicht völlig gehen lassen und wie die Eltern auf dem Flugzeug tanzen…
Es finden sich also gute Gründe dafür, zweimal das gleiche Musikstück zu verwenden. Es hat sich nicht nur bewährt, sondern bringt einen starken Wiedererkennungseffekt mit sich: Der Adressat ist mit Gedanken und Gefühl sofort beim Produkt, die „Einschwingzeit“, wie der Komponist Klaus Wüsthoff[5] die ersten Sekunden einer Werbung nennt, verringert sich. Der Zuschauer muss nicht erst entschlüsseln, um welches Produkt es in dem Clip geht, sondern kann gleich damit beginnen, die spezifische Werbeaussage dieses Clips herauszufinden (dies geschieht freilich alles unbewusst). Gleiche bzw. ähnliche Musik bietet die Chance, ein bekanntes Produkt mit einer neuen oder erweiterten Botschaft zu versehen.
Betrachtet man nun noch die in die Werbung eingeschriebene Mentalitätsgeschichte, die sich schon allein durch ein anderes Arrangement der verwendeten Musik zeigt, ist das selbstreferenzielle Vorgehen speziell bei British Airways und Alitalia geradezu genial: Die angesprochene Werbezielgruppe wird nicht nur in ihrer aktuellen Verfassung abgeholt, sondern zugleich auch mit ihren tiefliegenden, durch Kindheit, Erziehung und Bildung erzeugten Prägungen.
Zugleich zeigt sich durch den Vergleich solcher aufeinander aufbauender Werbungen, was schon Marschall McLuhan schrieb:
„The historians and archeologists will one day discover that the ads of our time are the richest and most faithful daily reflections that any society ever made of its entire range of activities.“[6]
Endnoten
[1] https://shironet.mako.co.il/artist?type=lyrics&lang=1&prfid=575&wrkid=3185
[2] Marshall McLuhan zeigt in Understanding Media (besonders S. 248f.) auf, dass für funktionierende Werbestrategien die Gesellschaft analysiert werden muss, um sie perfekt anzusprechen. In der Werbung ist die ihr aktuelle Gesellschaft gleichsam als Kondensat enthalten. In einem umgekehrten Methodenschritt würde dies bedeuten, dass aus Werbung auf die sie umgebende Gesellschaft und Zeit geschlossen werden kann (vgl. S. 253). Das wird hier versucht.
[3] Es ist kein typischer Werbeclip (das hieße: nicht viel länger als ein bis zwei Minuten; Botschaft, warum man ein Produkt kaufen soll, wird in Bild und/oder Sprache klar vermittelt), aber trotzdem Werbung, weil das Produkt (Alitalia) auf der Bildebene klar im Mittelpunkt steht. Das Video steht in der Tradition der „Goodwill“-Strategie der Radiowerbung zu Beginn des aufkommenden Mediums in den 1920/30er Jahren (vgl. Taylor: Sounds of Capitalism, S. 22): Firmen lassen in ihrem Namen ausgesuchte Musik übertragen in der Hoffnung, dass die Konsumenten sich für das kostenlose Konzert durch den Kauf der Produkte des Sponsors revanchieren.
[4] Der Song von Domenico Modugno erreichte auf dem Grand Prix 1958 den dritten Platz und wurde später ein weltweit bekannter Hit. Vgl. https://www.eurovision.de/geschichte/1958-Grand-Prix-Eurovision-De-La-Chanson-Europeenne-in-Hilversum,hilversum103.html
[5] Vgl. Wüsthoff: Die Rolle der Musik, S. 9f.
[6] Marshall McLuhan: Understanding Media, S. 253.
Literatur
McLuhan, Marshall: Understanding Media. The Extensions of Man [1964]. London und New York: Routledge 2001.
Taylor, Timothy D.: The Sounds of Capitalism. Advertising, Music, and the Conquest of Culture. Chicago und London: University of Chicago Press 2012.
Wüsthoff, Klaus: Die Rolle der Musik in der Film-, Funk- und Fernsehwerbung: Mit Kompositionsanleitungen für Werbespots und einer Instrumententabelle der Gebrauchsmusik. Zweite, überarbeitete Auflage. Kassel: Merseburger 1999.
https://shironet.mako.co.il/artist?type=lyrics&lang=1&prfid=575&wrkid=3185
Elementare Harmonielehre mit dem Computer
Im Frühjahr 1990 habe ich für den Commodore AMIGA in GFA-BASIC ein Programm geschrieben, das einfache Generalbässe und Funktionsfolgen (beides nur in Dur) halbwegs manierlich aussetzen kann. Das Programm berechnet zuerst alle Möglichkeiten (also alle enthaltenen Akkorde in allen denkbaren Lagen) und bewertet sie dann nach mehreren Stimmführungsregeln: Bleiben gemeinsame Töne liegen? Ist der nächste Weg gewählt? Gibt es Quint- (schlecht!) oder Oktavparallelen (ganz schlecht!!)? Ist die Lage zu hoch oder zu tief? Dann wird die beste Variante ausgewählt und entweder als Text oder mit einer furchtbar unästhetischen Grafikroutine ausgegeben. So wenig das Programm kann (man könnte es eigentlich modular erweitern, aber offenbar hatte ich nach einem Monat das Interesse daran wieder verloren) und so viele Fehler es auch macht (zum Beispiel den Tenor in Fis-Dur beharrlich eine Oktave zu tief zu setzen, obwohl man »enge Lage« bestellt, siehe die Abbildung unten): Elementare Harmonielehre scheint sich also zumindest rudimentär ›algorithmisieren‹ zu lassen.
Unten steht der uralte, fehlerhafte und wenig elegante Sourcecode von 1990. Wer ein ADF-Diskimage mit dem Programm haben möchte, kann mir eine Mail schreiben (an christoph PUNKT hust AT gmx PUNKT de). Dafür wäre allerdings zusätzlich ein AMIGA-Emulator wie Amiga Forever nötig. Und nur für dieses Harmonielehre-Programm würde sich das nicht lohnen.
Christoph Hust
' *********************************************
' *********************************************
' ** **
' ** HL.GFA: (sehr) elementare Harmonielehre **
' ** (Aussetzen von einfachen Gene- **
' ** ralbässen und Funktionsfolgen **
' ** in Dur mit grafischer Ausgabe) **
' ** **
' ** Programmiert in GFA-BASIC auf dem Com- **
' ** modore Amiga. Begonnen am 23. 02. 1990, **
' ** "abgeschlossen" bzw. aufgegeben am **
' ** 25. 03. 1990. Programmiert von **
' ** Christoph Hust. -- Ich war jung und **
' ** hatte keine Ahnung. :) **
' ** **
' *********************************************
' *********************************************
'
' >>> Variablen initialisieren <<<
'
DIM stufe$(7,4),x$(10),vorzeichen$(2,6,2),akkord$(4),tonleiter$(12,2),oktave(4)
DIM lak$(4),moeglichkeit$(4,4),differenz(4,4),okta(4,4),bewertung(4),weg(4)
DIM leiter$(8)
GOSUB variablen
'
' >>> Modus etc. abfragen <<<
'
ALERT 1,"Programm-Modus?",1," GB | Akkorde ",modus
INPUT "Tonart: ",tonart$
GOSUB tonnameneinlesen
INPUT "Anzahl der Akkorde";zahl
DIM akkorde$(zahl),tonlaengen(zahl),kadenz$(zahl,4,4),baß$(zahl)
ALERT 1,"Ausgabe als Noten|oder als Text?",2," Text | Noten",zeichnen
'
' >>> Eingabeprozedur <<<
'
FOR i=1 TO zahl
IF modus=gbaß THEN
PRINT "Baßton Nr.";i;
INPUT baß$(i)
INPUT "Bezifferung";akkorde$(i)
IF akkorde$(i)="/" THEN
akkorde$(i)=akkorde$(i-1)
ENDIF
IF zeichnen=2 THEN
ALERT 1,"Tonlänge?|1/1=Ganze, 1/2=Halbe, 1/4=Viertel",2," 1/1 | 1/2 | 1/4 ",tl
SELECT tl
CASE 1
tonlaengen(i)=1
CASE 2
tonlaengen(i)=2
CASE 3
tonlaengen(i)=4
ENDSELECT
ENDIF
ELSE
PRINT "Akkord Nr.";i;
INPUT akkorde$(i)
akkorde$(i)=UPPER$(akkorde$(i))
IF zeichnen=2 THEN
ALERT 1,"Tonlänge?|1/1=Ganze, 1/2=Halbe, 1/4=Viertel",2," 1/1 | 1/2 | 1/4 ",tl
SELECT tl
CASE 1
tonlaengen(i)=1
CASE 2
tonlaengen(i)=2
CASE 3
tonlaengen(i)=4
ENDSELECT
ENDIF
ENDIF
IF @gueltigerakkord(akkorde$(i))=0 THEN
IF modus<>gbaß THEN
ALERT 1,akkorde$(i)+": unbekannter Akkord.",1," NOCHMAL ",dummy
DEC i
ENDIF
ENDIF
NEXT i
ALERT 1,"Lage des ersten Akkords?|3=Terzlage,|5=Quintlage,|8=Oktavlage",3," 3 | 5 | 8 ",l
SELECT l
CASE 1
anfangslage=3
CASE 2
anfangslage=5
CASE 3
anfangslage=8
ENDSELECT
ALERT 1,"Weite oder|enge Lage?",1," eng | weit ",lagewe
'
' >>> Berechnung durchführen <<<
'
CLS
PRINT AT(4,4);"Einen Moment, ich rechne."
FOR nummer=1 TO zahl
PRINT AT(5,5);"Ich bin momentan bei Akkord Nr. ";nummer;". Noch ";zahl-nummer;" Akkorde zu berechnen. "
PRINT AT(5,6);TIME$,DATE$
IF modus=gbaß THEN
GOSUB generalbaß(baß$(nummer),akkorde$(nummer))
ELSE
GOSUB akkord(akkorde$(nummer))
ENDIF
IF nochmal=1 THEN
DEC nummer
ELSE
FOR stimme=baß TO sopran
kadenz$(nummer,stimme,1)=akkord$(stimme)
kadenz$(nummer,stimme,2)=STR$(oktave(stimme))
NEXT stimme
FOR i=baß TO sopran
lak$(i)=akkord$(i)
NEXT i
ENDIF
NEXT nummer
'
' >>> Ausgabe <<<
'
CLS
IF zeichnen=2 THEN
PUT 3,10,gschl$
PUT 3,45,fschl$
gt$="e"
GOSUB stammton(gt$)
gt$=stton$
xposition=20
GOSUB vorzeicheneintragen
xposition=xposition+10
PUT xposition,22,vier$
PUT xposition,32,vier$
PUT xposition,52,vier$
PUT xposition,62,vier$
xposition=xposition+30
GOSUB stammton("c")
c$=stton$
ENDIF
FOR nummer=1 TO zahl
IF zeichnen=2 THEN
PRINT AT(xposition/8+1,11+seite/10+(3*seite/100));akkorde$(nummer);
FOR stimme=baß TO sopran
GOSUB note(tonlaengen(nummer),kadenz$(nummer,stimme,1),VAL(kadenz$(nummer,stimme,2)))
NEXT stimme
tkt=tkt+1/tonlaengen(nummer)
IF tkt>=1 THEN
tkt=0
GOSUB taktstrich
ENDIF
xposition=xposition+30
IF xposition>=600 THEN
IF seite=0 THEN
seite=110
xposition=0
PUT 3,120,gschl$
PUT 3,155,fschl$
xposition=20
GOSUB vorzeicheneintragen
xposition=xposition+20
ELSE
GOSUB notenpapier
ALERT 1,"Seite ist voll.|Ausdrucken?",2," Ja | Nein",druck
IF druck=1 THEN
HARDCOPY
ENDIF
CLS
seite=0
xposition=20
PUT 3,10,gschl$
PUT 3,45,fschl$
GOSUB vorzeicheneintragen
xposition=xposition+10
PUT xposition,22,vier$
PUT xposition,32,vier$
PUT xposition,52,vier$
PUT xposition,62,vier$
xposition=xposition+30
ENDIF
ENDIF
ELSE
PRINT "Nr. ";nummer;": ";akkorde$(nummer);
FOR stimme=sopran DOWNTO baß
PRINT TAB(10*stimme);
GOSUB ausgabe(kadenz$(nummer,stimme,1),VAL(kadenz$(nummer,stimme,2)))
NEXT stimme
PRINT
PRINT STRING$(70,"-")
IF nummer MOD 5=0 THEN
REPEAT
UNTIL INKEY$<>""
CLS
ENDIF
ENDIF
NEXT nummer
IF zeichnen=2 THEN
xposition=xposition-55
GOSUB taktstrich
xposition=xposition-28
GOSUB taktstrich
GOSUB notenpapier
ALERT 1,"Ausdrucken?",2," Ja | Nein ",druck
IF druck=1 THEN
HARDCOPY
ENDIF
ENDIF
END
'
' *******************
' ** Unterroutinen **
' *******************
'
' ----------
' - AKKORD -
' ----------
'
' baut mittels BILDEAKKORD die Akkorde in allen Lagen auf
' und speichert sie im Array "moeglichkeit$()"
'
PROCEDURE akkord(akkordname$)
IF nummer=1 THEN ! Erster Akkord
GOSUB bildeakkord(akkordname$,anfangslage)
GOSUB bestimmebaßton
FOR i=1 TO 3
FOR ton=baß TO sopran
moeglichkeit$(i,ton)=akkord$(ton)
NEXT ton
NEXT i
IF lagewe=1 THEN
FOR i=tenor TO sopran
ii=0
DO
INC ii
EXIT IF tonleiter$(ii,1)=moeglichkeit$(1,i) OR tonleiter$(ii,2)=moeglichkeit$(1,i)
LOOP
SELECT i
CASE 2
IF ii>1 THEN
DEC oktave(tenor)
ENDIF
CASE 3
IF ii>3 THEN
DEC oktave(alt)
ENDIF
CASE 4
IF ii>10 THEN
DEC oktave(sopran)
ENDIF
ENDSELECT
NEXT i
ELSE
p=0
DO
INC p
EXIT IF tonleiter$(p,1)=moeglichkeit$(1,baß) OR tonleiter$(p,2)=moeglichkeit$(1,baß)
LOOP
DO
INC p
IF p=13 THEN
INC flg
p=1
ENDIF
EXIT IF tonleiter$(p,1)=moeglichkeit$(1,tenor) OR tonleiter$(p,2)=moeglichkeit$(2,tenor)
LOOP
oktave(tenor)=oktave(baß)+flg
flg=0
DO
INC p
IF p=13 THEN
INC flg
p=1
ENDIF
EXIT IF tonleiter$(p,1)=moeglichkeit$(1,alt) OR tonleiter$(p,2)=moeglichkeit$(1,alt)
LOOP
oktave(alt)=oktave(tenor)+flg
flg=0
DO
INC p
IF p=13 THEN
INC flg
p=1
ENDIF
EXIT IF tonleiter$(p,1)=moeglichkeit$(1,sopran) OR tonleiter$(p,2)=moeglichkeit$(1,sopran)
LOOP
oktave(sopran)=oktave(alt)+flg
ENDIF
IF oktave(sopran)<3 THEN
IF lagewe=2 THEN
FOR stimme=baß TO sopran
INC oktave(stimme)
NEXT stimme
ENDIF
ENDIF
ELSE
GOSUB bildeakkord(akkordname$,3) ! Akkord in Terzlage aufbauen
FOR ton=baß TO sopran
moeglichkeit$(1,ton)=akkord$(ton)
NEXT ton
GOSUB bildeakkord(akkordname$,5) ! in Quintlage
FOR ton=baß TO sopran
moeglichkeit$(2,ton)=akkord$(ton)
NEXT ton
GOSUB bildeakkord(akkordname$,8) ! und in Oktavlage
FOR ton=baß TO sopran
moeglichkeit$(3,ton)=akkord$(ton)
NEXT ton
GOSUB bestimmebaßton
ENDIF
FOR n=1 TO 3
FOR ton=tenor TO sopran
okt=oktave(ton)
GOSUB ermittledifferenz(akkord$(baß),moeglichkeit$(n,ton))
IF nummer=1 THEN
differenz(n,ton)=abstandaufwaerts
ELSE
GOSUB ermittledifferenz(lak$(ton),moeglichkeit$(n,ton))
IF abstandaufwaerts>abstandabwaerts THEN
differenz=-abstandabwaerts
ELSE
differenz=abstandaufwaerts
ENDIF
IF moeglichkeit$(n,ton)="ces" THEN
IF differenz>0 THEN
INC okt
ENDIF
ELSE
IF lak$(ton)="ces" AND differenz<0 THEN
DEC okt
ENDIF
IF position+differenz<=0 THEN
DEC okt
ELSE
IF position+differen>12 THEN
IF lak$(ton)<>"ces" THEN
INC okt
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
okta(n,ton)=okt
differenz(n,ton)=differenz
NEXT ton
NEXT n
GOSUB akkordebewerten
FOR i=2 TO 4
akkord$(i)=moeglichkeit$(bestemoeglichkeit,i)
oktave(i)=okta(bestemoeglichkeit,i)
NEXT i
IF oktave(tenor)<=oktave(baß) THEN
p=0
DO
INC p
EXIT IF tonleiter$(p,1)=akkord$(baß) OR tonleiter$(p,2)=akkord$(baß)
LOOP
DO
INC p
IF p=13 THEN
flg=1
ELSE
flg=0
ENDIF
EXIT IF flg=1
EXIT IF tonleiter$(p,1)=akkord$(tenor) OR tonleiter$(p,2)=akkord$(tenor)
LOOP
IF flg=1 THEN
DEC oktave(baß)
ENDIF
ENDIF
IF nummer=1 THEN
IF oktave(3)>oktave(4) THEN
INC oktave(sopran)
ENDIF
IF oktave(sopran)=oktave(alt) THEN
p=0
DO
INC p
EXIT IF tonleiter$(p,1)=akkord$(3) OR tonleiter$(p,2)=akkord$(3)
LOOP
DO
INC p
IF p=13 THEN
flg=1
ELSE
flg=0
ENDIF
EXIT IF flg=1
EXIT IF tonleiter$(p,1)=akkord$(4) OR tonleiter$(p,2)=akkord$(4)
LOOP
IF flg=0 THEN
INC oktave(sopran)
ENDIF
ENDIF
IF oktave(alt)-oktave(sopran)<2 THEN
p=0
DO
INC p
EXIT IF tonleiter$(p,1)=akkord$(3) OR tonleiter$(p,2)=akkord$(3)
LOOP
DO
INC p
IF p=13 THEN
flg=1
ELSE
flg=0
ENDIF
EXIT IF flg=1
EXIT IF tonleiter$(p,1)=akkord$(4) OR tonleiter$(p,2)=akkord$(4)
LOOP
IF flg=0 THEN
DEC oktave(sopran)
ENDIF
ENDIF
ENDIF
RETURN
'
' -------------------
' - AKKORDEBEWERTEN -
' -------------------
'
' bewertet die Akkorde nach definierten Satzregeln, könnte modular
' erweitert werden; speichert das Ergebnis in "bestemoeglichkeit"
' und triggert ggf. eine neue Berechnung in weiter statt enger Lage
' (oder vice versa)
'
PROCEDURE akkordebewerten
ARRAYFILL bewertung(),0 ! letzte Bewertung löschen
ARRAYFILL weg(),0
adressek=1
adresseg=1
FOR xx=1 TO 3
FOR ton=tenor TO sopran ! Kriterium I: gleiche Töne
SELECT ton
CASE 2
IF okta(n,ton)=1 THEN
GOSUB ermittledifferenz("c",moeglichkeit$(xx,ton))
IF differenz<4 THEN
bewertung(xx)=bewertung(xx)-0.5
ENDIF
ELSE
IF okta(n,ton)<1 THEN
DEC bewertung(xx)
ELSE
IF okta(n,ton)=2 THEN
GOSUB ermittledifferenz("c",moeglichkeit$(xx,ton))
IF differenz>11 THEN
bewertung(xx)=bewertung(xx)-0.5
ENDIF
ELSE
IF okta(n,ton)>2 THEN
DEC bewertung(xx)
ENDIF
ENDIF
ENDIF
ENDIF
CASE 3
IF okta(n,ton)=1 THEN
GOSUB ermittledifferenz("c",moeglichkeit$(xx,ton))
IF differenz<11 THEN
bewertung(xx)=bewertung(xx)-0.5
ENDIF
ELSE
IF okta(n,ton)<1 THEN
DEC bewertung(xx)
ELSE
IF okta(n,ton)=3 THEN
GOSUB ermittledifferenz("c",moeglichkeit$(xx,ton))
IF differenz>4 THEN
bewertung(xx)=bewertung(xx)-0.5
ENDIF
ELSE
IF okta(n,ton)>3 THEN
DEC bewertung(xx)
ENDIF
ENDIF
ENDIF
ENDIF
CASE 4
IF okta(n,ton)=2 THEN
GOSUB ermittledifferenz("c",moeglichkeit$(xx,ton))
IF differenz<6 THEN
bewertung(xx)=bewertung(xx)-0.5
ENDIF
ELSE
IF okta(n,ton)<2 THEN
DEC bewertung(xx)
ELSE
IF okta(n,ton)=3 THEN
GOSUB ermittledifferenz("c",moeglichkeit$(xx,ton))
IF differenz>11 THEN
bewertung(xx)=bewertung(xx)-0.5
ENDIF
ELSE
IF okta(n,ton)>3 THEN
DEC bewertung(xx)
ENDIF
ENDIF
ENDIF
ENDIF
ENDSELECT
IF lak$(ton)=moeglichkeit$(xx,ton) THEN
bewertung(xx)=bewertung(xx)+2
ENDIF
NEXT ton
IF SGN(baßdifferenz)=((-1)*SGN(differenz(xx,sopran))) THEN ! II: Gegenbewgg.
INC bewertung(xx)
ENDIF
weg(xx)=ABS(differenz(xx,4))
NEXT xx
FOR xx=1 TO 3 ! Kriterium III: kürzester Weg
IF weg(xx)<=weg(adressek) THEN
adressek=xx
ELSE
IF weg(xx)>=weg(adresseg) THEN
adresseg=xx
ENDIF
ENDIF
NEXT xx
INC bewertung(adressek)
DEC bewertung(adresseg)
IF akkorde$(nummer)<>akkorde$(nummer-1) OR modus=gbaß THEN
FOR i=1 TO 3
FOR ton=baß TO sopran
FOR ton2=baß TO sopran
IF ton<>ton2 THEN
IF nummer<>1 THEN
GOSUB ermittlequint(moeglichkeit$(i,ton))
IF moeglichkeit$(i,ton2)=quint$ OR moeglichkeit$(i,ton)=quintb$ OR moeglichkeit$(i,ton)=quintk$ THEN
GOSUB ermittlequint(lak$(ton))
IF lak$(ton2)=quint$ OR lak$(ton)=quintb$ OR lak$(ton)=quintk$ THEN
bewertung(i)=bewertung(i)-50 ! Krit. IV: Quintpar.
ENDIF
ENDIF
ENDIF
IF UPPER$(moeglichkeit$(i,ton))=UPPER$(moeglichkeit$(i,ton2)) THEN
IF lak$(ton)=lak$(ton2) THEN
IF differenz(i,ton)<>0 THEN
bewertung(i)=bewertung(i)-100 ! Krit. V: Oktavpar.
ENDIF
ENDIF
ENDIF
ENDIF
NEXT ton2
NEXT ton
NEXT i
ENDIF
bestemoeglichkeit=1 ! die Auswertung beginnt
FOR xx=1 TO 3
IF bewertung(xx)>=bewertung(bestemoeglichkeit) THEN
bestemoeglichkeit=xx
ENDIF
NEXT xx
IF bewertung(bestemoeglichkeit)<-50 THEN
IF lagewe=1 THEN
lagewe=2
ELSE
lagewe=1
ENDIF
nochmal=1 ! keine gute Möglichkeit gefunden
ELSE
nochmal=0 ! We have a winner!
ENDIF
RETURN
'
' ---------------------
' -- AKKORDEEINLESEN --
' ---------------------
'
PROCEDURE akkordeinlesen(stufe)
IF stufe=7 THEN
stufe=5
d7=1
ELSE
d7=0
ENDIF
DEC stufe
RESTORE toene
FOR i2=1 TO ueber ! bis zum ersten Ton der Tonika
READ dummy$
NEXT i2
x2=ueber
FOR i2=1 TO stufe ! bis zur gewünschten Stufe
READ dummy$
INC x2
IF x2=7 THEN
x2=0
RESTORE toene
ENDIF
NEXT i2
FOR i2=1 TO 3 ! Akkord einlesen
READ x$(i2)
INC x2
IF x2=7 THEN
x2=0
RESTORE toene
ENDIF
READ dummy$ ! Akkorde sind Terzschichtungen
INC x2
IF x2=7 THEN
x2=0
RESTORE toene
ENDIF
NEXT i2
IF d7=1 THEN
READ x$(4)
ELSE
x$(4)=""
ENDIF
FOR i2=1 TO 4 ! Vorzeichen ändern
FOR ii2=1 TO anzahl
IF x$(i2)=vorzeichen$(art,ii2,1) THEN
x$(i2)=vorzeichen$(art,ii2,2)
ENDIF
NEXT ii2
NEXT i2
RETURN
'
' ------------------------
' - AKKORDZUSAMMENSETZEN -
' ------------------------
'
' wird von AKKORD angesprungen und setzt einen bestimmten Akkord in
' einer bestimmten Lage zusammen im Array "akkord$()"
'
PROCEDURE akkordzusammensetzen
akkord$(baß)=x$(1)
IF lagewe=1 THEN ! enge Lage
IF stufe=7 THEN ! Septakkord
SELECT lage
CASE 3 ! Terzlage
akkord$(tenor)=x$(3)
akkord$(alt)=x$(4)
akkord$(sopran)=x$(2)
CASE 5 ! Quintlage
akkord$(tenor)=x$(4)
akkord$(alt)=x$(2)
akkord$(sopran)=x$(3)
CASE 8 ! Oktavlage
akkord$(tenor)=x$(2)
akkord$(alt)=x$(3)
akkord$(sopran)=x$(4)
ENDSELECT
ELSE
SELECT lage
CASE 8 ! Oktavlage
akkord$(tenor)=x$(2)
akkord$(alt)=x$(3)
akkord$(sopran)=x$(1)
CASE 5 ! Quintlage
akkord$(tenor)=x$(1)
akkord$(alt)=x$(2)
akkord$(sopran)=x$(3)
CASE 3 ! Terzlage
akkord$(tenor)=x$(3)
akkord$(alt)=x$(1)
akkord$(sopran)=x$(2)
ENDSELECT
ENDIF
ELSE ! weite Lage
IF stufe=7 THEN ! alles wie oben
SELECT lage
CASE 3
akkord$(sopran)=x$(2)
akkord$(alt)=x$(3)
akkord$(tenor)=x$(4)
CASE 5
akkord$(sopran)=x$(3)
akkord$(alt)=x$(4)
akkord$(tenor)=x$(2)
CASE 8
akkord$(sopran)=x$(4)
akkord$(alt)=x$(2)
akkord$(tenor)=x$(3)
ENDSELECT
ELSE
SELECT lage
CASE 8
akkord$(sopran)=x$(1)
akkord$(alt)=x$(2)
akkord$(tenor)=x$(3)
CASE 5
akkord$(sopran)=x$(3)
akkord$(alt)=x$(1)
akkord$(tenor)=x$(2)
CASE 3
akkord$(sopran)=x$(2)
akkord$(alt)=x$(3)
akkord$(tenor)=x$(1)
ENDSELECT
ENDIF
ENDIF
RETURN
'
' -----------
' - AUSGABE -
' -----------
'
' Prozedur zur Textausgabe
'
PROCEDURE ausgabe(name$,hoehe)
SELECT hoehe
CASE 0
PRINT UPPER$(name$),
CASE 1
PRINT name$,
DEFAULT
PRINT name$;
FOR i=1 TO hoehe-1
PRINT "'";
NEXT i
PRINT "",
ENDSELECT
RETURN
'
' -------------------
' - BESTIMMEBASSTON -
' -------------------
'
' bestimmt den Basston
'
PROCEDURE bestimmebaßton
IF nummer=1 THEN
lak$(baß)=akkord$(baß)
IF akkord$(baß)<>"ces" AND akkord$(baß)<>"c" AND akkord$(baß)<>"cis" AND akkord$(baß)<>"des" AND akkord$(baß)<>"d" AND akkord$(baß)<>"dis" AND akkord$(baß)<>"es" AND akkord$(baß)<>"e" AND akkord$(baß)<>"eis" THEN
DEC oktave(baß)
ENDIF
ENDIF
GOSUB ermittledifferenz(lak$(baß),akkord$(baß))
IF abstandabwaerts<abstandaufwaerts THEN
differenz=-abstandabwaerts
ELSE
differenz=abstandaufwaerts
ENDIF
REPEAT
SELECT nochmal
CASE 1
differenz=abstandaufwaerts
CASE 2
differenz=-abstandabwaerts
ENDSELECT
okt=oktave(baß)
GOSUB ermittleoktave
oktave(baß)=okt
nochmal=0
IF oktave(baß)=0 AND (akkord$(baß)="des" OR akkord$(baß)="d" OR akkord$(baß)="dis" OR akkord$(baß)="ces" OR akkord$(baß)="c" OR akkord$(baß)="cis") THEN
nochmal=1
ELSE
IF oktave(baß)<0 THEN
nochmal=1
ENDIF
ENDIF
IF oktave(baß)=2 AND NOT (akkord$(baß)="ces" OR akkord$(baß)="c" OR akkord$(baß)="cis" OR akkord$(baß)="des" OR akkord$(baß)="d" OR akkord$(baß)="dis" OR akkord$(baß)="es" OR akkord$(baß)="e" OR akkord$(baß)="eis") THEN
nochmal=2
ELSE
IF oktave(baß)>2 THEN
nochmal=2
ENDIF
ENDIF
UNTIL nochmal=0
baßdifferenz=differenz
RETURN
'
' ---------------
' - BILDEAKKORD -
' ---------------
'
' übersetzt zuerst Funktionen in Stufen und springt dann
' AKKORDZUSAMMENSETZEN an
'
PROCEDURE bildeakkord(funktion$,lage)
SELECT funktion$ ! "Funktionen" sind hier nur schicke
CASE "T" ! Synonyme für Stufen (leider)
stufe=1
CASE "SP"
stufe=2 ! (Und auch das lediglich in Dur.)
CASE "DP"
stufe=3
CASE "S"
stufe=4
CASE "D"
stufe=5
CASE "TP"
stufe=6
CASE "D7"
stufe=7
ENDSELECT
FOR i=1 TO 4
x$(i)=stufe$(stufe,i)
NEXT i
GOSUB akkordzusammensetzen
RETURN
'
' ------------------
' - BILDEINTERVALL -
' ------------------
'
' bildet Intervalle für Generalbass und Stufen/Funktionen
'
PROCEDURE bildeintervall(grund$,intervall%)
LOCAL position%,int%
DEC intervall%
IF INT(intervall%/7)=(intervall%/7) THEN
intervall$=baßton$
ELSE
position%=0
int%=0
DO
INC position%
IF position%>12 THEN
position%=1
ENDIF
EXIT IF tonleiter$(position%,1)=grund$ OR tonleiter$(position%,2)=grund$
LOOP
DO
INC position%
IF position%>12 THEN
position%=1
ENDIF
IF LEN(tonleiter$(position%,1))=1 OR LEN(tonleiter$(position%,2))=1 THEN
IF tonleiter$(position%,2)<>"b" THEN
INC int%
ENDIF
ENDIF
EXIT IF int%=intervall%
LOOP
IF LEN(tonleiter$(position%,1))=1 THEN
intervall$=tonleiter$(position%,1)
ELSE
intervall$=tonleiter$(position%,2)
ENDIF
ENDIF
RETURN
'
' ---------------------
' - ERMITTLEDIFFERENZ -
' ---------------------
'
' bestimmt die Differenz zweier Töne, u. a. als Entscheidungsgrund-
' lage für die Bestimmung der Variante mit dem nächsten Weg
'
PROCEDURE ermittledifferenz(tona$,tonb$)
position=0
abstandaufwaerts=0
abstandabwaerts=0
RESTORE tonleiter
DO
INC position
EXIT IF tonleiter$(position,1)=tona$ OR tonleiter$(position,2)=tona$
LOOP
IF tona$<>tonb$ THEN
position2=position
DO
INC position2
INC abstandaufwaerts
IF position2=13 THEN
position2=1
ENDIF
EXIT IF tonleiter$(position2,1)=tonb$ OR tonleiter$(position2,2)=tonb$
LOOP
position2=position
DO
DEC position2
INC abstandabwaerts
IF position2=0 THEN
position2=12
ENDIF
EXIT IF tonleiter$(position2,1)=tonb$ OR tonleiter$(position2,2)=tonb$
LOOP
ENDIF
RETURN
'
' -------------------------
' - ERMITTLEDIFFERENZ_OKT -
' -------------------------
'
' bestimmt die Differenz von Oktavlagen
'
PROCEDURE ermittledifferenz_okt(tona$,tonb$,okt_a,okt_b)
IF okt_a<0 THEN
okt_a=0
ENDIF
IF okt_b<0 THEN
okt_b=0
ENDIF
position=0
differenz_o=0
DO
INC position
EXIT IF leiter$(position)=tona$
LOOP
okt=okt_a
IF NOT (tona$=tonb$ AND okt_a=okt_b) THEN
position2=position
DO
DO
INC position2
IF position2=8 THEN
INC okt
position2=1
ENDIF
INC differenz_o
EXIT IF leiter$(position2)=tonb$
LOOP
EXIT IF okt_b=okt
LOOP
ENDIF
RETURN
'
' ------------------
' - ERMITTLEOKTAVE -
' ------------------
'
' Oktavlage eines Tons bestimmen.
' Die Prozedur arbeitet in Fis-Dur fehlerhaft!
'
PROCEDURE ermittleoktave
IF akkord$(baß)="ces" THEN
IF differenz>0 THEN
INC okt
ENDIF
ELSE
IF lak$(baß)="ces" AND differenz<0 THEN
DEC okt
ENDIF
IF position+differenz<=0 THEN
DEC okt
ELSE
IF position+differenz>12 THEN
IF lak$(baß)<>"ces" THEN
INC okt
ENDIF
ENDIF
ENDIF
ENDIF
RETURN
'
' -----------------
' - ERMITTLEQUINT -
' -----------------
'
' Ermittelt die Quint über einem Ton. Entscheidungsgrundlage für die
' Abwertung von Stimmführungen mit Quintparallelen.
'
PROCEDURE ermittlequint(ton$)
gpos=0
DO
INC gpos
IF gpos>12 THEN
gpos=1
ENDIF
EXIT IF ton$=tonleiter$(gpos,1) OR ton$=tonleiter$(gpos,2)
LOOP
IF ton$=tonleiter$(gpos,1) THEN
art=1
ELSE
art=2
ENDIF
gpos=gpos+7
IF gpos=>13 THEN
gpos=gpos-12
ENDIF
IF ton$="eis" THEN
quint$="his"
ELSE
quint$=tonleiter$(gpos,art)
ENDIF
IF quint$="h" THEN
quintb$="b"
quintk$="his"
ELSE
quintb$=quint$+"es"
quintk$=quint$+"is"
ENDIF
RETURN
'
' ---------------
' - GENERALBASS -
' ---------------
'
' Steuerung des Generalbass-Modus.
'
PROCEDURE generalbaß(baßton$,bezifferung$)
LOCAL i%,baßton$,anz_ziff%4
ERASE ziffern%()
FOR i%=1 TO 10
x$(i%)=""
NEXT i%
SELECT bezifferung$
CASE ""
bezifferung$="135"
CASE "36"
bezifferung$="136"
CASE "6"
bezifferung$="136"
CASE "46"
bezifferung$="146"
CASE "4"
bezifferung$="145"
CASE "3"
bezifferung$="135"
CASE "5"
bezifferung$="135"
CASE "7"
bezifferung$="1357"
CASE "56"
bezifferung$="1356"
CASE "34"
bezifferung$="1346"
CASE "2"
bezifferung$="1246"
CASE "t.s."
bezifferung$="0"
ENDSELECT
IF bezifferung$="0" THEN
FOR i=1 TO 4
akkorde$(i)=""
NEXT i
ELSE
anz_ziff%=LEN(bezifferung$)
DIM ziffern%(anz_ziff%)
FOR i%=1 TO anz_ziff%
ziffern%(i%)=VAL(MID$(bezifferung$,i%,1))
NEXT i%
QSORT ziffern%()
GOSUB stammton_gbaß(baßton$)
baßton$=stton$
FOR i%=1 TO anz_ziff%
GOSUB bildeintervall(baßton$,ziffern%(i%))
GOSUB vorzeichen(intervall$)
x$(i%)=v_ton$
NEXT i%
IF anz_ziff%=4 THEN
stufe=7
ELSE
stufe=1
ENDIF
IF nummer=1 THEN
lage=anfangslage
GOSUB akkordzusammensetzen
FOR ton=baß TO sopran
moeglichkeit$(1,ton)=akkord$(ton)
akkord$(ton)=akkord$(ton) ! sieht falsch aus
NEXT ton
IF lagewe=1 THEN
FOR i=tenor TO sopran
ii=0
DO
INC ii
EXIT IF tonleiter$(ii,1)=moeglichkeit$(1,i) OR tonleiter$(ii,2)=moeglichkeit$(1,i)
LOOP
SELECT i
CASE 2
IF ii>11 THEN
DEC oktave(tenor)
ENDIF
CASE 3
IF ii>3 THEN
DEC oktave(alt)
ENDIF
CASE 4
IF ii>10 THEN
DEC oktave(sopran)
ENDIF
ENDSELECT
NEXT i
ELSE
p=0
DO
INC p
EXIT IF tonleiter$(p,1)=moeglichkeit$(1,baß) OR tonleiter$(p,2)=moeglichkeit$(1,baß)
LOOP
DO
INC p
IF p=13 THEN
INC flg
p=1
ENDIF
EXIT IF tonleiter$(p,1)=moeglichkeit$(1,tenor) OR tonleiter$(p,2)=moeglichkeit$(1,tenor)
LOOP
oktave(tenor)=oktave(baß)+flg
flg=0
DO
INC p
IF p=13 THEN
INC flg
p=1
ENDIF
EXIT IF tonleiter$(p,1)=moeglichkeit$(1,alt) OR tonleiter$(p,2)=moeglichkeit$(1,alt)
LOOP
oktave(alt)=oktave(tenor)+flg
flg=0
DO
INC p
IF p=13 THEN
INC flg
p=1
ENDIF
EXIT IF tonleiter$(p,1)=moeglichkeit$(1,sopran) OR tonleiter$(p,2)=moeglichkeit$(1,sopran)
LOOP
oktave(sopran)=oktave(alt)+flg
ENDIF
IF oktave(sopran)<3 THEN
IF lagewe=2 THEN
FOR stimme=baß TO sopran
INC oktave(stimme)
NEXT stimme
ENDIF
ENDIF
ELSE
lage=3
GOSUB akkordzusammensetzen
FOR ton=tenor TO sopran
moeglichkeit$(2,ton)=akkord$(ton)
NEXT ton
lage=5
GOSUB akkordzusammensetzen
FOR ton=tenor TO sopran
moeglichkeit$(3,ton)=akkord$(ton)
NEXT ton
lage=8
GOSUB akkordzusammensetzen
FOR ton=tenor TO sopran
moeglichkeit$(1,ton)=akkord$(ton)
NEXT ton
GOSUB bestimmebaßton
FOR i%=1 TO 3
moeglichkeit$(i%,1)=baßton$
NEXT i%
FOR n=1 TO 3
FOR ton=tenor TO sopran
okt=oktave(ton)
GOSUB ermittledifferenz(akkord$(baß),moeglichkeit$(n,ton))
IF nummer=1 THEN
differenz(n,ton)=abstandaufwaerts
ELSE
GOSUB ermittledifferenz(lak$(ton),moeglichkeit$(n,ton))
IF abstandaufwaerts>abstandabwaerts THEN
differenz=-abstandabwaerts
ELSE
differenz=abstandaufwaerts
ENDIF
IF moeglichkeit$(n,ton)="ces" THEN
IF differenz>0 THEN
INC okt
ENDIF
ELSE
IF lak$(ton)="ces" AND differenz<0 THEN
DEC okt
ENDIF
IF position+differenz<=0 THEN
DEC okt
ELSE
IF position+differenz>12 THEN
IF lak$(ton)<>"ces" THEN
INC okt
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
okta(n,ton)=okt
differenz(n,ton)=differenz
NEXT ton
NEXT n
GOSUB akkordebewerten
FOR i=2 TO 4
akkord$(i)=moeglichkeit$(bestemoeglichkeit,i)
oktave(i)=okta(bestemoeglichkeit,i)
NEXT i
IF oktave(tenor)<=oktave(baß) THEN
p=0
DO
INC p
EXIT IF tonleiter$(p,1)=akkord$(baß) OR tonleiter$(p,2)=akkord$(baß)
LOOP
DO
INC p
IF p=13 THEN
flg=1
ELSE
flg=0
ENDIF
EXIT IF flg=1
EXIT IF tonleiter$(p,1)=akkord$(tenor) OR tonleiter$(p,2)=akkord$(tenor)
LOOP
IF flg=1 THEN
DEC oktave(baß)
ENDIF
ENDIF
IF nummer=1 THEN
IF oktave(3)>oktave(4) THEN
INC oktave(sopran)
ENDIF
IF oktave(sopran)=oktave(alt) THEN
p=0
DO
INC p
EXIT IF tonleiter$(p,1)=akkord$(3) OR tonleiter$(p,2)=akkord$(3)
LOOP
DO
INC p
IF p=13 THEN
flg=1
ELSE
flg=0
ENDIF
EXIT IF flg=1
EXIT IF tonleiter$(p,1)=akkord$(4) OR tonleiter$(p,2)=akkord$(4)
LOOP
IF flg=0 THEN
INC oktave(sopran)
ENDIF
ENDIF
IF oktave(alt)-oktave(sopran)<2 THEN
p=0
DO
INC p
EXIT IF tonleiter$(p,1)=akkord$(3) OR tonleiter$(p,2)=akord$(3)
LOOP
DO
INC p
IF p=13 THEN
flg=1
ELSE
flg=0
ENDIF
EXIT IF flg=1
EXIT IF tonleiter$(p,1)=akkord$(4) OR tonleiter$(p,2)=akkord$(4)
LOOP
IF flg=0 THEN
DEC oktave(sopran)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN
'
' ------------
' - STAMMTON -
' ------------
'
' Stammton eines chromatisierten Tons bestimmen
'
PROCEDURE stammton(name$)
IF name$="his" OR name$="b" THEN
stton$="h"
ELSE
IF name$="fes" OR name$="fis" OR name$="f" THEN
stton$="f"
ELSE
IF name$="ces" THEN
stton$="c"
ELSE
IF name$="as" THEN
stton$="a"
ELSE
RESTORE tonleiter
DO
INC pos
IF pos=13 THEN
pos=1
ENDIF
EXIT IF tonleiter$(pos,1)=name$ OR tonleiter$(pos,2)=name$
LOOP
IF INSTR(name$,"is") THEN
DEC pos
ELSE
IF INSTR(name$,"es") THEN
INC pos
ENDIF
ENDIF
stton$=tonleiter$(pos,1)
ENDIF
ENDIF
ENDIF
ENDIF
FOR ii2=1 TO anzahl
IF stton$=vorzeichen$(art,ii2,1) THEN
stton$=vorzeichen$(art,ii2,2)
ENDIF
NEXT ii2
RETURN
'
' -----------------
' - STAMMTON_BASS -
' -----------------
'
' gleiche Funktion für Generalbass
'
PROCEDURE stammton_gbaß(name$)
IF name$="his" OR name$="b" THEN
stton$="h"
ELSE
IF name$="fes" OR name$="fis" OR name$="f" THEN
stton$="f"
ELSE
IF name$="ces" THEN
stton$="c"
ELSE
IF name$="as" THEN
stton$="a"
ELSE
RESTORE tonleiter
DO
INC pos
IF pos=13 THEN
pos=1
ENDIF
EXIT IF tonleiter$(pos,1)=name$ OR tonleiter$(pos,2)=name$
LOOP
IF INSTR(name$,"is") THEN
DEC pos
ELSE
IF INSTR(name$,"es") THEN
INC pos
ENDIF
ENDIF
stton$=tonleiter$(pos,1)
ENDIF
ENDIF
ENDIF
ENDIF
RETURN
'
' --------
' - NOTE -
' --------
'
' Ausgabe einer Note
'
PROCEDURE note(laenge,nam$,oktave)
start=75
IF oktave=2 AND LEFT$(nam$)="c" THEN
LINE xposition-8,45+seite,xposition+8,45+seite
ENDIF
GOSUB ermittledifferenz_okt(gt$,nam$,0,oktave)
yposition=start-(2.5*differenz_o)+seite
GOSUB zeichnenote(xposition,yposition,laenge)
IF oktave>=3 THEN
GOSUB ermittledifferenz_okt(c$,nam$,3,oktave)
IF differenz_o>=5 THEN
IF (differenz_o/2)<>INT(differenz_o/2) THEN
hl=INT(differenz_o/2)
ELSE
hl=INT(differenz_o/2)-1
ENDIF
FOR i=1 TO hl
LINE xposition-8,40-i*5+seite-15,xposition+8,40-i*5+seite-15
NEXT i
ENDIF
ENDIF
RETURN
'
' ---------------
' - NOTENPAPIER -
' ---------------
'
' Notenlinien zeichnen
'
PROCEDURE notenpapier
LOCAL y,i,ii,iii
COLOR 1
y=20
FOR i=1 TO 2
FOR ii=1 TO 2
FOR iii=1 TO 5
LINE 0,y,639,y
y=y+5
NEXT iii
y=y+5
NEXT ii
y=y+5
NEXT i
RETURN
'
' --------------
' - TAKTSTRICH -
' --------------
'
' Taktstrich zeichnen
'
PROCEDURE taktstrich
xposition=xposition+30
LINE xposition,70+seite,xposition,20+seite
LINE xposition+1,70+seite,xposition+1,20+seite
RETURN
'
' -------------------
' - TONARTBESTIMMEN -
' -------------------
'
' 1. wie viele Töne incl. c werden bis zum Grundton der Tonart
' überlesen? -> "ueber"
' 2. was für Vorzeichen (Be oder Kreuz)? -> "art"
' 3. wie viele Vorzeichen? -> "anzahl"
'
PROCEDURE tonartbestimmen
SELECT UPPER$(tonart$)
CASE "GES"
ueber=4
art=2
anzahl=6
CASE "DES"
ueber=1
art=2
anzahl=5
CASE "AS"
ueber=5
art=2
anzahl=4
CASE "ES"
ueber=2
art=2
anzahl=3
CASE "B"
ueber=6
art=2
anzahl=2
CASE "F"
ueber=3
art=2
anzahl=1
CASE "C"
ueber=0
art=0
anzahl=0
CASE "G"
ueber=4
art=1
anzahl=1
CASE "D"
ueber=1
art=1
anzahl=2
CASE "A"
ueber=5
art=1
anzahl=3
CASE "E"
ueber=2
art=1
anzahl=4
CASE "H"
ueber=6
art=1
anzahl=5
CASE "FIS"
ueber=3
art=1
anzahl=6
DEFAULT
ALERT 1,UPPER$(tonart$)+"-Dur: unbekannte Tonart",1,"Programmende",dummy
EDIT
ENDSELECT
RETURN
'
' ---------------------
' - TONLEITEREINLESEN -
' ---------------------
'
' Tonleiter aus dem Datenteil einlesen
'
PROCEDURE tonleitereinlesen
RESTORE tonleiter
FOR i=1 TO 12
READ anzahl
IF anzahl=1 THEN
READ tonleiter$(i,1)
tonleiter$(i,2)=tonleiter$(i,1)
ELSE
READ tonleiter$(i,1)
READ tonleiter$(i,2)
ENDIF
NEXT i
RETURN
'
' --------------------
' - TONNAMENEINLESEN -
' --------------------
'
' Tonnamen aus dem Datenteil einlesen
'
PROCEDURE tonnameneinlesen
GOSUB tonleitereinlesen
GOSUB tonartbestimmen
GOSUB vorzeicheneinlesen
FOR i=1 TO 7
GOSUB akkordeinlesen(i)
FOR ii=1 TO 4
stufe$(i,ii)=x$(ii)
NEXT ii
NEXT i
leiter$(1)="c"
leiter$(2)="d"
leiter$(3)="e"
leiter$(4)="f"
leiter$(5)="g"
leiter$(6)="a"
leiter$(7)="h"
FOR ii=1 TO 7
FOR i=1 TO anzahl
IF leiter$(ii)=vorzeichen$(art,i,1) THEN
leiter$(ii)=vorzeichen$(art,i,2)
ENDIF
NEXT i
NEXT ii
RETURN
'
' --------------
' - UEBERLESEN -
' --------------
'
' Daten ignorieren
'
PROCEDURE ueberlesen(i)
FOR x%=1 TO i
READ dummy$
NEXT x%
RETURN
'
' -------------
' - VARIABLEN -
' -------------
'
' Variablen initialisieren
'
PROCEDURE variablen
gbaß=1
baß=1
tenor=2
alt=3
sopran=4
oktave(baß)=1
oktave(tenor)=2
oktave(alt)=3
oktave(sopran)=3
PRINT "#"
GET 0,0,8,8,kreuz$
CLS
PRINT "b"
GET 0,0,8,8,b$
CLS
PRINT "4"
GET 0,0,8,8,vier$
CLS
GOSUB schluesselzeichnen
RETURN
'
' --------------
' - VORZEICHEN -
' --------------
'
PROCEDURE vorzeichen(ton$)
LOCAL i%
v_ton$=ton$
FOR i%=1 TO anzahl
IF ton$=vorzeichen$(art,i%,1) THEN
v_ton$=vorzeichen$(art,i%,2)
ENDIF
NEXT i%
RETURN
'
' ----------------------
' - VORZEICHENEINLESEN -
' ----------------------
'
PROCEDURE vorzeicheneinlesen
RESTORE vorzeichen
FOR i=1 TO 2
FOR ii=1 TO 6
FOR iii=1 TO 2
READ vorzeichen$(i,ii,iii)
NEXT iii
NEXT ii
NEXT i
RETURN
'
' -----------------------
' - VORZEICHENEINTRAGEN -
' -----------------------
'
' Vorzeichnung bei graphischer Ausgabe
'
PROCEDURE vorzeicheneintragen ! man kann's auch zu Tode
SELECT art ! "strukturieren"...
CASE 1
GOSUB vorzeicheneintragen_k
CASE 2
GOSUB vorzeicheneintragen_b
ENDSELECT
RETURN
'
' -------------------------
' - VORZEICHENEINTRAGEN_B -
' -------------------------
'
PROCEDURE vorzeicheneintragen_b
oktave=3
xposition=35
FOR i=1 TO anzahl
SELECT i
CASE 2
INC oktave
CASE 3
DEC oktave
CASE 4
INC oktave
CASE 5
DEC oktave
CASE 6
INC oktave
ENDSELECT
GOSUB ermittledifferenz_okt(gt$,vorzeichen$(art,i,2),0,oktave)
yposition=90-(2.5*differenz_o)-1+seite
PUT xposition,yposition,b$
xposition=xposition+10
NEXT i
oktave=1
xposition=35
FOR i=1 TO anzahl
SELECT i
CASE 2
INC oktave
CASE 3
DEC oktave
CASE 4
INC oktave
CASE 5
DEC oktave
CASE 6
INC oktave
ENDSELECT
GOSUB ermittledifferenz_okt(gt$,vorzeichen$(art,i,2),0,oktave)
yposition=90-(2.5*differenz_o)-1+seite
PUT xposition,yposition,b$
xposition=xposition+10
NEXT i
RETURN
'
' -------------------------
' - VORZEICHENEINTRAGEN_K -
' -------------------------
'
PROCEDURE vorzeicheneintragen_k
oktave=4
xposition=35
FOR i=1 TO anzahl
IF i=5 THEN
DEC oktave
ELSE
IF i=6 THEN
INC oktave
ENDIF
ENDIF
GOSUB ermittledifferenz_okt(gt$,vorzeichen$(art,i,2),0,oktave)
yposition=90-(2.5*differenz_o)+seite
PUT xposition,yposition,kreuz$
xposition=xposition+10
NEXT i
xposition=35
oktave=2
FOR i=1 TO anzahl
IF i=5 THEN
DEC oktave
ELSE
IF i=6 THEN
INC oktave
ENDIF
ENDIF
GOSUB ermittledifferenz_okt(gt$,vorzeichen$(art,i,2),0,oktave)
yposition=90-(2.5*differenz_o)+seite
PUT xposition,yposition,kreuz$
xposition=xposition+10
NEXT i
RETURN
'
' ----------------------
' - SCHLUESSELZEICHNEN -
' ----------------------
'
PROCEDURE schluesselzeichnen
COLOR 1
CIRCLE 20,20,7
FILL 20,20
LINE 27,20,20,35
LINE 28,20,21,35
GET 10,10,30,40,fschl$
CLS
CIRCLE 30,30,7
LINE 23,30,37,10
LINE 24,30,38,10
LINE 37,10,33,8
LINE 38,10,34,8
LINE 33,8,30,10
LINE 34,8,31,10
LINE 30,10,30,42
LINE 31,10,31,42
CIRCLE 31,42,3
FILL 30,42
GET 20,5,40,45,gschl$
CLS
RETURN
'
' ---------------
' - ZEICHNENOTE -
' ---------------
'
PROCEDURE zeichnenote(x,y,l)
COLOR 1
SELECT l
CASE 1
CIRCLE x,y,5
CIRCLE x,y,6
CASE 2
CIRCLE x,y,5
CIRCLE x,y,6
LINE x+5,y,x+5,y-15
LINE x+6,y,x+6,y-15
CASE 4
CIRCLE x,y,5
LINE x+5,y,x+5,y-15
LINE x+6,y,x+6,y-15
FILL x,y+1
FILL x,y-1
CASE 8
CIRCLE x,y,5
LINE x+5,y,x+5,y-15
LINE x+6,y,x+6,y-15
FILL x,y+1
FILL x,y-1
LINE x+5,y-15,x+10,y-4
LINE x+6,y-15,x+11,y-4
CASE 100
PUT x,y,kreuz$
CASE 101
PUT x,y,b$
ENDSELECT
RETURN
'
' --------------------
' - @GUELTIGERAKKORD -
' --------------------
'
' prüft, ob die Funktion bekannt ist,
' antwortet via TRUE/FALSE-Flag
'
FUNCTION gueltigerakkord(n$)
IF n$="T" OR n$="SP" OR n$="DP" OR n$="S" OR n$="D" OR n$="TP" OR n$="D7" THEN
RETURN 1
ELSE
RETURN 0
ENDIF
ENDFUNC
'
' ***************
' ** Datenteil **
' ***************
'
toene:
DATA c,d,e,f,g,a,h
'
vorzeichen:
DATA f,fis,c,cis,g,gis,d,dis,a,ais,e,eis
DATA h,b,e,es,a,as,d,des,g,ges,c,ces
'
tonleiter:
DATA 1,c
DATA 2,cis,des
DATA 1,d
DATA 2,dis,es
DATA 1,e
DATA 2,eis,f
DATA 2,fis,ges
DATA 1,g
DATA 2,gis,as
DATA 1,a
DATA 2,ais,b
DATA 2,h,ces