ScreenTranspose, first draft

This commit is contained in:
dotmg 2025-07-13 05:09:13 +02:00
parent a1c4a34ef0
commit 7df3312f84
19 changed files with 229 additions and 67 deletions

View file

@ -55,6 +55,8 @@ kotlin {
implementation(libs.koin.compose.viewmodel.navigation)
implementation(libs.bundles.voyager)
implementation(libs.cafe.voyager.koin)
implementation(libs.androidx.material.icons.extended)
}
commonTest.dependencies {
implementation(libs.kotlin.test)

View file

@ -2,6 +2,14 @@
"themeMode": "DARK",
"fontSize": 18.5,
"playlist": [
"assets://ffpm-428.txt",
"assets://ffpm-449.txt",
"assets://ffpm-489.txt",
"assets://ffpm-21.txt",
"assets://ffpm-179.txt",
"assets://ff-33.txt",
"assets://ffpm-297.txt",
"assets://ffpm-33.txt",
"assets://ffpm-444-2.txt",
"assets://ffpm-760.txt",
"assets://ews-456.txt",

View file

@ -0,0 +1,10 @@
M0:|c:Bb|m:4/4|r:12.13.14.15|t:FFPM 179 Ny Fanahy Masina Efa Tonga Tokoa|a:G. Ramiarison 1919- (Faha 100 taonan'ny IEB)|h:G. Ramiarison 1919-
U0:z0:62444444 844(444)/4 6244(44)44 4444 (444)/4 62422 (444)4 62422 (444)/4 6244 (222)244 42244Cz4
N1:#s,ssFsdmmrdrrm--/sddtll-sdmmrdr--/srDrfmr--smRmsfm--/#t,dssfff--fmmrfrdtd
N2:#r,mmrmmsssssss--/mmmsff-smssFFsFs/sfmfssstlssFstls--/ssssssltlssflfmrm
N3:#s,ddlssddtdttd--/ddsltdtddddldtdr/ttTtrdtrdtd6--/mmdrttdrtddlllsss
N4:#d,d7rmssdsm/d6rmdddrrslt/s7--s#r,d6sm/d,dmsss--sd,mfrfssd,
Y1:Ny Fanahy Masina\ efa tonga tokoa./Mba homba ny mpitory ny Teny mahasoa./Koa mitsangana izao ande\ha ry mahery fo/Hatraminny faranny tany torio ny Teny soa.
Y2:Vo_asaronny\ aizim-pito Ny Nosinao;/Ny ody sy ny sampy no notompoiny tao;/Ny fahazarana koa, nangeja mafy tokoa,/Kanefa tonga ny mazava: Resy ny aizina\ ao.
Y3:Ry fana\hy voatafy hery ny Tompo\ anie/Ka efa miandry\ ana_o, injay miteny hoe:/«Angony, eny antsoy, Hanatona avokoa/Ny firenena eran-tany ho mpianatro tokoa ».
Y4:Tompo ti_a ô, ekeko ny antsonao;/Hafoiko ny hareko, ny tenako izao,/Ho vavolombelona, hijoro, hanafika,/Hitory sy hamafy ko_a: Tafio ny herinao.

View file

@ -0,0 +1,9 @@
M0:|c:F|m:4/4|r:8|t:FFPM 21 Derao Andriamanitra|a:Johanesa, Ambato, 1880 eo ho eo 1914|h:P. Nilsen Lund, (?) 1842-1914
U0:zC:(22) 44yyC/(22)44yyC/(22) 44yyC/4 yy44C/(22)44yyC/444yyC/(22)44yyC/4yy44C/ (22)4(22)(22)(22)yy4/4yy44C
N1:drmmmrmfs/drmmmsfmr/drmmmrmsl/lsmdrmrd/rmffmmrrd/rmlssFFs/drmmmrmsl/lsmdrmrd/rmf-4r-slsfm/sllsfmrd
N2:#s,d-dddtdrm/dtdrddrdt/d-ddssddd/d6td/t-ds'ssSSl/tdmrrddt/d-ddssddd/d6td/tdr-4t-ddttd/rdddrdtd
N3:mfs7/mfsSllsss/mfssdrdmf/fssmlsfm/s-frddmmm/ssd'ttlls/mfssdrdmf/fssmlsfm/s-s-4s-s5/rmfslsfm
N4:#f,d-dms'f'mrd/mrdtlltds/d-dddtlsf/fmslfssd/s-ltddttl/sdlrrr,r,s/d-dddtlsf/fm,slfssd/zzzsltrs'f'ms'rs'dtlfmfssd
Y1:Derao Andri_amanitra,/Ry vazan-tany efatra,/Fa Izy no mamindra fo/Ka mety manome ny zo,/Naniraka ny Zanany,/Hanavotra ny olony/Ny sandriny tsy toha re,/Fa manan-kery lehibe./Mala_3za ny Anarany,/Fa lehibe ny asany.
Y2:Ny zavatra rehetra e,/Ny ranomasin-dehibe,/Ire_o tendrombohitra,/Ny saha feno ahitra,/Ny hazo sy ny vorona/Ny vato sy ny zavona,/Ny voninkazo manitra,/Ny endriky ny lanitra/Dia sa_3my tsy mijanona/Midera ny Mpamorona.
Y3:Ry olona navotana,/Mba mitsangàna faingana,/Ka miderà ny Tomponao,/Izay nanavotra anao,/Fa he, ny voninahiny/Manerana ny taniny./Tendre_o ny valihanao/Ka miventesa hira vao:/Ry vo_3avonjy ô, derao/Ny Ray Mpamorona anao!

View file

@ -0,0 +1,13 @@
M0:|c:Ab|m:6/4|r:7.6.7.6.8.7.8.8.|t:FFPM 297 Ry Havanay Malala|a:V. Rasamoelina|h:G.C. Stebbins 1846-1945
U0:zK:48484C8/48484K/48484C8/48484(C444)/4444444448z44444444448z4/624444624444624624Kz4/4444444448z44444444448z4/4444448484C(84)K
N1:#s,ssmfmmr/ssrmrd/dldflsm/mmrlrr-3/m-3Rmd-3d-3tdl-3/s-3dms'-3mdr-6/m-3Rmd-3d-3tdl-3/s-3dmrltsd-3
N2:#r,mmslsss/fffsfm/mfllfms/sF4s-3/s-3Fsm-3l-3Slf-3/m-3sdm'-3ddtttllFs/s-3Fsm-3l-3Slf-3/m-3msf4mfrm
N3:#s,d6t/t5d/d7/d5t-3/d4-zs4ldff-zd4/d4-zd4-zsssFfrt/d4-zs4ldff-zd4/d4-dtrrtdlSs
N4:#d,d5ss/s5d/df4dd/dr4sfmr/d4-zd4f4-zf4/d4-z#dd4-zr3#d,r3s/d4-zd4f4-zf4/s4-s5d-3
Y1:Ry havanay malala!/Manolo-tena\ izao./Fotoana mahafaly/Iraisan-tsika\ anio;/Fa_4ly zahay_4ma\n_4dray anao_4/Hia_4ra-mano\m_4po ny Ray,_7/Je_4so anie_4ha\n_4dray anao!_4/Mba_4ho sakai_zany_tokoa.
Y2:Hajao ny fanekena,/Adidinao efao./Ataovy tsy terena/Izay andraikitrao./Je_4reo Jeso_4ka_4matokia,_4/Fa_4Izy no_4hiahy\ anao._7/Ka_4mandrosoa_4sy_4mifalia,_4/Ha_4nefa\ izay anjaranao.
O1:3,4:50:Faly 'zahay_3mandray anao, faly 'zahay_3mandray anao/Faly 'zahay_3mandray anao_3Hiara-manompo ny Ray/Jeso anie_3Handray anao, Jeso anie_3handray anao/Mba ho sakai_zany tokoa.
O2:3,4:50:Jereo Jeso_3Ka matokia, Jereo Jeso_3Ka matokia/Jereo Jeso_3Ka matokia_3Fa Izy no hiahy\ anao./Ka mandrosoa_3sy mifalia, Ka mandrosoa_3sy mifalia/Hanefa\ izay _anjaranao anja
O1:3:137:tokoa
02:3:137:ranao

View file

@ -0,0 +1,9 @@
M0:|c:A|m:4/4|r:7.7.7.6.D|t:FFPM 33 - Tompo ô, Tsy Takatray|a:J. Rakotonirainy, 1926-|h:J.Rakotonirainy, 1926-
U0:z0:444444(44)/4444448/4444444/44444(4444)/444444(44)/4444448/4444444/44444G
N1:#l,mdfdmrd-/dtdrdls/dtdrmfs/mrdtls,---/mdfdmrd-/dtdrdls/dtdrmfs/fmdmrd
N2:#m,dsdsdtsT/lSlllfm/ssstddd/dtssFs---/dsdsdtsT/lSltlfm/ssstddd/ddsdts
N3:#t,smlmsfm-/d7/dtdrmlm/ssmrdr---/smlmsfm-/d7/dtdrmlm/lsmsfm
N4:#d,d4ssd-/f6d/mrmsd'lm/dt,drrsfmr/d4ssd-/f6d/mrmsd'lm/fssss,d
Y1:Tompo ô, tsy takatray/Ny hasoanny antranao;/Zava-mahagaga\ anay/Ny fiti_avanao./He, mpanota izahay/Nefa haso_avinao;/Avotraina azonay;/Misaotra no atao.
Y2:Tompo ô, Mpanjakanay/Fatratra ny herinao/Tsisy zavatra izay/Ma\hasakana Anao!/Nefa mora fo Hianao/Fa mandefitra\ aminay,/Ko_a dia misaotra\ Anao/Fa afaka izahay.
Y3:Tompo Andriamanitray,/Avy izahay izao/Raiso ny fi_ainanay;/Anao, ka anjakao./Tompo ô, tsy takatray/Ny hasoanny antranao;/Zava-mahagaga\ anay/Ny fiti_avanao.

View file

@ -0,0 +1,10 @@
M0:|c:G|m:2/4|r:P.M|t:FFPM 428 Reko izao ry Tompo|a:Rasoamahenina 1905-1986|h:Ranoason D. 1940-
U0:z0:yy4yyy(42)z11tt4(22)yy6z11 22222222 (22)22626262yy6z116262 222262 22222222 (22)y8
N1:s#s,mmdssSldfrmdd #l,sFl'smdlltdmrlr sm--dd--dfmrfm #t,sllllmmrdr smdddfmrfm s,l,tdrmsdfm-rrd
N2:#s,sdddssSldltdssdtrdtslltldtlt zzddz-ssTldlrdrdlll ddtlttds sTldtrdslsltdtlld-tt s
N3:mssmmmmfmrssmmmRfmsm mmsFFFFszzsmz-mmmdmrs ssmDDmFFFFsrsm mmdmrssmfrmfsrmrslsfm
N4:#r,dddddddfsltd-d d6 llmr4szzddzzd,d,sfslt dtllllr4stddd dsfsltdmfsltdtlfs-ssd
Y1:Reko i\zao ry Tompo izany antsonao,/Mi_antso izany mpanompo mba ho irakao!${R=}Inty, inty, inty aho Jeso/Inty, inty, iraho ho aho Jeso/Ekeko re ny\ ho miaramilanao/Ho vonona hanao ny sitrakao, ka iraho!
Y2:O di_ovy Tompo izany molotro/Ka ny fo madio hanompo no atolotro!
Y3:Tsy hande\ha irery fa hiaraka\ Aminao/Ka dia mba ome_o ny hery sy Fanahinao!
Y4:Reko i\zao ny toky hoe: «Momba a\hy Ianao »/Ry Jesosy Tompo sy Zoky, vonona aho izao!

View file

@ -0,0 +1,12 @@
M0:|c:Eb|m:3/4|r:6.6.8.6.5.5.7.6.|t:FFPM 449 'Njay reko Tompo ô|a:L. Hartsough 1828-1919 Nad. J. Andrianaivoravelona 1877-1961|h:L. Hartsough 1828-1919
U0:z8:(22) 6222 8/4 6222 8/4 6222 22$Q4/4 6222 8z4/ 6222 C/ 6222 C/6222 22$Q4/4 6222 8
N1:dmsmrdd/drflsm/sd'tlslsm/drdmrd/d'tlsl/smrdr/slmrdrm/drdmrd
N2:#t,d-mdtdd/dtrfmd/mmsfmfmd/dts,dtd/mmfmf/mdtdt/dddtdtd/dtsdtd
N3:#rmsdsssm/msldds/sssdddds/msmsfm/ssddd/dssms/mfssmss/msmsfm
N4:#s,d-d5/dssddd/d8/ds4d/d5/ddsss/d7/ds4d
Y1:Njay reko Tompo ô!/Njay re ny fe_onao/Mi_antso ahy Hi_anao/hankany Kalvary;${R=}Tompo lehibe!/Raiso aho e;/Mba sasao ny ranao soa/Izay tao Kalvary.
Y2:Malemy aho e,/Ka mitaraina hoe:/Vonjeo ny aiko Tompo ô!/Vonjeo ny olonao:/Tompo lehibe!
Y3:Ny fi_adanam-po/Mandresy ny manjo;/Esorinao ny tahotro,/Ry Tompo ô vonjeo:
Y4:Mpanota tsy mandà,/Ry Tompo! mamelà;/Ny fahotako lehibe/Ifonako tokoa:
Y5:Ny foko tsy madio/Mba diovinao, anio;/Maloto aho, Tompo ô!/Sasao ho voadio:
Y6:Ny foko no sasao,/Ka diovinao izao;/Ny fahotako marobe/Levony avokoa:

View file

@ -0,0 +1,10 @@
M0:|c:Ab|m:4/4|r:P.M|t:FFPM 489 Tena sambatra sy maha-te-ho tia|a:J. Rakotonirainy 1926-|h:Charles H. Gabriel 1856-1932
U0:z0:222244 222244/ 2222442222(44)/222244222244/22224422228/2222y22 222244/222222(22)2222224/2222y2222224$Q4/22224422228
N1:#s,ssdrmmmfrmds/drmfs'mfmrdr-/ssdrmmmfrmds/ltdfmdtdrmd/s'----fmrdrmdls/sttrrff-/sddmm#t,ss/s----fmrdrmssf/dtdfmdtdrmd
N2:#r,mmmfssslfsmm/sfs7Fsf/mmmfssslfsmm/fslls7/d----ssfmfsmfm/rssttttsmssdddd/d----ssfmfsTTl/lSlls7
N3:#t,d8ttdd.dtdrmdrdrrt-/d8ttdd/d5mrmfsm/mfsf(mr)(d-)d6/trrffrrtdmmssmm/mfsf(mr)d8/d5mrmfsm
N4:#d,d6s4d2/#m,msd6tls-/#d,d6s4dd/f4s6d/#ddrmrd-(d-)#d,d6/s7-#m,d7/drm'rd-dd#d,dddmff/f4s6d
Y1:Tena sambatra sy maha-te ho ti_a/I\zany masina, madio fisainana/Fa mi_ara-dalana, mifankati_a/AminAndriamanitra Fi_ainana.${R=}Ma_5sina toko_a re ny Tompo./Tianay mba ho masina/Saina tena sy fana\hy/Ka_5fi_ainan-danitra toko_a/No santarinizay mino sy manoa.
Y2:Indro, mampahery, mahatoky ko_a/Ra\ha mahitsy ny fijery, soa ny fo;/Fa ny fo madio sy masina toko_a:/Paradisa\ an-tany, feno zava-tsoa.
Y3:Ko_a halaviro ny fitaoman-dratsy,/Ny fisaikazana tsy mba masina;/Fa ny tia ny Tompo, dia\ olon-tsoa mitafy/Fahadiovanny Fanahy Masina.
Y4:Mi_araha lalana\ amini Jesosy/Fa ny fahavalo ta-hamotraka;/Mijoroa, reseo ny toetra mampihosi\na/Ao anaty loto sy ny fotaka.

View file

@ -1,33 +0,0 @@
package mg.dot.feufaro
object CommonTools {
//companion object {
fun tonalityToNumber(tonality: String) : Int {
val result: Map<String, Int> = mapOf(
"C" to 1,
"C#" to 2, "Db" to 2,
"D" to 3,
"D#" to 4, "Eb" to 4,
"E" to 5,
"F" to 6,
"F#" to 7, "Gb" to 7,
"G" to 8,
"G#" to 9, "Ab" to 9,
"A" to 10,
"A#" to 11, "Bb" to 11,
"B" to 12
)
if (result.containsKey(tonality)) {
return result[tonality]!!
}
return -1
}
fun numberToTonality(number: Int): String {
val result: Array<String> = arrayOf("", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B")
return if (number in 1..12) {
result[number]
} else {
""
}
}
}

View file

@ -111,6 +111,7 @@ object ScreenSolfa : Screen {
)
Text(text = measureString)
Text(text = "Stanza: $stanza")
ScreenTranspose.Content()
}
LazyVerticalGridTUO(
gridTUOData,
@ -123,8 +124,8 @@ object ScreenSolfa : Screen {
solfaScreenModel.loadNextInPlaylist()
}, modifier = Modifier.height(40.dp)) {
val debugData: String by sharedScreenModel.data.collectAsState()
Text(debugData)
val nextLabel: String by sharedScreenModel.nextLabel.collectAsState()
Text(nextLabel)
}
FlowRow(
modifier = Modifier.fillMaxWidth()

View file

@ -0,0 +1,64 @@
package mg.dot.feufaro
import SharedScreenModel
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import cafe.adriel.voyager.core.screen.Screen
import java.io.ObjectStreamException
import androidx.compose.foundation.layout.FlowRow
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.material3.Text
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import cafe.adriel.voyager.koin.koinScreenModel
import mg.dot.feufaro.solfa.Transpose
import androidx.compose.ui.Alignment
import mg.dot.feufaro.solfa.TimeUnitObject
object ScreenTranspose : Screen {
@Composable
override fun Content() {
FlowRow(
modifier = Modifier.fillMaxWidth()
.windowInsetsPadding(WindowInsets.safeDrawing)
.padding(start = 8.dp, end = 8.dp, top = 8.dp),
horizontalArrangement = Arrangement.spacedBy(16.dp),
verticalArrangement = Arrangement.spacedBy(4.dp)
) {
val sharedScreenModel = koinScreenModel<SharedScreenModel>()
val originalKey by sharedScreenModel.songKey.collectAsState()
val transposeTo by sharedScreenModel.transposeTo.collectAsState()
val transposeAsIf by sharedScreenModel.transposeAsIf.collectAsState()
Box(modifier = Modifier.fillMaxHeight().align(Alignment.CenterVertically)) {
Text("Original Key: $originalKey")
}
Box(modifier = Modifier.fillMaxHeight().align(Alignment.CenterVertically)) {
Text("Transpose to key: $transposeTo")
}
Transpose.chooseKey { it ->
sharedScreenModel.setTransposeTo(it)
TimeUnitObject.changeTransposeTo(it)
}
Box(modifier = Modifier.fillMaxHeight().align(Alignment.CenterVertically)) {
Text("Transpose as if key was : $transposeAsIf")
}
Transpose.chooseKey { it ->
sharedScreenModel.setTransposeAsIf(it)
TimeUnitObject.changeTransposeAsIf(it)
}
}
}
@Throws(ObjectStreamException::class) // C'est une méthode de sérialisation Java, donc l'exception est nécessaire
private fun readResolve(): Any {
return this // Toujours retourner l'instance unique de ce singleton
}
}

View file

@ -6,6 +6,7 @@ import mg.dot.feufaro.FileRepository
import mg.dot.feufaro.DisplayConfigManager // Importez DisplayConfigManager
import mg.dot.feufaro.musicXML.MusicXML
import mg.dot.feufaro.solfa.Solfa
import mg.dot.feufaro.solfa.TimeUnitObject
import mg.dot.feufaro.viewmodel.SolfaScreenModel
import org.koin.dsl.module
import org.koin.core.module.dsl.singleOf

View file

@ -6,7 +6,6 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import mg.dot.feufaro.FileRepository
import mg.dot.feufaro.CommonTools
class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository: FileRepository) {
private val T: MutableList<PTemplate> = mutableListOf()
@ -388,32 +387,7 @@ class Solfa(val sharedScreenModel: SharedScreenModel, private val fileRepository
val tonality = line.uppercaseFirstMeta()
meta["C"] = tonality
sharedScreenModel.setSongKey(tonality)
val keyOrigin = CommonTools.tonalityToNumber(tonality)
val transposeTo = getOpt("transposeto")
val transposeAsIf = getOpt("transposeasif")
val keyDest = if (transposeTo != "") {
CommonTools.tonalityToNumber(transposeTo)
} else {
keyOrigin
}
val keyAsIf = if (transposeAsIf != "") {
if (transposeAsIf.toIntOrNull() != null) {
keyOrigin + transposeAsIf.toInt()
} else {
CommonTools.tonalityToNumber(transposeAsIf)
}
} else {
keyOrigin
}
if (!meta.containsKey("transposeValue")) {
meta["transposeValue"] = (keyDest - keyAsIf).toString()
}
if (keyAsIf != keyOrigin) {
meta["C"] = CommonTools.numberToTonality(keyAsIf)
}
if (keyDest != keyOrigin) {
meta["C"] += " (" + CommonTools.numberToTonality(keyDest) + ")"
}
sharedScreenModel.setTransposeAsIf(tonality)
}
}

View file

@ -42,6 +42,7 @@ import androidx.compose.ui.text.style.BaselineShift
import androidx.compose.ui.text.withStyle
val FEUFAROO_TRIOLET_COLOR = Color.DarkGray
val FEUFAROO_KEY_CHANGE_COLOR = Color.Blue
class TimeUnitObject (val pTemplate: PTemplate, val prevTUO: TimeUnitObject?) {
var mutableNoteVersion: Int by mutableStateOf(0)
private var lyrics: MutableList<POneStanzaLyrics> = mutableListOf()
@ -71,6 +72,14 @@ class TimeUnitObject (val pTemplate: PTemplate, val prevTUO: TimeUnitObject?) {
lastHairPinStart = -1
lastHairPinSymbol = null
}
var transposeAsIf: String = ""
var transposeTo: String = ""
fun changeTransposeAsIf(asIf: String) {
transposeAsIf = asIf
}
fun changeTransposeTo(to: String) {
transposeTo = to
}
}
init {
nbBlock++
@ -164,7 +173,9 @@ class TimeUnitObject (val pTemplate: PTemplate, val prevTUO: TimeUnitObject?) {
} else {
transposeOldKey = prevTUO?.transposeOldKey ?: "Bb"
"" }
if (pTemplate.template == "z") {
return "$separatorBefore\n$separatorBefore\n$separatorBefore\n$separatorBefore"
}
val retour = tuNotes.drop(1).joinToString (separator = "\n"){
separatorBefore + markersBefore + it.toString(transposeFrom, transposeTo).replace(Regex("[\\(\\)\\[\\]]"), "")
}
@ -365,7 +376,7 @@ fun TimeUnitComposable(
fontSize = 10.sp,
baselineShift = BaselineShift.Superscript,
//fontStyle = FontStyle.Italic,
color = Color.Blue
color = FEUFAROO_KEY_CHANGE_COLOR
)) {
append(text+" ")
}

View file

@ -1,5 +1,23 @@
package mg.dot.feufaro.solfa
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.runtime.mutableStateOf
import androidx.compose.material3.ExperimentalMaterial3Api // Nécessaire pour ExposedDropdownMenuBox
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowDropDown
import androidx.compose.material3.DropdownMenu
import androidx.compose.runtime.getValue
import androidx.compose.runtime.setValue
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.IconButton
import androidx.compose.ui.unit.dp
class Transpose {
companion object {
val noteToNumber = listOf("d", "di", "r", "ri", "m", "f", "fi", "s", "si", "l", "ta", "t")
@ -38,5 +56,37 @@ class Transpose {
.replace(",", "")
.replace("'", "¹") + regexFound.groupValues[3]
}
@OptIn(ExperimentalMaterial3Api::class) // Ajoutez cette annotation pour utiliser ExposedDropdownMenuBox
@Composable
fun chooseKey(
modifier: Modifier = Modifier,
label: String = "Choose a key",
menuItemData: List<String> = keyToNumber,
onOptionSelected: (String) -> Unit
) {
var expanded by remember { mutableStateOf(false) }
Box(
modifier = modifier
.padding(0.dp)
) {
IconButton(onClick = {expanded = !expanded}) {
Icon(Icons.Default.ArrowDropDown, contentDescription = label)
}
DropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false}
) {
menuItemData.forEach { option ->
DropdownMenuItem(
text = { Text(option)},
onClick = {
onOptionSelected(option)
expanded = false
}
)
}
}
}
}
}
}

View file

@ -6,8 +6,8 @@ import kotlinx.coroutines.flow.asStateFlow
import mg.dot.feufaro.solfa.TimeUnitObject
class SharedScreenModel() : ScreenModel {
private val _data = MutableStateFlow<String>("Next ...")
val data: StateFlow<String> = _data.asStateFlow()
private val _nextLabel = MutableStateFlow<String>("Next ...")
val nextLabel: StateFlow<String> = _nextLabel.asStateFlow()
private val _measure = MutableStateFlow<String>("")
val measure: StateFlow<String> = _measure.asStateFlow()
private val _songTitle = MutableStateFlow<String>("")
@ -16,6 +16,10 @@ class SharedScreenModel() : ScreenModel {
val stanza: StateFlow<Int> = _stanza.asStateFlow()
private val _songKey = MutableStateFlow<String>("")
val songKey: StateFlow<String> = _songKey.asStateFlow()
private val _transposeTo = MutableStateFlow("")
val transposeTo: StateFlow<String> = _transposeTo.asStateFlow()
private val _transposeAsIf = MutableStateFlow("")
val transposeAsIf: StateFlow<String> = _transposeAsIf.asStateFlow()
private val _songAuthor = MutableStateFlow<String>("")
val songAuthor: StateFlow<String> = _songAuthor.asStateFlow()
private val _songComposer = MutableStateFlow<String>("")
@ -37,7 +41,7 @@ class SharedScreenModel() : ScreenModel {
val hasMarker: StateFlow<Boolean> = _hasMarker.asStateFlow()
fun appendData(otherData: String) {
_data.value += otherData
_nextLabel.value += otherData
}
fun reset() {
tempTimeUnitObjectList.clear()
@ -67,6 +71,12 @@ class SharedScreenModel() : ScreenModel {
fun setSongKey(theSongKey: String) {
_songKey.value = theSongKey
}
fun setTransposeTo(key: String) {
_transposeTo.value = key
}
fun setTransposeAsIf(key: String) {
_transposeAsIf.value = key
}
fun setSongAuthor(theSongAuthor: String) {
_songAuthor.value = theSongAuthor
}

View file

@ -24,6 +24,7 @@ material3 = "1.3.2"
voyager = "1.1.0-beta03"
[libraries]
androidx-material-icons-extended = { module = "androidx.compose.material:material-icons-extended" }
cafe-voyager-koin = { module = "cafe.adriel.voyager:voyager-koin" }
koin-compose-viewmodel = { module = "io.insert-koin:koin-compose-viewmodel", version.ref = "koin" }
koin-compose-viewmodel-navigation = { module = "io.insert-koin:koin-compose-viewmodel-navigation", version.ref = "koin" }