Use asynchronous file dialogs

This commit is contained in:
Jack Andersen 2018-08-29 22:16:37 -10:00
parent 4fc5dfdc76
commit 68f0f2e769
9 changed files with 322 additions and 222 deletions

View File

@ -25,6 +25,7 @@ MainWindow::MainWindow(QWidget* parent)
m_navIt(m_navList.begin()),
m_treeDelegate(*this, this),
m_mainMessenger(this),
m_fileDialog(this),
m_undoStack(new QUndoStack(this)),
m_backgroundThread(this)
{
@ -82,7 +83,7 @@ MainWindow::MainWindow(QWidget* parent)
connect(m_ui.actionImport_C_Headers, SIGNAL(triggered()), this, SLOT(importHeadersAction()));
connect(m_ui.actionExport_C_Headers, SIGNAL(triggered()), this, SLOT(exportHeadersAction()));
m_ui.actionQuit->setShortcut(QKeySequence::Quit);
connect(m_ui.actionQuit, SIGNAL(triggered()), qApp, SLOT(quit()));
connect(m_ui.actionQuit, SIGNAL(triggered()), this, SLOT(close()));
for (int i = 0; i < MaxRecentFiles; ++i)
{
@ -165,7 +166,7 @@ MainWindow::MainWindow(QWidget* parent)
m_voxEngine = boo::NewAudioVoiceEngine();
m_voxAllocator = std::make_unique<VoiceAllocator>(*m_voxEngine);
m_engine = std::make_unique<amuse::Engine>(*m_voxAllocator);
m_voxEngine->setVolume(0.7f);
m_engine->setVolume(0.7f);
m_studioSetup->loadData(m_engine->getDefaultStudio().get());
m_ctrlVals[7] = 127;
@ -302,6 +303,7 @@ bool MainWindow::setProjectPath(const QString& path)
connect(m_ui.projectOutline->selectionModel(),
SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)),
this, SLOT(onOutlineSelectionChanged(const QItemSelection&, const QItemSelection&)));
m_fileDialog.setDirectory(path);
m_ui.actionSave_Project->setEnabled(true);
m_ui.actionRevert_Project->setEnabled(true);
m_ui.actionReload_Sample_Data->setEnabled(true);
@ -399,8 +401,14 @@ void MainWindow::timerEvent(QTimerEvent* ev)
if (m_voxEngine && m_engine)
{
m_voxEngine->pumpAndMixVoices();
if (!(m_timerFireCount % 10)) /* Rate limit voice counter */
m_ui.statusbar->setVoiceCount(int(m_engine->getNumTotalActiveVoices()));
m_peakVoices = std::max(int(m_engine->getNumTotalActiveVoices()), m_peakVoices);
if (!(m_timerFireCount % 10))
{
/* Rate limit voice counter */
m_ui.statusbar->setVoiceCount(m_peakVoices);
m_peakVoices = 0;
}
if (m_engine->getActiveVoices().empty() && m_uiDisabled)
{
m_ui.projectOutline->setEnabled(true);
@ -790,7 +798,16 @@ void MainWindow::showEvent(QShowEvent* ev)
void MainWindow::newAction()
{
QString path = QFileDialog::getSaveFileName(this, tr("New Project"));
m_fileDialog.setWindowTitle(tr("New Project"));
m_fileDialog.setAcceptMode(QFileDialog::AcceptSave);
m_fileDialog.setFileMode(QFileDialog::AnyFile);
m_fileDialog.setOption(QFileDialog::ShowDirsOnly, false);
m_fileDialog.open(this, SLOT(_newAction(const QString&)));
}
void MainWindow::_newAction(const QString& path)
{
m_fileDialog.close();
if (path.isEmpty())
return;
if (!MkPath(path, m_mainMessenger))
@ -858,7 +875,16 @@ bool MainWindow::openProject(const QString& path)
void MainWindow::openAction()
{
QString path = QFileDialog::getExistingDirectory(this, tr("Open Project"));
m_fileDialog.setWindowTitle(tr("Open Project"));
m_fileDialog.setAcceptMode(QFileDialog::AcceptOpen);
m_fileDialog.setFileMode(QFileDialog::Directory);
m_fileDialog.setOption(QFileDialog::ShowDirsOnly, true);
m_fileDialog.open(this, SLOT(_openAction(const QString&)));
}
void MainWindow::_openAction(const QString& path)
{
m_fileDialog.close();
if (path.isEmpty())
return;
openProject(path);
@ -945,8 +971,16 @@ void MainWindow::reloadSampleDataAction()
void MainWindow::importAction()
{
QString path = QFileDialog::getOpenFileName(this, tr("Import Project"),
m_projectModel ? m_projectModel->dir().path() : QString());
m_fileDialog.setWindowTitle(tr("Import Project"));
m_fileDialog.setAcceptMode(QFileDialog::AcceptOpen);
m_fileDialog.setFileMode(QFileDialog::ExistingFile);
m_fileDialog.setOption(QFileDialog::ShowDirsOnly, false);
m_fileDialog.open(this, SLOT(_importAction(const QString&)));
}
void MainWindow::_importAction(const QString& path)
{
m_fileDialog.close();
if (path.isEmpty())
return;
@ -962,11 +996,11 @@ void MainWindow::importAction()
/* Ask user about sample conversion */
int impMode = m_mainMessenger.question(tr("Sample Import Mode"),
tr("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."),
tr("Import Compressed"), tr("Import WAVs"), tr("Import Both"));
tr("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."),
tr("Import Compressed"), tr("Import WAVs"), tr("Import Both"));
switch (impMode)
{
@ -983,8 +1017,8 @@ void MainWindow::importAction()
if (tp == amuse::ContainerRegistry::Type::Raw4)
{
int scanMode = m_mainMessenger.question(tr("Raw Import Mode"),
tr("Would you like to scan for all MusyX group files in this directory?"),
QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
tr("Would you like to scan for all MusyX group files in this directory?"),
QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
if (scanMode == QMessageBox::Yes)
{
/* Auto-create project */
@ -1079,7 +1113,16 @@ void MainWindow::importSongsAction()
if (!m_projectModel)
return;
QString path = QFileDialog::getOpenFileName(this, tr("Import Songs"), m_projectModel->dir().path());
m_fileDialog.setWindowTitle(tr("Import Songs"));
m_fileDialog.setAcceptMode(QFileDialog::AcceptOpen);
m_fileDialog.setFileMode(QFileDialog::ExistingFile);
m_fileDialog.setOption(QFileDialog::ShowDirsOnly, false);
m_fileDialog.open(this, SLOT(_importSongsAction(const QString&)));
}
void MainWindow::_importSongsAction(const QString& path)
{
m_fileDialog.close();
if (path.isEmpty())
return;
@ -1131,13 +1174,22 @@ void MainWindow::importHeadersAction()
"<p>Group, Song and SFX definitions are matched according to the following forms:"
"<pre>#define GRP&lt;name&gt; &lt;id&gt;\n#define SNG&lt;name&gt; &lt;id&gt;\n"
"#define SFX&lt;name> &lt;id&gt;</pre></p>"
"<p><strong>This operation cannot be undone! Is is recommended to "
"<p><strong>This operation cannot be undone! It is recommended to "
"make a backup of the project directory before proceeding.</strong></p>"
"<p>Continue?</p>"), QMessageBox::Yes | QMessageBox::No);
if (confirm == QMessageBox::No)
return;
QString path = QFileDialog::getExistingDirectory(this, tr("Import C Headers"), m_projectModel->dir().path());
m_fileDialog.setWindowTitle(tr("Import C Headers"));
m_fileDialog.setAcceptMode(QFileDialog::AcceptOpen);
m_fileDialog.setFileMode(QFileDialog::Directory);
m_fileDialog.setOption(QFileDialog::ShowDirsOnly, true);
m_fileDialog.open(this, SLOT(_importHeadersAction(const QString&)));
}
void MainWindow::_importHeadersAction(const QString& path)
{
m_fileDialog.close();
if (path.isEmpty())
return;
@ -1156,7 +1208,16 @@ void MainWindow::exportHeadersAction()
if (!m_projectModel)
return;
QString path = QFileDialog::getExistingDirectory(this, tr("Export C Headers"), m_projectModel->dir().path());
m_fileDialog.setWindowTitle(tr("Export C Headers"));
m_fileDialog.setAcceptMode(QFileDialog::AcceptOpen);
m_fileDialog.setFileMode(QFileDialog::Directory);
m_fileDialog.setOption(QFileDialog::ShowDirsOnly, true);
m_fileDialog.open(this, SLOT(_exportHeadersAction(const QString&)));
}
void MainWindow::_exportHeadersAction(const QString& path)
{
m_fileDialog.close();
if (path.isEmpty())
return;
@ -1439,6 +1500,7 @@ void MainWindow::newSoundMacroAction()
while (result == QDialog::Accepted && newName.isEmpty())
{
NewSoundMacroDialog dialog(groupName, this);
dialog.setWindowModality(Qt::WindowModal);
result = dialog.exec();
newName = dialog.getName();
templ = dialog.getSelectedTemplate();
@ -1913,6 +1975,7 @@ void MainWindow::studioSetupShown()
void MainWindow::onBackgroundTaskFinished(int id)
{
m_backgroundDialog->close();
m_backgroundDialog->reset();
m_backgroundDialog->deleteLater();
m_backgroundDialog = nullptr;
@ -1924,8 +1987,7 @@ void MainWindow::onBackgroundTaskFinished(int id)
if (m_mainMessenger.question(tr("Export Complete"), tr("%1?").
arg(ShowInGraphicalShellString())) == QMessageBox::Yes)
{
QFileInfo
dirInfo(m_projectModel->dir(), QStringLiteral("out"));
QFileInfo dirInfo(m_projectModel->dir(), QStringLiteral("out"));
QDir dir(dirInfo.filePath());
QStringList entryList = dir.entryList(QDir::Files);
ShowInGraphicalShell(this,

View File

@ -8,6 +8,7 @@
#include <QStyledItemDelegate>
#include <QSortFilterProxyModel>
#include <QLinkedList>
#include <QFileDialog>
#include "ui_MainWindow.h"
#include "amuse/Engine.hpp"
#include "amuse/BooBackend.hpp"
@ -116,6 +117,7 @@ class MainWindow : public QMainWindow
LayersEditor* m_layersEditor = nullptr;
SampleEditor* m_sampleEditor = nullptr;
StudioSetupWidget* m_studioSetup = nullptr;
QFileDialog m_fileDialog;
std::unique_ptr<boo::IAudioVoiceEngine> m_voxEngine;
std::unique_ptr<VoiceAllocator> m_voxAllocator;
@ -143,6 +145,7 @@ class MainWindow : public QMainWindow
QThread m_backgroundThread;
uint64_t m_timerFireCount = 0;
int m_peakVoices = 0;
void connectMessenger(UIMessenger* messenger, Qt::ConnectionType type);
@ -186,6 +189,7 @@ public:
amuse::ObjToken<amuse::Sequencer> startSong(amuse::GroupId groupId, amuse::SongId songId,
const unsigned char* arrData);
void pushUndoCommand(EditorUndoCommand* cmd);
QFileDialog& fileDialog() { return m_fileDialog; }
void updateFocus();
void aboutToDeleteNode(ProjectModel::INode* node);
void closeEvent(QCloseEvent* ev);
@ -208,17 +212,23 @@ public:
public slots:
void newAction();
void _newAction(const QString& path);
void openAction();
void _openAction(const QString& path);
void openRecentFileAction();
void clearRecentFilesAction();
void saveAction();
void revertAction();
void reloadSampleDataAction();
void importAction();
void _importAction(const QString& path);
void importSongsAction();
void _importSongsAction(const QString& path);
void exportAction();
void importHeadersAction();
void _importHeadersAction(const QString& path);
void exportHeadersAction();
void _exportHeadersAction(const QString& path);
void newSubprojectAction();
void newSFXGroupAction();

View File

@ -347,6 +347,7 @@ MIDIFileFieldWidget::MIDIFileFieldWidget(QWidget* parent)
connect(&m_button, SIGNAL(clicked(bool)), this, SLOT(buttonPressed()));
m_dialog.setFileMode(QFileDialog::ExistingFile);
m_dialog.setAcceptMode(QFileDialog::AcceptOpen);
}
QWidget* MIDIFileDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
@ -427,7 +428,7 @@ void MIDIFileDelegate::doExportMIDI()
return;
QString inPath = g_MainWindow->projectModel()->dir().absoluteFilePath(path);
std::vector<uint8_t> data;
m_exportData.clear();
{
QFile fi(inPath);
if (!fi.open(QFile::ReadOnly))
@ -437,41 +438,48 @@ void MIDIFileDelegate::doExportMIDI()
return;
}
auto d = fi.readAll();
data.resize(d.size());
memcpy(&data[0], d.data(), d.size());
m_exportData.resize(d.size());
memcpy(&m_exportData[0], d.data(), d.size());
}
if (!memcmp(data.data(), "MThd", 4))
if (!memcmp(m_exportData.data(), "MThd", 4))
{
//data = amuse::SongConverter::MIDIToSong(data, 1, true);
}
else
{
bool isBig;
if (amuse::SongState::DetectVersion(data.data(), isBig) < 0)
if (amuse::SongState::DetectVersion(m_exportData.data(), isBig) < 0)
{
g_MainWindow->uiMessenger().critical(tr("File Error"),
tr("Invalid song data at %1").arg(inPath));
return;
}
int version;
data = amuse::SongConverter::SongToMIDI(data.data(), version, isBig);
m_exportData = amuse::SongConverter::SongToMIDI(m_exportData.data(), version, isBig);
}
QFileInfo inInfo(inPath);
QString outPath =
QFileDialog::getSaveFileName(g_MainWindow, tr("Export MIDI"),
QFileInfo(inInfo.path(), inInfo.completeBaseName() + QStringLiteral(".mid")).filePath(), tr("MIDI(*.mid)"));
if (outPath.isEmpty())
m_fileDialogMid.setDirectory(QFileInfo(inInfo.path(), inInfo.completeBaseName() + QStringLiteral(".mid")).filePath());
m_fileDialogMid.setAcceptMode(QFileDialog::AcceptSave);
m_fileDialogMid.setFileMode(QFileDialog::AnyFile);
m_fileDialogMid.setOption(QFileDialog::ShowDirsOnly, false);
m_fileDialogMid.open(this, SLOT(_doExportMIDI(const QString&)));
}
void MIDIFileDelegate::_doExportMIDI(const QString& path)
{
m_fileDialogMid.close();
if (path.isEmpty())
return;
QFile fo(outPath);
QFile fo(path);
if (!fo.open(QFile::WriteOnly))
{
g_MainWindow->uiMessenger().critical(tr("File Error"),
tr("Unable to open %1 for writing: %1").arg(outPath).arg(fo.errorString()));
tr("Unable to open %1 for writing: %1").arg(path).arg(fo.errorString()));
return;
}
fo.write((char*)data.data(), data.size());
fo.write((char*)m_exportData.data(), m_exportData.size());
}
void MIDIFileDelegate::doExportSNG()
@ -482,7 +490,7 @@ void MIDIFileDelegate::doExportSNG()
return;
QString inPath = g_MainWindow->projectModel()->dir().absoluteFilePath(path);
std::vector<uint8_t> data;
m_exportData.clear();
{
QFile fi(inPath);
if (!fi.open(QFile::ReadOnly))
@ -492,14 +500,14 @@ void MIDIFileDelegate::doExportSNG()
return;
}
auto d = fi.readAll();
data.resize(d.size());
memcpy(&data[0], d.data(), d.size());
m_exportData.resize(d.size());
memcpy(&m_exportData[0], d.data(), d.size());
}
if (!memcmp(data.data(), "MThd", 4))
if (!memcmp(m_exportData.data(), "MThd", 4))
{
data = amuse::SongConverter::MIDIToSong(data, 1, true);
if (data.empty())
m_exportData = amuse::SongConverter::MIDIToSong(m_exportData, 1, true);
if (m_exportData.empty())
{
g_MainWindow->uiMessenger().critical(tr("File Error"),
tr("Invalid MIDI data at %1").arg(inPath));
@ -509,7 +517,7 @@ void MIDIFileDelegate::doExportSNG()
else
{
bool isBig;
if (amuse::SongState::DetectVersion(data.data(), isBig) < 0)
if (amuse::SongState::DetectVersion(m_exportData.data(), isBig) < 0)
{
g_MainWindow->uiMessenger().critical(tr("File Error"),
tr("Invalid song data at %1").arg(inPath));
@ -518,19 +526,26 @@ void MIDIFileDelegate::doExportSNG()
}
QFileInfo inInfo(inPath);
QString outPath =
QFileDialog::getSaveFileName(g_MainWindow, tr("Export SNG"),
QFileInfo(inInfo.path(), inInfo.completeBaseName() + QStringLiteral(".sng")).filePath(), tr("Song(*.sng)"));
if (outPath.isEmpty())
m_fileDialogSng.setDirectory(QFileInfo(inInfo.path(), inInfo.completeBaseName() + QStringLiteral(".sng")).filePath());
m_fileDialogSng.setAcceptMode(QFileDialog::AcceptSave);
m_fileDialogSng.setFileMode(QFileDialog::AnyFile);
m_fileDialogSng.setOption(QFileDialog::ShowDirsOnly, false);
m_fileDialogSng.open(this, SLOT(_doExportSNG(const QString&)));
}
void MIDIFileDelegate::_doExportSNG(const QString& path)
{
m_fileDialogSng.close();
if (path.isEmpty())
return;
QFile fo(outPath);
QFile fo(path);
if (!fo.open(QFile::WriteOnly))
{
g_MainWindow->uiMessenger().critical(tr("File Error"),
tr("Unable to open %1 for writing: %1").arg(outPath).arg(fo.errorString()));
tr("Unable to open %1 for writing: %1").arg(path).arg(fo.errorString()));
return;
}
fo.write((char*)data.data(), data.size());
fo.write((char*)m_exportData.data(), m_exportData.size());
}
void MIDIFileDelegate::pathChanged()
@ -538,8 +553,10 @@ void MIDIFileDelegate::pathChanged()
emit commitData(static_cast<MIDIFileFieldWidget*>(sender()));
}
MIDIFileDelegate::MIDIFileDelegate(QObject* parent)
: QStyledItemDelegate(parent) {}
MIDIFileDelegate::MIDIFileDelegate(SetupTableView* parent)
: QStyledItemDelegate(parent),
m_fileDialogMid(parent, tr("Export MIDI"), {}, tr("MIDI(*.mid)")),
m_fileDialogSng(parent, tr("Export Song"), {}, tr("Song(*.sng)")) {}
std::unordered_map<uint8_t, amuse::SongGroupIndex::PageEntry>& PageModel::_getMap() const
{
@ -1315,7 +1332,7 @@ void SetupTableView::showEvent(QShowEvent* event)
}
SetupTableView::SetupTableView(QWidget* parent)
: QSplitter(parent), m_listView(new QTableView), m_tableView(new QTableView)
: QSplitter(parent), m_listView(new QTableView), m_tableView(new QTableView), m_midiDelegate(this)
{
setChildrenCollapsible(false);
setStretchFactor(0, 1);

View File

@ -15,6 +15,8 @@
#include <QProxyStyle>
#include "amuse/Sequencer.hpp"
class SetupTableView;
class PageObjectDelegate : public BaseObjectDelegate
{
Q_OBJECT
@ -49,8 +51,10 @@ signals:
class MIDIFileDelegate : public QStyledItemDelegate
{
Q_OBJECT
QFileDialog m_fileDialogMid, m_fileDialogSng;
std::vector<uint8_t> m_exportData;
public:
explicit MIDIFileDelegate(QObject* parent = Q_NULLPTR);
explicit MIDIFileDelegate(SetupTableView* parent = Q_NULLPTR);
QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const;
void destroyEditor(QWidget *editor, const QModelIndex &index) const;
void setEditorData(QWidget* editor, const QModelIndex& index) const;
@ -59,7 +63,9 @@ public:
const QStyleOptionViewItem &option, const QModelIndex &index);
private slots:
void doExportMIDI();
void _doExportMIDI(const QString& path);
void doExportSNG();
void _doExportSNG(const QString& path);
public slots:
void pathChanged();
};

View File

@ -128,7 +128,7 @@ CommandWidget::CommandWidget(QWidget* parent, amuse::SoundMacro::ICmd* cmd,
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
m_numberFont.setWeight(QFont::Bold);
m_numberFont.setStyleHint(QFont::Monospace);
m_numberFont.setPointSize(16);
m_numberFont.setPointSize(m_numberFont.pointSize() * 2);
setContentsMargins(QMargins());
setFixedHeight(100);
@ -186,6 +186,7 @@ CommandWidget::CommandWidget(QWidget* parent, amuse::SoundMacro::ICmd* cmd,
case amuse::SoundMacro::CmdIntrospection::Field::Type::UInt32:
{
FieldSpinBox* sb = new FieldSpinBox(this);
sb->setFixedHeight(30);
sb->setProperty("fieldIndex", f);
sb->setProperty("fieldName", fieldName);
sb->setMinimum(int(field.m_min));
@ -253,6 +254,7 @@ CommandWidget::CommandWidget(QWidget* parent, amuse::SoundMacro::ICmd* cmd,
case amuse::SoundMacro::CmdIntrospection::Field::Type::SoundMacroStep:
{
FieldSoundMacroStep* sb = new FieldSoundMacroStep(nf, this);
sb->setFixedHeight(30);
sb->setProperty("fieldIndex", f);
sb->setProperty("fieldName", fieldName);
sb->m_spinBox.setValue(amuse::AccessField<amuse::SoundMacroStepDNA<athena::Little>>(m_cmd, field).step);
@ -264,6 +266,7 @@ CommandWidget::CommandWidget(QWidget* parent, amuse::SoundMacro::ICmd* cmd,
case amuse::SoundMacro::CmdIntrospection::Field::Type::Choice:
{
FieldComboBox* cb = new FieldComboBox(this);
cb->setFixedHeight(30);
cb->setProperty("fieldIndex", f);
cb->setProperty("fieldName", fieldName);
for (int j = 0; j < 4; ++j)

View File

@ -16,10 +16,10 @@ StatusBarWidget::StatusBarWidget(QWidget* parent)
m_killButton.setVisible(false);
m_killButton.setToolTip(tr("Immediately kill active voices"));
m_voiceCount.setVisible(false);
m_volumeIcons[0] = QIcon(QStringLiteral(":/icons/IconVolume0"));
m_volumeIcons[1] = QIcon(QStringLiteral(":/icons/IconVolume1"));
m_volumeIcons[2] = QIcon(QStringLiteral(":/icons/IconVolume2"));
m_volumeIcons[3] = QIcon(QStringLiteral(":/icons/IconVolume3"));
m_volumeIcons[0] = QIcon(QStringLiteral(":/icons/IconVolume0.svg"));
m_volumeIcons[1] = QIcon(QStringLiteral(":/icons/IconVolume1.svg"));
m_volumeIcons[2] = QIcon(QStringLiteral(":/icons/IconVolume2.svg"));
m_volumeIcons[3] = QIcon(QStringLiteral(":/icons/IconVolume3.svg"));
m_aIcon.setFixedSize(16, 16);
m_aIcon.setPixmap(QIcon(QStringLiteral(":/icons/IconA.svg")).pixmap(16, 16));
QString aTip = tr("Aux A send level for all voices");

View File

@ -351,7 +351,7 @@ EffectWidget::EffectWidget(QWidget* parent, amuse::EffectBaseTypeless* effect, a
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
m_numberFont.setWeight(QFont::Bold);
m_numberFont.setStyleHint(QFont::Monospace);
m_numberFont.setPointSize(16);
m_numberFont.setPointSize(m_numberFont.pointSize() * 2);
setContentsMargins(QMargins());
setFixedHeight(100);

View File

@ -125,7 +125,7 @@
<context>
<name>CommandWidget</name>
<message>
<location filename="../SoundMacroEditor.cpp" line="308"/>
<location filename="../SoundMacroEditor.cpp" line="311"/>
<source>Change %1</source>
<translation type="unfinished"></translation>
</message>
@ -342,71 +342,71 @@
<context>
<name>MIDIFileDelegate</name>
<message>
<location filename="../SongGroupEditor.cpp" line="386"/>
<location filename="../SongGroupEditor.cpp" line="387"/>
<source>Change MIDI Path</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="404"/>
<location filename="../SongGroupEditor.cpp" line="405"/>
<source>Save As MIDI</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="410"/>
<location filename="../SongGroupEditor.cpp" line="411"/>
<source>Save As SNG</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="435"/>
<location filename="../SongGroupEditor.cpp" line="453"/>
<location filename="../SongGroupEditor.cpp" line="470"/>
<location filename="../SongGroupEditor.cpp" line="490"/>
<location filename="../SongGroupEditor.cpp" line="504"/>
<location filename="../SongGroupEditor.cpp" line="514"/>
<location filename="../SongGroupEditor.cpp" line="529"/>
<location filename="../SongGroupEditor.cpp" line="436"/>
<location filename="../SongGroupEditor.cpp" line="454"/>
<location filename="../SongGroupEditor.cpp" line="478"/>
<location filename="../SongGroupEditor.cpp" line="498"/>
<location filename="../SongGroupEditor.cpp" line="512"/>
<location filename="../SongGroupEditor.cpp" line="522"/>
<location filename="../SongGroupEditor.cpp" line="544"/>
<source>File Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="436"/>
<location filename="../SongGroupEditor.cpp" line="491"/>
<location filename="../SongGroupEditor.cpp" line="437"/>
<location filename="../SongGroupEditor.cpp" line="499"/>
<source>Unable to open %1 for reading: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="454"/>
<location filename="../SongGroupEditor.cpp" line="515"/>
<location filename="../SongGroupEditor.cpp" line="455"/>
<location filename="../SongGroupEditor.cpp" line="523"/>
<source>Invalid song data at %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="463"/>
<location filename="../SongGroupEditor.cpp" line="558"/>
<source>Export MIDI</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="464"/>
<location filename="../SongGroupEditor.cpp" line="558"/>
<source>MIDI(*.mid)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="471"/>
<location filename="../SongGroupEditor.cpp" line="530"/>
<location filename="../SongGroupEditor.cpp" line="559"/>
<source>Export Song</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="479"/>
<location filename="../SongGroupEditor.cpp" line="545"/>
<source>Unable to open %1 for writing: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="505"/>
<location filename="../SongGroupEditor.cpp" line="513"/>
<source>Invalid MIDI data at %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="522"/>
<source>Export SNG</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="523"/>
<location filename="../SongGroupEditor.cpp" line="559"/>
<source>Song(*.sng)</source>
<translation type="unfinished"></translation>
</message>
@ -427,13 +427,13 @@
<context>
<name>MIDIPlayerWidget</name>
<message>
<location filename="../SongGroupEditor.cpp" line="1387"/>
<location filename="../SongGroupEditor.cpp" line="1404"/>
<source>Stop</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="1401"/>
<location filename="../SongGroupEditor.cpp" line="1436"/>
<location filename="../SongGroupEditor.cpp" line="1418"/>
<location filename="../SongGroupEditor.cpp" line="1453"/>
<source>Play</source>
<translation type="unfinished"></translation>
</message>
@ -451,333 +451,333 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="41"/>
<location filename="../MainWindow.cpp" line="42"/>
<source>Go Back</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="46"/>
<location filename="../MainWindow.cpp" line="47"/>
<source>Go Forward</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="230"/>
<location filename="../MainWindow.cpp" line="231"/>
<source>Amuse[*]</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="238"/>
<location filename="../MainWindow.cpp" line="239"/>
<source>%1/%2/%3[*] - Amuse</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="243"/>
<location filename="../MainWindow.cpp" line="244"/>
<source>%1[*] - Amuse</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="272"/>
<location filename="../MainWindow.cpp" line="812"/>
<location filename="../MainWindow.cpp" line="273"/>
<location filename="../MainWindow.cpp" line="829"/>
<source>The directory at &apos;%1&apos; must not be empty.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="273"/>
<location filename="../MainWindow.cpp" line="813"/>
<location filename="../MainWindow.cpp" line="274"/>
<location filename="../MainWindow.cpp" line="830"/>
<source>Directory empty</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="278"/>
<location filename="../MainWindow.cpp" line="279"/>
<source>The directory at &apos;%1&apos; must exist for the Amuse editor.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="279"/>
<location filename="../MainWindow.cpp" line="280"/>
<source>Directory does not exist</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="282"/>
<location filename="../MainWindow.cpp" line="283"/>
<source>__amuse_test__</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="287"/>
<location filename="../MainWindow.cpp" line="288"/>
<source>The directory at &apos;%1&apos; must be writable for the Amuse editor: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="289"/>
<location filename="../MainWindow.cpp" line="290"/>
<source>Unable to write to directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="360"/>
<location filename="../MainWindow.cpp" line="362"/>
<source>No Audio Devices Found</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="375"/>
<location filename="../MainWindow.cpp" line="377"/>
<source>Virtual MIDI-In</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="394"/>
<location filename="../MainWindow.cpp" line="396"/>
<source>No MIDI Devices Found</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="456"/>
<location filename="../MainWindow.cpp" line="464"/>
<source>SUSTAIN</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="764"/>
<location filename="../MainWindow.cpp" line="772"/>
<source>Unsaved Changes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="764"/>
<location filename="../MainWindow.cpp" line="772"/>
<source>Save Changes in %1?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="793"/>
<location filename="../MainWindow.cpp" line="801"/>
<source>New Project</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="818"/>
<location filename="../MainWindow.cpp" line="835"/>
<source>The directory at &apos;%1&apos; does not exist.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="819"/>
<location filename="../MainWindow.cpp" line="836"/>
<source>Bad Directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="834"/>
<location filename="../MainWindow.cpp" line="851"/>
<source>Opening</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="834"/>
<location filename="../MainWindow.cpp" line="924"/>
<location filename="../MainWindow.cpp" line="1010"/>
<location filename="../MainWindow.cpp" line="1056"/>
<location filename="../MainWindow.cpp" line="1102"/>
<location filename="../MainWindow.cpp" line="851"/>
<location filename="../MainWindow.cpp" line="950"/>
<location filename="../MainWindow.cpp" line="1044"/>
<location filename="../MainWindow.cpp" line="1090"/>
<location filename="../MainWindow.cpp" line="1145"/>
<source>Scanning Project</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="848"/>
<location filename="../MainWindow.cpp" line="865"/>
<source>Opening %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="861"/>
<location filename="../MainWindow.cpp" line="878"/>
<source>Open Project</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="924"/>
<location filename="../MainWindow.cpp" line="950"/>
<source>Reloading Samples</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="938"/>
<location filename="../MainWindow.cpp" line="964"/>
<source>Scanning %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="948"/>
<location filename="../MainWindow.cpp" line="974"/>
<source>Import Project</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="958"/>
<location filename="../MainWindow.cpp" line="992"/>
<source>The file at &apos;%1&apos; could not be interpreted as a MusyX container.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="959"/>
<location filename="../MainWindow.cpp" line="993"/>
<source>Unsupported MusyX Container</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="964"/>
<location filename="../MainWindow.cpp" line="998"/>
<source>Sample Import Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="965"/>
<location filename="../MainWindow.cpp" line="999"/>
<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 type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="969"/>
<location filename="../MainWindow.cpp" line="1003"/>
<source>Import Compressed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="969"/>
<location filename="../MainWindow.cpp" line="1003"/>
<source>Import WAVs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="969"/>
<location filename="../MainWindow.cpp" line="1003"/>
<source>Import Both</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="985"/>
<location filename="../MainWindow.cpp" line="1019"/>
<source>Raw Import Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="986"/>
<location filename="../MainWindow.cpp" line="1020"/>
<source>Would you like to scan for all MusyX group files in this directory?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="996"/>
<location filename="../MainWindow.cpp" line="1030"/>
<source>Project Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="996"/>
<location filename="../MainWindow.cpp" line="1030"/>
<source>What should this project be named?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1010"/>
<location filename="../MainWindow.cpp" line="1056"/>
<location filename="../MainWindow.cpp" line="1044"/>
<location filename="../MainWindow.cpp" line="1090"/>
<source>Importing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1022"/>
<location filename="../MainWindow.cpp" line="1065"/>
<location filename="../MainWindow.cpp" line="1056"/>
<location filename="../MainWindow.cpp" line="1099"/>
<source>Importing %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1082"/>
<location filename="../MainWindow.cpp" line="1116"/>
<source>Import Songs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1102"/>
<location filename="../MainWindow.cpp" line="1145"/>
<source>Exporting</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1110"/>
<location filename="../MainWindow.cpp" line="1153"/>
<source>Exporting %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1125"/>
<location filename="../MainWindow.cpp" line="1140"/>
<location filename="../MainWindow.cpp" line="1168"/>
<location filename="../MainWindow.cpp" line="1183"/>
<source>Import C Headers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1126"/>
<location filename="../MainWindow.cpp" line="1169"/>
<source>&lt;p&gt;Importing names from C headers depends on up-to-date, consistent names relative to the sound group data.&lt;/p&gt;&lt;p&gt;Headers are imported on a per-subproject basis from a single directory. Headers must be named with the form &lt;code&gt;&amp;lt;subproject&amp;gt;.h&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Group, Song and SFX definitions are matched according to the following forms:&lt;pre&gt;#define GRP&amp;lt;name&amp;gt; &amp;lt;id&amp;gt;
#define SNG&amp;lt;name&amp;gt; &amp;lt;id&amp;gt;
#define SFX&amp;lt;name&gt; &amp;lt;id&amp;gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;This operation cannot be undone! Is is recommended to make a backup of the project directory before proceeding.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Continue?&lt;/p&gt;</source>
#define SFX&amp;lt;name&gt; &amp;lt;id&amp;gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;This operation cannot be undone! It is recommended to make a backup of the project directory before proceeding.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Continue?&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1159"/>
<location filename="../MainWindow.cpp" line="1211"/>
<source>Export C Headers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1385"/>
<location filename="../MainWindow.cpp" line="1446"/>
<source>New Subproject</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1386"/>
<location filename="../MainWindow.cpp" line="1447"/>
<source>What should this subproject be named?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1401"/>
<location filename="../MainWindow.cpp" line="1462"/>
<source>New SFX Group</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1402"/>
<location filename="../MainWindow.cpp" line="1463"/>
<source>What should the new SFX group in %1 be named?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1420"/>
<location filename="../MainWindow.cpp" line="1481"/>
<source>New Song Group</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1421"/>
<location filename="../MainWindow.cpp" line="1482"/>
<source>What should the new Song group in %1 be named?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1462"/>
<location filename="../MainWindow.cpp" line="1524"/>
<source>New ADSR</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1463"/>
<location filename="../MainWindow.cpp" line="1525"/>
<source>What should the new ADSR in %1 be named?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1481"/>
<location filename="../MainWindow.cpp" line="1543"/>
<source>New Curve</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1482"/>
<location filename="../MainWindow.cpp" line="1544"/>
<source>What should the new Curve in %1 be named?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1500"/>
<location filename="../MainWindow.cpp" line="1562"/>
<source>New Keymap</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1501"/>
<location filename="../MainWindow.cpp" line="1563"/>
<source>What should the new Keymap in %1 be named?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1519"/>
<location filename="../MainWindow.cpp" line="1581"/>
<source>New Layers</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1520"/>
<location filename="../MainWindow.cpp" line="1582"/>
<source>What should the new Layers in %1 be named?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1630"/>
<location filename="../MainWindow.cpp" line="1692"/>
<source>About Amuse</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1924"/>
<location filename="../MainWindow.cpp" line="1987"/>
<source>Export Complete</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1924"/>
<location filename="../MainWindow.cpp" line="1987"/>
<source>%1?</source>
<translation type="unfinished"></translation>
</message>
@ -997,7 +997,7 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="95"/>
<location filename="../MainWindow.cpp" line="96"/>
<source>Clear Recent Projects</source>
<translation type="unfinished"></translation>
</message>
@ -1121,38 +1121,38 @@
<context>
<name>PageModel</name>
<message>
<location filename="../SongGroupEditor.cpp" line="659"/>
<location filename="../SongGroupEditor.cpp" line="676"/>
<source>Program Conflict</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="660"/>
<location filename="../SongGroupEditor.cpp" line="677"/>
<source>Program %1 is already defined in table</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="666"/>
<location filename="../SongGroupEditor.cpp" line="692"/>
<location filename="../SongGroupEditor.cpp" line="683"/>
<location filename="../SongGroupEditor.cpp" line="709"/>
<source>Change %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="706"/>
<location filename="../SongGroupEditor.cpp" line="723"/>
<source>Program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="708"/>
<location filename="../SongGroupEditor.cpp" line="725"/>
<source>Object</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="710"/>
<location filename="../SongGroupEditor.cpp" line="727"/>
<source>Priority</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="712"/>
<location filename="../SongGroupEditor.cpp" line="729"/>
<source>Max Voices</source>
<translation type="unfinished"></translation>
</message>
@ -1186,12 +1186,12 @@
<context>
<name>PageTableView</name>
<message>
<location filename="../SongGroupEditor.cpp" line="1245"/>
<location filename="../SongGroupEditor.cpp" line="1262"/>
<source>Delete Page Entries</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="1245"/>
<location filename="../SongGroupEditor.cpp" line="1262"/>
<source>Delete Page Entry</source>
<translation type="unfinished"></translation>
</message>
@ -1551,7 +1551,7 @@
<context>
<name>QDialogButtonBox</name>
<message>
<location filename="../MainWindow.cpp" line="1956"/>
<location filename="../MainWindow.cpp" line="2018"/>
<source>OK</source>
<translation type="unfinished"></translation>
</message>
@ -1559,12 +1559,12 @@
<context>
<name>QMessageBox</name>
<message>
<location filename="../MainWindow.cpp" line="1613"/>
<location filename="../MainWindow.cpp" line="1675"/>
<source>&lt;h3&gt;About Amuse&lt;/h3&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1617"/>
<location filename="../MainWindow.cpp" line="1679"/>
<source>&lt;p&gt;Amuse is an alternate editor and runtime library for MusyX sound groups.&lt;/p&gt;&lt;p&gt;MusyX originally served as a widely-deployed audio system for developing games on the Nintendo 64, GameCube, and GameBoy Advance.&lt;/p&gt;&lt;p&gt;Amuse is available under the MIT license.&lt;br&gt;Please see &lt;a href=&quot;https://gitlab.axiodl.com/AxioDL/amuse/blob/master/LICENSE&quot;&gt;https://gitlab.axiodl.com/AxioDL/amuse/blob/master/LICENSE&lt;/a&gt; for futher information.&lt;/p&gt;&lt;p&gt;Copyright (C) 2015-2018 Antidote / Jackoalan.&lt;/p&gt;&lt;p&gt;MusyX is a trademark of Factor 5, LLC.&lt;/p&gt;&lt;p&gt;Nintendo 64, GameCube, and GameBoy Advance are trademarks of Nintendo Co., Ltd.&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
@ -1736,27 +1736,27 @@
<context>
<name>SetupListModel</name>
<message>
<location filename="../SongGroupEditor.cpp" line="932"/>
<location filename="../SongGroupEditor.cpp" line="949"/>
<source>Song Conflict</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="933"/>
<location filename="../SongGroupEditor.cpp" line="950"/>
<source>Song %1 is already defined in project</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="938"/>
<location filename="../SongGroupEditor.cpp" line="955"/>
<source>Change Song Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="955"/>
<location filename="../SongGroupEditor.cpp" line="972"/>
<source>Song</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="957"/>
<location filename="../SongGroupEditor.cpp" line="974"/>
<source>MIDI File</source>
<translation type="unfinished"></translation>
</message>
@ -1764,32 +1764,32 @@
<context>
<name>SetupModel</name>
<message>
<location filename="../SongGroupEditor.cpp" line="1180"/>
<location filename="../SongGroupEditor.cpp" line="1197"/>
<source>Change %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="1197"/>
<location filename="../SongGroupEditor.cpp" line="1214"/>
<source>Program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="1199"/>
<location filename="../SongGroupEditor.cpp" line="1216"/>
<source>Volume</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="1201"/>
<location filename="../SongGroupEditor.cpp" line="1218"/>
<source>Panning</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="1203"/>
<location filename="../SongGroupEditor.cpp" line="1220"/>
<source>Reverb</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="1205"/>
<location filename="../SongGroupEditor.cpp" line="1222"/>
<source>Chorus</source>
<translation type="unfinished"></translation>
</message>
@ -1797,12 +1797,12 @@
<context>
<name>SetupTableView</name>
<message>
<location filename="../SongGroupEditor.cpp" line="1309"/>
<location filename="../SongGroupEditor.cpp" line="1326"/>
<source>Delete Setup Entries</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="1309"/>
<location filename="../SongGroupEditor.cpp" line="1326"/>
<source>Delete Setup Entry</source>
<translation type="unfinished"></translation>
</message>
@ -1810,37 +1810,37 @@
<context>
<name>SongGroupEditor</name>
<message>
<location filename="../SongGroupEditor.cpp" line="1699"/>
<location filename="../SongGroupEditor.cpp" line="1716"/>
<source>Add new page entry</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="1701"/>
<location filename="../SongGroupEditor.cpp" line="1718"/>
<source>Remove selected page entries</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="1668"/>
<location filename="../SongGroupEditor.cpp" line="1685"/>
<source>Normal Pages</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="1507"/>
<location filename="../SongGroupEditor.cpp" line="1524"/>
<source>Add Page Entry</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="1519"/>
<location filename="../SongGroupEditor.cpp" line="1536"/>
<source>Add Setup Entry</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="1669"/>
<location filename="../SongGroupEditor.cpp" line="1686"/>
<source>Drum Pages</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SongGroupEditor.cpp" line="1670"/>
<location filename="../SongGroupEditor.cpp" line="1687"/>
<source>MIDI Setups</source>
<translation type="unfinished"></translation>
</message>
@ -1866,72 +1866,72 @@
<context>
<name>SoundMacroCatalogue</name>
<message>
<location filename="../SoundMacroEditor.cpp" line="936"/>
<location filename="../SoundMacroEditor.cpp" line="939"/>
<source>Control</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SoundMacroEditor.cpp" line="937"/>
<location filename="../SoundMacroEditor.cpp" line="940"/>
<source>Pitch</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SoundMacroEditor.cpp" line="938"/>
<location filename="../SoundMacroEditor.cpp" line="941"/>
<source>Sample</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SoundMacroEditor.cpp" line="939"/>
<location filename="../SoundMacroEditor.cpp" line="942"/>
<source>Setup</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SoundMacroEditor.cpp" line="940"/>
<location filename="../SoundMacroEditor.cpp" line="943"/>
<source>Special</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SoundMacroEditor.cpp" line="941"/>
<location filename="../SoundMacroEditor.cpp" line="944"/>
<source>Structure</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SoundMacroEditor.cpp" line="942"/>
<location filename="../SoundMacroEditor.cpp" line="945"/>
<source>Volume</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SoundMacroEditor.cpp" line="947"/>
<location filename="../SoundMacroEditor.cpp" line="950"/>
<source>Commands to control the voice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SoundMacroEditor.cpp" line="948"/>
<location filename="../SoundMacroEditor.cpp" line="951"/>
<source>Commands to control the voice&apos;s pitch</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SoundMacroEditor.cpp" line="949"/>
<location filename="../SoundMacroEditor.cpp" line="952"/>
<source>Commands to control the voice&apos;s sample playback</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SoundMacroEditor.cpp" line="950"/>
<location filename="../SoundMacroEditor.cpp" line="953"/>
<source>Commands to setup the voice&apos;s mixing process</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SoundMacroEditor.cpp" line="951"/>
<location filename="../SoundMacroEditor.cpp" line="954"/>
<source>Miscellaneous commands</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SoundMacroEditor.cpp" line="952"/>
<location filename="../SoundMacroEditor.cpp" line="955"/>
<source>Commands to control macro branching</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SoundMacroEditor.cpp" line="953"/>
<location filename="../SoundMacroEditor.cpp" line="956"/>
<source>Commands to control the voice&apos;s volume</source>
<translation type="unfinished"></translation>
</message>
@ -1947,17 +1947,17 @@
<context>
<name>SoundMacroListing</name>
<message>
<location filename="../SoundMacroEditor.cpp" line="635"/>
<location filename="../SoundMacroEditor.cpp" line="638"/>
<source>Reorder %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SoundMacroEditor.cpp" line="767"/>
<location filename="../SoundMacroEditor.cpp" line="770"/>
<source>Insert %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../SoundMacroEditor.cpp" line="820"/>
<location filename="../SoundMacroEditor.cpp" line="823"/>
<source>Delete %1</source>
<translation type="unfinished"></translation>
</message>
@ -2014,52 +2014,52 @@
<context>
<name>TreeDelegate</name>
<message>
<location filename="../MainWindow.cpp" line="1190"/>
<location filename="../MainWindow.cpp" line="1251"/>
<source>Export GameCube Group</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1198"/>
<location filename="../MainWindow.cpp" line="1259"/>
<source>Find Usages</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1206"/>
<location filename="../MainWindow.cpp" line="1267"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1214"/>
<location filename="../MainWindow.cpp" line="1275"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1222"/>
<location filename="../MainWindow.cpp" line="1283"/>
<source>Paste</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1230"/>
<location filename="../MainWindow.cpp" line="1291"/>
<source>Duplicate</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1235"/>
<location filename="../MainWindow.cpp" line="1296"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1243"/>
<location filename="../MainWindow.cpp" line="1304"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1274"/>
<location filename="../MainWindow.cpp" line="1335"/>
<source>Exporting</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../MainWindow.cpp" line="1274"/>
<location filename="../MainWindow.cpp" line="1335"/>
<source>Exporting %1</source>
<translation type="unfinished"></translation>
</message>

View File

@ -318,6 +318,8 @@ std::string AudioGroupDatabase::exportCHeader(std::string_view projectName, std:
char curTmStr[26];
asctime_s(curTmStr, &curTm);
#endif
if (char* ch = strchr(curTmStr, '\n'))
*ch = '\0';
ret += curTmStr;
ret += "\n"
" */\n\n\n"sv;