Audio plugin host https://kx.studio/carla
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1835 lines
67KB

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. # Carla plugin/slot skin code
  4. # Copyright (C) 2013-2014 Filipe Coelho <falktx@falktx.com>
  5. #
  6. # This program is free software; you can redistribute it and/or
  7. # modify it under the terms of the GNU General Public License as
  8. # published by the Free Software Foundation; either version 2 of
  9. # the License, or any later version.
  10. #
  11. # This program is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. # GNU General Public License for more details.
  15. #
  16. # For a full copy of the GNU General Public License see the doc/GPL.txt file.
  17. # ------------------------------------------------------------------------------------------------------------
  18. # Imports (Config)
  19. from carla_config import *
  20. # ------------------------------------------------------------------------------------------------------------
  21. # Imports (Global)
  22. if config_UseQt5:
  23. from PyQt5.QtCore import Qt, QRectF
  24. from PyQt5.QtGui import QFont, QFontDatabase, QPen, QPixmap
  25. from PyQt5.QtWidgets import QFrame, QPushButton
  26. else:
  27. from PyQt4.QtCore import Qt, QRectF
  28. from PyQt4.QtGui import QFont, QFontDatabase, QFrame, QPen, QPixmap, QPushButton
  29. # ------------------------------------------------------------------------------------------------------------
  30. # Imports (Custom)
  31. import ui_carla_plugin_default
  32. import ui_carla_plugin_basic_fx
  33. import ui_carla_plugin_calf
  34. import ui_carla_plugin_zita
  35. import ui_carla_plugin_zynfx
  36. from carla_widgets import *
  37. from pixmapdial import PixmapDial
  38. # ------------------------------------------------------------------------------------------------------------
  39. # Try to "shortify" a parameter name
  40. def getParameterShortName(paramName):
  41. paramName = paramName.split("/",1)[0].split(" (",1)[0].split(" [",1)[0].strip()
  42. paramLow = paramName.lower()
  43. if paramLow.startswith("compressor "):
  44. paramName = paramName.replace("ompressor ", ".", 1)
  45. paramLow = paramName.lower()
  46. # Cut generic names
  47. if "attack" in paramLow:
  48. paramName = paramName.replace("ttack", "tk")
  49. elif "bandwidth" in paramLow:
  50. paramName = paramName.replace("andwidth", "w")
  51. elif "damping" in paramLow:
  52. paramName = paramName.replace("amping", "amp")
  53. elif "distortion" in paramLow:
  54. paramName = paramName.replace("istortion", "ist")
  55. elif "feedback" in paramLow:
  56. paramName = paramName.replace("eedback", "b")
  57. elif "frequency" in paramLow:
  58. paramName = paramName.replace("requency", "req")
  59. elif "makeup" in paramLow:
  60. paramName = paramName.replace("akeup", "kUp" if "Make" in paramName else "kup")
  61. elif "output" in paramLow:
  62. paramName = paramName.replace("utput", "ut")
  63. elif "random" in paramLow:
  64. paramName = paramName.replace("andom", "nd")
  65. elif "threshold" in paramLow:
  66. paramName = paramName.replace("hreshold", "hres")
  67. # Cut useless prefix
  68. elif paramLow.startswith("room "):
  69. paramName = paramName.split(" ",1)[1]
  70. # Cut useless suffix
  71. elif paramLow.endswith(" level"):
  72. paramName = paramName.rsplit(" ",1)[0]
  73. elif paramLow.endswith(" time"):
  74. paramName = paramName.rsplit(" ",1)[0]
  75. if len(paramName) > 7:
  76. paramName = paramName[:7]
  77. return paramName.strip()
  78. # ------------------------------------------------------------------------------------------------------------
  79. # Abstract plugin slot
  80. class AbstractPluginSlot(QFrame, PluginEditParentMeta):
  81. #class AbstractPluginSlot(QFrame, PluginEditParentMeta, metaclass=PyQtMetaClass):
  82. def __init__(self, parent, host, pluginId):
  83. QFrame.__init__(self, parent)
  84. self.host = host
  85. if False:
  86. # kdevelop likes this :)
  87. host = CarlaHostMeta()
  88. self.host = host
  89. # -------------------------------------------------------------
  90. # Get plugin info
  91. self.fPluginId = pluginId
  92. self.fPluginInfo = host.get_plugin_info(self.fPluginId)
  93. #if not gCarla.isLocal:
  94. #self.fPluginInfo['hints'] &= ~PLUGIN_HAS_CUSTOM_UI
  95. # -------------------------------------------------------------
  96. # Internal stuff
  97. self.fIsActive = bool(host.get_internal_parameter_value(self.fPluginId, PARAMETER_ACTIVE) >= 0.5)
  98. self.fIsSelected = False
  99. self.fLastGreenLedState = False
  100. self.fLastBlueLedState = False
  101. self.fParameterIconTimer = ICON_STATE_OFF
  102. self.fParameterList = [] # index, widget
  103. if host.processMode == ENGINE_PROCESS_MODE_CONTINUOUS_RACK:
  104. self.fPeaksInputCount = 2
  105. self.fPeaksOutputCount = 2
  106. else:
  107. audioCountInfo = host.get_audio_port_count_info(self.fPluginId)
  108. self.fPeaksInputCount = int(audioCountInfo['ins'])
  109. self.fPeaksOutputCount = int(audioCountInfo['outs'])
  110. if self.fPeaksInputCount > 2:
  111. self.fPeaksInputCount = 2
  112. if self.fPeaksOutputCount > 2:
  113. self.fPeaksOutputCount = 2
  114. # -------------------------------------------------------------
  115. # Set-up GUI
  116. self.fEditDialog = PluginEdit(self, host, self.fPluginId)
  117. # -------------------------------------------------------------
  118. # Set-up common widgets (as none)
  119. self.b_enable = None
  120. self.b_gui = None
  121. self.b_edit = None
  122. self.b_remove = None
  123. self.cb_presets = None
  124. self.label_name = None
  125. self.label_type = None
  126. self.led_control = None
  127. self.led_midi = None
  128. self.led_audio_in = None
  129. self.led_audio_out = None
  130. self.peak_in = None
  131. self.peak_out = None
  132. # -------------------------------------------------------------
  133. # Set-up connections
  134. host.PluginRenamedCallback.connect(self.slot_handlePluginRenamedCallback)
  135. host.PluginUnavailableCallback.connect(self.slot_handlePluginUnavailableCallback)
  136. host.ParameterValueChangedCallback.connect(self.slot_handleParameterValueChangedCallback)
  137. host.ParameterDefaultChangedCallback.connect(self.slot_handleParameterDefaultChangedCallback)
  138. host.ParameterMidiChannelChangedCallback.connect(self.slot_handleParameterMidiChannelChangedCallback)
  139. host.ParameterMidiCcChangedCallback.connect(self.slot_handleParameterMidiCcChangedCallback)
  140. host.ProgramChangedCallback.connect(self.slot_handleProgramChangedCallback)
  141. host.MidiProgramChangedCallback.connect(self.slot_handleMidiProgramChangedCallback)
  142. host.OptionChangedCallback.connect(self.slot_handleOptionChangedCallback)
  143. host.UiStateChangedCallback.connect(self.slot_handleUiStateChangedCallback)
  144. host.NoteOnCallback.connect(self.slot_handleNoteOnCallback)
  145. host.NoteOffCallback.connect(self.slot_handleNoteOffCallback)
  146. # -----------------------------------------------------------------
  147. @pyqtSlot(int, str)
  148. def slot_handlePluginRenamedCallback(self, pluginId, newName):
  149. if self.fPluginId == pluginId:
  150. self.setName(newName)
  151. @pyqtSlot(int, str)
  152. def slot_handlePluginUnavailableCallback(self, pluginId, errorMsg):
  153. if self.fPluginId == pluginId:
  154. pass
  155. @pyqtSlot(int, int, float)
  156. def slot_handleParameterValueChangedCallback(self, pluginId, index, value):
  157. if self.fPluginId == pluginId:
  158. self.setParameterValue(index, value, True)
  159. @pyqtSlot(int, int, float)
  160. def slot_handleParameterDefaultChangedCallback(self, pluginId, index, value):
  161. if self.fPluginId == pluginId:
  162. self.setParameterDefault(index, value)
  163. @pyqtSlot(int, int, int)
  164. def slot_handleParameterMidiCcChangedCallback(self, pluginId, index, cc):
  165. if self.fPluginId == pluginId:
  166. self.setParameterMidiControl(index, cc)
  167. @pyqtSlot(int, int, int)
  168. def slot_handleParameterMidiChannelChangedCallback(self, pluginId, index, channel):
  169. if self.fPluginId == pluginId:
  170. self.setParameterMidiChannel(index, channel)
  171. @pyqtSlot(int, int)
  172. def slot_handleProgramChangedCallback(self, pluginId, index):
  173. if self.fPluginId == pluginId:
  174. self.setProgram(index, True)
  175. @pyqtSlot(int, int)
  176. def slot_handleMidiProgramChangedCallback(self, pluginId, index):
  177. if self.fPluginId == pluginId:
  178. self.setMidiProgram(index, True)
  179. @pyqtSlot(int, int, bool)
  180. def slot_handleOptionChangedCallback(self, pluginId, option, yesNo):
  181. if self.fPluginId == pluginId:
  182. self.setOption(option, yesNo)
  183. @pyqtSlot(int, int)
  184. def slot_handleUiStateChangedCallback(self, pluginId, state):
  185. if self.fPluginId == pluginId:
  186. self.customUiStateChanged(state)
  187. @pyqtSlot(int, int, int, int)
  188. def slot_handleNoteOnCallback(self, pluginId, channel, note, velo):
  189. if self.fPluginId == pluginId:
  190. self.sendNoteOn(channel, note)
  191. @pyqtSlot(int, int, int)
  192. def slot_handleNoteOffCallback(self, pluginId, channel, note):
  193. if self.fPluginId == pluginId:
  194. self.sendNoteOff(channel, note)
  195. #------------------------------------------------------------------
  196. def ready(self):
  197. if self.b_enable is not None:
  198. self.b_enable.setChecked(self.fIsActive)
  199. self.b_enable.clicked.connect(self.slot_enableClicked)
  200. if self.b_gui is not None:
  201. self.b_gui.clicked.connect(self.slot_showCustomUi)
  202. self.b_gui.setEnabled(bool(self.fPluginInfo['hints'] & PLUGIN_HAS_CUSTOM_UI))
  203. if self.b_edit is None:
  204. # Edit dialog *must* be available
  205. self.b_edit = QPushButton(self)
  206. self.b_edit.setCheckable(True)
  207. self.b_edit.hide()
  208. self.b_edit.clicked.connect(self.slot_showEditDialog)
  209. if self.b_remove is not None:
  210. self.b_remove.clicked.connect(self.slot_removePlugin)
  211. if self.label_name is not None:
  212. self.label_name.setText(self.fPluginInfo['name'])
  213. if self.label_type is not None:
  214. self.label_type.setText(getPluginTypeAsString(self.fPluginInfo['type']))
  215. if self.led_control is not None:
  216. self.led_control.setColor(self.led_control.YELLOW)
  217. self.led_control.setEnabled(False)
  218. if self.led_midi is not None:
  219. self.led_midi.setColor(self.led_midi.RED)
  220. self.led_midi.setEnabled(False)
  221. if self.led_audio_in is not None:
  222. self.led_audio_in.setColor(self.led_audio_in.GREEN)
  223. self.led_audio_in.setEnabled(False)
  224. if self.led_audio_out is not None:
  225. self.led_audio_out.setColor(self.led_audio_out.BLUE)
  226. self.led_audio_out.setEnabled(False)
  227. if self.peak_in is not None:
  228. self.peak_in.setColor(self.peak_in.GREEN)
  229. self.peak_in.setChannels(self.fPeaksInputCount)
  230. self.peak_in.setOrientation(self.peak_in.HORIZONTAL)
  231. if self.peak_out is not None:
  232. self.peak_out.setColor(self.peak_in.BLUE)
  233. self.peak_out.setChannels(self.fPeaksOutputCount)
  234. self.peak_out.setOrientation(self.peak_out.HORIZONTAL)
  235. for paramIndex, paramWidget in self.fParameterList:
  236. paramWidget.setContextMenuPolicy(Qt.CustomContextMenu)
  237. paramWidget.customContextMenuRequested.connect(self.slot_knobCustomMenu)
  238. paramWidget.realValueChanged.connect(self.slot_parameterValueChanged)
  239. paramWidget.setValue(self.host.get_internal_parameter_value(self.fPluginId, paramIndex))
  240. #------------------------------------------------------------------
  241. def getFixedHeight(self):
  242. return 32
  243. def getHints(self):
  244. return self.fPluginInfo['hints']
  245. def getPluginId(self):
  246. return self.fPluginId
  247. #------------------------------------------------------------------
  248. def setPluginId(self, idx):
  249. self.fPluginId = idx
  250. self.fEditDialog.setPluginId(idx)
  251. def setName(self, name):
  252. self.fEditDialog.setName(name)
  253. if self.label_name is not None:
  254. self.label_name.setText(name)
  255. def setSelected(self, yesNo):
  256. if self.fIsSelected == yesNo:
  257. return
  258. self.fIsSelected = yesNo
  259. self.update()
  260. #------------------------------------------------------------------
  261. def setActive(self, active, sendCallback=False, sendHost=True):
  262. self.fIsActive = active
  263. if sendCallback:
  264. self.fParameterIconTimer = ICON_STATE_ON
  265. self.activeChanged(active)
  266. if sendHost:
  267. self.host.set_active(self.fPluginId, active)
  268. if active:
  269. self.fEditDialog.clearNotes()
  270. self.midiActivityChanged(False)
  271. # called from rack, checks if param is possible first
  272. def setInternalParameter(self, parameterId, value):
  273. if parameterId <= PARAMETER_MAX or parameterId >= PARAMETER_NULL:
  274. return
  275. elif parameterId == PARAMETER_ACTIVE:
  276. return self.setActive(bool(value), True, True)
  277. elif parameterId == PARAMETER_DRYWET:
  278. if (self.fPluginInfo['hints'] & PLUGIN_CAN_DRYWET) == 0: return
  279. self.host.set_drywet(self.fPluginId, value)
  280. elif parameterId == PARAMETER_VOLUME:
  281. if (self.fPluginInfo['hints'] & PLUGIN_CAN_VOLUME) == 0: return
  282. self.host.set_volume(self.fPluginId, value)
  283. elif parameterId == PARAMETER_BALANCE_LEFT:
  284. if (self.fPluginInfo['hints'] & PLUGIN_CAN_BALANCE) == 0: return
  285. self.host.set_balance_left(self.fPluginId, value)
  286. elif parameterId == PARAMETER_BALANCE_RIGHT:
  287. if (self.fPluginInfo['hints'] & PLUGIN_CAN_BALANCE) == 0: return
  288. self.host.set_balance_right(self.fPluginId, value)
  289. elif parameterId == PARAMETER_PANNING:
  290. if (self.fPluginInfo['hints'] & PLUGIN_CAN_PANNING) == 0: return
  291. self.host.set_panning(self.fPluginId, value)
  292. elif parameterId == PARAMETER_CTRL_CHANNEL:
  293. self.host.set_ctrl_channel(self.fPluginId, value)
  294. self.fEditDialog.setParameterValue(parameterId, value)
  295. #------------------------------------------------------------------
  296. def setParameterValue(self, parameterId, value, sendCallback):
  297. if parameterId == PARAMETER_ACTIVE:
  298. return self.setActive(bool(value), True, False)
  299. self.fEditDialog.setParameterValue(parameterId, value)
  300. if sendCallback:
  301. self.fParameterIconTimer = ICON_STATE_ON
  302. self.parameterValueChanged(parameterId, value)
  303. def setParameterDefault(self, parameterId, value):
  304. self.fEditDialog.setParameterDefault(parameterId, value)
  305. def setParameterMidiControl(self, parameterId, control):
  306. self.fEditDialog.setParameterMidiControl(parameterId, control)
  307. def setParameterMidiChannel(self, parameterId, channel):
  308. self.fEditDialog.setParameterMidiChannel(parameterId, channel)
  309. #------------------------------------------------------------------
  310. def setProgram(self, index, sendCallback):
  311. self.fEditDialog.setProgram(index)
  312. if sendCallback:
  313. self.fParameterIconTimer = ICON_STATE_ON
  314. self.programChanged(index)
  315. def setMidiProgram(self, index, sendCallback):
  316. self.fEditDialog.setMidiProgram(index)
  317. if sendCallback:
  318. self.fParameterIconTimer = ICON_STATE_ON
  319. self.midiProgramChanged(index)
  320. #------------------------------------------------------------------
  321. def setOption(self, option, yesNo):
  322. self.fEditDialog.setOption(option, yesNo)
  323. #------------------------------------------------------------------
  324. def sendNoteOn(self, channel, note):
  325. if self.fEditDialog.sendNoteOn(channel, note):
  326. self.midiActivityChanged(True)
  327. def sendNoteOff(self, channel, note):
  328. if self.fEditDialog.sendNoteOff(channel, note):
  329. self.midiActivityChanged(False)
  330. #------------------------------------------------------------------
  331. def activeChanged(self, onOff):
  332. self.fIsActive = onOff
  333. if self.b_enable is None:
  334. return
  335. self.b_enable.blockSignals(True)
  336. self.b_enable.setChecked(onOff)
  337. self.b_enable.blockSignals(False)
  338. def customUiStateChanged(self, state):
  339. if self.b_gui is None:
  340. return
  341. self.b_gui.blockSignals(True)
  342. if state == 0:
  343. self.b_gui.setChecked(False)
  344. self.b_gui.setEnabled(True)
  345. elif state == 1:
  346. self.b_gui.setChecked(True)
  347. self.b_gui.setEnabled(True)
  348. elif state == -1:
  349. self.b_gui.setChecked(False)
  350. self.b_gui.setEnabled(False)
  351. self.b_gui.blockSignals(False)
  352. def parameterActivityChanged(self, onOff):
  353. if self.led_control is None:
  354. return
  355. self.led_control.setChecked(onOff)
  356. def midiActivityChanged(self, onOff):
  357. if self.led_midi is None:
  358. return
  359. self.led_midi.setChecked(onOff)
  360. def optionChanged(self, option, yesNo):
  361. pass
  362. # -----------------------------------------------------------------
  363. # PluginEdit callbacks
  364. def editDialogChanged(self, visible):
  365. if self.b_edit is None:
  366. return
  367. self.b_edit.blockSignals(True)
  368. self.b_edit.setChecked(visible)
  369. self.b_edit.blockSignals(False)
  370. def pluginHintsChanged(self, hints):
  371. self.fPluginInfo['hints'] = hints
  372. self.ui.dial_drywet.setVisible(hints & PLUGIN_CAN_DRYWET)
  373. self.ui.dial_vol.setVisible(hints & PLUGIN_CAN_VOLUME)
  374. if self.b_gui is not None:
  375. self.b_gui.setEnabled(bool(hints & PLUGIN_HAS_CUSTOM_UI))
  376. def parameterValueChanged(self, parameterId, value):
  377. for paramIndex, paramWidget in self.fParameterList:
  378. if paramIndex != parameterId:
  379. continue
  380. paramWidget.blockSignals(True)
  381. paramWidget.setValue(value)
  382. paramWidget.blockSignals(False)
  383. break
  384. def programChanged(self, index):
  385. if self.cb_presets is None:
  386. return
  387. self.cb_presets.blockSignals(True)
  388. self.cb_presets.setCurrentIndex(index)
  389. self.cb_presets.blockSignals(False)
  390. def midiProgramChanged(self, index):
  391. if self.cb_presets is None:
  392. return
  393. self.cb_presets.blockSignals(True)
  394. self.cb_presets.setCurrentIndex(index)
  395. self.cb_presets.blockSignals(False)
  396. def notePressed(self, note):
  397. pass
  398. def noteReleased(self, note):
  399. pass
  400. #------------------------------------------------------------------
  401. def idleFast(self):
  402. # Input peaks
  403. if self.fPeaksInputCount > 0:
  404. if self.fPeaksInputCount > 1:
  405. peak1 = self.host.get_input_peak_value(self.fPluginId, True)
  406. peak2 = self.host.get_input_peak_value(self.fPluginId, False)
  407. ledState = bool(peak1 != 0.0 or peak2 != 0.0)
  408. if self.peak_in is not None:
  409. self.peak_in.displayMeter(1, peak1)
  410. self.peak_in.displayMeter(2, peak2)
  411. else:
  412. peak = self.host.get_input_peak_value(self.fPluginId, True)
  413. ledState = bool(peak != 0.0)
  414. if self.peak_in is not None:
  415. self.peak_in.displayMeter(1, peak)
  416. if self.fLastGreenLedState != ledState and self.led_audio_in is not None:
  417. self.fLastGreenLedState = ledState
  418. self.led_audio_in.setChecked(ledState)
  419. # Output peaks
  420. if self.fPeaksOutputCount > 0:
  421. if self.fPeaksOutputCount > 1:
  422. peak1 = self.host.get_output_peak_value(self.fPluginId, True)
  423. peak2 = self.host.get_output_peak_value(self.fPluginId, False)
  424. ledState = bool(peak1 != 0.0 or peak2 != 0.0)
  425. if self.peak_out is not None:
  426. self.peak_out.displayMeter(1, peak1)
  427. self.peak_out.displayMeter(2, peak2)
  428. else:
  429. peak = self.host.get_output_peak_value(self.fPluginId, True)
  430. ledState = bool(peak != 0.0)
  431. if self.peak_out is not None:
  432. self.peak_out.displayMeter(1, peak)
  433. if self.fLastBlueLedState != ledState and self.led_audio_out is not None:
  434. self.fLastBlueLedState = ledState
  435. self.led_audio_out.setChecked(ledState)
  436. def idleSlow(self):
  437. if self.fParameterIconTimer == ICON_STATE_ON:
  438. self.fParameterIconTimer = ICON_STATE_WAIT1
  439. self.parameterActivityChanged(True)
  440. elif self.fParameterIconTimer == ICON_STATE_WAIT1:
  441. self.fParameterIconTimer = ICON_STATE_WAIT2
  442. elif self.fParameterIconTimer == ICON_STATE_WAIT2:
  443. self.fParameterIconTimer = ICON_STATE_OFF
  444. self.parameterActivityChanged(False)
  445. self.fEditDialog.idleSlow()
  446. #------------------------------------------------------------------
  447. def drawOutline(self):
  448. painter = QPainter(self)
  449. if self.fIsSelected:
  450. painter.setPen(QPen(Qt.cyan, 4))
  451. painter.setBrush(Qt.transparent)
  452. painter.drawRect(0, 0, self.width(), self.height())
  453. else:
  454. painter.setPen(QPen(Qt.black, 1))
  455. painter.setBrush(Qt.black)
  456. painter.drawLine(0, self.height()-1, self.width(), self.height()-1)
  457. def showDefaultCustomMenu(self, isEnabled, bEdit = None, bGui = None):
  458. menu = QMenu(self)
  459. actActive = menu.addAction(self.tr("Disable") if isEnabled else self.tr("Enable"))
  460. menu.addSeparator()
  461. actReset = menu.addAction(self.tr("Reset parameters"))
  462. actRandom = menu.addAction(self.tr("Randomize parameters"))
  463. menu.addSeparator()
  464. if bEdit is not None:
  465. actEdit = menu.addAction(self.tr("Edit"))
  466. actEdit.setCheckable(True)
  467. actEdit.setChecked(bEdit.isChecked())
  468. else:
  469. actEdit = None
  470. if bGui is not None:
  471. actGui = menu.addAction(self.tr("Show Custom UI"))
  472. actGui.setCheckable(True)
  473. actGui.setChecked(bGui.isChecked())
  474. actGui.setEnabled(bGui.isEnabled())
  475. else:
  476. actGui = None
  477. menu.addSeparator()
  478. actClone = menu.addAction(self.tr("Clone"))
  479. actReplace = menu.addAction(self.tr("Replace..."))
  480. actRename = menu.addAction(self.tr("Rename..."))
  481. actRemove = menu.addAction(self.tr("Remove"))
  482. actSel = menu.exec_(QCursor.pos())
  483. if not actSel:
  484. return
  485. if actSel == actActive:
  486. self.setActive(not isEnabled, True, True)
  487. elif actSel == actReset:
  488. self.host.reset_parameters(self.fPluginId)
  489. elif actSel == actRandom:
  490. self.host.randomize_parameters(self.fPluginId)
  491. elif actSel == actGui:
  492. bGui.click()
  493. elif actSel == actEdit:
  494. bEdit.click()
  495. elif actSel == actClone:
  496. if not self.host.clone_plugin(self.fPluginId):
  497. CustomMessageBox(self, QMessageBox.Warning, self.tr("Error"), self.tr("Operation failed"),
  498. self.host.get_last_error(), QMessageBox.Ok, QMessageBox.Ok)
  499. elif actSel == actRename:
  500. oldName = self.fPluginInfo['name']
  501. newNameTry = QInputDialog.getText(self, self.tr("Rename Plugin"), self.tr("New plugin name:"), QLineEdit.Normal, oldName)
  502. if not (newNameTry[1] and newNameTry[0] and oldName != newNameTry[0]):
  503. return
  504. newName = newNameTry[0]
  505. if self.host.rename_plugin(self.fPluginId, newName):
  506. self.setName(newName)
  507. else:
  508. CustomMessageBox(self, QMessageBox.Warning, self.tr("Error"), self.tr("Operation failed"),
  509. self.host.get_last_error(), QMessageBox.Ok, QMessageBox.Ok)
  510. elif actSel == actReplace:
  511. gCarla.gui.slot_pluginAdd(self.fPluginId)
  512. elif actSel == actRemove:
  513. if not self.host.remove_plugin(self.fPluginId):
  514. CustomMessageBox(self, QMessageBox.Warning, self.tr("Error"), self.tr("Operation failed"),
  515. self.host.get_last_error(), QMessageBox.Ok, QMessageBox.Ok)
  516. #------------------------------------------------------------------
  517. @pyqtSlot(bool)
  518. def slot_enableClicked(self, yesNo):
  519. self.setActive(yesNo, False, True)
  520. @pyqtSlot()
  521. def slot_showDefaultCustomMenu(self):
  522. self.showDefaultCustomMenu(self.fIsActive, self.b_edit, self.b_gui)
  523. @pyqtSlot()
  524. def slot_knobCustomMenu(self):
  525. sender = self.sender()
  526. index = sender.fIndex
  527. minimum = sender.fMinimum
  528. maximum = sender.fMaximum
  529. current = sender.fRealValue
  530. label = sender.fLabel
  531. if index in (PARAMETER_DRYWET, PARAMETER_VOLUME):
  532. default = 1.0
  533. resetText = self.tr("Reset (%i%%)" % int(default*100.0))
  534. minimText = self.tr("Set to Minimum (%i%%)" % int(minimum*100.0))
  535. maximText = self.tr("Set to Maximum (%i%%)" % int(maximum*100.0))
  536. else:
  537. default = self.host.get_default_parameter_value(self.fPluginId, index)
  538. resetText = self.tr("Reset (%f)" % default)
  539. minimText = self.tr("Set to Minimum (%f)" % minimum)
  540. maximText = self.tr("Set to Maximum (%f)" % maximum)
  541. menu = QMenu(self)
  542. actReset = menu.addAction(resetText)
  543. menu.addSeparator()
  544. actMinimum = menu.addAction(minimText)
  545. actMaximum = menu.addAction(maximText)
  546. menu.addSeparator()
  547. actSet = menu.addAction(self.tr("Set value..."))
  548. actSelected = menu.exec_(QCursor.pos())
  549. if actSelected == actSet:
  550. valueTry = QInputDialog.getDouble(self, self.tr("Set value"), label, current, minimum, maximum, 3) # FIXME - 3 decimals
  551. if valueTry[1]:
  552. value = valueTry[0] * 10
  553. else:
  554. return
  555. elif actSelected == actMinimum:
  556. value = minimum
  557. elif actSelected == actMaximum:
  558. value = maximum
  559. elif actSelected == actReset:
  560. value = default
  561. else:
  562. return
  563. self.sender().setValue(value)
  564. #------------------------------------------------------------------
  565. @pyqtSlot(bool)
  566. def slot_showCustomUi(self, show):
  567. self.host.show_custom_ui(self.fPluginId, show)
  568. @pyqtSlot(bool)
  569. def slot_showEditDialog(self, show):
  570. self.fEditDialog.setVisible(show)
  571. @pyqtSlot()
  572. def slot_removePlugin(self):
  573. self.host.remove_plugin(self.fPluginId)
  574. #------------------------------------------------------------------
  575. @pyqtSlot(int)
  576. def slot_parameterValueChanged(self, value):
  577. index = self.sender().getIndex()
  578. if index < 0:
  579. self.setInternalParameter(index, value)
  580. else:
  581. self.host.set_parameter_value(self.fPluginId, index, value)
  582. self.setParameterValue(index, value, False)
  583. @pyqtSlot(int)
  584. def slot_programChanged(self, index):
  585. self.host.set_program(self.fPluginId, index)
  586. self.setProgram(index, False)
  587. @pyqtSlot(int)
  588. def slot_midiProgramChanged(self, index):
  589. self.host.set_midi_program(self.fPluginId, index)
  590. self.setMidiProgram(index, False)
  591. #------------------------------------------------------------------
  592. def paintEvent(self, event):
  593. self.drawOutline()
  594. QFrame.paintEvent(self, event)
  595. # ------------------------------------------------------------------------------------------------------------
  596. class PluginSlot_Default(AbstractPluginSlot):
  597. def __init__(self, parent, host, pluginId):
  598. AbstractPluginSlot.__init__(self, parent, host, pluginId)
  599. self.ui = ui_carla_plugin_default.Ui_PluginWidget()
  600. self.ui.setupUi(self)
  601. # -------------------------------------------------------------
  602. # Internal stuff
  603. self.fColorTop = QColor(60, 60, 60)
  604. self.fColorBottom = QColor(47, 47, 47)
  605. self.fColorSeprtr = QColor(70, 70, 70)
  606. # -------------------------------------------------------------
  607. # Set-up GUI
  608. self.setStyleSheet("""
  609. QLabel#label_name {
  610. color: #BBB;
  611. }
  612. """)
  613. self.ui.b_enable.setPixmaps(":/bitmaps/button_off.png", ":/bitmaps/button_on.png", ":/bitmaps/button_off.png")
  614. self.ui.b_edit.setPixmaps(":/bitmaps/button_edit.png", ":/bitmaps/button_edit_down.png", ":/bitmaps/button_edit_hover.png")
  615. if self.fPluginInfo['iconName'] == "distrho":
  616. self.ui.b_gui.setPixmaps(":/bitmaps/button_distrho.png", ":/bitmaps/button_distrho_down.png", ":/bitmaps/button_distrho_hover.png")
  617. elif self.fPluginInfo['iconName'] == "file":
  618. self.ui.b_gui.setPixmaps(":/bitmaps/button_file.png", ":/bitmaps/button_file_down.png", ":/bitmaps/button_file_hover.png")
  619. else:
  620. self.ui.b_gui.setPixmaps(":/bitmaps/button_gui.png", ":/bitmaps/button_gui_down.png", ":/bitmaps/button_gui_hover.png")
  621. # -------------------------------------------------------------
  622. self.b_enable = self.ui.b_enable
  623. self.b_gui = self.ui.b_gui
  624. self.b_edit = self.ui.b_edit
  625. self.label_name = self.ui.label_name
  626. self.led_control = self.ui.led_control
  627. self.led_midi = self.ui.led_midi
  628. self.led_audio_in = self.ui.led_audio_in
  629. self.led_audio_out = self.ui.led_audio_out
  630. self.peak_in = self.ui.peak_in
  631. self.peak_out = self.ui.peak_out
  632. self.ready()
  633. self.customContextMenuRequested.connect(self.slot_showDefaultCustomMenu)
  634. #------------------------------------------------------------------
  635. def getFixedHeight(self):
  636. return 36
  637. #------------------------------------------------------------------
  638. def paintEvent(self, event):
  639. painter = QPainter(self)
  640. painter.save()
  641. areaX = self.ui.area_right.x()+7
  642. width = self.width()
  643. height = self.height()
  644. painter.setPen(QPen(QColor(17, 17, 17), 1))
  645. painter.setBrush(QColor(17, 17, 17))
  646. painter.drawRect(0, 0, width, height)
  647. painter.setPen(self.fColorSeprtr.lighter(110))
  648. painter.setBrush(self.fColorBottom)
  649. painter.setRenderHint(QPainter.Antialiasing, True)
  650. # name -> leds arc
  651. path = QPainterPath()
  652. path.moveTo(areaX-20, height-4)
  653. path.cubicTo(areaX, height-5, areaX-20, 4.75, areaX, 4.75)
  654. path.lineTo(areaX, height-5)
  655. painter.drawPath(path)
  656. painter.setPen(self.fColorSeprtr)
  657. painter.setRenderHint(QPainter.Antialiasing, False)
  658. # separator lines
  659. painter.drawLine(0, height-5, areaX-20, height-5)
  660. painter.drawLine(areaX, 4, width, 4)
  661. painter.setPen(self.fColorBottom)
  662. painter.setBrush(self.fColorBottom)
  663. # top, bottom and left lines
  664. painter.drawLine(0, 0, width, 0)
  665. painter.drawRect(0, height-4, areaX, 4)
  666. painter.drawRoundedRect(areaX-20, height-5, areaX, 5, 22, 22)
  667. painter.drawLine(0, 0, 0, height)
  668. # fill the rest
  669. painter.drawRect(areaX-1, 5, width, height)
  670. # bottom 1px line
  671. painter.setPen(self.fColorSeprtr)
  672. painter.drawLine(0, height-1, width, height-1)
  673. painter.restore()
  674. AbstractPluginSlot.paintEvent(self, event)
  675. # ------------------------------------------------------------------------------------------------------------
  676. class PluginSlot_BasicFX(AbstractPluginSlot):
  677. def __init__(self, parent, host, pluginId):
  678. AbstractPluginSlot.__init__(self, parent, host, pluginId)
  679. self.ui = ui_carla_plugin_basic_fx.Ui_PluginWidget()
  680. self.ui.setupUi(self)
  681. # -------------------------------------------------------------
  682. # Set-up GUI
  683. labelFont = self.ui.label_name.font()
  684. labelFont.setBold(True)
  685. labelFont.setPointSize(9)
  686. self.ui.label_name.setFont(labelFont)
  687. r = 40
  688. g = 40
  689. b = 40
  690. if self.fPluginInfo['category'] == PLUGIN_CATEGORY_MODULATOR:
  691. r += 10
  692. elif self.fPluginInfo['category'] == PLUGIN_CATEGORY_EQ:
  693. g += 10
  694. elif self.fPluginInfo['category'] == PLUGIN_CATEGORY_FILTER:
  695. b += 10
  696. elif self.fPluginInfo['category'] == PLUGIN_CATEGORY_DELAY:
  697. r += 15
  698. b -= 15
  699. elif self.fPluginInfo['category'] == PLUGIN_CATEGORY_DISTORTION:
  700. g += 10
  701. b += 10
  702. elif self.fPluginInfo['category'] == PLUGIN_CATEGORY_DYNAMICS:
  703. r += 10
  704. b += 10
  705. elif self.fPluginInfo['category'] == PLUGIN_CATEGORY_UTILITY:
  706. r += 10
  707. g += 10
  708. bg = "noise1"
  709. if self.fPluginInfo['maker'] in ("falkTX, Michael Gruhn", "DISTRHO") and "3bandeq" in self.fPluginInfo['label'].lower():
  710. bg = "3bandeq"
  711. self.setStyleSheet("""
  712. PluginSlot_BasicFX#PluginWidget {
  713. background-color: rgb(%i, %i, %i);
  714. background-image: url(:/bitmaps/background_%s.png);
  715. background-repeat: repeat-xy;
  716. }
  717. QLabel#label_name {
  718. color: #BBB;
  719. }
  720. """ % (r, g, b, bg))
  721. self.ui.b_enable.setPixmaps(":/bitmaps/button_off.png", ":/bitmaps/button_on.png", ":/bitmaps/button_off.png")
  722. self.ui.b_edit.setPixmaps(":/bitmaps/button_edit.png", ":/bitmaps/button_edit_down.png", ":/bitmaps/button_edit_hover.png")
  723. if self.fPluginInfo['iconName'] == "distrho":
  724. self.ui.b_gui.setPixmaps(":/bitmaps/button_distrho.png", ":/bitmaps/button_distrho_down.png", ":/bitmaps/button_distrho_hover.png")
  725. elif self.fPluginInfo['iconName'] == "file":
  726. self.ui.b_gui.setPixmaps(":/bitmaps/button_file.png", ":/bitmaps/button_file_down.png", ":/bitmaps/button_file_hover.png")
  727. else:
  728. self.ui.b_gui.setPixmaps(":/bitmaps/button_gui.png", ":/bitmaps/button_gui_down.png", ":/bitmaps/button_gui_hover.png")
  729. # -------------------------------------------------------------
  730. # Set-up parameters
  731. parameterCount = self.host.get_parameter_count(self.fPluginId)
  732. index = 0
  733. for i in range(parameterCount):
  734. if index >= 8:
  735. break
  736. paramInfo = self.host.get_parameter_info(self.fPluginId, i)
  737. paramData = self.host.get_parameter_data(self.fPluginId, i)
  738. paramRanges = self.host.get_parameter_ranges(self.fPluginId, i)
  739. if paramData['type'] != PARAMETER_INPUT:
  740. continue
  741. if paramData['hints'] & PARAMETER_IS_BOOLEAN:
  742. continue
  743. if (paramData['hints'] & PARAMETER_IS_ENABLED) == 0:
  744. continue
  745. paramName = getParameterShortName(paramInfo['name'])
  746. #if self.fPluginInfo['category'] == PLUGIN_CATEGORY_FILTER:
  747. #_r = 55 + float(i)/8*200
  748. #_g = 255 - float(i)/8*200
  749. #_b = 127 - r*2
  750. #elif self.fPluginInfo['category'] == PLUGIN_CATEGORY_DELAY:
  751. #_r = 127
  752. #_g = 55 + float(i)/8*200
  753. #_b = 255 - float(i)/8*200
  754. #elif r < b < g:
  755. #_r = 55 + float(i)/8*200
  756. #_g = 127
  757. #_b = 255 - float(i)/8*200
  758. #else:
  759. _r = 255 - float(index)/8*200
  760. _g = 55 + float(index)/8*200
  761. _b = (r-40)*4
  762. #if _r < 140: _r = 140
  763. #if _g < 140: _g = 140
  764. #if _b < 140: _b = 140
  765. widget = PixmapDial(self, i)
  766. widget.setPixmap(3)
  767. widget.setLabel(paramName)
  768. widget.setCustomPaintColor(QColor(_r, _g, _b))
  769. widget.setCustomPaintMode(PixmapDial.CUSTOM_PAINT_MODE_COLOR)
  770. widget.forceWhiteLabelGradientText()
  771. widget.setMinimum(paramRanges['min'])
  772. widget.setMaximum(paramRanges['max'])
  773. if (paramData['hints'] & PARAMETER_IS_ENABLED) == 0:
  774. widget.setEnabled(False)
  775. self.ui.w_knobs.layout().insertWidget(index, widget)
  776. index += 1
  777. self.fParameterList.append([i, widget])
  778. self.ui.dial_drywet.setIndex(PARAMETER_DRYWET)
  779. self.ui.dial_drywet.setPixmap(3)
  780. self.ui.dial_drywet.setLabel("Dry/Wet")
  781. self.ui.dial_drywet.setCustomPaintMode(PixmapDial.CUSTOM_PAINT_MODE_CARLA_WET)
  782. self.ui.dial_drywet.setMinimum(0.0)
  783. self.ui.dial_drywet.setMaximum(1.0)
  784. self.ui.dial_drywet.forceWhiteLabelGradientText()
  785. self.ui.dial_drywet.setVisible(self.fPluginInfo['hints'] & PLUGIN_CAN_DRYWET)
  786. self.ui.dial_vol.setIndex(PARAMETER_VOLUME)
  787. self.ui.dial_vol.setPixmap(3)
  788. self.ui.dial_vol.setLabel("Volume")
  789. self.ui.dial_vol.setCustomPaintMode(PixmapDial.CUSTOM_PAINT_MODE_CARLA_VOL)
  790. self.ui.dial_vol.setMinimum(0.0)
  791. self.ui.dial_vol.setMaximum(1.27)
  792. self.ui.dial_vol.forceWhiteLabelGradientText()
  793. self.ui.dial_vol.setVisible(self.fPluginInfo['hints'] & PLUGIN_CAN_VOLUME)
  794. self.fParameterList.append([PARAMETER_DRYWET, self.ui.dial_drywet])
  795. self.fParameterList.append([PARAMETER_VOLUME, self.ui.dial_vol])
  796. # -------------------------------------------------------------
  797. self.b_enable = self.ui.b_enable
  798. self.b_gui = self.ui.b_gui
  799. self.b_edit = self.ui.b_edit
  800. self.label_name = self.ui.label_name
  801. self.led_control = self.ui.led_control
  802. self.led_midi = self.ui.led_midi
  803. self.led_audio_in = self.ui.led_audio_in
  804. self.led_audio_out = self.ui.led_audio_out
  805. self.peak_in = self.ui.peak_in
  806. self.peak_out = self.ui.peak_out
  807. self.ready()
  808. self.customContextMenuRequested.connect(self.slot_showDefaultCustomMenu)
  809. #------------------------------------------------------------------
  810. def getFixedHeight(self):
  811. return 79
  812. #------------------------------------------------------------------
  813. def paintEvent(self, event):
  814. painter = QPainter(self)
  815. painter.setBrush(Qt.transparent)
  816. painter.setPen(QPen(QColor(42, 42, 42), 1))
  817. painter.drawRect(0, 1, self.width()-1, 79-3)
  818. painter.setPen(QPen(QColor(60, 60, 60), 1))
  819. painter.drawLine(0, 0, self.width(), 0)
  820. AbstractPluginSlot.paintEvent(self, event)
  821. # ------------------------------------------------------------------------------------------------------------
  822. class PluginSlot_OpenAV(AbstractPluginSlot):
  823. def __init__(self, parent, host, pluginId):
  824. AbstractPluginSlot.__init__(self, parent, host, pluginId)
  825. self.ui = ui_carla_plugin_basic_fx.Ui_PluginWidget()
  826. self.ui.setupUi(self)
  827. # -------------------------------------------------------------
  828. # Set-up GUI
  829. QFontDatabase.addApplicationFont(":/fonts/uranium.ttf")
  830. labelFont = QFont()
  831. labelFont.setFamily("Uranium")
  832. labelFont.setPointSize(13)
  833. labelFont.setCapitalization(QFont.AllUppercase)
  834. self.ui.label_name.setFont(labelFont)
  835. self.setStyleSheet("""
  836. PluginSlot_OpenAV#PluginWidget {
  837. background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,
  838. stop: 0 #303030, stop: 0.35 #111111, stop: 1.0 #111111);
  839. }
  840. """)
  841. self.ui.label_name.setStyleSheet("* { color: #FF5100; }")
  842. #self.ui.line.setStyleSheet("* { background-color: #FF5100; color: #FF5100; }")
  843. self.ui.b_enable.setPixmaps(":/bitmaps/button_off.png", ":/bitmaps/button_on.png", ":/bitmaps/button_off.png")
  844. self.ui.b_edit.setPixmaps(":/bitmaps/button_edit.png", ":/bitmaps/button_edit_down.png", ":/bitmaps/button_edit_hover.png")
  845. self.ui.b_gui.setPixmaps(":/bitmaps/button_gui.png", ":/bitmaps/button_gui_down.png", ":/bitmaps/button_gui_hover.png")
  846. # -------------------------------------------------------------
  847. # Set-up parameters
  848. parameterCount = self.host.get_parameter_count(self.fPluginId)
  849. index = 0
  850. for i in range(parameterCount):
  851. if index >= 8:
  852. break
  853. paramInfo = self.host.get_parameter_info(self.fPluginId, i)
  854. paramData = self.host.get_parameter_data(self.fPluginId, i)
  855. paramRanges = self.host.get_parameter_ranges(self.fPluginId, i)
  856. if paramData['type'] != PARAMETER_INPUT:
  857. continue
  858. if paramData['hints'] & PARAMETER_IS_BOOLEAN:
  859. continue
  860. if (paramData['hints'] & PARAMETER_IS_ENABLED) == 0:
  861. continue
  862. paramName = getParameterShortName(paramInfo['name'])
  863. widget = PixmapDial(self, i)
  864. widget.setPixmap(11)
  865. widget.setLabel(paramName)
  866. widget.setCustomPaintMode(PixmapDial.CUSTOM_PAINT_MODE_NO_GRADIENT)
  867. widget.setMinimum(paramRanges['min'])
  868. widget.setMaximum(paramRanges['max'])
  869. if (paramData['hints'] & PARAMETER_IS_ENABLED) == 0:
  870. widget.setEnabled(False)
  871. self.ui.w_knobs.layout().insertWidget(index, widget)
  872. index += 1
  873. self.fParameterList.append([i, widget])
  874. self.ui.dial_drywet.setIndex(PARAMETER_DRYWET)
  875. self.ui.dial_drywet.setPixmap(11)
  876. self.ui.dial_drywet.setLabel("Dry/Wet")
  877. self.ui.dial_drywet.setCustomPaintMode(PixmapDial.CUSTOM_PAINT_MODE_NO_GRADIENT)
  878. self.ui.dial_drywet.setMinimum(0.0)
  879. self.ui.dial_drywet.setMaximum(1.0)
  880. self.ui.dial_drywet.setVisible(self.fPluginInfo['hints'] & PLUGIN_CAN_DRYWET)
  881. self.ui.dial_vol.setIndex(PARAMETER_VOLUME)
  882. self.ui.dial_vol.setPixmap(11)
  883. self.ui.dial_vol.setLabel("Volume")
  884. self.ui.dial_vol.setCustomPaintMode(PixmapDial.CUSTOM_PAINT_MODE_NO_GRADIENT)
  885. self.ui.dial_vol.setMinimum(0.0)
  886. self.ui.dial_vol.setMaximum(1.27)
  887. self.ui.dial_vol.setVisible(self.fPluginInfo['hints'] & PLUGIN_CAN_VOLUME)
  888. self.fParameterList.append([PARAMETER_DRYWET, self.ui.dial_drywet])
  889. self.fParameterList.append([PARAMETER_VOLUME, self.ui.dial_vol])
  890. # -------------------------------------------------------------
  891. self.b_enable = self.ui.b_enable
  892. self.b_gui = self.ui.b_gui
  893. self.b_edit = self.ui.b_edit
  894. self.label_name = self.ui.label_name
  895. self.led_control = self.ui.led_control
  896. self.led_midi = self.ui.led_midi
  897. self.led_audio_in = self.ui.led_audio_in
  898. self.led_audio_out = self.ui.led_audio_out
  899. self.peak_in = self.ui.peak_in
  900. self.peak_out = self.ui.peak_out
  901. self.ready()
  902. self.customContextMenuRequested.connect(self.slot_showDefaultCustomMenu)
  903. #------------------------------------------------------------------
  904. def getFixedHeight(self):
  905. return 79
  906. #------------------------------------------------------------------
  907. def paintEvent(self, event):
  908. painter = QPainter(self)
  909. painter.setBrush(Qt.transparent)
  910. painter.setPen(QPen(QColor(42, 42, 42), 1))
  911. painter.drawRect(0, 1, self.width()-1, 79-3)
  912. painter.setPen(QPen(QColor(60, 60, 60), 1))
  913. painter.drawLine(0, 0, self.width(), 0)
  914. AbstractPluginSlot.paintEvent(self, event)
  915. # ------------------------------------------------------------------------------------------------------------
  916. class PluginSlot_Calf(AbstractPluginSlot):
  917. def __init__(self, parent, host, pluginId):
  918. AbstractPluginSlot.__init__(self, parent, host, pluginId)
  919. self.ui = ui_carla_plugin_calf.Ui_PluginWidget()
  920. self.ui.setupUi(self)
  921. audioCount = self.host.get_audio_port_count_info(self.fPluginId)
  922. midiCount = self.host.get_midi_port_count_info(self.fPluginId)
  923. # -------------------------------------------------------------
  924. # Internal stuff
  925. self.fButtonFont = self.ui.b_gui.font()
  926. self.fButtonFont.setBold(False)
  927. self.fButtonFont.setPointSize(8)
  928. # Use black for mono plugins
  929. self.fBackgroundBlack = audioCount['ins'] == 1
  930. self.fButtonColorOn = QColor( 18, 41, 87)
  931. self.fButtonColorOff = QColor(150, 150, 150)
  932. # -------------------------------------------------------------
  933. # Set-up GUI
  934. self.setStyleSheet("""
  935. QLabel#label_name, QLabel#label_audio_in, QLabel#label_audio_out, QLabel#label_midi {
  936. color: #BBB;
  937. }
  938. PluginSlot_Calf#PluginWidget {
  939. background-image: url(:/bitmaps/background_calf_%s.png);
  940. background-repeat: repeat-xy;
  941. border: 2px;
  942. }
  943. """ % ("black" if self.fBackgroundBlack else "blue"))
  944. self.ui.b_gui.setPixmaps(":/bitmaps/button_calf2.png", ":/bitmaps/button_calf2_down.png", ":/bitmaps/button_calf2_hover.png")
  945. self.ui.b_edit.setPixmaps(":/bitmaps/button_calf2.png", ":/bitmaps/button_calf2_down.png", ":/bitmaps/button_calf2_hover.png")
  946. self.ui.b_remove.setPixmaps(":/bitmaps/button_calf1.png", ":/bitmaps/button_calf1_down.png", ":/bitmaps/button_calf1_hover.png")
  947. self.ui.b_edit.setTopText(self.tr("Edit"), self.fButtonColorOn, self.fButtonFont)
  948. self.ui.b_remove.setTopText(self.tr("Remove"), self.fButtonColorOn, self.fButtonFont)
  949. if self.fPluginInfo['hints'] & PLUGIN_HAS_CUSTOM_UI:
  950. self.ui.b_gui.setTopText(self.tr("GUI"), self.fButtonColorOn, self.fButtonFont)
  951. else:
  952. self.ui.b_gui.setTopText(self.tr("GUI"), self.fButtonColorOff, self.fButtonFont)
  953. labelFont = self.ui.label_name.font()
  954. labelFont.setBold(True)
  955. labelFont.setPointSize(10)
  956. self.ui.label_name.setFont(labelFont)
  957. if audioCount['ins'] == 0:
  958. self.ui.label_audio_in.hide()
  959. self.ui.peak_in.hide()
  960. if audioCount['outs'] > 0:
  961. self.ui.peak_out.setMinimumWidth(200)
  962. if audioCount['outs'] == 0:
  963. self.ui.label_audio_out.hide()
  964. self.ui.peak_out.hide()
  965. if midiCount['ins'] == 0:
  966. self.ui.label_midi.hide()
  967. self.ui.led_midi.hide()
  968. # -------------------------------------------------------------
  969. # Set-up parameters
  970. parameterCount = self.host.get_parameter_count(self.fPluginId)
  971. index = 0
  972. limit = 7 if midiCount['ins'] == 0 else 6
  973. for i in range(parameterCount):
  974. if index >= limit:
  975. break
  976. paramInfo = self.host.get_parameter_info(self.fPluginId, i)
  977. paramData = self.host.get_parameter_data(self.fPluginId, i)
  978. paramRanges = self.host.get_parameter_ranges(self.fPluginId, i)
  979. if paramData['type'] != PARAMETER_INPUT:
  980. continue
  981. if paramData['hints'] & PARAMETER_IS_BOOLEAN:
  982. continue
  983. if (paramData['hints'] & PARAMETER_IS_ENABLED) == 0:
  984. continue
  985. paramName = getParameterShortName(paramInfo['name'])
  986. widget = PixmapDial(self, i)
  987. widget.setPixmap(7)
  988. widget.setLabel(paramName)
  989. widget.setCustomPaintMode(PixmapDial.CUSTOM_PAINT_MODE_NO_GRADIENT)
  990. widget.setMinimum(paramRanges['min'])
  991. widget.setMaximum(paramRanges['max'])
  992. if (paramData['hints'] & PARAMETER_IS_ENABLED) == 0:
  993. widget.setEnabled(False)
  994. self.ui.w_knobs.layout().insertWidget(index, widget)
  995. index += 1
  996. self.fParameterList.append([i, widget])
  997. # -------------------------------------------------------------
  998. self.b_gui = self.ui.b_gui
  999. self.b_edit = self.ui.b_edit
  1000. self.b_remove = self.ui.b_remove
  1001. self.label_name = self.ui.label_name
  1002. self.led_midi = self.ui.led_midi
  1003. self.peak_in = self.ui.peak_in
  1004. self.peak_out = self.ui.peak_out
  1005. self.ready()
  1006. self.ui.led_midi.setColor(self.ui.led_midi.CALF)
  1007. self.customContextMenuRequested.connect(self.slot_showDefaultCustomMenu)
  1008. #------------------------------------------------------------------
  1009. def getFixedHeight(self):
  1010. return 88
  1011. #------------------------------------------------------------------
  1012. def pluginHintsChanged(self, hints):
  1013. if hints & PLUGIN_HAS_CUSTOM_UI:
  1014. self.ui.b_gui.setTopText(self.tr("GUI"), self.fButtonColorOn, self.fButtonFont)
  1015. else:
  1016. self.ui.b_gui.setTopText(self.tr("GUI"), self.fButtonColorOff, self.fButtonFont)
  1017. AbstractPluginSlot.pluginHintsChanged(self, hints)
  1018. #------------------------------------------------------------------
  1019. def paintEvent(self, event):
  1020. painter = QPainter(self)
  1021. painter.setBrush(Qt.transparent)
  1022. painter.setPen(QPen(QColor(20, 20, 20) if self.fBackgroundBlack else QColor(75, 86, 99), 1))
  1023. painter.drawRect(0, 1, self.width()-1, 88-3)
  1024. painter.setPen(QPen(QColor(45, 45, 45) if self.fBackgroundBlack else QColor(86, 99, 114), 1))
  1025. painter.drawLine(0, 0, self.width(), 0)
  1026. AbstractPluginSlot.paintEvent(self, event)
  1027. # ------------------------------------------------------------------------------------------------------------
  1028. class PluginSlot_Nekobi(AbstractPluginSlot):
  1029. def __init__(self, parent, host, pluginId):
  1030. AbstractPluginSlot.__init__(self, parent, host, pluginId)
  1031. #self.ui = ui_carla_plugin_basic_fx.Ui_PluginWidget()
  1032. #self.ui.setupUi(self)
  1033. # -------------------------------------------------------------
  1034. # Set-up GUI
  1035. self.fPixmapCenter = QPixmap(":/bitmaps/background_nekobi.png")
  1036. self.fPixmapLeft = QPixmap(":/bitmaps/background_nekobi_left.png")
  1037. self.fPixmapLeftRect = QRectF(0, 0, self.fPixmapLeft.width(), self.fPixmapLeft.height())
  1038. self.fPixmapRight = QPixmap(":/bitmaps/background_nekobi_right.png")
  1039. self.fPixmapRightRect = QRectF(0, 0, self.fPixmapRight.width(), self.fPixmapRight.height())
  1040. #self.setStyleSheet("""
  1041. #PluginSlot_Nekobi#PluginWidget {
  1042. #background-image: url(:/bitmaps/background_nekobi.png);
  1043. #background-repeat: repeat-xy;
  1044. #}
  1045. #QLabel#label_name {
  1046. #color: #BBB;
  1047. #}
  1048. #""")
  1049. #------------------------------------------------------------------
  1050. def getFixedHeight(self):
  1051. return 108
  1052. #------------------------------------------------------------------
  1053. def paintEvent(self, event):
  1054. painter = QPainter(self)
  1055. # main bg (center)
  1056. painter.drawTiledPixmap(0, 0, self.width(), self.height(), self.fPixmapCenter)
  1057. # left side
  1058. painter.drawPixmap(self.fPixmapLeftRect, self.fPixmapLeft, self.fPixmapLeftRect)
  1059. # right side
  1060. rightTarget = QRectF(self.fPixmapRightRect)
  1061. rightTarget.moveLeft(self.width()-rightTarget.width())
  1062. painter.drawPixmap(rightTarget, self.fPixmapRight, self.fPixmapRightRect)
  1063. AbstractPluginSlot.paintEvent(self, event)
  1064. # ------------------------------------------------------------------------------------------------------------
  1065. class PluginSlot_ZitaRev(AbstractPluginSlot):
  1066. def __init__(self, parent, host, pluginId):
  1067. AbstractPluginSlot.__init__(self, parent, host, pluginId)
  1068. self.ui = ui_carla_plugin_zita.Ui_PluginWidget()
  1069. self.ui.setupUi(self)
  1070. # -------------------------------------------------------------
  1071. # Internal stuff
  1072. audioCount = self.host.get_audio_port_count_info(self.fPluginId)
  1073. # -------------------------------------------------------------
  1074. # Set-up GUI
  1075. self.setMinimumWidth(640)
  1076. self.setStyleSheet("""
  1077. PluginSlot_ZitaRev#PluginWidget {
  1078. background-color: #404040;
  1079. border: 2px solid transparent;
  1080. }
  1081. QWidget#w_revsect {
  1082. background-image: url(:/bitmaps/zita-rev/revsect.png);
  1083. }
  1084. QWidget#w_eq1sect {
  1085. background-image: url(:/bitmaps/zita-rev/eq1sect.png);
  1086. }
  1087. QWidget#w_eq2sect {
  1088. background-image: url(:/bitmaps/zita-rev/eq2sect.png);
  1089. }
  1090. QWidget#w_ambmixsect {
  1091. background-image: url(:/bitmaps/zita-rev/%s.png);
  1092. }
  1093. QWidget#w_redzita {
  1094. background-image: url(:/bitmaps/zita-rev/redzita.png);
  1095. }
  1096. """ % ("mixsect" if audioCount['outs'] == 2 else "ambsect"))
  1097. # -------------------------------------------------------------
  1098. # Set-up Knobs
  1099. self.fKnobDelay = PixmapDial(self, 0)
  1100. self.fKnobDelay.setPixmap(6)
  1101. self.fKnobDelay.setCustomPaintMode(PixmapDial.CUSTOM_PAINT_MODE_ZITA)
  1102. self.fKnobDelay.setMinimum(0.02)
  1103. self.fKnobDelay.setMaximum(0.10)
  1104. self.fKnobXover = PixmapDial(self, 1)
  1105. self.fKnobXover.setPixmap(6)
  1106. self.fKnobXover.setCustomPaintMode(PixmapDial.CUSTOM_PAINT_MODE_ZITA)
  1107. self.fKnobXover.setMinimum(50.0)
  1108. self.fKnobXover.setMaximum(1000.0)
  1109. self.fKnobRtLow = PixmapDial(self, 2)
  1110. self.fKnobRtLow.setPixmap(6)
  1111. self.fKnobRtLow.setCustomPaintMode(PixmapDial.CUSTOM_PAINT_MODE_ZITA)
  1112. self.fKnobRtLow.setMinimum(1.0)
  1113. self.fKnobRtLow.setMaximum(8.0)
  1114. self.fKnobRtMid = PixmapDial(self, 3)
  1115. self.fKnobRtMid.setPixmap(6)
  1116. self.fKnobRtMid.setCustomPaintMode(PixmapDial.CUSTOM_PAINT_MODE_ZITA)
  1117. self.fKnobRtMid.setMinimum(1.0)
  1118. self.fKnobRtMid.setMaximum(8.0)
  1119. self.fKnobDamping = PixmapDial(self, 4)
  1120. self.fKnobDamping.setPixmap(6)
  1121. self.fKnobDamping.setCustomPaintMode(PixmapDial.CUSTOM_PAINT_MODE_ZITA)
  1122. self.fKnobDamping.setMinimum(1500.0)
  1123. self.fKnobDamping.setMaximum(24000.0)
  1124. self.fKnobEq1Freq = PixmapDial(self, 5)
  1125. self.fKnobEq1Freq.setPixmap(6)
  1126. self.fKnobEq1Freq.setCustomPaintMode(PixmapDial.CUSTOM_PAINT_MODE_ZITA)
  1127. self.fKnobEq1Freq.setMinimum(40.0)
  1128. self.fKnobEq1Freq.setMaximum(10000.0)
  1129. self.fKnobEq1Gain = PixmapDial(self, 6)
  1130. self.fKnobEq1Gain.setPixmap(6)
  1131. self.fKnobEq1Gain.setCustomPaintMode(PixmapDial.CUSTOM_PAINT_MODE_ZITA)
  1132. self.fKnobEq1Gain.setMinimum(-20.0)
  1133. self.fKnobEq1Gain.setMaximum(20.0)
  1134. self.fKnobEq2Freq = PixmapDial(self, 7)
  1135. self.fKnobEq2Freq.setPixmap(6)
  1136. self.fKnobEq2Freq.setCustomPaintMode(PixmapDial.CUSTOM_PAINT_MODE_ZITA)
  1137. self.fKnobEq2Freq.setMinimum(40.0)
  1138. self.fKnobEq2Freq.setMaximum(10000.0)
  1139. self.fKnobEq2Gain = PixmapDial(self, 8)
  1140. self.fKnobEq2Gain.setPixmap(6)
  1141. self.fKnobEq2Gain.setCustomPaintMode(PixmapDial.CUSTOM_PAINT_MODE_ZITA)
  1142. self.fKnobEq2Gain.setMinimum(-20.0)
  1143. self.fKnobEq2Gain.setMaximum(20.0)
  1144. self.fKnobMix = PixmapDial(self, 9)
  1145. self.fKnobMix.setPixmap(6)
  1146. self.fKnobMix.setCustomPaintMode(PixmapDial.CUSTOM_PAINT_MODE_ZITA)
  1147. self.fKnobMix.setMinimum(0.0)
  1148. self.fKnobMix.setMaximum(1.0)
  1149. self.fParameterList.append([0, self.fKnobDelay])
  1150. self.fParameterList.append([1, self.fKnobXover])
  1151. self.fParameterList.append([2, self.fKnobRtLow])
  1152. self.fParameterList.append([3, self.fKnobRtMid])
  1153. self.fParameterList.append([4, self.fKnobDamping])
  1154. self.fParameterList.append([5, self.fKnobEq1Freq])
  1155. self.fParameterList.append([6, self.fKnobEq1Gain])
  1156. self.fParameterList.append([7, self.fKnobEq2Freq])
  1157. self.fParameterList.append([8, self.fKnobEq2Gain])
  1158. self.fParameterList.append([9, self.fKnobMix])
  1159. # -------------------------------------------------------------
  1160. self.ready()
  1161. self.customContextMenuRequested.connect(self.slot_showDefaultCustomMenu)
  1162. #------------------------------------------------------------------
  1163. def getFixedHeight(self):
  1164. return 79
  1165. #------------------------------------------------------------------
  1166. def paintEvent(self, event):
  1167. AbstractPluginSlot.paintEvent(self, event)
  1168. self.drawOutline()
  1169. def resizeEvent(self, event):
  1170. self.fKnobDelay.move(self.ui.w_revsect.x()+31, self.ui.w_revsect.y()+33)
  1171. self.fKnobXover.move(self.ui.w_revsect.x()+93, self.ui.w_revsect.y()+18)
  1172. self.fKnobRtLow.move(self.ui.w_revsect.x()+148, self.ui.w_revsect.y()+18)
  1173. self.fKnobRtMid.move(self.ui.w_revsect.x()+208, self.ui.w_revsect.y()+18)
  1174. self.fKnobDamping.move(self.ui.w_revsect.x()+268, self.ui.w_revsect.y()+18)
  1175. self.fKnobEq1Freq.move(self.ui.w_eq1sect.x()+20, self.ui.w_eq1sect.y()+33)
  1176. self.fKnobEq1Gain.move(self.ui.w_eq1sect.x()+69, self.ui.w_eq1sect.y()+18)
  1177. self.fKnobEq2Freq.move(self.ui.w_eq2sect.x()+20, self.ui.w_eq2sect.y()+33)
  1178. self.fKnobEq2Gain.move(self.ui.w_eq2sect.x()+69, self.ui.w_eq2sect.y()+18)
  1179. self.fKnobMix.move(self.ui.w_ambmixsect.x()+24, self.ui.w_ambmixsect.y()+33)
  1180. AbstractPluginSlot.resizeEvent(self, event)
  1181. # ------------------------------------------------------------------------------------------------------------
  1182. class PluginSlot_ZynFX(AbstractPluginSlot):
  1183. def __init__(self, parent, host, pluginId):
  1184. AbstractPluginSlot.__init__(self, parent, host, pluginId)
  1185. self.ui = ui_carla_plugin_zynfx.Ui_PluginWidget()
  1186. self.ui.setupUi(self)
  1187. # -------------------------------------------------------------
  1188. # Set-up GUI
  1189. self.setStyleSheet("""
  1190. PluginSlot_ZynFX#PluginWidget {
  1191. background-image: url(:/bitmaps/background_zynfx.png);
  1192. background-repeat: repeat-xy;
  1193. border: 2px;
  1194. }
  1195. QLabel#label_name, QLabel#label_presets {
  1196. color: #BBB;
  1197. }
  1198. """)
  1199. self.ui.b_enable.setPixmaps(":/bitmaps/button_off.png", ":/bitmaps/button_on.png", ":/bitmaps/button_off.png")
  1200. self.ui.b_edit.setPixmaps(":/bitmaps/button_edit.png", ":/bitmaps/button_edit_down.png", ":/bitmaps/button_edit_hover.png")
  1201. labelFont = self.ui.label_name.font()
  1202. labelFont.setBold(True)
  1203. labelFont.setPointSize(9)
  1204. self.ui.label_name.setFont(labelFont)
  1205. presetFont = self.ui.label_presets.font()
  1206. presetFont.setBold(True)
  1207. presetFont.setPointSize(8)
  1208. self.ui.label_presets.setFont(presetFont)
  1209. # -------------------------------------------------------------
  1210. # Set-up parameters
  1211. parameterCount = self.host.get_parameter_count(self.fPluginId)
  1212. index = 0
  1213. for i in range(parameterCount):
  1214. paramInfo = self.host.get_parameter_info(self.fPluginId, i)
  1215. paramData = self.host.get_parameter_data(self.fPluginId, i)
  1216. paramRanges = self.host.get_parameter_ranges(self.fPluginId, i)
  1217. if paramData['type'] != PARAMETER_INPUT:
  1218. continue
  1219. if paramData['hints'] & PARAMETER_IS_BOOLEAN:
  1220. continue
  1221. if (paramData['hints'] & PARAMETER_IS_ENABLED) == 0:
  1222. continue
  1223. paramName = paramInfo['name']
  1224. # real zyn fx plugins
  1225. if self.fPluginInfo['label'] == "zynalienwah":
  1226. if i == 0: paramName = "Freq"
  1227. elif i == 1: paramName = "Rnd"
  1228. elif i == 2: paramName = "L type" # combobox
  1229. elif i == 3: paramName = "St.df"
  1230. elif i == 5: paramName = "Fb"
  1231. elif i == 7: paramName = "L/R"
  1232. elif self.fPluginInfo['label'] == "zynchorus":
  1233. if i == 0: paramName = "Freq"
  1234. elif i == 1: paramName = "Rnd"
  1235. elif i == 2: paramName = "L type" # combobox
  1236. elif i == 3: paramName = "St.df"
  1237. elif i == 6: paramName = "Fb"
  1238. elif i == 7: paramName = "L/R"
  1239. elif i == 8: paramName = "Flngr" # button
  1240. elif i == 9: paramName = "Subst" # button
  1241. elif self.fPluginInfo['label'] == "zyndistortion":
  1242. if i == 0: paramName = "LRc."
  1243. elif i == 4: paramName = "Neg." # button
  1244. elif i == 5: paramName = "LPF"
  1245. elif i == 6: paramName = "HPF"
  1246. elif i == 7: paramName = "St." # button
  1247. elif i == 8: paramName = "PF" # button
  1248. elif self.fPluginInfo['label'] == "zyndynamicfilter":
  1249. if i == 0: paramName = "Freq"
  1250. elif i == 1: paramName = "Rnd"
  1251. elif i == 2: paramName = "L type" # combobox
  1252. elif i == 3: paramName = "St.df"
  1253. elif i == 4: paramName = "LfoD"
  1254. elif i == 5: paramName = "A.S."
  1255. elif i == 6: paramName = "A.Inv." # button
  1256. elif i == 7: paramName = "A.M."
  1257. elif self.fPluginInfo['label'] == "zynecho":
  1258. if i == 1: paramName = "LRdl."
  1259. elif i == 2: paramName = "LRc."
  1260. elif i == 3: paramName = "Fb."
  1261. elif i == 4: paramName = "Damp"
  1262. elif self.fPluginInfo['label'] == "zynphaser":
  1263. if i == 0: paramName = "Freq"
  1264. elif i == 1: paramName = "Rnd"
  1265. elif i == 2: paramName = "L type" # combobox
  1266. elif i == 3: paramName = "St.df"
  1267. elif i == 5: paramName = "Fb"
  1268. elif i == 7: paramName = "L/R"
  1269. elif i == 8: paramName = "Subst" # button
  1270. elif i == 9: paramName = "Phase"
  1271. elif i == 11: paramName = "Dist"
  1272. elif self.fPluginInfo['label'] == "zynreverb":
  1273. if i == 2: paramName = "I.delfb"
  1274. elif i == 5: paramName = "LPF"
  1275. elif i == 6: paramName = "HPF"
  1276. elif i == 9: paramName = "R.S."
  1277. elif i == 10: paramName = "I.del"
  1278. else:
  1279. paramName = getParameterShortName(paramInfo['name'])
  1280. widget = PixmapDial(self, i)
  1281. widget.setPixmap(5)
  1282. widget.setLabel(paramName)
  1283. widget.setCustomPaintMode(PixmapDial.CUSTOM_PAINT_MODE_NO_GRADIENT)
  1284. widget.setMinimum(paramRanges['min'])
  1285. widget.setMaximum(paramRanges['max'])
  1286. if (paramData['hints'] & PARAMETER_IS_ENABLED) == 0:
  1287. widget.setEnabled(False)
  1288. self.ui.w_knobs.layout().insertWidget(index, widget)
  1289. index += 1
  1290. self.fParameterList.append([i, widget])
  1291. self.ui.dial_drywet.setIndex(PARAMETER_DRYWET)
  1292. self.ui.dial_drywet.setPixmap(5)
  1293. self.ui.dial_drywet.setLabel("Wet")
  1294. self.ui.dial_drywet.setCustomPaintMode(PixmapDial.CUSTOM_PAINT_MODE_NO_GRADIENT)
  1295. self.ui.dial_drywet.setMinimum(0.0)
  1296. self.ui.dial_drywet.setMaximum(1.0)
  1297. self.ui.dial_drywet.setVisible(self.fPluginInfo['hints'] & PLUGIN_CAN_DRYWET)
  1298. self.ui.dial_vol.setIndex(PARAMETER_VOLUME)
  1299. self.ui.dial_vol.setPixmap(5)
  1300. self.ui.dial_vol.setLabel("Vol")
  1301. self.ui.dial_vol.setCustomPaintMode(PixmapDial.CUSTOM_PAINT_MODE_NO_GRADIENT)
  1302. self.ui.dial_vol.setMinimum(0.0)
  1303. self.ui.dial_vol.setMaximum(1.27)
  1304. self.ui.dial_vol.setVisible(self.fPluginInfo['hints'] & PLUGIN_CAN_VOLUME)
  1305. self.fParameterList.append([PARAMETER_DRYWET, self.ui.dial_drywet])
  1306. self.fParameterList.append([PARAMETER_VOLUME, self.ui.dial_vol])
  1307. # -------------------------------------------------------------
  1308. # Set-up MIDI programs
  1309. midiProgramCount = self.host.get_midi_program_count(self.fPluginId)
  1310. if midiProgramCount > 0:
  1311. self.ui.cb_presets.setEnabled(True)
  1312. self.ui.label_presets.setEnabled(True)
  1313. for i in range(midiProgramCount):
  1314. mpData = self.host.get_midi_program_data(self.fPluginId, i)
  1315. mpName = mpData['name']
  1316. self.ui.cb_presets.addItem(mpName)
  1317. self.fCurrentMidiProgram = self.host.get_current_midi_program_index(self.fPluginId)
  1318. self.ui.cb_presets.setCurrentIndex(self.fCurrentMidiProgram)
  1319. else:
  1320. self.fCurrentMidiProgram = -1
  1321. self.ui.cb_presets.setEnabled(False)
  1322. self.ui.cb_presets.setVisible(False)
  1323. self.ui.label_presets.setEnabled(False)
  1324. self.ui.label_presets.setVisible(False)
  1325. # -------------------------------------------------------------
  1326. self.b_enable = self.ui.b_enable
  1327. self.b_edit = self.ui.b_edit
  1328. self.cb_presets = self.ui.cb_presets
  1329. self.label_name = self.ui.label_name
  1330. self.led_control = self.ui.led_control
  1331. self.led_midi = self.ui.led_midi
  1332. self.led_audio_in = self.ui.led_audio_in
  1333. self.led_audio_out = self.ui.led_audio_out
  1334. self.peak_in = self.ui.peak_in
  1335. self.peak_out = self.ui.peak_out
  1336. self.ready()
  1337. self.customContextMenuRequested.connect(self.slot_showDefaultCustomMenu)
  1338. self.ui.cb_presets.currentIndexChanged.connect(self.slot_midiProgramChanged)
  1339. #------------------------------------------------------------------
  1340. def getFixedHeight(self):
  1341. return 74
  1342. #------------------------------------------------------------------
  1343. def paintEvent(self, event):
  1344. painter = QPainter(self)
  1345. painter.setBrush(Qt.transparent)
  1346. painter.setPen(QPen(QColor(60, 60, 60), 1))
  1347. painter.drawRect(0, 1, self.width()-1, 74-3)
  1348. painter.setPen(QPen(QColor(94, 94, 94), 1))
  1349. painter.drawLine(0, 0, self.width(), 0)
  1350. AbstractPluginSlot.paintEvent(self, event)
  1351. # ------------------------------------------------------------------------------------------------------------
  1352. def createPluginSlot(parent, host, pluginId, useSkins):
  1353. if not useSkins:
  1354. return PluginSlot_Default(parent, host, pluginId)
  1355. pluginInfo = host.get_plugin_info(pluginId)
  1356. pluginName = host.get_real_plugin_name(pluginId)
  1357. pluginLabel = pluginInfo['label']
  1358. pluginMaker = pluginInfo['maker']
  1359. uniqueId = pluginInfo['uniqueId']
  1360. #pluginIcon = pluginInfo['iconName']
  1361. if pluginMaker == "OpenAV Productions":
  1362. return PluginSlot_OpenAV(parent, host, pluginId)
  1363. if pluginInfo['type'] == PLUGIN_INTERNAL:
  1364. if pluginLabel.startswith("zyn") and pluginInfo['category'] != PLUGIN_CATEGORY_SYNTH:
  1365. return PluginSlot_ZynFX(parent, host, pluginId)
  1366. elif pluginInfo['type'] == PLUGIN_LADSPA:
  1367. if (pluginLabel == "zita-reverb" and uniqueId == 3701) or (pluginLabel == "zita-reverb-amb" and uniqueId == 3702):
  1368. return PluginSlot_ZitaRev(parent, host, pluginId)
  1369. if pluginLabel.startswith("Zyn") and pluginMaker.startswith("Josep Andreu"):
  1370. return PluginSlot_ZynFX(parent, host, pluginId)
  1371. if pluginName.split(" ", 1)[0].lower() == "calf":
  1372. return PluginSlot_Calf(parent, host, pluginId)
  1373. #if pluginName.lower() == "nekobi":
  1374. #return PluginSlot_Nekobi(parent, pluginId)
  1375. return PluginSlot_BasicFX(parent, host, pluginId)
  1376. # ------------------------------------------------------------------------------------------------------------
  1377. # Main Testing
  1378. if __name__ == '__main__':
  1379. from carla_app import CarlaApplication
  1380. import resources_rc
  1381. app = CarlaApplication("Carla-Skins")
  1382. #gui = PluginSlot_BasicFX(None, 0)
  1383. #gui = PluginSlot_Calf(None, 0)
  1384. #gui = PluginSlot_Default(None, 0)
  1385. #gui = PluginSlot_ZitaRev(None, 0)
  1386. gui = PluginSlot_ZynFX(None, 0)
  1387. gui.setSelected(True)
  1388. gui.show()
  1389. app.exec_()