Browse Source

Create new UI which is more compact and easier to read

master
Nils 3 years ago
parent
commit
f8b97904a8
  1. 21
      qtgui/designer/mainwindow.py
  2. 47
      qtgui/designer/mainwindow.ui
  3. 347
      qtgui/mainwindow.py
  4. 369
      qtgui/resources.py
  5. BIN
      qtgui/resources/translations/de.qm
  6. 60
      qtgui/resources/translations/de.ts

21
qtgui/designer/mainwindow.py

@ -2,12 +2,15 @@
# Form implementation generated from reading ui file 'mainwindow.ui'
#
# Created by: PyQt5 UI code generator 5.11.3
# Created by: PyQt5 UI code generator 5.15.0
#
# WARNING! All changes made in this file will be lost!
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
@ -35,6 +38,15 @@ class Ui_MainWindow(object):
self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 832, 502))
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.setSpacing(0)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.rack = QtWidgets.QTreeWidget(self.scrollAreaWidgetContents)
self.rack.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
self.rack.setObjectName("rack")
self.rack.header().setSortIndicatorShown(False)
self.verticalLayout_2.addWidget(self.rack)
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.verticalLayout.addWidget(self.scrollArea)
MainWindow.setCentralWidget(self.centralwidget)
@ -59,6 +71,9 @@ class Ui_MainWindow(object):
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
self.checkBox_ignoreProgramChanges.setText(_translate("MainWindow", "Ignore MIDI Bank and Program Changes"))
self.rack.headerItem().setText(0, _translate("MainWindow", "Channel"))
self.rack.headerItem().setText(1, _translate("MainWindow", "Play Test"))
self.rack.headerItem().setText(2, _translate("MainWindow", "Bank"))
self.rack.headerItem().setText(3, _translate("MainWindow", "Program"))
self.menuFile.setTitle(_translate("MainWindow", "File"))
self.actionOpen_sf2_Soundfont.setText(_translate("MainWindow", "Open .sf2 Soundfont"))

47
qtgui/designer/mainwindow.ui

@ -67,6 +67,53 @@
<height>502</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QTreeWidget" name="rack">
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<attribute name="headerShowSortIndicator" stdset="0">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string>Channel</string>
</property>
</column>
<column>
<property name="text">
<string>Play Test</string>
</property>
</column>
<column>
<property name="text">
<string>Bank</string>
</property>
</column>
<column>
<property name="text">
<string>Program</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
</widget>
</item>

347
qtgui/mainwindow.py

@ -23,266 +23,333 @@ import logging; logger = logging.getLogger(__name__); logger.info("import")
#Standard Library Modules
import os.path
#Third Party Modules
from PyQt5 import QtWidgets, QtCore, QtGui
#Template Modules
from template.qtgui.mainwindow import MainWindow as TemplateMainWindow
from template.qtgui.menu import Menu
from template.qtgui.about import About
from template.qtgui.flowlayout import FlowLayout
#Client modules
import engine.api as api
from .designer.channelstrip import Ui_ChannelStrip
class MainWindow(TemplateMainWindow):
def __init__(self):
"""The order of calls is very important.
def __init__(self):
"""The order of calls is very important.
THe split ploint is calling the super.__init. Some functions need to be called before,
some after.
For example:
The about dialog is created in the template main window init. So we need to set additional
help texts before that init.
The menu needs the template main window to exist
so it can reference the ui.menuActions.
"""
so it can reference the ui.menuActions.
"""
#Inject more help texts in the templates About "Did You Know" field.
############################
#About.didYouKnow is a class variable.
#Make the first three words matter!
#Do not start them all with "You can..." or "...that you can", in response to the Did you know? title.
#Do not start them all with "You can..." or "...that you can", in response to the Did you know? title.
About.didYouKnow = [
QtCore.QCoreApplication.translate("About", "Block incoming midi instrument changes by checking 'Ignore MIDI Bank and Progam Changes' in the main window. This will make your carefully selected setup very reliable."),
QtCore.QCoreApplication.translate("About", "A short flash of color indicates which channel just received a note."),
QtCore.QCoreApplication.translate("About", "Click with middle mouse button on a channel to hear a short test melody with the chosen instrument."),
] + About.didYouKnow
#Init the templates main window
] + About.didYouKnow
#Init the templates main window
############################
super().__init__()
super().__init__()
#Set up the custom interface
############################
self.highlightCyanPalette = QtGui.QPalette(self.fPalBlue)
############################
self.highlightCyanPalette = QtGui.QPalette(self.fPalBlue)
self.highlightCyanPalette.setColor(QtGui.QPalette.Disabled, QtGui.QPalette.Window, QtGui.QColor("cyan"))
self.highlightCyanPalette.setColor(QtGui.QPalette.Active, QtGui.QPalette.Window, QtGui.QColor("cyan"))
self.highlightCyanPalette.setColor(QtGui.QPalette.Inactive, QtGui.QPalette.Window, QtGui.QColor("cyan"))
self.ui.label_soundfont_name.hide() #will be shown after loading an sf2
self.ui.checkBox_ignoreProgramChanges.hide() #will be shown after loading an sf2
self.ui.checkBox_ignoreProgramChanges.stateChanged.connect(api.setIgnoreProgramAndBankChanges) #one parameter: int state. 0 is unchecked, 1 is partially, 2 is checked
self.rackFlowLayout = FlowLayout(margin=20, spacing=20)
self.ui.scrollAreaWidgetContents.setLayout(self.rackFlowLayout)
#Set up the Rack Tree Widget that holds all Channels
####################################################
self.rackTreeWidget = self.ui.rack
self.rackTreeWidget.setIconSize(QtCore.QSize(16,16))
#self.rackTreeWidget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
#self.rackTreeWidget.customContextMenuRequested.connect(self.clientsContextMenu)
self.rackTreeWidget.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) #no user editing of the tree widget itself
self.rackTreeWidgetColumns = ("Channel", "Play Test", "Bank", "Program") #basically an enum
self.rackHeaderLabels = [
QtCore.QCoreApplication.translate("RackTreeWidget", "Channel"),
QtCore.QCoreApplication.translate("RackTreeWidget", "Play Test"),
QtCore.QCoreApplication.translate("RackTreeWidget", "Bank"),
QtCore.QCoreApplication.translate("RackTreeWidget", "Program"),
]
self.rackTreeWidget.setHeaderLabels(self.rackHeaderLabels)
self.rackTreeWidget.setSortingEnabled(False)
self.rackTreeWidget.setAlternatingRowColors(True)
self.channels = []
for i in range(16):
cs = ChannelStrip(mainWindow = self, number=i+1) #Channels are 1 based
self.channels.append(cs)
cs.hide()
self.rackFlowLayout.addWidget(cs)
#We set up empty channel items first and update them later when a soundfont gets loaded or changed
channelTreeItem = ChannelTreeItem(mainWindow=self, number=i+1) #Channels are 1 based
self.channels.append(channelTreeItem)
self.rackTreeWidget.addTopLevelItem(channelTreeItem)
#ItemWidgets can only be created after the opLevelItem has been fully created and inserted.
channelTreeItem.initSubWidgets()
#Api Callbacks
#Must be registered before startEngine, which is in super.__init__
############################
############################
api.callbacks.soundfontChanged.append(self.callback_SoundFontLoaded)
api.callbacks.channelChanged.append(self.callback_channelChanged)
api.callbacks.channelActivity.append(self.callback_channelActivity)
api.callbacks.ignoreProgramChangesChanged.append(self.callback_ignoreProgramChangesChanged)
api.callbacks.ignoreProgramChangesChanged.append(self.callback_ignoreProgramChangesChanged)
#New menu entries and template-menu overrides
self.menu.connectMenuEntry("actionOpen_sf2_Soundfont", self.openSoundfontDialog)
self.menu.connectMenuEntry("actionOpen_sf2_Soundfont", self.openSoundfontDialog)
#self.menu.addMenuEntry("menuEdit", "actionNils", "Nils", lambda: print("Merle"))
#self.menu.connectMenuEntry("actionNils", lambda: print("Perle"))
#self.menu.connectMenuEntry("actionNils", lambda: print("Perle"))
self.ui.actionUndo.setVisible(False)
self.ui.actionRedo.setVisible(False)
self.ui.menuEdit.menuAction().setVisible(False)
self.ui.menuEdit.menuAction().setVisible(False)
self.start() #Starts the engine, starts the eventLoop, shows the GUI, or not, depends on the NSM gui save setting. We need to call that after the menu, otherwise the about dialog will block and then we get new menu entries, which looks strange.
#There is so much going on in the engine, we never reach a save status on load.
#Here is the crowbar-method.
self.nsmClient.announceSaveStatus(isClean = True)
self.nsmClient.announceSaveStatus(isClean = True)
def openSoundfontDialog(self):
"""Called by the menu and GUI directly to choose a soundfont file.
We forward the path to NSM which gives us a link in our session dir which we
give to the api.
The api will react with a callback and we can show our Channel Strips"""
if "lastOpenDirectory" in api.session.guiSharedDataToSave:
We forward the path to NSM which gives us a link in our session dir which we
give to the api.
The api will react with a callback and we can show our Channel Strips"""
if "lastOpenDirectory" in api.session.guiSharedDataToSave:
defaultDir = api.session.guiSharedDataToSave["lastOpenDirectory"]
else:
defaultDir = os.path.expanduser("~")
filePath, extension = QtWidgets.QFileDialog.getOpenFileName(self, "Open Soundfont", defaultDir, "Soundfont 2 (*.sf2);;All Files (*.*)")
if filePath: #not cancelled
linkedPath = self.nsmClient.importResource(filePath)
filePath, extension = QtWidgets.QFileDialog.getOpenFileName(self, "Open Soundfont", defaultDir, "Soundfont 2 (*.sf2);;All Files (*.*)")
if filePath: #not cancelled
linkedPath = self.nsmClient.importResource(filePath)
api.session.guiSharedDataToSave["lastOpenDirectory"] = os.path.dirname(filePath)
success = api.loadSoundfont(linkedPath)
if not success:
for cs in self.channels:
self.ui.label_soundfont_name.hide() #will be shown after loading an sf2
self.ui.checkBox_ignoreProgramChanges.hide() #will be shown after loading an sf2
cs.hide()
self.ui.label_soundfont_name.hide() #will be shown after loading an sf2
self.ui.checkBox_ignoreProgramChanges.hide() #will be shown after loading an sf2
for channelTreeItem in self.channels:
channelTreeItem.unloadData()
def callback_ignoreProgramChangesChanged(self, state):
"""Redundant while the program runs. Useful for load / startup"""
"""Redundant while the program runs. Useful for load / startup"""
self.ui.checkBox_ignoreProgramChanges.blockSignals(True)
self.ui.checkBox_ignoreProgramChanges.setChecked(state)
self.ui.checkBox_ignoreProgramChanges.blockSignals(False)
def updateChannelStrips(self, exportDict):
for channelStrip in self.channels:
channelStrip.update(exportDict)
channelStrip.show()
def callback_SoundFontLoaded(self, exportDict):
def updateChannelTreeItems(self, exportDict:dict):
for channelTreeItem in self.channels:
channelTreeItem.updateData(exportDict)
def callback_SoundFontLoaded(self, exportDict:dict):
"""Can be called multiple times. On load, first time file open, other file open"""
self.updateChannelStrips(exportDict)
self.updateChannelTreeItems(exportDict)
self.setWindowTitle(exportDict["name"])
self.ui.label_soundfont_name.setText(exportDict["name"])
self.ui.label_soundfont_name.show()
self.ui.checkBox_ignoreProgramChanges.show()
def callback_channelChanged(self, channel, exportDict):
"""A single channel changed bank, program or both"""
def callback_channelChanged(self, channel:int, exportDict:dict):
"""A single channel changed bank, program or both"""
self.channels[channel-1].callback_channelChanged(exportDict) #self.channels as python list is 0 based, channels are 1 based
def callback_channelActivity(self, channel):
def callback_channelActivity(self, channel:int):
self.channels[channel-1].activity() #self.channels as python list is 0 based, channels are 1 based
def dropEvent(self, event):
"""This function does not exist in the template.
It is easiest to edit it directly than to create another abstraction layer.
Having that function in the mainWindow will not make drops available for subwindows
like About or UserManual. """
like About or UserManual. """
for url in event.mimeData().urls():
filePath = url.toLocalFile()
#Decide here if you want only files, only directories, both etc.
if os.path.isfile(filePath) and filePath.lower().endswith(".sf2"):
linkedPath = self.nsmClient.importResource(filePath)
#Decide here if you want only files, only directories, both etc.
if os.path.isfile(filePath) and filePath.lower().endswith(".sf2"):
linkedPath = self.nsmClient.importResource(filePath)
api.loadSoundfont(linkedPath)
class ChannelStrip(QtWidgets.QGroupBox):
"""Created once on program start. From then on only updated values"""
class ChannelTreeItem(QtWidgets.QTreeWidgetItem):
"""Created once on program start. From then on only updated values
"""
def __init__(self, mainWindow, number):
def __init__(self, mainWindow, number):
super().__init__()
self.mainWindow = mainWindow
self.ui = Ui_ChannelStrip()
self.ui.setupUi(self)
self.channelNumber = number
self.setTitle(f"Channel {self.channelNumber}")
self.channelNumber = number
parameterList = [] #later in update, when a soundfont got actually loaded
super().__init__(parameterList, type=1000) #type 0 is default qt type. 1000 is subclassed user type)
self.setText(self.mainWindow.rackTreeWidgetColumns.index("Channel"), str(self.channelNumber)) #fixed value
#Create icons for midi in status
on = QtGui.QPixmap(16,16)
oncolor = QtGui.QColor("cyan")
on.fill(oncolor)
self.onIcon = QtGui.QIcon(on)
off = QtGui.QPixmap(16,16)
offcolor = QtGui.QColor(50, 50, 50) #dark grey
off.fill(offcolor)
self.offIcon = QtGui.QIcon(off)
if number % 2:
self.setAutoFillBackground(True) #otherwise the palette doesn't work
self.setBackgroundRole(mainWindow.fPalBlue.AlternateBase)
self.ui.comboBox_bank.currentIndexChanged.connect(self.reactToBankOrProgramChange)
self.ui.comboBox_program.currentIndexChanged.connect(self.reactToBankOrProgramChange)
self.activeFlag = False #midi indicator
api.session.eventLoop.verySlowConnect(self._activityOff)
#ItemWidgets can only be created after the topLevelItem has been fully created and inserted.
#These will be created by self.initSubWidgets
self.comboBoxBank = None
self.comboBoxProgram = None
self.pushButtonPlayTest = None
self.patchlist = None #created by self.updateData
def initSubWidgets(self):
#setItemWidget(QTreeWidgetItem *item, int column, QWidget *widget)
self.comboBoxBank = QtWidgets.QComboBox()
self.comboBoxBank.setAutoFillBackground(True) #prevent collision with transparency and the cell below
self.comboBoxProgram = QtWidgets.QComboBox()
self.comboBoxProgram.setAutoFillBackground(True) #prevent collision with transparency and the cell below
self.pushButtonPlayTest = QtWidgets.QPushButton("")
self.pushButtonPlayTest.setAutoFillBackground(True) #prevent collision with transparency and the cell below
self.activeFlag = False
api.session.eventLoop.slowConnect(self._activityOff)
def _activityOff(self):
self.mainWindow.rackTreeWidget.setItemWidget(self, self.mainWindow.rackTreeWidgetColumns.index("Bank"), self.comboBoxBank)
self.mainWindow.rackTreeWidget.setItemWidget(self, self.mainWindow.rackTreeWidgetColumns.index("Program"), self.comboBoxProgram)
self.mainWindow.rackTreeWidget.setItemWidget(self, self.mainWindow.rackTreeWidgetColumns.index("Play Test"), self.pushButtonPlayTest)
self.comboBoxBank.currentIndexChanged.connect(self.reactToBankOrProgramChange)
self.comboBoxProgram.currentIndexChanged.connect(self.reactToBankOrProgramChange)
self.pushButtonPlayTest.clicked.connect(lambda: api.playTestSignal(self.channelNumber))
self.setIcon(self.mainWindow.rackTreeWidgetColumns.index("Channel"), self.offIcon)
def _activityOff(self):
if self.activeFlag:
self.activeFlag = False
self.setPalette(self.mainWindow.fPalBlue)
self.setIcon(self.mainWindow.rackTreeWidgetColumns.index("Channel"), self.offIcon)
def activity(self):
"""Show midi note ons as flashing light.
turning off is done by a 60ms timer for all channels."""
self.setPalette(self.mainWindow.highlightCyanPalette)
self.activeFlag = True
turning off is done by a 60ms timer for all channels."""
self.activeFlag = True
self.setIcon(self.mainWindow.rackTreeWidgetColumns.index("Channel"), self.onIcon)
#QtCore.QTimer().singleShot(50, self._activityOff) this doesn't scale too well
def unloadData(self):
"""When an sf2 fails to load we clean our content.
Activated through mainWindow.openSoundfontDialog"""
self.comboBoxProgram.clear()
self.comboBoxBank.clear()
self.activeFlag = False
self.setIcon(self.mainWindow.rackTreeWidgetColumns.index("Channel"), self.offIcon)
def _populateComboBox_Program(self, bank, program):
self.ui.comboBox_program.clear()
def _populateComboBox_Program(self, bank:int, program:int):
self.comboBoxProgram.clear()
assert self.patchlist[bank] #not empty.
assert 0 <= program < 128, program
nowProgram = self.ui.comboBox_program.currentIndex() #if below fails at least we don't get an error. Worst case is the wrong label.
nowProgram = self.comboBoxProgram.currentIndex() #if below fails at least we don't get an error. Worst case is the wrong label.
for prgnr, patchname in self.patchlist[bank].items():
#Not every program is in every bank. But we don' want a drop down list with gaps.
#So we save the program number as user data, which is only possile with addItem, not list based addItems
text = str(prgnr).zfill(3) + " " + patchname
self.ui.comboBox_program.addItem(text, prgnr) #Icon, Text, UserData
text = str(prgnr).zfill(3) + " " + patchname
self.comboBoxProgram.addItem(text, prgnr) #Icon, Text, UserData
if prgnr == program:
nowProgram = self.ui.comboBox_program.count()-1
self.ui.comboBox_program.setCurrentIndex(nowProgram) #both 0 based
nowProgram = self.comboBoxProgram.count()-1
def update(self, exportDict):
"""Fill in new data for a new soundfont.
self.comboBoxProgram.setCurrentIndex(nowProgram) #both 0 based
def updateData(self, exportDict:dict):
"""
Fill in new data for a new soundfont.
The engine guarantees that the activePatches are actually in the patchlist.
This is important for a soundfont change to one that has fewer instruments.
The engine handles this reduction."""
self.ui.comboBox_bank.blockSignals(True)
self.ui.comboBox_program.blockSignals(True)
The engine handles this reduction.
exportDict:
filePath: str
name: str
patchlist : dict{bankInt : {programInt:nameStr}}
activePatches : dict{channelIntFrom1: tuple(bank, prg, nameStr)}
"""
self.comboBoxBank.blockSignals(True)
self.comboBoxProgram.blockSignals(True)
self.exportDict = exportDict
bank, program, name = exportDict["activePatches"][self.channelNumber] #fluidsynth-channels from 1, gui channels from 1
self.setTitle(f"Channel {self.channelNumber}")
self.patchlist = exportDict["patchlist"] #all patches in this soundfont. bank:{program:name}
bank, program, name = exportDict["activePatches"][self.channelNumber] #fluidsynth-channels from 1, gui channels from 1
self.patchlist = exportDict["patchlist"] #all patches in this soundfont. bank:{program:name}
#Banks
self.ui.comboBox_bank.clear()
for banknr in self.patchlist:
self.ui.comboBox_bank.addItem(str(banknr), banknr) #Icon, Text, UserData
self.comboBoxBank.clear()
for banknr in self.patchlist:
self.comboBoxBank.addItem(str(banknr), banknr) #Icon, Text, UserData
if banknr == bank:
nowBank = self.ui.comboBox_bank.count()-1
self.ui.comboBox_bank.setCurrentIndex(nowBank)
nowBank = self.comboBoxBank.count()-1
self.comboBoxBank.setCurrentIndex(nowBank)
#Programs
self._populateComboBox_Program(bank, program)
#Unblock Signals
self.ui.comboBox_bank.blockSignals(False)
self.ui.comboBox_program.blockSignals(False)
self.comboBoxBank.blockSignals(False)
self.comboBoxProgram.blockSignals(False)
for index in range(len(self.mainWindow.rackTreeWidgetColumns)):
self.mainWindow.rackTreeWidget.resizeColumnToContents(index)
def reactToBankOrProgramChange(self, newIndex): #discard newIndex
bank = self.ui.comboBox_bank.currentData()
program = self.ui.comboBox_program.currentData()
def reactToBankOrProgramChange(self, newIndex): #discard newIndex
bank = self.comboBoxBank.currentData()
program = self.comboBoxProgram.currentData()
assert not bank is None, bank
assert not program is None, program
api.setPatch(self.channelNumber, bank, program) # triggers self.callback_channelChanged
def callback_channelChanged(self, exportDict):
"""Either triggered by a GUI action, routed through the api, or by incoming midi message"""
assert self.channelNumber == exportDict["channel"], (self.channelNumber, exportDict["channel"])
self.ui.comboBox_bank.blockSignals(True)
self.ui.comboBox_program.blockSignals(True)
comboIndex = self.ui.comboBox_bank.findData(exportDict["bank"])
if comboIndex == -1: #qt not found
raise ValueError("Bank not in patchlist")
assert self.channelNumber == exportDict["channel"], (self.channelNumber, exportDict["channel"])
self.comboBoxBank.blockSignals(True)
self.comboBoxProgram.blockSignals(True)
comboIndex = self.comboBoxBank.findData(exportDict["bank"])
if comboIndex == -1: #qt for "not found"
raise ValueError("Bank not in patchlist")
else:
self.ui.comboBox_bank.setCurrentIndex(comboIndex) #both 0 based
self.comboBoxBank.setCurrentIndex(comboIndex) #both 0 based
self._populateComboBox_Program(exportDict["bank"], exportDict["program"])
self.ui.comboBox_bank.blockSignals(False)
self.ui.comboBox_program.blockSignals(False)
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.MiddleButton:
api.playTestSignal(self.channelNumber)
event.accept()
else:
event.ignore()
super().mousePressEvent(event)
self.comboBoxBank.blockSignals(False)
self.comboBoxProgram.blockSignals(False)

369
qtgui/resources.py

@ -2,13 +2,61 @@
# Resource object code
#
# Created by: The Resource Compiler for PyQt5 (Qt v5.14.2)
# Created by: The Resource Compiler for PyQt5 (Qt v5.15.0)
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore
qt_resource_data = b"\
\x00\x00\x02\xde\
\x89\
\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
\x00\x00\x20\x00\x00\x00\x20\x08\x00\x00\x00\x00\x56\x11\x25\x28\
\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\
\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\x26\x00\x00\x80\x84\
\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00\x75\x30\x00\x00\xea\x60\
\x00\x00\x3a\x98\x00\x00\x17\x70\x9c\xba\x51\x3c\x00\x00\x00\x02\
\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\x09\x70\x48\
\x59\x73\x00\x00\x02\x07\x00\x00\x02\x07\x01\x2c\x3a\x75\x9c\x00\
\x00\x00\x07\x74\x49\x4d\x45\x07\xe4\x04\x11\x07\x33\x07\x33\x64\
\x83\x18\x00\x00\x01\xac\x49\x44\x41\x54\x38\xcb\x85\xd3\xbf\x4b\
\xdb\x41\x1c\xc6\xf1\xf7\x37\x26\xfe\x56\xaa\xa5\x0a\x46\xf8\xda\
\x68\xa1\x3a\xa4\x4e\x51\x04\x51\xc1\x76\x52\x10\x4a\x9d\xf2\x07\
\x74\x28\xb8\x38\x74\xab\x4e\x4a\xd1\x45\x33\xb9\x94\x0c\x2d\xd8\
\x7f\xc0\x52\xa1\x28\x42\x04\x45\x1d\x44\x3b\x09\x55\xc4\x68\x5a\
\x53\x2a\x91\x4a\x8c\x79\x1c\x12\x35\x17\x93\x78\xdb\x71\xaf\xe3\
\x3e\x9f\xbb\xe7\xe0\xc1\xa1\xac\x11\x7a\x9a\x39\xbb\x0f\x4e\xdc\
\x76\x41\x70\xd5\x4f\x6d\x41\xf0\x81\x2a\xfe\x14\x00\xdf\x1d\x4d\
\x63\x84\x32\x81\xc3\x28\x38\xec\x77\x7d\x7d\xc4\x8f\xbc\x5d\x24\
\xfa\x98\x55\x10\x5f\xde\x23\xc6\x19\x96\xb6\xb0\xb6\xf3\x80\xa5\
\xa2\x67\x67\xd2\x65\x39\xfe\xdc\x20\xe2\x2e\xd9\x90\xa4\x21\x8a\
\xd6\x73\x81\xe4\x20\x33\x92\xa4\x45\xf0\xc6\x73\x80\x8f\x0c\x25\
\x53\xb2\x03\x26\xee\x83\x55\x97\x1d\x95\x24\xc5\xf7\xe6\xa1\xec\
\x67\x36\xf8\x67\xbb\x42\x92\xf4\xf7\x5d\x35\x00\xbe\x44\x16\x18\
\x61\x52\x92\x7e\x79\xac\x0e\xff\xeb\x27\xc0\x9c\x09\x8e\x4b\x7c\
\x57\x92\xfe\x7b\xdb\x76\x25\x5d\x8c\x42\x53\xd2\x00\xd3\x2c\x48\
\xd2\x54\xc5\x51\x6a\x63\x0f\xac\x18\xe0\x55\x65\x42\x92\x9a\x1b\
\x5a\x07\x76\x24\x29\x00\x23\x06\x70\xf7\x4a\xd2\x3e\x40\xe3\xb9\
\xa4\x3d\xe8\x34\x5e\xf3\xb7\x0d\x10\x06\x38\xdc\x04\x1a\x2d\x0e\
\x53\x2b\x69\x60\xc5\x00\x5a\x9c\x80\xd5\x00\x14\xd7\x10\x35\x80\
\x3b\x02\xf0\x78\xd2\x01\x6f\x3d\x00\x71\x9c\x46\x1e\xde\x94\x9e\
\x49\x92\xb6\x66\xbe\x49\x92\xc2\xd0\x6c\x14\xf9\x89\x59\x23\x7a\
\x9f\x61\xd0\x00\xb1\x9a\xfa\xd3\x4c\xd0\x0d\x01\xf3\xaa\xa7\x78\
\x79\x7e\xb7\x1e\x84\x8a\xb0\x09\x2e\xbb\xe9\xba\x8d\xfb\x5a\x19\
\xbc\xcf\x7e\xee\xe3\xe7\xd4\x4e\xa4\x2a\xfd\x52\x0d\xed\xb1\x34\
\xb0\x50\xba\x9b\xc8\xf0\x32\x4e\xef\x0b\xd7\xc5\xd2\x01\xd4\xad\
\xd9\xe9\x0b\xca\xc8\x64\x22\x50\x7f\xd3\xba\xe7\x36\xd7\x0f\x7f\
\xfe\x6b\x84\x8b\x6f\x11\x3d\xa2\x0c\xf3\x00\x00\x00\x25\x74\x45\
\x58\x74\x64\x61\x74\x65\x3a\x63\x72\x65\x61\x74\x65\x00\x32\x30\
\x32\x30\x2d\x30\x34\x2d\x31\x37\x54\x30\x37\x3a\x35\x31\x3a\x30\
\x37\x2b\x30\x30\x3a\x30\x30\xb9\xea\xa7\x8c\x00\x00\x00\x25\x74\
\x45\x58\x74\x64\x61\x74\x65\x3a\x6d\x6f\x64\x69\x66\x79\x00\x32\
\x30\x32\x30\x2d\x30\x34\x2d\x31\x37\x54\x30\x37\x3a\x35\x31\x3a\
\x30\x37\x2b\x30\x30\x3a\x30\x30\xc8\xb7\x1f\x30\x00\x00\x00\x19\
\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\x00\x77\x77\x77\
\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\
\x1a\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
\x00\x00\x18\x54\
\x89\
\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
@ -19,8 +67,8 @@ qt_resource_data = b"\
\x00\x00\x3a\x98\x00\x00\x17\x70\x9c\xba\x51\x3c\x00\x00\x00\x02\
\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\x09\x70\x48\
\x59\x73\x00\x00\x03\x8d\x00\x00\x03\x8d\x01\xf5\xc8\x53\x60\x00\
\x00\x00\x07\x74\x49\x4d\x45\x07\xe4\x04\x07\x12\x26\x30\xd3\xf3\
\xa9\xdb\x00\x00\x17\x22\x49\x44\x41\x54\x78\xda\xed\x9d\x79\x7c\
\x00\x00\x07\x74\x49\x4d\x45\x07\xe4\x04\x11\x07\x32\x32\x7c\xcc\
\x76\x7a\x00\x00\x17\x22\x49\x44\x41\x54\x78\xda\xed\x9d\x79\x7c\
\x55\xc5\xd9\xc7\xbf\x59\x48\x48\x30\x11\x64\x09\xc8\x22\x9b\xa8\
\x05\x64\x29\x20\x6a\xb5\x15\xf7\x95\xaa\x54\x44\x6a\xad\xe0\x56\
\x45\x44\xaa\x52\xf1\xb5\x8a\x6f\xdd\x6a\xd5\x2a\x58\x11\x5c\x70\
@ -392,175 +440,158 @@ qt_resource_data = b"\
\x2b\x38\x61\x39\xac\xe0\x84\xe5\xb0\x82\x13\x96\xc3\x0a\x4e\x58\
\x0e\x2b\x38\x61\x39\xac\xf0\xff\xf3\x5e\xfe\xe9\x5f\x59\xfc\x28\
\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\x63\x72\x65\
\x61\x74\x65\x00\x32\x30\x32\x30\x2d\x30\x34\x2d\x30\x37\x54\x31\
\x38\x3a\x33\x38\x3a\x34\x38\x2b\x30\x30\x3a\x30\x30\xe2\x91\xc7\
\x16\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\x6d\x6f\
\x64\x69\x66\x79\x00\x32\x30\x32\x30\x2d\x30\x34\x2d\x30\x37\x54\
\x31\x38\x3a\x33\x38\x3a\x34\x38\x2b\x30\x30\x3a\x30\x30\x93\xcc\
\x7f\xaa\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\
\x61\x74\x65\x00\x32\x30\x32\x30\x2d\x30\x34\x2d\x31\x37\x54\x30\
\x37\x3a\x35\x30\x3a\x35\x30\x2b\x30\x30\x3a\x30\x30\xdb\x6f\xfc\
\x58\x00\x00\x00\x25\x74\x45\x58\x74\x64\x61\x74\x65\x3a\x6d\x6f\
\x64\x69\x66\x79\x00\x32\x30\x32\x30\x2d\x30\x34\x2d\x31\x37\x54\
\x30\x37\x3a\x35\x30\x3a\x35\x30\x2b\x30\x30\x3a\x30\x30\xaa\x32\
\x44\xe4\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\
\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\
\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x00\x00\x49\x45\x4e\x44\xae\
\x42\x60\x82\
\x00\x00\x02\xde\
\x89\
\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
\x00\x00\x20\x00\x00\x00\x20\x08\x00\x00\x00\x00\x56\x11\x25\x28\
\x00\x00\x00\x04\x67\x41\x4d\x41\x00\x00\xb1\x8f\x0b\xfc\x61\x05\
\x00\x00\x00\x20\x63\x48\x52\x4d\x00\x00\x7a\x26\x00\x00\x80\x84\
\x00\x00\xfa\x00\x00\x00\x80\xe8\x00\x00\x75\x30\x00\x00\xea\x60\
\x00\x00\x3a\x98\x00\x00\x17\x70\x9c\xba\x51\x3c\x00\x00\x00\x02\
\x62\x4b\x47\x44\x00\xff\x87\x8f\xcc\xbf\x00\x00\x00\x09\x70\x48\
\x59\x73\x00\x00\x02\x07\x00\x00\x02\x07\x01\x2c\x3a\x75\x9c\x00\
\x00\x00\x07\x74\x49\x4d\x45\x07\xe4\x04\x07\x12\x27\x07\x72\x55\
\x3d\x95\x00\x00\x01\xac\x49\x44\x41\x54\x38\xcb\x85\xd3\xbf\x4b\
\xdb\x41\x1c\xc6\xf1\xf7\x37\x26\xfe\x56\xaa\xa5\x0a\x46\xf8\xda\
\x68\xa1\x3a\xa4\x4e\x51\x04\x51\xc1\x76\x52\x10\x4a\x9d\xf2\x07\
\x74\x28\xb8\x38\x74\xab\x4e\x4a\xd1\x45\x33\xb9\x94\x0c\x2d\xd8\
\x7f\xc0\x52\xa1\x28\x42\x04\x45\x1d\x44\x3b\x09\x55\xc4\x68\x5a\
\x53\x2a\x91\x4a\x8c\x79\x1c\x12\x35\x17\x93\x78\xdb\x71\xaf\xe3\
\x3e\x9f\xbb\xe7\xe0\xc1\xa1\xac\x11\x7a\x9a\x39\xbb\x0f\x4e\xdc\
\x76\x41\x70\xd5\x4f\x6d\x41\xf0\x81\x2a\xfe\x14\x00\xdf\x1d\x4d\
\x63\x84\x32\x81\xc3\x28\x38\xec\x77\x7d\x7d\xc4\x8f\xbc\x5d\x24\
\xfa\x98\x55\x10\x5f\xde\x23\xc6\x19\x96\xb6\xb0\xb6\xf3\x80\xa5\
\xa2\x67\x67\xd2\x65\x39\xfe\xdc\x20\xe2\x2e\xd9\x90\xa4\x21\x8a\
\xd6\x73\x81\xe4\x20\x33\x92\xa4\x45\xf0\xc6\x73\x80\x8f\x0c\x25\
\x53\xb2\x03\x26\xee\x83\x55\x97\x1d\x95\x24\xc5\xf7\xe6\xa1\xec\
\x67\x36\xf8\x67\xbb\x42\x92\xf4\xf7\x5d\x35\x00\xbe\x44\x16\x18\
\x61\x52\x92\x7e\x79\xac\x0e\xff\xeb\x27\xc0\x9c\x09\x8e\x4b\x7c\
\x57\x92\xfe\x7b\xdb\x76\x25\x5d\x8c\x42\x53\xd2\x00\xd3\x2c\x48\
\xd2\x54\xc5\x51\x6a\x63\x0f\xac\x18\xe0\x55\x65\x42\x92\x9a\x1b\
\x5a\x07\x76\x24\x29\x00\x23\x06\x70\xf7\x4a\xd2\x3e\x40\xe3\xb9\
\xa4\x3d\xe8\x34\x5e\xf3\xb7\x0d\x10\x06\x38\xdc\x04\x1a\x2d\x0e\
\x53\x2b\x69\x60\xc5\x00\x5a\x9c\x80\xd5\x00\x14\xd7\x10\x35\x80\
\x3b\x02\xf0\x78\xd2\x01\x6f\x3d\x00\x71\x9c\x46\x1e\xde\x94\x9e\
\x49\x92\xb6\x66\xbe\x49\x92\xc2\xd0\x6c\x14\xf9\x89\x59\x23\x7a\
\x9f\x61\xd0\x00\xb1\x9a\xfa\xd3\x4c\xd0\x0d\x01\xf3\xaa\xa7\x78\
\x79\x7e\xb7\x1e\x84\x8a\xb0\x09\x2e\xbb\xe9\xba\x8d\xfb\x5a\x19\
\xbc\xcf\x7e\xee\xe3\xe7\xd4\x4e\xa4\x2a\xfd\x52\x0d\xed\xb1\x34\
\xb0\x50\xba\x9b\xc8\xf0\x32\x4e\xef\x0b\xd7\xc5\xd2\x01\xd4\xad\
\xd9\xe9\x0b\xca\xc8\x64\x22\x50\x7f\xd3\xba\xe7\x36\xd7\x0f\x7f\
\xfe\x6b\x84\x8b\x6f\x11\x3d\xa2\x0c\xf3\x00\x00\x00\x25\x74\x45\
\x58\x74\x64\x61\x74\x65\x3a\x63\x72\x65\x61\x74\x65\x00\x32\x30\
\x32\x30\x2d\x30\x34\x2d\x30\x37\x54\x31\x38\x3a\x33\x39\x3a\x30\
\x37\x2b\x30\x30\x3a\x30\x30\x7f\x51\xd2\x3b\x00\x00\x00\x25\x74\
\x45\x58\x74\x64\x61\x74\x65\x3a\x6d\x6f\x64\x69\x66\x79\x00\x32\
\x30\x32\x30\x2d\x30\x34\x2d\x30\x37\x54\x31\x38\x3a\x33\x39\x3a\
\x30\x37\x2b\x30\x30\x3a\x30\x30\x0e\x0c\x6a\x87\x00\x00\x00\x19\
\x74\x45\x58\x74\x53\x6f\x66\x74\x77\x61\x72\x65\x00\x77\x77\x77\
\x2e\x69\x6e\x6b\x73\x63\x61\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\
\x1a\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
\x00\x00\x05\xe6\
\x00\x00\x07\xd6\
\x3c\
\xb8\x64\x18\xca\xef\x9c\x95\xcd\x21\x1c\xbf\x60\xa1\xbd\xdd\x42\
\x00\x00\x00\x30\x00\x04\xd0\x25\x00\x00\x04\x7f\x05\x07\x86\x8e\
\x00\x00\x03\x14\x05\xb2\xaf\x34\x00\x00\x05\x3d\x09\x99\xd9\xfe\
\x00\x00\x01\x0e\x0d\x01\xa6\x63\x00\x00\x04\xac\x0f\x1e\x47\xbe\
\x00\x00\x00\x00\x69\x00\x00\x05\x95\x03\x00\x00\x00\xb0\x00\x45\
\x00\x69\x00\x6e\x00\x20\x00\x6b\x00\x75\x00\x72\x00\x7a\x00\x65\
\x00\x73\x00\x20\x00\x66\x00\x61\x00\x72\x00\x62\x00\x69\x00\x67\
\x00\x65\x00\x73\x00\x20\x00\x41\x00\x75\x00\x66\x00\x62\x00\x6c\
\x00\x69\x00\x6e\x00\x6b\x00\x65\x00\x6e\x00\x20\x00\x7a\x00\x65\
\x00\x69\x00\x67\x00\x74\x00\x20\x00\x64\x00\x69\x00\x72\x00\x20\
\x00\x61\x00\x75\x00\x66\x00\x20\x00\x77\x00\x65\x00\x6c\x00\x63\
\x00\x68\x00\x65\x00\x6d\x00\x20\x00\x4b\x00\x61\x00\x6e\x00\x61\
\x00\x6c\x00\x20\x00\x67\x00\x65\x00\x72\x00\x61\x00\x64\x00\x65\
\x00\x20\x00\x4e\x00\x6f\x00\x74\x00\x65\x00\x6e\x00\x20\x00\x67\
\x00\x65\x00\x73\x00\x70\x00\x69\x00\x65\x00\x6c\x00\x74\x00\x20\
\x00\x77\x00\x65\x00\x72\x00\x64\x00\x65\x00\x6e\x00\x2e\x08\x00\
\x00\x00\x00\x06\x00\x00\x00\x44\x41\x20\x73\x68\x6f\x72\x74\x20\
\x66\x6c\x61\x73\x68\x20\x6f\x66\x20\x63\x6f\x6c\x6f\x72\x20\x69\
\x6e\x64\x69\x63\x61\x74\x65\x73\x20\x77\x68\x69\x63\x68\x20\x63\
\x68\x61\x6e\x6e\x65\x6c\x20\x6a\x75\x73\x74\x20\x72\x65\x63\x65\
\x69\x76\x65\x64\x20\x61\x20\x6e\x6f\x74\x65\x2e\x07\x00\x00\x00\
\x05\x41\x62\x6f\x75\x74\x01\x03\x00\x00\x01\x44\x00\x42\x00\x6c\
\x00\x6f\x00\x63\x00\x6b\x00\x69\x00\x65\x00\x72\x00\x65\x00\x20\
\x00\x65\x00\x69\x00\x6e\x00\x67\x00\x65\x00\x68\x00\x65\x00\x6e\
\x00\x64\x00\x65\x00\x20\x00\x4d\x00\x69\x00\x64\x00\x69\x00\x2d\
\x00\x49\x00\x6e\x00\x73\x00\x74\x00\x72\x00\x75\x00\x6d\x00\x65\
\x00\x6e\x00\x74\x00\x65\x00\x6e\x00\x77\x00\x65\x00\x63\x00\x68\
\x00\x73\x00\x65\x00\x6c\x00\x20\x00\x69\x00\x6e\x00\x64\x00\x65\
\x00\x6d\x00\x20\x00\x64\x00\x75\x00\x20\x00\x64\x00\x69\x00\x65\
\x00\x20\x00\x67\x00\x6c\x00\x65\x00\x69\x00\x63\x00\x68\x00\x6e\
\x00\x61\x00\x6d\x00\x69\x00\x67\x00\x65\x00\x20\x00\x43\x00\x68\
\x00\x65\x00\x63\x00\x6b\x00\x62\x00\x6f\x00\x78\x00\x20\x00\x6d\
\x00\x61\x00\x72\x00\x6b\x00\x69\x00\x65\x00\x72\x00\x73\x00\x74\
\x00\x2e\x00\x20\x00\x44\x00\x61\x00\x6d\x00\x69\x00\x74\x00\x20\
\x00\x6d\x00\x61\x00\x63\x00\x68\x00\x73\x00\x74\x00\x20\x00\x64\
\x00\x75\x00\x20\x00\x64\x00\x65\x00\x69\x00\x6e\x00\x65\x00\x20\
\x00\x49\x00\x6e\x00\x73\x00\x74\x00\x72\x00\x75\x00\x6d\x00\x65\
\x00\x6e\x00\x74\x00\x65\x00\x6e\x00\x61\x00\x75\x00\x73\x00\x77\
\x00\x61\x00\x68\x00\x6c\x00\x20\x00\x73\x00\x65\x00\x68\x00\x72\
\x00\x20\x00\x72\x00\x6f\x00\x62\x00\x75\x00\x73\x00\x74\x00\x20\
\x00\x75\x00\x6e\x00\x64\x00\x20\x00\x7a\x00\x75\x00\x76\x00\x65\
\x00\x72\x00\x6c\x00\xe4\x00\x73\x00\x73\x00\x69\x00\x67\x00\x2e\
\x08\x00\x00\x00\x00\x06\x00\x00\x00\xa8\x42\x6c\x6f\x63\x6b\x20\
\x69\x6e\x63\x6f\x6d\x69\x6e\x67\x20\x6d\x69\x64\x69\x20\x69\x6e\
\x73\x74\x72\x75\x6d\x65\x6e\x74\x20\x63\x68\x61\x6e\x67\x65\x73\
\x20\x62\x79\x20\x63\x68\x65\x63\x6b\x69\x6e\x67\x20\x27\x49\x67\
\x6e\x6f\x72\x65\x20\x4d\x49\x44\x49\x20\x42\x61\x6e\x6b\x20\x61\
\x6e\x64\x20\x50\x72\x6f\x67\x61\x6d\x20\x43\x68\x61\x6e\x67\x65\
\x73\x27\x20\x69\x6e\x20\x74\x68\x65\x20\x6d\x61\x69\x6e\x20\x77\
\x69\x6e\x64\x6f\x77\x2e\x20\x54\x68\x69\x73\x20\x77\x69\x6c\x6c\
\x20\x6d\x61\x6b\x65\x20\x79\x6f\x75\x72\x20\x63\x61\x72\x65\x66\
\x75\x6c\x6c\x79\x20\x73\x65\x6c\x65\x63\x74\x65\x64\x20\x73\x65\
\x74\x75\x70\x20\x76\x65\x72\x79\x20\x72\x65\x6c\x69\x61\x62\x6c\
\x65\x2e\x07\x00\x00\x00\x05\x41\x62\x6f\x75\x74\x01\x03\x00\x00\
\x00\xee\x00\x45\x00\x69\x00\x6e\x00\x20\x00\x4b\x00\x6c\x00\x69\
\x00\x63\x00\x6b\x00\x20\x00\x6d\x00\x69\x00\x74\x00\x20\x00\x64\
\x00\x65\x00\x72\x00\x20\x00\x6d\x00\x69\x00\x74\x00\x74\x00\x6c\
\x00\x65\x00\x72\x00\x65\x00\x6e\x00\x20\x00\x4d\x00\x61\x00\x75\
\x00\x73\x00\x74\x00\x61\x00\x73\x00\x74\x00\x65\x00\x20\x00\x61\
\x00\x75\x00\x66\x00\x20\x00\x65\x00\x69\x00\x6e\x00\x65\x00\x6e\
\x00\x20\x00\x4b\x00\x61\x00\x6e\x00\x61\x00\x6c\x00\x20\x00\x73\
\x00\x70\x00\x69\x00\x65\x00\x6c\x00\x74\x00\x20\x00\x65\x00\x69\
\x00\x6e\x00\x65\x00\x20\x00\x6b\x00\x75\x00\x72\x00\x7a\x00\x65\
\x00\x20\x00\x54\x00\x65\x00\x73\x00\x74\x00\x6d\x00\x65\x00\x6c\
\x00\x6f\x00\x64\x00\x69\x00\x65\x00\x20\x00\x6d\x00\x69\x00\x74\
\x00\x20\x00\x64\x00\x65\x00\x6d\x00\x20\x00\x61\x00\x75\x00\x73\
\x00\x67\x00\x65\x00\x77\x00\xe4\x00\x68\x00\x6c\x00\x74\x00\x65\
\x00\x6e\x00\x20\x00\x49\x00\x6e\x00\x73\x00\x74\x00\x72\x00\x75\
\x00\x6d\x00\x65\x00\x6e\x00\x74\x00\x20\x00\x61\x00\x62\x00\x2e\
\x08\x00\x00\x00\x00\x06\x00\x00\x00\x63\x43\x6c\x69\x63\x6b\x20\
\x77\x69\x74\x68\x20\x6d\x69\x64\x64\x6c\x65\x20\x6d\x6f\x75\x73\
\x65\x20\x62\x75\x74\x74\x6f\x6e\x20\x6f\x6e\x20\x61\x20\x63\x68\
\x61\x6e\x6e\x65\x6c\x20\x74\x6f\x20\x68\x65\x61\x72\x20\x61\x20\
\x73\x68\x6f\x72\x74\x20\x74\x65\x73\x74\x20\x6d\x65\x6c\x6f\x64\
\x79\x20\x77\x69\x74\x68\x20\x74\x68\x65\x20\x63\x68\x6f\x73\x65\
\x6e\x20\x69\x6e\x73\x74\x72\x75\x6d\x65\x6e\x74\x2e\x07\x00\x00\
\x00\x05\x41\x62\x6f\x75\x74\x01\x03\x00\x00\x00\x0a\x00\x44\x00\
\x61\x00\x74\x00\x65\x00\x69\x08\x00\x00\x00\x00\x06\x00\x00\x00\
\x04\x46\x69\x6c\x65\x07\x00\x00\x00\x0a\x4d\x61\x69\x6e\x57\x69\
\x6e\x64\x6f\x77\x01\x03\x00\x00\x00\x4e\x00\x49\x00\x67\x00\x6e\
\x00\x6f\x00\x72\x00\x69\x00\x65\x00\x72\x00\x65\x00\x20\x00\x4d\
\x00\x49\x00\x44\x00\x49\x00\x20\x00\x42\x00\x61\x00\x6e\x00\x6b\
\x00\x20\x00\x75\x00\x6e\x00\x64\x00\x20\x00\x50\x00\x72\x00\x6f\
\x00\x67\x00\x72\x00\x61\x00\x6d\x00\x20\x00\x43\x00\x68\x00\x61\
\x00\x6e\x00\x67\x00\x65\x00\x73\x08\x00\x00\x00\x00\x06\x00\x00\
\x00\x24\x49\x67\x6e\x6f\x72\x65\x20\x4d\x49\x44\x49\x20\x42\x61\
\x6e\x6b\x20\x61\x6e\x64\x20\x50\x72\x6f\x67\x72\x61\x6d\x20\x43\
\x68\x61\x6e\x67\x65\x73\x07\x00\x00\x00\x0a\x4d\x61\x69\x6e\x57\
\x69\x6e\x64\x6f\x77\x01\x03\x00\x00\x00\x26\x00\x4c\x00\x61\x00\
\x64\x00\x65\x00\x20\x00\x2e\x00\x73\x00\x66\x00\x32\x00\x20\x00\
\x53\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x66\x00\x6f\x00\x6e\x00\
\x74\x08\x00\x00\x00\x00\x06\x00\x00\x00\x13\x4f\x70\x65\x6e\x20\
\x2e\x73\x66\x32\x20\x53\x6f\x75\x6e\x64\x66\x6f\x6e\x74\x07\x00\
\x00\x00\x0a\x4d\x61\x69\x6e\x57\x69\x6e\x64\x6f\x77\x01\x88\x00\
\xb8\x64\x18\xca\xef\x9c\x95\xcd\x21\x1c\xbf\x60\xa1\xbd\xdd\xa7\
\x00\x00\x00\x05\x64\x65\x5f\x44\x45\x42\x00\x00\x00\x70\x00\x04\
\x88\x4b\x00\x00\x04\x7f\x00\x04\x88\x4b\x00\x00\x06\x60\x00\x04\
\xd0\x25\x00\x00\x04\xda\x05\x07\x86\x8e\x00\x00\x03\x14\x05\xb2\
\xaf\x34\x00\x00\x05\x98\x07\x95\xe8\x2d\x00\x00\x06\x2a\x07\x95\
\xe8\x2d\x00\x00\x07\x01\x08\xb5\xfb\x84\x00\x00\x05\xf0\x08\xb5\
\xfb\x84\x00\x00\x06\xc3\x09\x99\xd9\xfe\x00\x00\x01\x0e\x09\xe8\
\x54\xfc\x00\x00\x04\xaa\x09\xe8\x54\xfc\x00\x00\x06\x8f\x0d\x01\
\xa6\x63\x00\x00\x05\x07\x0f\x1e\x47\xbe\x00\x00\x00\x00\x69\x00\
\x00\x07\x3b\x03\x00\x00\x00\xb0\x00\x45\x00\x69\x00\x6e\x00\x20\
\x00\x6b\x00\x75\x00\x72\x00\x7a\x00\x65\x00\x73\x00\x20\x00\x66\
\x00\x61\x00\x72\x00\x62\x00\x69\x00\x67\x00\x65\x00\x73\x00\x20\
\x00\x41\x00\x75\x00\x66\x00\x62\x00\x6c\x00\x69\x00\x6e\x00\x6b\
\x00\x65\x00\x6e\x00\x20\x00\x7a\x00\x65\x00\x69\x00\x67\x00\x74\
\x00\x20\x00\x64\x00\x69\x00\x72\x00\x20\x00\x61\x00\x75\x00\x66\
\x00\x20\x00\x77\x00\x65\x00\x6c\x00\x63\x00\x68\x00\x65\x00\x6d\
\x00\x20\x00\x4b\x00\x61\x00\x6e\x00\x61\x00\x6c\x00\x20\x00\x67\
\x00\x65\x00\x72\x00\x61\x00\x64\x00\x65\x00\x20\x00\x4e\x00\x6f\
\x00\x74\x00\x65\x00\x6e\x00\x20\x00\x67\x00\x65\x00\x73\x00\x70\
\x00\x69\x00\x65\x00\x6c\x00\x74\x00\x20\x00\x77\x00\x65\x00\x72\
\x00\x64\x00\x65\x00\x6e\x00\x2e\x08\x00\x00\x00\x00\x06\x00\x00\
\x00\x44\x41\x20\x73\x68\x6f\x72\x74\x20\x66\x6c\x61\x73\x68\x20\
\x6f\x66\x20\x63\x6f\x6c\x6f\x72\x20\x69\x6e\x64\x69\x63\x61\x74\
\x65\x73\x20\x77\x68\x69\x63\x68\x20\x63\x68\x61\x6e\x6e\x65\x6c\
\x20\x6a\x75\x73\x74\x20\x72\x65\x63\x65\x69\x76\x65\x64\x20\x61\
\x20\x6e\x6f\x74\x65\x2e\x07\x00\x00\x00\x05\x41\x62\x6f\x75\x74\
\x01\x03\x00\x00\x01\x44\x00\x42\x00\x6c\x00\x6f\x00\x63\x00\x6b\
\x00\x69\x00\x65\x00\x72\x00\x65\x00\x20\x00\x65\x00\x69\x00\x6e\
\x00\x67\x00\x65\x00\x68\x00\x65\x00\x6e\x00\x64\x00\x65\x00\x20\
\x00\x4d\x00\x69\x00\x64\x00\x69\x00\x2d\x00\x49\x00\x6e\x00\x73\
\x00\x74\x00\x72\x00\x75\x00\x6d\x00\x65\x00\x6e\x00\x74\x00\x65\
\x00\x6e\x00\x77\x00\x65\x00\x63\x00\x68\x00\x73\x00\x65\x00\x6c\
\x00\x20\x00\x69\x00\x6e\x00\x64\x00\x65\x00\x6d\x00\x20\x00\x64\
\x00\x75\x00\x20\x00\x64\x00\x69\x00\x65\x00\x20\x00\x67\x00\x6c\
\x00\x65\x00\x69\x00\x63\x00\x68\x00\x6e\x00\x61\x00\x6d\x00\x69\
\x00\x67\x00\x65\x00\x20\x00\x43\x00\x68\x00\x65\x00\x63\x00\x6b\
\x00\x62\x00\x6f\x00\x78\x00\x20\x00\x6d\x00\x61\x00\x72\x00\x6b\
\x00\x69\x00\x65\x00\x72\x00\x73\x00\x74\x00\x2e\x00\x20\x00\x44\
\x00\x61\x00\x6d\x00\x69\x00\x74\x00\x20\x00\x6d\x00\x61\x00\x63\
\x00\x68\x00\x73\x00\x74\x00\x20\x00\x64\x00\x75\x00\x20\x00\x64\
\x00\x65\x00\x69\x00\x6e\x00\x65\x00\x20\x00\x49\x00\x6e\x00\x73\
\x00\x74\x00\x72\x00\x75\x00\x6d\x00\x65\x00\x6e\x00\x74\x00\x65\
\x00\x6e\x00\x61\x00\x75\x00\x73\x00\x77\x00\x61\x00\x68\x00\x6c\
\x00\x20\x00\x73\x00\x65\x00\x68\x00\x72\x00\x20\x00\x72\x00\x6f\
\x00\x62\x00\x75\x00\x73\x00\x74\x00\x20\x00\x75\x00\x6e\x00\x64\
\x00\x20\x00\x7a\x00\x75\x00\x76\x00\x65\x00\x72\x00\x6c\x00\xe4\
\x00\x73\x00\x73\x00\x69\x00\x67\x00\x2e\x08\x00\x00\x00\x00\x06\
\x00\x00\x00\xa8\x42\x6c\x6f\x63\x6b\x20\x69\x6e\x63\x6f\x6d\x69\
\x6e\x67\x20\x6d\x69\x64\x69\x20\x69\x6e\x73\x74\x72\x75\x6d\x65\
\x6e\x74\x20\x63\x68\x61\x6e\x67\x65\x73\x20\x62\x79\x20\x63\x68\
\x65\x63\x6b\x69\x6e\x67\x20\x27\x49\x67\x6e\x6f\x72\x65\x20\x4d\
\x49\x44\x49\x20\x42\x61\x6e\x6b\x20\x61\x6e\x64\x20\x50\x72\x6f\
\x67\x61\x6d\x20\x43\x68\x61\x6e\x67\x65\x73\x27\x20\x69\x6e\x20\
\x74\x68\x65\x20\x6d\x61\x69\x6e\x20\x77\x69\x6e\x64\x6f\x77\x2e\
\x20\x54\x68\x69\x73\x20\x77\x69\x6c\x6c\x20\x6d\x61\x6b\x65\x20\
\x79\x6f\x75\x72\x20\x63\x61\x72\x65\x66\x75\x6c\x6c\x79\x20\x73\
\x65\x6c\x65\x63\x74\x65\x64\x20\x73\x65\x74\x75\x70\x20\x76\x65\
\x72\x79\x20\x72\x65\x6c\x69\x61\x62\x6c\x65\x2e\x07\x00\x00\x00\
\x05\x41\x62\x6f\x75\x74\x01\x03\x00\x00\x00\xee\x00\x45\x00\x69\
\x00\x6e\x00\x20\x00\x4b\x00\x6c\x00\x69\x00\x63\x00\x6b\x00\x20\
\x00\x6d\x00\x69\x00\x74\x00\x20\x00\x64\x00\x65\x00\x72\x00\x20\
\x00\x6d\x00\x69\x00\x74\x00\x74\x00\x6c\x00\x65\x00\x72\x00\x65\
\x00\x6e\x00\x20\x00\x4d\x00\x61\x00\x75\x00\x73\x00\x74\x00\x61\
\x00\x73\x00\x74\x00\x65\x00\x20\x00\x61\x00\x75\x00\x66\x00\x20\
\x00\x65\x00\x69\x00\x6e\x00\x65\x00\x6e\x00\x20\x00\x4b\x00\x61\
\x00\x6e\x00\x61\x00\x6c\x00\x20\x00\x73\x00\x70\x00\x69\x00\x65\
\x00\x6c\x00\x74\x00\x20\x00\x65\x00\x69\x00\x6e\x00\x65\x00\x20\
\x00\x6b\x00\x75\x00\x72\x00\x7a\x00\x65\x00\x20\x00\x54\x00\x65\
\x00\x73\x00\x74\x00\x6d\x00\x65\x00\x6c\x00\x6f\x00\x64\x00\x69\
\x00\x65\x00\x20\x00\x6d\x00\x69\x00\x74\x00\x20\x00\x64\x00\x65\
\x00\x6d\x00\x20\x00\x61\x00\x75\x00\x73\x00\x67\x00\x65\x00\x77\
\x00\xe4\x00\x68\x00\x6c\x00\x74\x00\x65\x00\x6e\x00\x20\x00\x49\
\x00\x6e\x00\x73\x00\x74\x00\x72\x00\x75\x00\x6d\x00\x65\x00\x6e\
\x00\x74\x00\x20\x00\x61\x00\x62\x00\x2e\x08\x00\x00\x00\x00\x06\
\x00\x00\x00\x63\x43\x6c\x69\x63\x6b\x20\x77\x69\x74\x68\x20\x6d\
\x69\x64\x64\x6c\x65\x20\x6d\x6f\x75\x73\x65\x20\x62\x75\x74\x74\
\x6f\x6e\x20\x6f\x6e\x20\x61\x20\x63\x68\x61\x6e\x6e\x65\x6c\x20\
\x74\x6f\x20\x68\x65\x61\x72\x20\x61\x20\x73\x68\x6f\x72\x74\x20\
\x74\x65\x73\x74\x20\x6d\x65\x6c\x6f\x64\x79\x20\x77\x69\x74\x68\
\x20\x74\x68\x65\x20\x63\x68\x6f\x73\x65\x6e\x20\x69\x6e\x73\x74\
\x72\x75\x6d\x65\x6e\x74\x2e\x07\x00\x00\x00\x05\x41\x62\x6f\x75\
\x74\x01\x03\x00\x00\x00\x08\x00\x42\x00\x61\x00\x6e\x00\x6b\x08\
\x00\x00\x00\x00\x06\x00\x00\x00\x04\x42\x61\x6e\x6b\x07\x00\x00\
\x00\x0a\x4d\x61\x69\x6e\x57\x69\x6e\x64\x6f\x77\x01\x03\x00\x00\
\x00\x0a\x00\x4b\x00\x61\x00\x6e\x00\x61\x00\x6c\x08\x00\x00\x00\
\x00\x06\x00\x00\x00\x07\x43\x68\x61\x6e\x6e\x65\x6c\x07\x00\x00\
\x00\x0a\x4d\x61\x69\x6e\x57\x69\x6e\x64\x6f\x77\x01\x03\x00\x00\
\x00\x0a\x00\x44\x00\x61\x00\x74\x00\x65\x00\x69\x08\x00\x00\x00\
\x00\x06\x00\x00\x00\x04\x46\x69\x6c\x65\x07\x00\x00\x00\x0a\x4d\
\x61\x69\x6e\x57\x69\x6e\x64\x6f\x77\x01\x03\x00\x00\x00\x4e\x00\
\x49\x00\x67\x00\x6e\x00\x6f\x00\x72\x00\x69\x00\x65\x00\x72\x00\
\x65\x00\x20\x00\x4d\x00\x49\x00\x44\x00\x49\x00\x20\x00\x42\x00\
\x61\x00\x6e\x00\x6b\x00\x20\x00\x75\x00\x6e\x00\x64\x00\x20\x00\
\x50\x00\x72\x00\x6f\x00\x67\x00\x72\x00\x61\x00\x6d\x00\x20\x00\
\x43\x00\x68\x00\x61\x00\x6e\x00\x67\x00\x65\x00\x73\x08\x00\x00\
\x00\x00\x06\x00\x00\x00\x24\x49\x67\x6e\x6f\x72\x65\x20\x4d\x49\
\x44\x49\x20\x42\x61\x6e\x6b\x20\x61\x6e\x64\x20\x50\x72\x6f\x67\
\x72\x61\x6d\x20\x43\x68\x61\x6e\x67\x65\x73\x07\x00\x00\x00\x0a\
\x4d\x61\x69\x6e\x57\x69\x6e\x64\x6f\x77\x01\x03\x00\x00\x00\x26\
\x00\x4c\x00\x61\x00\x64\x00\x65\x00\x20\x00\x2e\x00\x73\x00\x66\
\x00\x32\x00\x20\x00\x53\x00\x6f\x00\x75\x00\x6e\x00\x64\x00\x66\
\x00\x6f\x00\x6e\x00\x74\x08\x00\x00\x00\x00\x06\x00\x00\x00\x13\
\x4f\x70\x65\x6e\x20\x2e\x73\x66\x32\x20\x53\x6f\x75\x6e\x64\x66\
\x6f\x6e\x74\x07\x00\x00\x00\x0a\x4d\x61\x69\x6e\x57\x69\x6e\x64\
\x6f\x77\x01\x03\x00\x00\x00\x12\x00\x4b\x00\x6c\x00\x61\x00\x6e\
\x00\x67\x00\x74\x00\x65\x00\x73\x00\x74\x08\x00\x00\x00\x00\x06\
\x00\x00\x00\x09\x50\x6c\x61\x79\x20\x54\x65\x73\x74\x07\x00\x00\
\x00\x0a\x4d\x61\x69\x6e\x57\x69\x6e\x64\x6f\x77\x01\x03\x00\x00\
\x00\x10\x00\x50\x00\x72\x00\x6f\x00\x67\x00\x72\x00\x61\x00\x6d\
\x00\x6d\x08\x00\x00\x00\x00\x06\x00\x00\x00\x07\x50\x72\x6f\x67\
\x72\x61\x6d\x07\x00\x00\x00\x0a\x4d\x61\x69\x6e\x57\x69\x6e\x64\
\x6f\x77\x01\x03\x00\x00\x00\x08\x00\x42\x00\x61\x00\x6e\x00\x6b\
\x08\x00\x00\x00\x00\x06\x00\x00\x00\x04\x42\x61\x6e\x6b\x07\x00\
\x00\x00\x0e\x52\x61\x63\x6b\x54\x72\x65\x65\x57\x69\x64\x67\x65\
\x74\x01\x03\x00\x00\x00\x0a\x00\x4b\x00\x61\x00\x6e\x00\x61\x00\
\x6c\x08\x00\x00\x00\x00\x06\x00\x00\x00\x07\x43\x68\x61\x6e\x6e\
\x65\x6c\x07\x00\x00\x00\x0e\x52\x61\x63\x6b\x54\x72\x65\x65\x57\
\x69\x64\x67\x65\x74\x01\x03\x00\x00\x00\x12\x00\x4b\x00\x6c\x00\
\x61\x00\x6e\x00\x67\x00\x74\x00\x65\x00\x73\x00\x74\x08\x00\x00\
\x00\x00\x06\x00\x00\x00\x09\x50\x6c\x61\x79\x20\x54\x65\x73\x74\
\x07\x00\x00\x00\x0e\x52\x61\x63\x6b\x54\x72\x65\x65\x57\x69\x64\
\x67\x65\x74\x01\x03\x00\x00\x00\x10\x00\x50\x00\x72\x00\x6f\x00\
\x67\x00\x72\x00\x61\x00\x6d\x00\x6d\x08\x00\x00\x00\x00\x06\x00\
\x00\x00\x07\x50\x72\x6f\x67\x72\x61\x6d\x07\x00\x00\x00\x0e\x52\
\x61\x63\x6b\x54\x72\x65\x65\x57\x69\x64\x67\x65\x74\x01\x88\x00\
\x00\x00\x02\x01\x01\
"
qt_resource_name = b"\
\x00\x0d\
\x0b\x0f\xc0\xa7\
\x00\x61\
\x00\x62\x00\x6f\x00\x75\x00\x74\x00\x6c\x00\x6f\x00\x67\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\
\x00\x0b\
\x0a\xb8\x4e\xa7\
\x00\x66\
\x00\x61\x00\x76\x00\x69\x00\x63\x00\x6f\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
\x00\x0c\
\x0d\xfc\x11\x13\
\x00\x74\
\x00\x72\x00\x61\x00\x6e\x00\x73\x00\x6c\x00\x61\x00\x74\x00\x69\x00\x6f\x00\x6e\x00\x73\
\x00\x0b\
\x0a\xb8\x4e\xa7\
\x00\x66\
\x00\x61\x00\x76\x00\x69\x00\x63\x00\x6f\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\
\x00\x0d\
\x0b\x0f\xc0\xa7\
\x00\x61\
\x00\x62\x00\x6f\x00\x75\x00\x74\x00\x6c\x00\x6f\x00\x67\x00\x6f\x00\x2e\x00\x70\x00\x6e\x00\x67\
\x00\x05\
\x00\x6a\x85\x7d\
\x00\x64\
@ -569,23 +600,23 @@ qt_resource_name = b"\
qt_resource_struct_v1 = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x01\
\x00\x00\x00\x20\x00\x00\x00\x00\x00\x01\x00\x00\x18\x58\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x00\x3c\x00\x02\x00\x00\x00\x01\x00\x00\x00\x04\
\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x00\x3a\x00\x00\x00\x00\x00\x01\x00\x00\x02\xe2\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x04\
\x00\x00\x00\x5a\x00\x00\x00\x00\x00\x01\x00\x00\x1b\x3a\
"
qt_resource_struct_v2 = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x20\x00\x00\x00\x00\x00\x01\x00\x00\x18\x58\
\x00\x00\x01\x71\x70\x46\xf8\x6a\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x01\x71\x70\x46\xf8\x6a\
\x00\x00\x00\x3c\x00\x02\x00\x00\x00\x01\x00\x00\x00\x04\
\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x01\x72\xce\x17\x85\xe2\
\x00\x00\x00\x3a\x00\x00\x00\x00\x00\x01\x00\x00\x02\xe2\
\x00\x00\x01\x72\xce\x17\x85\xe2\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x04\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x5a\x00\x00\x00\x00\x00\x01\x00\x00\x1b\x3a\
\x00\x00\x01\x71\x70\x46\xf8\x6a\
\x00\x00\x01\x72\xf2\xcd\x0a\xa5\
"
qt_version = [int(v) for v in QtCore.qVersion().split('.')]

BIN
qtgui/resources/translations/de.qm

Binary file not shown.

60
qtgui/resources/translations/de.ts

@ -4,17 +4,17 @@
<context>
<name>About</name>
<message>
<location filename="../../mainwindow.py" line="59"/>
<location filename="../../mainwindow.py" line="61"/>
<source>Block incoming midi instrument changes by checking &apos;Ignore MIDI Bank and Progam Changes&apos; in the main window. This will make your carefully selected setup very reliable.</source>
<translation>Blockiere eingehende Midi-Instrumentenwechsel indem du die gleichnamige Checkbox markierst. Damit machst du deine Instrumentenauswahl sehr robust und zuverlässig.</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="60"/>
<location filename="../../mainwindow.py" line="62"/>
<source>A short flash of color indicates which channel just received a note.</source>
<translation>Ein kurzes farbiges Aufblinken zeigt dir auf welchem Kanal gerade Noten gespielt werden.</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="61"/>
<location filename="../../mainwindow.py" line="63"/>
<source>Click with middle mouse button on a channel to hear a short test melody with the chosen instrument.</source>
<translation>Ein Klick mit der mittleren Maustaste auf einen Kanal spielt eine kurze Testmelodie mit dem ausgewählten Instrument ab.</translation>
</message>
@ -22,19 +22,67 @@
<context>
<name>MainWindow</name>
<message>
<location filename="../../designer/mainwindow.py" line="61"/>
<location filename="../../designer/mainwindow.py" line="73"/>
<source>Ignore MIDI Bank and Program Changes</source>
<translation>Ignoriere MIDI Bank und Program Changes</translation>
</message>
<message>
<location filename="../../designer/mainwindow.py" line="62"/>
<location filename="../../designer/mainwindow.py" line="78"/>
<source>File</source>
<translation>Datei</translation>
</message>
<message>
<location filename="../../designer/mainwindow.py" line="63"/>
<location filename="../../designer/mainwindow.py" line="79"/>
<source>Open .sf2 Soundfont</source>
<translation>Lade .sf2 Soundfont</translation>
</message>
<message>
<location filename="../../designer/mainwindow.py" line="74"/>
<source>Channel</source>
<translation>Kanal</translation>
</message>
<message>
<location filename="../../designer/mainwindow.py" line="75"/>
<source>Play Test</source>
<translation>Klangtest</translation>
</message>
<message>
<location filename="../../designer/mainwindow.py" line="76"/>
<source>Bank</source>
<translation>Bank</translation>
</message>
<message>
<location filename="../../designer/mainwindow.py" line="77"/>
<source>Program</source>
<translation>Programm</translation>
</message>
</context>
<context>
<name>RackTreeWidget</name>
<message>
<location filename="../../mainwindow.py" line="94"/>
<source>Channel</source>
<translation>Kanal</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="95"/>
<source>Play Test</source>
<translation>Klangtest</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="96"/>
<source>Bank</source>
<translation>Bank</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="97"/>
<source>Program</source>
<translation>Programm</translation>
</message>
<message>
<location filename="../../mainwindow.py" line="243"/>
<source>Test</source>
<translation type="obsolete">Test</translation>
</message>
</context>
</TS>

Loading…
Cancel
Save