diff --git a/engine/instrument.py b/engine/instrument.py index f0ab3fc..aafebef 100644 --- a/engine/instrument.py +++ b/engine/instrument.py @@ -122,7 +122,9 @@ class Instrument(object): self.currentKeySwitch:int = None # Midi pitch. Default is set on load. self.playableKeys:tuple = None #sorted tuple of ints. set by _parseKeys through chooseVariant. Set of int pitches. Used for export. - self.keyLabels = {60:"Middle C", 53:"𝄢", 67:"𝄞"} + self.controlLabels = {} #CC int:str opcode label_cc# in + self.keyLabels = {} #Pitch int:str opcode label_key# in + def exportStatus(self)->dict: """The call-often function to get the instrument status. Includes only data that can @@ -143,6 +145,7 @@ class Instrument(object): result["currentKeySwitch"] = self.currentKeySwitch result["playableKeys"] = self.playableKeys result["keyLabels"] = self.keyLabels + result["controlLabels"] = self.controlLabels #CCs return result def exportMetadata(self)->dict: @@ -304,6 +307,7 @@ class Instrument(object): return def findKS(data, writeInResult, writeInOthers): + if "sw_label" in data: label = data["sw_label"] #remove leading int or key from label @@ -333,6 +337,7 @@ class Instrument(object): def findPlayableKeys(data:dict, writeInResult:set): """Playable keys can be on any level. Mostly groups and regions though.""" + if "key" in data: notePitch:int = midiName2midiPitch[data["key"]] writeInResult.add(notePitch) @@ -357,7 +362,6 @@ class Instrument(object): hierarchy = self.program.get_hierarchy() #starts with global and dicts down with get_children(). First single entry layer is get_global() allKeys = set() - for k,v in hierarchy.items(): #Global globalData = k.as_dict() swlokeyValue = globalData["sw_lokey"] if "sw_lokey" in globalData else "" @@ -379,6 +383,13 @@ class Instrument(object): findKS(k3AsDict, result, others) self.playableKeys = tuple(sorted(allKeys)) + self.controlLabels = self.program.get_control_labels() #opcode label_cc# in + self.keyLabels = self.program.get_key_labels() #opcode label_cc# in + #Add some defaults. + for k,v in {60:"Middle C", 53:"𝄢", 67:"𝄞"}.items(): + if not k in self.keyLabels: + self.keyLabels[k] = v + logger.info(f"Finished parsing possible keyswitches in the current variant/cbox-program for {self.name} {self.currentVariant}. Found: {len(result)} keyswitches.") if not result: return None diff --git a/engine/resources/000 - Default.tembro b/engine/resources/000 - Default.tembro index 8468693..1a37b1e 100644 Binary files a/engine/resources/000 - Default.tembro and b/engine/resources/000 - Default.tembro differ diff --git a/template/calfbox/sampler_layer.c b/template/calfbox/sampler_layer.c index 4386738..bea11ec 100644 --- a/template/calfbox/sampler_layer.c +++ b/template/calfbox/sampler_layer.c @@ -482,8 +482,7 @@ struct sampler_layer_param_entry sampler_layer_params[] = { FIELD_NONFUNCTIONAL("master_label") //ARIA FIELD_NONFUNCTIONAL("global_label") //ARIA FIELD_NONFUNCTIONAL("sw_label") //Keyswitch. ARIA - FIELD_NONFUNCTIONAL("label_cc#") //ARIA - FIELD_NONFUNCTIONAL("label_key#") //sfizz opcode + //label_cc and label_key are in sfzloader.c because they are under { "genericmod_#_#_#_#", -1, slpt_generic_modulation, 0, 0, NULL, NULL, NULL }, }; @@ -2105,4 +2104,3 @@ void sampler_layer_update(struct sampler_layer *l) cbox_rt_execute_cmd_async(l->module->module.rt, &rtcmd, lcmd); } -