mirror of https://github.com/AxioDL/amuse.git
Add translation infrastructure
This commit is contained in:
parent
b3958e9d52
commit
ca81c07600
|
@ -9,6 +9,7 @@ find_package(Qt5Widgets)
|
|||
find_package(Qt5Network)
|
||||
find_package(Qt5Xml)
|
||||
find_package(Qt5Svg)
|
||||
find_package(Qt5LinguistTools)
|
||||
|
||||
if(WIN32)
|
||||
list(APPEND PLAT_SRCS platforms/win/amuse-gui.rc platforms/win/amuse-gui.manifest)
|
||||
|
@ -22,7 +23,13 @@ add_subdirectory(platforms/freedesktop)
|
|||
declare_qticon_target()
|
||||
list(APPEND PLAT_SRCS mainicon_qt.cpp)
|
||||
|
||||
configure_file(resources/translation_res.qrc translation_res.qrc @ONLY)
|
||||
set(TRANSLATIONS
|
||||
resources/lang_de.ts)
|
||||
QT5_CREATE_TRANSLATION(QM_FILES ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../lib ${TRANSLATIONS})
|
||||
|
||||
QT5_ADD_RESOURCES(qrc_resources.cpp resources/resources.qrc)
|
||||
QT5_ADD_RESOURCES(qrc_translation_res.cpp ${CMAKE_CURRENT_BINARY_DIR}/translation_res.qrc OPTIONS -no-compress)
|
||||
|
||||
add_executable(amuse-gui WIN32 MACOSX_BUNDLE
|
||||
Common.hpp Common.cpp
|
||||
|
@ -42,6 +49,7 @@ add_executable(amuse-gui WIN32 MACOSX_BUNDLE
|
|||
SongGroupEditor.hpp SongGroupEditor.cpp
|
||||
AudioGroupModel.hpp AudioGroupModel.cpp
|
||||
resources/resources.qrc qrc_resources.cpp
|
||||
${QM_FILES} qrc_translation_res.cpp
|
||||
${PLAT_SRCS}
|
||||
main.cpp)
|
||||
if(COMMAND add_sanitizers)
|
||||
|
|
|
@ -208,7 +208,7 @@ void KeyboardWidget::showEvent(QShowEvent* event)
|
|||
{
|
||||
if (QScrollArea* scroll = qobject_cast<QScrollArea*>(parentWidget()->parentWidget()))
|
||||
{
|
||||
/* Scroll to C3 */
|
||||
scroll->ensureVisible(141 * 4 + scroll->width(), 0, 0, 0);
|
||||
/* Scroll to C2 */
|
||||
scroll->ensureVisible(141 * 3 + scroll->width(), 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,20 +29,21 @@ CommandWidget::CommandWidget(amuse::SoundMacro::ICmd* cmd, amuse::SoundMacro::Cm
|
|||
QGridLayout* layout = new QGridLayout;
|
||||
if (m_introspection)
|
||||
{
|
||||
m_titleText.setText(StringViewToQString(m_introspection->m_name));
|
||||
m_titleText.setText(tr(m_introspection->m_name.data()));
|
||||
for (int f = 0; f < 7; ++f)
|
||||
{
|
||||
const amuse::SoundMacro::CmdIntrospection::Field& field = m_introspection->m_fields[f];
|
||||
if (!field.m_name.empty())
|
||||
{
|
||||
layout->addWidget(new QLabel(StringViewToQString(field.m_name)), 0, f);
|
||||
layout->addWidget(new QLabel(tr(field.m_name.data())), 0, f);
|
||||
int value;
|
||||
switch (field.m_tp)
|
||||
{
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::Bool:
|
||||
{
|
||||
QCheckBox* cb = new QCheckBox;
|
||||
cb->setProperty("fieldIndex", f);
|
||||
cb->setCheckState(field.m_default ? Qt::Checked : Qt::Unchecked);
|
||||
cb->setCheckState(amuse::AccessField<bool>(m_cmd, field) ? Qt::Checked : Qt::Unchecked);
|
||||
connect(cb, SIGNAL(stateChanged(int)), this, SLOT(boolChanged(int)));
|
||||
layout->addWidget(cb, 1, f);
|
||||
break;
|
||||
|
@ -58,11 +59,48 @@ CommandWidget::CommandWidget(amuse::SoundMacro::ICmd* cmd, amuse::SoundMacro::Cm
|
|||
sb->setProperty("fieldIndex", f);
|
||||
sb->setMinimum(int(field.m_min));
|
||||
sb->setMaximum(int(field.m_max));
|
||||
sb->setValue(int(field.m_default));
|
||||
switch (field.m_tp)
|
||||
{
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::Int8:
|
||||
sb->setValue(amuse::AccessField<int8_t>(m_cmd, field));
|
||||
break;
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::UInt8:
|
||||
sb->setValue(amuse::AccessField<uint8_t>(m_cmd, field));
|
||||
break;
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::Int16:
|
||||
sb->setValue(amuse::AccessField<int16_t>(m_cmd, field));
|
||||
break;
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::UInt16:
|
||||
sb->setValue(amuse::AccessField<uint16_t>(m_cmd, field));
|
||||
break;
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::Int32:
|
||||
sb->setValue(amuse::AccessField<int32_t>(m_cmd, field));
|
||||
break;
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::UInt32:
|
||||
sb->setValue(amuse::AccessField<uint32_t>(m_cmd, field));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
connect(sb, SIGNAL(valueChanged(int)), this, SLOT(numChanged(int)));
|
||||
layout->addWidget(sb, 1, f);
|
||||
break;
|
||||
}
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::Choice:
|
||||
{
|
||||
FieldComboBox* cb = new FieldComboBox;
|
||||
cb->setProperty("fieldIndex", f);
|
||||
for (int j = 0; j < 4; ++j)
|
||||
{
|
||||
if (field.m_choices->empty())
|
||||
break;
|
||||
cb->addItem(tr(field.m_choices[j].data()));
|
||||
}
|
||||
cb->setCurrentIndex(int(amuse::AccessField<int8_t>(m_cmd, field)));
|
||||
connect(cb, SIGNAL(currentIndexChanged(int)), this, SLOT(choiceChanged(int)));
|
||||
layout->addWidget(cb, 1, f);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -79,12 +117,6 @@ CommandWidget::CommandWidget(amuse::SoundMacro::ICmd* cmd, QWidget* parent)
|
|||
CommandWidget::CommandWidget(amuse::SoundMacro::CmdOp op, QWidget* parent)
|
||||
: CommandWidget(nullptr, op, parent) {}
|
||||
|
||||
template <typename T>
|
||||
static T& AccessField(amuse::SoundMacro::ICmd* cmd, const amuse::SoundMacro::CmdIntrospection::Field& field)
|
||||
{
|
||||
return *reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(std::addressof(*cmd)) + field.m_offset);
|
||||
}
|
||||
|
||||
void CommandWidget::boolChanged(int state)
|
||||
{
|
||||
if (m_introspection)
|
||||
|
@ -92,7 +124,7 @@ void CommandWidget::boolChanged(int state)
|
|||
QCheckBox* cb = static_cast<QCheckBox*>(sender());
|
||||
const amuse::SoundMacro::CmdIntrospection::Field& field =
|
||||
m_introspection->m_fields[cb->property("fieldIndex").toInt()];
|
||||
AccessField<bool>(m_cmd, field) = state == Qt::Checked;
|
||||
amuse::AccessField<bool>(m_cmd, field) = state == Qt::Checked;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -106,22 +138,22 @@ void CommandWidget::numChanged(int value)
|
|||
switch (field.m_tp)
|
||||
{
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::Int8:
|
||||
AccessField<int8_t>(m_cmd, field) = int8_t(value);
|
||||
amuse::AccessField<int8_t>(m_cmd, field) = int8_t(value);
|
||||
break;
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::UInt8:
|
||||
AccessField<uint8_t>(m_cmd, field) = uint8_t(value);
|
||||
amuse::AccessField<uint8_t>(m_cmd, field) = uint8_t(value);
|
||||
break;
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::Int16:
|
||||
AccessField<int16_t>(m_cmd, field) = int16_t(value);
|
||||
amuse::AccessField<int16_t>(m_cmd, field) = int16_t(value);
|
||||
break;
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::UInt16:
|
||||
AccessField<uint16_t>(m_cmd, field) = uint16_t(value);
|
||||
amuse::AccessField<uint16_t>(m_cmd, field) = uint16_t(value);
|
||||
break;
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::Int32:
|
||||
AccessField<int32_t>(m_cmd, field) = int32_t(value);
|
||||
amuse::AccessField<int32_t>(m_cmd, field) = int32_t(value);
|
||||
break;
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::UInt32:
|
||||
AccessField<uint32_t>(m_cmd, field) = uint32_t(value);
|
||||
amuse::AccessField<uint32_t>(m_cmd, field) = uint32_t(value);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -179,11 +211,6 @@ void CommandWidget::animationDestroyed()
|
|||
m_animation = nullptr;
|
||||
}
|
||||
|
||||
SoundMacroListing* CommandWidget::getParent() const
|
||||
{
|
||||
return qobject_cast<SoundMacroListing*>(parentWidget());
|
||||
}
|
||||
|
||||
void CommandWidget::paintEvent(QPaintEvent* event)
|
||||
{
|
||||
/* Rounded frame */
|
||||
|
@ -433,7 +460,11 @@ CatalogueItem::CatalogueItem(amuse::SoundMacro::CmdOp op, const QString& name,
|
|||
{
|
||||
QHBoxLayout* layout = new QHBoxLayout;
|
||||
QLabel* iconLab = new QLabel;
|
||||
iconLab->setPixmap(QIcon(":/icons/IconOpen.svg").pixmap(32, 32));
|
||||
QString iconPath = QStringLiteral(":/commands/%1.svg").arg(name);
|
||||
if (QFile(iconPath).exists())
|
||||
iconLab->setPixmap(QIcon(iconPath).pixmap(32, 32));
|
||||
else
|
||||
iconLab->setPixmap(QIcon(QStringLiteral(":/icons/IconOpen.svg")).pixmap(32, 32));
|
||||
layout->addWidget(iconLab);
|
||||
layout->addWidget(new QLabel(name));
|
||||
layout->addStretch();
|
||||
|
@ -456,22 +487,74 @@ CatalogueItem::CatalogueItem(const CatalogueItem& other, QWidget* parent)
|
|||
setLayout(layout);
|
||||
}
|
||||
|
||||
SoundMacroCatalogue::SoundMacroCatalogue(QWidget* parent)
|
||||
: QWidget(parent)
|
||||
static const char* CategoryStrings[] =
|
||||
{
|
||||
QVBoxLayout* layout = new QVBoxLayout;
|
||||
QT_TRANSLATE_NOOP("SoundMacroCatalogue", "Control"),
|
||||
QT_TRANSLATE_NOOP("SoundMacroCatalogue", "Pitch"),
|
||||
QT_TRANSLATE_NOOP("SoundMacroCatalogue", "Sample"),
|
||||
QT_TRANSLATE_NOOP("SoundMacroCatalogue", "Setup"),
|
||||
QT_TRANSLATE_NOOP("SoundMacroCatalogue", "Special"),
|
||||
QT_TRANSLATE_NOOP("SoundMacroCatalogue", "Structure"),
|
||||
QT_TRANSLATE_NOOP("SoundMacroCatalogue", "Volume")
|
||||
};
|
||||
|
||||
static const char* CategoryDocStrings[] =
|
||||
{
|
||||
QT_TRANSLATE_NOOP("SoundMacroCatalogue", "Commands to control the voice"),
|
||||
QT_TRANSLATE_NOOP("SoundMacroCatalogue", "Commands to control the voice's pitch"),
|
||||
QT_TRANSLATE_NOOP("SoundMacroCatalogue", "Commands to control the voice's sample playback"),
|
||||
QT_TRANSLATE_NOOP("SoundMacroCatalogue", "Commands to setup the voice's mixing process"),
|
||||
QT_TRANSLATE_NOOP("SoundMacroCatalogue", "Miscellaneous commands"),
|
||||
QT_TRANSLATE_NOOP("SoundMacroCatalogue", "Commands to control macro branching"),
|
||||
QT_TRANSLATE_NOOP("SoundMacroCatalogue", "Commands to control the voice's volume")
|
||||
};
|
||||
|
||||
SoundMacroCatalogue::SoundMacroCatalogue(QWidget* parent)
|
||||
: QTreeWidget(parent)
|
||||
{
|
||||
setSelectionMode(QAbstractItemView::NoSelection);
|
||||
setColumnCount(1);
|
||||
setHeaderHidden(true);
|
||||
|
||||
QTreeWidgetItem* rootItems[int(amuse::SoundMacro::CmdType::CmdTypeMAX)];
|
||||
for (int i = 0; i < int(amuse::SoundMacro::CmdType::CmdTypeMAX); ++i)
|
||||
{
|
||||
rootItems[i] = new QTreeWidgetItem(this);
|
||||
setItemWidget(rootItems[i], 0, new CatalogueItem(amuse::SoundMacro::CmdOp::Invalid,
|
||||
tr(CategoryStrings[i]), tr(CategoryDocStrings[i])));
|
||||
}
|
||||
|
||||
for (int i = 1; i < int(amuse::SoundMacro::CmdOp::CmdOpMAX); ++i)
|
||||
{
|
||||
const amuse::SoundMacro::CmdIntrospection* cmd =
|
||||
amuse::SoundMacro::GetCmdIntrospection(amuse::SoundMacro::CmdOp(i));
|
||||
if (cmd)
|
||||
{
|
||||
layout->addWidget(new CatalogueItem(amuse::SoundMacro::CmdOp(i), StringViewToQString(cmd->m_name),
|
||||
StringViewToQString(cmd->m_description)));
|
||||
QTreeWidgetItem* item = new QTreeWidgetItem(rootItems[int(cmd->m_tp)]);
|
||||
setItemWidget(item, 0, new CatalogueItem(amuse::SoundMacro::CmdOp(i), tr(cmd->m_name.data()),
|
||||
tr(cmd->m_description.data())));
|
||||
}
|
||||
}
|
||||
layout->addStretch();
|
||||
setLayout(layout);
|
||||
}
|
||||
|
||||
void SoundMacroCatalogue::mousePressEvent(QMouseEvent* event)
|
||||
{
|
||||
QTreeWidget::mousePressEvent(event);
|
||||
event->ignore();
|
||||
}
|
||||
|
||||
void SoundMacroCatalogue::mouseReleaseEvent(QMouseEvent* event)
|
||||
{
|
||||
QTreeWidget::mouseReleaseEvent(event);
|
||||
event->ignore();
|
||||
}
|
||||
|
||||
void SoundMacroCatalogue::mouseMoveEvent(QMouseEvent* event)
|
||||
{
|
||||
SoundMacroEditor* editor = qobject_cast<SoundMacroEditor*>(parentWidget()->parentWidget());
|
||||
if (!editor || !editor->m_draggedItem)
|
||||
QTreeWidget::mouseMoveEvent(event);
|
||||
event->ignore();
|
||||
}
|
||||
|
||||
void SoundMacroEditor::beginCommandDrag(CommandWidget* widget, const QPoint& eventPt, const QPoint& pt)
|
||||
|
@ -495,7 +578,7 @@ void SoundMacroEditor::beginCatalogueDrag(CatalogueItem* item, const QPoint& eve
|
|||
|
||||
void SoundMacroEditor::mousePressEvent(QMouseEvent* event)
|
||||
{
|
||||
if (m_catalogue->parentWidget()->parentWidget()->geometry().contains(event->pos()))
|
||||
if (m_catalogue->geometry().contains(event->pos()))
|
||||
{
|
||||
QPoint fromParent1 = m_catalogue->mapFrom(this, event->pos());
|
||||
QWidget* ch = m_catalogue->childAt(fromParent1);
|
||||
|
@ -504,7 +587,7 @@ void SoundMacroEditor::mousePressEvent(QMouseEvent* event)
|
|||
CatalogueItem* child = nullptr;
|
||||
while (ch && !(child = qobject_cast<CatalogueItem*>(ch)))
|
||||
ch = ch->parentWidget();
|
||||
if (child)
|
||||
if (child && child->getCmdOp() != amuse::SoundMacro::CmdOp::Invalid)
|
||||
{
|
||||
QPoint fromParent2 = child->mapFrom(m_catalogue, fromParent1);
|
||||
beginCatalogueDrag(child, event->pos(), fromParent2);
|
||||
|
@ -571,6 +654,7 @@ void SoundMacroEditor::mouseMoveEvent(QMouseEvent* event)
|
|||
m_listing->insertDragout();
|
||||
m_dragInsertIdx = -1;
|
||||
}
|
||||
m_catalogue->update();
|
||||
update();
|
||||
}
|
||||
else if (m_draggedCmd)
|
||||
|
@ -579,6 +663,7 @@ void SoundMacroEditor::mouseMoveEvent(QMouseEvent* event)
|
|||
m_draggedCmd->move(m_draggedCmd->x(), listingPt.y() - m_draggedPt.y());
|
||||
if (m_listing->parentWidget()->parentWidget()->geometry().contains(event->pos()))
|
||||
m_listing->moveDrag(m_draggedCmd, listingPt, this, event);
|
||||
m_listing->update();
|
||||
update();
|
||||
}
|
||||
}
|
||||
|
@ -601,6 +686,16 @@ void SoundMacroEditor::keyPressEvent(QKeyEvent* event)
|
|||
}
|
||||
}
|
||||
|
||||
void SoundMacroEditor::catalogueDoubleClicked(QTreeWidgetItem* item, int column)
|
||||
{
|
||||
if (CatalogueItem* cItem = qobject_cast<CatalogueItem*>(m_catalogue->itemWidget(item, column)))
|
||||
{
|
||||
amuse::SoundMacro::CmdOp op = cItem->getCmdOp();
|
||||
if (op != amuse::SoundMacro::CmdOp::Invalid)
|
||||
m_listing->insert(op);
|
||||
}
|
||||
}
|
||||
|
||||
SoundMacroEditor::SoundMacroEditor(ProjectModel::SoundMacroNode* node, QWidget* parent)
|
||||
: EditorWidget(parent), m_splitter(new QSplitter),
|
||||
m_listing(new SoundMacroListing(node)), m_catalogue(new SoundMacroCatalogue)
|
||||
|
@ -618,24 +713,19 @@ SoundMacroEditor::SoundMacroEditor(ProjectModel::SoundMacroNode* node, QWidget*
|
|||
}
|
||||
|
||||
{
|
||||
QScrollArea* catalogueScroll = new QScrollArea;
|
||||
catalogueScroll->setWidget(m_catalogue);
|
||||
catalogueScroll->setWidgetResizable(true);
|
||||
QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
||||
sizePolicy.setHorizontalStretch(0);
|
||||
sizePolicy.setVerticalStretch(0);
|
||||
catalogueScroll->setSizePolicy(sizePolicy);
|
||||
catalogueScroll->setMinimumWidth(150);
|
||||
catalogueScroll->setGeometry(0, 0, 215, 0);
|
||||
catalogueScroll->setMaximumWidth(300);
|
||||
catalogueScroll->setBackgroundRole(QPalette::Base);
|
||||
catalogueScroll->setAutoFillBackground(true);
|
||||
catalogueScroll->setFrameShape(QFrame::StyledPanel);
|
||||
catalogueScroll->setFrameShadow(QFrame::Sunken);
|
||||
catalogueScroll->setLineWidth(1);
|
||||
m_splitter->addWidget(catalogueScroll);
|
||||
m_catalogue->setSizePolicy(sizePolicy);
|
||||
m_catalogue->setMinimumWidth(150);
|
||||
m_catalogue->setGeometry(0, 0, 215, 0);
|
||||
m_catalogue->setMaximumWidth(300);
|
||||
m_splitter->addWidget(m_catalogue);
|
||||
}
|
||||
|
||||
connect(m_catalogue, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)),
|
||||
this, SLOT(catalogueDoubleClicked(QTreeWidgetItem*, int)));
|
||||
|
||||
m_splitter->setCollapsible(0, false);
|
||||
QGridLayout* layout = new QGridLayout;
|
||||
layout->setContentsMargins(QMargins());
|
||||
|
|
|
@ -9,6 +9,8 @@
|
|||
#include <QLabel>
|
||||
#include <QMouseEvent>
|
||||
#include <QSpinBox>
|
||||
#include <QComboBox>
|
||||
#include <QTreeWidget>
|
||||
|
||||
class SoundMacroListing;
|
||||
class CatalogueItem;
|
||||
|
@ -24,6 +26,17 @@ public:
|
|||
void wheelEvent(QWheelEvent* event) { event->ignore(); }
|
||||
};
|
||||
|
||||
class FieldComboBox : public QComboBox
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
FieldComboBox(QWidget* parent = Q_NULLPTR)
|
||||
: QComboBox(parent) {}
|
||||
|
||||
/* Don't scroll */
|
||||
void wheelEvent(QWheelEvent* event) { event->ignore(); }
|
||||
};
|
||||
|
||||
class CommandWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
@ -40,7 +53,6 @@ class CommandWidget : public QWidget
|
|||
void snapOpen();
|
||||
void snapClosed();
|
||||
void setIndex(int index);
|
||||
SoundMacroListing* getParent() const;
|
||||
private slots:
|
||||
void animationDestroyed();
|
||||
void boolChanged(int);
|
||||
|
@ -94,16 +106,20 @@ public:
|
|||
amuse::SoundMacro::CmdOp getCmdOp() const { return m_op; }
|
||||
};
|
||||
|
||||
class SoundMacroCatalogue : public QWidget
|
||||
class SoundMacroCatalogue : public QTreeWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit SoundMacroCatalogue(QWidget* parent = Q_NULLPTR);
|
||||
void mousePressEvent(QMouseEvent* event);
|
||||
void mouseReleaseEvent(QMouseEvent* event);
|
||||
void mouseMoveEvent(QMouseEvent* event);
|
||||
};
|
||||
|
||||
class SoundMacroEditor : public EditorWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
friend class SoundMacroCatalogue;
|
||||
QSplitter* m_splitter;
|
||||
SoundMacroListing* m_listing;
|
||||
SoundMacroCatalogue* m_catalogue;
|
||||
|
@ -120,6 +136,9 @@ public:
|
|||
void mouseReleaseEvent(QMouseEvent* event);
|
||||
void mouseMoveEvent(QMouseEvent* event);
|
||||
void keyPressEvent(QKeyEvent* event);
|
||||
|
||||
public slots:
|
||||
void catalogueDoubleClicked(QTreeWidgetItem* item, int column);
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
#include <cstdint>
|
||||
#include <QApplication>
|
||||
#include <QStyleFactory>
|
||||
#include <QTranslator>
|
||||
#include "MainWindow.hpp"
|
||||
#include "boo/IApplication.hpp"
|
||||
#include <QResource>
|
||||
|
||||
using namespace std::literals;
|
||||
|
||||
|
@ -89,6 +91,11 @@ int main(int argc, char* argv[])
|
|||
BooInterface booApp;
|
||||
boo::APP = &booApp;
|
||||
|
||||
Q_INIT_RESOURCE(translation_res);
|
||||
QTranslator translator;
|
||||
if (translator.load(QLocale(), QLatin1String("lang"), QLatin1String("_"), QLatin1String(":/translations")))
|
||||
a.installTranslator(&translator);
|
||||
|
||||
MainWindow w;
|
||||
w.show();
|
||||
return a.exec();
|
||||
|
|
|
@ -0,0 +1,415 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="de_DE">
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../MainWindow.ui" line="+14"/>
|
||||
<source>Amuse</source>
|
||||
<translation>Amuse</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+169"/>
|
||||
<source>&File</source>
|
||||
<translation>&Datei</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+9"/>
|
||||
<source>P&roject</source>
|
||||
<translation>Projekt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+15"/>
|
||||
<source>&Audio</source>
|
||||
<translation>&Audio</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+8"/>
|
||||
<source>&MIDI</source>
|
||||
<translation>&MIDI</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+7"/>
|
||||
<source>&Edit</source>
|
||||
<translation>&Bearbeiten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+19"/>
|
||||
<source>&New Project</source>
|
||||
<translation>&Neues Projekt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+5"/>
|
||||
<source>&Open Project</source>
|
||||
<translation>&Offenes Projekt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+8"/>
|
||||
<source>&Undo</source>
|
||||
<translation>&Rückgängig machen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+8"/>
|
||||
<source>&Redo</source>
|
||||
<translation>& Wiederholen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+8"/>
|
||||
<source>&Cut</source>
|
||||
<translation>&Schnitt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+8"/>
|
||||
<source>C&opy</source>
|
||||
<translation>Kopieren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+8"/>
|
||||
<source>&Paste</source>
|
||||
<translation>&Einfügen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+8"/>
|
||||
<source>&Delete</source>
|
||||
<translation>&Löschen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+5"/>
|
||||
<source>&Import</source>
|
||||
<translation>&Einführen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+3"/>
|
||||
<source>Ctrl+I</source>
|
||||
<translation>Strg + I</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+12"/>
|
||||
<source>New SF&X Group</source>
|
||||
<translation>Neue SF & X-Gruppe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+12"/>
|
||||
<source>New Son&g Group</source>
|
||||
<translation>Neue Son & g-Gruppe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+12"/>
|
||||
<source>New Sound &Macro</source>
|
||||
<translation>Neuer Sound und Makro</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+12"/>
|
||||
<source>New &Keymap</source>
|
||||
<translation>Neue & Keymap</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+12"/>
|
||||
<source>New &Layers</source>
|
||||
<translation>Neu & Schichten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+11"/>
|
||||
<source>&Auto-Play</source>
|
||||
<translation>&Automatisches Abspielen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+8"/>
|
||||
<source>&Output Device:</source>
|
||||
<translation>&Ausgabegerät:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+8"/>
|
||||
<source>&Input Device:</source>
|
||||
<translation>&Eingabegerät:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+8"/>
|
||||
<source>&Export GameCube Groups</source>
|
||||
<translation>& GameCube-Gruppen exportieren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+3"/>
|
||||
<source>Ctrl+E</source>
|
||||
<translation>Strg + E</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+12"/>
|
||||
<source>&New Subproject</source>
|
||||
<translation>& Neues Teilprojekt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+12"/>
|
||||
<source>New &ADSR</source>
|
||||
<translation>Neu & ADSR</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+12"/>
|
||||
<source>New &Curve</source>
|
||||
<translation>Neu und Kurve</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../MainWindow.cpp" line="+44"/>
|
||||
<source>Quit</source>
|
||||
<translation>Verlassen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+86"/>
|
||||
<source>The directory at '%1' must exist for the Amuse editor.</source>
|
||||
<translation>Das Verzeichnis unter '% 1' muss für den Amuse-Editor vorhanden sein.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Directory does not exist</source>
|
||||
<translation>Verzeichnis existiert nicht</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+3"/>
|
||||
<source>test</source>
|
||||
<translation>Prüfung</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+4"/>
|
||||
<source>The directory at '%1' must be writable for the Amuse editor.</source>
|
||||
<translation>Das Verzeichnis unter '% 1' muss für den Amuse-Editor beschreibbar sein.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Unable to write to directory</source>
|
||||
<translation>Es konnte nicht in das Verzeichnis geschrieben werden</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+38"/>
|
||||
<source>No Audio Devices Found</source>
|
||||
<translation>Keine Audiogeräte gefunden</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+23"/>
|
||||
<source>No MIDI Devices Found</source>
|
||||
<translation>Keine MIDI-Geräte gefunden</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+125"/>
|
||||
<source>New Project</source>
|
||||
<translation>Neues Projekt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+14"/>
|
||||
<source>Open Project</source>
|
||||
<translation>Offenes Projekt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+7"/>
|
||||
<source>The directory at '%1' does not exist.</source>
|
||||
<translation>Das Verzeichnis '% 1' existiert nicht.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Bad Directory</source>
|
||||
<translation>Schlechtes Verzeichnis</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+12"/>
|
||||
<source>Opening</source>
|
||||
<translation>Öffnung</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+0"/>
|
||||
<location line="+83"/>
|
||||
<location line="+45"/>
|
||||
<source>Scanning Project</source>
|
||||
<translation>Projekt scannen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-116"/>
|
||||
<source>Opening %1</source>
|
||||
<translation>Eröffnung% 1</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+10"/>
|
||||
<source>Import Project</source>
|
||||
<translation>Projekt importieren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+9"/>
|
||||
<source>The file at '%1' could not be interpreted as a MusyX container.</source>
|
||||
<translation>Die Datei '% 1' konnte nicht als MusyX-Container interpretiert werden.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Unsupported MusyX Container</source>
|
||||
<translation>Nicht unterstützter MusyX-Container</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+5"/>
|
||||
<source>Sample Import Mode</source>
|
||||
<translation>Beispiel-Importmodus</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Amuse can import samples as WAV files for ease of editing, import original compressed data for lossless repacking, or both. Exporting the project will prefer whichever version was modified most recently.</source>
|
||||
<translation>Amuse kann Stichproben als WAV-Dateien importieren, um die Bearbeitung zu vereinfachen, original komprimierte Daten für verlustfreies Repacking importieren oder beides. Beim Exportieren des Projekts wird die Version bevorzugt, die zuletzt geändert wurde.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+4"/>
|
||||
<source>Import Compressed</source>
|
||||
<translation>Komprimiert importieren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+0"/>
|
||||
<source>Import WAVs</source>
|
||||
<translation>Importieren Sie WAVs</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+0"/>
|
||||
<source>Import Both</source>
|
||||
<translation>Beide importieren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+16"/>
|
||||
<source>Raw Import Mode</source>
|
||||
<translation>Roher Import-Modus</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Would you like to scan for all MusyX group files in this directory?</source>
|
||||
<translation>Möchten Sie nach allen MusyX-Gruppendateien in diesem Verzeichnis suchen?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+10"/>
|
||||
<source>Project Name</source>
|
||||
<translation>Projektname</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+0"/>
|
||||
<source>What should this project be named?</source>
|
||||
<translation>Wie soll dieses Projekt benannt werden?</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+14"/>
|
||||
<location line="+45"/>
|
||||
<source>Importing</source>
|
||||
<translation>Importieren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="-33"/>
|
||||
<location line="+42"/>
|
||||
<source>Importing %1</source>
|
||||
<translation>Importieren von% 1</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>ProjectModel</name>
|
||||
<message>
|
||||
<location filename="../ProjectModel.cpp" line="+126"/>
|
||||
<source>Sound Macros</source>
|
||||
<translation>Sound-Makros</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+21"/>
|
||||
<source>ADSRs</source>
|
||||
<translation>ADSRs</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+12"/>
|
||||
<source>Curves</source>
|
||||
<translation>Kurven</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+13"/>
|
||||
<source>Keymaps</source>
|
||||
<translation>Schlüsselkarten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+8"/>
|
||||
<source>Layers</source>
|
||||
<translation>Lagen</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>QObject</name>
|
||||
<message>
|
||||
<location filename="../Common.cpp" line="+33"/>
|
||||
<source>A directory at '%1/%2' could not be created.</source>
|
||||
<translation>Ein Verzeichnis unter '% 1 /% 2' konnte nicht erstellt werden.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Unable to create directory</source>
|
||||
<translation>Kann kein Verzeichnis erstellen</translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>SoundMacroCatalogue</name>
|
||||
<message>
|
||||
<location filename="../SoundMacroEditor.cpp" line="+492"/>
|
||||
<source>Control</source>
|
||||
<translation>Steuerung</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Pitch</source>
|
||||
<translation>Tonhöhe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Sample</source>
|
||||
<translation>Probe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Setup</source>
|
||||
<translation>Konfiguration</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Special</source>
|
||||
<translation>Besondere</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Structure</source>
|
||||
<translation>Struktur</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Volume</source>
|
||||
<translation>Volumen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+5"/>
|
||||
<source>Commands to control the voice</source>
|
||||
<translation>Befehle zum Steuern der Stimme</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Commands to control the voice's pitch</source>
|
||||
<translation>Befehle zum Steuern der Tonhöhe der Stimme</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Commands to control the voice's sample playback</source>
|
||||
<translation>Befehle zum Steuern der Sample-Wiedergabe der Voice</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Commands to setup the voice's mixing process</source>
|
||||
<translation>Befehle zum Einrichten des Mischprozesses der Voice</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Miscellaneous commands</source>
|
||||
<translation>Verschiedene Befehle</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Commands to control macro branching</source>
|
||||
<translation>Befehle zum Steuern der Makroverzweigung</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location line="+1"/>
|
||||
<source>Commands to control the voice's volume</source>
|
||||
<translation>Befehle zum Steuern der Lautstärke der Stimme</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
|
@ -0,0 +1,5 @@
|
|||
<RCC>
|
||||
<qresource prefix="/translations">
|
||||
<file>lang_de.qm</file>
|
||||
</qresource>
|
||||
</RCC>
|
|
@ -125,6 +125,18 @@ struct SoundMacro
|
|||
Invalid = 0xff
|
||||
};
|
||||
|
||||
enum class CmdType : uint8_t
|
||||
{
|
||||
Control,
|
||||
Pitch,
|
||||
Sample,
|
||||
Setup,
|
||||
Special,
|
||||
Structure,
|
||||
Volume,
|
||||
CmdTypeMAX
|
||||
};
|
||||
|
||||
/** Introspection structure used by editors to define user interactivity per command */
|
||||
struct CmdIntrospection
|
||||
{
|
||||
|
@ -151,6 +163,7 @@ struct SoundMacro
|
|||
int64_t m_min, m_max, m_default;
|
||||
std::string_view m_choices[4];
|
||||
};
|
||||
CmdType m_tp;
|
||||
std::string_view m_name;
|
||||
std::string_view m_description;
|
||||
Field m_fields[7];
|
||||
|
@ -1120,6 +1133,12 @@ struct SoundMacro
|
|||
void readCmds(athena::io::IStreamReader& r, uint32_t size);
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
static inline T& AccessField(SoundMacro::ICmd* cmd, const SoundMacro::CmdIntrospection::Field& field)
|
||||
{
|
||||
return *reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(std::addressof(*cmd)) + field.m_offset);
|
||||
}
|
||||
|
||||
/** Converts time-cents representation to seconds */
|
||||
static inline double TimeCentsToSeconds(int32_t tc)
|
||||
{
|
||||
|
|
|
@ -28,7 +28,50 @@ struct MakeDefaultCmdOp
|
|||
template <class Tp, class R>
|
||||
static std::unique_ptr<SoundMacro::ICmd> Do(R& r)
|
||||
{
|
||||
return std::make_unique<Tp>();
|
||||
std::unique_ptr<SoundMacro::ICmd> ret = std::make_unique<Tp>();
|
||||
if (const SoundMacro::CmdIntrospection* introspection = SoundMacro::GetCmdIntrospection(r))
|
||||
{
|
||||
for (int f = 0; f < 7; ++f)
|
||||
{
|
||||
const amuse::SoundMacro::CmdIntrospection::Field& field = introspection->m_fields[f];
|
||||
if (!field.m_name.empty())
|
||||
{
|
||||
switch (field.m_tp)
|
||||
{
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::Bool:
|
||||
AccessField<bool>(ret.get(), field) = bool(field.m_default);
|
||||
break;
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::Int8:
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::Choice:
|
||||
AccessField<int8_t>(ret.get(), field) = int8_t(field.m_default);
|
||||
break;
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::UInt8:
|
||||
AccessField<uint8_t>(ret.get(), field) = uint8_t(field.m_default);
|
||||
break;
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::Int16:
|
||||
AccessField<int16_t>(ret.get(), field) = int16_t(field.m_default);
|
||||
break;
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::UInt16:
|
||||
AccessField<uint16_t>(ret.get(), field) = uint16_t(field.m_default);
|
||||
break;
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::Int32:
|
||||
AccessField<int32_t>(ret.get(), field) = int32_t(field.m_default);
|
||||
break;
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::UInt32:
|
||||
AccessField<uint32_t>(ret.get(), field) = uint32_t(field.m_default);
|
||||
break;
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::SoundMacroId:
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::TableId:
|
||||
case amuse::SoundMacro::CmdIntrospection::Field::Type::SampleId:
|
||||
AccessField<SoundMacroIdDNA<athena::Little>>(ret.get(), field).id = uint16_t(field.m_default);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -142,7 +142,8 @@ constexpr SoundMacro::CmdIntrospection::Field::Type GetFieldType()
|
|||
{ return SoundMacro::CmdIntrospection::Field::Type::Invalid; }
|
||||
template <class T, std::enable_if_t<std::is_enum_v<T>, int> = 0>
|
||||
constexpr SoundMacro::CmdIntrospection::Field::Type GetFieldType()
|
||||
{ return SoundMacro::CmdIntrospection::Field::Type::Choice; }
|
||||
{ static_assert(sizeof(T) == 1, "Enum must be an 8-bit type");
|
||||
return SoundMacro::CmdIntrospection::Field::Type::Choice; }
|
||||
template <>
|
||||
constexpr SoundMacro::CmdIntrospection::Field::Type GetFieldType<bool>()
|
||||
{ return SoundMacro::CmdIntrospection::Field::Type::Bool; }
|
||||
|
@ -178,6 +179,7 @@ constexpr SoundMacro::CmdIntrospection::Field::Type GetFieldType<SampleIdDNA<ath
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdEnd::Introspective =
|
||||
{
|
||||
CmdType::Structure,
|
||||
"End"sv,
|
||||
"End of the macro. This always appears at the end of a given SoundMacro."sv,
|
||||
};
|
||||
|
@ -189,6 +191,7 @@ bool SoundMacro::CmdEnd::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdStop::Introspective =
|
||||
{
|
||||
CmdType::Structure,
|
||||
"Stop"sv,
|
||||
"Stops the macro at any point."sv,
|
||||
};
|
||||
|
@ -200,6 +203,7 @@ bool SoundMacro::CmdStop::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSplitKey::Introspective =
|
||||
{
|
||||
CmdType::Structure,
|
||||
"Split Key"sv,
|
||||
"Conditionally branches macro execution based on MIDI key."sv,
|
||||
{
|
||||
|
@ -236,6 +240,7 @@ bool SoundMacro::CmdSplitKey::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSplitVel::Introspective =
|
||||
{
|
||||
CmdType::Structure,
|
||||
"Split Velocity"sv,
|
||||
"Conditionally branches macro execution based on velocity."sv,
|
||||
{
|
||||
|
@ -272,13 +277,14 @@ bool SoundMacro::CmdSplitVel::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdWaitTicks::Introspective =
|
||||
{
|
||||
CmdType::Structure,
|
||||
"Wait Ticks"sv,
|
||||
"Suspend SoundMacro execution for specified length of time. Value of 65535 "
|
||||
"will wait indefinitely, relying on KeyOff or Sample End to signal stop."sv,
|
||||
"will wait indefinitely, relying on Key Off or Sample End to signal stop."sv,
|
||||
{
|
||||
{
|
||||
FIELD_HEAD(SoundMacro::CmdWaitTicks, keyOff),
|
||||
"KeyOff"sv,
|
||||
"Key Off"sv,
|
||||
0, 1, 0
|
||||
},
|
||||
{
|
||||
|
@ -342,13 +348,14 @@ bool SoundMacro::CmdWaitTicks::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdLoop::Introspective =
|
||||
{
|
||||
CmdType::Structure,
|
||||
"Loop"sv,
|
||||
"Branch to specified location in a loop for a specified number of Times. "
|
||||
"65535 will cause an endless loop, relying on KeyOff or Sample End to signal stop."sv,
|
||||
"65535 will cause an endless loop, relying on Key Off or Sample End to signal stop."sv,
|
||||
{
|
||||
{
|
||||
FIELD_HEAD(SoundMacro::CmdLoop, keyOff),
|
||||
"KeyOff"sv,
|
||||
"Key Off"sv,
|
||||
0, 1, 0
|
||||
},
|
||||
{
|
||||
|
@ -403,6 +410,7 @@ bool SoundMacro::CmdLoop::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdGoto::Introspective =
|
||||
{
|
||||
CmdType::Structure,
|
||||
"Goto"sv,
|
||||
"Unconditional branch to specified SoundMacro location."sv,
|
||||
{
|
||||
|
@ -431,13 +439,14 @@ bool SoundMacro::CmdGoto::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdWaitMs::Introspective =
|
||||
{
|
||||
CmdType::Structure,
|
||||
"Wait Millisec"sv,
|
||||
"Suspend SoundMacro execution for specified length of time. Value of 65535 "
|
||||
"will wait indefinitely, relying on KeyOff or Sample End to signal stop."sv,
|
||||
"will wait indefinitely, relying on Key Off or Sample End to signal stop."sv,
|
||||
{
|
||||
{
|
||||
FIELD_HEAD(SoundMacro::CmdWaitMs, keyOff),
|
||||
"KeyOff"sv,
|
||||
"Key Off"sv,
|
||||
0, 1, 0
|
||||
},
|
||||
{
|
||||
|
@ -495,6 +504,7 @@ bool SoundMacro::CmdWaitMs::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdPlayMacro::Introspective =
|
||||
{
|
||||
CmdType::Structure,
|
||||
"Play Macro"sv,
|
||||
"Play a SoundMacro in parallel to this one. Add Note is added to the "
|
||||
"current SoundMacro note to evaluate the new note."sv,
|
||||
|
@ -537,8 +547,9 @@ bool SoundMacro::CmdPlayMacro::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSendKeyOff::Introspective =
|
||||
{
|
||||
"Send Keyoff"sv,
|
||||
"Send keyoff to voice specified by VID stored in a variable or the last started voice."sv,
|
||||
CmdType::Structure,
|
||||
"Send Key Off"sv,
|
||||
"Send Key Off to voice specified by VID stored in a variable or the last started voice."sv,
|
||||
{
|
||||
{
|
||||
FIELD_HEAD(SoundMacro::CmdSendKeyOff, variable),
|
||||
|
@ -575,6 +586,7 @@ bool SoundMacro::CmdSendKeyOff::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSplitMod::Introspective =
|
||||
{
|
||||
CmdType::Structure,
|
||||
"Split Mod"sv,
|
||||
"Conditionally branch if mod wheel is greater than or equal to specified value."sv,
|
||||
{
|
||||
|
@ -611,6 +623,7 @@ bool SoundMacro::CmdSplitMod::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdPianoPan::Introspective =
|
||||
{
|
||||
CmdType::Control,
|
||||
"Piano Pan"sv,
|
||||
"Gives piano-like sounds a natural-sounding stereo spread. The current key delta "
|
||||
"from Center Key is scaled with Scale and biased with Center Pan to evaluate panning."sv,
|
||||
|
@ -643,6 +656,7 @@ bool SoundMacro::CmdPianoPan::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSetAdsr::Introspective =
|
||||
{
|
||||
CmdType::Volume,
|
||||
"Set ADSR"sv,
|
||||
"Specify ADSR envelope using a pool object. DLS mode must match setting in ADSR."sv,
|
||||
{
|
||||
|
@ -666,6 +680,7 @@ bool SoundMacro::CmdSetAdsr::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdScaleVolume::Introspective =
|
||||
{
|
||||
CmdType::Volume,
|
||||
"Scale Volume"sv,
|
||||
"Calculates volume by scaling and biasing velocity. "
|
||||
"The result may be passed through an optional Curve."sv,
|
||||
|
@ -714,6 +729,7 @@ bool SoundMacro::CmdScaleVolume::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdPanning::Introspective =
|
||||
{
|
||||
CmdType::Control,
|
||||
"Panning"sv,
|
||||
"Start pan-sweep from Pan Position offset by Width over specified time period."sv,
|
||||
{
|
||||
|
@ -743,6 +759,7 @@ bool SoundMacro::CmdPanning::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdEnvelope::Introspective =
|
||||
{
|
||||
CmdType::Volume,
|
||||
"Envelope"sv,
|
||||
"Start a velocity envelope by fading the current velocity to the one "
|
||||
"evaluated by Scale and Add. The result is optionally transformed with a Curve object."sv,
|
||||
|
@ -795,6 +812,7 @@ bool SoundMacro::CmdEnvelope::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdStartSample::Introspective =
|
||||
{
|
||||
CmdType::Sample,
|
||||
"Start Sample"sv,
|
||||
"Start a Sample playing on the voice. An Offset in samples may be applied. "
|
||||
"This offset may be scaled with the current velocity."sv,
|
||||
|
@ -846,6 +864,7 @@ bool SoundMacro::CmdStartSample::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdStopSample::Introspective =
|
||||
{
|
||||
CmdType::Sample,
|
||||
"Stop Sample"sv,
|
||||
"Stops the sample playing on the voice."sv
|
||||
};
|
||||
|
@ -857,8 +876,9 @@ bool SoundMacro::CmdStopSample::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdKeyOff::Introspective =
|
||||
{
|
||||
"KeyOff"sv,
|
||||
"Sends a KeyOff to the current voice."sv
|
||||
CmdType::Control,
|
||||
"Key Off"sv,
|
||||
"Sends a Key Off to the current voice."sv
|
||||
};
|
||||
bool SoundMacro::CmdKeyOff::Do(SoundMacroState& st, Voice& vox) const
|
||||
{
|
||||
|
@ -868,6 +888,7 @@ bool SoundMacro::CmdKeyOff::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSplitRnd::Introspective =
|
||||
{
|
||||
CmdType::Structure,
|
||||
"Split Rnd"sv,
|
||||
"Conditionally branch if a random value is greater than or equal to RND. "
|
||||
"A lower RND will cause a higher probability of branching."sv,
|
||||
|
@ -905,6 +926,7 @@ bool SoundMacro::CmdSplitRnd::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdFadeIn::Introspective =
|
||||
{
|
||||
CmdType::Volume,
|
||||
"Fade In"sv,
|
||||
"Start a velocity envelope by fading from silence to the velocity "
|
||||
"evaluated by Scale and Add. The result is optionally transformed with a Curve object."sv,
|
||||
|
@ -957,6 +979,7 @@ bool SoundMacro::CmdFadeIn::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSpanning::Introspective =
|
||||
{
|
||||
CmdType::Control,
|
||||
"Spanning"sv,
|
||||
"Start span-sweep from Span Position offset by Width over specified time period."sv,
|
||||
{
|
||||
|
@ -985,6 +1008,7 @@ bool SoundMacro::CmdSpanning::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSetAdsrCtrl::Introspective =
|
||||
{
|
||||
CmdType::Volume,
|
||||
"Set ADSR Ctrl"sv,
|
||||
"Bind MIDI controls to ADSR parameters."sv,
|
||||
{
|
||||
|
@ -1031,6 +1055,7 @@ bool SoundMacro::CmdSetAdsrCtrl::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdRndNote::Introspective =
|
||||
{
|
||||
CmdType::Pitch,
|
||||
"Random Note"sv,
|
||||
"Sets random pitch between Note Lo and Note Hi, biased by Detune in cents. "
|
||||
"If Free is set, the note will not snap to key steps."sv,
|
||||
|
@ -1092,6 +1117,7 @@ bool SoundMacro::CmdRndNote::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdAddNote::Introspective =
|
||||
{
|
||||
CmdType::Pitch,
|
||||
"Add Note"sv,
|
||||
"Sets new pitch by adding Add, biased by Detune in cents. "
|
||||
"The time parameters behave like a WAIT command when non-zero."sv,
|
||||
|
@ -1144,6 +1170,7 @@ bool SoundMacro::CmdAddNote::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSetNote::Introspective =
|
||||
{
|
||||
CmdType::Pitch,
|
||||
"Set Note"sv,
|
||||
"Sets new pitch to Key, biased by Detune in cents. "
|
||||
"The time parameters behave like a WAIT command when non-zero."sv,
|
||||
|
@ -1190,6 +1217,7 @@ bool SoundMacro::CmdSetNote::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdLastNote::Introspective =
|
||||
{
|
||||
CmdType::Pitch,
|
||||
"Last Note"sv,
|
||||
"Sets new pitch by adding Add to last played MIDI note, biased by Detune in cents. "
|
||||
"The time parameters behave like a WAIT command when non-zero."sv,
|
||||
|
@ -1236,6 +1264,7 @@ bool SoundMacro::CmdLastNote::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdPortamento::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"Portamento"sv,
|
||||
"Setup portamento mode for this voice."sv,
|
||||
{
|
||||
|
@ -1281,6 +1310,7 @@ bool SoundMacro::CmdPortamento::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdVibrato::Introspective =
|
||||
{
|
||||
CmdType::Pitch,
|
||||
"Vibrato"sv,
|
||||
"Setup vibrato mode for this voice. Voice pitch will be "
|
||||
"modulated using the Level magnitude or the modwheel."sv,
|
||||
|
@ -1321,6 +1351,7 @@ bool SoundMacro::CmdVibrato::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdPitchSweep1::Introspective =
|
||||
{
|
||||
CmdType::Pitch,
|
||||
"Pitch Sweep 1"sv,
|
||||
"Setup pitch sweep 1 for this voice. Voice pitch will accumulate Add for Times frames. "
|
||||
"If the time values are non-zero, this command also functions as a WAIT."sv,
|
||||
|
@ -1365,6 +1396,7 @@ bool SoundMacro::CmdPitchSweep1::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdPitchSweep2::Introspective =
|
||||
{
|
||||
CmdType::Pitch,
|
||||
"Pitch Sweep 2"sv,
|
||||
"Setup pitch sweep 2 for this voice. Voice pitch will accumulate Add for Times frames. "
|
||||
"If the time values are non-zero, this command also functions as a WAIT."sv,
|
||||
|
@ -1409,6 +1441,7 @@ bool SoundMacro::CmdPitchSweep2::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSetPitch::Introspective =
|
||||
{
|
||||
CmdType::Pitch,
|
||||
"Set Pitch"sv,
|
||||
"Set the playback sample rate directly."sv,
|
||||
{
|
||||
|
@ -1433,6 +1466,7 @@ bool SoundMacro::CmdSetPitch::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSetPitchAdsr::Introspective =
|
||||
{
|
||||
CmdType::Pitch,
|
||||
"Set Pitch ADSR"sv,
|
||||
"Define the pitch ADSR from a pool object. The pitch range is "
|
||||
"specified using Note and Cents parameters."sv,
|
||||
|
@ -1462,6 +1496,7 @@ bool SoundMacro::CmdSetPitchAdsr::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdScaleVolumeDLS::Introspective =
|
||||
{
|
||||
CmdType::Volume,
|
||||
"Scale Volume DLS"sv,
|
||||
"Sets new volume by scaling the velocity. A value of 4096 == 100%."sv,
|
||||
{
|
||||
|
@ -1486,6 +1521,7 @@ bool SoundMacro::CmdScaleVolumeDLS::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdMod2Vibrange::Introspective =
|
||||
{
|
||||
CmdType::Pitch,
|
||||
"Mod 2 Vibrange"sv,
|
||||
"Values used to scale the modwheel control for vibrato."sv,
|
||||
{
|
||||
|
@ -1509,6 +1545,7 @@ bool SoundMacro::CmdMod2Vibrange::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSetupTremolo::Introspective =
|
||||
{
|
||||
CmdType::Special,
|
||||
"Setup Tremolo"sv,
|
||||
"Setup tremolo effect. Must be combined with Tremolo Select to connect "
|
||||
"with a configured LFO. A value of 4096 == 100%."sv,
|
||||
|
@ -1533,6 +1570,7 @@ bool SoundMacro::CmdSetupTremolo::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdReturn::Introspective =
|
||||
{
|
||||
CmdType::Structure,
|
||||
"Return"sv,
|
||||
"Branch to after last Go Subroutine command and pop call stack."sv
|
||||
};
|
||||
|
@ -1548,6 +1586,7 @@ bool SoundMacro::CmdReturn::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdGoSub::Introspective =
|
||||
{
|
||||
CmdType::Structure,
|
||||
"Go Subroutine"sv,
|
||||
"Push location onto call stack and branch to specified location."sv,
|
||||
{
|
||||
|
@ -1578,6 +1617,7 @@ bool SoundMacro::CmdGoSub::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdTrapEvent::Introspective =
|
||||
{
|
||||
CmdType::Structure,
|
||||
"Trap Event"sv,
|
||||
"Register event-based branch to a specified location."sv,
|
||||
{
|
||||
|
@ -1629,6 +1669,7 @@ bool SoundMacro::CmdTrapEvent::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdUntrapEvent::Introspective =
|
||||
{
|
||||
CmdType::Structure,
|
||||
"Untrap Event"sv,
|
||||
"Unregister event-based branch."sv,
|
||||
{
|
||||
|
@ -1669,6 +1710,7 @@ bool SoundMacro::CmdUntrapEvent::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSendMessage::Introspective =
|
||||
{
|
||||
CmdType::Special,
|
||||
"Send Message"sv,
|
||||
"Send message to SoundMacro or Voice referenced in a variable. "
|
||||
"The message value is retrieved from a variable."sv,
|
||||
|
@ -1711,6 +1753,7 @@ bool SoundMacro::CmdSendMessage::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdGetMessage::Introspective =
|
||||
{
|
||||
CmdType::Special,
|
||||
"Get Message"sv,
|
||||
"Get voice's latest received message and store its value in Variable."sv,
|
||||
{
|
||||
|
@ -1729,6 +1772,7 @@ bool SoundMacro::CmdGetMessage::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdGetVid::Introspective =
|
||||
{
|
||||
CmdType::Special,
|
||||
"Get VID"sv,
|
||||
"Get ID of current voice or last voice started by Play Macro command and store in Variable."sv,
|
||||
{
|
||||
|
@ -1752,6 +1796,7 @@ bool SoundMacro::CmdGetVid::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdAddAgeCount::Introspective =
|
||||
{
|
||||
CmdType::Special,
|
||||
"Add Age Count"sv,
|
||||
"Adds a value to the current voice's age counter."sv,
|
||||
{
|
||||
|
@ -1770,6 +1815,7 @@ bool SoundMacro::CmdAddAgeCount::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSetAgeCount::Introspective =
|
||||
{
|
||||
CmdType::Special,
|
||||
"Set Age Count"sv,
|
||||
"Set a value into the current voice's age counter."sv,
|
||||
{
|
||||
|
@ -1787,6 +1833,7 @@ bool SoundMacro::CmdSetAgeCount::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSendFlag::Introspective =
|
||||
{
|
||||
CmdType::Special,
|
||||
"Send Flag"sv,
|
||||
"Send a flag value to the host application."sv,
|
||||
{
|
||||
|
@ -1810,6 +1857,7 @@ bool SoundMacro::CmdSendFlag::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdPitchWheelR::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"Pitch Wheel Range"sv,
|
||||
"Specifies the number of note steps for the range of the pitch wheel."sv,
|
||||
{
|
||||
|
@ -1833,6 +1881,7 @@ bool SoundMacro::CmdPitchWheelR::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSetPriority::Introspective =
|
||||
{
|
||||
CmdType::Special,
|
||||
"Set Priority"sv,
|
||||
"Sets the priority of the current voice."sv,
|
||||
{
|
||||
|
@ -1851,6 +1900,7 @@ bool SoundMacro::CmdSetPriority::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdAddPriority::Introspective =
|
||||
{
|
||||
CmdType::Special,
|
||||
"Add Priority"sv,
|
||||
"Adds to the priority of the current voice."sv,
|
||||
{
|
||||
|
@ -1868,6 +1918,7 @@ bool SoundMacro::CmdAddPriority::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdAgeCntSpeed::Introspective =
|
||||
{
|
||||
CmdType::Special,
|
||||
"Age Count Speed"sv,
|
||||
"Sets the speed the current voice's age counter is decremented."sv,
|
||||
{
|
||||
|
@ -1885,6 +1936,7 @@ bool SoundMacro::CmdAgeCntSpeed::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdAgeCntVel::Introspective =
|
||||
{
|
||||
CmdType::Special,
|
||||
"Age Count Velocity"sv,
|
||||
"Sets the current voice's age counter by scaling the velocity."sv,
|
||||
{
|
||||
|
@ -1907,6 +1959,7 @@ bool SoundMacro::CmdAgeCntVel::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdVolSelect::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"Volume Select"sv,
|
||||
"Appends an evaluator component for computing the voice's volume."sv,
|
||||
{
|
||||
|
@ -1952,6 +2005,7 @@ bool SoundMacro::CmdVolSelect::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdPanSelect::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"Pan Select"sv,
|
||||
"Appends an evaluator component for computing the voice's pan."sv,
|
||||
{
|
||||
|
@ -1997,6 +2051,7 @@ bool SoundMacro::CmdPanSelect::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdPitchWheelSelect::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"Pitch Wheel Select"sv,
|
||||
"Appends an evaluator component for computing the voice's pitch wheel."sv,
|
||||
{
|
||||
|
@ -2042,6 +2097,7 @@ bool SoundMacro::CmdPitchWheelSelect::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdModWheelSelect::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"Mod Wheel Select"sv,
|
||||
"Appends an evaluator component for computing the voice's mod wheel."sv,
|
||||
{
|
||||
|
@ -2087,6 +2143,7 @@ bool SoundMacro::CmdModWheelSelect::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdPedalSelect::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"Pedal Select"sv,
|
||||
"Appends an evaluator component for computing the voice's pedal."sv,
|
||||
{
|
||||
|
@ -2132,6 +2189,7 @@ bool SoundMacro::CmdPedalSelect::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdPortamentoSelect::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"Portamento Select"sv,
|
||||
"Appends an evaluator component for computing the voice's portamento."sv,
|
||||
{
|
||||
|
@ -2177,6 +2235,7 @@ bool SoundMacro::CmdPortamentoSelect::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdReverbSelect::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"Reverb Select"sv,
|
||||
"Appends an evaluator component for computing the voice's reverb."sv,
|
||||
{
|
||||
|
@ -2222,6 +2281,7 @@ bool SoundMacro::CmdReverbSelect::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSpanSelect::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"Span Select"sv,
|
||||
"Appends an evaluator component for computing the voice's span."sv,
|
||||
{
|
||||
|
@ -2267,6 +2327,7 @@ bool SoundMacro::CmdSpanSelect::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdDopplerSelect::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"Doppler Select"sv,
|
||||
"Appends an evaluator component for computing the voice's doppler."sv,
|
||||
{
|
||||
|
@ -2312,6 +2373,7 @@ bool SoundMacro::CmdDopplerSelect::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdTremoloSelect::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"Tremolo Select"sv,
|
||||
"Appends an evaluator component for computing the voice's tremolo."sv,
|
||||
{
|
||||
|
@ -2357,6 +2419,7 @@ bool SoundMacro::CmdTremoloSelect::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdPreASelect::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"PreA Select"sv,
|
||||
"Appends an evaluator component for computing the voice's pre-AUXA."sv,
|
||||
{
|
||||
|
@ -2402,6 +2465,7 @@ bool SoundMacro::CmdPreASelect::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdPreBSelect::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"PreB Select"sv,
|
||||
"Appends an evaluator component for computing the voice's pre-AUXB."sv,
|
||||
{
|
||||
|
@ -2447,6 +2511,7 @@ bool SoundMacro::CmdPreBSelect::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdPostBSelect::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"PostB Select"sv,
|
||||
"Appends an evaluator component for computing the voice's post-AUXB."sv,
|
||||
{
|
||||
|
@ -2492,6 +2557,7 @@ bool SoundMacro::CmdPostBSelect::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdAuxAFXSelect::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"AuxA FX Select"sv,
|
||||
"Appends an evaluator component for computing the AUXA Parameter."sv,
|
||||
{
|
||||
|
@ -2543,6 +2609,7 @@ bool SoundMacro::CmdAuxAFXSelect::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdAuxBFXSelect::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"AuxB FX Select"sv,
|
||||
"Appends an evaluator component for computing the AUXB Parameter."sv,
|
||||
{
|
||||
|
@ -2595,6 +2662,7 @@ bool SoundMacro::CmdAuxBFXSelect::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSetupLFO::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"Setup LFO"sv,
|
||||
"Configures voice's LFO period in milliseconds."sv,
|
||||
{
|
||||
|
@ -2621,6 +2689,7 @@ bool SoundMacro::CmdSetupLFO::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdModeSelect::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"Mode Select"sv,
|
||||
"Sets operating modes for current voice."sv,
|
||||
{
|
||||
|
@ -2643,6 +2712,7 @@ bool SoundMacro::CmdModeSelect::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSetKeygroup::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"Set Keygroup"sv,
|
||||
"Selects keygroup for current voice."sv,
|
||||
{
|
||||
|
@ -2671,6 +2741,7 @@ bool SoundMacro::CmdSetKeygroup::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSRCmodeSelect::Introspective =
|
||||
{
|
||||
CmdType::Setup,
|
||||
"SRC Mode Select"sv,
|
||||
"Sets operating modes for sample rate converter."sv,
|
||||
{
|
||||
|
@ -2693,6 +2764,7 @@ bool SoundMacro::CmdSRCmodeSelect::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdAddVars::Introspective =
|
||||
{
|
||||
CmdType::Special,
|
||||
"Add Vars"sv,
|
||||
"A = B + C"sv,
|
||||
{
|
||||
|
@ -2752,6 +2824,7 @@ bool SoundMacro::CmdAddVars::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSubVars::Introspective =
|
||||
{
|
||||
CmdType::Special,
|
||||
"Sub Vars"sv,
|
||||
"A = B - C"sv,
|
||||
{
|
||||
|
@ -2811,6 +2884,7 @@ bool SoundMacro::CmdSubVars::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdMulVars::Introspective =
|
||||
{
|
||||
CmdType::Special,
|
||||
"Mul Vars"sv,
|
||||
"A = B * C"sv,
|
||||
{
|
||||
|
@ -2870,6 +2944,7 @@ bool SoundMacro::CmdMulVars::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdDivVars::Introspective =
|
||||
{
|
||||
CmdType::Special,
|
||||
"Div Vars"sv,
|
||||
"A = B / C"sv,
|
||||
{
|
||||
|
@ -2929,6 +3004,7 @@ bool SoundMacro::CmdDivVars::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdAddIVars::Introspective =
|
||||
{
|
||||
CmdType::Special,
|
||||
"Add Imm Vars"sv,
|
||||
"A = B + Immediate"sv,
|
||||
{
|
||||
|
@ -2978,6 +3054,7 @@ bool SoundMacro::CmdAddIVars::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdSetVar::Introspective =
|
||||
{
|
||||
CmdType::Special,
|
||||
"Set Var"sv,
|
||||
"A = Immediate"sv,
|
||||
{
|
||||
|
@ -3010,6 +3087,7 @@ bool SoundMacro::CmdSetVar::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdIfEqual::Introspective =
|
||||
{
|
||||
CmdType::Structure,
|
||||
"If Equal"sv,
|
||||
"Branches to specified step if A == B."sv,
|
||||
{
|
||||
|
@ -3067,6 +3145,7 @@ bool SoundMacro::CmdIfEqual::Do(SoundMacroState& st, Voice& vox) const
|
|||
|
||||
const SoundMacro::CmdIntrospection SoundMacro::CmdIfLess::Introspective =
|
||||
{
|
||||
CmdType::Structure,
|
||||
"If Less"sv,
|
||||
"Branches to specified step if A < B."sv,
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue