Frage:
Algorithmus zum Transponieren von Akkorden zwischen Tasten
Jonathan Potter
2015-12-07 01:35:10 UTC
view on stackexchange narkive permalink

Ich schreibe Software, die Noten zwischen Tasten transponiert, und ich bin noch neu in der Musiktheorie. Ich hatte gehofft, dass jemand, der mehr weiß, mich wissen lässt, ob mein Ansatz korrekt ist. Hier ist mein Prozess für jede Note:

  1. Ermitteln Sie den Grad des Buchstabennamens der Notiz in der Skala der aktuellen Tonart.
  2. Ermitteln Sie die Anzahl der Halbtöne, von denen die Note angehoben oder abgesenkt wird die eigentliche Note in der Skala. Ich nenne dies den Versatz.
  3. Finden Sie die Note in der Skala der neuen Tonart, die den gleichen Grad hat.
  4. Erhöhen oder senken Sie die neue Note um den Versatz.
  5. ol>

    Hier ist ein Beispiel. Angenommen, wir transponieren die Note E # von C-Dur nach D-Dur. Dann würden wir die obigen Schritte wie folgt ausführen:

    1. E # wäre der dritte Grad der Skala.
    2. Der Versatz wäre +1, da E tatsächlich der dritte Grad von ist Die C-Dur-Tonleiter und E # ist ein Halbton darüber.
    3. Der dritte Grad der D-Dur-Tonleiter ist F #, das ist also die neue Note.
    4. Fügen Sie dazu unseren +1-Offset hinzu würde es F ## machen.
    5. ol>

      Also ist F ## das Ergebnis der Transponierung von E # von C-Dur nach D-Dur. Mir ist klar, dass Sie normalerweise kein E # in der Tonart C-Dur haben würden, aber ich denke, es ist möglich und es funktioniert, um den Algorithmus zu erklären.

      Ist dieser Algorithmus korrekt? Sollte ich dies anders angehen?

      Eine zweite Frage: Ist es erforderlich, den Modus der Schlüssel zu kennen, wenn diese Art von Algorithmus ausgeführt wird? Die Ergebnisse scheinen gleich zu sein, unabhängig davon, ob ich für die Grad- / Offset-Berechnungen Dur- oder Moll-Skalen verwende. Vielen Dank im Voraus!


      Update: Lösung

      Es klingt so, als ob der obige Algorithmus korrekt ist, kann aber vereinfacht werden. Das Puzzleteil, das mir fehlte, war, dass Sie das Intervall bestimmen können, ohne sich auf die Skala zu beziehen. Hier ist der aktualisierte Algorithmus. Die Schritte 1 und 2 ermitteln das Intervall zwischen dem aktuellen und dem neuen Schlüssel. Die Schritte 3 und 4 wenden dasselbe Intervall auf die Note an, die wir transponieren.

      1. Finden Sie den Abstand zwischen dem Buchstabennamen des aktuellen Schlüssels und dem Buchstabennamen des neuen Schlüssels in der Liste aller Buchstaben (ohne scharfe oder flache Stellen): A, B, C, D, E, F, G.
      2. Ermitteln Sie den Abstand in Halbtönen zwischen der aktuellen und der neuen Taste.
      3. Der Buchstabe der neuen Note entspricht der Buchstabenentfernung (Schritt 1) ​​über der aktuellen Note.
      4. Hinzufügen Schärfen oder Abflachen des Buchstabens der neuen Note, bis die richtige Anzahl von Halbtönen (aus Schritt 2) über der aktuellen Note erreicht ist.
      5. ol>

        Wiederholen Sie das ursprüngliche Beispiel, das wir haben:

        1. D ist 1 Buchstabe über C
        2. D ist 2 Halbtöne über C
        3. Der neue Buchstabe ist 1 Buchstabe über E #, was F
        4. ist li> Die neue Notiz wird 2 Halbtöne über E # sein, was F ## ol>

          ist. Vielen Dank an alle, die geantwortet haben, insbesondere an @MattL und @Dom. Alle Antworten und Kommentare waren sehr aufschlussreich!

Ich hatte vor, meine Antwort zu bearbeiten, sobald ich eine Antwort erhalten habe, aber vielleicht ist dies ein besserer Weg, dies zu tun. Nun Jonathan, nehmen wir an, Sie möchten von c-Moll nach Gis-Moll transponieren. Die Eingangsnote ist ein B-Natural. Die Ausgangsnotiz ist daher Fx (F ##). Was sind die logischen Schritte? Wir haben C + 4 ist G und G # ist 8 Halbtöne höher als C. Wir wissen also, dass wir die Note 8 Halbtöne höher als B natural benötigen, und wir wissen, dass wir sie F nennen müssen. Was sind die logischen Schritte dazu? Bestimmen, dass es eine doppelte Schärfe ist, im Gegensatz zu beispielsweise einer Wohnung? ...
... Ich frage, weil es anscheinend mehr davon gibt als die Schritte in meinem vorgeschlagenen Algorithmus (unten), der Calebs Idee verwendet. Aber ich könnte mich irren, also sollten wir uns vielleicht beide ansehen.
Andere Dinge, die Ihre Lösung ansprechen muss: Was tun Sie, wenn Sie ein Cx in einem Stück in C finden, das Sie in F # transponieren? Diese Note müsste F ### sein, und dreifache Scharfe sind nicht zulässig. Es müsste stattdessen G # lesen.
Ich würde empfehlen, dass Sie Ihren Algorithmus schreiben - welche Sprache verwenden Sie? - und dann auf SO posten, um zu sehen, ob die Leute das Refactoring aus Gründen der Geschwindigkeit empfehlen können. Es gibt viele Möglichkeiten, eine Nachschlagetabelle zu erstellen. Genau das schreiben Sie hier. - Oh, und achten Sie auf Enharmonics, da der Darsteller es wahrscheinlich vorziehen würde, nicht eine Tonne Triple-Flats zu haben :-)
@CarlWitthoft Vielen Dank für den Vorschlag, aber bei dieser Frage geht es um Korrektheit, nicht um Effizienz. Ich habe die Programmierkenntnisse, um es selbst zu optimieren. Ich habe einfach nicht das musiktheoretische Wissen, um zu wissen, dass ich korrekte Ergebnisse produziere. Wenn Sie möchten, dass ich das in der Frage sage, kann ich es hinzufügen.
Ich denke, der Algorithmus, den Sie als Ihre Antwort ausgewählt haben, ist soweit richtig. Ich würde jedoch vorschlagen, dass Sie die von mir vorgeschlagenen Testszenarien nehmen und durcharbeiten. Ich denke, dass Sie feststellen werden, dass Ihr Algorithmus ziemlich unhandlich wird, wenn Sie entscheiden müssen, welche Enharmonik-Note Sie auswählen möchten. (Falls Sie den Begriff "Enharmonic-Noten" nicht kennen, handelt es sich um zwei Noten derselben Tonhöhe, die unterschiedlich geschrieben sind, z. B. A # und Gb.)
Ich bin interessiert, Ihren Code zu sehen, wenn Sie damit fertig sind.
@BobRodes Ich denke, Triple-Sharps sind absolut gültig (im theoretischen Sinne). Wenn wir uns an das Beispiel halten, das ich in meiner Frage verwendet habe, aber ein E ## anstelle von E # transponieren, wäre dies ein doppelt erweitertes zweites Intervall (glaube ich) und der einzige Weg, das gleiche Intervall während der Transposition beizubehalten, wäre das Ergebnis von F ###. Soweit ich das beurteilen kann, ist es eine Frage der Präferenz, ob man doppelte oder dreifache Flats / Sharps hat. Es muss also dem Benutzer überlassen bleiben, nicht dem Algorithmus.
Ja, aber die Leute ziehen es im Allgemeinen vor, sie nicht zu benutzen. Hier ist ein interessanter Artikel darüber, wie MuseScore mit der Umsetzung umgeht. http://davidbolton.info/articles/musescore_interval_transposition.html Es wird erwähnt, dass Finale ein Dreifach scharf hält und Sibelius es erneut beantwortet.
p.s. Wenn Sie an einem kostenlosen Programm mit einer guten Umsetzungsfunktion interessiert sind, können Sie MuseScore herunterladen und installieren.
@BobRodes Das ist ein erstaunlicher Artikel, danke, dass Sie darauf hingewiesen haben! Es ist schön zu wissen, dass ich auf einem ausgetretenen Pfad bin, da Finale es genauso macht. Ich habe die Implementierung des Algorithmus abgeschlossen und Sie können den Quellcode hier anzeigen: https://github.com/jpotterm/google-apps-chord-transposer. Der Großteil der Arbeit wird in der Transponierungsfunktion der Datei server / note.gs erledigt (sie kann verschoben werden, wenn ich sie in Zukunft umgestalte). Ich hoffe, Sie finden es nützlich und danke für all Ihre Hilfe!
Hier ist ein weiterer Artikel über merkwürdige Notationen in der Musik: http://homes.soic.indiana.edu/donbyrd/InterestingMusicNotation.html. Der Autor erwähnt, dass es in der gesamten Musikliteratur "mindestens fünf" Beispiele für Triple Sharps / Flats gibt! Wenn Sie Noten transponieren, möchten Sie möglicherweise etwas tun, um sie zu vermeiden.
Sechs antworten:
#1
+7
Matt L.
2015-12-07 02:20:25 UTC
view on stackexchange narkive permalink

Es ist in der Tat nicht relevant, welche Skala verwendet wird. Was zählt, ist das Intervall vom Grundton bis zum aktuellen Ton. In Ihrem Beispiel ist ein E # ein erweitertes Drittel aus dem Grundton C. Wenn sich also der Grundton in D ändert, ist der transponierte Ton ein erweitertes Drittel aus D, das ein F ## ist.

Anstatt zu arbeiten Bei Halbtönen (die Ihnen bei der Benennung der Noten mehrdeutig werden) müssen Sie mit Intervallen arbeiten, mit denen Sie ein E # von einem F unterscheiden können (für C als Wurzel ist das erste ein erweitertes Drittel, das letztere ein a perfekter vierter).

Sehr informativ, danke! Ich denke, das ist was ich tue. Der Algorithmus, den ich verwende, sieht für Sie also richtig aus?
@JonathanPotter: Ja, abgesehen von der Verwendung der "Skala des aktuellen Schlüssels", die nicht erforderlich ist. Nehmen Sie das Intervall zwischen dem ursprünglichen Grundton und dem neuen Grundton und verschieben Sie den aktuellen Grundton um dasselbe Intervall. Dadurch bleibt das Intervall zwischen der Note und dem Grundton identisch.
Ich möchte sowohl diese als auch die Antwort von @Dom's als richtig markieren, aber ich kann nur eine Antwort geben :( Sie haben also meinen Dank und meine Gegenstimme.
#2
+6
Dom
2015-12-07 03:00:42 UTC
view on stackexchange narkive permalink

Matt hat Recht, Sie möchten in Intervallen nachdenken, wenn Sie über die Transposition nachdenken, da Sie dann wissen, wie Sie die Note benennen sollten, zusammen mit der Entfernung in Halbtönen, die Sie zum Verschieben der Note benötigen.

In diesem speziellen Fall transponieren Sie alle Noten um eine Dur-Sekunde, was bedeutet, dass Sie jede Note um zwei Halbtöne nach oben verschieben und der Name der Note auf dem Namen des nächsten Buchstabens basiert.

Nehmen wir zur Vereinfachung an, dass der Wert der Note folgendermaßen aufgezählt wurde:

 0 1 2 3 4 5 6 7 8 9 10 11C C # / Db DD # / Eb EFF # / Gb GG # / Ab AA # / Bb B 

Und sagen wir auch, dass wir die Notizbuchstaben wie folgt aufgezählt haben:

 0 1 2 3 4 5 6C DEFGAB 

Zurück zu Ihrem Beispiel würde das E # dem Notenwert von 5 (F) und dem Notenbuchstaben von E (2) zugeordnet, unabhängig davon, in welcher Tonart Sie sich befinden. Wenn Sie diese Note um eine Hauptsekunde nach oben verschieben möchten Wenn Sie dann den Notenwert um 2 und den Notenbuchstaben um 1 erhöhen, erhalten Sie einen Notenwert von 7 (G) und einen Notenbuchstaben von F (3). Aus diesen beiden Werten können Sie der Note einen neuen Namen zuweisen.

Ich habe die Frage mit einem neuen Algorithmus aktualisiert, der auf Ihrer Antwort (und @MattL's) basiert. Sieht es so aus, als hätte ich es richtig verstanden?
Ja, aber besonders wenn Sie weiterhin musikalische Software entwickeln möchten, würde ich versuchen, den Algorithmus musikalisch zu halten. Die Schritte 1 und 2 werden kombiniert, wenn Sie das Intervall nur als Hauptsekunde angeben (wobei Sie die Entfernung in Halbtönen und den Buchstabennamen kennen, zu dem Sie wechseln möchten), um eine Infrastruktur zu erstellen, die mit ein wenig zusätzlicher Arbeit erledigt werden kann.
Ja, in meinem Code habe ich eine Abstraktion für Intervalle erstellt, aber ich fand es hilfreich, in dieser Frage explizit anzugeben, wie das Intervall gefunden und dann angewendet werden soll. Aber ich habe die Frage aktualisiert, um die Intervalle besser zu erklären.
#3
+5
Caleb Hines
2015-12-07 08:51:00 UTC
view on stackexchange narkive permalink

Wenn ich eine einfachere Alternative vorschlagen darf: Verwenden Sie einen "Linien der Fünftel" -Ansatz, um die korrekte Schreibweise der Noten sicherzustellen, ohne dass Kenntnisse über den Grad der Skalierung erforderlich sind.

Die Linie der Fünftel ist ähnlich aufgebaut wie die Besserer Kreis der Fünftel, aber es wird keine Enharmonie-Äquivalenz angenommen, so dass es sich nicht in sich selbst schließt und sich in beide Richtungen bis ins Unendliche erstreckt. Es ist eine praktische Struktur für Algorithmen, bei denen Rechtschreibnotizen richtig berücksichtigt werden.

...
B ♭
F
C
G
D
A
E
B
F♯
C♯
G♯
D♯
A♯
E♯
B♯
F♯♯
...

Der Algorithmus lautet dann:

  1. Finden Sie heraus, wie viele Leerzeichen entlang der Linie Sie transponieren. In diesem Fall beträgt der Wechsel von C nach D zwei Fünftel.
  2. Suchen Sie die Note, die Sie transponieren möchten, und gehen Sie dann so viele Leerzeichen weiter. Wenn Sie in diesem Fall zwei Fünftel über E♯ hinausgehen, gelangen Sie zu F♯♯.
  3. ol>

    Wenn Sie mehr lesen möchten, habe ich das Konzept der Fünftel in meinem allerersten Stapel eingeführt Austauschantwort bezüglich einer algorithmischen Methode zum Bestimmen von Intervallnamen: Allgemeines Verfahren zum Bestimmen des Namens eines Intervalls bei einer Hauptschlüssel- / diatonischen Sammlung.


    Update : Da dies nicht ganz offensichtlich ist und BobRodes danach gefragt hat, möchte ich erwähnen, dass in diesem Schema jede Notiz durch eine einzelne Zahl dargestellt werden kann - ihre Position entlang der Linie. Obwohl Sie den Ursprung möglicherweise irgendwo platzieren könnten, finde ich, dass die Mathematik am besten funktioniert, wenn F = 0 und die Zahlen zunehmen, wenn Sie sich den Scharfen nähern (C = 1, G = 2).

    Es besteht keine Notwendigkeit dazu Speichern Sie ein ganzes Array von Notennamen, da zwischen dem Namen einer Note und ihrer Position in dieser Zeile eine einfache Eins-zu-Eins-Zuordnung besteht. Sie müssen explizit 7 Paare speichern (indem Sie den Bereich F-B den Zahlen 0-6 zuordnen), aber sobald Sie dies haben, kann die Position eines beliebigen Tonhöhennamens gefunden werden (und umgekehrt).

    Der Schlüssel ist zu erkennen, dass jeder Tonhöhenname durch das Paar {letter, numberOfSharps} dargestellt werden kann - wobei eine negative numberOfSharps die Verwendung von Wohnungen bedeutet. Zum Beispiel ist F♯♯♯ (F, 3), während G ♭♭ (G, -2) ist. Um dies in eine Position entlang der Linie umzuwandeln, verwenden Sie die Formel:

      7 * numberOfSharps + letterToNumber [letter]  

    Also für C♯♯♯ Da C = 1 ist und es 3 Scharfe gibt, wäre die Position entlang der Linie 7 * 3 + 1 = 22.

    Die umgekehrte Beziehung (eine Position in einen Tonhöhennamen umwandeln) kann mit a gefunden werden Kombinieren Sie eine ganzzahlige Division durch 7, um die Anzahl der Scharfen zu erhalten, und eine modulare Division (Position mod 7), um den Buchstaben zu erhalten.

Sehr interessanter Caleb. Während ich verstehe, dass Sie sich theoretisch bis ins Unendliche ausdehnen können, gehen wir in der Praxis nicht über ## und bb hinaus, wie Sie sicher wissen. Wenn Sie also einen Algorithmus schreiben würden, wohin würden Sie von einem B ## nach oben oder von einem Fbb nach unten gehen? Nicht, dass Sie in 99,9% der Fälle auf eine dieser beiden Situationen stoßen würden, aber was würden Sie tun, wenn Sie dies tun würden? Ich denke, Sie könnten einfach eine verminderte Sechste statt einer Fünften nach oben oder unten gehen, wodurch B ## zu G # und Fbb zu Ab geht. Was denken Sie?
Ich sehe keinen Grund, warum ein Umwickeln notwendig wäre, und habe meine Antwort entsprechend aktualisiert. Wenn Sie möchten, können Sie einfach 12 zur Position der Note addieren / subtrahieren, um näher an 0 heranzukommen.
Der Grund ist praktisch. Niemand verwendet mehr als doppelt scharf / doppelt flach in der Notation (fast niemand). Wenn Sie tatsächlich versuchen, eine Software zu erstellen, die tatsächliche Musik transponiert, stoßen Sie bei Bx und Fbb an eine harte Grenze.
Sicher, Sie hätten Probleme beim Anzeigen oder Drucken, aber es gibt keinen theoretischen Grund, warum der Transpositionsalgorithmus von Natur aus eingeschränkt sein sollte.
Nun, ein Teil des Transpositionsalgorithmus wäre, welche tatsächliche Note ausgegeben werden soll, nicht wahr? Ich meine, ich verstehe Ihren Standpunkt, aber es klingt nach einer Frage, wie Sie die Einschränkung definieren. Ein Algorithmus, der die Noten, die tatsächlich bei der Transposition verwendet werden, nicht im Namen einer unbegrenzten Art ausgeben kann, ist ein Widerspruch, nicht wahr?
Ich verstehe deinen Standpunkt. Aber bedeutet das, dass Sie einen anderen Algorithmus benötigen, um herauszufinden, welche Notiz gedruckt werden soll?
Vielen Dank! Nachdem ich mehrere Strategien für das Problem ausprobiert hatte, fand und implementierte ich diese und es scheint großartig funktioniert zu haben. Die Bearbeitung war besonders nützlich. Ich wollte gerade das gesamte Array erstellen, bis Sie darauf hingewiesen haben, wie Sie es einfach einer Zahl zuordnen können. Es hat so wie es ist für Akkorde funktioniert, aber ich habe auch den gleichen Algorithmus verwendet, um Noten auf dem Blatt zu transponieren. Dafür musste ich eine zusätzliche Logik hinzufügen, um Oktavinformationen zu verarbeiten (z. B. E5 gegen E6). Am Ende habe ich auch Triple-Sharp und Triple-Flat in meiner Anwendung implementiert, zumindest um die Richtigkeit einiger Randfälle zu überprüfen.
#4
+2
Tekkerue
2015-12-07 05:31:13 UTC
view on stackexchange narkive permalink

Sie müssen sich nur um 12 Tasten kümmern (selbst Moll-Tasten sind nur Duplikate der relativen Dur-Tasten), sodass es sehr einfach wäre, ein zweidimensionales String-Array zu erstellen, das als Nachschlagetabelle für die Namen verwendet werden kann jeder der Noten für jede Taste. Auf diese Weise können Sie festlegen, wie jede Note für alle 12 Tasten aufgerufen werden soll, und Sie können festlegen, ob eine Note als "A #" oder "Bb" bezeichnet werden soll.

Außerdem können Sie auch entscheiden, was Noten außerhalb der Tonart aufrufen (viele Songs enthalten Akkorde / Noten von außerhalb der Tonart). Sie können beispielsweise den Namen D # in der Tonart G-Dur verwenden (da G-Dur eine Scharfe hat), während Sie den Namen Eb in F-Dur verwenden können (da F-Dur eine Ebene hat). P. >

Dies macht das Ändern von Tasten sehr einfach, da Sie lediglich den Grundton ändern müssen und alles andere, was sich intern innerhalb der Tonart mit Akkorden / Noten befasst, genau gleich bleibt.

??? ... warum die Abwahl? Jonathan schreibt Software und fragt nach einem Algorithmus zum Transponieren von Schlüsseln. Deshalb habe ich ihm einen Vorschlag gemacht, wie er codieren kann, was er versucht zu tun. Ich bin sowohl Programmierer als auch Musiker und habe Erfahrung mit diesem Thema, da ich selbst Musiksoftware erstellt habe, die die Option zum Transponieren von Tasten enthält. Meine Antwort richtete sich an einen anderen Programmierer, der meinen Vorschlag wahrscheinlich verstehen wird. :) :)
Nun, ich bin auch ein anderer Programmierer, und Ihr Algorithmus erklärt nicht, wie Sie bestimmen können, wie eine Notiz zu nennen ist. Dies muss berücksichtigt werden, wenn es als Lösung betrachtet werden soll.
Was Sie eine Notiz nennen, hängt jedoch von der Taste ab, in der Sie sich befinden. Was Sie also tatsächlich eine Notiz nennen, ist anders. Die Notennamen können durch Googeln der 12 verschiedenen Haupttasten ermittelt und dann manuell in die Nachschlagetabelle eingegeben werden. Dadurch werden Kuriositäten wie "E #" nicht in der Tonart C-Dur angezeigt, da das Array immer auf den Namen "F" und nicht auf "E #" zeigt. Ich denke, er benötigt weitere Informationen darüber, welche Szenarien er zu erklären versucht.
Ich bin damit einverstanden, dass weitere Informationen benötigt werden. Wenn das OP jedoch tatsächlich transponierte Noten schreiben muss, haben die von Ihnen erwähnten "Kuriositäten" ihren Platz und ihre Verwendung in der Musik. Siehe hier: https://www.youtube.com/watch?v=A3j57AdHSvg (es ist ein bisschen verschwommen, sorry, das Beste, was ich finden konnte). Schauen Sie in die dritte Zeile, den ersten Takt, den letzten Schlag, die Kopfnote des Akkords. Es ist ein E #. Wenn Sie F geschrieben haben, müssen Sie ein natürliches F darauf schreiben (weil das vorherige F scharf ist) und dann das nächste F scharf schreiben. Das ist nicht so einfach zu lesen.
p.s. Wenn sowohl die Eingabe als auch die Ausgabe des Programms tatsächliche Musik sind, spielen die Enharmonischen Namen der Noten keine Rolle, wie Sie sagen. Wenn es sich um Noten handelt, ist Ihre Idee eine nicht praktikable Vereinfachung, wie mein Beispiel zeigen sollte. Die meisten Softwareentwicklungsfehler in unserem Geschäft sind auf ein unvollständiges Verständnis der Anforderungen zurückzuführen. Dies ist ein gutes Beispiel dafür. :) :)
Der Schlüssel ist einer von vielen Faktoren, die bestimmen, was Sie eine Notiz nennen. Wenn Sie sich in der Tonart C befinden, sehen Sie möglicherweise C # und / oder Db, je nachdem, in welchem ​​Kontext Sie sich gerade in E # und F befinden, wie in diesem Fall. Der Schlüssel allein reicht nicht aus, Sie benötigen den Kontext und weitere Informationen. In diesem Fall erhalten Sie bei Verwendung des Schlüssels ein F anstelle des gewünschten E #, was das OP nicht wünscht.
Der Notenpart war das Stück, das im ursprünglichen Beitrag fehlte, aber er hat den Beitrag aktualisiert und diesen Teil jetzt geklärt. :) Ja, in Noten gibt es auch den visuellen Aspekt, wie es auf Papier erscheint, um das Lesen zu erleichtern, was die Standard-Akkord- / Tonart-Theorie übertreffen kann, wie es Bobs Beispiel tut. Ich hatte mit der Konvertierung von Akkordkarten gerechnet, da er erklärte, er sei neu in der Musiktheorie und die Konvertierung von Noten eine ziemlich ehrgeizige Aufgabe.
@Tekkerue: erstaunlich, wie ein Unternehmen 5 Millionen für die Erarbeitung von Anforderungen ausgeben wird, und wenn alle in der Entwicklungsphase hüfthoch sind und die Stakeholder gehen, ist das überhaupt nicht das, was ich gemeint habe, 20 Leute werden an einem Tisch sitzen und gut sagen, ich Ich habe dies aufgrund dieses sehr vernünftigen und logischen "Gegebenen" usw. usw. usw. erwartet. Deshalb scheitert die Hälfte aller Softwareentwicklungsinitiativen. Bitte haben Sie Verständnis dafür, dass dies keine persönliche Kritik ist, sondern eine Beobachtung über etwas, das wir IT-Mitarbeiter alle tun und vorsichtig sein müssen, um zu vermeiden (und oft nicht), wenn das Geld auf dem Tisch liegt.
BobRodes, klar, aber dies ist ein kostenloses Webforum, in dem jemand eine Frage stellte, der angab, dass er neu in der Musiktheorie ist und anfangs nicht spezifizierte, welche Art von Software er schrieb. Im Fall von jemandem, der neu in der Theorie ist, war die Annahme des einfacheren Ansatzes vernünftig. Aber wenn dies ein Job wäre, hätte ich ihn mit Fragen durchsetzt, um festzustellen, was er wollte, und ich hätte sicherlich nichts codiert, ohne mehr Anweisungen zu bekommen. Außerdem entwickle ich gerade meine eigene Software, bei der es keinen Raum für Verwirrung über meine Anforderungen gibt, also keine Sorge. :) :)
Es ist klar, dass Sie sehr gut verstehen, warum ich sagte, es sei keine Kritik, sondern eine Beobachtung. LOL
Ich werde darüber nicht streiten, aber Sie haben meinen Kommentar über das "Erwarten" eines bestimmten Ergebnisses umschrieben, weil es angesichts der anfänglichen Informationen vernünftig war. Ihre "Beobachtung" war also eindeutig auf meine Antwort gerichtet und ich erklärte, warum es unnötig war ... lassen wir es dabei. :) :)
#5
+1
BobRodes
2015-12-07 13:44:58 UTC
view on stackexchange narkive permalink

IMHO ist die Lösung von Caleb Hines der effizienteste Weg, um aus IT-Sicht das zu tun, was Sie wollen. Es gibt weniger bewegliche Teile als Doms Lösung (sorry Dom). Erstellen Sie einfach ein Array (ein auf Null basierendes Array), das seine "Fünftelreihe" enthält. Sie müssen die Randbedingung behandeln, wohin Sie von den Enden der Linie gehen sollen, die Bx und Fbb sind. Ohne einen besseren Vorschlag von ihm würde ich die Quinten in verminderte Sechstel ändern: G # folgt Bx, Ab folgt Fbb. Es ist höchst unwahrscheinlich, dass Sie jemals eine dieser Notizen sehen (oder über sie hinweg transponieren müssen), aber Sie müssen sie berücksichtigen. Wenn Sie dies nicht tun und sie auftauchen, wird Ihr Programm spektakulär fehlschlagen und der Grund wird nicht sehr offensichtlich sein.

Ihr Algorithmus wird also ungefähr so ​​aussehen. Bestimmen Sie zunächst (vorausgesetzt, Sie haben das Array bereits mit der "Fünftelzeile" erstellt) den Abstand zwischen der Eingabetaste und der Ausgabetaste:

  1. Beginnen Sie mit dem ersten Array-Element.
  2. Iterieren Sie das Array, bis Sie einen der beiden Schlüssel finden.
  3. Fahren Sie mit der Iteration des Arrays fort, bis Sie den anderen Schlüssel gefunden haben.
  4. Lassen Sie X gleich der Differenz zwischen die zwei Offsets.
  5. Wenn der erste gefundene Wert der Zielschlüssel ist, lassen Sie X = -X.
  6. ol>

    Als nächstes durchlaufen Sie alle Noten im Stück (a nicht trivialer Satz!). So bestimmen Sie die transponierte Tonhöhe einer Note:

    1. Iterieren Sie das Array, bis Sie das Element finden, das die Note enthält. Sei Y gleich dem Versatz dieses Elements.
    2. Wenn Y + X größer als die Obergrenze des Arrays ist (wir nennen die Obergrenze U), sei A = der Versatz von C #. Geben Sie das Element aus, dessen Versatz A + Y + X - U ist.
    3. Wenn Y + X kleiner als Null ist, sei A = der Versatz von Ab. Geben Sie das Element aus, dessen Versatz A + Y + X ist.
    4. Wenn nicht 2 oder 3 (Nicht-Randbedingung), geben Sie das Element aus, dessen Versatz Y + X ist.
    5. Damit sollten Sie loslegen. Wenn Sie Löcher in meine Logik stechen können, tun Sie dies auf jeden Fall.

Sie müssen nicht all das wertvolle Gedächtnis verschwenden oder sich auf die Grenzen eines endlichen Arrays beschränken! Stellen Sie einfach eine Notiz als einzelne Nummer dar und erstellen Sie eine Zuordnung von dieser Nummer zum Notennamen. Ich habe meine Antwort mit weiteren Details aktualisiert. Mit einer 32-Bit-Ganzzahl können Sie mit 306.783.377 Sharps mindestens F erreichen. Welches sollte mehr als genug sein, um unter jeder möglichen Umsetzung unendlich zu erscheinen ...
Das ist jedoch praktisch nicht sinnvoll. Sie gehen im Allgemeinen nicht über zwei scharfe oder flache Stellen hinaus. Daher müssen Sie eine Enharmonik-Note ausarbeiten, auf die transponiert werden soll, wenn der Algorithmus eine dreifach scharfe oder flache Note ausgibt. Sie müssen dies tun, um das vorliegende Problem zu lösen. http://homes.soic.indiana.edu/donbyrd/InterestingMusicNotation.html enthält einige interessante Informationen dazu.
#6
-2
Tim
2015-12-07 02:19:48 UTC
view on stackexchange narkive permalink

Es gibt einen kleinen Fehler darin, dass es wahrscheinlich nie ein E # in der Tonart C geben würde, aber das Konzept scheint auf den richtigen Linien zu sein. Sie müssen musikalisch bewusster sein.

Wenn Sie Ihre Frage noch einmal lesen, ist es offensichtlich, dass ich falsch verstanden habe, was Sie angestrebt haben. Ich entschuldige mich.

Das OP erwähnte, dass er weiß, dass es normalerweise kein E # in der Tonart C-Dur geben würde, aber theoretisch könnte es passieren. Und das Beispiel wurde absichtlich etwas seltsam gewählt, um die Methode "herauszufordern".
Jede ziemlich chromatische Passage in der Tonart C könnte eine haben. Zum Beispiel Chopins Etüde Op. 10, Nummer 2 ist in C und Takt 7, vierter Schlag, Kopfnote ist ein E #. Vielleicht ist Ihre Kritik am mangelnden musikalischen Bewusstsein des OP falsch, Tim?
@BobRodes, beim Betrachten des Stücks scheint das E # so zu sein, dass der Darsteller auf einen Blick schnell erkennen kann, dass es chromatisch ist (alle Noten in einem schönen Hang). Dies ist kein theoretisches Problem, sondern ein visuelles Problem, wie es auf Noten erscheint, um es dem Interpreten zu erleichtern. Ein blinder Algorithmus, der in eine andere Tonart konvertiert, könnte diese schöne visuelle Neigung der Noten sehr gut vermasseln, was darauf hinweist, dass sie chromatisch ist. So etwas funktioniert mit einem blinden Algorithmus wahrscheinlich nicht so gut, da der Algorithmus nicht weiß, warum das E # anstelle des "theoretisch korrekten" F verwendet wurde.
Ich verweise Sie auf meinen Kommentar zu Ihrem Beitrag. Sie sind ganz richtig, es ist in erster Linie ein visuelles Problem. Es gibt jedoch Algorithmen, die dieses Intervall immer als kleine Sekunde und nicht als erweiterte Einheit anzeigen. Die Idee von Caleb Hines sieht zum Beispiel so aus, obwohl ich die Randbedingungen gründlicher testen möchte, bevor ich eine solche Erklärung abgeben kann.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...