Support "DSFin" marker on MidiPlayer - android

This commit is contained in:
Hasinjato 2026-07-20 14:32:08 +03:00
parent 790ed83ddc
commit 3bbe9367b7

View file

@ -410,21 +410,41 @@ actual class FMediaPlayer actual constructor(
var lastFactor=Dynamic.MF.factor var lastFactor=Dynamic.MF.factor
val ritRegex = Regex("""rit\.?|ritard\.?|ritenuto\.?|ritardando""", RegexOption.IGNORE_CASE) val ritRegex = Regex("""rit\.?|ritard\.?|ritenuto\.?|ritardando""", RegexOption.IGNORE_CASE)
val rallRegex = Regex("""rall\.?|rallent\.?|rallentando""", RegexOption.IGNORE_CASE) val rallRegex = Regex("""rall\.?|rallent\.?|rallentando""", RegexOption.IGNORE_CASE)
val dsR = Regex("""D\.?S\.?""");
val dcR = Regex("""D\.?C\.?""")
/*val dsG = Regex("""D\.?S\.?_GROUP_PART""");
val dcG = Regex("""D\.?C\.?_GROUP_PART""")*/
val finReg = Regex("""(fine|fin|farany|end)""", RegexOption.IGNORE_CASE)
metadataList.forEach { midiMarker -> metadataList.forEach { midiMarker ->
val ci = midiMarker.gridIndex ?: 0 val ci = midiMarker.gridIndex ?: 0
val dsR = Regex("""D\.?S\.?""");
val dcR = Regex("""D\.?C\.?""")
val dsG = Regex("""D\.?S\.?_GROUP_PART""");
val dcG = Regex("""D\.?C\.?_GROUP_PART""")
val finReg = Regex("""(fine|fin|farany|end)""", RegexOption.IGNORE_CASE)
val last_grid = sharedScreenModel.getTotalGridCount() val last_grid = sharedScreenModel.getTotalGridCount()
val hairPins = sharedScreenModel.getHairPins() val hairPins = sharedScreenModel.getHairPins()
val markerList = midiMarker.marker val markerList = midiMarker.marker
markerList.forEach { marker -> var i = 0
while(i < markerList.size) {
val marker = markerList[i]
val mTrim = marker.trim() val mTrim = marker.trim()
val nextMarker = markerList.getOrNull(i + 1)
val nextTrim = nextMarker?.trim() ?: ""
val isDsFin = (dsR.containsMatchIn(mTrim) && finReg.containsMatchIn(nextTrim)) ||
(dsR.containsMatchIn(nextTrim) && finReg.containsMatchIn(mTrim))
val isDcFin = (dcR.containsMatchIn(mTrim) && finReg.containsMatchIn(nextTrim)) ||
(dcR.containsMatchIn(nextTrim) && finReg.containsMatchIn(mTrim))
when { when {
isDsFin || isDcFin -> {
val target = if (lastSegno > 0) lastSegno else 0
navigationSteps.add(NavigationStep(
marker = "$mTrim$nextTrim",
gridIndex = ci,
targetGrid = if (isDsFin) target else 0
))
i += 2
continue
}
marker.contains("$") -> lastSegno = ci marker.contains("$") -> lastSegno = ci
marker.contains("\uD834\uDD10") -> { marker.contains("\uD834\uDD10") -> {
@ -457,24 +477,12 @@ actual class FMediaPlayer actual constructor(
) )
) )
} }
dsG.matches(mTrim) -> {
val target = if(lastSegno>0) lastSegno else 0
val indx = if((last_grid-ci)<=0) ci-1 else ci
navigationSteps.add(NavigationStep(marker, indx, targetGrid=target))
}
dsR.matches(mTrim) || marker == "DSFin" -> { dsR.matches(mTrim) -> {
navigationSteps.add(NavigationStep(marker, ci, navigationSteps.add(NavigationStep(marker, ci,
targetGrid = if(lastSegno>0) lastSegno else 0)) targetGrid = if(lastSegno>0) lastSegno else 0))
} }
dcR.matches(mTrim) -> {
dcG.matches(mTrim) -> {
val indx = if((last_grid-ci)<=0) ci-1 else ci
navigationSteps.add(NavigationStep(marker, indx, targetGrid=0))
println("DC_GROUP créé à $indx → 0")
}
dcR.matches(mTrim) && !marker.contains("DC_GROUP_PART") -> {
val indx = if((last_grid-ci)<=0) ci else ci val indx = if((last_grid-ci)<=0) ci else ci
navigationSteps.add(NavigationStep(marker, indx, targetGrid=0)) navigationSteps.add(NavigationStep(marker, indx, targetGrid=0))
println("DC créé à $indx → 0") println("DC créé à $indx → 0")
@ -483,34 +491,25 @@ actual class FMediaPlayer actual constructor(
// ── Farany ──────────────────────────────── // ── Farany ────────────────────────────────
finReg.containsMatchIn(mTrim) -> { finReg.containsMatchIn(mTrim) -> {
val hasDcAfter = metadataList.any { m -> val hasDcAfter = metadataList.any { m ->
val after = (m.gridIndex ?: 0) > ci (m.gridIndex ?: 0) > ci && m.marker.any { mk -> dcR.containsMatchIn(mk) }
val hasMarker = m.marker.any { mk ->
val value = mk.trim()
val ok = dcG.matches(value) || dcR.matches(value)
ok
}
after && hasMarker
} }
if (hasDcAfter) { if (hasDcAfter) {
navigationSteps.add(NavigationStep( navigationSteps.add(
marker = marker, NavigationStep(
gridIndex = ci, marker,
targetGrid = last_grid, ci,
isFarany = true, targetGrid = last_grid,
faranyActive = false isFarany = true, faranyActive = false)
)) )
println("Farany mémorisé à $ci")
} else { } else {
val verse = sharedScreenModel.stanza.value val verse = sharedScreenModel.stanza.value
val verses = sharedScreenModel.nbStanzas.value val verses = sharedScreenModel.nbStanzas.value
println("Farany ignoré à $ci i $verse == $verses") println("Farany ignoré à $ci i $verse == $verses")
navigationSteps.add( navigationSteps.add(
NavigationStep( NavigationStep(
marker="${marker}_STZ", marker = "${marker}_STZ",
gridIndex=ci, gridIndex = ci,
isFarany = true, isFarany = true, faranyActive = (verse != verses)
faranyActive = if(verse == verses) false else true
) )
) )
} }
@ -553,6 +552,7 @@ actual class FMediaPlayer actual constructor(
)) ))
} }
} }
i++
} }
} }
} }