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

https://www.eurovision.de/geschichte/1958-Grand-Prix-Eurovision-De-La-Chanson-Europeenne-in-Hilversum,hilversum103.html

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