Matrix und DGV

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 116 Antworten in diesem Thema. Der letzte Beitrag () ist von toto.

    toto schrieb:

    in der Liste sind alle Tonarten vorhanden, aber der Parser geht nicht über die 12 hinweg (0-11) also wird dann der Parser, wenn ich eine Tonart zB.: Db wähle, mir immer die Akkorden in #-Notation zeigen.
    Jo, jetzt kannst du auch mal eine Kleinigkeit programmieren.
    In post#93 zeigst du ja, dass du bereits herausgefunden hast, wie man aus _Notes auch eine b-Note herausholt Return _Notes(iNote + 12). :thumbup:
    In post#94 sage ich dir wie man herausfindet, ob die ausgewählte Tonart eine b-Tonart ist. (bzw. RFG zeigt in post#100, wie man dasselbe für eine #-Tonart feststellt).

    Es ist nur das berühmte 1+1 zusammenzählen - das solltest du schaffen.



    Überschneidung
    Ups - dein Code ist teils fehlerhaft, teils sehr ungünstig benamt (Benamung ist entscheidender als meist angenommen wird).
    Immerhin konntest du eine Auswahl-Liste syntaktisch richtig bilden (aber leider inhaltlich nicht richtig).
    Fehlerle:
    1) Da wo du deinen Kommentar reingeschrieben hast - das ist doch der If-Zweig für die Fehlermeldung! (wenn du mal hinschaust, was die Messagebox ausgibt).
    Hingegen ist es doch kein Fehler, wenn eine b-Tonart als destTonart eingegeben wird.
    2) Dann enthält _Notes_1 falsche Elemente - vermutlich soll sie die b-Tonarten enthalten - C, D, E, G, A gehören meiner Ansicht nach aber nicht dazu - irre ich mich?
    3) Und der Name _Notes_1 schlecht - so schlecht, dass schon der Name zu Abwegen führen muss.
    (Mein) _Notes heisst _Notes, weil es die Noten sind, die vorkommen können (du nennst es immer "Tonart", aber es sind Noten. Mit diesen Noten kann man sowohl den Grundton einer Tonart angeben als auch den Grundton eines Akkordes. Also sind es Noten - keine Tonarten)
    Wie gesagt _Notes_1 ist der (man kann sagen:) falsche Name.
    Wenn es stimmt, dass die Liste alle b-Tonarten enthalten soll, dann solltest du sie unbedingt auch so benennen - dass man das erkennen kann.
    Sonst weisst du zwei Zeilen weiter nicht mehr, was du damit anfangen wolltest.
    Bzw - und das ist offensichtlich ja schon passiert - dir fällt nicht auf, dass da Tonarten drin vorkommen, die keine b-Tonarten sind.

    Wenn das in Ordnung gebracht ist kannst du sie benutzen wie von RFG gezeigt - aber natürlich nicht im Codezweig für die Fehlermeldung.

    (sorry - ich hab ja gesagt, es wird anstrengend - unter anderem bin ich es wohl der anstrengend ist. Aber was gesagt werden muss muss halt gesagt werden, ob erfreulich oder nicht)

    Dieser Beitrag wurde bereits 10 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ich probiere es mal....

    ....und es ist anstrengend.....
    habe die Abfrage schon platziert (Ich glaube schon richtig. Danke @RodFromGermany für den Tipp

    Jetzt geht es mir darum ob ich eine Liste # und eine Liste b schreibe, so in der Art:

    VB.NET-Quellcode

    1. Private Shared _Notes As New List(Of String)("C C# D D# E F F# G G# A A# B".Split)
    2. Private Shared _Notes_b As New List(Of String)("Cb Db Eb F Gb Ab Bb".Split)

    lg toto

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „toto“ ()

    toto schrieb:

    eine Liste # und eine Liste b
    Die b-Liste muss auch vollzählig sein (12 Einträge),
    dann kannst Du den Zugriff auf jede Liste in je einem der If-Zweige meines Pseudo-Codes machen, wenn die Tonart bekannt ist.
    Wenn mitten im Lied die Tonart wechselt, muss das natürlich entsprechend berücksichtigt werden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    (12 Einträge) ist nicht richtig.
    Es gibt nur 7 b-Tonarten. Das entnehme ich zumindest aus der Tonarten.xlsx von post#41.
    Dass das Proggi iwie reagieren soll, wenn im Lied die Tonart wechselt, hatter nicht gesagt. Es war bislang nur die Rede von "ausgewählter Tonart".
    Aber vielleicht verfolgt ihr auch eine andere Strategie als diejenige, die ich in post#94 auseinandersetze.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    .... eine andere tonart....irrelevant kommt selten vor und ist mir nicht wichtig.

    VB.NET-Quellcode

    1. Private Shared _Notes As New List(Of String)("C C# D D# E F F# G G# A A# B".Split)
    2. Private Shared _Notes_b As New List(Of String)("Cb C Db D Eb E F Gb G Ab A Bb".Split)


    ,,,ich habe nur 12 geschrieben weil so werden sie vollständigt dargestellt.
    Wenn ein Problem sein sollte nehme ich die andere Töne raus.

    Bitte habt ein wenig geduld mit mir wenn ich nicht gleich hier im Thread reagiere.

    Home Office und Montag Morgen
    lg toto

    VB.NET-Quellcode

    1. Private Shared _rgxNote As New Regex("\b[CDEFGAB][b#]?")
    2. Private Shared _Notes As New List(Of String)("C C# D D# E F F# G G# A A# B".Split)
    3. Private Shared _Notes_b As New List(Of String)("Cb C Db D Eb E F Gb G Ab A Bb".Split)
    4. Private Shared Function TransposeAccords(srcTonart As String, destTonart As String, akkordeText As String) As String
    5. Dim iTonarten = {_Notes.IndexOf(srcTonart), _Notes.IndexOf(destTonart)}
    6. Dim iTonarten_b = {_Notes_b.IndexOf(srcTonart), _Notes_b.IndexOf(destTonart)}
    7. If iTonarten.Contains(-1) Then
    8. MessageBox.Show("Zulässige Tonarten sind nur diese:" & Lf & String.Join(" ", _Notes.Distinct), "Fehler: unzulässige Tonart")
    9. Return ""
    10. End If
    11. Dim shift = iTonarten(1) - iTonarten(0)
    12. Dim exchange = Function(mt As Match)
    13. Dim iNote = (24 + _Notes.IndexOf(mt.Value) + shift) Mod 12
    14. If iTonarten.Contains(12) Then
    15. '??????
    16. Else
    17. '??????
    18. End If
    19. Return _Notes(iNote)
    20. End Function
    21. Return _rgxNote.Replace(akkordeText, exchange)
    22. End Function



    so ich habe es so gemacht

    VB.NET-Quellcode

    1. Dim iNote = (24 + _Notes.IndexOf(mt.Value) + shift) Mod 12
    2. If iTonarten.Contains(12) Then
    3. _Notes.IndexOf("C C# D D# E F F# G G# A A# B")
    4. Else
    5. _Notes_b.IndexOf("Cb C Db D Eb E F Gb G Ab A Bb")
    6. End If
    7. Return _Notes(iNote)

    Bekomme zwar keine Fehler aber destTonart bleibt leer

    lg toto

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „toto“ ()

    ErfinderDesRades schrieb:

    Es gibt nur 7 b-Tonarten
    ist falsch, das musst Du einem Musiker einfach mal glauben. ;)
    Gugst Du de.wikipedia.org/wiki/Quintenzirkel
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Tonarten mit b als vorzeiche sind 7 ohne die mit doppelte Vorzeihen

    VB.NET-Quellcode

    1. Dim iNote = (24 + _Notes.IndexOf(mt.Value) + shift) Mod 12
    2. If iTonarten.Contains(12) Then 'Ich glaube hier liegt der Hund begraben, es wird immer nach Integer verlangt
    3. _Notes.IndexOf("C C# D D# E F F# G G# A A# B")
    4. Else
    5. _Notes_b.IndexOf("Cb C Db D Eb E F Gb G Ab A Bb")
    6. End If
    7. Return _Notes(iNote)

    lg toto
    Niemand hat gesagt, du sollst in iTonarten nach 12 suchen - wie kommste denn dadrauf?
    iTonarten ist ein Array, und es enthält einfach die _Notes-Indexe der beiden übergebenen Tonarten srcTonart und destTonart - wenn du mal hinschaust (Zeile #9).
    Also ob iTonarten nun 12 enthält oder nicht ist ja keine Aussage, ob destTonart eine b-Tonart ist oder nicht. Aber letzteres ist, was herauszufinden ist (meiner Ansicht nach).
    Und in post#94 habich auch gesagt, wie das geht: man muss eine neue Liste schaffen, wo nur die b-Tonarten drinne sind, und dann gucken, ob destTonart dabei ist.
    Weil wenn destTonart bei den b-Tonarten dabei ist, ist es ja eine b-Tonart.
    Ich habe die Liste der b-Tonarten in feinstem Denglisch als _MinorTonarten benannt.

    probierma so:

    VB.NET-Quellcode

    1. Private Shared _rgxNote As New Regex("\b[CDEFGAB][b#]?")
    2. Private Shared _Notes As New List(Of String)("C C# D D# E F F# G G# A A# B C Db D Eb E F Gb G Ab A Bb B".Split)
    3. Private Shared _MinorTonarten As New List(Of String)("Cb Gb Db Ab Eb Bb F".Split)
    4. Private Shared Function TransposeAccords(srcTonart As String, destTonart As String, akkordeText As String) As String
    5. 'Transponierung: Die beiden Tonarten werden nach Integer gewandelt, auf Fehleingabe geprüft und Differenz gebildet (shift)
    6. 'Mit Regex wird alles im akkordeText gefunden, was der Notation einer Note entspricht, und mittels exchange() ausgetauscht.
    7. 'exchange wandelt die Note nach Integer, shiftet und zurück nach String.
    8. 'Beim shiften stellen Addition und Modulo sicher, dass eine Zahl von 0 - 11 bei rauskommt, als gültiger Index für _Notes
    9. Dim iTonarten = {_Notes.IndexOf(srcTonart), _Notes.IndexOf(destTonart)}
    10. If iTonarten.Contains(-1) Then
    11. MessageBox.Show("Zulässige Tonarten sind nur diese:" & Lf & String.Join(" ", _Notes.Distinct), "Fehler: unzulässige Tonart")
    12. Return ""
    13. End If
    14. Dim shift = iTonarten(1) - iTonarten(0)
    15. Dim isMinor = _MinorTonarten.Contains(destTonart)
    16. Dim exchange = Function(mt As Match)
    17. Dim iNote = (24 + _Notes.IndexOf(mt.Value) + shift) Mod 12
    18. If isMinor Then iNote += 12
    19. Return _Notes(iNote)
    20. End Function
    21. Return _rgxNote.Replace(akkordeText, exchange)
    22. End Function

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Wenn ein Akkord als Datenwert einen wohldefinierten Index hat, soll mit ebendiesem Index im #-Array der #-Akkord zurückgegeben werden, im b-Array der b-Akkord.
    Auswahlkriterium ist die Tonart.
    Beide Arrays haben 12 Elemente, die entsprechend belegt und sortiert sind.
    So kommt z.B. C-Dur in beiden Arrays vor, das dieser Zugriff funktioniert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @ErfinderDesRades
    (sorry - ich hab ja gesagt, es wird anstrengend - unter anderem bin ich es wohl der anstrengend ist. Aber was gesagt werden muss muss halt gesagt werden, ob erfreulich oder nicht)

    und es bleibt anstrengen
    Mach dir keine Sorgen, bin Hart im nehmen.

    Auf diesem Code wäre ich nie drauf gekommen

    VB.NET-Quellcode

    1. If isMinor Then iNote += 12

    Danke für dfe Hilfe und für den Snippet.


    Ich bin mit so ein Code wie deiner nie konfrontiert worden und es ist keine Ausrede,
    vielleicht denke ich immer noch in eine einfache Struktur und habe keine Probleme es zu zugeben.
    Habe dein Code so eingebaut mit alle Kommente um mir es immer wieder anzuschauen und versuchen daraus zu lernen (es wird nicht leicht sein und dein Niveau und der von @RodFromGermany und von viele andere Programmierer hier im Forum werde nie erreichen).

    Ich Danke euch für die positive Belehrung und hoffe in Zukunft weiter Vorschläge zu bekommen.
    Hiermit möchte ich das Thread abschlißen
    Ein Dank an alle Beteiligten

    LG
    lg toto

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „toto“ ()

    jo - das neue Feature muss ja auch kommentiert wern:

    VB.NET-Quellcode

    1. Private Shared _rgxNote As New Regex("\b[CDEFGAB][b#]?")
    2. Private Shared _Notes As New List(Of String)("C C# D D# E F F# G G# A A# B C Db D Eb E F Gb G Ab A Bb B".Split)
    3. Private Shared _MinorTonarten As New List(Of String)("Cb Gb Db Ab Eb Bb F".Split)
    4. Private Shared Function TransposeAccords(srcTonart As String, destTonart As String, akkordeText As String) As String
    5. 'Transponierung: Die beiden Tonarten werden nach Integer gewandelt, auf Fehleingabe geprüft und Differenz gebildet (shift)
    6. 'Mit Regex wird alles im akkordeText gefunden, was der Notation einer Note entspricht, und mittels exchange() ausgetauscht.
    7. 'exchange wandelt die Note nach Integer, shiftet und zurück nach String.
    8. 'Beim shiften stellen Addition und Modulo sicher, dass eine Zahl von 0 - 11 bei rauskommt, als gültiger Index für _Notes
    9. Dim iTonarten = {_Notes.IndexOf(srcTonart), _Notes.IndexOf(destTonart)}
    10. If iTonarten.Contains(-1) Then
    11. MessageBox.Show("Zulässige Tonarten sind nur diese:" & Lf & String.Join(" ", _Notes.Distinct), "Fehler: unzulässige Tonart")
    12. Return ""
    13. End If
    14. Dim shift = iTonarten(1) - iTonarten(0)
    15. Dim isMinor = _MinorTonarten.Contains(destTonart)
    16. Dim exchange = Function(mt As Match)
    17. Dim iNote = (24 + _Notes.IndexOf(mt.Value) + shift) Mod 12
    18. If isMinor Then iNote += 12 ' durch den erhöhten Index werden bei Halbtönen äquivalente verminderte Ganztöne returnt
    19. Return _Notes(iNote)
    20. End Function
    21. Return _rgxNote.Replace(akkordeText, exchange)
    22. End Function
    Da du ja gerade sowieso im Thema steckst: Ich würde als Übung empfehlen einen Akkordnamen zu parsen um daraus die Töne zu extrahieren. (Grundton, Terz, Quinte.. ob Moll/Dur/Vermindert/Übermäßigt etc). Rückwärts bildest du dann aus den Tönen die möglichen Akkordnamen. Ist durchaus anspruchsvoll, aber mit Zahlen rechnet es sich besser als mit Strings ;) Dann ist Transponieren, das Ändern der Tonart oder Anzeigen auf einer Klaviatur/Griffbrett nur noch eine Fingerübung.
    ...Hallo Gonger96...
    stimmt im Kopf stecke ich immer noch in diesem Thread.
    @toto
    vielleicht denke ich immer noch in eine einfache Struktur


    und deswegen:
    Bin bereit aber brauche einen Start.
    Ich weiß nicht ob hier weiter machen kann oder ein neues Thread öffnen?
    lg toto
    Das wäre ein Thema für einen neuen Thread denke ich. Da es mehrere Konventionen gibt solltest du dich zuerst für eine entscheiden. Ist ein C-Dur C, Cmaj, CM oder CDreieck? C-Moll Cm, C- oder Cmin? Oder ist alles gültig? Selbiges für Übermäßigt, Vermindert, Sept-Akkorde etc. Wenn du dieses klar definiert hast, kann man anfangen.