Resolve lyrics DC refrain ${R=}${D:..}

This commit is contained in:
Hasinjato 2026-08-13 11:22:30 +03:00
parent 2f45098c28
commit 0eb3da71a0
2 changed files with 17 additions and 7 deletions

View file

@ -5,5 +5,5 @@ N2:#t, drd8mff mdtddttt/drd8mf fmdddtd /d7/ d7/ ddtrddt/ d7/ d7/ ddtrddt
N3:#r mfs4fmsd4sfmssrs/ mfs4fmsd4mfsfm/ mmf5/ lfm5/ fmrs4/ mmf5/ lfm5/ fmrtlls
N4:#s, d11ffd5s3/ d11ffdllssd/ ddf5/ ffd5/ ddrtdms/ ddf5/ ffd5/ ddr4s
Y1:Misy maro ao an-tsaha mitaraina,/Ka ento ny Jiro mba hankao!/Tsy mba misy anto_andro na maraina/Fa maizina re ny ao;/Indro olo-maro be/No maniry mafy hoe:/Mba midina mankaty,/Itondray Baiboly re/Izy\ ireo fa ta handre/An'i Kristy Tompo soa !/${R=}${D:"Mandehana", hoy ny Tompo, "mandehana/Ho amin'izao tontolo i\zao!"/Mitsangàna ary, eny, mitsangàna/Fa Izy no homba\ anao!}
Y2:Mandehana mba hitarika ny jamba,/Mba ampifalio ny ory fo;/Ny mahantra ilazao fa misy lamba/Tsy miova, tsy mety lo;/Jeso Mofon'aina soa/Sady Ranon'aina koa,/Asehoy ho hitany!/Tena Andriamanitra,/Tompo tao an-danitra,/Ambarao ho fantany!${D:"Mandehana", hoy ny Tompo, "mandehana/Ho amin'izao tontolo i\zao!"/Mitsangàna ary, eny, mitsangàna/Fa Izy no homba\ anao!}
Y3:Mandehana hanatanjaka ny osa,/Omeo toky re ny ketraka;/Ny anjaranao, ataovy ho tontosa/Ka aza dia reraka!/Mandehana i_anao/Ka vitao ny asanao/Fa ny tambinao arỳ;/Mbola any\ ihany re/ny handraisan-tamby be,/Dia rehefa tsy etỳ!${D:"Mandehana", hoy ny Tompo, "mandehana/Ho amin'izao tontolo i\zao!"/Mitsangàna ary, eny, mitsangàna/Fa Izy no homba\ anao!}
Y2:Mandehana mba hitarika ny jamba,/Mba ampifalio ny ory fo;/Ny mahantra ilazao fa misy lamba/Tsy miova, tsy mety lo;/Jeso Mofon'aina soa/Sady Ranon'aina koa,/Asehoy ho hitany!/Tena Andriamanitra,/Tompo tao an-danitra,/Ambarao ho fantany!
Y3:Mandehana hanatanjaka ny osa,/Omeo toky re ny ketraka;/Ny anjaranao, ataovy ho tontosa/Ka aza dia reraka!/Mandehana i_anao/Ka vitao ny asanao/Fa ny tambinao arỳ;/Mbola any\ ihany re/ny handraisan-tamby be,/Dia rehefa tsy etỳ!

View file

@ -20,7 +20,6 @@ import kotlin.math.min
//@todo: ffpm-99-2.txt triolet.mid + triolet (m--)--
//@todo: ffpm-657-1.txt ${m:4/4 Miadana kely}
//@todo: ews-80.txt ${m:12/4}
//@todo: ews-81.txt ${R=}${D:....}
//@todo: bug ffpm-629.txt sssszd au lieu de ssss-d(-rrrrtdr)
//@todo: bug ews-103.txt Triolet adds one blank
//@todo: bug ffpm-167-1.txt shoud start with : and not |
@ -36,6 +35,7 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository
private var refrainMaxStanza = -1
private var smartLyricsType = "L"
private val pitches = mutableListOf<MidiPitch>()
private val globalDComments = mutableListOf<String>()
companion object {
var currentFile = ""
@ -62,6 +62,7 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository
val REGEX_NOTE_TOADD = Regex("([drmfsltz][ia]?|[―])([₄₃₂₁¹²³⁴',]*)>([drmfsltz][ia]?|[―])([₄₃₂₁¹²³⁴',]*)")
val REGEX_NOTE_TODROP = Regex("([drmfsltz][ia]?|[―])([₄₃₂₁¹²³⁴',]*)<")
val REGEX_NOTE_SPLIT = Regex("\\$\\{[Ss]:([^\\}]+)\\}([drmfsltDRFSTz][,']*)")
val REGEX_DC_REFRAIN = Regex("""\$\{R=\}\$\{D:(.*?)\}""")
}
fun parseNoteSplit(input: String): String {
@ -218,6 +219,7 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository
T.clear()
N.clear()
L.clear()
globalDComments.clear()
if (pitches.isNotEmpty()) {
pitches[0].reset()
}
@ -301,6 +303,7 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository
T.clear()
N.clear()
L.clear()
globalDComments.clear()
if (pitches.isNotEmpty()) {
pitches[0].reset()
}
@ -2465,8 +2468,9 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository
copyRefrainToStanza(stanzaNumber)
}
if (lyricsComment.isNotEmpty()) {
val lyricsIterator = lyricsComment.iterator()
val commentsToProcess = if (lyricsComment.isNotEmpty()) lyricsComment else globalDComments
if (commentsToProcess.isNotEmpty()) {
val lyricsIterator = commentsToProcess.toList().iterator()
while (lyricsIterator.hasNext()) {
var item = lyricsIterator.next()
// @todo: if item == ${O:...}
@ -2490,7 +2494,6 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository
.forEachIndexed { i, xval ->
appendLyricsItem(stanzaNumber, i + pDS, xval)
}
lyricsIterator.remove()
}
}
}
@ -2549,12 +2552,19 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository
val smartLyrics = smartELyrics(lyrics)
loadL(intKey, smartLyrics)
}
private fun isDCRefrain(text: String): Boolean {
return text.startsWith("\${R=}\${D:") && text.endsWith("}")
}
private fun getLyricsComments(lyrics: String): String {
val matchResult = REGEX_LYRICS_COMMENT.findAll(lyrics)
.map { it.value }.toList()
if (matchResult.isNotEmpty()) {
lyricsComment.addAll(matchResult)
matchResult.filter { isDCRefrain(it) || REGEX_DC_REFRAIN.containsMatchIn(it) }.forEach { refrain ->
if (!globalDComments.contains(refrain)) {
globalDComments.add(refrain)
}
}
}
return REGEX_STRIP_DC.replace(lyrics, $$"\\${x:}")
}