diff --git a/composeApp/src/commonMain/composeResources/files/config.json b/composeApp/src/commonMain/composeResources/files/config.json index 67bef1f..b8efdc1 100644 --- a/composeApp/src/commonMain/composeResources/files/config.json +++ b/composeApp/src/commonMain/composeResources/files/config.json @@ -2,7 +2,8 @@ "themeMode": "DARK", "fontSize": 18.5, "playlist": [ - "assets://ff-33.txt", + "assets://ffpm-444-2.txt", + "assets://ffpm-760.txt", "assets://ews-456.txt", "assets://ews-1.txt", "assets://ews-2.txt", diff --git a/composeApp/src/commonMain/composeResources/files/ffpm-444-2.txt b/composeApp/src/commonMain/composeResources/files/ffpm-444-2.txt new file mode 100644 index 0000000..65cb434 --- /dev/null +++ b/composeApp/src/commonMain/composeResources/files/ffpm-444-2.txt @@ -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/Hatramin’ny anio./Ry Raiko feno antra! +Y4:Ry Jeso, Mofon’aina/Sy ranon’aina koa/Hianao no mahatony/Izay filan’ny fo;/Hianao no mahavoky/Hianao no manome/Izay irin’ny foko,/Dia hasambaram-be/Ry Raiko feno antra! diff --git a/composeApp/src/commonMain/composeResources/files/ffpm-760.txt b/composeApp/src/commonMain/composeResources/files/ffpm-760.txt new file mode 100644 index 0000000..0fa3a8f --- /dev/null +++ b/composeApp/src/commonMain/composeResources/files/ffpm-760.txt @@ -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 isan’andro 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. diff --git a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/AnnotatedTUO.kt b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/AnnotatedTUO.kt index f9ffc87..177f12d 100644 --- a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/AnnotatedTUO.kt +++ b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/AnnotatedTUO.kt @@ -71,6 +71,7 @@ class AnnotatedTUO (originalString: String, val voiceNumber: Int){ '[' -> toggleInSquareParen(voiceNumber, true, x) ')' -> toggleInRoundParen(voiceNumber, false, x) ']' -> toggleInSquareParen(voiceNumber, false, x) + '>' -> {} else -> { x++ finalText += it diff --git a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/PTemplate.kt b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/PTemplate.kt index f913bd1..fbc8157 100644 --- a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/PTemplate.kt +++ b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/PTemplate.kt @@ -5,15 +5,27 @@ class PTemplate (val template: String, val separatorAfter: String, private val m return markers.contains(marker) } fun markerToString(): String { - if (markers.size == 0) { + if (markers.isEmpty()) { return "" } return markers.joinToString(separator = "") { - it.replace(Regex("^\\$\\{([a-z]:)?(.*)\\}"), "$2") + it.replace(Regex("^\\$\\{([abd-z]:)?(.*)\\}"), "$2") .replace("\$Q", "\uD834\uDD10") .replace(Regex("^[<=>]$"), "") .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 + } } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/ParseULine.kt b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/ParseULine.kt index 2019301..6b21029 100644 --- a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/ParseULine.kt +++ b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/ParseULine.kt @@ -18,11 +18,12 @@ class ParseULine (var line: String, var measure: Int) { } fun parsed() : String { - val matchResult = Regex("^z([048C]):(.+)$").find(line) + val matchResult = Regex("^z([048CK]):(.+)$").find(line) if (matchResult != null) { val capturedChar = matchResult.groups[1]!!.value cursorX = when (capturedChar) { "C" -> 12 + "K" -> 20 else -> capturedChar.toInt() } line = matchResult.groups[2]!!.value @@ -84,6 +85,9 @@ class ParseULine (var line: String, var measure: Int) { charX = it } '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') } 'C' -> repeat(3) { parseUStage2('4') } '8' -> repeat(2) { parseUStage2('4') } diff --git a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/TUNote.kt b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/TUNote.kt index f403beb..53cb044 100644 --- a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/TUNote.kt +++ b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/TUNote.kt @@ -32,13 +32,16 @@ class TUNote (private val detailNote: MutableList = mutableListOf()){ } fun annotate(voiceNumber: Int) { val annotatedTUO = AnnotatedTUO(this.toString(), voiceNumber) - annotations = if (annotatedTUO.underlineSpec.size > 0) { + annotations = if (annotatedTUO.underlineSpec.isNotEmpty()) { annotatedTUO } else { null } } override fun toString() : String { + return toString("", "") + } + fun toString(fromKey: String = "", toKey: String = "") : String { var result = detailNote.joinToString (separator = ""){ it.toString() } .replace(Regex("\\. *,-$"), "") .replace(Regex(",-$"), "") @@ -57,6 +60,9 @@ class TUNote (private val detailNote: MutableList = mutableListOf()){ .replace("-", "―") .replace(".", "\u2022") .replace("z", "") + if ((fromKey != "") && (toKey != "")) { + result = ">" + Transpose.transpose(result, fromKey, toKey) + ">" + result + } return result } } \ No newline at end of file diff --git a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/TimeUnitObject.kt b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/TimeUnitObject.kt index 2309c4a..d35c127 100644 --- a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/TimeUnitObject.kt +++ b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/TimeUnitObject.kt @@ -36,6 +36,10 @@ import mg.dot.feufaro.data.GridTUOData import kotlin.math.min import androidx.compose.ui.geometry.Size 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 class TimeUnitObject (val pTemplate: PTemplate, val prevTUO: TimeUnitObject?) { @@ -46,6 +50,9 @@ class TimeUnitObject (val pTemplate: PTemplate, val prevTUO: TimeUnitObject?) { val numBlock: Int var markerBefore: String = "" private var annotated : Boolean + var transposeNewKey: String = "" + var transposeOldKey: String = "" + companion object { var nbBlock: Int = 0 var sep1: String = "" @@ -150,9 +157,18 @@ class TimeUnitObject (val pTemplate: PTemplate, val prevTUO: TimeUnitObject?) { else -> "" } val markersBefore = ""//pTemplate.template.replace(Regex("[a-yA-Y\\(\\[].*"), "") - return tuNotes.drop(1).joinToString (separator = "\n"){ - separatorBefore + markersBefore + it.toString().replace(Regex("[\\(\\)\\[\\]]"), "") + val transposeFrom = pTemplate.hasKeyChange() + 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() { // 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 = multiLineText + mutableNoteVersionX, + text = annotatedText, onTextLayout = { result -> textLayoutResult = result } diff --git a/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/Transpose.kt b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/Transpose.kt new file mode 100644 index 0000000..4c6b9b2 --- /dev/null +++ b/composeApp/src/commonMain/kotlin/mg/dot/feufaro/solfa/Transpose.kt @@ -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] + } + } +} \ No newline at end of file