@@ -2414,6 +2414,8 @@ class CarlaHostDLL(CarlaHostMeta): | |||
self.lib.carla_get_host_osc_url_udp.argtypes = None | |||
self.lib.carla_get_host_osc_url_udp.restype = c_char_p | |||
# -------------------------------------------------------------------------------------------------------- | |||
def get_complete_license_text(self): | |||
return charPtrToString(self.lib.carla_get_complete_license_text()) | |||
@@ -2684,3 +2686,466 @@ class CarlaHostDLL(CarlaHostMeta): | |||
return charPtrToString(self.lib.carla_get_host_osc_url_udp()) | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Helper object for CarlaHostPlugin | |||
class PluginStoreInfo(object): | |||
__slots__ = [ | |||
'pluginInfo', | |||
'pluginRealName', | |||
'internalValues', | |||
'audioCountInfo', | |||
'midiCountInfo', | |||
'parameterCount', | |||
'parameterCountInfo', | |||
'parameterInfo', | |||
'parameterData', | |||
'parameterRanges', | |||
'parameterValues', | |||
'programCount', | |||
'programCurrent', | |||
'programNames', | |||
'midiProgramCount', | |||
'midiProgramCurrent', | |||
'midiProgramData', | |||
'peaks' | |||
] | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Carla Host object for plugins (using pipes) | |||
#class CarlaHostPlugin(CarlaHostMeta): | |||
class CarlaHostPlugin(CarlaHostMeta, metaclass=ABCMeta): | |||
def __init__(self): | |||
CarlaHostMeta.__init__(self) | |||
# text data to return when requested | |||
self.fCompleteLicentText = "" | |||
self.fJuceVersion = "" | |||
self.fSupportedFileExts = "" | |||
self.fLastError = "" | |||
self.fOscUrlTCP = "" | |||
self.fOscUrlUDP = "" | |||
# plugin info | |||
self.fPluginsInfo = [] | |||
# transport info | |||
self.fTransportInfo = { | |||
"playing": False, | |||
"frame": 0, | |||
"bar": 0, | |||
"beat": 0, | |||
"tick": 0, | |||
"bpm": 0.0 | |||
} | |||
# some other vars | |||
self.fHostName = "" | |||
self.fBufferSize = 0 | |||
self.fSampleRate = 0.0 | |||
# -------------------------------------------------------------------------------------------------------- | |||
# Needs to be reimplemented | |||
@abstractmethod | |||
def sendMsg(self, lines): | |||
raise NotImplementedError | |||
# internal, sets error if sendMsg failed | |||
def sendMsgAndSetError(self, lines): | |||
if self.sendMsg(lines): | |||
return True | |||
self.fLastError = "Communication error with backend" | |||
return False | |||
# -------------------------------------------------------------------------------------------------------- | |||
def get_complete_license_text(self): | |||
return self.fCompleteLicentText | |||
def get_juce_version(self): | |||
return self.fJuceVersion | |||
def get_supported_file_extensions(self): | |||
return self.fSupportedFileExts | |||
def get_engine_driver_count(self): | |||
return 1 | |||
def get_engine_driver_name(self, index): | |||
return "Plugin" | |||
def get_engine_driver_device_names(self, index): | |||
return [self.fHostName] | |||
def get_engine_driver_device_info(self, index, name): | |||
return PyEngineDriverDeviceInfo | |||
def get_internal_plugin_count(self): | |||
return 0 | |||
def get_internal_plugin_info(self, index): | |||
return PyCarlaNativePluginInfo | |||
def set_engine_callback(self, func): | |||
return # TODO | |||
def set_engine_option(self, option, value, valueStr): | |||
self.sendMsg(["set_engine_option", option, value, valueStr]) | |||
def set_file_callback(self, func): | |||
return # TODO | |||
def load_file(self, filename): | |||
return self.sendMsgAndSetError(["load_file", filename]) | |||
def load_project(self, filename): | |||
return self.sendMsgAndSetError(["load_project", filename]) | |||
def save_project(self, filename): | |||
return self.sendMsgAndSetError(["save_project", filename]) | |||
def patchbay_connect(self, groupIdA, portIdA, groupIdB, portIdB): | |||
return self.sendMsgAndSetError(["patchbay_connect", groupIdA, portIdA, groupIdB, portIdB]) | |||
def patchbay_disconnect(self, connectionId): | |||
return self.sendMsgAndSetError(["patchbay_disconnect", connectionId]) | |||
def patchbay_refresh(self, external): | |||
# don't send external param, never used in plugins | |||
return self.sendMsgAndSetError(["patchbay_refresh"]) | |||
def transport_play(self): | |||
self.sendMsg(["transport_play"]) | |||
def transport_pause(self): | |||
self.sendMsg(["transport_pause"]) | |||
def transport_relocate(self, frame): | |||
self.sendMsg(["transport_relocate"]) | |||
def get_current_transport_frame(self): | |||
return self.fTransportInfo['frame'] | |||
def get_transport_info(self): | |||
return self.fTransportInfo | |||
def add_plugin(self, btype, ptype, filename, name, label, uniqueId, extraPtr): | |||
return self.sendMsgAndSetError(["add_plugin", btype, ptype, filename, name, label, uniqueId]) | |||
def remove_plugin(self, pluginId): | |||
return self.sendMsgAndSetError(["remove_plugin", pluginId]) | |||
def remove_all_plugins(self): | |||
return self.sendMsgAndSetError(["remove_all_plugins"]) | |||
def rename_plugin(self, pluginId, newName): | |||
if self.sendMsg(["rename_plugin", pluginId, newName]): | |||
return newName | |||
self.fLastError = "Communication error with backend" | |||
return "" | |||
def clone_plugin(self, pluginId): | |||
return self.sendMsgAndSetError(["clone_plugin", pluginId]) | |||
def replace_plugin(self, pluginId): | |||
return self.sendMsgAndSetError(["replace_plugin", pluginId]) | |||
def switch_plugins(self, pluginIdA, pluginIdB): | |||
return self.sendMsgAndSetError(["switch_plugins", pluginIdA, pluginIdB]) | |||
def load_plugin_state(self, pluginId, filename): | |||
return self.sendMsgAndSetError(["load_plugin_state", pluginId, filename]) | |||
def save_plugin_state(self, pluginId, filename): | |||
return self.sendMsgAndSetError(["save_plugin_state", pluginId, filename]) | |||
def get_plugin_info(self, pluginId): | |||
return self.fPluginsInfo[pluginId].pluginInfo | |||
def get_audio_port_count_info(self, pluginId): | |||
return self.fPluginsInfo[pluginId].audioCountInfo | |||
def get_midi_port_count_info(self, pluginId): | |||
return self.fPluginsInfo[pluginId].midiCountInfo | |||
def get_parameter_count_info(self, pluginId): | |||
return self.fPluginsInfo[pluginId].parameterCountInfo | |||
def get_parameter_info(self, pluginId, parameterId): | |||
return self.fPluginsInfo[pluginId].parameterInfo[parameterId] | |||
def get_parameter_scalepoint_info(self, pluginId, parameterId, scalePointId): | |||
return PyCarlaScalePointInfo | |||
def get_parameter_data(self, pluginId, parameterId): | |||
return self.fPluginsInfo[pluginId].parameterData[parameterId] | |||
def get_parameter_ranges(self, pluginId, parameterId): | |||
return self.fPluginsInfo[pluginId].parameterRanges[parameterId] | |||
def get_midi_program_data(self, pluginId, midiProgramId): | |||
return self.fPluginsInfo[pluginId].midiProgramData[midiProgramId] | |||
def get_custom_data(self, pluginId, customDataId): | |||
return PyCustomData | |||
def get_chunk_data(self, pluginId): | |||
return "" | |||
def get_parameter_count(self, pluginId): | |||
return self.fPluginsInfo[pluginId].parameterCount | |||
def get_program_count(self, pluginId): | |||
return self.fPluginsInfo[pluginId].programCount | |||
def get_midi_program_count(self, pluginId): | |||
return self.fPluginsInfo[pluginId].midiProgramCount | |||
def get_custom_data_count(self, pluginId): | |||
return 0 | |||
def get_parameter_text(self, pluginId, parameterId): | |||
return "" | |||
def get_program_name(self, pluginId, programId): | |||
return self.fPluginsInfo[pluginId].programNames[programId] | |||
def get_midi_program_name(self, pluginId, midiProgramId): | |||
return self.fPluginsInfo[pluginId].midiProgramData[midiProgramId]['label'] | |||
def get_real_plugin_name(self, pluginId): | |||
return self.fPluginsInfo[pluginId].pluginRealName | |||
def get_current_program_index(self, pluginId): | |||
return self.fPluginsInfo[pluginId].programCurrent | |||
def get_current_midi_program_index(self, pluginId): | |||
return self.fPluginsInfo[pluginId].midiProgramCurrent | |||
def get_default_parameter_value(self, pluginId, parameterId): | |||
return self.fPluginsInfo[pluginId].parameterRanges[parameterId]['def'] | |||
def get_current_parameter_value(self, pluginId, parameterId): | |||
return self.fPluginsInfo[pluginId].parameterValues[parameterId] | |||
def get_internal_parameter_value(self, pluginId, parameterId): | |||
if parameterId == PARAMETER_NULL or parameterId <= PARAMETER_MAX: | |||
return 0.0 | |||
if parameterId < 0: | |||
return self.fPluginsInfo[pluginId].internalValues[abs(parameterId)-2] | |||
return self.fPluginsInfo[pluginId].parameterValues[parameterId] | |||
def get_input_peak_value(self, pluginId, isLeft): | |||
return self.fPluginsInfo[pluginId].peaks[0 if isLeft else 1] | |||
def get_output_peak_value(self, pluginId, isLeft): | |||
return self.fPluginsInfo[pluginId].peaks[2 if isLeft else 3] | |||
def set_option(self, pluginId, option, yesNo): | |||
self.sendMsg(["set_option", pluginId, option, yesNo]) | |||
def set_active(self, pluginId, onOff): | |||
self.sendMsg(["set_active", pluginId, onOff]) | |||
def set_drywet(self, pluginId, value): | |||
self.sendMsg(["set_drywet", pluginId, value]) | |||
def set_volume(self, pluginId, value): | |||
self.sendMsg(["set_volume", pluginId, value]) | |||
def set_balance_left(self, pluginId, value): | |||
self.sendMsg(["set_balance_left", pluginId, value]) | |||
def set_balance_right(self, pluginId, value): | |||
self.sendMsg(["set_balance_right", pluginId, value]) | |||
def set_panning(self, pluginId, value): | |||
self.sendMsg(["set_panning", pluginId, value]) | |||
def set_ctrl_channel(self, pluginId, channel): | |||
self.sendMsg(["set_ctrl_channel", pluginId, channel]) | |||
def set_parameter_value(self, pluginId, parameterId, value): | |||
self.sendMsg(["set_parameter_value", pluginId, parameterId, value]) | |||
def set_parameter_midi_channel(self, pluginId, parameterId, channel): | |||
self.sendMsg(["set_parameter_midi_channel", pluginId, parameterId, channel]) | |||
def set_parameter_midi_cc(self, pluginId, parameterId, cc): | |||
self.sendMsg(["set_parameter_midi_cc", pluginId, parameterId, cc]) | |||
def set_program(self, pluginId, programId): | |||
self.sendMsg(["set_program", pluginId, programId]) | |||
def set_midi_program(self, pluginId, midiProgramId): | |||
self.sendMsg(["set_midi_program", pluginId, midiProgramId]) | |||
def set_custom_data(self, pluginId, type_, key, value): | |||
self.sendMsg(["set_custom_data", pluginId, type_, key, value]) | |||
def set_chunk_data(self, pluginId, chunkData): | |||
self.sendMsg(["set_chunk_data", pluginId, chunkData]) | |||
def prepare_for_save(self, pluginId): | |||
self.sendMsg(["prepare_for_save", pluginId]) | |||
def reset_parameters(self, pluginId): | |||
self.sendMsg(["reset_parameters", pluginId]) | |||
def randomize_parameters(self, pluginId): | |||
self.sendMsg(["randomize_parameters", pluginId]) | |||
def send_midi_note(self, pluginId, channel, note, velocity): | |||
self.sendMsg(["send_midi_note", pluginId, channel, note, velocity]) | |||
def show_custom_ui(self, pluginId, yesNo): | |||
self.sendMsg(["show_custom_ui", pluginId, yesNo]) | |||
def get_buffer_size(self): | |||
return self.fBufferSize | |||
def get_sample_rate(self): | |||
return self.fSampleRate | |||
def get_last_error(self): | |||
return self.fLastError | |||
def get_host_osc_url_tcp(self): | |||
return self.fOscUrlTCP | |||
def get_host_osc_url_udp(self): | |||
return self.fOscUrlUDP | |||
# -------------------------------------------------------------------------------------------------------- | |||
def _add(self, pluginId): | |||
if len(self.fPluginsInfo) != pluginId: | |||
return | |||
info = PluginStoreInfo() | |||
info.pluginInfo = PyCarlaPluginInfo | |||
info.pluginRealName = "" | |||
info.internalValues = [0.0, 1.0, 1.0, -1.0, 1.0, 0.0, -1.0] | |||
info.audioCountInfo = PyCarlaPortCountInfo | |||
info.midiCountInfo = PyCarlaPortCountInfo | |||
info.parameterCount = 0 | |||
info.parameterCountInfo = PyCarlaPortCountInfo | |||
info.parameterInfo = [] | |||
info.parameterData = [] | |||
info.parameterRanges = [] | |||
info.parameterValues = [] | |||
info.programCount = 0 | |||
info.programCurrent = -1 | |||
info.programNames = [] | |||
info.midiProgramCount = 0 | |||
info.midiProgramCurrent = -1 | |||
info.midiProgramData = [] | |||
info.peaks = [0.0, 0.0, 0.0, 0.0] | |||
self.fPluginsInfo.append(info) | |||
def _set_pluginInfo(self, pluginId, info): | |||
self.fPluginsInfo[pluginId].pluginInfo = info | |||
def _set_pluginName(self, pluginId, name): | |||
self.fPluginsInfo[pluginId].pluginInfo['name'] = name | |||
def _set_pluginRealName(self, pluginId, realName): | |||
self.fPluginsInfo[pluginId].pluginRealName = realName | |||
def _set_internalValue(self, pluginId, paramIndex, value): | |||
if pluginId < len(self.fPluginsInfo) and PARAMETER_NULL > paramIndex > PARAMETER_MAX: | |||
self.fPluginsInfo[pluginId].internalValues[abs(paramIndex)-2] = float(value) | |||
def _set_audioCountInfo(self, pluginId, info): | |||
self.fPluginsInfo[pluginId].audioCountInfo = info | |||
def _set_midiCountInfo(self, pluginId, info): | |||
self.fPluginsInfo[pluginId].midiCountInfo = info | |||
def _set_parameterCountInfo(self, pluginId, count, info): | |||
self.fPluginsInfo[pluginId].parameterCount = count | |||
self.fPluginsInfo[pluginId].parameterCountInfo = info | |||
# clear | |||
self.fPluginsInfo[pluginId].parameterInfo = [] | |||
self.fPluginsInfo[pluginId].parameterData = [] | |||
self.fPluginsInfo[pluginId].parameterRanges = [] | |||
self.fPluginsInfo[pluginId].parameterValues = [] | |||
# add placeholders | |||
for x in range(count): | |||
self.fPluginsInfo[pluginId].parameterInfo.append(PyCarlaParameterInfo) | |||
self.fPluginsInfo[pluginId].parameterData.append(PyParameterData) | |||
self.fPluginsInfo[pluginId].parameterRanges.append(PyParameterRanges) | |||
self.fPluginsInfo[pluginId].parameterValues.append(0.0) | |||
def _set_programCount(self, pluginId, count): | |||
self.fPluginsInfo[pluginId].programCount = count | |||
# clear | |||
self.fPluginsInfo[pluginId].programNames = [] | |||
# add placeholders | |||
for x in range(count): | |||
self.fPluginsInfo[pluginId].programNames.append("") | |||
def _set_midiProgramCount(self, pluginId, count): | |||
self.fPluginsInfo[pluginId].midiProgramCount = count | |||
# clear | |||
self.fPluginsInfo[pluginId].midiProgramData = [] | |||
# add placeholders | |||
for x in range(count): | |||
self.fPluginsInfo[pluginId].midiProgramData.append(PyMidiProgramData) | |||
def _set_parameterInfo(self, pluginId, paramIndex, info): | |||
if pluginId < len(self.fPluginsInfo) and paramIndex < self.fPluginsInfo[pluginId].parameterCount: | |||
self.fPluginsInfo[pluginId].parameterInfo[paramIndex] = info | |||
def _set_parameterData(self, pluginId, paramIndex, data): | |||
if pluginId < len(self.fPluginsInfo) and paramIndex < self.fPluginsInfo[pluginId].parameterCount: | |||
self.fPluginsInfo[pluginId].parameterData[paramIndex] = data | |||
def _set_parameterRanges(self, pluginId, paramIndex, ranges): | |||
if pluginId < len(self.fPluginsInfo) and paramIndex < self.fPluginsInfo[pluginId].parameterCount: | |||
self.fPluginsInfo[pluginId].parameterRanges[paramIndex] = ranges | |||
def _set_parameterValue(self, pluginId, paramIndex, value): | |||
if pluginId < len(self.fPluginsInfo) and paramIndex < self.fPluginsInfo[pluginId].parameterCount: | |||
self.fPluginsInfo[pluginId].parameterValues[paramIndex] = value | |||
def _set_parameterDefault(self, pluginId, paramIndex, value): | |||
if pluginId < len(self.fPluginsInfo) and paramIndex < self.fPluginsInfo[pluginId].parameterCount: | |||
self.fPluginsInfo[pluginId].parameterRanges[paramIndex]['def'] = value | |||
def _set_parameterMidiChannel(self, pluginId, paramIndex, channel): | |||
if pluginId < len(self.fPluginsInfo) and paramIndex < self.fPluginsInfo[pluginId].parameterCount: | |||
self.fPluginsInfo[pluginId].parameterData[paramIndex]['midiChannel'] = channel | |||
def _set_parameterMidiCC(self, pluginId, paramIndex, cc): | |||
if pluginId < len(self.fPluginsInfo) and paramIndex < self.fPluginsInfo[pluginId].parameterCount: | |||
self.fPluginsInfo[pluginId].parameterData[paramIndex]['midiCC'] = cc | |||
def _set_currentProgram(self, pluginId, pIndex): | |||
self.fPluginsInfo[pluginId].programCurrent = pIndex | |||
def _set_currentMidiProgram(self, pluginId, mpIndex): | |||
self.fPluginsInfo[pluginId].midiProgramCurrent = mpIndex | |||
def _set_programName(self, pluginId, pIndex, name): | |||
if pIndex < self.fPluginsInfo[pluginId].programCount: | |||
self.fPluginsInfo[pluginId].programNames[pIndex] = name | |||
def _set_midiProgramData(self, pluginId, mpIndex, data): | |||
if mpIndex < self.fPluginsInfo[pluginId].midiProgramCount: | |||
self.fPluginsInfo[pluginId].midiProgramData[mpIndex] = data | |||
def _set_peaks(self, pluginId, in1, in2, out1, out2): | |||
self.fPluginsInfo[pluginId].peaks = [in1, in2, out1, out2] | |||
# ------------------------------------------------------------------------------------------------------------ |
@@ -22,208 +22,22 @@ | |||
from carla_host import * | |||
from externalui import ExternalUI | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Helper object | |||
class PluginStoreInfo(object): | |||
__slots__ = [ | |||
'pluginInfo', | |||
'pluginRealName', | |||
'audioCountInfo', | |||
'midiCountInfo', | |||
'parameterCount', | |||
'parameterCountInfo', | |||
'parameterInfoS', | |||
'parameterDataS', | |||
'parameterRangeS', | |||
'parameterValueS', | |||
'parameterValueInt', | |||
'programCount', | |||
'programCurrent', | |||
'programNameS', | |||
'midiProgramCount', | |||
'midiProgramCurrent', | |||
'midiProgramDataS', | |||
'peaks' | |||
] | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Host Plugin object | |||
class PluginHost(object): | |||
class PluginHost(CarlaHostPlugin): | |||
def __init__(self, sampleRate): | |||
object.__init__(self) | |||
CarlaHostPlugin.__init__(self) | |||
self.fSupportedFileExts = "" | |||
self.fBufferSize = 0 | |||
self.fSampleRate = sampleRate | |||
self.fLastError = "" | |||
self.fIsRunning = True | |||
self.fPluginsInfo = [] | |||
if WINDOWS: | |||
self.msvcrt = cdll.msvcrt | |||
self.msvcrt._putenv.argtypes = [c_char_p] | |||
self.msvcrt._putenv.restype = None | |||
else: | |||
self.msvcrt = None | |||
def _add(self, pluginId): | |||
if len(self.fPluginsInfo) != pluginId: | |||
return | |||
info = PluginStoreInfo() | |||
info.pluginInfo = PyCarlaPluginInfo | |||
info.pluginRealName = "" | |||
info.audioCountInfo = PyCarlaPortCountInfo | |||
info.midiCountInfo = PyCarlaPortCountInfo | |||
info.parameterCount = 0 | |||
info.parameterCountInfo = PyCarlaPortCountInfo | |||
info.parameterInfoS = [] | |||
info.parameterDataS = [] | |||
info.parameterRangeS = [] | |||
info.parameterValueS = [] | |||
info.parameterValueInt = [0.0, 1.0, 1.0, -1.0, 1.0, 0.0, -1.0] | |||
info.programCount = 0 | |||
info.programCurrent = -1 | |||
info.programNameS = [] | |||
info.midiProgramCount = 0 | |||
info.midiProgramCurrent = -1 | |||
info.midiProgramDataS = [] | |||
info.peaks = [0.0, 0.0, 0.0, 0.0] | |||
self.fPluginsInfo.append(info) | |||
def _set_pluginInfo(self, pluginId, info): | |||
self.fPluginsInfo[pluginId].pluginInfo = info | |||
def _set_pluginName(self, pluginId, name): | |||
self.fPluginsInfo[pluginId].pluginInfo['name'] = name | |||
def _set_pluginRealName(self, pluginId, realName): | |||
self.fPluginsInfo[pluginId].pluginRealName = realName | |||
def _set_audioCountInfo(self, pluginId, info): | |||
self.fPluginsInfo[pluginId].audioCountInfo = info | |||
def _set_midiCountInfo(self, pluginId, info): | |||
self.fPluginsInfo[pluginId].midiCountInfo = info | |||
def _set_parameterCountInfo(self, pluginId, count, info): | |||
self.fPluginsInfo[pluginId].parameterCount = count | |||
self.fPluginsInfo[pluginId].parameterCountInfo = info | |||
# clear | |||
self.fPluginsInfo[pluginId].parameterInfoS = [] | |||
self.fPluginsInfo[pluginId].parameterDataS = [] | |||
self.fPluginsInfo[pluginId].parameterRangeS = [] | |||
self.fPluginsInfo[pluginId].parameterValueS = [] | |||
# add placeholders | |||
for x in range(count): | |||
self.fPluginsInfo[pluginId].parameterInfoS.append(PyCarlaParameterInfo) | |||
self.fPluginsInfo[pluginId].parameterDataS.append(PyParameterData) | |||
self.fPluginsInfo[pluginId].parameterRangeS.append(PyParameterRanges) | |||
self.fPluginsInfo[pluginId].parameterValueS.append(0.0) | |||
def _set_programCount(self, pluginId, count): | |||
self.fPluginsInfo[pluginId].programCount = count | |||
# clear | |||
self.fPluginsInfo[pluginId].programNameS = [] | |||
# add placeholders | |||
for x in range(count): | |||
self.fPluginsInfo[pluginId].programNameS.append("") | |||
def _set_midiProgramCount(self, pluginId, count): | |||
self.fPluginsInfo[pluginId].midiProgramCount = count | |||
# clear | |||
self.fPluginsInfo[pluginId].midiProgramDataS = [] | |||
# add placeholders | |||
for x in range(count): | |||
self.fPluginsInfo[pluginId].midiProgramDataS.append(PyMidiProgramData) | |||
def _set_parameterInfoS(self, pluginId, paramIndex, info): | |||
if pluginId < len(self.fPluginsInfo) and paramIndex < self.fPluginsInfo[pluginId].parameterCount: | |||
self.fPluginsInfo[pluginId].parameterInfoS[paramIndex] = info | |||
def _set_parameterDataS(self, pluginId, paramIndex, data): | |||
if pluginId < len(self.fPluginsInfo) and paramIndex < self.fPluginsInfo[pluginId].parameterCount: | |||
self.fPluginsInfo[pluginId].parameterDataS[paramIndex] = data | |||
def _set_parameterRangeS(self, pluginId, paramIndex, ranges): | |||
if pluginId < len(self.fPluginsInfo) and paramIndex < self.fPluginsInfo[pluginId].parameterCount: | |||
self.fPluginsInfo[pluginId].parameterRangeS[paramIndex] = ranges | |||
def _set_parameterValueS(self, pluginId, paramIndex, value): | |||
if pluginId < len(self.fPluginsInfo) and paramIndex < self.fPluginsInfo[pluginId].parameterCount: | |||
self.fPluginsInfo[pluginId].parameterValueS[paramIndex] = value | |||
def _set_parameterValueInt(self, pluginId, paramIndex, value): | |||
if pluginId < len(self.fPluginsInfo) and PARAMETER_NULL > paramIndex > PARAMETER_MAX: | |||
self.fPluginsInfo[pluginId].parameterValueInt[abs(paramIndex)-2] = float(value) | |||
def _set_parameterDefault(self, pluginId, paramIndex, value): | |||
if pluginId < len(self.fPluginsInfo) and paramIndex < self.fPluginsInfo[pluginId].parameterCount: | |||
self.fPluginsInfo[pluginId].parameterRangeS[paramIndex]['def'] = value | |||
def _set_parameterMidiChannel(self, pluginId, paramIndex, channel): | |||
if pluginId < len(self.fPluginsInfo) and paramIndex < self.fPluginsInfo[pluginId].parameterCount: | |||
self.fPluginsInfo[pluginId].parameterDataS[paramIndex]['midiChannel'] = channel | |||
def _set_parameterMidiCC(self, pluginId, paramIndex, cc): | |||
if pluginId < len(self.fPluginsInfo) and paramIndex < self.fPluginsInfo[pluginId].parameterCount: | |||
self.fPluginsInfo[pluginId].parameterDataS[paramIndex]['midiCC'] = cc | |||
def _set_currentProgram(self, pluginId, pIndex): | |||
self.fPluginsInfo[pluginId].programCurrent = pIndex | |||
def _set_currentMidiProgram(self, pluginId, mpIndex): | |||
self.fPluginsInfo[pluginId].midiProgramCurrent = mpIndex | |||
def _set_programNameS(self, pluginId, pIndex, name): | |||
if pIndex < self.fPluginsInfo[pluginId].programCount: | |||
self.fPluginsInfo[pluginId].programNameS[pIndex] = name | |||
def _set_midiProgramDataS(self, pluginId, mpIndex, data): | |||
if mpIndex < self.fPluginsInfo[pluginId].midiProgramCount: | |||
self.fPluginsInfo[pluginId].midiProgramDataS[mpIndex] = data | |||
def _set_peaks(self, pluginId, in1, in2, out1, out2): | |||
self.fPluginsInfo[pluginId].peaks = [in1, in2, out1, out2] | |||
# ------------------------------------------------------------------- | |||
def get_complete_license_text(self): | |||
return "" | |||
def get_supported_file_extensions(self): | |||
return self.fSupportedFileExts | |||
# ------------------------------------------------------------------- | |||
def get_engine_driver_count(self): | |||
return 1 | |||
def get_engine_driver_name(self, index): | |||
return "Plugin" | |||
def get_engine_driver_device_names(self, index): | |||
return [] | |||
def get_engine_driver_device_info(self, index, name): | |||
return PyEngineDriverDeviceInfo | |||
self.fSampleRate = sampleRate | |||
# ------------------------------------------------------------------- | |||
def get_internal_plugin_count(self): | |||
return 0 | |||
def get_internal_plugin_info(self, index): | |||
return None | |||
def sendMsg(self, lines): | |||
# FIXME | |||
gCarla.gui.send(lines) | |||
return True | |||
# ------------------------------------------------------------------- | |||
@@ -244,297 +58,7 @@ class PluginHost(object): | |||
return self.fIsRunning | |||
def set_engine_about_to_close(self): | |||
pass | |||
def set_engine_callback(self, func): | |||
pass | |||
def set_engine_option(self, option, value, valueStr): | |||
gCarla.gui.send(["set_engine_option", option, value, valueStr]) | |||
def set_file_callback(self, func): | |||
pass | |||
# ------------------------------------------------------------------- | |||
def set_file_callback(self, func): | |||
pass | |||
def load_file(self, filename): | |||
gCarla.gui.send(["load_file", filename]) | |||
return True | |||
def load_project(self, filename): | |||
gCarla.gui.send(["load_project", filename]) | |||
return True | |||
def save_project(self, filename): | |||
gCarla.gui.send(["save_project", filename]) | |||
return True | |||
# ------------------------------------------------------------------- | |||
def patchbay_connect(self, groupIdA, portIdA, groupIdB, portIdB): | |||
gCarla.gui.send(["patchbay_connect", groupIdA, portIdA, groupIdB, portIdB]) | |||
return True | |||
def patchbay_disconnect(self, connectionId): | |||
gCarla.gui.send(["patchbay_disconnect", connectionId]) | |||
return True | |||
def patchbay_refresh(self, external): | |||
# don't send external param, never used in plugins | |||
gCarla.gui.send(["patchbay_refresh"]) | |||
return True | |||
# ------------------------------------------------------------------- | |||
def transport_play(self): | |||
gCarla.gui.send(["transport_play"]) | |||
def transport_pause(self): | |||
gCarla.gui.send(["transport_pause"]) | |||
def transport_relocate(self, frame): | |||
gCarla.gui.send(["transport_relocate"]) | |||
def get_current_transport_frame(self): | |||
return 0 | |||
def get_transport_info(self): | |||
return PyCarlaTransportInfo | |||
# ------------------------------------------------------------------- | |||
def add_plugin(self, btype, ptype, filename, name, label, uniqueId, extraPtr): | |||
gCarla.gui.send(["add_plugin", btype, ptype, filename, name, label, uniqueId]) | |||
return True | |||
def remove_plugin(self, pluginId): | |||
gCarla.gui.send(["remove_plugin", pluginId]) | |||
return True | |||
def remove_all_plugins(self): | |||
gCarla.gui.send(["remove_all_plugins"]) | |||
return True | |||
def rename_plugin(self, pluginId, newName): | |||
gCarla.gui.send(["rename_plugin", pluginId, newName]) | |||
return newName | |||
def clone_plugin(self, pluginId): | |||
gCarla.gui.send(["clone_plugin", pluginId]) | |||
return True | |||
def replace_plugin(self, pluginId): | |||
gCarla.gui.send(["replace_plugin", pluginId]) | |||
return True | |||
def switch_plugins(self, pluginIdA, pluginIdB): | |||
gCarla.gui.send(["switch_plugins", pluginIdA, pluginIdB]) | |||
return True | |||
# ------------------------------------------------------------------- | |||
def load_plugin_state(self, pluginId, filename): | |||
gCarla.gui.send(["load_plugin_state", pluginId, filename]) | |||
return True | |||
def save_plugin_state(self, pluginId, filename): | |||
gCarla.gui.send(["save_plugin_state", pluginId, filename]) | |||
return True | |||
# ------------------------------------------------------------------- | |||
def get_plugin_info(self, pluginId): | |||
return self.fPluginsInfo[pluginId].pluginInfo | |||
def get_audio_port_count_info(self, pluginId): | |||
return self.fPluginsInfo[pluginId].audioCountInfo | |||
def get_midi_port_count_info(self, pluginId): | |||
return self.fPluginsInfo[pluginId].midiCountInfo | |||
def get_parameter_count_info(self, pluginId): | |||
return self.fPluginsInfo[pluginId].parameterCountInfo | |||
def get_parameter_info(self, pluginId, parameterId): | |||
return self.fPluginsInfo[pluginId].parameterInfoS[parameterId] | |||
def get_parameter_scalepoint_info(self, pluginId, parameterId, scalePointId): | |||
return PyCarlaScalePointInfo | |||
# ------------------------------------------------------------------- | |||
def get_parameter_data(self, pluginId, parameterId): | |||
return self.fPluginsInfo[pluginId].parameterDataS[parameterId] | |||
def get_parameter_ranges(self, pluginId, parameterId): | |||
return self.fPluginsInfo[pluginId].parameterRangeS[parameterId] | |||
def get_midi_program_data(self, pluginId, midiProgramId): | |||
return self.fPluginsInfo[pluginId].midiProgramDataS[midiProgramId] | |||
def get_custom_data(self, pluginId, customDataId): | |||
return PyCustomData | |||
def get_chunk_data(self, pluginId): | |||
return "" | |||
# ------------------------------------------------------------------- | |||
def get_parameter_count(self, pluginId): | |||
return self.fPluginsInfo[pluginId].parameterCount | |||
def get_program_count(self, pluginId): | |||
return self.fPluginsInfo[pluginId].programCount | |||
def get_midi_program_count(self, pluginId): | |||
return self.fPluginsInfo[pluginId].midiProgramCount | |||
def get_custom_data_count(self, pluginId): | |||
return 0 | |||
# ------------------------------------------------------------------- | |||
def get_parameter_text(self, pluginId, parameterId): | |||
return "" | |||
def get_program_name(self, pluginId, programId): | |||
return self.fPluginsInfo[pluginId].programNameS[programId] | |||
def get_midi_program_name(self, pluginId, midiProgramId): | |||
return self.fPluginsInfo[pluginId].midiProgramDataS[midiProgramId]['label'] | |||
def get_real_plugin_name(self, pluginId): | |||
return self.fPluginsInfo[pluginId].pluginRealName | |||
# ------------------------------------------------------------------- | |||
def get_current_program_index(self, pluginId): | |||
return self.fPluginsInfo[pluginId].programCurrent | |||
def get_current_midi_program_index(self, pluginId): | |||
return self.fPluginsInfo[pluginId].midiProgramCurrent | |||
def get_default_parameter_value(self, pluginId, parameterId): | |||
return self.fPluginsInfo[pluginId].parameterRangeS[parameterId]['def'] | |||
def get_current_parameter_value(self, pluginId, parameterId): | |||
return self.fPluginsInfo[pluginId].parameterValueS[parameterId] | |||
def get_internal_parameter_value(self, pluginId, parameterId): | |||
if parameterId == PARAMETER_NULL or parameterId <= PARAMETER_MAX: | |||
return 0.0 | |||
if parameterId < 0: | |||
return self.fPluginsInfo[pluginId].parameterValueInt[abs(parameterId)-2] | |||
return self.fPluginsInfo[pluginId].parameterValueS[parameterId] | |||
def get_input_peak_value(self, pluginId, isLeft): | |||
return self.fPluginsInfo[pluginId].peaks[0 if isLeft else 1] | |||
def get_output_peak_value(self, pluginId, isLeft): | |||
return self.fPluginsInfo[pluginId].peaks[2 if isLeft else 3] | |||
# ------------------------------------------------------------------- | |||
def set_option(self, pluginId, option, yesNo): | |||
gCarla.gui.send(["set_option", pluginId, option, yesNo]) | |||
def set_active(self, pluginId, onOff): | |||
gCarla.gui.send(["set_active", pluginId, onOff]) | |||
def set_drywet(self, pluginId, value): | |||
gCarla.gui.send(["set_drywet", pluginId, value]) | |||
def set_volume(self, pluginId, value): | |||
gCarla.gui.send(["set_volume", pluginId, value]) | |||
def set_balance_left(self, pluginId, value): | |||
gCarla.gui.send(["set_balance_left", pluginId, value]) | |||
def set_balance_right(self, pluginId, value): | |||
gCarla.gui.send(["set_balance_right", pluginId, value]) | |||
def set_panning(self, pluginId, value): | |||
gCarla.gui.send(["set_panning", pluginId, value]) | |||
def set_ctrl_channel(self, pluginId, channel): | |||
gCarla.gui.send(["set_ctrl_channel", pluginId, channel]) | |||
# ------------------------------------------------------------------- | |||
def set_parameter_value(self, pluginId, parameterId, value): | |||
gCarla.gui.send(["set_parameter_value", pluginId, parameterId, value]) | |||
def set_parameter_midi_channel(self, pluginId, parameterId, channel): | |||
gCarla.gui.send(["set_parameter_midi_channel", pluginId, parameterId, channel]) | |||
def set_parameter_midi_cc(self, pluginId, parameterId, cc): | |||
gCarla.gui.send(["set_parameter_midi_cc", pluginId, parameterId, cc]) | |||
def set_program(self, pluginId, programId): | |||
gCarla.gui.send(["set_program", pluginId, programId]) | |||
def set_midi_program(self, pluginId, midiProgramId): | |||
gCarla.gui.send(["set_midi_program", pluginId, midiProgramId]) | |||
def set_custom_data(self, pluginId, type_, key, value): | |||
gCarla.gui.send(["set_custom_data", pluginId, type_, key, value]) | |||
def set_chunk_data(self, pluginId, chunkData): | |||
gCarla.gui.send(["set_chunk_data", pluginId, chunkData]) | |||
# ------------------------------------------------------------------- | |||
def prepare_for_save(self, pluginId): | |||
gCarla.gui.send(["prepare_for_save", pluginId]) | |||
def reset_parameters(self, pluginId): | |||
gCarla.gui.send(["reset_parameters", pluginId]) | |||
def randomize_parameters(self, pluginId): | |||
gCarla.gui.send(["randomize_parameters", pluginId]) | |||
def send_midi_note(self, pluginId, channel, note, velocity): | |||
gCarla.gui.send(["send_midi_note", pluginId, channel, note, velocity]) | |||
def show_custom_ui(self, pluginId, yesNo): | |||
gCarla.gui.send(["show_custom_ui", pluginId, yesNo]) | |||
# ------------------------------------------------------------------- | |||
def get_buffer_size(self): | |||
return self.fBufferSize | |||
def get_sample_rate(self): | |||
return self.fSampleRate | |||
def get_last_error(self): | |||
return self.fLastError | |||
def get_host_osc_url_tcp(self): | |||
return "" | |||
def get_host_osc_url_udp(self): | |||
return "" | |||
# extra | |||
def setenv(self, key, value): | |||
environ[key] = value | |||
if WINDOWS: | |||
keyvalue = "%s=%s" % (key, value) | |||
self.msvcrt._putenv(keyvalue.encode("utf-8")) | |||
# extra | |||
def unsetenv(self, key): | |||
environ.pop(key) | |||
if WINDOWS: | |||
keyrm = "%s=" % key | |||
self.msvcrt._putenv(keyrm.encode("utf-8")) | |||
return | |||
# ------------------------------------------------------------------------------------------------------------ | |||
# Main Window | |||