Zufällig und programmgesteuert einen "guten" nächsten Akkord generieren?

Ich bin ein Softwareentwickler/Musiker, der vor Beginn der Sommerkurse Freizeit hat. Ich wollte meine Akkordlese- und Improvisationsfähigkeiten schärfen.

Ich möchte eine Phrase variabler Länge generieren, die pseudozufällig generierte Akkorde enthält. Ich möchte keine völlig zufälligen Akkorde verwenden, weil ich nicht denke, dass das gut klingen oder Spaß machen würde.

Gibt es Regeln, die Sie befolgen müssen, wenn Sie eine Progression oder einen "nächsten Akkord" erstellen, die Ihnen eine höhere Wahrscheinlichkeit geben, etwas zu machen, das gut klingt, und ist diese Methode besser als das, was Sie erreichen würden, wenn Sie nur vollständig zufällig generierte Akkorde verwenden würden?

Was ich mir gerade vorstelle, ist so etwas wie 8 oder 16 Takte aus einem Leadsheet zu bekommen, mit interessanten Akkorden zum Blattlesen und Üben für den Tag. Eine Melodie interessiert mich im Moment nicht wirklich. Nach dem, was ich gelesen habe, haben derzeit selbst die besten KI-Forscher Probleme, Melodien für eine bestimmte Progression zu erstellen.

Es gibt einige Untersuchungen dazu mit KI, aber ich denke, es ist ein wenig übertrieben für das, was ich versuche zu tun. mateuszdorobek.pl/publication/Jazz-chords-generation
Ich spiele gerne mit Umkehrungen und negativer Harmonie. Und zwischen Oktaven springen. Und Wolfspfeifen. Und Noten spielen wie eine Wippe oder andere Varianten. Und Akkorde/Melodien mischen und mit Lautstärkeintensität und Wiederholung spielen.
Ich denke, eine Wolfspfeife, die in Form eines ganzen Akkords ist, ist ziemlich cool, aber sie klingt ein bisschen roboterhaft, also streue sie vielleicht nicht die ganze Zeit.
Sehen Sie sich die Band-in-a-Box-Software von PG Music an. Es hat eine Funktion namens Reharmonize, die sich nach dem anhört, was Sie gerne tun würden. Es erfordert jedoch eine Melodie, von der aus gearbeitet werden kann. Ich weiß nicht, wie die Software auf ihre Progressionen kommt, aber ich bin mir sicher, dass dahinter eine interessante Programmierung steckt.
Wenn wir alle Akkorde sus4s machen würden, würde die Wahrscheinlichkeit steigen, dass irgendeine zufällige Akkordfolge (aus diesen gemacht) anständig oder besser klingen würde?
Vielleicht ist en.wikipedia.org/wiki/Markov_chain für Sie interessant
Neuronale Netze mit Long-Short-Term-Memory (LSTM) würden hier wahrscheinlich gut funktionieren. Etwas umständlich, weil man es erst mit vorhandener Musik trainieren muss, aber man könnte wahrscheinlich mit relativ wenig Aufwand ein Spielzeugbeispiel relativ gut zum Laufen bringen.

Antworten (10)

Es gibt mehrere "Akkordkarten" im Netz, die Akkordfolgen anzeigen; diese können ein guter Ausgangspunkt sein. Die Akkordabbildungen geben den Akkorden keine relativen Gewichte oder Wahrscheinlichkeiten.

Eine einfache Markov-Kette ist auch ein gutes Modell (aber sehr begrenzt). Die Idee ist, zufällig (mit angegebenen Wahrscheinlichkeiten) die Wahrscheinlichkeit einer Akkordfolge zu erzeugen. Triviale Version:

I -> V .40
I -> IV .60
IV -> I .30
IV -> V .70 
V -> I 1.00

Diese Übergangsmatrix kann erweitert werden; es ist zu kurzsichtig (nur on3 chord back), um irgendetwas zu erzeugen, das gut klingt. Man könnte ein System mit zwei (oder mehr) Schritten machen, aber das wird schnell groß (nicht schwer zu programmieren, nur langweilig). Auch hier erfasst es keine Langstreckenfunktionen.

Ich habe (aber nicht sehr ernsthaft) eine Markov-Kette mit Seiteninformationen ausprobiert (V -> I wird wahrscheinlicher, wenn die Länge der Kette zunimmt). Andere Nebeninformationen können für weitreichende Muster verwendet werden.

Wie in anderen Antworten erwähnt, können einige Aktienbewegungen (I -> ii6 -V7) aufgeteilt und als ein einzelnes Objekt behandelt werden (ebenso wie ii0-I64-V7-I oder ähnliches).

Es gibt viele Abhandlungen zu diesem Thema. Man kann Google Scholar durchsuchen, um interessante Sachen zu finden.

Formale Grammatiken

Ich habe einige Nachforschungen über formale Grammatiken für die Komposition angestellt . Eine formale Grammatik G = (V, S, P) besteht aus einem Vokabular V , einem Startsymbol S in V und Ersetzungsregeln P . Eine Regel besteht aus einer linken Seite (LHS), die beschreibt, was sie ersetzen kann, und einer rechten Seite (RHS), die den Ersatz beschreibt. Wenn Sie harmonische Verläufe modellieren möchten, würde Ihr Vokabular aus Akkorden bestehen. Betrachten Sie diese einfache Akkordgrammatik, die ich mir gerade ausgedacht habe:

V = {I, IV, V}
S = I
P = {
  p1: I  -> V I
  p2: V  -> I IV
  p3: IV -> I
}

Wir beginnen mit S in Schritt 0 . Für jeden Schritt wählen wir ein zufälliges Symbol im Satz und eine zufällige Regel, die das Symbol als LHS hat. Wir ersetzen dann das Symbol im Satz durch die rechte Seite der Regel. Dies kann wiederholt werden, bis keine Symbole mehr ersetzt werden können (in diesem Fall unbegrenzt). Hier ist ein Beispiel:

Schritt Regel Satz
0 - I
1 p1 V I
2 p2 I IV I
3 p1 I IV V I
4 p1 I IV V V I
5 p2 I IV I IV V I
6 p3 I IV I I V I

Komplexe Akkordgrammatiken

Steedman 1 definiert eine Grammatik für Jazz mit 12 Takten:

Akkordsubstitutionsregeln für 12-Takt-Jazz von Steedman

Ein weiteres Beispiel von Rohrmeier 2 (nicht alle Regeln gezeigt):

Akkordersatzregeln von Rohrmeier

Quick und Hudak 3 verwenden Auswahlwahrscheinlichkeiten und einen hochgestellten Index, der die Dauer des Akkords angibt :

probabilistische zeitliche Graphgrammatik für harmonische Progression von Quick und Hudak

Diese Bilder wurden direkt von den Referenzen unten genommen. Ich werde die Syntax und Operationen hier nicht erklären; Bitte lesen Sie die vollständigen Papiere.

Vergleich mit maschinellem Lernen

Während maschinelles Lernen, insbesondere künstliche neuronale Netze (KNNs), sehr gut in der Lage sind, Sprachaufgaben zu lösen, haben Grammatiken (und traditionelle regelbasierte Systeme im Allgemeinen) einige Vorteile:

  • Einfach: Es ist im Wesentlichen nur ein String-Ersatz. Das Einrichten eines KNN ist komplexer.
  • Transparent: Es ist klar, warum die Grammatik tut, was sie tut. ANNs sind "Blackboxes".
  • Flexibel: Wenn Sie nicht zufrieden sind, ändern Sie die Regeln. ANNs müssen umgeschult werden.

Der Nachteil ist, dass Sie sich das Modell ausdenken müssen. Grammatiken „lernen“ nicht aus Daten. Aber sie können und wurden auch mit ML-Ansätzen kombiniert.

Markov-Ketten und Übergangsmatrizen verlaufen irgendwie orthogonal zu den hier gezeigten Grammatiken. Mit ersterem entwickelst du die Progression in Richtung der Timeline. Mit letzterem entwickeln Sie den Übergang vom Abstrakten zum Konkreten und die gesamte Zeitachse auf einmal. Ich denke, beide Ansätze haben Vorzüge. Zumindest bei kontextfreien Grammatiken verliert man irgendwie den Richtungsaspekt.

Schlussfolgerungen

Grammatiken sind einfach einzurichten und für die Aufgabe geeignet. Sie können sich eigene Regeln einfallen lassen oder vorhandene Grammatiken aus der Literatur verwenden. Probieren Sie sie aus!


Verweise

  1. Markus Steedmann. Der Blues und die abstrakte Wahrheit: Musik und mentale Modelle. Mentale Modelle in der Kognitionswissenschaft , Seiten 305–318, 1996.

  2. Martin Rohrmeier. Ein generativer Grammatikansatz zur diatonischen harmonischen Struktur. In Proceedings of the 4th Sound and Music Computing Conference , Seiten 97–100, 2007.

  3. Donya Quick und Paul Hudak. Eine zeitlich generative Graphgrammatik für harmonische und metrische Strukturen. In Proceedings of the International Computer Music Conference , 2013.


† Ich empfehle, sich in Probabilistic Temporal Graph Grammars 3 einzulesen . Donya Quick hat Kulitta weiterentwickelt , eine Haskell-Bibliothek für automatische Komposition, die solche Grammatiken zur Erzeugung harmonischer Verläufe verwendet.

Dies ist eine faszinierende Antwort - ich würde einen Abschnitt unter ML hinzufügen. Eine Anwendung von ML könnte darin bestehen, eine Reihe von Akkordkombinationen zu generieren – wobei jeder Akkord in Beziehung zum anderen als Vektor dargestellt wird (keine einfache Aufgabe) – und dann einen oder mehrere Menschen eine Bewertung abgeben zu lassen, wie gut die Akkordfolge klingt. Bei diesem Ansatz könnten Sie dem Modell "beibringen", wie es ästhetisch ansprechende Kombinationen findet, indem Sie Muster in den Akkorden beobachten, die sonst schwer zu erkennen wären. Da Akkordfolgen kurz sind, wäre es schnell, jeder von Hand eine Bewertung zu geben.
@PaulHazen Danke, ich stimme zu, Grammatiken sind faszinierend. Was Sie beschreiben, klingt wie etwas in der Nähe einer Markov-Kette (1. Ordnung, wenn nur Akkordpaare verwendet werden). Während Sie menschliche Bewerter verwenden könnten, werden die Übergangsmatrizen normalerweise anhand bestehender Progressionen trainiert. Auf den ästhetischen Geschmack von Meisterkomponisten kann man im Wesentlichen ein Sparschwein setzen. Dennoch haben Markov-Ketten auch Nachteile. Ihnen fehlt zum Beispiel eine großräumige Struktur, die Sie mit Grammatiken leicht erreichen können.
"...bis keine Symbole mehr ersetzt werden können (in diesem Fall auf unbestimmte Zeit)" ist das eigentliche Problem / die eigentliche Herausforderung, anstatt den "nächsten Akkord" auszuwählen. Es ist der Unterschied zwischen sinnlosem Geschwätz und einer vernünftigen Phrase. Das Steedman-Beispiel scheint das Problem zu lösen, da es sich um eine Reihe von Substitutionen / Einfügungen in einem 12-Takt-Blues handelt, eine vorgegebene Phrasenstruktur, nicht wirklich ein Generator für den nächsten Akkord.
@MichaelCurtis Mein einfaches Beispiel wiederholt sich unendlich, aber Sie können auch sehr genau angeben, welche Abstraktionen auf welcher Ebene der Ableitung erscheinen. Bei einer kontextfreien Grammatik erhält man den Satz als Blätter einer Baumstruktur. Diese Baumstruktur kann Phrasen, Takte, Spannung/Freigabe enthalten – wirklich jede hierarchische Organisation. Aus diesem Grund bevorzuge ich Grammatiken als Grundlage gegenüber Markov-Ketten usw. Sie ermöglichen Automatisierung und Randomisierung auf sehr bewusste Weise, auf Kosten dessen, dass ich tatsächlich darüber nachdenken muss, wie das generierte Stück aussehen soll.

Ein vernünftiger Anfangsansatz besteht darin, eine Tonart auszuwählen, einen ersten Akkord zu erzeugen, jede Note als unabhängige Stimme zu behandeln und dann für nachfolgende Akkorde eine oder zwei Noten (Stimmen) um jeweils einen oder zwei Halbtöne zu ändern und dabei innerhalb der Tonart zu bleiben.

Dadurch erhalten Sie eine Reihe von Akkorden mit sanfter Stimmführung, was ein wichtiges Element beim Erstellen ansprechender Akkordfolgen ist. Sobald Sie die Arten von Sequenzen sehen, die Sie erhalten, können Sie den Algorithmus verfeinern. Beispielsweise kann es Einschränkungen geben, wie viele Bewegungen in eine Richtung ausgeführt werden können oder ob zwei Noten in die gleiche oder in unterschiedliche Richtungen bewegt werden müssen.

Wenn Sie wirklich in die Tiefe der Dinge vordringen wollen, finden Sie eine Kopie (oder vielleicht eine Online-Zusammenfassung) von Johann Fux' The Study of Contrapoint und codieren Sie die Regeln für "erste Spezies" in drei oder vier Stimmen.


Um eine vollständige Phrase zu erzeugen, ist es wahrscheinlich am einfachsten, das "Phrasenmodell" zu verwenden, was bedeuten würde, einen Tonic-, Dominant-, Dominant- und wieder Tonic-Akkord in dieser Reihenfolge einzufügen. Da Sie diatonische Akkorde erzeugen (mit dem obigen Algorithmus), können Sie die Funktionen jedes Akkordtyps codieren, um eine grobe Analyse der erzeugten Akkorde durchzuführen.

Ich mag den Ansatz, obwohl er nicht genau zu dem Jazz-Tag zu passen scheint, das das OP in der Frage hat.

KI und Computerunterstützung sind nicht dasselbe. Echte KI ist sehr schwer, weil der Computer alle Muster aus Versuch und Irrtum erschließen muss.

Aber in Ihrem Fall könnten Sie ziemlich einfach Folgendes programmieren:

  • allgemeine Kadenzmuster
  • Regeln über Bewegungen nach Quinten- oder Terzenzyklen
  • Varianten von Akkorden
  • mehrere Modulationsmuster, einschließlich enharmonischer verminderter Septimen.

Persönlich würde ich empfehlen, eine Reihe von SQL-Tabellen zu verwenden, um zunehmende Komplexitätsstufen zu definieren. Sie könnten beispielsweise Akkordtypen und ihre Umkehrungen in einer Tabelle definieren. Eine andere Tabelle würde Sequenzen von Akkorden und Umkehrungen auflisten, die gut zusammenpassen, von einfachen Zwei-Akkord-Folgen bis hin zu komplexeren Kadenzen.

Das Schöne daran wäre, dass zusätzliche Tabellen verwendet werden könnten, um komplexere Prozesse zu organisieren (wie das Modulieren einer Tonart eine kleine Sekunde tiefer).

Sie können es auch progressiv tun: Beginnen Sie mit nur ein paar einfachen Kadenzen und einigen einfachen harmonischen Bewegungen und fügen Sie dann neue Varianten und Komplexitäten hinzu, während Sie das System entwickeln.

Übrigens spekuliere ich nicht nur als Mitpianist, ich bin auch ziemlich aktiv im Stackoverflow. Ich könnte wahrscheinlich dazu überredet werden, an so etwas mitzuarbeiten, weil ich manchmal darüber nachgedacht habe, es auch zu tun. :D

Zerlegen Sie dies in Teile:

  1. Um Ihre Akkordlesefähigkeiten zu verbessern, empfehle ich, sich ein richtiges Buch (oder zwei) und ein Metronom zu besorgen. Öffnen Sie das echte Buch auf einer zufälligen Seite und stellen Sie das Metronom auf ein herausforderndes Tempo ein. Legen Sie sich zur Abwechslung eine Liste mit Genres an und wählen Sie auch aus diesen (z. B. Swing, Bossa, Samba, Doubletime-Ballade usw.). Wenn das Metronom beginnt, versuchen Sie, das ganze Stück zu lesen, ohne anzuhalten, und nehmen Sie sich selbst auf. Danach können Sie die Aufzeichnung durchgehen und sehen, mit welchen Abschnitten Sie Probleme hatten. Der Vorteil dieses Ansatzes besteht darin, dass Sie echte Akkordfolgen verwenden, denen Sie wahrscheinlich beim Spielen begegnen werden. Howard Roberts hatte eine Gitarrenmethode , die empfahl, etwas Ähnliches zu tun (Jazz Guitar Technique in 20 Weeks).

  2. Um die Frage zu beantworten, wie diese in Software generiert werden können, wäre der einfachste Ansatz, einen Korpus/Datensatz von Akkorden zu nehmen und ein Markov-basiertes Modell zu trainieren, um neue Sequenzen vorherzusagen. Ein Beispieldatensatz ist hier https://github.com/infojunkie/ireal-musicxml , obwohl Sie möglicherweise eine zusätzliche Verarbeitung durchführen müssen, um die Akkorde in ein nützliches Format zu bringen.

Gibt es Regeln, die Sie befolgen müssen, wenn Sie eine Progression oder einen "nächsten Akkord" erstellen, die Ihnen eine höhere Wahrscheinlichkeit geben, etwas zu machen, das gut klingt, und ist diese Methode besser als das, was Sie erreichen würden, wenn Sie nur vollständig zufällig generierte Akkorde verwenden würden?

Ja – zwei, die mir in den Sinn kommen, sind Stimmführung und Periodizität. Um die Sprachführung in Software zu implementieren, können Sie die von Dmitri Tymoczko vorgeschlagenen Algorithmen verwenden. Hier gibt es eine Implementierung in R: https://github.com/pmcharrison/minVL Die Periodizität bestimmt, wie konsonant ein Akkord für ein bestimmtes Schlüsselzentrum klingt - es gibt laufende Forschungen, um festzustellen, wie dies zu Akkordfolgen führt, aber es wird Ihnen einen Anfang geben zeigen, ob ein gegebener Akkord im Vergleich zu einem zufällig generierten Anfangspunkt "gut klingt". Siehe https://github.com/pmcharrison/incon für verschiedene Implementierungen von Periodizität/Harmonizität. Aus dieser Auswahl bevorzuge ich Stolzenberg (2015).

Sie könnten etwas ausprobieren, das um harmonische Sequenzen herum funktioniert.

Es gibt ein weit verbreitetes Sprichwort, das so etwas wie „Es ist kein Fehler, wenn du es zweimal spielst“ oder in Adam Neelys Worten „Wiederholung legitimiert“ lautet. Die harmonische Sequenz nutzt diese Idee aus, weil Sie ein harmonisches Muster wiederholen. Auch wenn der Verlauf „seltsam“ ist, kann die Sequenzierung ihn oft zu etwas Interessantem machen.

Erstellen Sie einige Vorlagen für zwei oder drei Akkordfolgen (Bi-Gramme oder Tri-Gramme). Sie können dies auf verschiedene Arten tun, aber beginnen Sie mit einem der vier diatonischen Septakkorde und bewegen Sie sich dann durch Stimmführung oder Grundtonfolge zum nächsten Akkord Verfahren, werden Ihnen eine ganze Menge Bi-Gramme geben.

Nehmen Sie die Palette der Bi-Gramme, wählen Sie zufällig eines aus und ordnen Sie es dann für drei Iterationen an. Wählen Sie zufällig die aufsteigende/absteigende Richtung und einen halben Schritt oder eine ganze Schrittweite für die Sequenz aus.

Sie sollten in der Lage sein, die sequenzielle Passage mit einer vollen oder halben Kadenz abzurunden, indem Sie sich vom letzten sequenziellen Akkord durch die Grundtonfolge von P4 oder P5 zu entweder a oder bewegen, um die Kadenz zu iibeginnen V, sollte funktionieren. Sie können das programmieren oder es spontan als eine Art Verbesserungsübung ausführen.

Das reicht für mindestens 8 bar und sollte in den meisten Fällen musikalisch sinnvoll sein. Wenn Sie auf der Bi-Gramm-Palette für eine gute Abwechslung sorgen, erhalten Sie viel "Zufälligkeit". Aber kein Zufall im musikalischen Sinne von musikalischem Nonsens. Die Reihenfolge wird es schaffen. Aber drei Stufen der zufälligen Auswahl (Bi-Gramm, Sequenzrichtung, Sequenzabstand) werden viele neuartige Progressionen liefern.

Da Sie dies nicht aus "ernsthaften" Gründen tun, sondern nur um herumzuspielen und Ihre Fähigkeiten zu schärfen, wie wäre es damit: Lernen Sie, mit einfachen KI-Netzwerken (z. B. Tensorflow) zu arbeiten. Laden Sie so viele Akkordfolgen wie möglich herunter (vielleicht in Form von kostenlosen Tabulaturen, von denen es viele gibt). Schreiben Sie einen kleinen Parser, der nur die Akkordfolge extrahiert. Trainieren Sie damit Ihr Netzwerk. Sehen Sie, was es ausspuckt.

Alternativ können Sie versuchen, das Netzwerk persönlich zu schulen. Lassen Sie es einfach sein Ding machen, spielen Sie seine Progression auf Ihrer eigenen Gitarre und entscheiden Sie selbst, ob es Ihnen gefällt oder nicht; speisen Sie diese Entscheidung dann wieder in das Training ein.

Beide sollten recht interessante und auch ziemlich durchführbare Übungen sein. Schaffen Sie damit die nächste Rockoper? Wahrscheinlich nicht. Aber es sollte in der Tat eine nette kleine Übung sein!

Wenn Sie sich der Aufgabe gewachsen fühlen, einen Datensatz zu kennzeichnen und den KI-Weg gehen möchten, können Sie LSTMs ausprobieren.

Sie können eine Tonart auswählen, und dann wäre jeder Akkord in der Tonart eine kategoriale Variable (vielleicht bleiben Sie nur bei Dur- und Moll-Akkorden und fügen dann Erweiterungen in späteren Experimenten hinzu).

Wenn C->Db->...->Bes 1->2->...->12für Dur und 13->...->24für Moll ist, dann ist die Progression in der Tonart C:

C G A Fwäre der Datenpunkt [1 8 10 6],

Wenn Sie über einen großen Datensatz dieser Punkte verfügen, können Sie LSTMs trainieren.

Das Python-Paket Kerasenthält viele hilfreiche Out-of-the-Box-Modelle. Die Syntax zum Erstellen eines neuronalen Netzwerks in Keras lautet (in Pseudocode):

from keras import Sequential, LSTM, Dropout

model = Sequential()
model.add(LSTM(units = 50, return_sequences = True, input_shape =(4, 1))
model.add(Dropout(0.2))
model.add(LSTM(units = 50, return_sequences = True))

model.fit(training_data)

Ein weiterer Vorteil dieses Ansatzes gegenüber der Genauigkeit besteht darin, dass Sie dem Datensatz zusätzliche kategoriale Variablen hinzufügen können. Wenn Sie beispielsweise gemeinsame Akkordfolgen für ein Genre erhalten möchten, beschriften Sie beim Erstellen Ihres Datenpunkts auch das Genre.

So könnte eine Akkordfolge im Rock-Genre aussehen: C G A Fwäre der Datenpunkt[1 8 10 6, 0]

wobei die letzte 0 das Genre ist.

Die allgemeine Verwendung davon ist, dass das Modell die nächsten Akkorde zurückgibt, wenn Sie einen Startakkord eingeben.

# Pseudocode
input data = [6]
model.predict(input_data)
-> [6, 8, 3, 1]

The best [imo] guide on LSTMs is [here][1]. It assumes familiarity with Neural Networks in general.


  [1]: https://colah.github.io/posts/2015-08-Understanding-LSTMs/

Es ist komplizierter als "bei gegebenem x-Akkord, was als nächstes kommen könnte"? Dies impliziert, dass in einer Akkordfolge n nur mit n-1 und nicht mit n-2 zusammenhängt. Sie erwarten zu Recht, dass völlig zufällig klingende Akkorde nicht gut klingen. Und obwohl es Möglichkeiten gibt, sicher zu sein, dass Akkord n ​​+ 1 nach Akkord n ​​nicht fehl am Platz klingt, erklingt eine Funktion von rein f (n-1) (insgesamt für das Ohr, das die gesamte Progression mit hört ein Kontext größer als 2 aufeinander folgende Akkorde) genauso zufällig. Anders ausgedrückt, obwohl es fair ist zu sagen, dass "Akkord x auf Akkord y folgen kann", gibt es einen angenommenen Kontext einer breiteren Progression, bei der Akkord x und Akkord y zusammenpassen.

Um minimal zufällig und schlecht zu klingen, müsste Ihr Progressionsgenerator damit beginnen, diesen Kontext irgendwie auszuwählen oder zu erzeugen (Tonart / Modus / einige stilistische Tendenzen für die Akkordauswahl) und dann darin arbeiten, um eine Basisprogression zu erstellen, und dann optional modulieren diese Basisprogression in aufeinanderfolgenden Wiederholungen mit Variationen und Substitutionen der Basisprogressionsakkorde.

Es könnte nützlich sein, ein Datenmodell des Quintenzirkels zu erstellen und die Akkorde intern als Offsets um den Kreis herum zu modellieren, da dies die Auswahl und die Code-Syntax der Beschreibung von Akkorden durch ihre Tonartmitte zueinander in Beziehung setzen würde , und die Beziehungen zwischen verschiedenen Schlüsselzentren intuitiver in Ihrem Code.

Ich habe ein (ins Stocken geratenes) Projekt, bei dem ich darauf hingearbeitet habe, etwas Ähnliches zu tun. Es war auch eine Übung im Studium der Musiktheorie, da ich jedes grundlegende Theoriekonzept wirklich gut lernen musste, um diese Konzepte in Beziehung zueinander als Klassen und Objekte zu entwerfen, nur um ein Grundgerüst zu haben, in dem ich mich musikalisch ausdrücken konnte Konzepte im Code. Über 2-3 Wochen habe ich eine ziemlich solide Basisarchitektur von Tonhöhenklassen, Intervallen und Skalen ausgearbeitet, mit Einheitentests, um sie für verschiedene Transpositionen und Berechnungen zu verwenden. Hier bin ich ins Stocken geraten, aber der nächste Schritt wäre gewesen, intelligente Klassen zu implementieren, um viele Akkordkonzepte auf den Intervall- und Skalenkonzepten aufzubauen, und dann vielleicht den Quintenzirkel und Schlüsselzentren zu integrieren. Erst danach wäre ich bereit gewesen, dieses Framework in einem prozeduralen Code zu verwenden, um zu versuchen, etwas Cooles zu tun, wie das Generieren von abgedroschener Robotermusik. :)

Rahmen-Challenge:

Es ist nicht sinnvoll zu kodifizieren, was eine "gute" pseudozufällige Progression ist, da solche Modelle entweder bereits durch Musiktheorie oder Musikanalyse erklärt werden. Anstatt Computer zu verwenden, um kreativ zu sein, warum nicht die Kreativität bestehender Kunst verstehen, die von Menschen für Menschen gemacht wurde.

Die Prämisse Ihrer Frage geht von einer idealisierten Version einer "guten" Akkordfolge aus. Eine andere Annahme, die Sie machen, ist, dass Sie einen Computer durch Regeln einige "gute" Akkorde erzeugen lassen können. Das heißt, Sie können eine angenehme Akkordfolge erzeugen, ohne unbedingt die Funktion oder die zugrunde liegenden Prinzipien der Musik zu verstehen, auf die viele andere Antworten angespielt und Bezug genommen haben.

Was ein Verfahren tun kann, ist, vorhandene Progressionen nachzuahmen, selbst wenn es KI verwendet (was nur angewandte Heuristik ist).

Anstatt zu versuchen, Musik auf ein paar Akkord-Progs oder Markov-Ketten zu reduzieren, versuchen Sie zu untersuchen und zu erklären, warum gängige Progressionen für Sie „gut“ klingen.