kar-Format möglichst beim Import erhalten.

• 8. Nov 2021 - 05:14

"/" und "\" werden in der Datei "importmidi_lyrics.cpp" in den Methoden "removeSlashes" entfernt. Ich kenne dafür den Grund nicht, aber beim Midi-Export fehlen diese Angaben. Ich würde vorschlagen, diese Methoden ersatzlos zu streichen.


Comments

Antwort auf von Jojo-Schmitz

Ja, alles, was du geschrieben hast, stimmt. Aber mit meinem Workaround (siehe #6639) füge ich die Liedtexte nach dem Midi-Export ins Midi ein. Und es wäre schön, wenn die "Slashes" mit reinkommen würden. Gibt es Gründe, die dagegen sprechen würden?

Mit der geänderten importmidi_lyrics.cpp Datei (im Anhang) erhielt ich nach dem Import von michael_0_orig.mid die MS-Datei michael_0.mscz.

Anhang Größe
michael_0_.mscz 70.88 KB
importmidi_lyrics.zip 2.75 KB
michael_0_orig.mid 77.3 KB

Antwort auf von jmueller5524

Nein, nicht mehrere Strophen, dann stände das in MuseScore etwa anders, das sind alles Strophe 1 Texte.
Und nur dort wo eigentlich Melismas stehen sollten, also sollten da wohl eher diese auch erzeugt werden.

Etwa ähnliches scheint schon in #305730: Lyrics in MID file have several layers of multiplicates stacked on top of one another berichtet worden zu sein?

Die (führenden) Leerzeichen sollten beim Import wohl auch entfernt werden (mit text.trimmed() oder gar text.simplified())

Antwort auf von jmueller5524

Packe das am Besten mal (in Englisch) in den Issue Tracker,
zusammen mit deinem Änderungsvorschlag.

diff --git a/importexport/midiimport/importmidi_lyrics.cpp b/importexport/midiimport/importmidi_lyrics.cpp
index c85c023a34..88f2277c11 100644
--- a/importexport/midiimport/importmidi_lyrics.cpp
+++ b/importexport/midiimport/importmidi_lyrics.cpp
@@ -159,25 +159,6 @@ void addTitleToScore(Score *score, const QString &string, int textCounter)
       measure->add(text);
       }
 
-// remove slashes in kar format
-
-QString removeSlashes(const QString &text)
-      {
-      QString newText = text;
-      newText = newText.replace("/", "");
-      newText = newText.replace("\\", "");
-      return newText;
-      }
-
-std::string removeSlashes(const std::string &text)
-      {
-      std::string str = text;
-      char chars[] = "/\\";
-      for (unsigned int i = 0; i != strlen(chars); ++i)
-            str.erase(std::remove(str.begin(), str.end(), chars[i]), str.end());
-      return str;
-      }
-
 void addTitleIfAny(const std::multimap<ReducedFraction, std::string> &lyricTrack, Score *score)
       {
       int textCounter = 0;
@@ -214,7 +195,7 @@ void addLyricsToScore(
 
             QString text = MidiCharset::convertToCharset(it->second);
             if (originalTime != ReducedFraction(0, 1) || !isTitlePrefix(text)) { // not title
-                  score->addLyrics(quantizedTime.fraction(), staffAddTo->idx(), removeSlashes(text).toHtmlEscaped());
+                  score->addLyrics(quantizedTime.fraction(), staffAddTo->idx(), text.toHtmlEscaped());
                   }
             }
       }
@@ -307,7 +288,7 @@ QList<std::string> makeLyricsListForUI()
             std::string lyricText;
 
             for (const auto &lyric: trackLyric) {
-                  const auto &text = removeSlashes(lyric.second);
+                  const auto &text = lyric.second;
                   if (isMetaText(text))
                         continue;
                   if (!lyricText.empty())

Antwort auf von Jojo-Schmitz

Im ersten Fall ist es die QString-Methode replace. Im zweiten Fall ist es eine C++-Methode der Standard-Library. Man sollte sich der Wartung wegen für ein klares Design entscheiden und damit nur eine einzige Library einbinden: Und das ist in diesem Projekt klar die Qt-Library.

Im Übrigen entfernen diese Methoden sämtliche Slashes im String, also auch solche, die Teil des Textes sein könnten.

Antwort auf von jmueller5524

Nur kann man die std::string Methoden nicht auf einen QString anwenden und umgekehrt. Es scheint, dass die beiden unterschiedlichen Methoden für unterschiedliche Zwecke benötigt werden, welcher genau erschließt sich mir auf die Schnelle nicht...
Edit: die std::string Methode wird anscheinen im MIDI Import Dialog benutzt, die andere für den eigentlichen Liedtext in der MuseScore Datei.

Und wie gesagt: keine Ahnung warum der Autor meinte Slashes entfernen zu müssen.
Edit: sind die evtl. (nur) für Karaoke wichtig, um dort die vorige Zeile aus der Anzeige zu löschen und die nächste Zeile anzuzeigen?

Antwort auf von Jojo-Schmitz

Nein, die Doppelungen deuten darauf hin, dass in Notenzeilen mit Violinschlüssel mehre Noten mit denselben Positionen und Dauer wie der Text stehen. Es sieht so aus, als dass die Leerschläge bestimmen, wo die '-' zu stehen kommen.
criminal verwendet ' ' vor dem Text;
michael verwenden ' ' nach dem Text.

Vielleicht ist es das Beste, man übernimmt es, so wie es ist, dann stimmt es nach dem Exportieren für den Player.

Ich habe jetzt kein Beispiel, aber kann man Midis mit mehrstrophigem Text korrekt einlesen?

Anhang Größe
musican4.png 56.09 KB
Crime_musican4.png 37.82 KB
criminal_0_orig.mid 38.43 KB

Do you still have an unanswered question? Please log in first to post your question.