Browse Source

Merge branch claudia-adopt into LADI/main

pull/362/head
Nedko Arnaudov 1 year ago
parent
commit
aaf165b519
22 changed files with 10984 additions and 182 deletions
  1. +3
    -0
      .gitignore
  2. +23
    -2
      Makefile
  3. +205
    -51
      data/cadence-pulse2jack
  4. +49
    -0
      locale/cadence.pro
  5. +4987
    -0
      locale/cadence_en.ts
  6. +5011
    -0
      locale/cadence_fr.ts
  7. +40
    -0
      locale/update_pro.sh
  8. +7
    -7
      resources/ui/cadence.ui
  9. +56
    -7
      resources/ui/cadence_tb_pa.ui
  10. +110
    -46
      src/cadence.py
  11. +4
    -4
      src/cadence_session_start.py
  12. +2
    -0
      src/catarina.py
  13. +5
    -3
      src/catia.py
  14. +2
    -0
      src/claudia.py
  15. +410
    -52
      src/claudia_database.py
  16. +9
    -7
      src/claudia_launcher.py
  17. +2
    -0
      src/jacksettings.py
  18. +2
    -0
      src/logs.py
  19. +4
    -2
      src/render.py
  20. +1
    -1
      src/shared_canvasjack.py
  21. +49
    -0
      src/shared_i18n.py
  22. +3
    -0
      src/systray.py

+ 3
- 0
.gitignore View File

@@ -29,6 +29,9 @@ ui_*.py
src/resources_rc.py
qrc_resources*.cpp

# Translation files
*.qm

# Binaries
c++/jackmeter/cadence-jackmeter
c++/xycontroller/cadence-xycontroller


+ 23
- 2
Makefile View File

@@ -13,6 +13,8 @@ DESTDIR =
LINK = ln -s
PYUIC ?= pyuic5
PYRCC ?= pyrcc5
PYLUPDATE ?= pylupdate5
LRELEASE ?= lrelease

# Detect X11 rules dir
ifeq "$(wildcard /etc/X11/Xsession.d/ )" ""
@@ -22,8 +24,13 @@ else
endif

# -----------------------------------------------------------------------------------------------------------------------------------------
# Internationalization

all: CPP RES UI
I18N_LANGUAGES :=

# -----------------------------------------------------------------------------------------------------------------------------------------

all: CPP RES UI locale

# -----------------------------------------------------------------------------------------------------------------------------------------
# C++ code
@@ -44,6 +51,13 @@ RES: src/resources_rc.py
src/resources_rc.py: resources/resources.qrc
$(PYRCC) $< -o $@

# -----------------------------------------------------------------------------------------------------------------------------------------
# Translations
locale: locale/cadence_en.qm locale/cadence_fr.qm
locale/%.qm: locale/%.ts
$(LRELEASE) $< -qm $@

# -----------------------------------------------------------------------------------------------------------------------------------------
# UI code

@@ -77,7 +91,7 @@ src/ui_%.py: resources/ui/%.ui
clean:
$(MAKE) clean -C c++/jackmeter
$(MAKE) clean -C c++/xycontroller
rm -f *~ src/*~ src/*.pyc src/ui_*.py src/resources_rc.py
rm -f *~ src/*~ src/*.pyc src/ui_*.py src/resources_rc.py resources/locale/*.qm

# -----------------------------------------------------------------------------------------------------------------------------------------

@@ -102,6 +116,7 @@ install:
install -d $(DESTDIR)$(PREFIX)/share/cadence/pulse2loopback/
install -d $(DESTDIR)$(PREFIX)/share/cadence/icons/
install -d $(DESTDIR)$(PREFIX)/share/cadence/templates/
install -d $(DESTDIR)$(PREFIX)/share/cadence/locale/
install -d $(X11_RC_DIR)

# Install script files and binaries
@@ -164,6 +179,12 @@ install:
# Install main code
install -m 644 src/*.py $(DESTDIR)$(PREFIX)/share/cadence/src/

# Install translations
install -m 644 locale/*.qm $(DESTDIR)$(PREFIX)/share/cadence/locale/

# compile python files
python3 -m compileall $(DESTDIR)$(PREFIX)/share/cadence/src/
# Install addtional stuff for Cadence
install -m 644 data/pulse2jack/* $(DESTDIR)$(PREFIX)/share/cadence/pulse2jack/
install -m 644 data/pulse2loopback/* $(DESTDIR)$(PREFIX)/share/cadence/pulse2loopback/


+ 205
- 51
data/cadence-pulse2jack View File

@@ -43,38 +43,66 @@ else
fi

# ----------------------------------------------
wanted_capture_ports=0 # -1 means default
wanted_playback_ports=0 # -1 means default

PLAY_ONLY="no"
arg_is_for=""

case $1 in
-h|--h|--help)
echo "usage: $0 [command]
for arg in "$@";do
case "$arg" in
-h|--h|--help)
echo "usage: $0 [command]
-p Playback only with default number of channels
-p <NUMBER> Number of playback channels
-c Capture only with default number of channels
-c <NUMBER> Number of capture channels

-p, --play Playback mode only
-h, --help Show this help menu
--dummy Don't do anything, just create the needed files

-h, --help Show this help menu
--dummy Don't do anything, just create the needed files
NOTE:
When runned with no arguments, $(basename "$0") will
activate PulseAudio with both playback and record modes with default number of channels.
"
exit
;;
--dummy)
exit
;;
-c|--capture)
arg_is_for="capture"
wanted_capture_ports=-1 # -1 means default, if no (correct) argument is given.
;;
-p|--play|--playback)
arg_is_for="playback"
wanted_playback_ports=-1
;;
* )
case "$arg_is_for" in
"capture")
[ "$arg" -ge 0 ] 2>/dev/null && wanted_capture_ports="$arg"
;;
"playback")
[ "$arg" -ge 0 ] 2>/dev/null && wanted_playback_ports="$arg"
;;
esac
;;
esac
done

NOTE:
When runned with no arguments, pulse2jack will
activate PulseAudio with both playback and record modes.
"
exit
;;

--dummy)
exit
;;
if [ $wanted_capture_ports == 0 ] && [ $wanted_playback_ports == 0 ];then
#no sense to want to start/bridge pulseaudio without ports, set as default
capture_ports=-1 # -1 means default
playback_ports=-1 # -1 means default
fi

-p|--p|--play)
PLAY_ONLY="yes"
FILE=$INSTALL_PREFIX/share/cadence/pulse2jack/play.pa
;;
str_capture="channels=$wanted_capture_ports" #used for pulseaudio commands
str_playback="channels=$wanted_playback_ports" ##

*)
FILE=$INSTALL_PREFIX/share/cadence/pulse2jack/play+rec.pa
;;
esac
[ $wanted_capture_ports == -1 ] && str_capture="" # -1 means default, no command channels=n
[ $wanted_playback_ports == -1 ] && str_playback="" ##

# ----------------------------------------------

@@ -88,40 +116,166 @@ IsPulseAudioRunning()
fi
}

if (IsPulseAudioRunning); then
StartBridged()
{
if (`jack_lsp | grep "PulseAudio JACK Sink:" > /dev/null`); then
{
echo "PulseAudio is already running and bridged to JACK"
}
#write pulseaudio config file in a tmp file
pa_file=$(mktemp --suffix .pa)
echo .fail > $pa_file
### Automatically restore the volume of streams and devices
echo load-module module-device-restore >> $pa_file
echo load-module module-stream-restore >> $pa_file
echo load-module module-card-restore >> $pa_file
### Load Jack modules
[ $wanted_capture_ports != 0 ] && echo load-module module-jack-source $str_capture >> $pa_file
[ $wanted_playback_ports != 0 ] && echo load-module module-jack-sink $str_playback >> $pa_file
### Load unix protocol
echo load-module module-native-protocol-unix >> $pa_file
### Automatically restore the default sink/source when changed by the user
### during runtime
### NOTE: This should be loaded as early as possible so that subsequent modules
### that look up the default sink/source get the right value
echo load-module module-default-device-restore >> $pa_file
### Automatically move streams to the default sink if the sink they are
### connected to dies, similar for sources
echo load-module module-rescue-streams >> $pa_file
### Make sure we always have a sink around, even if it is a null sink.
echo load-module module-always-sink >> $pa_file
### Make Jack default
[ $wanted_capture_ports != 0 ] && echo set-default-source jack_in >> $pa_file
[ $wanted_playback_ports != 0 ] && echo set-default-sink jack_out >> $pa_file
if (`pulseaudio --daemonize --high-priority --realtime --exit-idle-time=-1 --file=$pa_file -n`); then
echo "Initiated PulseAudio successfully!"
else
{
echo "PulseAudio is already running, bridge it..."
echo "Failed to initialize PulseAudio!"
fi
}

if [ "$PLAY_ONLY" == "yes" ]; then
{
pactl load-module module-jack-sink > /dev/null
pacmd set-default-source jack_in > /dev/null
}
else
{
pactl load-module module-jack-sink > /dev/null
pactl load-module module-jack-source > /dev/null
pacmd set-default-sink jack_out > /dev/null
killReStart()
{
pulseaudio -k && StartBridged
exit
}

JackNotRunning()
{
echo "JACK seems not running, start JACK before bridge PulseAudio"
exit 1
}

if (IsPulseAudioRunning); then
{
#count all Jack Audio Physical ports
all_jack_lsp=$(jack_lsp -p -t) || JackNotRunning
output_physical_lines=$(echo "$all_jack_lsp"|grep -n "output,physical,"|cut -d':' -f1)
input_physical_lines=$( echo "$all_jack_lsp"|grep -n "input,physical," |cut -d':' -f1)
audio_lines=$(echo "$all_jack_lsp" |grep -n " audio"|cut -d':' -f1)
capture_physical_ports=0
playback_physical_ports=0
for out_phy_line in $output_physical_lines;do
if echo "$audio_lines"|grep -q $(($out_phy_line + 1));then
((capture_physical_ports++))
fi
done
for in_phy_line in $input_physical_lines;do
if echo "$audio_lines"|grep -q $(($in_phy_line + 1));then
((playback_physical_ports++))
fi
done
#count PulseAudio jack ports
current_playback_ports=$(echo "$all_jack_lsp"|grep ^"PulseAudio JACK Sink:" |wc -l)
current_capture_ports=$( echo "$all_jack_lsp"|grep ^"PulseAudio JACK Source:"|wc -l)
#if number of pulseaudio ports equal to physical ports, consider pulseaudio module is running the default mode (no channels=n)
[ $current_capture_ports == $capture_physical_ports ] && current_capture_ports=-1
[ $current_playback_ports == $playback_physical_ports ] && current_playback_ports=-1
[ $wanted_capture_ports == $capture_physical_ports ] && wanted_capture_ports=-1
[ $wanted_playback_ports == $playback_physical_ports ] && wanted_playback_ports=-1
if [ $wanted_capture_ports == $current_capture_ports ] && [ $wanted_playback_ports == $current_playback_ports ];then
echo "PulseAudio is already started and bridged to Jack with $current_capture_ports inputs and $current_playback_ports outputs, nothing to do !"
exit
fi
if [ $current_capture_ports != $wanted_capture_ports ];then
if [ $current_capture_ports != 0 ];then
echo "unload PulseAudio JACK Source"
pactl unload-module module-jack-source > /dev/null || killReStart
fi
if [ $wanted_capture_ports != 0 ];then
echo "load PulseAudio JACK Source $str_capture"
pactl load-module module-jack-source $str_capture > /dev/null
pacmd set-default-source jack_in > /dev/null
}
fi

echo "Done"
}
fi
if [ $current_playback_ports != $wanted_playback_ports ];then
if [ $current_playback_ports != 0 ];then
echo "unload PulseAudio JACK Sink"
pactl unload-module module-jack-sink > /dev/null || killReStart
fi
if [ $wanted_playback_ports != 0 ];then
echo "load PulseAudio JACK Sink $str_playback"
pactl load-module module-jack-sink $str_playback > /dev/null
pactl set-default-sink jack_out > /dev/null
fi
fi
}
else
{
if (`pulseaudio --daemonize --high-priority --realtime --exit-idle-time=-1 --file=$FILE -n`); then
echo "Initiated PulseAudio successfully!"
else
echo "Failed to initialize PulseAudio!"
fi
{
StartBridged
# #write pulseaudio config file in a tmp file
# pa_file=$(mktemp --suffix .pa)
# echo .fail > $pa_file
#
# ### Automatically restore the volume of streams and devices
# echo load-module module-device-restore >> $pa_file
# echo load-module module-stream-restore >> $pa_file
# echo load-module module-card-restore >> $pa_file
#
# ### Load Jack modules
# [ $wanted_capture_ports != 0 ] && echo load-module module-jack-source $str_capture >> $pa_file
# [ $wanted_playback_ports != 0 ] && echo load-module module-jack-sink $str_playback >> $pa_file
#
# ### Load unix protocol
# echo load-module module-native-protocol-unix >> $pa_file
#
# ### Automatically restore the default sink/source when changed by the user
# ### during runtime
# ### NOTE: This should be loaded as early as possible so that subsequent modules
# ### that look up the default sink/source get the right value
# echo load-module module-default-device-restore >> $pa_file
#
# ### Automatically move streams to the default sink if the sink they are
# ### connected to dies, similar for sources
# echo load-module module-rescue-streams >> $pa_file
#
# ### Make sure we always have a sink around, even if it is a null sink.
# echo load-module module-always-sink >> $pa_file
#
# ### Make Jack default
# [ $wanted_capture_ports != 0 ] && echo set-default-source jack_in >> $pa_file
# [ $wanted_playback_ports != 0 ] && echo set-default-sink jack_out >> $pa_file
#
# if (`pulseaudio --daemonize --high-priority --realtime --exit-idle-time=-1 --file=$pa_file -n`); then
# echo "Initiated PulseAudio successfully!"
# else
# echo "Failed to initialize PulseAudio!"
# fi
}
fi

+ 49
- 0
locale/cadence.pro View File

@@ -0,0 +1,49 @@
FORMS += ../resources/ui/cadence_rwait.ui
FORMS += ../resources/ui/cadence_tb_a2j.ui
FORMS += ../resources/ui/cadence_tb_alsa.ui
FORMS += ../resources/ui/cadence_tb_jack.ui
FORMS += ../resources/ui/cadence_tb_pa.ui
FORMS += ../resources/ui/cadence.ui
FORMS += ../resources/ui/catarina_addgroup.ui
FORMS += ../resources/ui/catarina_addport.ui
FORMS += ../resources/ui/catarina_connectports.ui
FORMS += ../resources/ui/catarina_disconnectports.ui
FORMS += ../resources/ui/catarina_removegroup.ui
FORMS += ../resources/ui/catarina_removeport.ui
FORMS += ../resources/ui/catarina_renamegroup.ui
FORMS += ../resources/ui/catarina_renameport.ui
FORMS += ../resources/ui/catarina.ui
FORMS += ../resources/ui/catia.ui
FORMS += ../resources/ui/claudia_createroom.ui
FORMS += ../resources/ui/claudia_launcher_app.ui
FORMS += ../resources/ui/claudia_launcher.ui
FORMS += ../resources/ui/claudia_projectname.ui
FORMS += ../resources/ui/claudia_projectproperties.ui
FORMS += ../resources/ui/claudia_runcustom.ui
FORMS += ../resources/ui/claudia_studiolist.ui
FORMS += ../resources/ui/claudia_studioname.ui
FORMS += ../resources/ui/claudia.ui
FORMS += ../resources/ui/logs.ui
FORMS += ../resources/ui/render.ui
FORMS += ../resources/ui/settings_app.ui
FORMS += ../resources/ui/settings_jack.ui
FORMS += ../resources/ui/xycontroller.ui
SOURCES += ../src/cadence.py
SOURCES += ../src/cadence_session_start.py
SOURCES += ../src/catarina.py
SOURCES += ../src/catia.py
SOURCES += ../src/claudia_launcher.py
SOURCES += ../src/claudia.py
SOURCES += ../src/jacklib_helpers.py
SOURCES += ../src/jacklib.py
SOURCES += ../src/jacksettings.py
SOURCES += ../src/patchcanvas.py
SOURCES += ../src/render.py
SOURCES += ../src/shared_cadence.py
SOURCES += ../src/shared_canvasjack.py
SOURCES += ../src/shared.py
SOURCES += ../src/systray.py

TRANSLATIONS += cadence_en.ts
TRANSLATIONS += cadence_fr.ts


+ 4987
- 0
locale/cadence_en.ts
File diff suppressed because it is too large
View File


+ 5011
- 0
locale/cadence_fr.ts
File diff suppressed because it is too large
View File


+ 40
- 0
locale/update_pro.sh View File

@@ -0,0 +1,40 @@
#!/bin/bash

# This is a little script for refresh raysession.pro and update .ts files.
# TRANSLATOR: You don't need to run it !

contents=""

this_script=`realpath "$0"`
locale_root=`dirname "$this_script"`
code_root=`dirname "$locale_root"`
cd "$code_root/resources/ui/"

for file in *.ui;do
contents+="FORMS += ../resources/ui/$file
"
done


# for dir in daemon gui gui/patchcanvas shared;do
cd "$code_root/src"
for file in *.py;do
[[ "$file" =~ ^ui_ ]] && continue
if cat "$file"|grep -q ".tr(";then
contents+="SOURCES += ../src/${file}
"
fi
done
# done

contents+="
TRANSLATIONS += cadence_en.ts
TRANSLATIONS += cadence_fr.ts
"

echo "$contents" > "$locale_root/cadence.pro"

pylupdate5 "$locale_root/cadence.pro"


+ 7
- 7
resources/ui/cadence.ui View File

@@ -916,6 +916,13 @@
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="b_pulse_channels">
<property name="text">
<string>Channels</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_13">
<property name="orientation">
@@ -956,13 +963,6 @@
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="tb_pulse_options">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
<item>


+ 56
- 7
resources/ui/cadence_tb_pa.ui View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>317</width>
<height>72</height>
<width>218</width>
<height>124</height>
</rect>
</property>
<property name="windowTitle">
@@ -15,11 +15,60 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QCheckBox" name="cb_playback_only">
<property name="text">
<string>Playback Mode only</string>
</property>
</widget>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="labelPulseInputs">
<property name="text">
<string>Input Channels :</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="labelPulseOutputs">
<property name="text">
<string>Output Channels :</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="spinBoxPulseInputs">
<property name="specialValueText">
<string>Default</string>
</property>
<property name="minimum">
<number>-1</number>
</property>
<property name="maximum">
<number>10</number>
</property>
<property name="value">
<number>-1</number>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="spinBoxPulseOutputs">
<property name="specialValueText">
<string>Default</string>
</property>
<property name="minimum">
<number>-1</number>
</property>
<property name="maximum">
<number>10</number>
</property>
<property name="value">
<number>-1</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">


+ 110
- 46
src/cadence.py View File

@@ -42,6 +42,7 @@ from shared import getDaemonLockfile
from shared_cadence import *
from shared_canvasjack import *
from shared_settings import *
from shared_i18n import *

# ------------------------------------------------------------------------------------------------------------
# Import getoutput
@@ -122,10 +123,16 @@ XDG_APPLICATIONS_PATH = [
]

# ---------------------------------------------------------------------
class PulseAudioJackBridgeValues(object):
clientIdCapture = -1
clientIdPlayback = -1
portCaptureNumber = 0
portPlaybackNumber = 0

global jackClientIdALSA, jackClientIdPulse

global jackClientIdALSA
jackClientIdALSA = -1
jackClientIdPulse = -1
pA_bridge_values = PulseAudioJackBridgeValues()

# jackdbus indexes
iGraphVersion = 0
@@ -346,7 +353,8 @@ def isPulseAudioStarted():

def isPulseAudioBridged():
global jackClientIdPulse
return bool(jackClientIdPulse != -1)
return bool(pA_bridge_values.clientIdCapture != -1
or pA_bridge_values.clientIdPlayback != -1)

def isDesktopFileInstalled(desktop):
for X_PATH in XDG_APPLICATIONS_PATH:
@@ -472,6 +480,9 @@ class CadenceSystemCheck_audioGroup(CadenceSystemCheck):
self.result = self.tr("No")
self.moreInfo = None

def tr(self, text):
return app.translate("CadenceSystemCheck_audioGroup", text)

class CadenceSystemCheck_kernel(CadenceSystemCheck):
def __init__(self):
CadenceSystemCheck.__init__(self)
@@ -515,6 +526,8 @@ class CadenceSystemCheck_kernel(CadenceSystemCheck):
else:
self.icon = self.ICON_ERROR
self.moreInfo = None
def tr(self, text):
return app.translate("CadenceSystemCheck_kernel", text)

def initSystemChecks():
if LINUX:
@@ -593,10 +606,10 @@ class ForceRestartThread(QThread):

# PulseAudio
if GlobalSettings.value("Pulse2JACK/AutoStart", True, type=bool) and not isPulseAudioBridged():
if GlobalSettings.value("Pulse2JACK/PlaybackModeOnly", False, type=bool):
os.system("cadence-pulse2jack -p")
else:
os.system("cadence-pulse2jack")
inputs = GlobalSettings.value("Pulse2JACK/CaptureChannels", -1, type=int)
outputs = GlobalSettings.value("Pulse2JACK/PlaybackChannels", -1, type=int)
os.system("cadence-pulse2jack -c %s -p %s" % (str(inputs), str(outputs)))

self.progressChanged.emit(100)

@@ -730,18 +743,24 @@ class ToolBarAlsaAudioDialog(QDialog, ui_cadence_tb_alsa.Ui_Dialog):
self.close()

# Additional PulseAudio options
class ToolBarPADialog(QDialog, ui_cadence_tb_pa.Ui_Dialog):
class PAChannelsDialog(QDialog, ui_cadence_tb_pa.Ui_Dialog):
def __init__(self, parent):
QDialog.__init__(self, parent)
self.setupUi(self)
self.parent = parent

self.cb_playback_only.setChecked(GlobalSettings.value("Pulse2JACK/PlaybackModeOnly", False, type=bool))
self.spinBoxPulseInputs.setValue(GlobalSettings.value("Pulse2JACK/CaptureChannels", 2, type=int))
self.spinBoxPulseOutputs.setValue(GlobalSettings.value("Pulse2JACK/PlaybackChannels", 2, type=int))

self.accepted.connect(self.slot_setOptions)
self.accepted.connect(self.slot_updateChannels)

@pyqtSlot()
def slot_setOptions(self):
GlobalSettings.setValue("Pulse2JACK/PlaybackModeOnly", self.cb_playback_only.isChecked())
def slot_updateChannels(self):
GlobalSettings.setValue("Pulse2JACK/CaptureChannels", self.spinBoxPulseInputs.value())
GlobalSettings.setValue("Pulse2JACK/PlaybackChannels", self.spinBoxPulseOutputs.value())
if isPulseAudioBridged():
self.parent.slot_PulseAudioBridgeStart()

def done(self, r):
QDialog.done(self, r)
@@ -753,6 +772,8 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW):
DBusJackServerStoppedCallback = pyqtSignal()
DBusJackClientAppearedCallback = pyqtSignal(int, str)
DBusJackClientDisappearedCallback = pyqtSignal(int)
DBusJackPortAppearedCallback = pyqtSignal(int)
DBusJackPortDisappearedCallback = pyqtSignal(int)
DBusA2JBridgeStartedCallback = pyqtSignal()
DBusA2JBridgeStoppedCallback = pyqtSignal()

@@ -1080,6 +1101,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW):
self.systray.addMenu("pulse", self.tr("PulseAudio Bridge"))
self.systray.addMenuAction("pulse", "pulse_start", self.tr("Start"))
self.systray.addMenuAction("pulse", "pulse_stop", self.tr("Stop"))
self.systray.addMenuAction("pulse", "pulse_channels", self.tr("Channels"))

self.systray.setActionIcon("jack_start", "media-playback-start")
self.systray.setActionIcon("jack_stop", "media-playback-stop")
@@ -1090,6 +1112,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW):
self.systray.setActionIcon("a2j_stop", "media-playback-stop")
self.systray.setActionIcon("pulse_start", "media-playback-start")
self.systray.setActionIcon("pulse_stop", "media-playback-stop")
self.systray.setActionIcon("pulse_channels", "audio-card")

self.systray.connect("jack_start", self.slot_JackServerStart)
self.systray.connect("jack_stop", self.slot_JackServerStop)
@@ -1100,17 +1123,18 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW):
self.systray.connect("a2j_stop", self.slot_A2JBridgeStop)
self.systray.connect("pulse_start", self.slot_PulseAudioBridgeStart)
self.systray.connect("pulse_stop", self.slot_PulseAudioBridgeStop)
self.systray.connect("pulse_channels", self.slot_PulseAudioBridgeChannels)

self.systray.addMenu("tools", self.tr("Tools"))
self.systray.addMenuAction("tools", "app_catarina", "Catarina")
self.systray.addMenuAction("tools", "app_catia", "Catia")
self.systray.addMenuAction("tools", "app_claudia", "Claudia")
self.systray.addMenuSeparator("tools", "tools_sep")
self.systray.addMenuAction("tools", "app_logs", "Logs")
self.systray.addMenuAction("tools", "app_meter_in", "Meter (Inputs)")
self.systray.addMenuAction("tools", "app_meter_out", "Meter (Output)")
self.systray.addMenuAction("tools", "app_render", "Render")
self.systray.addMenuAction("tools", "app_xy-controller", "XY-Controller")
self.systray.addMenuAction("tools", "app_logs", self.tr("Logs"))
self.systray.addMenuAction("tools", "app_meter_in", self.tr("Meter (Inputs)"))
self.systray.addMenuAction("tools", "app_meter_out", self.tr("Meter (Output)"))
self.systray.addMenuAction("tools", "app_render", self.tr("Render"))
self.systray.addMenuAction("tools", "app_xy-controller", self.tr("XY-Controller"))
self.systray.addSeparator("sep2")

self.systray.connect("app_catarina", self.func_start_catarina)
@@ -1144,7 +1168,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW):
self.b_a2j_stop.clicked.connect(self.slot_A2JBridgeStop)
self.b_pulse_start.clicked.connect(self.slot_PulseAudioBridgeStart)
self.b_pulse_stop.clicked.connect(self.slot_PulseAudioBridgeStop)
self.tb_pulse_options.clicked.connect(self.slot_PulseAudioBridgeOptions)
self.b_pulse_channels.clicked.connect(self.slot_PulseAudioBridgeChannels)

self.pic_catia.clicked.connect(self.func_start_catia)
self.pic_claudia.clicked.connect(self.func_start_claudia)
@@ -1196,6 +1220,8 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW):
# org.jackaudio.JackPatchbay
self.DBusJackClientAppearedCallback.connect(self.slot_DBusJackClientAppearedCallback)
self.DBusJackClientDisappearedCallback.connect(self.slot_DBusJackClientDisappearedCallback)
self.DBusJackPortAppearedCallback.connect(self.slot_DBusJackPortAppearedCallback)
self.DBusJackPortDisappearedCallback.connect(self.slot_DBusJackPortDisappearedCallback)

# org.gna.home.a2jmidid.control
self.DBusA2JBridgeStartedCallback.connect(self.slot_DBusA2JBridgeStartedCallback)
@@ -1244,23 +1270,26 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW):
if group_name == "alsa2jack":
global jackClientIdALSA
jackClientIdALSA = group_id
elif group_name == "PulseAudio JACK Source":
pA_bridge_values.clientIdCapture = group_id
pA_bridge_values.portCaptureNumber = len(ports)
elif group_name == "PulseAudio JACK Sink":
global jackClientIdPulse
jackClientIdPulse = group_id
pA_bridge_values.clientIdPlayback = group_id
pA_bridge_values.portPlaybackNumber = len(ports)

self.jackStarted()

else:
self.jackStopped()
self.label_jack_realtime.setText("Yes" if jacksettings.isRealtime() else "No")
self.label_jack_realtime.setText(self.tr("Yes") if jacksettings.isRealtime() else self.tr("No"))
else:
self.jackStopped()
self.label_jack_status.setText("Unavailable")
self.label_jack_status.setText(self.tr("Unavailable"))
self.label_jack_status_ico.setPixmap(self.pix_error)
self.label_jack_realtime.setText("Unknown")
self.label_jack_realtime.setText(self.tr("Unknown"))
self.label_jack_realtime_ico.setPixmap(self.pix_error)
self.groupBox_jack.setEnabled(False)
self.groupBox_jack.setTitle("-- jackdbus is not available --")
self.groupBox_jack.setTitle(self.tr("-- jackdbus is not available --"))
self.b_jack_start.setEnabled(False)
self.b_jack_stop.setEnabled(False)
self.b_jack_restart.setEnabled(False)
@@ -1282,7 +1311,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW):
self.toolBox_alsamidi.setEnabled(False)
self.cb_a2j_autostart.setChecked(False)
self.cb_a2j_autoexport.setChecked(False)
self.label_bridge_a2j.setText("ALSA MIDI Bridge is not installed")
self.label_bridge_a2j.setText(self.tr("ALSA MIDI Bridge is not installed"))
self.settings.setValue("A2J/AutoStart", False)

self.updateSystrayTooltip()
@@ -1312,6 +1341,10 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW):
self.DBusJackClientAppearedCallback.emit(args[iJackClientId], args[iJackClientName])
elif kwds['member'] == "ClientDisappeared":
self.DBusJackClientDisappearedCallback.emit(args[iJackClientId])
elif kwds['member'] == "PortAppeared":
self.DBusJackPortAppearedCallback.emit(args[iJackClientId])
elif kwds['member'] == "PortDisappeared":
self.DBusJackPortDisappearedCallback.emit(args[iJackClientId])

elif kwds['interface'] == "org.gna.home.a2jmidid.control":
if DEBUG: print("org.gna.home.a2jmidid.control", kwds['member'])
@@ -1331,19 +1364,19 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW):
self.systray.setActionEnabled("jack_start", False)
self.systray.setActionEnabled("jack_stop", True)

self.label_jack_status.setText("Started")
self.label_jack_status.setText(self.tr("Started"))
self.label_jack_status_ico.setPixmap(self.pix_apply)

if gDBus.jack.IsRealtime():
self.label_jack_realtime.setText("Yes")
self.label_jack_realtime.setText(self.tr("Yes"))
self.label_jack_realtime_ico.setPixmap(self.pix_apply)
else:
self.label_jack_realtime.setText("No")
self.label_jack_realtime.setText(self.tr("No"))
self.label_jack_realtime_ico.setPixmap(self.pix_cancel)

self.label_jack_dsp.setText("%.2f%%" % self.m_last_dsp_load)
self.label_jack_xruns.setText(str(self.m_last_xruns))
self.label_jack_bfsize.setText("%i samples" % self.m_last_buffer_size)
self.label_jack_bfsize.setText(self.tr("%i samples") % self.m_last_buffer_size)
self.label_jack_srate.setText("%i Hz" % gDBus.jack.GetSampleRate())
self.label_jack_latency.setText("%.1f ms" % gDBus.jack.GetLatency())

@@ -1380,7 +1413,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW):
self.systray.setActionEnabled("jack_start", True)
self.systray.setActionEnabled("jack_stop", False)

self.label_jack_status.setText("Stopped")
self.label_jack_status.setText(self.tr("Stopped"))
self.label_jack_status_ico.setPixmap(self.pix_cancel)

self.label_jack_dsp.setText("---")
@@ -1393,9 +1426,11 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW):
self.b_a2j_start.setEnabled(False)
self.systray.setActionEnabled("a2j_start", False)

global jackClientIdALSA, jackClientIdPulse
global jackClientIdALSA
jackClientIdALSA = -1
jackClientIdPulse = -1

pA_bridge_values.clientIdCapture = -1
pA_bridge_values.clientIdPlayback = -1

if haveDBus:
self.checkAlsaAudio()
@@ -1498,7 +1533,10 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW):
self.b_pulse_stop.setEnabled(True)
self.systray.setActionEnabled("pulse_start", False)
self.systray.setActionEnabled("pulse_stop", True)
self.label_bridge_pulse.setText(self.tr("PulseAudio is started and bridged to JACK"))
self.label_bridge_pulse.setText(
self.tr("PulseAudio is started and bridged to JACK with %s inputs/%s outputs")
% (pA_bridge_values.portCaptureNumber,
pA_bridge_values.portPlaybackNumber))
else:
jackRunning = bool(gDBus.jack and gDBus.jack.IsStarted())
self.b_pulse_start.setEnabled(jackRunning)
@@ -1632,19 +1670,44 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW):
global jackClientIdALSA
jackClientIdALSA = group_id
self.checkAlsaAudio()
elif group_name == "PulseAudio JACK Source":
pA_bridge_values.clientIdCapture = group_id
self.checkPulseAudio()
elif group_name == "PulseAudio JACK Sink":
global jackClientIdPulse
jackClientIdPulse = group_id
pA_bridge_values.clientIdPlayback = group_id
self.checkPulseAudio()

@pyqtSlot(int)
def slot_DBusJackClientDisappearedCallback(self, group_id):
global jackClientIdALSA, jackClientIdPulse
global jackClientIdALSA
if group_id == jackClientIdALSA:
jackClientIdALSA = -1
self.checkAlsaAudio()
elif group_id == jackClientIdPulse:
jackClientIdPulse = -1
elif group_id == pA_bridge_values.clientIdCapture:
pA_bridge_values.clientIdCapture = -1
pA_bridge_values.portCaptureNumber = 0
self.checkPulseAudio()
elif group_id == pA_bridge_values.clientIdPlayback:
pA_bridge_values.clientIdPlayback = -1
pA_bridge_values.portPlaybackNumber = 0
self.checkPulseAudio()
@pyqtSlot(int)
def slot_DBusJackPortAppearedCallback(self, group_id):
if group_id == pA_bridge_values.clientIdCapture:
pA_bridge_values.portCaptureNumber+=1
self.checkPulseAudio()
elif group_id == pA_bridge_values.clientIdPlayback:
pA_bridge_values.portPlaybackNumber+=1
self.checkPulseAudio()
@pyqtSlot(int)
def slot_DBusJackPortDisappearedCallback(self, group_id):
if group_id == pA_bridge_values.clientIdCapture:
pA_bridge_values.portCaptureNumber+=1
self.checkPulseAudio()
elif group_id == pA_bridge_values.clientIdPlayback:
pA_bridge_values.portPlaybackNumber+=1
self.checkPulseAudio()

@pyqtSlot()
@@ -1770,7 +1833,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW):
asoundrcFd.close()

else:
print("Cadence::AlsaBridgeChanged(%i) - invalid index" % index)
print(self.tr("Cadence::AlsaBridgeChanged(%i) - invalid index") % index)

self.checkAlsaAudio()

@@ -1800,18 +1863,18 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW):

@pyqtSlot()
def slot_PulseAudioBridgeStart(self):
if GlobalSettings.value("Pulse2JACK/PlaybackModeOnly", False, type=bool):
os.system("cadence-pulse2jack -p")
else:
os.system("cadence-pulse2jack")
inputs = GlobalSettings.value("Pulse2JACK/CaptureChannels", 2, type=int)
outputs = GlobalSettings.value("Pulse2JACK/PlaybackChannels", 2, type=int)
os.system("cadence-pulse2jack -c %s -p %s" % (str(inputs), str(outputs)))

@pyqtSlot()
def slot_PulseAudioBridgeStop(self):
os.system("pulseaudio -k")

@pyqtSlot()
def slot_PulseAudioBridgeOptions(self):
ToolBarPADialog(self).exec_()
def slot_PulseAudioBridgeChannels(self):
PAChannelsDialog(self).exec_()

@pyqtSlot()
def slot_handleCrash_jack(self):
@@ -2340,7 +2403,7 @@ class CadenceMainW(QMainWindow, ui_cadence.Ui_CadenceMainW):

if self.m_last_buffer_size != next_buffer_size:
self.m_last_buffer_size = next_buffer_size
self.label_jack_bfsize.setText("%i samples" % self.m_last_buffer_size)
self.label_jack_bfsize.setText(self.tr("%i samples") % self.m_last_buffer_size)
self.label_jack_latency.setText("%.1f ms" % gDBus.jack.GetLatency())

else:
@@ -2372,6 +2435,7 @@ if __name__ == '__main__':
app.setApplicationVersion(VERSION)
app.setOrganizationName("Cadence")
app.setWindowIcon(QIcon(":/scalable/cadence.svg"))
setup_i18n()

if haveDBus:
gDBus.loop = DBusMainLoop(set_as_default=True)


+ 4
- 4
src/cadence_session_start.py View File

@@ -137,10 +137,10 @@ def startSession(systemStarted, secondSystemStartAttempt):

# PulseAudio
if GlobalSettings.value("Pulse2JACK/AutoStart", True, type=bool):
if GlobalSettings.value("Pulse2JACK/PlaybackModeOnly", False, type=bool):
os.system("cadence-pulse2jack -p")
else:
os.system("cadence-pulse2jack")
inputs = GlobalSettings.value("Pulse2JACK/CaptureChannels", -1, type=int)
outputs = GlobalSettings.value("Pulse2JACK/PlaybackChannels", -1, type=int)
os.system("cadence-pulse2jack -c %s -p %s" % (str(inputs), str(outputs)))

print("JACK Started Successfully")
return True


+ 2
- 0
src/catarina.py View File

@@ -42,6 +42,7 @@ import ui_catarina_connectports
import ui_catarina_disconnectports
from shared_canvasjack import *
from shared_settings import *
from shared_i18n import *

# ------------------------------------------------------------------------------------------------------------
# Try Import OpenGL
@@ -1307,6 +1308,7 @@ if __name__ == '__main__':
app.setApplicationVersion(VERSION)
app.setOrganizationName("Cadence")
app.setWindowIcon(QIcon(":/scalable/catarina.svg"))
setup_i18n()

# Show GUI
gui = CatarinaMainW()


+ 5
- 3
src/catia.py View File

@@ -22,6 +22,7 @@
import ui_catia
from shared_canvasjack import *
from shared_settings import *
from shared_i18n import *

# ------------------------------------------------------------------------------------------------------------
# Try Import DBus
@@ -737,7 +738,7 @@ class CatiaMainW(AbstractCanvasJackClass):
self.fGroupList.remove(group)
break
else:
print("Catia - remove group failed")
print(self.tr("Catia - remove group failed"))
return

patchcanvas.removeGroup(groupId)
@@ -877,7 +878,7 @@ class CatiaMainW(AbstractCanvasJackClass):
break

else:
print("Catia - connect jack ports failed")
print(self.tr("Catia - connect jack ports failed"))
return -1

return self.canvas_connectPorts(portOutId, portInId)
@@ -900,7 +901,7 @@ class CatiaMainW(AbstractCanvasJackClass):
portInId = port[iPortId]

if portOutId == -1 or portInId == -1:
print("Catia - disconnect ports failed")
print(self.tr("Catia - disconnect ports failed"))
return

self.canvas_disconnectPorts(portOutId, portInId)
@@ -1384,6 +1385,7 @@ if __name__ == '__main__':
app.setApplicationVersion(VERSION)
app.setOrganizationName("Cadence")
app.setWindowIcon(QIcon(":/scalable/catia.svg"))
setup_i18n()

if jacklib is None:
QMessageBox.critical(None, app.translate("CatiaMainW", "Error"), app.translate("CatiaMainW",


+ 2
- 0
src/claudia.py View File

@@ -42,6 +42,7 @@ import ui_claudia_projectproperties
import ui_claudia_runcustom
from shared_canvasjack import *
from shared_settings import *
from shared_i18n import *

# ------------------------------------------------------------------------------------------------------------
# Try Import DBus
@@ -2742,6 +2743,7 @@ if __name__ == '__main__':
app.setApplicationVersion(VERSION)
app.setOrganizationName("Cadence")
app.setWindowIcon(QIcon(":/scalable/claudia.svg"))
setup_i18n()

if not haveDBus:
QMessageBox.critical(None, app.translate("ClaudiaMainW", "Error"), app.translate("ClaudiaMainW",


+ 410
- 52
src/claudia_database.py View File

@@ -24,32 +24,42 @@ USING_KXSTUDIO = False

list_DAW = [
# Package AppName Type Binary Icon Template? Level (L, D, L, V, VST-Mode, T, M, MIDI-Mode) (doc-file, website)
[ "ardour4", "Ardour 4", "DAW", "ardour4", "ardour", TEMPLATE_NO, LEVEL_JS, (1, 0, 1, 1, "Native", 1, 1, "JACK"), ("", "http://www.ardour.org/") ],
[ "ardour", "Ardour 6", "DAW", "ardour", "/usr/share/pixmaps/ardour.svg", TEMPLATE_NO, LEVEL_NSM, (1, 0, 1, 0, "Native", 1, 1, "JACK"), ("", "http://www.ardour.org/") ],

[ "ariamaestosa", "Aria Maestosa", "MIDI Sequencer", "Aria", "aria", TEMPLATE_NO, LEVEL_0, (0, 0, 0, 0, "", 0, 1, "ALSA | JACK"), ("", "http://ariamaestosa.sf.net/") ],
[ "ariamaestosa", "Aria Maestosa", "MIDI Sequencer", "Aria", "/usr/share/Aria/aria64.png", TEMPLATE_NO, LEVEL_0, (0, 0, 0, 0, "", 0, 1, "ALSA | JACK"), ("", "http://ariamaestosa.sf.net/") ],

[ "giada", "Giada", "Audio Looper", "giada", generic_audio_icon, TEMPLATE_NO, LEVEL_0, (0, 0, 0, 1, "Native", 0, 0, ""), ("", "http://www.monocasual.com/giada/") ],
[ "giada", "Giada", "Audio Looper", "giada", "giada", TEMPLATE_NO, LEVEL_0, (0, 0, 0, 0, "", 0, 0, ""), ("", "http://www.monocasual.com/giada/") ],

[ "hydrogen", "Hydrogen", "Drum Sequencer", "hydrogen -d jack", "h2-icon", TEMPLATE_YES, LEVEL_JS, (1, 0, 0, 0, "", 1, 1, "ALSA | JACK"), ("file:///usr/share/hydrogen/data/doc/manual_en.html.upstream", "http://www.hydrogen-music.org/") ],
[ "hydrogen", "Hydrogen", "Drum Sequencer", "hydrogen -d jack", "/usr/share/icons/hicolor/scalable/apps/org.hydrogenmusic.Hydrogen.svg", TEMPLATE_YES, LEVEL_NSM, (1, 0, 0, 0, "", 1, 1, "ALSA | JACK"), ("file:///usr/share/hydrogen/data/doc/manual_en.html", "http://www.hydrogen-music.org/") ],

[ "jacker", "Jacker", "MIDI Tracker", "jacker", "jacker", TEMPLATE_YES, LEVEL_0, (0, 0, 0, 0, "", 1, 1, "JACK"), ("", "https://bitbucket.org/paniq/jacker/wiki/Home") ],

[ "lmms", "LMMS", "DAW", "lmms", "lmms", TEMPLATE_YES, LEVEL_0, (1, 0, 0, 1, "Windows", 0, 1, "ALSA"), ("file:///usr/share/kxstudio/docs/LMMS_UserManual_0.4.12.1.pdf", "http://lmms.sf.net/") ],
[ "klystrack", "Klystrack", "Chiptune Tracker", "klystrack", "klystrack", TEMPLATE_NO, LEVEL_0, (0, 0, 0, 0, "", 0, 0, "----"), ("", "http://kometbomb.github.io/klystrack/") ],

[ "muse", "MusE", "DAW", "muse", "muse", TEMPLATE_YES, LEVEL_0, (1, 1, 0, 1, "Native", 1, 1, "ALSA + JACK"), ("file:///usr/share/doc/muse/html/window_ref.html", "http://www.muse-sequencer.org/") ],
[ "lmms", "LMMS", "DAW", "lmms", "lmms", TEMPLATE_YES, LEVEL_0, (1, 0, 0, 1, "Windows", 0, 1, "ALSA"), ("", "http://lmms.sf.net/") ],

[ "musescore", "MuseScore", "MIDI Composer", "mscore", "mscore", TEMPLATE_NO, LEVEL_0, (0, 0, 0, 0, "", 1, 1, "ALSA | JACK"), ("file:///usr/share/kxstudio/docs/MuseScore-en.pdf", "http://www.musescore.org/") ],
[ "milkytracker", "MilkyTracker", "Tracker", "milkytracker", "milkytracker", TEMPLATE_NO, LEVEL_0, (0, 0, 0, 0, "", 0, 1, "ALSA"), ("", "https://milkytracker.org/") ],

[ "muse", "MusE", "DAW", "muse", "muse_icon", TEMPLATE_YES, LEVEL_0, (1, 1, 0, 1, "Native", 1, 1, "ALSA + JACK"), ("", "http://www.muse-sequencer.org/") ],

[ "musescore3", "MuseScore 3", "MIDI Composer", "mscore3", "mscore3", TEMPLATE_NO, LEVEL_0, (0, 0, 0, 0, "", 1, 1, "ALSA | JACK"), ("", "http://www.musescore.org/") ],

[ "non-sequencer", "Non-Sequencer", "MIDI Sequencer", "non-sequencer", "non-sequencer", TEMPLATE_YES, LEVEL_NSM, (0, 0, 0, 0, "", 1, 1, "JACK"), ("file:///usr/share/doc/non-sequencer/MANUAL.html", "http://non.tuxfamily.org/wiki/Non%20Sequencer") ],
[ "non-timeline", "Non-Timeline", "DAW", "non-timeline", "non-timeline", TEMPLATE_YES, LEVEL_NSM, (0, 0, 0, 0, "", 1, 0, "CV + OSC"), ("file:///usr/share/doc/non-timeline/MANUAL.html", "http://non.tuxfamily.org/wiki/Non%20Timeline") ],

[ "protrekkr", "ProTrekkr", "Tracker", "protrekkr", "protrekkr", TEMPLATE_NO, LEVEL_0, (0, 0, 0, 1, "", 0, 1, "ALSA"), ("", "https://code.google.com/p/protrekkr/") ],

[ "qtractor", "Qtractor", "DAW", "qtractor", "qtractor", TEMPLATE_YES, LEVEL_1, (1, 1, 1, 1, "Native", 1, 1, "ALSA"), ("file:///usr/share/kxstudio/docs/qtractor-0.5.x-user-manual.pdf", "http://qtractor.sf.net/") ],
[ "qtractor", "Qtractor", "DAW", "qtractor", "qtractor", TEMPLATE_YES, LEVEL_1, (1, 1, 1, 1, "Native", 1, 1, "ALSA"), ("", "http://qtractor.sf.net/") ],

[ "rosegarden", "Rosegarden", "MIDI Sequencer", "rosegarden", "rosegarden", TEMPLATE_YES, LEVEL_1, (1, 1, 0, 0, "", 1, 1, "ALSA"), ("", "http://www.rosegardenmusic.com/") ],

[ "seq24", "Seq24", "MIDI Sequencer", "seq24", "seq24", TEMPLATE_YES, LEVEL_1, (0, 0, 0, 0, "", 1, 1, "ALSA"), ("file:///usr/share/kxstudio/docs/SEQ24", "http://www.filter24.org/seq24/") ],
[ "schism", "Schism", "Impulse Tracker clone", "schismtracker", "schism-icon-128", TEMPLATE_YES, LEVEL_0, (0, 0, 0, 0, "", 0, 1, "ALSA"), ("", "http://schismtracker.org/") ],

[ "seq24", "Seq24", "MIDI Sequencer", "seq24", "seq24", TEMPLATE_YES, LEVEL_1, (0, 0, 0, 0, "", 1, 1, "ALSA"), ("", "http://www.filter24.org/seq24/") ],

[ "sooperlooper", "SooperLooper", "Audio Looper", "slgui", "sooperlooper", TEMPLATE_NO, LEVEL_0, (0, 0, 0, 0, "", 0, 1, "JACK"), ("", "http://essej.net/sooperlooper/download.html") ],

[ "tutka", "Tutka", "MIDI Tracker", "tutka", "tutka", TEMPLATE_NO, LEVEL_0, (0, 0, 0, 0, "", 0, 1, "JACK"), ("", "http://www.nongnu.org/tutka/") ],
]

iDAW_Package, iDAW_AppName, iDAW_Type, iDAW_Binary, iDAW_Icon, iDAW_Template, iDAW_Level, iDAW_Features, iDAW_Docs = range(0, len(list_DAW[0]))
@@ -77,7 +87,9 @@ list_Host = [

[ "ingen", "Ingen", "Yes", "Yes", "ingen -eg", "ingen", TEMPLATE_NO, LEVEL_0, (1, 0, 0, 1, 0, "", "JACK"), ("", "http://drobilla.net/blog/software/ingen/") ],

[ "jack-rack", "Jack Rack", "No", "Yes", "jack-rack", "jack-rack", TEMPLATE_YES, LEVEL_0, (0, 1, 0, 0, 0, "", "ALSA"), ("", "http://jack-rack.sf.net/") ],
[ "jack-rack", "Jack Rack", "No", "Yes", "jack-rack", "/usr/share/pixmaps/jack-rack-icon.png", TEMPLATE_YES, LEVEL_0, (0, 1, 0, 0, 0, "", "ALSA"), ("", "http://jack-rack.sf.net/") ],

[ "jalv.select", "Jalv.select", "No", "No", "jalv.select", "/usr/share/pixmaps/lv2.png", TEMPLATE_YES, LEVEL_0, (0, 0, 0, 1, 0, "", "---"), ("", "https://github.com/brummer10/jalv_select") ],

[ "mod-app", "MOD App", "Yes", "Yes", "mod-app", "mod", TEMPLATE_NO, LEVEL_0, (0, 0, 0, 1, 0, "", "JACK"), ("", "http://moddevices.com/") ],

@@ -93,28 +105,102 @@ iHost_Package, iHost_AppName, iHost_Ins, iHost_FX, iHost_Binary, iHost_Icon, iHo

list_Instrument = [
# Package AppName Type Binary Icon Template? Level (F, I, MIDI-Mode) (doc-file, website)
[ "add64", "Add64", "Synth", "Add64", generic_audio_icon, TEMPLATE_NO, LEVEL_0, (0, 0, "JACK"), ("", "https://sourceforge.net/projects/add64/") ],
[ "6pm", "6 PM", "Synth", "6pm", "6PM-icon", TEMPLATE_NO, LEVEL_0, (0, 0, "JACK"), ("", "https://sourceforge.net/projects/mv-6pm/") ],

[ "aeolus", "Aeolus", "Synth", "aeolus -J", generic_audio_icon, TEMPLATE_NO, LEVEL_0, (0, 0, "ALSA | JACK"), ("", "http://www.kokkinizita.net/linuxaudio/aeolus/index.html") ],
[ "add64", "Add64", "Synth", "Add64", "add64", TEMPLATE_NO, LEVEL_0, (1, 0, "JACK"), ("", "https://sourceforge.net/projects/add64/") ],

[ "azr3-jack", "AZR3", "Synth", "azr3", "azr3", TEMPLATE_NO, LEVEL_0, (1, 0, "JACK"), ("", "http://ll-plugins.nongnu.org/azr3/") ],
[ "aeolus", "Aeolus", "Synth", "aeolus -J", "audio-x-generic", TEMPLATE_NO, LEVEL_0, (0, 0, "JACK"), ("", "http://www.kokkinizita.net/linuxaudio/aeolus/index.html") ],

[ "amsynth", "AmSynth", "Synth", "amsynth", "amsynth", TEMPLATE_NO, LEVEL_0, (0, 0, "ALSA | JACK"), ("", "http://amsynth.github.io/") ],

[ "azr3-jack", "AZR3", "Synth", "azr3", "/usr/share/pixmaps/azr3-jack.xpm", TEMPLATE_NO, LEVEL_0, (1, 0, "JACK"), ("", "http://ll-plugins.nongnu.org/azr3/") ],

[ "borderlands", "Borderlands", "Sampler", "Borderlands", "borderlands", TEMPLATE_NO, LEVEL_0, (0, 1, "JACK"), ("", "https://ccrma.stanford.edu/~carlsonc/256a/Borderlands/") ],

[ "coldgaze", "Coldgaze", "Synth", "microSynth", "coldgaze", TEMPLATE_NO, LEVEL_0, (0, 0, "ALSA"), ("", "https://sourceforge.net/projects/coldgaze/") ],

[ "cursynth", "cursynth", "Synth", "x-terminal-emulator -e cursynth", generic_audio_icon, TEMPLATE_NO, LEVEL_0, (0, 0, "ALSA"), ("", "http://www.gnu.org/software/cursynth/") ],

[ "jsampler", "JSampler Fantasia", "Sampler", "jsampler-bin", "jsampler", TEMPLATE_NO, LEVEL_0, (0, 0, "ALSA + JACK"), ("file:///usr/share/kxstudio/docs/jsampler/jsampler.html", "http://www.linuxsampler.org/") ],
[ "distrho-lv2", "Dexed", "Yamaha DX7 Emulator", "Dexed", "dexed", TEMPLATE_NO, LEVEL_0, (0, 0, "JACK"), ("", "https://distrho.sourceforge.io/ports.php") ],

[ "din", "DIN", "Musical Instrument", "din", "din", TEMPLATE_NO, LEVEL_0, (0, 0, "JACK"), ("", "https://dinisnoise.org/") ],

[ "drumkv1", "Drumk-V1", "Drum Sampler", "drumkv1_jack", "drumkv1", TEMPLATE_NO, LEVEL_JS, (0, 0, "ALSA | JACK"), ("", "https://drumkv1.sourceforge.io/") ],

[ "distrho-lv2", "DrumSynth", "Drum synth", "DrumSynth", "drumsynth", TEMPLATE_NO, LEVEL_0, (0, 0, "JACK"), ("", "https://distrho.sourceforge.io/ports.php") ],

[ "fabla", "Fabla", "Drum Sampler", "fabla", "fabla", TEMPLATE_NO, LEVEL_0, (0, 0, "JACK"), ("", "http://openavproductions.com/fabla/") ],

[ "fabla2", "Fabla 2", "Sampler", "fabla2", "fabla2", TEMPLATE_NO, LEVEL_0, (0, 1, "JACK"), ("", "http://openavproductions.com/fabla2/") ],

[ "foo-yc20", "Foo YC20", "Organ Synth", "foo-yc20", "/usr/share/foo-yc20/graphics/icon.png", TEMPLATE_NO, LEVEL_0, (0, 0, "JACK"), ("", "https://foo-yc20.codeforcode.com/") ],

[ "grandorgue", "GrandOrgue", "Grand Organ Sampler", "GrandOrgue", "/usr/share/pixmaps/GrandOrgue.png", TEMPLATE_NO, LEVEL_0, (0, 0, "JACK"), ("", "https://sourceforge.net/p/ourorgan/wiki/Home/") ],

[ "helm", "Helm", "Synth", "helm", "helm_icon_128_1x", TEMPLATE_NO, LEVEL_0, (1, 1, "JACK"), ("", "https://tytel.org/helm/") ],

[ "hexter", "Hexter", "Synth", "jack-dssi-host hexter.so", "hexter", TEMPLATE_NO, LEVEL_0, (0, 0, "ALSA"), ("", "http://smbolton.com/hexter.html") ],

[ "horgand", "Horgand", "Synth", "horgand", "horgand128", TEMPLATE_NO, LEVEL_0, (0, 0, "JACK"), ("", "https://sourceforge.net/projects/horgand.berlios/") ],

[ "infamous-plugins", "Infamous Cellular Automaton Synth", "Synth", "infamous-casynth", "infamous-casynth", TEMPLATE_NO, LEVEL_0, (0, 1, "JACK"), ("", "http://ssj71.github.io/infamousPlugins/") ],

[ "jsampler", "JSampler Fantasia", "Sampler", "jsampler-bin", "jsampler", TEMPLATE_NO, LEVEL_0, (0, 0, "ALSA + JACK"), ("file:///usr/share/kxstudio/docs/jsampler/jsampler.html", "http://www.linuxsampler.org/") ],

[ "distrho-lv2", "Juce Demo Plugin", "Synth", "JuceDemoPlugin", "jucedemoplugin", TEMPLATE_NO, LEVEL_0, (0, 0, "JACK"), ("", "https://distrho.sourceforge.io/ports.php") ],

[ "petri-foo", "Petri-Foo", "Sampler", "petri-foo", "petri-foo", TEMPLATE_NO, LEVEL_NSM, (0, 0, "ALSA + JACK"), ("", "http://petri-foo.sf.net/") ],
[ "dpf-plugins", "Kars", "Virtual Instrument", "Kars", "kars", TEMPLATE_NO, LEVEL_0, (0, 0, "JACK"), ("", "https://distrho.sourceforge.io/plugins.php") ],

[ "phasex", "Phasex", "Synth", "phasex", "phasex", TEMPLATE_NO, LEVEL_0, (1, 1, "ALSA"), ("file:///usr/share/phasex/help/parameters.help", "") ],
[ "dpf-plugins", "Nekobi", "Roland TB-303 Emulator", "Nekobi", "nekobi", TEMPLATE_NO, LEVEL_0, (0, 0, "JACK"), ("", "https://distrho.sourceforge.io/plugins.php") ],

[ "qsampler", "Qsampler", "Sampler", "qsampler", "qsampler", TEMPLATE_YES, LEVEL_0, (0, 0, "ALSA + JACK"), ("", "http://qsampler.sf.net/") ],
[ "distrho-lv2", "TAL Noize Mak3r", "Synth", "NoizeMak3r", "noizemak3r", TEMPLATE_NO, LEVEL_0, (1, 0, "JACK"), ("", "https://distrho.sourceforge.io/ports.php") ],

[ "qsynth", "Qsynth", "SoundFont Player", "qsynth -a jack -m jack", "qsynth", TEMPLATE_NO, LEVEL_0, (1, 0, "ALSA | JACK"), ("", "http://qsynth.sf.net/") ],
[ "distrho-lv2", "Obxd", "Ob-x, ob-xa & ob8 Emulators", "Obxd", "obxd", TEMPLATE_NO, LEVEL_0, (0, 0, "JACK"), ("", "https://distrho.sourceforge.io/ports.php") ],

[ "yoshimi", "Yoshimi", "Synth", "yoshimi -j -J", "yoshimi", TEMPLATE_NO, LEVEL_1, (1, 0, "ALSA | JACK"), ("", "http://yoshimi.sf.net/") ],
[ "padthv1", "Padth-V1", "Synth", "padthv1_jack", "padthv1", TEMPLATE_NO, LEVEL_NSM, (0, 0, "ALSA | JACK"), ("", "https://padthv1.sourceforge.io/") ],

[ "zynaddsubfx", "ZynAddSubFX", "Synth", "zynaddsubfx", "zynaddsubfx", TEMPLATE_NO, LEVEL_NSM, (1, 0, "ALSA | JACK"), ("", "http://zynaddsubfx.sf.net/") ],
[ "zynaddsubfx-git", "ZynAddSubFX (GIT)", "Synth", "zynaddsubfx", "zynaddsubfx", TEMPLATE_NO, LEVEL_NSM, (1, 0, "ALSA | JACK"), ("", "http://zynaddsubfx.sf.net/") ],
[ "petri-foo", "Petri-Foo", "Sampler", "petri-foo", "petri-foo", TEMPLATE_NO, LEVEL_NSM, (0, 0, "ALSA + JACK"), ("", "http://petri-foo.sf.net/") ],

[ "phasex", "Phasex", "Synth", "phasex", "phasex", TEMPLATE_NO, LEVEL_0, (1, 1, "ALSA"), ("file:///usr/share/phasex/help/parameters.help", "") ],

[ "polyphone", "Polyphone", "Sampler", "polyphone", "polyphone", TEMPLATE_NO, LEVEL_0, (1, 0, "JACK"), ("", "http://www.polyphone-soundfonts.com/") ],

[ "qsampler", "Qsampler", "Sampler", "qsampler", "qsampler", TEMPLATE_YES, LEVEL_0, (0, 0, "ALSA + JACK"), ("", "http://qsampler.sf.net/") ],

[ "qsynth", "Qsynth", "SoundFont Player", "qsynth -a jack -m jack", "qsynth", TEMPLATE_NO, LEVEL_0, (1, 0, "ALSA | JACK"), ("", "http://qsynth.sf.net/") ],

[ "samplv1", "Sampl-V1", "Sampler", "samplv1_jack", "samplv1", TEMPLATE_NO, LEVEL_NSM, (0, 0, "ALSA | JACK"), ("", "https://samplv1.sourceforge.io/") ],

[ "setbfree", "SetBfree", "Organ Emulator", "setBfreeUI", "setBfree", TEMPLATE_NO, LEVEL_0, (0, 0, "JACK"), ("", "http://setbfree.org/") ],

[ "sorcer", "Sorcer", "Polyphonic Synth", "sorcer", "sorcer", TEMPLATE_NO, LEVEL_NSM, (0, 0, "JACK"), ("", "http://openavproductions.com/sorcer/") ],

[ "spectmorph", "Spectmorph", "Morph Synth", "smjack", "smjack", TEMPLATE_NO, LEVEL_0, (0, 0, "JACK"), ("", "http://www.spectmorph.org/") ],

[ "stegosaurus", "Stegosaurus", "Analog Drum Synth", "stegosaurus", "stegosaurus", TEMPLATE_NO, LEVEL_0, (0, 0, "JACK"), ("", "http://www.thunderox.com/") ],

[ "synthv1", "Synth-V1", "Synth", "synthv1_jack", "synthv1", TEMPLATE_NO, LEVEL_NSM, (0, 0, "ALSA | JACK"), ("", "https://synthv1.sourceforge.io/") ],

[ "tapeutape", "Tapeutape", "Sampler", "tapeutape", "tapeutape", TEMPLATE_NO, LEVEL_0, (0, 1, "ALSA"), ("", "http://hitmuri.net/index.php/Software/Tapeutape") ],

[ "triceratops-lv2", "Triceratops", "Polyphonic Synth", "triceratops", "triceratops", TEMPLATE_NO, LEVEL_0, (0, 0, "JACK"), ("", "http://www.thunderox.com/triceratops.html") ],

[ "vcvrack", "VCV Rack", "Modular Synth", "vcvrack", "vcvrack", TEMPLATE_NO, LEVEL_0, (0, 0, "---"), ("", "https://vcvrack.com/") ],

[ "distrho-lv2", "Vex", "Synth", "Vex", "vex", TEMPLATE_NO, LEVEL_0, (0, 0, "JACK"), ("", "https://distrho.sourceforge.io/ports.php") ],

[ "whysynth", "Whysynth", "Synth", "whysynth", "whysynth", TEMPLATE_NO, LEVEL_0, (1, 0, "JACK"), ("", "http://smbolton.com/whysynth.html") ],

[ "distrho-lv2", "Wolpertinger", "Synth", "Wolpertinger", "/usr/share/pixmaps/wolpertinger.xpm", TEMPLATE_NO, LEVEL_0, (0, 0, "JACK"), ("", "https://distrho.sourceforge.io/ports.php") ],

[ "wsynth-dssi", "Wsynth", "WaveTable Synth", "jack-dssi-host wsynth-dssi.so", "wsynth-dssi", TEMPLATE_NO, LEVEL_0, (1, 0, "JACK"), ("", "http://www.linuxsynths.com/WsynthBanksDemos/wsynth.html") ],

[ "xsynth-dssi", "Xsynth", "Analog Synth", "jack-dssi-host xsynth-dssi.so", "xsynth-dssi", TEMPLATE_NO, LEVEL_0, (1, 0, "JACK"), ("", "http://dssi.sourceforge.net/download.html#Xsynth-DSSI") ],

[ "yoshimi", "Yoshimi", "Synth", "yoshimi -j -J", "/usr/share/pixmaps/yoshimi.png", TEMPLATE_NO, LEVEL_1, (1, 0, "ALSA | JACK"), ("", "http://yoshimi.sf.net/") ],

[ "zynaddsubfx", "ZynAddSubFX", "Synth", "zynaddsubfx", "zynaddsubfx", TEMPLATE_NO, LEVEL_NSM, (1, 0, "ALSA | JACK"), ("", "http://zynaddsubfx.sf.net/") ],
[ "zynaddsubfx-git", "ZynAddSubFX (GIT)", "Synth", "zynaddsubfx", "zynaddsubfx", TEMPLATE_NO, LEVEL_NSM, (1, 0, "ALSA | JACK"), ("", "http://zynaddsubfx.sf.net/") ],
]

iInstrument_Package, iInstrument_AppName, iInstrument_Type, iInstrument_Binary, iInstrument_Icon, iInstrument_Template, iInstrument_Level, iInstrument_Features, iInstrument_Docs = range(0, len(list_Instrument[0]))
@@ -179,13 +265,84 @@ iBristol_Package, iBristol_AppName, iBristol_Type, iBristol_ShortName, iBristol_

list_Effect = [
# Package AppName Type Binary Icon Template? Level (S, MIDI-Mode) (doc, website)
[ "ambdec", "AmbDec", "Ambisonic Decoder", "ambdec", generic_audio_icon, TEMPLATE_NO, LEVEL_0, (1, "---"), ("", "") ],
[ "ambdec", "AmbDec", "Ambisonic Decoder", "ambdec", "ambdec", TEMPLATE_NO, LEVEL_0, (1, "---"), ("", "http://kokkinizita.linuxaudio.org/linuxaudio/index.html") ],

[ "guitarix", "Guitarix", "Guitar FX", "guitarix", "gx_head", TEMPLATE_NO, LEVEL_0, (0, "JACK"), ("", "http://guitarix.sf.net/") ],

[ "fogpad-port", "FogPad", "Reverb", "fogpad", generic_audio_icon, TEMPLATE_NO, LEVEL_0, (0, "JACK"), ("", "https://github.com/linuxmao-org/fogpad-port") ],

[ "freqtweak", "Freqtweak", "FFT-based realtime audio spectral manipulation", "freqtweak", "freqtweak_logo32x18", TEMPLATE_NO, LEVEL_0, (1, "---"), ("", "https://freqtweak.sourceforge.io/") ],

[ "jamin", "Jamin", "Mastering", "jamin", "jamin", TEMPLATE_NO, LEVEL_0, (1, "---"), ("", "http://jamin.sf.net/") ],

[ "rakarrack", "Rakarrack", "Guitar FX", "rakarrack", "rakarrack", TEMPLATE_NO, LEVEL_0, (1, "ALSA + JACK"), ("file:///usr/share/doc/rakarrack/html/help.html", "http://rakarrack.sf.net") ],
[ "lsp-plugins", "LSP comp-delay-mono", "Compressor", "lsp-plugins-comp-delay-mono", generic_audio_icon, TEMPLATE_NO, LEVEL_0, (0, "---"), ("", "https://lsp-plug.in/") ],

[ "lsp-plugins", "LSP comp-delay-stereo", "Compressor", "lsp-plugins-comp-delay-stereo", generic_audio_icon, TEMPLATE_NO, LEVEL_0, (1, "---"), ("", "https://lsp-plug.in/") ],

[ "lsp-plugins", "LSP comp-delay-x2-stereo", "Compressor", "lsp-plugins-comp-delay-x2-stereo", generic_audio_icon, TEMPLATE_NO, LEVEL_0, (1, "---"), ("", "https://lsp-plug.in/") ],

[ "lsp-plugins", "LSP phase-detector", "Phase Detector", "lsp-plugins-phase-detector", generic_audio_icon, TEMPLATE_NO, LEVEL_0, (1, "---"), ("", "https://lsp-plug.in/") ],

[ "dpf-plugins", "MVerb", "Reverb Effect", "MVerb", "mverb", TEMPLATE_NO, LEVEL_0, (1, "---"), ("", "https://distrho.sourceforge.io/ports.php") ],

[ "paulstretch", "PaulStretch", "Extreme Stretch", "paulstretch", "paulstretch", TEMPLATE_NO, LEVEL_0, (1, "---"), ("", "http://hypermammut.sourceforge.net/paulstretch/") ],

[ "radium-compressor", "Radium Compressor", "Compressor", "radium_compressor", "/usr/share/pixmaps/radium-compressor.xpm", TEMPLATE_NO, LEVEL_0, (1, "---"), ("", "http://users.notam02.no/~kjetism/radium/compressor_plugin.php") ],

[ "rakarrack", "Rakarrack", "Guitar FX", "rakarrack", "icono_rakarrack_128x128", TEMPLATE_NO, LEVEL_0, (1, "ALSA + JACK"), ("file:///usr/share/doc/rakarrack/html/help.html", "http://rakarrack.sf.net") ],

[ "tap-reverbed", "Reverbed", "Reverb", "reverbed", "reverbed", TEMPLATE_NO, LEVEL_0, (1, "---"), ("", "http://tap-plugins.sourceforge.net/reverbed.html") ],

[ "snokoder", "SnoKoder", "Vocoder", "snokoder", "snokoder", TEMPLATE_NO, LEVEL_0, (0, "ALSA"), ("", "https://www.transformate.de/x/pawfaliki.php?page=DownLoads") ],

[ "x42-plugins", "X42 - Darc", "Compressor", "x42-darc", "x42-darc", TEMPLATE_NO, LEVEL_0, (0, "---"), ("", "https://x42-plugins.com/x42/x42-compressor") ],

[ "x42-plugins", "X42 - Fil4 mono", "4 Bands EQ", "x42-fil4", "x42-fil4", TEMPLATE_NO, LEVEL_0, (0, "---"), ("", "https://x42-plugins.com/x42/x42-eq") ],

[ "x42-plugins", "X42 - Fil4 stéréo", "4 Bands EQ", "x42-fil4 1", "x42-fil4", TEMPLATE_NO, LEVEL_0, (1, "---"), ("", "https://x42-plugins.com/x42/x42-eq") ],

[ "x42-plugins", "X42 - Fat1", "Auto-tuner", "x42-fat1", "x42-fat1", TEMPLATE_NO, LEVEL_0, (0, "---"), ("", "https://x42-plugins.com/x42/x42-autotune") ],

[ "setbfree", "X42 - Whirl", "Leslie Emulator", "x42-whirl", "x42-whirl", TEMPLATE_NO, LEVEL_0, (0, "---"), ("", "https://x42-plugins.com/x42/x42-whirl") ],

[ "zam-plugins", "ZamAutoSat", "Saturator", "ZamAutoSat", "zam", TEMPLATE_NO, LEVEL_0, (0, "---"), ("", "http://www.zamaudio.com/?p=976") ],

[ "zam-plugins", "ZamComp", "Mono Compressor", "ZamComp", "zam", TEMPLATE_NO, LEVEL_0, (0, "---"), ("", "http://www.zamaudio.com/?p=976") ],

[ "zam-plugins", "ZamCompX2", "Stereo Compressor", "ZamCompX2", "zam", TEMPLATE_NO, LEVEL_0, (1, "---"), ("", "http://www.zamaudio.com/?p=976") ],

[ "zam-plugins", "ZamDelay", "Delay", "ZamDelay", "zam", TEMPLATE_NO, LEVEL_0, (0, "---"), ("", "http://www.zamaudio.com/?p=976") ],

[ "zam-plugins", "ZamDynamicEQ", "Dynamic Mono EQ", "ZamDynamicEQ", "zam", TEMPLATE_NO, LEVEL_0, (0, "---"), ("", "http://www.zamaudio.com/?p=976") ],

[ "zam-plugins", "ZamEQ2", "2 Bands EQ", "ZamEQ2", "zam", TEMPLATE_NO, LEVEL_0, (0, "---"), ("", "http://www.zamaudio.com/?p=976") ],

[ "zam-plugins", "ZamGate", "Mono Gate", "ZamGate", "zam", TEMPLATE_NO, LEVEL_0, (0, "---"), ("", "http://www.zamaudio.com/?p=976") ],

[ "zam-plugins", "ZamGateX2", "Stereo Gate", "ZamGateX2", "zam", TEMPLATE_NO, LEVEL_0, (1, "---"), ("", "http://www.zamaudio.com/?p=976") ],

[ "zam-plugins", "ZamGEQ31", "31 Bands EQ", "ZamGEQ31", "zam", TEMPLATE_NO, LEVEL_0, (0, "---"), ("", "http://www.zamaudio.com/?p=976") ],

[ "zam-plugins", "ZamHeadX2", "Stereo Enhancer", "ZamHeadX2", "zam", TEMPLATE_NO, LEVEL_0, (1, "---"), ("", "http://www.zamaudio.com/?p=976") ],

[ "zam-plugins", "ZaMaximX2", "Maximiser", "ZaMaximX2", "zam", TEMPLATE_NO, LEVEL_0, (1, "---"), ("", "http://www.zamaudio.com/?p=976") ],

[ "zam-plugins", "ZaMultiComp", "Mo Multi-Compressor", "ZaMultiComp", "zam", TEMPLATE_NO, LEVEL_0, (0, "---"), ("", "http://www.zamaudio.com/?p=976") ],

[ "zam-plugins", "ZaMultiCompX2", "St Multi-Compressor", "ZaMultiCompX2", "zam", TEMPLATE_NO, LEVEL_0, (1, "---"), ("", "http://www.zamaudio.com/?p=976") ],

[ "zam-plugins", "ZamPhono", "Phono Filters", "ZamPhono", "zam", TEMPLATE_NO, LEVEL_0, (0, "---"), ("", "http://www.zamaudio.com/?p=976") ],

[ "zam-plugins", "ZamTube", "Tube Amp Emulator", "ZamTube", "zam", TEMPLATE_NO, LEVEL_0, (0, "JACK"), ("", "http://www.zamaudio.com/?p=976") ],

[ "zam-plugins", "ZamVerb", "Reverb", "ZamVerb", "zam", TEMPLATE_NO, LEVEL_0, (1, "JACK"), ("", "http://www.zamaudio.com/?p=976") ],

[ "zita-at1", "Zita-at1", "Auto-tuner", "zita-at1", "zita-at1", TEMPLATE_NO, LEVEL_0, (0, "JACK"), ("", "http://kokkinizita.linuxaudio.org/linuxaudio/index.html") ],

[ "zita-rev1", "Zita-rev1", "Reverb", "zita-rev1", "zita-rev1", TEMPLATE_NO, LEVEL_0, (1, "JACK"), ("", "http://kokkinizita.linuxaudio.org/linuxaudio/index.html") ],

[ "zita-rev1", "Zita-rev1", "Reverb - Ambisonic", "zita-rev1 -B", "zita-rev1", TEMPLATE_NO, LEVEL_0, (1, "JACK"), ("", "http://kokkinizita.linuxaudio.org/linuxaudio/index.html") ],

]

iEffect_Package, iEffect_AppName, iEffect_Type, iEffect_Binary, iEffect_Icon, iEffect_Template, iEffect_Level, iEffect_Features, iEffect_Docs = range(0, len(list_Effect[0]))
@@ -197,69 +354,270 @@ iEffect_Package, iEffect_AppName, iEffect_Type, iEffect_Binary, iEffect_Icon, iE

list_Tool = [
# Package AppName Type Binary Icon Template? Level (MIDI-M, T) (doc, website)
[ "aliki", "Aliki (ALSA)", "Impulse Response Measurements Tool", "aliki -a", "aliki_32x32", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "kokkinizita.linuxaudio.org/linuxaudio/index.html") ],

[ "aliki", "Aliki (JACK)", "Impulse Response Measurements Tool", "aliki -j", "aliki_32x32", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "kokkinizita.linuxaudio.org/linuxaudio/index.html") ],

[ "arpage", "Arpage", "MIDI Arpeggiator", "arpage", "arpage", TEMPLATE_NO, LEVEL_0, ("JACK", 1), ("", "") ],
[ "arpage", "Zonage", "MIDI Mapper", "zonage", "zonage", TEMPLATE_NO, LEVEL_0, ("JACK", 0), ("", "") ],

[ "audacity", "Audacity", "Audio Editor", "audacity", "audacity", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://audacity.sf.net/") ],
[ "audacity", "Audacity", "Audio Editor", "audacity", "audacity", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://www.audacityteam.org/") ],

[ "cadence", "Cadence", "JACK Toolbox", "cadence", "cadence", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "") ],
[ "bitmeter", "Bitmeter", "JACK Diagnotic Tool", "bitmeter", "bitmeter", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "") ],

[ "cadence", "Cadence", "JACK Toolbox", "cadence", "cadence", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "") ],
[ "cadence-tools", "Cadence XY-Controller", "XY Controller", "cadence-xycontroller", "cadence", TEMPLATE_NO, LEVEL_0, ("JACK", 0), ("", "") ],
[ "catia", "Catia", "Patch Bay", "catia", "catia", TEMPLATE_NO, LEVEL_0, ("JACK", 1), ("", "") ],
[ "carla-control", "Carla OSC Control", "OSC Control", "carla-control", "carla-control", TEMPLATE_NO, LEVEL_0, ("JACK", 1), ("", "") ],

[ "drumstick-tools", "Drumstick Virtual Piano", "Virtual Keyboard", "drumstick-vpiano", "drumstick", TEMPLATE_NO, LEVEL_0, ("ALSA", 0), ("", "http://drumstick.sf.net/") ],
[ "denemo", "Denemo", "Music Notation Editor", "denemo", "denemo", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://denemo.org/") ],

[ "digitalscratch", "Digital-Scratch", "DJ with time-coded vinyls", "digitalscratch", "digitalscratch-icon_2decks", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://www.digital-scratch.org/") ],

[ "drumstick-tools", "Drumstick Virtual Piano", "Virtual Keyboard", "drumstick-vpiano", "drumstick", TEMPLATE_NO, LEVEL_0, ("ALSA", 0), ("", "https://drumstick.sourceforge.io/") ],

[ "easytag", "EasyTAG", "Audio File Metadata Management", "easytag", "easytag", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://wiki.gnome.org/Apps/EasyTAG") ],

[ "etktab", "eTktab", "Music Notation Editor", "eTktab", "eTktab", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://etktab.sourceforge.net/") ],

[ "ebumeter", "Ebumeter", "EBU-r128 Loudness Indicator", "ebumeter", "ebumeter32x32", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://kokkinizita.linuxaudio.org/linuxaudio/") ],

[ "alsa-tools-gui", "Echomixer", "Echoaudio Mixer", "echomixer", "alsa-tools", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "") ],

[ "elektroid", "Elektroid", "Soft for Elektron Devices", "elektroid", "elektroid", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://github.com/dagargo/elektroid/") ],

[ "fmit", "Music Instrument Tuner", "Instrument Tuner", "fmit", generic_audio_icon, TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "") ],
[ "alsa-tools-gui", "Envy24Control", "Ice1712 Mixer", "envy24control", "alsa-tools", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://alsa.opensrc.org/Envy24control") ],

[ "gigedit", "Gigedit", "Instrument Editor", "gigedit", generic_audio_icon, TEMPLATE_NO, LEVEL_0, ("---", 0), ("file:///usr/share/doc/gigedit/gigedit_quickstart.html", "") ],
[ "audio-recorder", "Audio-recorder", "Audio Recorder", "audio-recorder", "audio-recorder", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://launchpad.net/audio-recorder") ],

[ "gjacktransport", "GJackClock", "Transport Tool", "gjackclock", "gjackclock", TEMPLATE_NO, LEVEL_0, ("---", 1), ("", "") ],
[ "gjacktransport", "GJackTransport", "Transport Tool", "gjacktransport", "gjacktransport", TEMPLATE_NO, LEVEL_0, ("---", 1), ("", "") ],
[ "ffado-mixer-qt4", "FFADO-mixer", "FireWire Audio Interfaces Mixer", "ffado-mixer", "hi64-apps-ffado", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://ffado.org/") ],

[ "gninjam", "Gtk NINJAM client", "Music Collaboration", "gninjam", generic_audio_icon, TEMPLATE_NO, LEVEL_0, ("---", 1), ("", "") ],
[ "fmit", "Music Instrument Tuner", "Instrument Tuner", "fmit", "fmit", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://gillesdegottex.github.io/fmit/") ],

[ "frescobaldi", "Frescobaldi", "Music Notation Editor", "frescobaldi", "org.frescobaldi.Frescobaldi", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://www.frescobaldi.org/") ],

[ "gdigi", "Gdigi", "Digitech Pedals Control", "gdigi", "gdigi", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://desowin.org/gdigi/") ],

[ "gigedit", "Gigedit", "Instrument Editor", "gigedit", generic_audio_icon, TEMPLATE_NO, LEVEL_0, ("---", 0), ("file:///usr/share/doc/gigedit/gigedit_quickstart.html", "") ],

[ "gjacktransport", "GJackClock", "Transport Tool", "gjackclock", "gjackclock", TEMPLATE_NO, LEVEL_0, ("---", 1), ("", "http://gjacktransport.sourceforge.net/") ],
[ "gjacktransport", "GJackTransport", "Transport Tool", "gjacktransport", "gjacktransport", TEMPLATE_NO, LEVEL_0, ("---", 1), ("", "http://gjacktransport.sourceforge.net/") ],

[ "gladish", "Gladish", "LADISH Studio Manager", "gladish", "gladish", TEMPLATE_NO, LEVEL_0, ("JACK | ALSA", 0), ("", "http://ladish.org/") ],

[ "dpf-plugins", "glBars", "Audio Visualizer", "glBars", "glbars", TEMPLATE_NO, LEVEL_0, ("JACK", 0), ("", "https://distrho.sourceforge.io/plugins.php") ],

[ "gmidimonitor", "Gmidimonitor (ALSA)", "MIDI-ALSA Monitor", "gmidimonitor --alsa", "gmidimonitor_32x32", TEMPLATE_NO, LEVEL_0, ("JACK | ALSA", 0), ("", "") ],
[ "gmidimonitor", "Gmidimonitor (JACK)", "MIDI-JACK Monitor", "gmidimonitor --jack", "gmidimonitor_32x32", TEMPLATE_NO, LEVEL_0, ("JACK | ALSA", 0), ("", "") ],

[ "gwc", "Gtk Wave Cleaner", "Audio File Cleaner", "gtk-wave-cleaner", "gtk-wave-cleaner", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://sourceforge.net/projects/gwc/") ],

[ "gninjam", "Gtk NINJAM client", "Music Collaboration", "gninjam", "gninjam", TEMPLATE_NO, LEVEL_0, ("---", 1), ("", "") ],

[ "gtklick", "Gtklick", "Metronome", "gtklick", "gtklick", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://das.nasophon.de/gtklick/") ],

[ "gxtuner", "Gxtuner", "Instrument Tuner", "gxtuner", "gxtuner", TEMPLATE_NO, LEVEL_JS, ("---", 0), ("", "") ],

[ "handbrake", "Handbrake", "DVD, Bluray, and other Medias Transcoder", "ghb", "hb-icon", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://handbrake.fr/") ],

[ "alsa-tools-gui", "HdaJackRetask", "Intel HDA Control", "hdajackretask", "alsa-tools", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "") ],
[ "alsa-tools-gui", "HDSPconf", "HDSP Control", "hdspconf", "alsa-tools", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "") ],
[ "alsa-tools-gui", "HDSPmixer", "HDSP Mixer", "hdspmixer", "alsa-tools", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "") ],

[ "jaaa", "Jaaa-ALSA", "Analyzes/Generates an Audio Signal", "jaaa -A", "jaaa", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://kokkinizita.linuxaudio.org/linuxaudio/index.html") ],
[ "jaaa", "Jaaa-JACK", "Analyzes/Generates an Audio Signal", "jaaa -J", "jaaa", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://kokkinizita.linuxaudio.org/linuxaudio/index.html") ],

[ "jack-capture", "Jack-Capture-GUI", "JACK-Audio Capture GUI", "jack_capture_gui", "jack_capture_gui", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://github.com/kmatheussen/jack_capture") ],

[ "jackeq", "JackEQ", "DJ Console GUI", "jackeq", "/usr/share/pixmaps/logo-jackeq-s.png", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://djcj.org/jackeq/") ],

[ "jack-keyboard", "Jack Keyboard", "Virtual Keyboard", "jack-keyboard", "jack-keyboard", TEMPLATE_NO, LEVEL_0, ("JACK", 0), ("file:///usr/share/kxstudio/docs/jack-keyboard/manual.html", "http://jack-keyboard.sf.net/") ],

[ "jack-mixer", "Jack Mixer", "Mixer", "jack_mixer", "jack_mixer", TEMPLATE_NO, LEVEL_0, ("JACK", 0), ("", "http://home.gna.org/jackmixer/") ],
[ "jack-mixer", "Jack Mixer", "Mixer", "jack_mixer", "jack_mixer", TEMPLATE_NO, LEVEL_NSM, ("JACK", 0), ("", "http://home.gna.org/jackmixer/") ],

[ "jamulus", "Jamulus", "Music Collaboration", "jamulus", "jamulus", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://llcon.sourceforge.net/") ],

[ "japa", "Japa-ALSA", "Audio Signal Analysis", "japa -A", "japa", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://kokkinizita.linuxaudio.org/linuxaudio/index.html") ],
[ "japa", "Japa-JACK", "Audio Signal Analysis", "japa -J", "japa", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://kokkinizita.linuxaudio.org/linuxaudio/index.html") ],

[ "jkmeter", "Jkmeter", "Audio Level Measurement", "jkmeter", "jkmeter32x32", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://kokkinizita.linuxaudio.org/linuxaudio/index.html") ],

[ "jmeters", "Jmeters", "Multi Canal Audio Level Measurement", "jmeters", "jmeters_32x32", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://kokkinizita.linuxaudio.org/linuxaudio/index.html") ],

# [ "jnoise", "Jnoise", "White & Pink Noise Generation", "jnoise", generic_audio_icon, TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://kokkinizita.linuxaudio.org/linuxaudio/index.html") ],

[ "jnoisemeter", "Jnoisemeter", "Test Audio Signal Meter", "jnoisemeter", "jnoisemeter_32x32", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://librazik.tuxfamily.org/doc2/logiciels/jnoisemeter") ],

[ "kmetronome", "KMetronome", "Metronome", "kmetronome", "kmetronome", TEMPLATE_NO, LEVEL_0, ("ALSA", 0), ("", "http://kmetronome.sf.net/kmetronome.shtml") ],
[ "kmidimon", "KMidimon", "Monitor", "kmidimon", "kmidimon", TEMPLATE_NO, LEVEL_0, ("ALSA", 0), ("", "http://kmidimon.sf.net/") ],

[ "laditools", "LADI Log", "Log Viewer", "ladilog", "ladilog", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "") ],
[ "laditools", "LADI Tray", "Session Handler", "laditray", "laditray", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "") ],
[ "laditools", "LADI Log", "Log Viewer", "ladi-system-log", "ladi-system-log", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "") ],
[ "laditools", "LADI Tray", "Session Handler", "ladi-system-tray", "laditools", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "") ],

[ "lenmus-all", "Lenmus", "Music Theory Studying", "lenmus", "lenmus", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://www.lenmus.org/en/noticias") ],

[ "lives", "LiVES", "VJ / Video Editor", "lives", "lives", TEMPLATE_NO, LEVEL_0, ("---", 1), ("", "http://lives.sf.net/") ],
[ "lingot", "Lingot", "Instrument Tuner", "lingot", "org.nongnu.lingot", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://www.nongnu.org/lingot/") ],

[ "luppp", "Luppp", "Audio Looper", "luppp", generic_audio_icon, TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://openavproductions.com/luppp/") ],
[ "linux-show-player", "Linux Show Player", "Sample player", "linux-show-player", "linuxshowplayer", TEMPLATE_NO, LEVEL_0, ("JACK", 0), ("", "https://www.linux-show-player.org/") ],

[ "meterbridge", "MeterBridge Classic VU", "VU / Peak Analyzer", "meterbridge -t vu :", "meterbridge32x32", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://plugin.org.uk/meterbridge/") ],
[ "meterbridge", "MeterBridge PPM Meter", "VU / Peak Analyzer", "meterbridge -t ppm :", "meterbridge32x32", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://plugin.org.uk/meterbridge/") ],
[ "meterbridge", "MeterBridge Digital Peak Meter", "VU / Peak Analyzer", "meterbridge -t dpm -c 2 : :", "meterbridge32x32", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://plugin.org.uk/meterbridge/") ],
[ "meterbridge", "MeterBridge 'Jellyfish' Phase Meter", "VU / Peak Analyzer", "meterbridge -t jf -c 2 : :", "meterbridge32x32", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://plugin.org.uk/meterbridge/") ],
[ "meterbridge", "MeterBridge Oscilloscope Meter", "VU / Peak Analyzer", "meterbridge -t sco :", "meterbridge32x32", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://plugin.org.uk/meterbridge/") ],
[ "lives", "LiVES", "VJ / Video Editor", "lives", "lives", TEMPLATE_NO, LEVEL_0, ("---", 1), ("", "http://lives.sf.net/") ],

[ "mhwaveedit", "MhWaveEdit", "Audio Editor", "mhwaveedit", "mhwaveedit", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://gna.org/projects/mhwaveedit/") ],
[ "luppp", "Luppp", "Audio Looper", "luppp", "luppp", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://openavproductions.com/luppp/") ],

[ "mixxx", "Mixxx", "DJ", "mixxx", "mixxx", TEMPLATE_NO, LEVEL_0, ("ALSA", 0), ("file:///usr/share/kxstudio/docs/Mixxx-Manual.pdf", "http://mixxx.sf.net/") ],
[ "mamba", "Mamba", "Virtual Keyboard", "mamba", "Mamba", TEMPLATE_NO, LEVEL_NSM, ("ALSA", 0), ("", "https://github.com/brummer10/Mamba") ],

[ "mcpdisp", "MCP Disp", "Mackie Display Emulator", "mcpdisp", "mcpdisp", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://github.com/ovenwerks/mcpdisp") ],

[ "meterbridge", "MeterBridge Classic VU", "VU / Peak Analyzer", "meterbridge -t vu :", "meterbridge32x32", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://plugin.org.uk/meterbridge/") ],
[ "meterbridge", "MeterBridge PPM Meter", "VU / Peak Analyzer", "meterbridge -t ppm :", "meterbridge32x32", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://plugin.org.uk/meterbridge/") ],
[ "meterbridge", "MeterBridge Digital Peak Meter", "VU / Peak Analyzer", "meterbridge -t dpm -c 2 : :", "meterbridge32x32", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://plugin.org.uk/meterbridge/") ],
[ "meterbridge", "MeterBridge 'Jellyfish' Phase Meter", "VU / Peak Analyzer", "meterbridge -t jf -c 2 : :", "meterbridge32x32", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://plugin.org.uk/meterbridge/") ],
[ "meterbridge", "MeterBridge Oscilloscope Meter", "VU / Peak Analyzer", "meterbridge -t sco :", "meterbridge32x32", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://plugin.org.uk/meterbridge/") ],

[ "mhwaveedit", "MhWaveEdit", "Audio Editor", "mhwaveedit", "mhwaveedit", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://gna.org/projects/mhwaveedit/") ],

[ "mixxx", "Mixxx", "DJ", "mixxx", "mixxx_icon", TEMPLATE_NO, LEVEL_0, ("ALSA", 0), ("", "http://mixxx.sf.net/") ],

[ "mpk-m2-editor", "MPK M2 Editor", "Editor for MPK M2", "mpk_m2-editor", "mpk-m2-editor", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://github.com/PiOverFour/MPK-M2-editor") ],

[ "mudita24", "Mudita24", "Ice1712 Mixer", "mudita24", "mudita24", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://github.com/NielsMayer/mudita24") ],

[ "nano-basket", "Nano-Basket", "Nano Hardware Management", "nano-basket", "nano-basket", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://github.com/royvegard/Nano-Basket") ],

[ "non-mixer", "Non-Mixer", "Mixer", "non-mixer", "non-mixer", TEMPLATE_NO, LEVEL_0, ("CV", 0), ("file:///usr/share/doc/non-mixer/MANUAL.html", "http://non.tuxfamily.org/wiki/Non%20Mixer") ],

[ "nootka", "Nootka", "Learn music notation on sheet music", "nootka", "nootka", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://nootka.sourceforge.io/") ],

[ "patchage", "Patchage", "Patch Bay", "patchage", "patchage", TEMPLATE_NO, LEVEL_0, ("ALSA + JACK", 0), ("", "http://drobilla.net/blog/software/patchage/") ],

[ "paulstretch", "PaulStretch", "Extreme Stretch", "paulstretch", generic_audio_icon, TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "") ],
[ "pd-l2ork", "Pd-L2Ork", "Pure-Data Environnement", "pd-l2ork -rt -audiobuf 20 -inchannels 2 -outchannels 2 -alsamidi -mididev 0 %U", "pd-l2ork", TEMPLATE_NO, LEVEL_0, ("ALSA", 0), ("", "http://l2ork.music.vt.edu/main/make-your-own-l2ork/software/") ],

[ "pianobooster", "Piano Booster", "Piano Teacher", "pianobooster", "pianobooster", TEMPLATE_NO, LEVEL_0, ("ALSA", 0), ("", "http://pianobooster.sourceforge.net/") ],

[ "playitslowly", "Play it Slowly", "Strech-Player", "playitslowly", "ch.x29a.playitslowly", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://29a.ch/playitslowly/") ],

[ "dpf-plugins", "ProM", "Music Visualizer", "ProM", "prom", TEMPLATE_NO, LEVEL_0, ("JACK", 0), ("", "https://distrho.sourceforge.io/plugins.php") ],

[ "qamix", "QAMix", "Mixer", "qamix", "qamix", TEMPLATE_NO, LEVEL_0, ("ALSA", 0), ("", "") ],
[ "qarecord", "QARecord", "Recorder", "qarecord --jack", "qarecord_48", TEMPLATE_NO, LEVEL_0, ("ALSA", 0), ("", "") ],

[ "qjackctl", "QJackControl", "JACK Control", "qjackctl", "qjackctl", TEMPLATE_NO, LEVEL_0, ("ALSA + JACK", 1), ("", "https://qjackctl.sourceforge.io/") ],

[ "qlcplus", "QLCplus", "Light-Show Controller", "qlcplus", "qlcplus", TEMPLATE_NO, LEVEL_0, ("ALSA", 0), ("", "https://www.qlcplus.org/") ],

[ "qlcplus", "Fixture editor for QLC+", "Fixture editor for QLC+", "qlcplus-fixtureeditor", "qlcplus-fixtureeditor", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://www.qlcplus.org/") ],

[ "qloud", "Qloud", "Audio measurement tool for JACK", "qloud", "qloud", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://gaydenko.com/qloud/") ],

[ "qmidiarp", "QMidiArp", "MIDI Arpeggiator", "qmidiarp", "qmidiarp", TEMPLATE_NO, LEVEL_0, ("ALSA + JACK", 0), ("", "http://qmidiarp.sourceforge.net/") ],

[ "qmidiroute", "QMidiRoute", "MIDI router & event processor", "qmidiroute", "/usr/share/pixmaps/qmidiroute_32x32.xpm", TEMPLATE_NO, LEVEL_0, ("ALSA", 0), ("", "") ],

[ "qmidictl", "QmidiCtl", "MIDI controller over the network", "qmidictl", "qmidictl", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://qmidictl.sourceforge.io/") ],

[ "qmidinet", "QmidiNet", "MIDI Network Gateway", "qmidinet", "qmidinet", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://qmidinet.sourceforge.io/") ],

[ "qrest", "Qrest", "Calculator for delay, LFO,...", "qrest", "qrest", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "") ],

[ "qxgedit", "QXGedit", "XG HardWare Controler", "qxgedit", "qxgedit", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://qxgedit.sourceforge.io/") ],

[ "raysession", "Ray Session", "NSM Session Manager", "raysession", "raysession", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://github.com/Houston4444/RaySession") ],

[ "recjack", "RecJack", "Recorder", "recjack", "recjack", TEMPLATE_NO, LEVEL_0, ("---", 1), ("", "http://mein-neues-blog.de/2015/02/07/mein-neues-blog-deb-repository/#recjack") ],

[ "rezound", "ReZound", "Audio Editor", "rezound", "rezound32", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://rezound.sourceforge.net/") ],

[ "alsa-tools-gui", "RME Digi Control", "RME Digi Mixer", "rmedigicontrol", "alsa-tools", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "") ],

[ "showq", "ShowQ", "Sampler Player", "showq", "showq_32x32", TEMPLATE_NO, LEVEL_0, ("ALSA", 0), ("", "") ],

[ "shuriken", "Shuriken", "Beat Slicer", "shuriken", "shuriken", TEMPLATE_NO, LEVEL_1, ("JACK+ALSA", 1), ("", "https://rock-hopper.github.io/shuriken/") ],

[ "simplescreenrecorder", "Simple Screen Recorder", "ScreenCast Recorder", "simplescreenrecorder", "simplescreenrecorder", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://www.maartenbaert.be/simplescreenrecorder/") ],

[ "smplayer", "Smplayer", "Multimédia Player", "smplayer", "smplayer", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://www.smplayer.info/") ],

[ "solfege", "Solfege", "Ear Training", "solfege", "solfege", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://www.gnu.org/software/solfege/") ],

[ "songwrite", "Songwrite 3", "Guitar tablature reader and editor", "songwrite", "songwrite3", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://www.lesfleursdunormal.fr/static/informatique/songwrite/index_en.html") ],

[ "sonic-visualiser", "Sonic Visualiser", "Signal Visualization and Analysis", "sonic-visualiser", "sv-icon", TEMPLATE_NO, LEVEL_0, ("JACK", 0), ("", "https://sonicvisualiser.org/") ],

[ "spek", "Spek", "Spectrum Analyzer", "spek", "spek", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://spek.cc/") ],

[ "stretchplayer", "Stretch Player", "Stretch Player", "stretchplayer", "stretchplayer", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://www.teuton.org/~gabriel/stretchplayer/") ],

[ "swami", "Swami", "SF2 instruments editor", "swami", "swami", TEMPLATE_NO, LEVEL_0, ("ALSA", 0), ("", "http://www.swamiproject.org/") ],

[ "tinyeartrainer", "Tiny Ear Trainer", "Ear Training", "tinyeartrainer", "tinyeartrainer", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://29a.ch/tinyeartrainer/") ],

[ "timemachine", "TimeMachine", "Recorder", "timemachine", "/usr/share/timemachine/pixmaps/timemachine-icon.png", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://plugin.org.uk/timemachine/") ],

[ "tmlauncher", "TM Launcher", "Recorder", "TMLauncher.py", "TMLauncher", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "") ],

[ "tuxguitar", "TuxGuitar", "Guitar Score", "tuxguitar", "tuxguitar", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://www.tuxguitar.com.ar/") ],

[ "vkeybd", "Virtual Keyboard", "Virtual Keyboard", "vkeybd", "vkeybd", TEMPLATE_NO, LEVEL_0, ("ALSA", 0), ("", "https://github.com/tiwai/vkeybd") ],

[ "vmpk", "Virtual MIDI Piano Keyboard (ALSA)","Virtual Keyboard", "vmpk", "vmpk", TEMPLATE_NO, LEVEL_0, ("ALSA", 0), ("file:///usr/share/doc/vmpk/help.html", "http://vmpk.sf.net/") ],
[ "vmpk-jack", "Virtual MIDI Piano Keyboard (JACK)","Virtual Keyboard", "vmpk-jack", "vmpk", TEMPLATE_NO, LEVEL_0, ("JACK", 0), ("file:///usr/share/doc/vmpk/help.html", "http://vmpk.sf.net/") ],

[ "x42-plugins", "X42 - StepSeq", "Step By Step Sequencer", "x42-stepseq", "x42-stepseq", TEMPLATE_NO, LEVEL_0, ("JACK", 0), ("", "https://x42-plugins.com/x42/x42-stepseq-8x8") ],

[ "x42-plugins", "X42-Meter - EBU R128", "Meter", "x42-meter", "x42-meters", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-meters") ],

[ "x42-plugins", "X42-Meter - K20", "Meter", "x42-meter 1", "x42-meters", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-meters") ],

[ "x42-plugins", "X42-Meter - K14", "Meter", "x42-meter 2", "x42-meters", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-meters") ],

[ "x42-plugins", "X42-Meter - K12", "Meter", "x42-meter 3", "x42-meters", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-meters") ],

[ "x42-plugins", "X42-Meter - BBC", "Meter", "x42-meter 4", "x42-meters", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-meters") ],

[ "x42-plugins", "X42-Meter - BBC M-6", "Meter", "x42-meter 5", "x42-meters", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-meters") ],

[ "x42-plugins", "X42-Meter - DIN", "Meter", "x42-meter 6", "x42-meters", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-meters") ],

[ "x42-plugins", "X42-Meter - EBU", "Meter", "x42-meter 7", "x42-meters", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-meters") ],

[ "x42-plugins", "X42-Meter - Nordic", "Meter", "x42-meter 8", "x42-meters", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-meters") ],

[ "x42-plugins", "X42-Meter - VU", "Meter", "x42-meter 9", "x42-meters", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-meters") ],

[ "x42-plugins", "X42-Meter - True Peak et RMS", "Meter", "x42-meter 10", "x42-meters", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-meters") ],

[ "x42-plugins", "X42-Meter - Dynamic Range", "Meter", "x42-meter 11", "x42-meters", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-meters") ],

[ "x42-plugins", "X42-Meter - Phase Correlation ", "Meter", "x42-meter 12", "x42-meters", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-meters") ],

[ "x42-plugins", "X42-Meter - Goniometer", "Meter", "x42-meter 13", "x42-meters", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-meters") ],

[ "x42-plugins", "X42-Meter - Phase Frequency Wheel", "Meter", "x42-meter 14", "x42-meters", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-meters") ],

[ "x42-plugins", "X42-Meter - 1/3 Octave Spectrum", "Meter", "x42-meter 15", "x42-meters", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-meters") ],

[ "x42-plugins", "X42-Meter - Frequency Scope", "Meter", "x42-meter 16", "x42-meters", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-meters") ],

[ "x42-plugins", "X42-Meter - Distribution Histogram", "Meter", "x42-meter 17", "x42-meters", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-meters") ],

[ "x42-plugins", "X42-Meter - Bitmeter", "Meter", "x42-meter 18", "x42-meters", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-meters") ],

[ "x42-plugins", "X42-Meter - Surround Analysor", "Meter", "x42-meter 19", "x42-meters", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-meters") ],

[ "x42-plugins", "X42 - Mixtri", "Mixer/Trigger Preprocessor", "x42-mixtri", "x42-mixtri", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-mixtrix") ],

[ "x42-plugins", "X42 - Oscilloscope", "Oscilloscope", "x42-scope", "x42-scope", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-scope") ],

[ "x42-plugins", "X42 - Tuna", "Instrument Tuner", "x42-tuna", "x42-tuna", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-tuner") ],

[ "qjackctl", "QJackControl", "JACK Control", "qjackctl", "qjackctl", TEMPLATE_NO, LEVEL_0, ("ALSA + JACK", 1), ("", "") ],
[ "x42-plugins", "X42 - Tuna - spectral", "Instrument Tuner - spectrum", "x42-tuna 1", "x42-tuna", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "https://x42-plugins.com/x42/x42-tuner") ],

[ "qamix", "QAMix", "Mixer", "qamix", "qamix", TEMPLATE_NO, LEVEL_0, ("ALSA", 0), ("", "") ],
[ "qarecord", "QARecord", "Recorder", "qarecord --jack", "qarecord_48", TEMPLATE_NO, LEVEL_0, ("ALSA", 0), ("", "") ],
[ "qmidiarp", "QMidiArp", "MIDI Arpeggiator", "qmidiarp", generic_midi_icon, TEMPLATE_NO, LEVEL_0, ("ALSA", 0), ("", "") ],
[ "xjadeo", "XJadeo", "Video Player", "qjadeo", "qjadeo", TEMPLATE_NO, LEVEL_0, ("---", 1), ("", "http://xjadeo.sf.net/") ],

[ "timemachine", "TimeMachine", "Recorder", "timemachine", "/usr/share/timemachine/pixmaps/timemachine-icon.png", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://plugin.org.uk/timemachine/") ],
[ "zita-bls1", "Zita-bls1", "Binaural -> stereo signal converter", "zita-bls1", "zita-bls1", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://kokkinizita.linuxaudio.org/linuxaudio/index.html") ],

[ "vmpk", "Virtual MIDI Piano Keyboard (ALSA)","Virtual Keyboard","vmpk", "vmpk", TEMPLATE_NO, LEVEL_0, ("ALSA", 0), ("file:///usr/share/vmpk/help.html", "http://vmpk.sf.net/") ],
[ "vmpk-jack", "Virtual MIDI Piano Keyboard (JACK)","Virtual Keyboard","vmpk-jack", "vmpk", TEMPLATE_NO, LEVEL_0, ("JACK", 0), ("file:///usr/share/vmpk/help.html", "http://vmpk.sf.net/") ],
[ "zita-mu1", "Zita-mu1", "Stereo Monitoring Organizer", "zita-mu1", "zita-mu1", TEMPLATE_NO, LEVEL_0, ("---", 0), ("", "http://kokkinizita.linuxaudio.org/linuxaudio/index.html") ],

[ "xjadeo", "XJadeo", "Video Player", "qjadeo", "qjadeo", TEMPLATE_NO, LEVEL_0, ("---", 1), ("", "http://xjadeo.sf.net/") ],
]

iTool_Package, iTool_AppName, iTool_Type, iTool_Binary, iTool_Icon, iTool_Template, iTool_Level, iTool_Features, iTool_Docs = range(0, len(list_Tool[0]))


+ 9
- 7
src/claudia_launcher.py View File

@@ -34,6 +34,7 @@ else:
import claudia_database as database
import ui_claudia_launcher
from shared import *
from shared_i18n import *

# ------------------------------------------------------------------------------------------------------------
# Imports (Carla)
@@ -522,7 +523,7 @@ class ClaudiaLauncher(QWidget, ui_claudia_launcher.Ui_ClaudiaLauncherW):

def clearInfo_DAW(self):
self.ico_app_daw.setPixmap(self.getIcon("start-here").pixmap(48, 48))
self.label_name_daw.setText("App Name")
self.label_name_daw.setText(self.tr("App Name"))
self.ico_ladspa_daw.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
self.ico_dssi_daw.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
self.ico_lv2_daw.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
@@ -536,7 +537,7 @@ class ClaudiaLauncher(QWidget, ui_claudia_launcher.Ui_ClaudiaLauncherW):

def clearInfo_Host(self):
self.ico_app_host.setPixmap(self.getIcon("start-here").pixmap(48, 48))
self.label_name_host.setText("App Name")
self.label_name_host.setText(self.tr("App Name"))
self.ico_ladspa_host.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
self.ico_dssi_host.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
self.ico_lv2_host.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
@@ -549,7 +550,7 @@ class ClaudiaLauncher(QWidget, ui_claudia_launcher.Ui_ClaudiaLauncherW):

def clearInfo_Intrument(self):
self.ico_app_ins.setPixmap(self.getIcon("start-here").pixmap(48, 48))
self.label_name_ins.setText("App Name")
self.label_name_ins.setText(self.tr("App Name"))
self.ico_builtin_fx_ins.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
self.ico_audio_input_ins.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
self.label_midi_mode_ins.setText("---")
@@ -559,7 +560,7 @@ class ClaudiaLauncher(QWidget, ui_claudia_launcher.Ui_ClaudiaLauncherW):

def clearInfo_Bristol(self):
self.ico_app_bristol.setPixmap(self.getIcon("start-here").pixmap(48, 48))
self.label_name_bristol.setText("App Name")
self.label_name_bristol.setText(self.tr("App Name"))
self.ico_builtin_fx_bristol.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
self.ico_audio_input_bristol.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
self.label_midi_mode_bristol.setText("---")
@@ -569,7 +570,7 @@ class ClaudiaLauncher(QWidget, ui_claudia_launcher.Ui_ClaudiaLauncherW):

def clearInfo_Plugin(self):
self.ico_app_plugin.setPixmap(self.getIcon("lv2").pixmap(48, 48))
self.label_name_plugin.setText("Plugin Name")
self.label_name_plugin.setText(self.tr("Plugin Name"))
self.label_plugin_audio_ins.setText("0")
self.label_plugin_audio_outs.setText("0")
self.label_plugin_midi_ins.setText("0")
@@ -581,7 +582,7 @@ class ClaudiaLauncher(QWidget, ui_claudia_launcher.Ui_ClaudiaLauncherW):

def clearInfo_Effect(self):
self.ico_app_effect.setPixmap(self.getIcon("start-here").pixmap(48, 48))
self.label_name_effect.setText("App Name")
self.label_name_effect.setText(self.tr("App Name"))
self.ico_stereo_effect.setPixmap(self.getIconForYesNo(False).pixmap(16, 16))
self.label_midi_mode_effect.setText("---")
self.label_session_level_effect.setText(database.LEVEL_0)
@@ -590,7 +591,7 @@ class ClaudiaLauncher(QWidget, ui_claudia_launcher.Ui_ClaudiaLauncherW):

def clearInfo_Tool(self):
self.ico_app_tool.setPixmap(self.getIcon("start-here").pixmap(48, 48))
self.label_name_tool.setText("App Name")
self.label_name_tool.setText(self.tr("App Name"))
self.label_midi_mode_tool.setText("---")
self.label_session_level_tool.setText(database.LEVEL_0)
self.frame_Tool.setEnabled(False)
@@ -1357,6 +1358,7 @@ if __name__ == '__main__':
app.setApplicationVersion(VERSION)
app.setOrganizationName("Cadence")
app.setWindowIcon(QIcon(":/scalable/claudia-launcher.svg"))
setup_i18n()

# Do not close on SIGUSR1
signal(SIGUSR1, SIG_IGN)


+ 2
- 0
src/jacksettings.py View File

@@ -34,6 +34,7 @@ else:
# Imports (Custom Stuff)

import ui_settings_jack
from shared_i18n import *

# ------------------------------------------------------------------------------------------------------------
# Try Import DBus
@@ -934,6 +935,7 @@ if __name__ == '__main__':

# App initialization
app = QApplication(sys_argv)
setup_i18n()

# Connect to DBus
if dbus:


+ 2
- 0
src/logs.py View File

@@ -33,6 +33,7 @@ else:

import ui_logs
from shared import *
from shared_i18n import *

# ------------------------------------------------------------------------------------------------------------
# Fix log text output (get rid of terminal colors stuff)
@@ -451,6 +452,7 @@ if __name__ == '__main__':
app.setApplicationVersion(VERSION)
app.setOrganizationName("Cadence")
app.setWindowIcon(QIcon(":/scalable/cadence.svg"))
setup_i18n()

# Show GUI
gui = LogsW(None)


+ 4
- 2
src/render.py View File

@@ -33,6 +33,7 @@ else:

import ui_render
from shared import *
from shared_i18n import *
from jacklib_helpers import *

# ------------------------------------------------------------------------------------------------------------
@@ -239,7 +240,7 @@ class RenderW(QDialog):
os.chdir(self.ui.le_folder.text())

if newBufferSize != int(jacklib.get_buffer_size(self.fJackClient)):
print("NOTICE: buffer size changed before render")
print(self.tr("NOTICE: buffer size changed before render"))
jacklib.set_buffer_size(self.fJackClient, newBufferSize)

if useTransport:
@@ -252,7 +253,7 @@ class RenderW(QDialog):
self.fProcess.waitForStarted()

if self.fFreewheel:
print("NOTICE: rendering in freewheel mode")
print(self.tr("NOTICE: rendering in freewheel mode"))
sleep(1)
jacklib.set_freewheel(self.fJackClient, 1)

@@ -442,6 +443,7 @@ if __name__ == '__main__':
app.setApplicationVersion(VERSION)
app.setOrganizationName("Cadence")
app.setWindowIcon(QIcon(":/scalable/cadence.svg"))
setup_i18n()

if jacklib is None:
QMessageBox.critical(None, app.translate("RenderW", "Error"), app.translate("RenderW",


+ 1
- 1
src/shared_canvasjack.py View File

@@ -156,7 +156,7 @@ class AbstractCanvasJackClass(QMainWindow):
failed = bool(jacksettings.setBufferSize(bufferSize))

if failed:
print("Failed to change buffer-size as %i, reset to %i" % (bufferSize, self.fBufferSize))
print(self.tr("Failed to change buffer-size as %i, reset to %i") % (bufferSize, self.fBufferSize))
self.ui_setBufferSize(self.fBufferSize, True)

def jack_setSampleRate(self, sampleRate):


+ 49
- 0
src/shared_i18n.py View File

@@ -0,0 +1,49 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Common/Shared code related to Internationalization
# Copyright (C) 2019 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 COPYING file

# ------------------------------------------------------------------------------------------------------------
# Imports (Global)

import os, sys
if True:
from PyQt5.QtCore import QCoreApplication, QTranslator, QLocale, QLibraryInfo
else:
from PyQt4.QtCore import QCoreApplication, QTranslator, QLocale, QLibraryInfo

def setup_i18n():
app = QCoreApplication.instance()
locale = QLocale()

syspath = sys.path[0]
qmpath = os.path.join(syspath, "..", "locale")

# Load translations from Cadence resources
translator = QTranslator()
if not translator.load(locale, "cadence", "_", qmpath):
return False
app.installTranslator(translator)
app.fAppTranslator = translator

# Load translations from Qt libraries
translator = QTranslator()
if not translator.load(locale, "qt", "_", qmpath):
translator.load(locale, "qt", "_", QLibraryInfo.location(QLibraryInfo.TranslationsPath))
app.installTranslator(translator)
app.fSysTranslator = translator

return True

+ 3
- 0
src/systray.py View File

@@ -49,6 +49,8 @@ try:
except:
TrayEngine = "Qt"

from shared_i18n import *

print("Using Tray Engine '%s'" % TrayEngine)

iActNameId = 0
@@ -680,6 +682,7 @@ if __name__ == '__main__':
QDialog.closeEvent(self, event)

app = QApplication(sys.argv)
setup_i18n()
gui = ExampleGUI()
gui.show()
sys.exit(gui.systray.exec_(app))

Loading…
Cancel
Save