From 28c9320ae5a4ad402932ba6e9003ffcac283c77a Mon Sep 17 00:00:00 2001 From: Nils <> Date: Tue, 3 Aug 2021 22:57:50 +0200 Subject: [PATCH] trying to find the default path in tars --- engine/api.py | 2 +- engine/auditioner.py | 4 +- engine/instrument.py | 23 +- engine/main.py | 52 +- extra/generate-round-robin.py | 41 ++ extra/test.sfz | 1024 ++++++++++++++++++++++++++++++ qtgui/instrument.py | 4 +- template/calfbox/sampler_layer.c | 38 +- template/calfbox/tarfile.h | 2 +- 9 files changed, 1145 insertions(+), 45 deletions(-) create mode 100755 extra/generate-round-robin.py create mode 100644 extra/test.sfz diff --git a/engine/api.py b/engine/api.py index 153e1ba..e07f5bb 100644 --- a/engine/api.py +++ b/engine/api.py @@ -148,7 +148,7 @@ def auditionerInstrument(idkey:tuple): var = originalInstrument.currentVariant else: var = originalInstrument.defaultVariant - session.data.auditioner.loadInstrument(originalInstrument.tarFilePath, var) + session.data.auditioner.loadInstrument(originalInstrument.tarFilePath, originalInstrument.rootPrefixPath, var) callbacks._auditionerInstrumentChanged(libraryId, instrumentId) def getAvailableAuditionerPorts()->dict: diff --git a/engine/auditioner.py b/engine/auditioner.py index 027ddf6..1443cb5 100644 --- a/engine/auditioner.py +++ b/engine/auditioner.py @@ -92,7 +92,7 @@ class Auditioner(object): return result - def loadInstrument(self, tarFilePath, variantSfzFileName:str): + def loadInstrument(self, tarFilePath, rootPrefixPath:str, variantSfzFileName:str): """load_patch_from_tar is blocking. This function will return when the instrument is ready to play. @@ -103,7 +103,7 @@ class Auditioner(object): #newProgramNumber = self.instrumentLayer.engine.get_unused_program() programNumber = 1 name = variantSfzFileName - self.program = self.instrumentLayer.engine.load_patch_from_tar(programNumber, tarFilePath, variantSfzFileName, name) + self.program = self.instrumentLayer.engine.load_patch_from_tar(programNumber, tarFilePath, rootPrefixPath+variantSfzFileName, name) self.instrumentLayer.engine.set_patch(1, programNumber) #1 is the channel, counting from 1. #TODO: we want this to be on all channels. self.currentVariant = variantSfzFileName logger.info(f"Finished loading samples for auditioner {variantSfzFileName}") diff --git a/engine/instrument.py b/engine/instrument.py index 583a84e..de3b9fa 100644 --- a/engine/instrument.py +++ b/engine/instrument.py @@ -95,13 +95,21 @@ class Instrument(object): self.cboxMidiPortUid = None self.metadata = metadata #parsed from the ini file. See self.exportMetadata for the pythonic dict + self.instrumentsInLibraryCount = None #injected by the creating process. Counted live in the program, not included in the ini file. self.tarFilePath = tarFilePath self.name = metadata["name"] - self.midiInputPortName = metadata["name"] + self.midiInputPortName = f"[{libraryId}-{self.id}] " + metadata["name"] self.variants = metadata["variants"].split(",") self.defaultVariant = metadata["defaultVariant"] self.enabled = False #means loaded. + if "root" in metadata: + if metadata["root"].endswith("/"): + self.rootPrefixPath = metadata["root"] + else: + self.rootPrefixPath = metadata["root"] + "/" + else: + self.rootPrefixPath = "" #Calfbox. The JACK ports are constructed without samples at first. self.scene = cbox.Document.get_engine().new_scene() @@ -138,6 +146,7 @@ class Instrument(object): #We could call self.load() now, but we delay that for the user experience. See docstring. + def exportStatus(self): """The call-often function to get the instrument status. Includes only data that can actually change during runtime.""" @@ -174,6 +183,7 @@ class Instrument(object): result["defaultVariant"] = self.metadata["defaultVariant"] #str result["defaultVariantWithoutSfzExtension"] = self.metadata["defaultVariant"].rstrip(".sfz") #str result["tags"] = self.metadata["tags"].split(",") # list of str + result["instrumentsInLibraryCount"] = self.instrumentsInLibraryCount # int #Optional Tags. @@ -224,11 +234,20 @@ class Instrument(object): #help (self.allInstrumentLayers[self.defaultPortUid].engine) #shows the functions to load programs into channels etc. #newProgramNumber = self.instrumentLayer.engine.get_unused_program() programNumber = self.metadata["variants"].index(variantSfzFileName) #counts from 1 - self.program = self.instrumentLayer.engine.load_patch_from_tar(programNumber, self.tarFilePath, variantSfzFileName, self.metadata["name"]) + self.program = self.instrumentLayer.engine.load_patch_from_tar(programNumber, self.tarFilePath, self.rootPrefixPath+variantSfzFileName, self.metadata["name"]) #tar_name, sfz_name, display_name self.instrumentLayer.engine.set_patch(1, programNumber) #1 is the channel, counting from 1. #TODO: we want this to be on all channels. + #self.program is always None ? + #self.instrumentLayer is type DocInstrument + #self.instrumentLayer.engine is type SamplerEngine + #self.instrumentLayer.engine.get_patches returns a dict like {0: ('Harpsichord.sfz', , 16)} + #Only ever index 0 is used because we have one patch per port + #self.instrumentLayer.engine.get_patches()[0][1] is the cbox.SamplerProgram. That should have been self.program, but isn't! + self.program = self.instrumentLayer.engine.get_patches()[0][1] + print (self.program.status()) self.currentVariant = variantSfzFileName logger.info(f"Finished loading samples for instrument {variantSfzFileName} with id key {self.idKey}") + def enable(self): self.enabled = True diff --git a/engine/main.py b/engine/main.py index d264488..cadd928 100644 --- a/engine/main.py +++ b/engine/main.py @@ -22,7 +22,6 @@ along with this program. If not, see . import logging; logger = logging.getLogger(__name__); logger.info("import") #Python Standard Lib -import os.path import configparser import pathlib import tarfile @@ -77,9 +76,12 @@ class Data(TemplateData): #Parse all tar libraries and load them all. ALL OF THEM! #for each library in ... self.libraries = {} # libraryId:int : Library-object - lib = Library(parentData=self, tarFilePath="/home/nils/lss/test-data.tar") - self.libraries[lib.id] = lib + basePath = pathlib.Path("/home/nils/samples/Tembro/out/") + for f in basePath.glob('*.tar'): + if f.is_file() and f.suffix == ".tar": + lib = Library(parentData=self, tarFilePath=f) + self.libraries[lib.id] = lib def exportMetadata(self)->dict: """Data we sent in callbacks. This is the initial 'build-the-instrument-database' function. @@ -100,39 +102,51 @@ class Library(object): You get all metadata from this. The samples are not loaded when Library() returns. The API can loop over Instrument.allInstruments and call instr.loadSamples() and send a feedback to callbacks. + + There is also a shortcut. First only an external .ini is loaded, which is much faster than + unpacking the tar. If no additional data like images are needed (which is always the case + at this version 1.0) we parse this external ini directly to build our database. + """ def __init__(self, parentData, tarFilePath):# self.parentData = parentData - self.tarFilePath = pathlib.Path(tarFilePath) - if not tarFilePath.endswith(".tar"): + self.tarFilePath = tarFilePath #pathlib.Path() + if not tarFilePath.suffix == ".tar": raise RuntimeError(f"Wrong file {tarFilePath}") - with tarfile.open(name=tarFilePath, mode='r:') as opentarfile: - iniFileObject = TextIOWrapper(opentarfile.extractfile("library.ini")) - self.config = configparser.ConfigParser() - self.config.read_file(iniFileObject) - #self.config is permant now. We can close the file object - """ - #Extract an image file. But only if it exists. tarfile.getmember is basically an exist-check that trows KeyError if not - try: - - imageAsBytes = extractfile("logo.png").read() #Qt can handle the format - except KeyError: #file not found - imageAsBytes = None - """ + needTarData = False #TODO: If we have images etc. in the future. + if needTarData: + with tarfile.open(name=tarFilePath, mode='r:') as opentarfile: + iniFileObject = TextIOWrapper(opentarfile.extractfile("library.ini")) + self.config = configparser.ConfigParser() + self.config.read_file(iniFileObject) + #self.config is permant now. We can close the file object + """ + #Extract an image file. But only if it exists. tarfile.getmember is basically an exist-check that trows KeyError if not + try: + + imageAsBytes = extractfile("logo.png").read() #Qt can handle the format + except KeyError: #file not found + imageAsBytes = None + """ + else: #the default case for now. + iniName = str(tarFilePath)[:-4] + ".ini" + self.config = configparser.ConfigParser() + self.config.read(iniName) self.id = self.config["library"]["id"] instrumentSections = self.config.sections() instrumentSections.remove("library") + instrumentsInLibraryCount = len(instrumentSections) self.instruments = {} # instrId : Instrument() for iniSection in instrumentSections: instrObj = Instrument(self, self.config["library"]["id"], self.config[iniSection], tarFilePath) + instrObj.instrumentsInLibraryCount = instrumentsInLibraryCount self.instruments[self.config[iniSection]["id"]] = instrObj #At a later point Instrument.loadSamples() must be called. This is done in the API. - def exportMetadata(self)->dict: """Return a dictionary with each key is an instrument id, but also a special key "library" with our own metadata. Allows the callbacks receiver to construct a hierarchy""" diff --git a/extra/generate-round-robin.py b/extra/generate-round-robin.py new file mode 100755 index 0000000..1ce6285 --- /dev/null +++ b/extra/generate-round-robin.py @@ -0,0 +1,41 @@ +#! /usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Copyright 2021, Nils Hilbricht, Germany ( https://www.hilbricht.net ) + +This file is part of the Laborejo Software Suite ( https://www.laborejo.org ), + +This application is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +""" + +""" +Outputs to standard output +Uses midi note keys as sample file names. +""" + +groupstring = """ + + seq_length=3 + key={} + seq_position=1 sample={}.wav transpose=0 + seq_position=2 sample={}.wav transpose=-1 + seq_position=3 sample={}.wav transpose=-2 +""" + +for keynum in range(127+1): + print (groupstring.format(keynum, keynum, keynum+1, keynum+2)) + + + + diff --git a/extra/test.sfz b/extra/test.sfz new file mode 100644 index 0000000..8bcaf73 --- /dev/null +++ b/extra/test.sfz @@ -0,0 +1,1024 @@ + + + seq_length=3 + key=0 + seq_position=1 sample=0.wav transpose=0 + seq_position=2 sample=1.wav transpose=-1 + seq_position=3 sample=2.wav transpose=-2 + + + + seq_length=3 + key=1 + seq_position=1 sample=1.wav transpose=0 + seq_position=2 sample=2.wav transpose=-1 + seq_position=3 sample=3.wav transpose=-2 + + + + seq_length=3 + key=2 + seq_position=1 sample=2.wav transpose=0 + seq_position=2 sample=3.wav transpose=-1 + seq_position=3 sample=4.wav transpose=-2 + + + + seq_length=3 + key=3 + seq_position=1 sample=3.wav transpose=0 + seq_position=2 sample=4.wav transpose=-1 + seq_position=3 sample=5.wav transpose=-2 + + + + seq_length=3 + key=4 + seq_position=1 sample=4.wav transpose=0 + seq_position=2 sample=5.wav transpose=-1 + seq_position=3 sample=6.wav transpose=-2 + + + + seq_length=3 + key=5 + seq_position=1 sample=5.wav transpose=0 + seq_position=2 sample=6.wav transpose=-1 + seq_position=3 sample=7.wav transpose=-2 + + + + seq_length=3 + key=6 + seq_position=1 sample=6.wav transpose=0 + seq_position=2 sample=7.wav transpose=-1 + seq_position=3 sample=8.wav transpose=-2 + + + + seq_length=3 + key=7 + seq_position=1 sample=7.wav transpose=0 + seq_position=2 sample=8.wav transpose=-1 + seq_position=3 sample=9.wav transpose=-2 + + + + seq_length=3 + key=8 + seq_position=1 sample=8.wav transpose=0 + seq_position=2 sample=9.wav transpose=-1 + seq_position=3 sample=10.wav transpose=-2 + + + + seq_length=3 + key=9 + seq_position=1 sample=9.wav transpose=0 + seq_position=2 sample=10.wav transpose=-1 + seq_position=3 sample=11.wav transpose=-2 + + + + seq_length=3 + key=10 + seq_position=1 sample=10.wav transpose=0 + seq_position=2 sample=11.wav transpose=-1 + seq_position=3 sample=12.wav transpose=-2 + + + + seq_length=3 + key=11 + seq_position=1 sample=11.wav transpose=0 + seq_position=2 sample=12.wav transpose=-1 + seq_position=3 sample=13.wav transpose=-2 + + + + seq_length=3 + key=12 + seq_position=1 sample=12.wav transpose=0 + seq_position=2 sample=13.wav transpose=-1 + seq_position=3 sample=14.wav transpose=-2 + + + + seq_length=3 + key=13 + seq_position=1 sample=13.wav transpose=0 + seq_position=2 sample=14.wav transpose=-1 + seq_position=3 sample=15.wav transpose=-2 + + + + seq_length=3 + key=14 + seq_position=1 sample=14.wav transpose=0 + seq_position=2 sample=15.wav transpose=-1 + seq_position=3 sample=16.wav transpose=-2 + + + + seq_length=3 + key=15 + seq_position=1 sample=15.wav transpose=0 + seq_position=2 sample=16.wav transpose=-1 + seq_position=3 sample=17.wav transpose=-2 + + + + seq_length=3 + key=16 + seq_position=1 sample=16.wav transpose=0 + seq_position=2 sample=17.wav transpose=-1 + seq_position=3 sample=18.wav transpose=-2 + + + + seq_length=3 + key=17 + seq_position=1 sample=17.wav transpose=0 + seq_position=2 sample=18.wav transpose=-1 + seq_position=3 sample=19.wav transpose=-2 + + + + seq_length=3 + key=18 + seq_position=1 sample=18.wav transpose=0 + seq_position=2 sample=19.wav transpose=-1 + seq_position=3 sample=20.wav transpose=-2 + + + + seq_length=3 + key=19 + seq_position=1 sample=19.wav transpose=0 + seq_position=2 sample=20.wav transpose=-1 + seq_position=3 sample=21.wav transpose=-2 + + + + seq_length=3 + key=20 + seq_position=1 sample=20.wav transpose=0 + seq_position=2 sample=21.wav transpose=-1 + seq_position=3 sample=22.wav transpose=-2 + + + + seq_length=3 + key=21 + seq_position=1 sample=21.wav transpose=0 + seq_position=2 sample=22.wav transpose=-1 + seq_position=3 sample=23.wav transpose=-2 + + + + seq_length=3 + key=22 + seq_position=1 sample=22.wav transpose=0 + seq_position=2 sample=23.wav transpose=-1 + seq_position=3 sample=24.wav transpose=-2 + + + + seq_length=3 + key=23 + seq_position=1 sample=23.wav transpose=0 + seq_position=2 sample=24.wav transpose=-1 + seq_position=3 sample=25.wav transpose=-2 + + + + seq_length=3 + key=24 + seq_position=1 sample=24.wav transpose=0 + seq_position=2 sample=25.wav transpose=-1 + seq_position=3 sample=26.wav transpose=-2 + + + + seq_length=3 + key=25 + seq_position=1 sample=25.wav transpose=0 + seq_position=2 sample=26.wav transpose=-1 + seq_position=3 sample=27.wav transpose=-2 + + + + seq_length=3 + key=26 + seq_position=1 sample=26.wav transpose=0 + seq_position=2 sample=27.wav transpose=-1 + seq_position=3 sample=28.wav transpose=-2 + + + + seq_length=3 + key=27 + seq_position=1 sample=27.wav transpose=0 + seq_position=2 sample=28.wav transpose=-1 + seq_position=3 sample=29.wav transpose=-2 + + + + seq_length=3 + key=28 + seq_position=1 sample=28.wav transpose=0 + seq_position=2 sample=29.wav transpose=-1 + seq_position=3 sample=30.wav transpose=-2 + + + + seq_length=3 + key=29 + seq_position=1 sample=29.wav transpose=0 + seq_position=2 sample=30.wav transpose=-1 + seq_position=3 sample=31.wav transpose=-2 + + + + seq_length=3 + key=30 + seq_position=1 sample=30.wav transpose=0 + seq_position=2 sample=31.wav transpose=-1 + seq_position=3 sample=32.wav transpose=-2 + + + + seq_length=3 + key=31 + seq_position=1 sample=31.wav transpose=0 + seq_position=2 sample=32.wav transpose=-1 + seq_position=3 sample=33.wav transpose=-2 + + + + seq_length=3 + key=32 + seq_position=1 sample=32.wav transpose=0 + seq_position=2 sample=33.wav transpose=-1 + seq_position=3 sample=34.wav transpose=-2 + + + + seq_length=3 + key=33 + seq_position=1 sample=33.wav transpose=0 + seq_position=2 sample=34.wav transpose=-1 + seq_position=3 sample=35.wav transpose=-2 + + + + seq_length=3 + key=34 + seq_position=1 sample=34.wav transpose=0 + seq_position=2 sample=35.wav transpose=-1 + seq_position=3 sample=36.wav transpose=-2 + + + + seq_length=3 + key=35 + seq_position=1 sample=35.wav transpose=0 + seq_position=2 sample=36.wav transpose=-1 + seq_position=3 sample=37.wav transpose=-2 + + + + seq_length=3 + key=36 + seq_position=1 sample=36.wav transpose=0 + seq_position=2 sample=37.wav transpose=-1 + seq_position=3 sample=38.wav transpose=-2 + + + + seq_length=3 + key=37 + seq_position=1 sample=37.wav transpose=0 + seq_position=2 sample=38.wav transpose=-1 + seq_position=3 sample=39.wav transpose=-2 + + + + seq_length=3 + key=38 + seq_position=1 sample=38.wav transpose=0 + seq_position=2 sample=39.wav transpose=-1 + seq_position=3 sample=40.wav transpose=-2 + + + + seq_length=3 + key=39 + seq_position=1 sample=39.wav transpose=0 + seq_position=2 sample=40.wav transpose=-1 + seq_position=3 sample=41.wav transpose=-2 + + + + seq_length=3 + key=40 + seq_position=1 sample=40.wav transpose=0 + seq_position=2 sample=41.wav transpose=-1 + seq_position=3 sample=42.wav transpose=-2 + + + + seq_length=3 + key=41 + seq_position=1 sample=41.wav transpose=0 + seq_position=2 sample=42.wav transpose=-1 + seq_position=3 sample=43.wav transpose=-2 + + + + seq_length=3 + key=42 + seq_position=1 sample=42.wav transpose=0 + seq_position=2 sample=43.wav transpose=-1 + seq_position=3 sample=44.wav transpose=-2 + + + + seq_length=3 + key=43 + seq_position=1 sample=43.wav transpose=0 + seq_position=2 sample=44.wav transpose=-1 + seq_position=3 sample=45.wav transpose=-2 + + + + seq_length=3 + key=44 + seq_position=1 sample=44.wav transpose=0 + seq_position=2 sample=45.wav transpose=-1 + seq_position=3 sample=46.wav transpose=-2 + + + + seq_length=3 + key=45 + seq_position=1 sample=45.wav transpose=0 + seq_position=2 sample=46.wav transpose=-1 + seq_position=3 sample=47.wav transpose=-2 + + + + seq_length=3 + key=46 + seq_position=1 sample=46.wav transpose=0 + seq_position=2 sample=47.wav transpose=-1 + seq_position=3 sample=48.wav transpose=-2 + + + + seq_length=3 + key=47 + seq_position=1 sample=47.wav transpose=0 + seq_position=2 sample=48.wav transpose=-1 + seq_position=3 sample=49.wav transpose=-2 + + + + seq_length=3 + key=48 + seq_position=1 sample=48.wav transpose=0 + seq_position=2 sample=49.wav transpose=-1 + seq_position=3 sample=50.wav transpose=-2 + + + + seq_length=3 + key=49 + seq_position=1 sample=49.wav transpose=0 + seq_position=2 sample=50.wav transpose=-1 + seq_position=3 sample=51.wav transpose=-2 + + + + seq_length=3 + key=50 + seq_position=1 sample=50.wav transpose=0 + seq_position=2 sample=51.wav transpose=-1 + seq_position=3 sample=52.wav transpose=-2 + + + + seq_length=3 + key=51 + seq_position=1 sample=51.wav transpose=0 + seq_position=2 sample=52.wav transpose=-1 + seq_position=3 sample=53.wav transpose=-2 + + + + seq_length=3 + key=52 + seq_position=1 sample=52.wav transpose=0 + seq_position=2 sample=53.wav transpose=-1 + seq_position=3 sample=54.wav transpose=-2 + + + + seq_length=3 + key=53 + seq_position=1 sample=53.wav transpose=0 + seq_position=2 sample=54.wav transpose=-1 + seq_position=3 sample=55.wav transpose=-2 + + + + seq_length=3 + key=54 + seq_position=1 sample=54.wav transpose=0 + seq_position=2 sample=55.wav transpose=-1 + seq_position=3 sample=56.wav transpose=-2 + + + + seq_length=3 + key=55 + seq_position=1 sample=55.wav transpose=0 + seq_position=2 sample=56.wav transpose=-1 + seq_position=3 sample=57.wav transpose=-2 + + + + seq_length=3 + key=56 + seq_position=1 sample=56.wav transpose=0 + seq_position=2 sample=57.wav transpose=-1 + seq_position=3 sample=58.wav transpose=-2 + + + + seq_length=3 + key=57 + seq_position=1 sample=57.wav transpose=0 + seq_position=2 sample=58.wav transpose=-1 + seq_position=3 sample=59.wav transpose=-2 + + + + seq_length=3 + key=58 + seq_position=1 sample=58.wav transpose=0 + seq_position=2 sample=59.wav transpose=-1 + seq_position=3 sample=60.wav transpose=-2 + + + + seq_length=3 + key=59 + seq_position=1 sample=59.wav transpose=0 + seq_position=2 sample=60.wav transpose=-1 + seq_position=3 sample=61.wav transpose=-2 + + + + seq_length=3 + key=60 + seq_position=1 sample=60.wav transpose=0 + seq_position=2 sample=61.wav transpose=-1 + seq_position=3 sample=62.wav transpose=-2 + + + + seq_length=3 + key=61 + seq_position=1 sample=61.wav transpose=0 + seq_position=2 sample=62.wav transpose=-1 + seq_position=3 sample=63.wav transpose=-2 + + + + seq_length=3 + key=62 + seq_position=1 sample=62.wav transpose=0 + seq_position=2 sample=63.wav transpose=-1 + seq_position=3 sample=64.wav transpose=-2 + + + + seq_length=3 + key=63 + seq_position=1 sample=63.wav transpose=0 + seq_position=2 sample=64.wav transpose=-1 + seq_position=3 sample=65.wav transpose=-2 + + + + seq_length=3 + key=64 + seq_position=1 sample=64.wav transpose=0 + seq_position=2 sample=65.wav transpose=-1 + seq_position=3 sample=66.wav transpose=-2 + + + + seq_length=3 + key=65 + seq_position=1 sample=65.wav transpose=0 + seq_position=2 sample=66.wav transpose=-1 + seq_position=3 sample=67.wav transpose=-2 + + + + seq_length=3 + key=66 + seq_position=1 sample=66.wav transpose=0 + seq_position=2 sample=67.wav transpose=-1 + seq_position=3 sample=68.wav transpose=-2 + + + + seq_length=3 + key=67 + seq_position=1 sample=67.wav transpose=0 + seq_position=2 sample=68.wav transpose=-1 + seq_position=3 sample=69.wav transpose=-2 + + + + seq_length=3 + key=68 + seq_position=1 sample=68.wav transpose=0 + seq_position=2 sample=69.wav transpose=-1 + seq_position=3 sample=70.wav transpose=-2 + + + + seq_length=3 + key=69 + seq_position=1 sample=69.wav transpose=0 + seq_position=2 sample=70.wav transpose=-1 + seq_position=3 sample=71.wav transpose=-2 + + + + seq_length=3 + key=70 + seq_position=1 sample=70.wav transpose=0 + seq_position=2 sample=71.wav transpose=-1 + seq_position=3 sample=72.wav transpose=-2 + + + + seq_length=3 + key=71 + seq_position=1 sample=71.wav transpose=0 + seq_position=2 sample=72.wav transpose=-1 + seq_position=3 sample=73.wav transpose=-2 + + + + seq_length=3 + key=72 + seq_position=1 sample=72.wav transpose=0 + seq_position=2 sample=73.wav transpose=-1 + seq_position=3 sample=74.wav transpose=-2 + + + + seq_length=3 + key=73 + seq_position=1 sample=73.wav transpose=0 + seq_position=2 sample=74.wav transpose=-1 + seq_position=3 sample=75.wav transpose=-2 + + + + seq_length=3 + key=74 + seq_position=1 sample=74.wav transpose=0 + seq_position=2 sample=75.wav transpose=-1 + seq_position=3 sample=76.wav transpose=-2 + + + + seq_length=3 + key=75 + seq_position=1 sample=75.wav transpose=0 + seq_position=2 sample=76.wav transpose=-1 + seq_position=3 sample=77.wav transpose=-2 + + + + seq_length=3 + key=76 + seq_position=1 sample=76.wav transpose=0 + seq_position=2 sample=77.wav transpose=-1 + seq_position=3 sample=78.wav transpose=-2 + + + + seq_length=3 + key=77 + seq_position=1 sample=77.wav transpose=0 + seq_position=2 sample=78.wav transpose=-1 + seq_position=3 sample=79.wav transpose=-2 + + + + seq_length=3 + key=78 + seq_position=1 sample=78.wav transpose=0 + seq_position=2 sample=79.wav transpose=-1 + seq_position=3 sample=80.wav transpose=-2 + + + + seq_length=3 + key=79 + seq_position=1 sample=79.wav transpose=0 + seq_position=2 sample=80.wav transpose=-1 + seq_position=3 sample=81.wav transpose=-2 + + + + seq_length=3 + key=80 + seq_position=1 sample=80.wav transpose=0 + seq_position=2 sample=81.wav transpose=-1 + seq_position=3 sample=82.wav transpose=-2 + + + + seq_length=3 + key=81 + seq_position=1 sample=81.wav transpose=0 + seq_position=2 sample=82.wav transpose=-1 + seq_position=3 sample=83.wav transpose=-2 + + + + seq_length=3 + key=82 + seq_position=1 sample=82.wav transpose=0 + seq_position=2 sample=83.wav transpose=-1 + seq_position=3 sample=84.wav transpose=-2 + + + + seq_length=3 + key=83 + seq_position=1 sample=83.wav transpose=0 + seq_position=2 sample=84.wav transpose=-1 + seq_position=3 sample=85.wav transpose=-2 + + + + seq_length=3 + key=84 + seq_position=1 sample=84.wav transpose=0 + seq_position=2 sample=85.wav transpose=-1 + seq_position=3 sample=86.wav transpose=-2 + + + + seq_length=3 + key=85 + seq_position=1 sample=85.wav transpose=0 + seq_position=2 sample=86.wav transpose=-1 + seq_position=3 sample=87.wav transpose=-2 + + + + seq_length=3 + key=86 + seq_position=1 sample=86.wav transpose=0 + seq_position=2 sample=87.wav transpose=-1 + seq_position=3 sample=88.wav transpose=-2 + + + + seq_length=3 + key=87 + seq_position=1 sample=87.wav transpose=0 + seq_position=2 sample=88.wav transpose=-1 + seq_position=3 sample=89.wav transpose=-2 + + + + seq_length=3 + key=88 + seq_position=1 sample=88.wav transpose=0 + seq_position=2 sample=89.wav transpose=-1 + seq_position=3 sample=90.wav transpose=-2 + + + + seq_length=3 + key=89 + seq_position=1 sample=89.wav transpose=0 + seq_position=2 sample=90.wav transpose=-1 + seq_position=3 sample=91.wav transpose=-2 + + + + seq_length=3 + key=90 + seq_position=1 sample=90.wav transpose=0 + seq_position=2 sample=91.wav transpose=-1 + seq_position=3 sample=92.wav transpose=-2 + + + + seq_length=3 + key=91 + seq_position=1 sample=91.wav transpose=0 + seq_position=2 sample=92.wav transpose=-1 + seq_position=3 sample=93.wav transpose=-2 + + + + seq_length=3 + key=92 + seq_position=1 sample=92.wav transpose=0 + seq_position=2 sample=93.wav transpose=-1 + seq_position=3 sample=94.wav transpose=-2 + + + + seq_length=3 + key=93 + seq_position=1 sample=93.wav transpose=0 + seq_position=2 sample=94.wav transpose=-1 + seq_position=3 sample=95.wav transpose=-2 + + + + seq_length=3 + key=94 + seq_position=1 sample=94.wav transpose=0 + seq_position=2 sample=95.wav transpose=-1 + seq_position=3 sample=96.wav transpose=-2 + + + + seq_length=3 + key=95 + seq_position=1 sample=95.wav transpose=0 + seq_position=2 sample=96.wav transpose=-1 + seq_position=3 sample=97.wav transpose=-2 + + + + seq_length=3 + key=96 + seq_position=1 sample=96.wav transpose=0 + seq_position=2 sample=97.wav transpose=-1 + seq_position=3 sample=98.wav transpose=-2 + + + + seq_length=3 + key=97 + seq_position=1 sample=97.wav transpose=0 + seq_position=2 sample=98.wav transpose=-1 + seq_position=3 sample=99.wav transpose=-2 + + + + seq_length=3 + key=98 + seq_position=1 sample=98.wav transpose=0 + seq_position=2 sample=99.wav transpose=-1 + seq_position=3 sample=100.wav transpose=-2 + + + + seq_length=3 + key=99 + seq_position=1 sample=99.wav transpose=0 + seq_position=2 sample=100.wav transpose=-1 + seq_position=3 sample=101.wav transpose=-2 + + + + seq_length=3 + key=100 + seq_position=1 sample=100.wav transpose=0 + seq_position=2 sample=101.wav transpose=-1 + seq_position=3 sample=102.wav transpose=-2 + + + + seq_length=3 + key=101 + seq_position=1 sample=101.wav transpose=0 + seq_position=2 sample=102.wav transpose=-1 + seq_position=3 sample=103.wav transpose=-2 + + + + seq_length=3 + key=102 + seq_position=1 sample=102.wav transpose=0 + seq_position=2 sample=103.wav transpose=-1 + seq_position=3 sample=104.wav transpose=-2 + + + + seq_length=3 + key=103 + seq_position=1 sample=103.wav transpose=0 + seq_position=2 sample=104.wav transpose=-1 + seq_position=3 sample=105.wav transpose=-2 + + + + seq_length=3 + key=104 + seq_position=1 sample=104.wav transpose=0 + seq_position=2 sample=105.wav transpose=-1 + seq_position=3 sample=106.wav transpose=-2 + + + + seq_length=3 + key=105 + seq_position=1 sample=105.wav transpose=0 + seq_position=2 sample=106.wav transpose=-1 + seq_position=3 sample=107.wav transpose=-2 + + + + seq_length=3 + key=106 + seq_position=1 sample=106.wav transpose=0 + seq_position=2 sample=107.wav transpose=-1 + seq_position=3 sample=108.wav transpose=-2 + + + + seq_length=3 + key=107 + seq_position=1 sample=107.wav transpose=0 + seq_position=2 sample=108.wav transpose=-1 + seq_position=3 sample=109.wav transpose=-2 + + + + seq_length=3 + key=108 + seq_position=1 sample=108.wav transpose=0 + seq_position=2 sample=109.wav transpose=-1 + seq_position=3 sample=110.wav transpose=-2 + + + + seq_length=3 + key=109 + seq_position=1 sample=109.wav transpose=0 + seq_position=2 sample=110.wav transpose=-1 + seq_position=3 sample=111.wav transpose=-2 + + + + seq_length=3 + key=110 + seq_position=1 sample=110.wav transpose=0 + seq_position=2 sample=111.wav transpose=-1 + seq_position=3 sample=112.wav transpose=-2 + + + + seq_length=3 + key=111 + seq_position=1 sample=111.wav transpose=0 + seq_position=2 sample=112.wav transpose=-1 + seq_position=3 sample=113.wav transpose=-2 + + + + seq_length=3 + key=112 + seq_position=1 sample=112.wav transpose=0 + seq_position=2 sample=113.wav transpose=-1 + seq_position=3 sample=114.wav transpose=-2 + + + + seq_length=3 + key=113 + seq_position=1 sample=113.wav transpose=0 + seq_position=2 sample=114.wav transpose=-1 + seq_position=3 sample=115.wav transpose=-2 + + + + seq_length=3 + key=114 + seq_position=1 sample=114.wav transpose=0 + seq_position=2 sample=115.wav transpose=-1 + seq_position=3 sample=116.wav transpose=-2 + + + + seq_length=3 + key=115 + seq_position=1 sample=115.wav transpose=0 + seq_position=2 sample=116.wav transpose=-1 + seq_position=3 sample=117.wav transpose=-2 + + + + seq_length=3 + key=116 + seq_position=1 sample=116.wav transpose=0 + seq_position=2 sample=117.wav transpose=-1 + seq_position=3 sample=118.wav transpose=-2 + + + + seq_length=3 + key=117 + seq_position=1 sample=117.wav transpose=0 + seq_position=2 sample=118.wav transpose=-1 + seq_position=3 sample=119.wav transpose=-2 + + + + seq_length=3 + key=118 + seq_position=1 sample=118.wav transpose=0 + seq_position=2 sample=119.wav transpose=-1 + seq_position=3 sample=120.wav transpose=-2 + + + + seq_length=3 + key=119 + seq_position=1 sample=119.wav transpose=0 + seq_position=2 sample=120.wav transpose=-1 + seq_position=3 sample=121.wav transpose=-2 + + + + seq_length=3 + key=120 + seq_position=1 sample=120.wav transpose=0 + seq_position=2 sample=121.wav transpose=-1 + seq_position=3 sample=122.wav transpose=-2 + + + + seq_length=3 + key=121 + seq_position=1 sample=121.wav transpose=0 + seq_position=2 sample=122.wav transpose=-1 + seq_position=3 sample=123.wav transpose=-2 + + + + seq_length=3 + key=122 + seq_position=1 sample=122.wav transpose=0 + seq_position=2 sample=123.wav transpose=-1 + seq_position=3 sample=124.wav transpose=-2 + + + + seq_length=3 + key=123 + seq_position=1 sample=123.wav transpose=0 + seq_position=2 sample=124.wav transpose=-1 + seq_position=3 sample=125.wav transpose=-2 + + + + seq_length=3 + key=124 + seq_position=1 sample=124.wav transpose=0 + seq_position=2 sample=125.wav transpose=-1 + seq_position=3 sample=126.wav transpose=-2 + + + + seq_length=3 + key=125 + seq_position=1 sample=125.wav transpose=0 + seq_position=2 sample=126.wav transpose=-1 + seq_position=3 sample=127.wav transpose=-2 + + + + seq_length=3 + key=126 + seq_position=1 sample=126.wav transpose=0 + seq_position=2 sample=127.wav transpose=-1 + seq_position=3 sample=128.wav transpose=-2 + + + + seq_length=3 + key=127 + seq_position=1 sample=127.wav transpose=0 + seq_position=2 sample=128.wav transpose=-1 + seq_position=3 sample=129.wav transpose=-2 + diff --git a/qtgui/instrument.py b/qtgui/instrument.py index 7574bbd..3072198 100644 --- a/qtgui/instrument.py +++ b/qtgui/instrument.py @@ -309,7 +309,9 @@ class GuiInstrument(QtWidgets.QTreeWidgetItem): elif key == "id-key": #tuple libId, instrId = instrumentDict[key] - self.setText(index, f"{libId}-{instrId}") + #self.setText(index, f"{libId}-{str(instrId).zfill(3)}") + zeros = int(instrumentDict["instrumentsInLibraryCount"]/10)+1 + self.setText(index, str(instrId).zfill(zeros)) """ elif key == "state": #use parameter for initial value. loaded from file or default = False. diff --git a/template/calfbox/sampler_layer.c b/template/calfbox/sampler_layer.c index 4637d3d..c4d8b35 100644 --- a/template/calfbox/sampler_layer.c +++ b/template/calfbox/sampler_layer.c @@ -1034,8 +1034,8 @@ static gboolean sampler_layer_process_cmd(struct cbox_command_target *ct, struct if (!cbox_check_fb_channel(fb, cmd->command, error)) return FALSE; - if (!((!layer->parent_program || cbox_execute_on(fb, NULL, "/parent_program", "o", error, layer->parent_program)) && - (!layer->parent || cbox_execute_on(fb, NULL, "/parent", "o", error, layer->parent)) && + if (!((!layer->parent_program || cbox_execute_on(fb, NULL, "/parent_program", "o", error, layer->parent_program)) && + (!layer->parent || cbox_execute_on(fb, NULL, "/parent", "o", error, layer->parent)) && CBOX_OBJECT_DEFAULT_STATUS(layer, fb, error))) return FALSE; return TRUE; @@ -1148,7 +1148,7 @@ struct sampler_layer *sampler_layer_new(struct sampler_module *m, struct sampler memset(l, 0, sizeof(struct sampler_layer)); CBOX_OBJECT_HEADER_INIT(l, sampler_layer, doc); cbox_command_target_init(&l->cmd_target, sampler_layer_process_cmd, l); - + l->module = m; l->child_layers = g_hash_table_new(NULL, NULL); if (parent) @@ -1205,7 +1205,7 @@ struct sampler_layer *sampler_layer_new(struct sampler_module *m, struct sampler #define PROC_FIELDS_CLONE_dahdsr(name, parname, index) \ DAHDSR_FIELDS(PROC_SUBSTRUCT_CLONE, name, dst, src) \ if (!copy_hasattr) \ - DAHDSR_FIELDS(PROC_SUBSTRUCT_RESET_HAS_FIELD, name, dst) + DAHDSR_FIELDS(PROC_SUBSTRUCT_RESET_HAS_FIELD, name, dst) #define PROC_FIELDS_CLONE_lfo(name, parname, index) \ LFO_FIELDS(PROC_SUBSTRUCT_CLONE, name, dst, src) \ if (!copy_hasattr) \ @@ -1291,11 +1291,11 @@ static inline int sampler_filter_num_stages(float cutoff, enum sampler_filter_ty #define END_VALUE_amp_velcurve (l->amp_veltrack < 0 ? dB2gain(l->amp_veltrack * 84.0 / 100.0) : 1) #define IS_QUADRATIC_amp_velcurve l->velcurve_quadratic -#define PROC_FIELDS_FINALISER(type, name, def_value) +#define PROC_FIELDS_FINALISER(type, name, def_value) #define PROC_FIELDS_FINALISER_string(name) #define PROC_FIELDS_FINALISER_midicurve(name) \ sampler_midi_curve_interpolate(&l->name, l->computed.eff_##name, START_VALUE_##name, END_VALUE_##name, IS_QUADRATIC_##name); -#define PROC_FIELDS_FINALISER_enum(type, name, def_value) +#define PROC_FIELDS_FINALISER_enum(type, name, def_value) #define PROC_FIELDS_FINALISER_dBamp(type, name, def_value) \ l->name##_linearized = dB2gain(l->name); #define PROC_FIELDS_FINALISER_dahdsr(name, parname, index) \ @@ -1319,7 +1319,7 @@ void sampler_layer_data_finalize(struct sampler_layer_data *l, struct sampler_la l->computed.eff_waveform = cbox_wavebank_get_waveform(p->name, p->tarfile, p->sample_dir, l->sample, &error); if (!l->computed.eff_waveform) { - g_warning("Cannot load waveform %s: %s", l->sample, error ? error->message : "unknown error"); + g_warning("Cannot load waveform \"%s\" in sample_dir \"%s\" : \"%s\"", l->sample, p->sample_dir, error ? error->message : "unknown error"); g_error_free(error); } } @@ -1330,7 +1330,7 @@ void sampler_layer_data_finalize(struct sampler_layer_data *l, struct sampler_la l->computed.eff_is_silent = !l->sample || !strcmp(l->sample, "*silence"); l->sample_changed = FALSE; } - + l->computed.eff_use_keyswitch = ((l->sw_down != -1) || (l->sw_up != -1) || (l->sw_last != -1) || (l->sw_previous != -1)); l->computed.eff_use_simple_trigger_logic = (l->seq_length == 1 && l->seq_position == 1) && @@ -1457,7 +1457,7 @@ void sampler_layer_load_overrides(struct sampler_layer *l, const char *cfg_secti char *imp = cbox_config_get_string(cfg_section, "import"); if (imp) sampler_layer_load_overrides(l, imp); - + struct layer_foreach_struct lfs = { .layer = l, .cfg_section = cfg_section @@ -1478,7 +1478,7 @@ static void sampler_layer_apply_unknown(struct sampler_layer *l, const char *key { if (!l->unknown_keys) l->unknown_keys = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); - + g_hash_table_insert(l->unknown_keys, g_strdup(key), g_strdup(value)); } @@ -1628,16 +1628,16 @@ gchar *sampler_layer_to_string(struct sampler_layer *lr, gboolean show_inherited char floatbuf[G_ASCII_DTOSTR_BUF_SIZE]; int floatbufsize = G_ASCII_DTOSTR_BUF_SIZE; SAMPLER_FIXED_FIELDS(PROC_FIELDS_TO_FILEPTR) - + for(struct sampler_noteinitfunc *nd = l->voice_nifs; nd; nd = nd->next) { if (!nd->value.has_value && !nd->value.has_curve && !nd->value.has_step && !show_inherited) continue; - #define PROC_ENVSTAGE_NAME(name, index, def_value) #name, + #define PROC_ENVSTAGE_NAME(name, index, def_value) #name, static const char *env_stages[] = { DAHDSR_FIELDS(PROC_ENVSTAGE_NAME) "start" }; uint32_t v = nd->key.variant; g_ascii_dtostr(floatbuf, floatbufsize, nd->value.value); - + if (nd->key.notefunc_voice == sampler_nif_addrandom && v >= 0 && v <= 2) g_string_append_printf(outstr, " %s_random=%s", addrandom_variants[v], floatbuf); else if (nd->key.notefunc_voice == sampler_nif_vel2pitch) @@ -1825,7 +1825,7 @@ gchar *sampler_layer_to_string(struct sampler_layer *lr, gboolean show_inherited while(g_hash_table_iter_next(&hti, (gpointer *)&key, (gpointer *)&value)) g_string_append_printf(outstr, " %s=%s", key, value); } - + gchar *res = outstr->str; g_string_free(outstr, FALSE); return res; @@ -1935,7 +1935,7 @@ static int sampler_layer_update_cmd_prepare(void *data) struct sampler_layer_update_cmd *cmd = data; cmd->old_data = cmd->layer->runtime; cmd->new_data = calloc(1, sizeof(struct sampler_layer_data)); - + sampler_layer_data_clone(cmd->new_data, &cmd->layer->data, TRUE); sampler_layer_data_finalize(cmd->new_data, cmd->layer->parent ? &cmd->layer->parent->data : NULL, cmd->layer->parent_program); if (cmd->layer->runtime == NULL) @@ -1952,7 +1952,7 @@ static int sampler_layer_update_cmd_prepare(void *data) static int sampler_layer_update_cmd_execute(void *data) { struct sampler_layer_update_cmd *cmd = data; - + for (int i = 0; i < 16; i++) { FOREACH_VOICE(cmd->module->channels[i].voices_running, v) @@ -1983,7 +1983,7 @@ static int sampler_layer_update_cmd_execute(void *data) static void sampler_layer_update_cmd_cleanup(void *data) { struct sampler_layer_update_cmd *cmd = data; - + sampler_layer_data_destroy(cmd->old_data); free(cmd); } @@ -2008,13 +2008,13 @@ void sampler_layer_update(struct sampler_layer *l) .execute = sampler_layer_update_cmd_execute, .cleanup = sampler_layer_update_cmd_cleanup, }; - + struct sampler_layer_update_cmd *lcmd = malloc(sizeof(struct sampler_layer_update_cmd)); lcmd->module = l->module; lcmd->layer = l; lcmd->new_data = NULL; lcmd->old_data = NULL; - + cbox_rt_execute_cmd_async(l->module->module.rt, &rtcmd, lcmd); } diff --git a/template/calfbox/tarfile.h b/template/calfbox/tarfile.h index c940cc7..a08ae68 100644 --- a/template/calfbox/tarfile.h +++ b/template/calfbox/tarfile.h @@ -38,7 +38,7 @@ struct cbox_tarfile int refs; GHashTable *items_byname; GHashTable *items_byname_nc; - char *file_pathname; + char *file_pathname; //full path to the .tar file with filename.ext }; struct cbox_tarpool