alternativeLyrics

This commit is contained in:
dotmg 2025-07-25 12:31:48 +02:00
parent 8ebd255cc8
commit 5e53450937
4 changed files with 67 additions and 27 deletions

View file

@ -4,6 +4,6 @@ N1:#s,sF,sdms'fl/sltdrfmm/sF,sdmsfl'-/#dsmsfrmdd/dflfdl(s-)--(m-)--/srslsf(m-)--
N2:#r,mRmmsTlf/rrssslss/mRmmsTllt/dstlsfmm/ll(d-)-f#f,mrdsdrmd/rr(t-)-rdtdlsFsT/ll(d-)-f'mrdsdrmd/rrttdtstls
N3:#s,dddrmddd/tdrdtrdd/dddrmddrR/mdrtdtss/#ddd(f-)-lsfmrmfsm/ff(r-)-fsFsfmRms/dd(f-)-lsfmrmfsm/ffrrsfmsfm
N4:#d,d5mff/s6dd/d5mffF/s6dd/ff(f-)-l#r,d3d, msdl/ss(s-)-sd4d,3m/ff(f-)-ld3d,msdl/s6d,--d,
Y1:Masoko manganohano,/Nitomany feno rano/No\ho ny helokefa vita,/Dia mitony ra\ha nahita/Masona_o be fi_an_4tra_3/Ry Mpamonjy ny maha_4ntra_4/O Vo_avotrao lay ve_4ry_4/Ry fitiavana mahery.
Y2.Tanako mangadihady/Nisarangotra nitady/Fanavotana sy Vonjy/Fefa resy ka nilonjy./Dia noraisinao ry To_4mpo_4/Na dia tànana malo_4to_4/O vo_avotrao lay ve_4ry_4/Ry Fitiavana mahery.
Y3:Foko tena fahavalo/Nefa resy ka mimalo/Ra\ha nifona fa naditra/Hitanao nipitrapitra./Babo tsy\ afaka ho ai_4za_4/Zao noraisinao\ ho sakai_4za_4/O vo_avotrao lay ve_4ry_4/Ry Fitiavana mahery.
Y1:Masoko manganohano,/Nitomany feno rano/No\ho ny helokefa vita,/Dia mitony ra\ha nahita/Masona_o be fi_a_4ntra_3/Ry Mpamonjy ny maha_4ntra_3/O Vo_avotrao lay ve_4ry_3/Ry fitiavana mahery.
Y2.Tanako mangadihady/Nisarangotra nitady/Fanavotana sy Vonjy/Fefa resy ka nilonjy./Dia noraisinao ry To_4mpo_3/Na dia tànana malo_4to_3/O vo_avotrao lay ve_4ry_3/Ry Fitiavana mahery.
Y3:Foko tena fahavalo/Nefa resy ka mimalo/Ra\ha nifona fa naditra/Hitanao nipitrapitra./Babo tsy\ afaka ho ai_4za_3/Zao noraisinao\ ho sakai_4za_3/O vo_avotrao lay ve_4ry_3/Ry Fitiavana mahery.

View file

@ -6,4 +6,4 @@ N3:d'smd#sd10/mmrddtt/rrddrfmrd/z3d7sz4s8z/zzzs4z3s4/z9/d4lls3
N4:d'smd#t,f5lfd3/ddfmmss/ssllfrs#s,sd/z7d5z7s5/z3ddttz3d4/z9/ddf4s'sd
O1:v3:I\lay nirahinao, ry Tompo,_4I\lay nirahinao, ry Tompo,_4No derainay,_3No derainay;_9
O1:v4:I\lay nirahinao,_7I\lay nirahinao,_3No derainay,_3No derainay_9
Y1:He, hosana! Isaoranani_e ny Mesi_a,/I\zay nalefanny Tompo,/Ka hosana no asandratray./I\lay nira${O:1}hi_2nao _ry _Tompo_2/I\lay nirahi_2nao _ry _Tompo_2/No derainay,_4/No derainay,_4/Ka hosana no asandratray!/Ka hosana no asandratray!/
Y1:He, hosana! Isaoranani_e ny Mesi_a,/I\zay nalefanny Tompo,/Ka hosana no asandratray./I\lay nira${O:1}hi_2nao _ry _Tompo_/I\lay nirahi_2nao _ry _Tompo_/No derainay,_3/No derainay,_3/Ka hosana no asandratray!/Ka hosana no asandratray!/

View file

@ -2,6 +2,7 @@ package mg.dot.feufaro.solfa
class POneStanzaLyrics {
private val lyrics: MutableList<String> = mutableListOf("")
private val alternativeLyrics: MutableMap<Int, MutableMap<Int, String>> = mutableMapOf()
fun getLyrics(stanzaNumber: Int) : String {
return this.lyrics[stanzaNumber]
}
@ -11,8 +12,12 @@ class POneStanzaLyrics {
}
this.lyrics[stanzaNumber] = lyrics
}
fun setAlternativeLyrics(stanzaNumber: Int, voiceNumber: Int, text: String) {
alternativeLyrics
.getOrPut(voiceNumber) { mutableMapOf() } [stanzaNumber] = text
}
override fun toString(): String {
return lyrics[1]?: ""
return lyrics[1]
}
fun appendDSLyrics(stanzaNumber: Int, lyrics: String) {
if (this.lyrics.size > stanzaNumber) {

View file

@ -14,6 +14,7 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository
private val O: MutableMap<Int, MutableList<String>> = mutableMapOf()
private val unparsedNote = mutableListOf<String>()
private var refrainBeginsAt = -1
private var smartLyricsType = "L"
companion object {
val REGEX_SHIFT_PAREN_UPWARD = Regex("([^a-yA-Y\\(\\[]+)([\\)\\]])")
val REGEX_SHIFT_PAREN_DOWNWARD = Regex("([\\(\\[])([^a-yA-y\\)\\]]+)")
@ -420,37 +421,70 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository
private fun String.addHyphens(): String {
return this
.replace("_/", "/")
//.also { println ("1 $it")}
//.replace("_/", "/")
.replace(Regex("(?<![\\?:,\\.;])_"), "-_")
//.also { println ("2 $it")}
.replace(Regex("_-(?=_)"), "_")
//.also { println ("3 $it")}
.replace(" -_", "_")
//.also { println ("4 $it")}
.replace(" _", "_")
//.also { println ("5 $it")}
.replace("--_", "-_")
//.also { println ("6 $it")}
.replace(Regex("_$"), "")
}
private fun unpackLyrics(lyrics: String) :String {
val comments = REGEX_COMMENT.findAll(lyrics)
val commentsIterator = comments.iterator()
val loadedLyrics = lyrics//.replace(REGEX_LYRICS_COMMENT, "")
.replace(REGEX_LYRICS_REPETITION) { matchResult ->
val repeating = matchResult.destructured.match.groupValues[1]
"_".repeat(repeating.toString().toInt())
}
.addHyphens()
val lyricsFinal = REGEX_COMMENT.replace(loadedLyrics) { matchResult ->
commentsIterator.next().value
}
return lyricsFinal
}
private fun loadL(stanzaNumber: Int, lyrics: String) {
val unpackedLyrics = unpackLyrics(lyrics)
loadLyrics(stanzaNumber, unpackedLyrics)
}
fun setOverrideLyrics(stanzaNumber: Int, i: Int, voice: Int, text: String) {
while (L.size <= i) {
L.add(POneStanzaLyrics())
}
L[i].setAlternativeLyrics(stanzaNumber, voice, text)
}
private fun loadLyrics(stanzaNumber: Int, lyrics: String) {
val overrideIterator: MutableMap<Int, Iterator<String>> = mutableMapOf()
try {
getLyricsComments(lyrics)
val comments = REGEX_COMMENT.findAll(lyrics)
val commentsIterator = comments.iterator()
val loadedLyrics = lyrics//.replace(REGEX_LYRICS_COMMENT, "")
.replace(REGEX_LYRICS_REPETITION) { matchResult ->
val repeating = matchResult.destructured.match.groupValues[1]
"_".repeat(repeating.toString().toInt())
}
.addHyphens()
val lyricsFinal = REGEX_COMMENT.replace(loadedLyrics) { matchResult ->
commentsIterator.next().value
}
val arrayLyrics = lyricsFinal.split(Regex("[/_]"))
val arrayLyrics = lyrics.split(Regex("[/_]"))
arrayLyrics.forEachIndexed { i, lyricsItem ->
val originalLyrics = REGEX_COMMENT.replace(lyricsItem, "")
if (lyricsItem.length > 4 && lyricsItem.substring(0, 4) == $$"${O:") {
val overrideNumber = lyricsItem.replace(Regex("\\D"), "").toIntOrNull() ?: -1
val override = O.getOrElse(overrideNumber) { null }
override?.forEachIndexed { index, value ->
val matchResult = Regex("v(\\d+):(.*)").find(value)
val overrideString = when (smartLyricsType) {
"E" -> smartELyrics(matchResult?.groupValues[2] ?: value)
"Y" -> smartYLyrics(matchResult?.groupValues[2] ?: value)
else -> value
}
for ( iN in (1..9) ) {
if (matchResult?.groupValues[1]?.contains(iN.digitToChar()) ?: false) {
val overrideSyllabus = overrideString.split(Regex("[_/]")).iterator()
overrideIterator[iN] = overrideSyllabus
}
}
}
}
if (overrideIterator.isNotEmpty()) {
overrideIterator.map { (voice, textIterator) ->
if (textIterator.hasNext()) {
setOverrideLyrics(stanzaNumber, i, voice, textIterator.next())
}
}
}
addLyricsItem(stanzaNumber, i, originalLyrics)
}
if (refrainBeginsAt > 0 && stanzaNumber > 1 && !lyrics.contains($$"${R!}")) {
@ -493,7 +527,6 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository
.replace(" ", " _")
.replace("_\\ _", " ")
.replace("_\\", "")
.replace("_/", "/")
.replace("_0", "")
.replace(REGEX_MALAGASY_MN, "$1$2_$3")
.replace(REGEX_MALAGASY_MN_STAGE2, "$1-_")
@ -502,10 +535,11 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository
val lyricsFinal = REGEX_COMMENT.replace(loadedLyrics) { matchResult ->
commentsIterator.next().value
}
return lyricsFinal
return unpackLyrics(lyricsFinal)
}
// loadY is a smart lyrics parser for Malagasy language
private fun loadY(intKey: Int, lyrics: String) {
smartLyricsType = "Y"
val smartLyrics = smartYLyrics(lyrics)
loadL(intKey, smartLyrics)
}
@ -517,10 +551,11 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository
.replace("_/", "/")
.replace("_0", "")
getLyricsComments(loadedLyrics)
return loadedLyrics
return unpackLyrics(loadedLyrics)
}
// loadE is a smart Lyrics parser for English language
private fun loadE(intKey: Int, lyrics: String) {
smartLyricsType = "E"
val smartLyrics = smartELyrics(lyrics)
loadL(intKey, smartLyrics)
}