KeyChange

This commit is contained in:
dotmg 2025-07-12 08:21:29 +02:00
parent c4cb836bd5
commit a1c4a34ef0
9 changed files with 128 additions and 8 deletions

View file

@ -2,7 +2,8 @@
"themeMode": "DARK", "themeMode": "DARK",
"fontSize": 18.5, "fontSize": 18.5,
"playlist": [ "playlist": [
"assets://ff-33.txt", "assets://ffpm-444-2.txt",
"assets://ffpm-760.txt",
"assets://ews-456.txt", "assets://ews-456.txt",
"assets://ews-1.txt", "assets://ews-1.txt",
"assets://ews-2.txt", "assets://ews-2.txt",

View file

@ -0,0 +1,10 @@
M0:|c:Bb|m:6/4|t:FFPM 444 Ry Raiko Feno Antra|a:R. Baron 1847-1907|h:|r:7.6.7.6.D.
U0:zK:4 8484 C8/4 8484 (C8)/4 8484 C8/4 84(44)4 K/${c:F}4 8484 C8/4 84(44)4 K/4 8484 C8/4 8484 K/${c:Bb}4 8484 C8/4 8484 (C8)/4 8484 C8/4 84(44)4 K
N1:#m,ssslssm/sddrrm'r/rddttld/lsdtltd/#dssslssm/ssrrdrm/ssslssm/ssfmrd/#m,ssslssm/sddrrm'r/rddttld/lsdtltd
N2:#d,mmmfmmd/msssss-/fmmSSll/fmsf-fm/#l,d7/dtttltd/mmmfmmd/mmrdtd/#d,mmmfmmd/ms5-/fmmSSll/fmsf-fm
N3:#s,dddddds/dddttdt/tdmmrdd/ddmr-rd/mmmfmm#rs/mrss-ss/sddddds/ssssfm/#s,d6s/dddttdt/tdmmrdd/ddmr-rd
N4:#d,d7/dmmssd's/sllmmff/fsss-sd/#s,d7/dsss-sd/d7/dssssd/#d,d7/dmmssds/sllmmff/fsss-sd
Y1:Ry Raiko feno antra!/Inty ny zanakao,/Ny foko dia mahantra/Ra\ha lavitra\ aminao;/Fa tany karankaina/Izao tontolo\ izao/Ka reraka ny aina/Mihataka\ aminao.${R=}Ry Raiko feno antra!/Inty ny zanakao,/Ny foko dia mahantra/Ra\ha lavitra\ aminao.
Y2:Nivezivezy aho/Nikaro-java-tsoa,/Izay rehetra hita/Nandramana\ avokoa;/Nandany taona maro/Nanaran-tsitrapo,/Kanefa tsy nahazo/Izay mahafa-po./Ry Raiko feno antra!
Y3:Mamitaka mihitsy/Izao tontolo\ izao,/Ny mamy dia mangidy,/I\zay tena soa tsy ao;/Koa aza mba\ adalainy/Intsony re, ny fo!/Andeha mba ho hendry/Hatraminny anio./Ry Raiko feno antra!
Y4:Ry Jeso, Mofonaina/Sy ranonaina koa/Hianao no mahatony/Izay filanny fo;/Hianao no mahavoky/Hianao no manome/Izay irinny foko,/Dia hasambaram-be/Ry Raiko feno antra!

View file

@ -0,0 +1,10 @@
M0:|c:A|m:6/4|t:FFPM 760 Aza Mba Manadino|a:J. Richardson 1844-1922|h:(Old. St. Co., p. 71)|r:P.M.
U0:z0:444(44)4 C84 8484 K/4 84(44)4 C84 8484 K/4 8484 C84 8484 Kz4/ 444(44)4 C84 8484 Kz4/ ${p}4448z4 ${f}4448z4 /${ff}44484 8484 8484 O
N1:#s,m4-rdldsdmdr/rmmm-rdldtdmrd/drrrmfrrsmdmr/m4-rdldtdmrd/r4m4/fffmml's'frtdmrd
N2:#f,sssd-tlfls5/sssd-tlfls5/dtttdrttd4t/sssd-tlfls5/s8/d8ls5
N3:#t,d4-d8t/tddd-d3frmsfm/ms12/d4-d3frmsfm/t4d4/d5fslfrmsfm
N4:#d,d4rmfffmmdms/sdddrmfffs4d'/d's7mmmds/d4rmfffs4d/s4d4/l3ssfmffs4d
Y1:Aza mba manadino ny ray sy reninao;/Fa izy no nitaiza sy nanasoa anao;/Ka na\ aiza na\ aiza\ aleha an-tany lavitra,/Aza mba manadino ny ray sy reninao;/Tsara izay! Tsara izay!/Eny, tsy ho hadinonay/Ny ray sy reninay.
Y2:Aza mba manadino ny tanindrazanao,/Tsarovy ny tanàna i\zay nahabe anao;/Fadio izay tsy mety fanaony fahizay,/Aza mba manadino/Ny tanindrazanao:/Tsara izay! Tsara izay!/Eny, tsy ho hadinonay/Ny tanindrazanay.
Y3:Aza mba manadino ireo mpitondra\ anao,/Araho ny lalàna mba hi_adananao:/Ka na\ aiza na\ aiza\ aleha an-tany lavitra,/Aza mba manadino/Ireo mpitondra\ anao:/Tsara izay! Tsara izay!/Eny, tsy ho hadinonay/Izay mpitondra\ anay.
Y4:Aza mba manadino ny fivavahanao,/Ataovy isanandro mba hamonjena\ anao;/Mpitondra, ray sy reny ny tany, tena koa,/Aza mba manadino ny fivavahanao:/Tsara izay! Tsara izay!/Eny, tsy ho hadinonay/Ny fivavahanay.

View file

@ -71,6 +71,7 @@ class AnnotatedTUO (originalString: String, val voiceNumber: Int){
'[' -> toggleInSquareParen(voiceNumber, true, x) '[' -> toggleInSquareParen(voiceNumber, true, x)
')' -> toggleInRoundParen(voiceNumber, false, x) ')' -> toggleInRoundParen(voiceNumber, false, x)
']' -> toggleInSquareParen(voiceNumber, false, x) ']' -> toggleInSquareParen(voiceNumber, false, x)
'>' -> {}
else -> { else -> {
x++ x++
finalText += it finalText += it

View file

@ -5,15 +5,27 @@ class PTemplate (val template: String, val separatorAfter: String, private val m
return markers.contains(marker) return markers.contains(marker)
} }
fun markerToString(): String { fun markerToString(): String {
if (markers.size == 0) { if (markers.isEmpty()) {
return "" return ""
} }
return markers.joinToString(separator = "") { return markers.joinToString(separator = "") {
it.replace(Regex("^\\$\\{([a-z]:)?(.*)\\}"), "$2") it.replace(Regex("^\\$\\{([abd-z]:)?(.*)\\}"), "$2")
.replace("\$Q", "\uD834\uDD10") .replace("\$Q", "\uD834\uDD10")
.replace(Regex("^[<=>]$"), "") .replace(Regex("^[<=>]$"), "")
.replace($$"$T", "") .replace($$"$T", "")
.replace(Regex("^c:(.*)"), "Do dia $1")
} }
} }
fun hasKeyChange(): String {
var returnFun = ""
markers.map {
val regexFound = Regex("^\\$\\{c:(..?)\\}").find(it)
if (regexFound != null) {
returnFun = regexFound.groupValues[1]
}
true
}
return returnFun
}
} }

View file

@ -18,11 +18,12 @@ class ParseULine (var line: String, var measure: Int) {
} }
fun parsed() : String { fun parsed() : String {
val matchResult = Regex("^z([048C]):(.+)$").find(line) val matchResult = Regex("^z([048CK]):(.+)$").find(line)
if (matchResult != null) { if (matchResult != null) {
val capturedChar = matchResult.groups[1]!!.value val capturedChar = matchResult.groups[1]!!.value
cursorX = when (capturedChar) { cursorX = when (capturedChar) {
"C" -> 12 "C" -> 12
"K" -> 20
else -> capturedChar.toInt() else -> capturedChar.toInt()
} }
line = matchResult.groups[2]!!.value line = matchResult.groups[2]!!.value
@ -84,6 +85,9 @@ class ParseULine (var line: String, var measure: Int) {
charX = it charX = it
} }
'W' -> repeat(8) { parseUStage2('4')} 'W' -> repeat(8) { parseUStage2('4')}
'S' -> repeat(7) { parseUStage2('4')}
'O' -> repeat(6) { parseUStage2('4')}
'K' -> repeat(5) { parseUStage2('4')}
'G' -> repeat(4) { parseUStage2('4') } 'G' -> repeat(4) { parseUStage2('4') }
'C' -> repeat(3) { parseUStage2('4') } 'C' -> repeat(3) { parseUStage2('4') }
'8' -> repeat(2) { parseUStage2('4') } '8' -> repeat(2) { parseUStage2('4') }

View file

@ -32,13 +32,16 @@ class TUNote (private val detailNote: MutableList<Note> = mutableListOf()){
} }
fun annotate(voiceNumber: Int) { fun annotate(voiceNumber: Int) {
val annotatedTUO = AnnotatedTUO(this.toString(), voiceNumber) val annotatedTUO = AnnotatedTUO(this.toString(), voiceNumber)
annotations = if (annotatedTUO.underlineSpec.size > 0) { annotations = if (annotatedTUO.underlineSpec.isNotEmpty()) {
annotatedTUO annotatedTUO
} else { } else {
null null
} }
} }
override fun toString() : String { override fun toString() : String {
return toString("", "")
}
fun toString(fromKey: String = "", toKey: String = "") : String {
var result = detailNote.joinToString (separator = ""){ it.toString() } var result = detailNote.joinToString (separator = ""){ it.toString() }
.replace(Regex("\\. *,-$"), "") .replace(Regex("\\. *,-$"), "")
.replace(Regex(",-$"), "") .replace(Regex(",-$"), "")
@ -57,6 +60,9 @@ class TUNote (private val detailNote: MutableList<Note> = mutableListOf()){
.replace("-", "") .replace("-", "")
.replace(".", "\u2022") .replace(".", "\u2022")
.replace("z", "") .replace("z", "")
if ((fromKey != "") && (toKey != "")) {
result = ">" + Transpose.transpose(result, fromKey, toKey) + ">" + result
}
return result return result
} }
} }

View file

@ -36,6 +36,10 @@ import mg.dot.feufaro.data.GridTUOData
import kotlin.math.min import kotlin.math.min
import androidx.compose.ui.geometry.Size import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.buildAnnotatedString
import androidx.compose.ui.text.style.BaselineShift
import androidx.compose.ui.text.withStyle
val FEUFAROO_TRIOLET_COLOR = Color.DarkGray val FEUFAROO_TRIOLET_COLOR = Color.DarkGray
class TimeUnitObject (val pTemplate: PTemplate, val prevTUO: TimeUnitObject?) { class TimeUnitObject (val pTemplate: PTemplate, val prevTUO: TimeUnitObject?) {
@ -46,6 +50,9 @@ class TimeUnitObject (val pTemplate: PTemplate, val prevTUO: TimeUnitObject?) {
val numBlock: Int val numBlock: Int
var markerBefore: String = "" var markerBefore: String = ""
private var annotated : Boolean private var annotated : Boolean
var transposeNewKey: String = ""
var transposeOldKey: String = ""
companion object { companion object {
var nbBlock: Int = 0 var nbBlock: Int = 0
var sep1: String = "" var sep1: String = ""
@ -150,9 +157,18 @@ class TimeUnitObject (val pTemplate: PTemplate, val prevTUO: TimeUnitObject?) {
else -> "" else -> ""
} }
val markersBefore = ""//pTemplate.template.replace(Regex("[a-yA-Y\\(\\[].*"), "") val markersBefore = ""//pTemplate.template.replace(Regex("[a-yA-Y\\(\\[].*"), "")
return tuNotes.drop(1).joinToString (separator = "\n"){ val transposeFrom = pTemplate.hasKeyChange()
separatorBefore + markersBefore + it.toString().replace(Regex("[\\(\\)\\[\\]]"), "") val transposeTo = if (transposeFrom != "") {
transposeOldKey = transposeFrom
prevTUO?.transposeOldKey ?: "Bb"
} else {
transposeOldKey = prevTUO?.transposeOldKey ?: "Bb"
"" }
val retour = tuNotes.drop(1).joinToString (separator = "\n"){
separatorBefore + markersBefore + it.toString(transposeFrom, transposeTo).replace(Regex("[\\(\\)\\[\\]]"), "")
} }
return retour
} }
fun annotate() { fun annotate() {
// We must annotate once, because, annotations can be called asynchronously after first filling // We must annotate once, because, annotations can be called asynchronously after first filling
@ -339,8 +355,26 @@ fun TimeUnitComposable(
} }
} }
){ ){
val annotatedText = buildAnnotatedString {
multiLineText.split(">").mapIndexed { index, text ->
if (index %2 == 0) {
append(text)
} else {
withStyle(
style = SpanStyle(
fontSize = 10.sp,
baselineShift = BaselineShift.Superscript,
//fontStyle = FontStyle.Italic,
color = Color.Blue
)) {
append(text+" ")
}
}
}
}
Text( Text(
text = multiLineText + mutableNoteVersionX, text = annotatedText,
onTextLayout = { result -> onTextLayout = { result ->
textLayoutResult = result textLayoutResult = result
} }

View file

@ -0,0 +1,42 @@
package mg.dot.feufaro.solfa
class Transpose {
companion object {
val noteToNumber = listOf("d", "di", "r", "ri", "m", "f", "fi", "s", "si", "l", "ta", "t")
val keyToNumber = listOf("C", "Db", "D", "Eb", "E", "F", "Gb", "G", "Ab", "A", "Bb", "B" )
fun transpose(note: String, fromKey: String, toKey: String): String {
val regexFound = Regex("^([drmfslt][ia]?)([¹²³₁₂₃]?)(.*)").find(note)
if (regexFound == null) {
return note
}
val noteNaked = regexFound.groupValues[1]
val noteNum = noteToNumber.indexOf(noteNaked)
val oldKey = keyToNumber.indexOf(fromKey)
val newKey = keyToNumber.indexOf(toKey)
var newNoteNum = noteNum - newKey + oldKey
var suffix = ""
val noteSize = noteToNumber.size
if (newNoteNum < 0) {
newNoteNum += noteSize
suffix = ","
}
if (newNoteNum >= noteSize) {
newNoteNum -= noteSize
suffix = "'"
}
val newNote = noteToNumber[newNoteNum] + regexFound.groupValues[2] + suffix
return newNote.replace("¹,", "")
.replace("¹'", "²")
.replace("²,", "¹")
.replace("²'", "³")
.replace("³,", "²")
.replace("₁'", "")
.replace("₁,", "")
.replace("₂'", "")
.replace("₂,", "")
.replace("₃'", "")
.replace(",", "")
.replace("'", "¹") + regexFound.groupValues[3]
}
}
}