Fix tempoInFactor to tempoInBpm

This commit is contained in:
hasinarak3@gmail.com 2026-03-10 09:33:21 +03:00
parent fa603dc71e
commit c53e46b4b4
3 changed files with 22 additions and 32 deletions

View file

@ -19,15 +19,10 @@ expect class FMediaPlayer(filename: String, onFinished: () -> Unit) {
fun setPointA() fun setPointA()
fun setPointB() fun setPointB()
fun clearLoop() fun clearLoop()
fun setTempo(factor: Float) fun setTempo(bpm: Float)
fun getCurrentBPM(): Float fun getCurrentBPM(): Float
fun updateVoiceVolume(voiceIndex: Int, newVolume: Float) fun updateVoiceVolume(voiceIndex: Int, newVolume: Float)
fun requestSync(sharedScreenModel: SharedScreenModel) fun requestSync(sharedScreenModel: SharedScreenModel)
fun syncNavigationMonitor(sharedScreenModel: SharedScreenModel) fun syncNavigationMonitor(sharedScreenModel: SharedScreenModel)
fun release() fun release()
} }
/*
expect fun MidiPlayer(filename: String, onFinished: () -> Unit)
expect fun StopMidi()*/

View file

@ -70,9 +70,8 @@ fun MidiControlPanel(
val labels = listOf("S", "A", "T", "B") val labels = listOf("S", "A", "T", "B")
listOf("Soprano", "Alto", "Ténor", "Basse") listOf("Soprano", "Alto", "Ténor", "Basse")
var tempo by remember { mutableStateOf(1.0f) } var tempo by remember { mutableStateOf(120.toFloat()) }
var currentBpm by remember { mutableStateOf(mediaPlayer.getCurrentBPM()) } var currentBpm by remember { mutableStateOf(mediaPlayer.getCurrentBPM()) }
val basseBpm = 120f
var isPianoSelected by remember { mutableStateOf(true) } var isPianoSelected by remember { mutableStateOf(true) }
@ -101,23 +100,16 @@ fun MidiControlPanel(
LaunchedEffect(tempo) { LaunchedEffect(tempo) {
currentBpm = mediaPlayer.getCurrentBPM() currentBpm = mediaPlayer.getCurrentBPM()
} }
fun updateTempoToBpm(newBpm: Int) {
tempo = newBpm.toFloat()
mediaPlayer?.setTempo(tempo)
}
fun updateTempoByBpmStep(step: Int) { fun updateTempoByBpmStep(step: Int) {
val currentBpm = (basseBpm * tempo).toInt() val currentBpm = mediaPlayer!!.getCurrentBPM()
val newBpm = (currentBpm + step).coerceIn((basseBpm * 0.25f).toInt(), (basseBpm * 1.5f).toInt()) val nextBpm = currentBpm.toInt() + step
val newFactor = newBpm.toFloat() / basseBpm updateTempoToBpm(nextBpm)
tempo = newFactor
mediaPlayer?.setTempo(newFactor)
} }
fun updateTempoToBpm(targetBpm: Int) {
val clampedBpm = targetBpm.coerceIn((basseBpm * 0.25f).toInt(), (basseBpm * 1.5f).toInt())
val newFactor = clampedBpm.toFloat() / basseBpm
tempo = newFactor
mediaPlayer?.setTempo(newFactor)
// println("tempo : $tempo")
}
Column( Column(
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
@ -252,7 +244,7 @@ fun MidiControlPanel(
.padding(vertical = 6.dp), .padding(vertical = 6.dp),
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
if (tempo >= 0.3) { // limite 40BPM if (tempo >= 40.0) { // limite 40BPM
IconButton( IconButton(
modifier = Modifier.background(Color(0XFF2C3130)), modifier = Modifier.background(Color(0XFF2C3130)),
onClick = { updateTempoByBpmStep(-10) }) { onClick = { updateTempoByBpmStep(-10) }) {
@ -265,7 +257,7 @@ fun MidiControlPanel(
} }
} }
val currentBpmInt = (basseBpm * tempo).toInt() val currentBpmInt = (tempo).toInt()
Row( Row(
modifier = Modifier.padding(horizontal = 2.dp), modifier = Modifier.padding(horizontal = 2.dp),
@ -300,7 +292,7 @@ fun MidiControlPanel(
} }
} }
if (tempo <= 1.3) { // limite 156BPM if (tempo <= 160) { // limite 160BPM
IconButton( IconButton(
modifier = Modifier.background(Color(0XFF2C3130)), modifier = Modifier.background(Color(0XFF2C3130)),
onClick = { updateTempoByBpmStep(10) }) { onClick = { updateTempoByBpmStep(10) }) {

View file

@ -39,6 +39,7 @@ actual class FMediaPlayer actual constructor(
private var currentGlobalVolume: Float = 0.8f private var currentGlobalVolume: Float = 0.8f
private var currentTempo: Float = 1.0f private var currentTempo: Float = 1.0f
private var targetBpm: Float = 120f
private val playerScope = CoroutineScope(Dispatchers.Default + SupervisorJob()) private val playerScope = CoroutineScope(Dispatchers.Default + SupervisorJob())
private var abJob: Job? = null private var abJob: Job? = null
@ -393,14 +394,16 @@ actual class FMediaPlayer actual constructor(
} }
} }
actual fun getCurrentBPM(): Float { actual fun getCurrentBPM(): Float {
val currentFactor = sequencer?.tempoFactor ?: 1.0f return targetBpm
val currentBPM = (120f * currentFactor)
return currentBPM
} }
actual fun setTempo(factor: Float){ actual fun setTempo(bpm: Float){
currentTempo = factor this.targetBpm = bpm
sequencer?.tempoFactor = factor sequencer?.tempoInBPM = bpm
boundModel?.let { modele ->
prepareNavigation(modele)
}
println("Tempo réglé à : $bpm BPM")
} }
fun getTempo(): Float = currentTempo fun getTempo(): Float = currentTempo
private val MS8PER_NOTE = 500L private val MS8PER_NOTE = 500L