From 43707e5fd6756f07369306b57449e144d9e1c226 Mon Sep 17 00:00:00 2001 From: "5684185+vsariola@users.noreply.github.com" <5684185+vsariola@users.noreply.github.com> Date: Thu, 19 Oct 2023 13:07:24 +0300 Subject: [PATCH] style(vm): group public/private member types; delete unused types --- vm/featureset.go | 131 ++++++++++++++++++++++------------------------- 1 file changed, 61 insertions(+), 70 deletions(-) diff --git a/vm/featureset.go b/vm/featureset.go index e929980..5e997c1 100644 --- a/vm/featureset.go +++ b/vm/featureset.go @@ -6,41 +6,75 @@ import ( "github.com/vsariola/sointu" ) -// FeatureSet defines what opcodes / parameters are included in the compiled virtual machine -// It is used by the compiler to decide how to encode opcodes -type FeatureSet interface { - Opcode(unitType string) (int, bool) - TransformCount(unitType string) int - Instructions() []string - InputNumber(unitType string, paramName string) int - SupportsParamValue(unitType string, paramName string, value int) bool - SupportsParamValueOtherThan(unitType string, paramName string, value int) bool - SupportsModulation(unitType string, paramName string) bool - SupportsPolyphony() bool - SupportsGlobalSend() bool -} +type ( + // FeatureSet defines what opcodes / parameters are included in the compiled virtual machine + // It is used by the compiler to decide how to encode opcodes + FeatureSet interface { + Opcode(unitType string) (int, bool) + TransformCount(unitType string) int + Instructions() []string + InputNumber(unitType string, paramName string) int + SupportsParamValue(unitType string, paramName string, value int) bool + SupportsParamValueOtherThan(unitType string, paramName string, value int) bool + SupportsModulation(unitType string, paramName string) bool + SupportsPolyphony() bool + SupportsGlobalSend() bool + } -type Instruction struct { - Name string - TransformCount int -} + // AllFeatures is used by the library compilation / bridging to configure a virtual machine + // that supports every conceivable parameter, so it needs no members and just returns "true" to all + // queries about what it supports. Contrast this NecessaryFeatures that only returns true if the patch + // needs support for that feature + AllFeatures struct { + } + + // NecessaryFeatures returns true only if the patch actually needs the support for the feature + NecessaryFeatures struct { + opcodes map[string]int + instructions []string + supportsParamValue map[paramKey](map[int]bool) + supportsModulation map[paramKey]bool + globalSend bool + polyphony bool + } +) type paramKey struct { Unit string Param string } -type paramValueKey struct { - Unit string - Param string - Value int -} +var allOpcodes map[string]int +var allInstructions []string +var allInputs map[paramKey]int +var allTransformCounts map[string]int -// AllFeatures is used by the library compilation / bridging to configure a virtual machine -// that supports every conceivable parameter, so it needs no members and just returns "true" to all -// queries about what it supports. Contrast this NecessaryFeatures that only returns true if the patch -// needs support for that feature -type AllFeatures struct { +func init() { + allInstructions = make([]string, len(sointu.UnitTypes)) + allOpcodes = map[string]int{} + allTransformCounts = map[string]int{} + allInputs = map[paramKey]int{} + i := 0 + for k, v := range sointu.UnitTypes { + inputCount := 0 + transformCount := 0 + for _, t := range v { + if t.CanModulate { + allInputs[paramKey{k, t.Name}] = inputCount + inputCount++ + } + if t.CanModulate && t.CanSet { + transformCount++ + } + } + allInstructions[i] = k // Opcode 0 is reserved for instrument advance, so opcodes start from 1 + allTransformCounts[k] = transformCount + i++ + } + sort.Strings(allInstructions) // sort the opcodes to have predictable ordering, as maps don't guarantee the order the items + for i, instruction := range allInstructions { + allOpcodes[instruction] = (i + 1) * 2 // make a map to find out the opcode number based on the type + } } func (_ AllFeatures) SupportsParamValue(unit string, paramName string, value int) bool { @@ -80,49 +114,6 @@ func (_ AllFeatures) InputNumber(unitType string, paramName string) int { return allInputs[paramKey{unitType, paramName}] } -var allOpcodes map[string]int -var allInstructions []string -var allInputs map[paramKey]int -var allTransformCounts map[string]int - -func init() { - allInstructions = make([]string, len(sointu.UnitTypes)) - allOpcodes = map[string]int{} - allTransformCounts = map[string]int{} - allInputs = map[paramKey]int{} - i := 0 - for k, v := range sointu.UnitTypes { - inputCount := 0 - transformCount := 0 - for _, t := range v { - if t.CanModulate { - allInputs[paramKey{k, t.Name}] = inputCount - inputCount++ - } - if t.CanModulate && t.CanSet { - transformCount++ - } - } - allInstructions[i] = k // Opcode 0 is reserved for instrument advance, so opcodes start from 1 - allTransformCounts[k] = transformCount - i++ - } - sort.Strings(allInstructions) // sort the opcodes to have predictable ordering, as maps don't guarantee the order the items - for i, instruction := range allInstructions { - allOpcodes[instruction] = (i + 1) * 2 // make a map to find out the opcode number based on the type - } -} - -// NecessaryFeatures returns true only if the patch actually needs the support for the feature -type NecessaryFeatures struct { - opcodes map[string]int - instructions []string - supportsParamValue map[paramKey](map[int]bool) - supportsModulation map[paramKey]bool - globalSend bool - polyphony bool -} - func NecessaryFeaturesFor(patch sointu.Patch) NecessaryFeatures { features := NecessaryFeatures{opcodes: map[string]int{}, supportsParamValue: map[paramKey](map[int]bool){}, supportsModulation: map[paramKey]bool{}} for instrIndex, instrument := range patch {