| 
							- #!/usr/bin/env python3
 - # -*- coding: utf-8 -*-
 - 
 - # Carla Backend code (Web stuff)
 - # Copyright (C) 2018 Filipe Coelho <falktx@falktx.com>
 - #
 - # This program 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 2 of
 - # the License, or 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.
 - #
 - # For a full copy of the GNU General Public License see the doc/GPL.txt file.
 - 
 - # ---------------------------------------------------------------------------------------------------------------------
 - # Imports (Global)
 - 
 - import requests
 - from websocket import WebSocket, WebSocketConnectionClosedException
 - 
 - # ---------------------------------------------------------------------------------------------------------------------
 - # Imports (Custom)
 - 
 - from carla_backend_qt import *
 - 
 - import os
 - from time import sleep
 - 
 - # ---------------------------------------------------------------------------------------------------------------------
 - # Carla Host object for connecting to the REST API backend
 - 
 - class CarlaHostQtWeb(CarlaHostQtNull):
 -     def __init__(self):
 -         CarlaHostQtNull.__init__(self)
 - 
 -         self.host = "localhost"
 -         self.port = 2228
 - 
 -         self.baseurl = "http://{}:{}".format(self.host, self.port)
 - 
 -         self.socket = WebSocket()
 -         self.socket.connect("ws://{}:{}/ws".format(self.host, self.port), timeout=1)
 - 
 -         self.isRemote = True
 -         self.isRunning = True
 -         self.peaks = []
 - 
 -         for i in range(99):
 -             self.peaks.append((0.0, 0.0, 0.0, 0.0))
 - 
 -     def get_engine_driver_count(self):
 -         return int(requests.get("{}/get_engine_driver_count".format(self.baseurl)).text)
 - 
 -     def get_engine_driver_name(self, index):
 -         return requests.get("{}/get_engine_driver_name".format(self.baseurl), params={
 -             'index': index,
 -         }).text
 - 
 -     def get_engine_driver_device_names(self, index):
 -         return requests.get("{}/get_engine_driver_device_names".format(self.baseurl), params={
 -             'index': index,
 -         }).text.split("\n")
 - 
 -     def get_engine_driver_device_info(self, index, name):
 -         return requests.get("{}/get_engine_driver_device_info".format(self.baseurl), params={
 -             'index': index,
 -             'name': name,
 -         }).json()
 - 
 -     def engine_init(self, driverName, clientName):
 -         return bool(int(requests.get("{}/engine_init".format(self.baseurl), params={
 -             'driverName': driverName,
 -             'clientName': clientName,
 -         }).text))
 - 
 -     def engine_close(self):
 -         return bool(int(requests.get("{}/engine_close".format(self.baseurl)).text))
 - 
 -     def engine_idle(self):
 -         if not self.isRunning:
 -             return
 - 
 -         while True:
 -             try:
 -                 line = self.socket.recv().strip()
 -             except WebSocketConnectionClosedException:
 -                 self.isRunning = False
 -                 if self.fEngineCallback is None:
 -                     self.fEngineCallback(None, ENGINE_CALLBACK_QUIT, 0, 0, 0, 0.0, "")
 -                 return
 - 
 -             if line == "Keep-Alive":
 -                 return
 - 
 -             elif line.startswith("Carla: "):
 -                 if self.fEngineCallback is None:
 -                     continue
 - 
 -                 # split values from line
 -                 action, pluginId, value1, value2, value3, valueStr = line[7:].split(" ",5)
 - 
 -                 # convert to proper types
 -                 action   = int(action)
 -                 pluginId = int(pluginId)
 -                 value1   = int(value1)
 -                 value2   = int(value2)
 -                 value3   = float(value3)
 - 
 -                 # pass to callback
 -                 self.fEngineCallback(None, action, pluginId, value1, value2, value3, valueStr)
 - 
 -             elif line.startswith("Peaks: "):
 -                 # split values from line
 -                 pluginId, value1, value2, value3, value4 = line[7:].split(" ",5)
 - 
 -                 # convert to proper types
 -                 pluginId = int(pluginId)
 -                 value1   = float(value1)
 -                 value2   = float(value2)
 -                 value3   = float(value3)
 -                 value4   = float(value4)
 - 
 -                 # store peaks
 -                 self.peaks[pluginId] = (value1, value2, value3, value4)
 - 
 -     def is_engine_running(self):
 -         if not self.isRunning:
 -             return False
 - 
 -         try:
 -             return bool(int(requests.get("{}/is_engine_running".format(self.baseurl)).text))
 -         except requests.exceptions.ConnectionError:
 -             if self.fEngineCallback is None:
 -                 self.fEngineCallback(None, ENGINE_CALLBACK_QUIT, 0, 0, 0, 0.0, "")
 - 
 -     def set_engine_about_to_close(self):
 -         return bool(int(requests.get("{}/set_engine_about_to_close".format(self.baseurl)).text))
 - 
 -     def set_engine_option(self, option, value, valueStr):
 -         requests.get("{}/set_engine_option".format(self.baseurl), params={
 -             'option': option,
 -             'value': value,
 -             'valueStr': valueStr,
 -         })
 - 
 -     def load_file(self, filename):
 -         return bool(int(requests.get("{}/load_file".format(self.baseurl), params={
 -             'filename': filename,
 -         }).text))
 - 
 -     def load_project(self, filename):
 -         return bool(int(requests.get("{}/load_project".format(self.baseurl), params={
 -             'filename': filename,
 -         }).text))
 - 
 -     def save_project(self, filename):
 -         return bool(int(requests.get("{}/save_project".format(self.baseurl), params={
 -             'filename': filename,
 -         }).text))
 - 
 -     def patchbay_connect(self, groupIdA, portIdA, groupIdB, portIdB):
 -         return bool(int(requests.get("{}/patchbay_connect".format(self.baseurl), params={
 -             'groupIdA': groupIdA,
 -             'portIdA': portIdA,
 -             'groupIdB': groupIdB,
 -             'portIdB': portIdB,
 -         }).text))
 - 
 -     def patchbay_disconnect(self, connectionId):
 -         return bool(int(requests.get("{}/patchbay_disconnect".format(self.baseurl), params={
 -             'connectionId': connectionId,
 -         }).text))
 - 
 -     def patchbay_refresh(self, external):
 -         return bool(int(requests.get("{}/patchbay_refresh".format(self.baseurl), params={
 -             'external': int(external),
 -         }).text))
 - 
 -     def transport_play(self):
 -         requests.get("{}/transport_play".format(self.baseurl))
 - 
 -     def transport_pause(self):
 -         requests.get("{}/transport_pause".format(self.baseurl))
 - 
 -     def transport_bpm(self, bpm):
 -         requests.get("{}/transport_bpm".format(self.baseurl), params={
 -             'bpm': bpm,
 -         })
 - 
 -     def transport_relocate(self, frame):
 -         requests.get("{}/transport_relocate".format(self.baseurl), params={
 -             'frame': frame,
 -         })
 - 
 -     def get_current_transport_frame(self):
 -         return int(requests.get("{}/get_current_transport_frame".format(self.baseurl)).text)
 - 
 -     def get_transport_info(self):
 -         if self.isRunning:
 -             try:
 -                 return requests.get("{}/get_transport_info".format(self.baseurl)).json()
 -             except requests.exceptions.ConnectionError:
 -                 if self.fEngineCallback is None:
 -                     self.fEngineCallback(None, ENGINE_CALLBACK_QUIT, 0, 0, 0, 0.0, "")
 -         return PyCarlaTransportInfo()
 - 
 -     def get_current_plugin_count(self):
 -         return int(requests.get("{}/get_current_plugin_count".format(self.baseurl)).text)
 - 
 -     def get_max_plugin_number(self):
 -         return int(requests.get("{}/get_max_plugin_number".format(self.baseurl)).text)
 - 
 -     def add_plugin(self, btype, ptype, filename, name, label, uniqueId, extraPtr, options):
 -         return bool(int(requests.get("{}/add_plugin".format(self.baseurl), params={
 -             'btype': btype,
 -             'ptype': ptype,
 -             'filename': filename,
 -             'name': name,
 -             'label': label,
 -             'uniqueId': uniqueId,
 -             'options': options,
 -         }).text))
 - 
 -     def remove_plugin(self, pluginId):
 -         return bool(int(requests.get("{}/remove_plugin".format(self.baseurl), params={
 -             'filename': pluginId,
 -         }).text))
 - 
 -     def remove_all_plugins(self):
 -         return bool(int(requests.get("{}/remove_all_plugins".format(self.baseurl)).text))
 - 
 -     def rename_plugin(self, pluginId, newName):
 -         return requests.get("{}/rename_plugin".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'newName': newName,
 -         }).text
 - 
 -     def clone_plugin(self, pluginId):
 -         return bool(int(requests.get("{}/clone_plugin".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -         }).text))
 - 
 -     def replace_plugin(self, pluginId):
 -         return bool(int(requests.get("{}/replace_plugin".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -         }).text))
 - 
 -     def switch_plugins(self, pluginIdA, pluginIdB):
 -         return bool(int(requests.get("{}/switch_plugins".format(self.baseurl), params={
 -             'pluginIdA': pluginIdA,
 -             'pluginIdB': pluginIdB,
 -         }).text))
 - 
 -     def load_plugin_state(self, pluginId, filename):
 -         return bool(int(requests.get("{}/load_plugin_state".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'filename': filename,
 -         }).text))
 - 
 -     def save_plugin_state(self, pluginId, filename):
 -         return bool(int(requests.get("{}/save_plugin_state".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'filename': filename,
 -         }).text))
 - 
 -     def export_plugin_lv2(self, pluginId, lv2path):
 -         return bool(int(requests.get("{}/export_plugin_lv2".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'lv2path': lv2path,
 -         }).text))
 - 
 -     def get_plugin_info(self, pluginId):
 -         return requests.get("{}/get_plugin_info".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -         }).json()
 - 
 -     def get_audio_port_count_info(self, pluginId):
 -         return requests.get("{}/get_audio_port_count_info".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -         }).json()
 - 
 -     def get_midi_port_count_info(self, pluginId):
 -         return requests.get("{}/get_midi_port_count_info".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -         }).json()
 - 
 -     def get_parameter_count_info(self, pluginId):
 -         return requests.get("{}/get_parameter_count_info".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -         }).json()
 - 
 -     def get_parameter_info(self, pluginId, parameterId):
 -         return requests.get("{}/get_parameter_info".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'parameterId': parameterId,
 -         }).json()
 - 
 -     def get_parameter_scalepoint_info(self, pluginId, parameterId, scalePointId):
 -         return requests.get("{}/get_parameter_scalepoint_info".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'parameterId': parameterId,
 -             'scalePointId': scalePointId,
 -         }).json()
 - 
 -     def get_parameter_data(self, pluginId, parameterId):
 -         return requests.get("{}/get_parameter_data".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'parameterId': parameterId,
 -         }).json()
 - 
 -     def get_parameter_ranges(self, pluginId, parameterId):
 -         return requests.get("{}/get_parameter_ranges".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'parameterId': parameterId,
 -         }).json()
 - 
 -     def get_midi_program_data(self, pluginId, midiProgramId):
 -         return requests.get("{}/get_midi_program_data".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'midiProgramId': midiProgramId,
 -         }).json()
 - 
 -     def get_custom_data(self, pluginId, customDataId):
 -         return requests.get("{}/get_custom_data".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'customDataId': customDataId,
 -         }).json()
 - 
 -     def get_custom_data_value(self, pluginId, type_, key):
 -         return requests.get("{}/get_custom_data_value".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'type_': type_,
 -             'key': key,
 -         }).text
 - 
 -     def get_chunk_data(self, pluginId):
 -         return requests.get("{}/get_chunk_data".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -         }).text
 - 
 -     def get_parameter_count(self, pluginId):
 -         return int(requests.get("{}/get_parameter_count".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -         }).text)
 - 
 -     def get_program_count(self, pluginId):
 -         return int(requests.get("{}/get_program_count".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -         }).text)
 - 
 -     def get_midi_program_count(self, pluginId):
 -         return int(requests.get("{}/get_midi_program_count".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -         }).text)
 - 
 -     def get_custom_data_count(self, pluginId):
 -         return int(requests.get("{}/get_custom_data_count".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -         }).text)
 - 
 -     def get_parameter_text(self, pluginId, parameterId):
 -         return requests.get("{}/get_parameter_text".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'parameterId': parameterId,
 -         }).text
 - 
 -     def get_program_name(self, pluginId, programId):
 -         return requests.get("{}/get_program_name".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'programId': programId,
 -         }).text
 - 
 -     def get_midi_program_name(self, pluginId, midiProgramId):
 -         return requests.get("{}/get_midi_program_name".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'midiProgramId': midiProgramId,
 -         }).text
 - 
 -     def get_real_plugin_name(self, pluginId):
 -         return requests.get("{}/get_real_plugin_name".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -         }).text
 - 
 -     def get_current_program_index(self, pluginId):
 -         return int(requests.get("{}/get_custom_data_count".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -         }).text)
 - 
 -     def get_current_midi_program_index(self, pluginId):
 -         return int(requests.get("{}/get_custom_data_count".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -         }).text)
 - 
 -     def get_default_parameter_value(self, pluginId, parameterId):
 -         return float(requests.get("{}/get_default_parameter_value".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'parameterId': parameterId,
 -         }).text)
 - 
 -     def get_current_parameter_value(self, pluginId, parameterId):
 -         if self.isRunning:
 -             try:
 -                 return float(requests.get("{}/get_current_parameter_value".format(self.baseurl), params={
 -                     'pluginId': pluginId,
 -                     'parameterId': parameterId,
 -                 }).text)
 -             except requests.exceptions.ConnectionError:
 -                 if self.fEngineCallback is None:
 -                     self.fEngineCallback(None, ENGINE_CALLBACK_QUIT, 0, 0, 0, 0.0, "")
 -         return 0.0
 - 
 -     def get_internal_parameter_value(self, pluginId, parameterId):
 -         return float(requests.get("{}/get_internal_parameter_value".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'parameterId': parameterId,
 -         }).text)
 - 
 -     def get_input_peak_value(self, pluginId, isLeft):
 -         return self.peaks[pluginId][0 if isLeft else 1]
 - 
 -     def get_output_peak_value(self, pluginId, isLeft):
 -         return self.peaks[pluginId][2 if isLeft else 3]
 - 
 -     def set_option(self, pluginId, option, yesNo):
 -         requests.get("{}/set_option".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'option': option,
 -             'yesNo': int(yesNo),
 -         })
 - 
 -     def set_active(self, pluginId, onOff):
 -         requests.get("{}/set_active".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'onOff': int(onOff),
 -         })
 - 
 -     def set_drywet(self, pluginId, value):
 -         requests.get("{}/set_drywet".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'value': value,
 -         })
 - 
 -     def set_volume(self, pluginId, value):
 -         requests.get("{}/set_volume".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'value': value,
 -         })
 - 
 -     def set_balance_left(self, pluginId, value):
 -         requests.get("{}/set_balance_left".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'value': value,
 -         })
 - 
 -     def set_balance_right(self, pluginId, value):
 -         requests.get("{}/set_balance_right".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'value': value,
 -         })
 - 
 -     def set_panning(self, pluginId, value):
 -         requests.get("{}/set_panning".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'value': value,
 -         })
 - 
 -     def set_ctrl_channel(self, pluginId, channel):
 -         requests.get("{}/set_ctrl_channel".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'channel': channel,
 -         })
 - 
 -     def set_parameter_value(self, pluginId, parameterId, value):
 -         requests.get("{}/set_parameter_value".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'parameterId': parameterId,
 -             'value': value,
 -         })
 - 
 -     def set_parameter_midi_channel(self, pluginId, parameterId, channel):
 -         requests.get("{}/set_parameter_midi_channel".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'parameterId': parameterId,
 -             'channel': channel,
 -         })
 - 
 -     def set_parameter_midi_cc(self, pluginId, parameterId, cc):
 -         requests.get("{}/set_parameter_midi_cc".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'parameterId': parameterId,
 -             'cc': cc,
 -         })
 - 
 -     def set_program(self, pluginId, programId):
 -         requests.get("{}/set_program".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -         })
 - 
 -     def set_midi_program(self, pluginId, midiProgramId):
 -         requests.get("{}/set_midi_program".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'midiProgramId': midiProgramId,
 -         })
 - 
 -     def set_custom_data(self, pluginId, type_, key, value):
 -         requests.get("{}/set_custom_data".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'type': type_,
 -             'key': key,
 -             'value': value,
 -         })
 - 
 -     def set_chunk_data(self, pluginId, chunkData):
 -         requests.get("{}/set_chunk_data".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'chunkData': chunkData,
 -         })
 - 
 -     def prepare_for_save(self, pluginId):
 -         requests.get("{}/prepare_for_save".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -         })
 - 
 -     def reset_parameters(self, pluginId):
 -         requests.get("{}/reset_parameters".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -         })
 - 
 -     def randomize_parameters(self, pluginId):
 -         requests.get("{}/randomize_parameters".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -         })
 - 
 -     def send_midi_note(self, pluginId, channel, note, velocity):
 -         requests.get("{}/send_midi_note".format(self.baseurl), params={
 -             'pluginId': pluginId,
 -             'channel': channel,
 -             'note': note,
 -             'velocity': velocity,
 -         })
 - 
 -     def get_buffer_size(self):
 -         return int(requests.get("{}/get_buffer_size".format(self.baseurl)).text)
 - 
 -     def get_sample_rate(self):
 -         return float(requests.get("{}/get_sample_rate".format(self.baseurl)).text)
 - 
 -     def get_last_error(self):
 -         return requests.get("{}/get_last_error".format(self.baseurl)).text
 - 
 -     def get_host_osc_url_tcp(self):
 -         return requests.get("{}/get_host_osc_url_tcp".format(self.baseurl)).text
 - 
 -     def get_host_osc_url_udp(self):
 -         return requests.get("{}/get_host_osc_url_udp".format(self.baseurl)).text
 
 
  |