Autor Thema: Generalbaß aussetzen  (Gelesen 5177 mal)

fugenkomponist

  • Gast
Generalbaß aussetzen
« am: Montag, 31. März 2014, 12:14 »
Hallo,

tl;dr: will jemand automatischen Generalbaß in LilyPond?

mein Vater hat mich vor ner Weile mal gefragt, obs was gäbe, was automatisch Generalbaß aussetzt. Hab mich da mal ein bisschen rangesetzt und was in Haskell gefrickelt, was zumindest einfachen Generalbass unter diversen Annahmen (keine Ziffer ≙ 5, keine Haltebögen, genug Spielraum, dass eine „Lösung“ existiert, genau ein Akkord pro Baßton, …) setzen kann. Allerdings noch doof per Backtracking und ohne Bewertung (ich kann verdeckte Parallelen etc. an- oder ausschalten, aber nicht eine niedrigere „Strafe“ als für offene Parallelen geben, also gibts im Allgemeinen mehrere oder (schlimmer) keine Lösung …). Mir ist allerdings (inspiriert durch einen Vortrag über den TeX-Zeilenumbruchalgorithmus, den ich vor langer Zeit gehört habe) eine Idee gekommen, wie man das flexibler gestalten kann (Stichworte: Akkorde sind Knoten, Übergänge von einem zum nächsten gerichtete, gewichtete Kanten, dann Dijkstra draufwerfen). Nun frage ich mich:
• Bestünde Interesse, sowas in oder für LilyPond umgesetzt zu sehen? (als extra Programm, was .ly-Dateien einliest und den Generalbaß ausgibt oder vielleicht auch als eigener Engraver)
• Hätte jemand Lust (und Kenntnisse im Generalbaßspiel (praktisch oder theoretisch) oder einer Programmiersprache (Scheme? Haskell? C++? was anderes?)), sich an so etwas zu beteiligen?
• Oder gibts sowas vielleicht sogar schon und ich hab bloß nie davon gehört?

Viele Grüße,
Malte
« Letzte Änderung: Montag, 31. März 2014, 21:12 von fugenkomponist »

erich

  • Gast
Re: Generalbaß aussetzen
« Antwort #1 am: Mittwoch, 2. April 2014, 15:16 »
Hallo Malte,

ich weiß nicht, wozu du die Generalbassnotation verwenden willst, aber vielleicht kannst du mit meinen Überlegungen etwas anfangen.

Mir hat ein Freund zum Einstieg ins Klavierspielen seine Bezeichnungsweise der Griffe für Akkorde gezeigt, die bei mir dann zu folgender Überlegung reiften.

Ich kann in Lilypond zu einer Folge von Akkorden die aufeinanderfolgenden Intervalle dieser Akkorde ausgeben; bisher habe ich dazu die Fingersatzbezeichnungen gewählt,
ich will jedoch im nächsten Schritt stattdessen die Generalbassnotation verwenden und wahlweise die Noten der Akkorde bis auf die tiefste löschen. Ich verspreche mir davon, daraus die Griffe fürs Klavier leicht ablesen zu können.

Ich füge mal ein kleines Stück, so wie ich es mir vorstelle bei.

Gruß
Erich

p.s. die Intervalle werden in Halbtonschritten angegeben.
« Letzte Änderung: Mittwoch, 2. April 2014, 15:50 von erich »

fugenkomponist

  • Gast
Re: Generalbaß aussetzen
« Antwort #2 am: Donnerstag, 3. April 2014, 13:21 »
ich weiß nicht, wozu du die Generalbassnotation verwenden willst,
Naja, ganz normal da, wo sie halt verwendet wird (Renaissance bis frühe Klassik, mein Vater bzw. seine Gesangslehrerin hat gefragt, weil sie zwar Klavier spielen kann, aber eben keinen Generalbaß, wenn ich das richtig verstanden habe). Aber es geht mir nicht um die Notation an sich, sondern eben die Interpretation.
Zitat
aber vielleicht kannst du mit meinen Überlegungen etwas anfangen.
Ich fürchte nein. Ich will tatsächlich bloß das Aussetzen des Generalbasses automatisieren, weil es eben viele gibt, die nie Generalbaßunterricht hatten und nicht vom Blatt nen Generalbaß begleiten können. Es geht also nicht um den Einstieg ins Klavierspielen o. ä. ;)
Zitat
Ich kann in Lilypond zu einer Folge von Akkorden die aufeinanderfolgenden Intervalle dieser Akkorde ausgeben;
Das könnte tatsächlich irgendwann interessant sein, aber wahrscheinlich eher in umgekehrter Richtung ;)
Zitat
bisher habe ich dazu die Fingersatzbezeichnungen gewählt,
Das versteh ich jetzt ehrlich gesagt nicht, ich seh da nirgendwo Fingersätze …
Zitat
ich will jedoch im nächsten Schritt stattdessen die Generalbassnotation verwenden
Die geht aber nicht über Halbtöne, sondern über diatonische Intervalle, hast du vor, das entsprechend anzupassen?

erich

  • Gast
Re: Generalbaß aussetzen
« Antwort #3 am: Donnerstag, 3. April 2014, 14:28 »
Hallo Malte

zunächst wird man sich die verschiedenen Generalbassnotationen in der internen Darstellung von Lilypond ansehen müssen, weil man sich eine Vorstellung vom Sprachumfang der Generalbassnotation verschaffen muss.
Dann wird man einen kleinen Parser für die Analyse des in Generalbass Notierten schreiben müssen; und schließlich muss man das Ergebnis der Analyse in diatonische Noten umsetzen. Es dürfte wohl am einfachsten sein, wenn man dieses in C-Dur (a-moll) machen kann.
Da Lilypond gesetzte Noten ausgibt und keine textuell geschriebenen, könnte die Notwendigkeit bestehen intern transponieren zu müssen; ob es dazu Mittel in Lilypond gibt, weiß ich nicht.

Gruß
Erich

p.s.

Man kann sich die Programmierarbeit dadurch erheichtern, indem man sich das erwartete Akkordmuster von Lilypond erzeugen läßt; dazu gebe man, wenn man beispielsweise einen Dreiklang auf e' erwartet <e' e' e'> ein; man muss dann nur noch die pitches korrigieren.
« Letzte Änderung: Donnerstag, 3. April 2014, 14:56 von erich »

fugenkomponist

  • Gast
Re: Generalbaß aussetzen
« Antwort #4 am: Samstag, 5. April 2014, 16:23 »
Was ungefähr zu tun ist, ist mir schon klar ;) Wärst du denn dabei, wenn ich sowas implementieren würde? Transposition in LilyPond gibts natürlich, was selbst schreiben kann man sonst auch. Aber ich bezweifle, dass es so eine gute Idee ist, zu probieren, das Stück nach C-Dur zu transponieren – man hat ja trotz dem Akkorde mit Vorzeichen, ich denke also, man kann sich diesen Aufwand sparen ;) Deine Erleichterung im P. S. kapier ich ehrlich gesagt nicht, ist es nicht einfacher, gleich einfach die richtigen Töne zu erzeugen?

erich

  • Gast
Re: Generalbaß aussetzen
« Antwort #5 am: Dienstag, 8. April 2014, 08:06 »
Hallo Malte

GB-Ziffern sind relative Notenbezeichnungen; das bedeutet, wenn du ein Stück transponierst bleibt die GB-Bezifferung dieselbe.
Zu prüfen ist, ob Lilypond die transponierten Noten in die interne Struktur schreibt; das ist aber der Fall:

\displayMusic{c'  \transpose c e {c'}}

gibt für das erste C (ly.make-pitch 0 0 0) aus und für das transponierte (ly:make-pitch 0 2 0)

Zum Transponieren: Ein Stück nach C zu transponieren bedeutet für Lilypond keine Schwierigkeit; wenn es also gelungen sein sollte,
auf der internen Struktur die GB-Noten hinzu zufügen, stellt sich die Frage, wie transponiert man zurück in die originale Tonart.
Ich weiß nicht, ob Lilypond intern eine Musikstruktur durch eine einfache Anweisung zurücktransponieren kann.
Andernfalls kann man den ausgesetzten GB als Notentext, also nicht die in Graphik umgesetzten Noten, ausgeben lassen,
harm6 hat hierzu Ausführungen zu meiner Anfrage "notennamen auslesen" gemacht. https://archiv.lilypondforum.de/index.php?topic=1712.msg9477#msg9477
Wenn man so die GB-Noten erzeugt hat, kann man sie durch Lilypond zurücktransponieren lassen.

zu meiner p.s.-Notiz

wenn Du einen Dreiklang erzeugen willst, dessen Töne du noch ermitteln musst, kannst du z.B. <c' c' c'>2 eingeben:
\displayMusic{<c' c' c'>2} erzeugt intern dreimal (ly.make-pitch 0 0 0); nur diese drei Stellen sind zu modifizieren, 

Ich selbst finde es lästig, in traditioneller Notendarstellung zu arbeiten, und habe mir deswegen mein Twintet-System geschaffen;
dann kann ich tonartenunabhängig die Pitches berechnen. Was mir noch fehlt ist, aus der internen Lilypond-Struktur wieder einen
Notentext ausgeben zu können; den könnte man dann wieder konventionell setzen lassen.

Gruß
Erich

fugenkomponist

  • Gast
Re: Generalbaß aussetzen
« Antwort #6 am: Dienstag, 8. April 2014, 09:10 »
Hallo Erich,
GB-Ziffern sind relative Notenbezeichnungen; das bedeutet, wenn du ein Stück transponierst bleibt die GB-Bezifferung dieselbe.
Das stimmt nicht ganz: Angenommen, ich hab in c-Moll ein G mit ♮ stehen (also für den einfachen Dreiklang mit aufgelöster und damit Dur-Terz), dann müsste das beim Transponieren nach a-Moll zu einem E mit ♯ werden. Weitere Fälle gibts auch bei Verbindungen von Ziffern und Vorzeichen.
Zitat
Zum Transponieren: Ein Stück nach C zu transponieren bedeutet für Lilypond keine Schwierigkeit; wenn es also gelungen sein sollte,
auf der internen Struktur die GB-Noten hinzu zufügen, stellt sich die Frage, wie transponiert man zurück in die originale Tonart.
Ich weiß nicht, ob Lilypond intern eine Musikstruktur durch eine einfache Anweisung zurücktransponieren kann.
Warum sollte es in andere Tonarten schwieriger sein als nach C-Dur? LilyPond kann alles ;) Ich versteh aber immer nch nicht, warum ich das tun sollte. Abgesehen von dem oben beschriebenen Problem hat man auch in einem Stück in C-Dur oft genug zusätzliche Vorzeichen (spätestens im Barock), so dass ich da keinen zusätzlichen Nutzen drin sehe …
Zitat
wenn Du einen Dreiklang erzeugen willst, dessen Töne du noch ermitteln musst, kannst du z.B. <c' c' c'>2 eingeben:
\displayMusic{<c' c' c'>2} erzeugt intern dreimal (ly.make-pitch 0 0 0); nur diese drei Stellen sind zu modifizieren, 
Ja, schon klar, dass ich das machen kann, aber auch hier versteh ich halt nicht, warum ich nicht gleich die richtigen Töne nehmen soll. Flexibler wäre es, erstmal überhaupt die rechte Hand zu berechnen, die ja (je nach Möglichkeiten des Programms) auch mal zwei- (Stichwort: Sextakkorde über Tonleiter) oder vierstimmig oder polyphon (Stichwort: Vorhalte) sein kann und erst dann in die Notation zurückzukehren, wenn das alles geklärt ist. Und dann kann ich auch gleich die richtigen Töne verwenden ;)
Zitat
Ich selbst finde es lästig, in traditioneller Notendarstellung zu arbeiten, und habe mir deswegen mein Twintet-System geschaffen;
Wie gibst du das denn ein? Und hast du sowas wie eine automagische Übersetzung von traditioneller Schreibweise nach Twintet und andersrum? Ansonsten hilft mir das glaub ich recht wenig. Und so Sachen wie ganz oben erwähnt (Dur-Terz als ♯ oder ♮ schreiben?) gehen damit natürlich schon mal verloren. Wahrscheinlich sollte ich also in der traditionellen Schreibweise bleiben (auch, damit andere nicht erst Twintet lernen müssen, um mit dem Programm umgehen oder dazu beitragen zu können).

Wenn ich mal Zeit hab, muss ich mich aber sowieso erstmal darum kümmern, wie ich überhaupt an die Informationen aus dem LilyPond-Code rankomme, am besten, ohne einen eigenen Parser schreiben zu müssen ;)

Gruß,
Malte

erich

  • Gast
Re: Generalbaß aussetzen
« Antwort #7 am: Dienstag, 8. April 2014, 11:48 »
Hallo Malte

Zitat
Wenn ich mal Zeit hab, muss ich mich aber sowieso erstmal darum kümmern, wie ich überhaupt an die Informationen aus dem LilyPond-Code rankomme, am besten, ohne einen eigenen Parser schreiben zu müssen ;)

Das ist wohl wahr, wie sollten wir uns sonst zielführend unterhalten können.

Zur Berechnung von Tonhöhen in Twintet:

Zum Pitch (ly:make-pitch o s a) ist in Twintet (o*6 + s + a)*2 = z die Anzahl der Halbtonschritte vom Pitch (ly:make-pitch 0 0 0)
- entsprechend c' - aus gerechnet.

Um den Pitch (ly:make-pitch O S A) für einen Ton zu berechnen, der s Halbtonschritte höher liegt (s kann auch negativ sein, dann
geht es um einen tiefer liegenden Ton) kann man in Twintet die Werte O, S und A durch einfache mathematische Operationen ermitteln:

Man wähle O so, dass gilt 0 <= z+s-O*12 <= 11. (<= kleiner-gleich, O kann auch negativ sein)
Ist z+s-O*12 gerade, dann ist S = (z+s-O*12)/2 und A = 0
Ist z+s-O*12 ungerade, so hat man zwei Möglichkeiten:
  • soll ein Ton mit einem b ausgegeben werden, so ist S = (z+s-O*12 +1)/2 und A = -1/2
  • soll ein Ton mit einem # ausgegeben werden, so ist S = (z+s-O*12 -1)/2 und A = 1/2
    .

Zitat
Wie gibst du das denn ein? Und hast du sowas wie eine automagische Übersetzung von traditioneller Schreibweise nach Twintet und andersrum? Ansonsten hilft mir das glaub ich recht wenig. Und so Sachen wie ganz oben erwähnt (Dur-Terz als ♯ oder ♮ schreiben?) gehen damit natürlich schon mal verloren.

Ich schreibe die Noten in Dateien, die ich mit include einbinde. Ich kann dieselben Notendateien fürs traditionelle Schreiben wie auch den Twintet-Notensatz verwenden.

Die Modifikationen, um Twintet aufzurufen, halten sich Grenzen; sie müssen vom Anwender nicht unbedingt verstanden werden.
Man muss aber auch Twintet als neue Sprache vereinbaren und dazu die define-note-names.scm-Datei erweitern, dazu sollte man schon verstehen, was man macht.

Gruß
Erich

.




Joei

  • Gast
Re: Generalbaß aussetzen
« Antwort #8 am: Freitag, 20. Januar 2017, 09:04 »
Moin,

schade, dass scheint ja nicht gerade auf großes Interesse gestoßen zu sein :( - oder ist es da weitergegangen?

Joei

fugenkomponist

  • Gast
Re: Generalbaß aussetzen
« Antwort #9 am: Freitag, 20. Januar 2017, 17:56 »
Nicht wirklich. Ich hab noch auf der englischen Liste gefragt, aber auch da gabs nicht viel Interesse.

Meine Idee war so ungefähr:
  • Generalbaßziffern ergänzen: nichts zu 5/3, 6 zu 6/3, 2 zu 6/4/2 etc.
  • Aus Baßton, Ziffern und Tonartvorzeichen die drei oder vier Akkordtöne errechnen.
  • Aus diesen Tönen alle möglichen/sinnvollen dreistimmigen Akkorde für die rechte Hand bilden. verschiedene Möglichkeiten bewerten. Begrenzende Faktoren:
    • Töne nur zwischen g und a'' (oder so), beste Bewertung in der Mitte
    • maximal eine Oktave Umfang
    • Verdoppelte Töne sind möglich (GB-Ziffer 6 wird zu rechter Hand Grundton–Quinte–Grundton, Quinte–Grundton–Quinte oder einer der drei Umkehrungen von Grundton–Terz–Quinte), Terzdopplung und fehlende Töne (wenn man den Bass mitrechnet, z. B. Terz–Grundton–Terz zu GB-Ziffer 5) werden schlechter bewertet.
  • Die bewerteten Baßton-rechte-Hand-Kombinationen bilden nun die Knoten eines DAG (gerichteter azyklischer Graph). Von jeder Kombination zu einem Baßton geht eine Kante zu jeder Kombination zum nächsten Baßton. Diese Kanten werden jetzt bewertet:
    • kleine Bewegung/wenig veränderte Töne → kurze Kante
    • Strafe (Verlängerung der Kante) für Oktav- und Quintparallelen, evtl. auch geringere Strafe für Anti- und verdeckte Parallelen (da müßte ich mal nachlesen, wie streng das im Generalbaß gehandhabt wird).
    • Strafe für Querstände
    • Der Einfachheit halber schlechte Bewertung des Zielakkords als Verlängerung der Kante nehmen (statt die Knotenbewertung in der folgenden Lösungssuche noch zu beachten).
  • Den kürzesten Weg von einem der Startakkorde zu einem der Zielakkorde finden. Dijkstra-Algorithmus oder so (weiß grad nicht mehr auswendig, was für Vorteile z. B. bezüglich negativer Kantengewichte oder schnellerer Algorithmen es bringt, daß ich nur nen DAG habe, aber das könnte Sachen vereinfachen).

Schwierigkeiten:
  • wenig bezifferter Baß, wo man sich z. B. manche 6 aus dem Kontext denken kann/muß
  • Welche Baßnoten brauchen einen Akkord, welche sind nur Durchgänge?
« Letzte Änderung: Freitag, 20. Januar 2017, 17:58 von fugenkomponist »

ingmar

  • Gast
re: Generalbaß aussetzen
« Antwort #10 am: Dienstag, 24. Januar 2017, 06:54 »
Hallo,


leider sind die Dinge, die du unter "Schwierigkeiten" nennst, ganz, ganz wesentliche Probleme. Aus einer schulmäßigen vollständigen Bezifferung einen schulmäßigen Satz zu machen, wird dir vielleicht gelingen, aber hier wird ja doch etwas mehr erwartet. Bitte nicht falsch verstehen, aber ich fürchte, das Ergebnis wird den Aufwand nicht rechtfertigen.

Wenn ich sowas vorhätte, würde ich mich mal mit Band-in-a-Box beschäftigen, vielleicht ist das irgendwie nutzbar...


Gruß,
--ingmar