PolyphonMotifDetection

motif

## Class PolyphonMotifDetection

- java.lang.Object
- - motif.PolyphonMotifDetection

-     public class PolyphonMotifDetection
      extends java.lang.Object

- - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `private java.util.ArrayList<java.util.ArrayList<java.lang.Integer>>` | `alKrebs`
    `private java.util.ArrayList<java.util.ArrayList<java.lang.Integer>>` | `alMatches`
    `private java.util.ArrayList<java.util.ArrayList<java.util.ArrayList<MotifData>>>` | `alMotifData`
    `private java.util.ArrayList<java.util.ArrayList<java.util.ArrayList<MultiMotifData>>>` | `alMultiMotifData`
    `private java.util.ArrayList<java.util.ArrayList<java.util.ArrayList<java.lang.Integer>>>` | `alPossibleKrebs`
    `private java.util.ArrayList<java.util.ArrayList<java.util.ArrayList<java.lang.Integer>>>` | `alRepetitions`
    `private int` | `denominator`
    `private java.lang.String` | `key`
    `private int` | `numerator`
    `(package private) java.util.ArrayList<java.util.ArrayList<Beat>>` | `scoreInBeats`
    `private javax.swing.JTextPane` | `textPane`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `PolyphonMotifDetection(int numerator, int denominator, java.lang.String key)` Konstruktor
    `PolyphonMotifDetection(int numerator, int denominator, java.lang.String key, javax.swing.JTextPane textPane)` Konstruktor mit TextPane Log-Ausgaben werden in die TextPane geschrieben

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `void` | `detectMotifs(java.util.ArrayList<java.util.ArrayList<Beat>> scoreInBeats)` detektiert monophone und polyphone Motife der Form Wiederholung, Sequenz, Krebs und Spiegel die Motiflaenge entspricht genau der Laenge eines Takts die erkannten Motife werden getrennt in ArrayLists abgelegt und koennen mittels getMonophonMotifs bzw. getPolyphonMotifs ausgelesen werden
    `private void` | `getAlternateKrebs(java.lang.String[][] sBeats, java.util.ArrayList<java.lang.Integer> indicesToDo, boolean FirstTime)` liefert alle Wiederholungen von Taktmustern mit den gleichen Notenlaengen
    `private Beat` | `getBeat(int Part, int Beat)` liefert einen bestimmten Takt eines Parts als Beat
    `private java.lang.String` | `getBeat(java.lang.String[][] sBeats, int Part, int Beat)` liefet einen bestimmten Takt eines bestimmten Parts als String
    `private void` | `getDifferentMotifs(java.lang.String[][] sBeats, java.util.ArrayList<java.lang.Integer> indicesToDo, boolean FirstTime)` liefert alle Wiederholungen von bestimmten Taktmustern
    `private void` | `getDifferentMotifsFromPart(java.util.ArrayList<MotifData> almd, java.util.ArrayList<Beat> alb, java.util.ArrayList<java.lang.Integer> beatsToDo)` sucht nach Motiven innerhalb eines Parts gesucht werden Wiederholung, Sequenz, Krebs und Spiegel
    `private void` | `getDifferentMultiMotifsFromPart(java.util.ArrayList<MultiMotifData> almd, java.util.ArrayList<MultiBeat> albm, java.util.ArrayList<java.lang.Integer> beatsToDo)` sucht nach polyphonen Motiven innerhalb eines Parts mit mehreren Phrasen gesucht werden Wiederholung, Sequenz, Krebs und Spiegel
    `private int` | `getMaxBeatLength()` gibt die Anzahl maximalen Takte des aktuellen Scores zurueck (diese sollten nach der Quantisierung bei jeder Phrase gleich sein)
    `private int` | `getMaxNoteCountFromBeatInPhrase(int Beat, int Part)` liefert die maximale Notenanzahl eines Takts eines Part
    `java.util.ArrayList<java.util.ArrayList<java.util.ArrayList<MotifData>>>` | `getMonophonMotifs()` liefert eine Arrayliste der monophonen Motife unterteilt in Part->Motif->Motifart (Rep, Seq, Krebs, Spiegel)
    `private void` | `getMotifs()` sucht nach Motiven in der vorgefilterten ArrayList (in alRepetitions) und speichert diese getrennt nach Part und Typ ab (monophone in alMotifData bzw. polyphone in alMultiMotifData)
    `private void` | `getMotifsFromOddKrebs()` sucht nach Krebs-Motiven in der vorgefilterten ArrayList (in alPossibleKrebs) und speichert diese getrennt nach Part und Typ ab (monophone in alMotifData bzw. polyphone in alMultiMotifData)
    `private MultiBeat` | `getMultiBeat(int Part, int Beat)` liefert einen bestimmten Takt eines Parts mit mehreren Phrasen als (innerhalb einer Note absteigen sortierten) Beat zB.: 60 65 62 60 76 63 58 67 63 => 59 65 62 59 64 60 58 64 60
    `private void` | `getMultiOddKrebs(java.util.ArrayList<MultiMotifData> almd, java.util.ArrayList<MultiBeat> albm, java.util.ArrayList<java.lang.Integer> beatsToDo)` sucht nach polyphonen Motiven innerhalb eines Parts mit mehreren Phrasen gesucht werden nur polyphone Krebse in der Form zB.: VVH -> HVV
    `private void` | `getOddKrebs(java.util.ArrayList<MotifData> almd, java.util.ArrayList<Beat> alb, java.util.ArrayList<java.lang.Integer> beatsToDo)` sucht nach Motiven innerhalb eines Parts gesucht werden nur Krebse in der Form zB.: HVV -> VVH, ...
    `private int` | `getPartCount()` gibt die Anzahl der Parts des aktuellen Scores zurueck
    `private int` | `getPhraseCount()` gibt die Anzahl der Phrasen des aktuellen Scores zurueck
    `java.util.ArrayList<java.util.ArrayList<java.util.ArrayList<MultiMotifData>>>` | `getPolyphonMotifs()` liefert eine Arrayliste der polyphonen Motife unterteilt in Part->Motif->Motifart (Rep, Seq, Krebs, Spiegel)
    `private java.lang.String` | `getStringFromDuration(double d)` liefert zu einer quantisierten Notendauer das zugehoerige Zeichen
    `private boolean` | `hasMultiplePhrases(int Part)` gibt an, ob der Part aus mehreren Phrasen besteht
    `private boolean` | `isKrebs(Beat template, Beat compare)` gibt an, ob es sich beim Vergleichstakt um einen Krebs handelt
    `private boolean` | `isMultiKrebs(MultiBeat template, MultiBeat compare)` gibt an, ob es sich beim Vergleichstakt um einen Krebs handelt
    `private boolean` | `isMultiRepetition(MultiBeat template, MultiBeat compare)` gibt an, ob es sich bei beiden Takten um exakt die gleichen Noten handelt
    `private boolean` | `isMultiSequenz(MultiBeat template, MultiBeat compare)` gibt an, ob es sich beim Vergleichstakt um eine Sequenz handelt
    `private boolean` | `isMultiSpiegel(MultiBeat template, MultiBeat compare)` gibt an, ob es sich beim Vergleichstakt um einen Spiegel handelt
    `private boolean` | `isRepetition(Beat template, Beat compare)` gibt an, ob es sich bei beiden Takten um exakt die gleichen Noten handelt
    `private boolean` | `isSameAsTemplate(java.lang.String[][] sBeats, int templateId, int compareId)` gibt an, ob beide Takte gleich sind
    `private boolean` | `isSequenz(Beat template, Beat compare)` gibt an, ob es sich beim Vergleichstakt um eine Sequenz handelt
    `private boolean` | `isSpiegel(Beat template, Beat compare)` gibt an, ob es sich beim Vergleichstakt um einen Spiegel handelt
    `private java.lang.String[][]` | `mapBeatToString(int from, int to, int maxBeatLength)` mappt jede Note eines Taktes auf einen String (fuer spaetere (String-)Vergleiche von Takten) 4.0 = G = Ganze 2.0 = H = Halbe 1.0 = V = Viertel 0.5 = A = Achtel 0.25 = S = Sechtzehntel 0.125 = Z = Zweiundreissigstel
    `private void` | `out(java.lang.String s)` Kurzform fuer System.out.print
    `private void` | `outline(java.lang.String s)` Kurzform fuer System.out.println
    `private void` | `printBeats(java.lang.String[][] sB)` nur zu Debugging-Zwecken gibt das StringArray geteilt in Takte aus
    `private void` | `printMatches()` fuer Debugging-/Logging-Zwecke gibt die Indices der moeglichen gefundenen Motife mit Wiederholungen pro Part aus
    `private void` | `printMotifs()` gibt alle Motiftypen pro Part aus
    `private void` | `printMultiMotifs()` gibt alle MultiMotiftypen pro Part aus
    `private void` | `printPossibleKrebsMatches()` fuer Debugging-/Logging-Zwecke gibt die Indices der moeglichen gefundenen Krebse pro Part aus
    `private void` | `writeToTextPane(java.lang.String s)` wenn ein JTextPane gesetzt wurde wird der uebergebene String in der TextPane angehaengt

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Field Detail

    - #### scoreInBeats

          java.util.ArrayList<java.util.ArrayList<Beat>> scoreInBeats

    - #### textPane

          private javax.swing.JTextPane textPane

    - #### numerator

          private int numerator

    - #### denominator

          private int denominator

    - #### key

          private java.lang.String key

    - #### alRepetitions

          private java.util.ArrayList<java.util.ArrayList<java.util.ArrayList<java.lang.Integer>>> alRepetitions

    - #### alPossibleKrebs

          private java.util.ArrayList<java.util.ArrayList<java.util.ArrayList<java.lang.Integer>>> alPossibleKrebs

    - #### alMatches

          private java.util.ArrayList<java.util.ArrayList<java.lang.Integer>> alMatches

    - #### alKrebs

          private java.util.ArrayList<java.util.ArrayList<java.lang.Integer>> alKrebs

    - #### alMotifData

          private java.util.ArrayList<java.util.ArrayList<java.util.ArrayList<MotifData>>> alMotifData

    - #### alMultiMotifData

          private java.util.ArrayList<java.util.ArrayList<java.util.ArrayList<MultiMotifData>>> alMultiMotifData

  - ### Constructor Detail

    - #### PolyphonMotifDetection

          public PolyphonMotifDetection(int numerator,
                                int denominator,
                                java.lang.String key)

      Konstruktor
      Parameters:
        `numerator` - Numerator
        `denominator` - Denominator
        `key` - Tonart

    - #### PolyphonMotifDetection

          public PolyphonMotifDetection(int numerator,
                                int denominator,
                                java.lang.String key,
                                javax.swing.JTextPane textPane)

      Konstruktor mit TextPane Log-Ausgaben werden in die TextPane geschrieben
      Parameters:
        `numerator` - Numerator
        `denominator` - Denominator
        `key` - Tonart
        `textPane` - TextPane fuer die Logausgaben

  - ### Method Detail

    - #### detectMotifs

          public void detectMotifs(java.util.ArrayList<java.util.ArrayList<Beat>> scoreInBeats)

      detektiert monophone und polyphone Motife der Form Wiederholung, Sequenz, Krebs und Spiegel die Motiflaenge entspricht genau der Laenge eines Takts die erkannten Motife werden getrennt in ArrayLists abgelegt und koennen mittels getMonophonMotifs bzw. getPolyphonMotifs ausgelesen werden
      Parameters:
        `scoreInBeats` - der quantisierte Score unterteilt in Takte

    - #### getMonophonMotifs

          public java.util.ArrayList<java.util.ArrayList<java.util.ArrayList<MotifData>>> getMonophonMotifs()

      liefert eine Arrayliste der monophonen Motife unterteilt in Part->Motif->Motifart (Rep, Seq, Krebs, Spiegel)
      Returns:
        Arrayliste der monophonen Motife

    - #### getPolyphonMotifs

          public java.util.ArrayList<java.util.ArrayList<java.util.ArrayList<MultiMotifData>>> getPolyphonMotifs()

      liefert eine Arrayliste der polyphonen Motife unterteilt in Part->Motif->Motifart (Rep, Seq, Krebs, Spiegel)
      Returns:
        Arrayliste der polyphonen Motife

    - #### mapBeatToString

          private java.lang.String[][] mapBeatToString(int from,
                                             int to,
                                             int maxBeatLength)

      mappt jede Note eines Taktes auf einen String (fuer spaetere (String-)Vergleiche von Takten) 4.0 = G = Ganze 2.0 = H = Halbe 1.0 = V = Viertel 0.5 = A = Achtel 0.25 = S = Sechtzehntel 0.125 = Z = Zweiundreissigstel
      Parameters:
        `from` - ID der ersten Phrase des Parts
        `to` - ID der letzten Phrase des Parts
        `maxBeatLength` - Anzahl der maximalen Takte im Score
      Returns:
        zweidimensionales StringArray (Zeilen: Phrasen, Spalten: Takte der Phrase)

    - #### getStringFromDuration

          private java.lang.String getStringFromDuration(double d)

      liefert zu einer quantisierten Notendauer das zugehoerige Zeichen
      Parameters:
        `d` - quantisierte Notendauer (4.0, 2.0, 1.0, 0.5, ...)
      Returns:
        gemappted Zeichen

    - #### printBeats

          private void printBeats(java.lang.String[][] sB)

      nur zu Debugging-Zwecken gibt das StringArray geteilt in Takte aus

    - #### getMaxBeatLength

          private int getMaxBeatLength()

      gibt die Anzahl maximalen Takte des aktuellen Scores zurueck (diese sollten nach der Quantisierung bei jeder Phrase gleich sein)
      Returns:
        Anzahl der maximalen Takte

    - #### getMaxNoteCountFromBeatInPhrase

          private int getMaxNoteCountFromBeatInPhrase(int Beat,
                                            int Part)

      liefert die maximale Notenanzahl eines Takts eines Part
      Parameters:
        `Beat` - der gesuchte Takt
        `Part` - der aktuelle Part
      Returns:
        maximale Anzahl der Noten im Takt des Parts

    - #### getPhraseCount

          private int getPhraseCount()

      gibt die Anzahl der Phrasen des aktuellen Scores zurueck
      Returns:
        Anzahl der Phrasen

    - #### getPartCount

          private int getPartCount()

      gibt die Anzahl der Parts des aktuellen Scores zurueck
      Returns:
        Anzahl der Parts

    - #### out

          private void out(java.lang.String s)

      Kurzform fuer System.out.print
      Parameters:
        `s` - Zeichenkette

    - #### outline

          private void outline(java.lang.String s)

      Kurzform fuer System.out.println
      Parameters:
        `s` - Zeichenkette

    - #### writeToTextPane

          private void writeToTextPane(java.lang.String s)

      wenn ein JTextPane gesetzt wurde wird der uebergebene String in der TextPane angehaengt
      Parameters:
        `s` - die Zeichenkette

    - #### getDifferentMotifs

          private void getDifferentMotifs(java.lang.String[][] sBeats,
                                java.util.ArrayList<java.lang.Integer> indicesToDo,
                                boolean FirstTime)

      liefert alle Wiederholungen von bestimmten Taktmustern
      Parameters:
        `sBeats` - ein Array mit den Takten in Strings codiert (pro Phrase eine Zeile, pro Spalte ein Takt)
        `indicesToDo` - IDs der Takte, welche noch nicht als Muster dran waren bzw. noch nicht als Match vorkamen
        `FirstTime` - gibt an, ob es der erste Aufruf ist (restlichen Aufrufe sind rekursiv)

    - #### getAlternateKrebs

          private void getAlternateKrebs(java.lang.String[][] sBeats,
                               java.util.ArrayList<java.lang.Integer> indicesToDo,
                               boolean FirstTime)

      liefert alle Wiederholungen von Taktmustern mit den gleichen Notenlaengen
      Parameters:
        `sBeats` - ein Array mit den Takten in Strings codiert (pro Phrase eine Zeile, pro Spalte ein Takt)
        `indicesToDo` - IDs der Takte, welche noch nicht als Muster dran waren bzw. noch nicht als Match vorkamen
        `FirstTime` - gibt an, ob es der erste Aufruf ist (restlichen Aufrufe sind rekursiv)

    - #### isSameAsTemplate

          private boolean isSameAsTemplate(java.lang.String[][] sBeats,
                                 int templateId,
                                 int compareId)

      gibt an, ob beide Takte gleich sind
      Parameters:
        `sBeats` - Array mit den Takten als Strings
        `templateId` - ID im Array der Vorlage
        `compareId` - ID im Array des Vergleichstakts
      Returns:
        true, wenn beide Takte gleich, sonst false

    - #### printMatches

          private void printMatches()

      fuer Debugging-/Logging-Zwecke gibt die Indices der moeglichen gefundenen Motife mit Wiederholungen pro Part aus

    - #### printPossibleKrebsMatches

          private void printPossibleKrebsMatches()

      fuer Debugging-/Logging-Zwecke gibt die Indices der moeglichen gefundenen Krebse pro Part aus

    - #### getBeat

          private java.lang.String getBeat(java.lang.String[][] sBeats,
                                 int Part,
                                 int Beat)

      liefet einen bestimmten Takt eines bestimmten Parts als String
      Parameters:
        `sBeats` - Array mit Takten als Strings
        `Part` - der gewuenschte Part
        `Beat` - der gewuenschte Takt
      Returns:
        der gesuchte Takt als String

    - #### getBeat

          private Beat getBeat(int Part,
                     int Beat)

      liefert einen bestimmten Takt eines Parts als Beat
      Parameters:
        `Part` - der gesuchte Part
        `Beat` - der gesuchte Takt
      Returns:
        der gesuchte Takt mit quantisierten Noten

    - #### getMultiBeat

          private MultiBeat getMultiBeat(int Part,
                               int Beat)

      liefert einen bestimmten Takt eines Parts mit mehreren Phrasen als (innerhalb einer Note absteigen sortierten) Beat zB.: 60 65 62 60 76 63 58 67 63 => 59 65 62 59 64 60 58 64 60
      Parameters:
        `Part` - der gesuchte Part
        `Beat` - der gesuchte Takt
      Returns:
        der gesuchte Takt mit quantisierten sortierten Noten

    - #### getMotifs

          private void getMotifs()

      sucht nach Motiven in der vorgefilterten ArrayList (in alRepetitions) und speichert diese getrennt nach Part und Typ ab (monophone in alMotifData bzw. polyphone in alMultiMotifData)

    - #### isRepetition

          private boolean isRepetition(Beat template,
                             Beat compare)

      gibt an, ob es sich bei beiden Takten um exakt die gleichen Noten handelt
      Parameters:
        `template` - Taktvorlage
        `compare` - Vergleichstakt
      Returns:
        true wenn gleich, false wenn verschieden

    - #### isSequenz

          private boolean isSequenz(Beat template,
                          Beat compare)

      gibt an, ob es sich beim Vergleichstakt um eine Sequenz handelt
      Parameters:
        `template` - Taktvorlage
        `compare` - Vergleichstakt
      Returns:
        true wenn gleicher transponierter Takt, false wenn verschieden

    - #### isKrebs

          private boolean isKrebs(Beat template,
                        Beat compare)

      gibt an, ob es sich beim Vergleichstakt um einen Krebs handelt
      Parameters:
        `template` - Taktvorlage
        `compare` - Vergleichstakt
      Returns:
        true wenn Takt in umgekehrter Reihenfolge, false wenn nicht

    - #### isSpiegel

          private boolean isSpiegel(Beat template,
                          Beat compare)

      gibt an, ob es sich beim Vergleichstakt um einen Spiegel handelt
      Parameters:
        `template` - Taktvorlage
        `compare` - Vergleichstakt
      Returns:
        true wenn Takt gespiegelt ist, false wenn nicht

    - #### getDifferentMotifsFromPart

          private void getDifferentMotifsFromPart(java.util.ArrayList<MotifData> almd,
                                        java.util.ArrayList<Beat> alb,
                                        java.util.ArrayList<java.lang.Integer> beatsToDo)

      sucht nach Motiven innerhalb eines Parts gesucht werden Wiederholung, Sequenz, Krebs und Spiegel
      Parameters:
        `almd` - ArrayList mit den Motifdaten
        `alb` - ArrayList mit den Takten des aktuellen Motivs
        `beatsToDo` - ArrayList mit den IDs der Takte, die noch nicht abgearbeitet wurden

    - #### getDifferentMultiMotifsFromPart

          private void getDifferentMultiMotifsFromPart(java.util.ArrayList<MultiMotifData> almd,
                                             java.util.ArrayList<MultiBeat> albm,
                                             java.util.ArrayList<java.lang.Integer> beatsToDo)

      sucht nach polyphonen Motiven innerhalb eines Parts mit mehreren Phrasen gesucht werden Wiederholung, Sequenz, Krebs und Spiegel
      Parameters:
        `almd` - ArrayList mit den Motifdaten
        `albm` - ArrayList mit den Takten des aktuellen Motivs
        `beatsToDo` - ArrayList mit den IDs der Takte, die noch nicht abgearbeitet wurden

    - #### isMultiRepetition

          private boolean isMultiRepetition(MultiBeat template,
                                  MultiBeat compare)

      gibt an, ob es sich bei beiden Takten um exakt die gleichen Noten handelt
      Parameters:
        `template` - Taktvorlage
        `compare` - Vergleichstakt
      Returns:
        true wenn gleich, false wenn verschieden

    - #### isMultiSequenz

          private boolean isMultiSequenz(MultiBeat template,
                               MultiBeat compare)

      gibt an, ob es sich beim Vergleichstakt um eine Sequenz handelt
      Parameters:
        `template` - Taktvorlage
        `compare` - Vergleichstakt
      Returns:
        true wenn gleicher transponierter Takt, false wenn verschieden

    - #### isMultiKrebs

          private boolean isMultiKrebs(MultiBeat template,
                             MultiBeat compare)

      gibt an, ob es sich beim Vergleichstakt um einen Krebs handelt
      Parameters:
        `template` - Taktvorlage
        `compare` - Vergleichstakt
      Returns:
        true wenn Takt in umgekehrter Reihenfolge, false wenn nicht

    - #### isMultiSpiegel

          private boolean isMultiSpiegel(MultiBeat template,
                               MultiBeat compare)

      gibt an, ob es sich beim Vergleichstakt um einen Spiegel handelt
      Parameters:
        `template` - Taktvorlage
        `compare` - Vergleichstakt
      Returns:
        true wenn Takt gespiegelt ist, false wenn nicht

    - #### getMotifsFromOddKrebs

          private void getMotifsFromOddKrebs()

      sucht nach Krebs-Motiven in der vorgefilterten ArrayList (in alPossibleKrebs) und speichert diese getrennt nach Part und Typ ab (monophone in alMotifData bzw. polyphone in alMultiMotifData)

    - #### getOddKrebs

          private void getOddKrebs(java.util.ArrayList<MotifData> almd,
                         java.util.ArrayList<Beat> alb,
                         java.util.ArrayList<java.lang.Integer> beatsToDo)

      sucht nach Motiven innerhalb eines Parts gesucht werden nur Krebse in der Form zB.: HVV -> VVH, ...
      Parameters:
        `almd` - ArrayList mit den Motifdaten
        `alb` - ArrayList mit den Takten des aktuellen Motivs
        `beatsToDo` - ArrayList mit den IDs der Takte, die noch nicht abgearbeitet wurden

    - #### getMultiOddKrebs

          private void getMultiOddKrebs(java.util.ArrayList<MultiMotifData> almd,
                              java.util.ArrayList<MultiBeat> albm,
                              java.util.ArrayList<java.lang.Integer> beatsToDo)

      sucht nach polyphonen Motiven innerhalb eines Parts mit mehreren Phrasen gesucht werden nur polyphone Krebse in der Form zB.: VVH -> HVV
      Parameters:
        `almd` - ArrayList mit den Motifdaten
        `albm` - ArrayList mit den Takten des aktuellen Motivs
        `beatsToDo` - ArrayList mit den IDs der Takte, die noch nicht abgearbeitet wurden

    - #### hasMultiplePhrases

          private boolean hasMultiplePhrases(int Part)

      gibt an, ob der Part aus mehreren Phrasen besteht
      Parameters:
        `Part` - der zu untersuchende Part
      Returns:
        true, wenn mehrere Phrasen im Part, sonst false

    - #### printMotifs

          private void printMotifs()

      gibt alle Motiftypen pro Part aus

    - #### printMultiMotifs

          private void printMultiMotifs()

      gibt alle MultiMotiftypen pro Part aus