diff --git a/audio-worklet/build.gradle.kts b/audio-worklet/build.gradle.kts index 132f5a1..6eb7ea2 100644 --- a/audio-worklet/build.gradle.kts +++ b/audio-worklet/build.gradle.kts @@ -1,3 +1,7 @@ +@file:OptIn(ExperimentalKotlinGradlePluginApi::class, ExperimentalDistributionDsl::class) + +import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi +import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalDistributionDsl import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackOutput buildscript { diff --git a/src/commonMain/kotlin/nl/astraeus/vst/chip/PatchDTO.kt b/src/commonMain/kotlin/nl/astraeus/vst/chip/PatchDTO.kt index ce193b1..408fc1e 100644 --- a/src/commonMain/kotlin/nl/astraeus/vst/chip/PatchDTO.kt +++ b/src/commonMain/kotlin/nl/astraeus/vst/chip/PatchDTO.kt @@ -7,6 +7,8 @@ data class PatchDTO( val waveform: Int = 0, @JsName("midiId") val midiId: String = "", + @JsName("midiName") + val midiName: String = "", @JsName("midiChannel") var midiChannel: Int = 0, @JsName("volume") diff --git a/src/jsMain/kotlin/nl/astraeus/vst/chip/midi/Midi.kt b/src/jsMain/kotlin/nl/astraeus/vst/chip/midi/Midi.kt index 46708ce..1d969ef 100644 --- a/src/jsMain/kotlin/nl/astraeus/vst/chip/midi/Midi.kt +++ b/src/jsMain/kotlin/nl/astraeus/vst/chip/midi/Midi.kt @@ -74,11 +74,37 @@ object Midi { ) } - fun setInput(id: String) { - val selected = inputs.find { it.id == id } - if (selected != null) { - setInput(selected) + fun setInput(id: String, name: String = "") { + var selected = inputs.find { it.id == id } + if (selected == null) { + var maxMatchChar = 0 + inputs.forEach { + val matchChars = matchChars(it.name, name) + if (matchChars > maxMatchChar) { + selected = it + maxMatchChar = matchChars + } + } } + setInput(selected) + } + + private fun matchChars(str1: String, str2: String): Int { + var result = 0 + if (str1.length > str2.length) { + for (ch in str1.toCharArray()) { + if (str2.contains(ch)) { + result++ + } + } + } else { + for (ch in str2.toCharArray()) { + if (str1.contains(ch)) { + result++ + } + } + } + return result } fun setInput(input: MIDIInput?) { diff --git a/src/jsMain/kotlin/nl/astraeus/vst/chip/view/MainView.kt b/src/jsMain/kotlin/nl/astraeus/vst/chip/view/MainView.kt index fc39481..e358a8c 100644 --- a/src/jsMain/kotlin/nl/astraeus/vst/chip/view/MainView.kt +++ b/src/jsMain/kotlin/nl/astraeus/vst/chip/view/MainView.kt @@ -175,7 +175,10 @@ object MainView : Komponent(), CssName { span(ButtonBarCss.name) { +"SAVE" onClickFunction = { - val patch = VstChipWorklet.save().copy(midiId = Midi.currentInput?.id ?: "") + val patch = VstChipWorklet.save().copy( + midiId = Midi.currentInput?.id ?: "", + midiName = Midi.currentInput?.name ?: "" + ) WebsocketClient.send("SAVE\n${JSON.stringify(patch)}") } diff --git a/src/jsMain/kotlin/nl/astraeus/vst/chip/ws/WebsocketClient.kt b/src/jsMain/kotlin/nl/astraeus/vst/chip/ws/WebsocketClient.kt index 2156dbd..b58b43b 100644 --- a/src/jsMain/kotlin/nl/astraeus/vst/chip/ws/WebsocketClient.kt +++ b/src/jsMain/kotlin/nl/astraeus/vst/chip/ws/WebsocketClient.kt @@ -86,7 +86,7 @@ object WebsocketClient { val patchJson = data.substring(5) val patch = JSON.parse(patchJson) - Midi.setInput(patch.midiId) + Midi.setInput(patch.midiId, patch.midiName) VstChipWorklet.load(patch) MainView.requestUpdate() }