diff --git a/src/jsMain/kotlin/nl/astraeus/vst/ADSR.kt b/src/jsMain/kotlin/nl/astraeus/vst/ADSR.kt new file mode 100644 index 0000000..ed6bd25 --- /dev/null +++ b/src/jsMain/kotlin/nl/astraeus/vst/ADSR.kt @@ -0,0 +1,43 @@ +package nl.astraeus.vst + +object ADSR { + + fun calculate( + attack: Double, + decay: Double, + sustain: Double, + release: Double, + startTime: Double, + time: Double, + releaseTime: Double? = null + ): Double { + val attackTime = startTime + attack + val decayTime = attackTime + decay + + return when { + time < startTime -> { + 0.0 + } + + time < attackTime -> { + (time - startTime) / attack + } + + time < decayTime -> { + sustain + ((1 - (((time - attackTime) / decay))) * (1 - sustain)) + } + + releaseTime == null -> { + sustain + } + + time < releaseTime + release -> { + (1 - ((time - releaseTime) / release)) * sustain + } + + else -> { + 0.0 + } + } + } +} \ No newline at end of file diff --git a/src/jsMain/kotlin/nl/astraeus/vst/Externals.kt b/src/jsMain/kotlin/nl/astraeus/vst/Externals.kt index ccbe28c..e6f01af 100644 --- a/src/jsMain/kotlin/nl/astraeus/vst/Externals.kt +++ b/src/jsMain/kotlin/nl/astraeus/vst/Externals.kt @@ -40,4 +40,4 @@ abstract external class AudioWorkletProcessor { external fun registerProcessor(name: String, processorCtor: JsClass<*>) external val sampleRate: Int -external val currentTime: Double +external val currentTime: Double \ No newline at end of file