Skip to content

EffectiveParameter.kt

src/jvmMain/kotlin/afield/ui/controls/EffectiveParameter.kt · 67 lines

@file:afield.runtime.completion.CompletionCategory("Workspace")

package afield.ui.controls

A bounded scalar parameter that keeps the value it was asked for apart from the value it uses.

EffectiveParameter stores the requested value as written and reports EffectiveParameter.effective as that value coerced into minimum..maximum, with EffectiveParameter.clamped saying whether the two differ. EffectiveParameter.snapshot reads both at once into a ParameterValue. Nothing in src/jvmMain constructs one yet; EffectiveParameterTest covers the behaviour.

import afield.data.collections.get
import afield.data.collections.invoke
import afield.data.collections.times
import afield.document.graph.minusAssign
import afield.document.graph.named
import afield.document.graph.plusAssign
import afield.document.properties.compareTo
import afield.document.workspace.file
import afield.graphics.render.rangeTo
import afield.math.autodiff.compareTo
import afield.math.autodiff.div
import afield.math.autodiff.minus
import afield.math.autodiff.plus
import afield.math.autodiff.times
import afield.math.linalg.invoke
import afield.math.linalg.remAssign
import afield.math.linalg.set
import afield.math.linalg.times
import afield.math.units.div
import afield.math.units.minus
import afield.math.units.plus
import afield.math.units.times

import afield.audio.synth.*

class EffectiveParameter

A named finite scalar with explicit requested/effective values and units.

class EffectiveParameter(
    val name: String,
    initial: Double,
    val minimum: Double,
    val maximum: Double,
    val units: String = "",
    val description: String = ""
) {

init

    init {
        require(name.isNotBlank())
        require(minimum.isFinite() && maximum.isFinite() && minimum <= maximum)
        require(initial.isFinite())
    }

@Volatile var requested: Double

    @Volatile var requested: Double = initial
        set(value) { require(value.isFinite()); field = value }

val effective: Double get() = requested.coerceIn(minimum, maximum)

val clamped: Boolean get() = requested !in minimum..maximum

fun snapshot(): ParameterValue

    fun snapshot(): ParameterValue {
        val value = requested
        return ParameterValue(name, value, value.coerceIn(minimum, maximum), minimum, maximum, units, description)
    }
}

data class ParameterValue

data class ParameterValue(
    val name: String, val requested: Double, val effective: Double,
    val minimum: Double, val maximum: Double, val units: String, val description: String
)