buildsmf.cpp
SMF output from scratch
#include "qsmf.h"
using namespace drumstick;
class QSMFBuilder : public QObject
{
Q_OBJECT
public:
QSMFBuilder();
void run(QString fileName);
public slots:
void errorHandler(const QString& errorStr);
void trackHandler(int track);
private:
QSmf *m_engine;
};
#include "buildsmf.h"
#include "qsmf.h"
#include "cmdlineargs.h"
#include <QApplication>
#include <QDebug>
#include <QTextCodec>
QSMFBuilder::QSMFBuilder() : QObject()
{
m_engine = new QSmf(this);
m_engine->setTextCodec(QTextCodec::codecForName("UTF-8"));
connect(m_engine, SIGNAL(signalSMFError(const QString&)),
this, SLOT(errorHandler(const QString&)));
connect(m_engine, SIGNAL(signalSMFWriteTrack(int)),
this, SLOT(trackHandler(int)));
}
void QSMFBuilder::errorHandler(const QString& errorStr)
{
qWarning() << errorStr;
exit(1);
}
void QSMFBuilder::trackHandler(int )
{
unsigned int i;
m_engine->writeMetaEvent(0, copyright_notice,
QString::fromUtf8("Copyright (C) 2006-2010 Pedro López-Cabanillas"));
m_engine->writeBpmTempo(0, 100);
m_engine->writeTimeSignature(0, 3, 2, 36, 8);
m_engine->writeKeySignature(0, 2, major_mode);
static char gsreset[] = { 0xf0, 0x41, 0x10, 0x42, 0x12,
0x40, 0x00, 0x7f, 0x00, 0x41, 0xf7 };
m_engine->writeMidiEvent(0, system_exclusive, sizeof(gsreset), gsreset);
static char notes[] = { 60, 62, 64, 65, 67, 69, 71, 72 };
for(i = 0; i < sizeof(notes); ++i)
{
m_engine->writeMidiEvent(0, note_on, 0, notes[i], 120);
m_engine->writeMidiEvent(60, note_off, 0, notes[i], 0);
}
m_engine->writeMetaEvent(0, end_of_track);
}
void QSMFBuilder::run(QString fileName)
{
m_engine->setDivision(120);
m_engine->setFileFormat(0);
m_engine->setTracks(1);
m_engine->writeToFile(fileName);
}
int main(int argc, char **argv)
{
QSMFBuilder builder;
CmdLineArgs args;
args.setUsage("file");
args.addRequiredArgument("file", "Output SMF name");
args.parse(argc, argv);
QVariant file = args.getArgument("file");
if (!file.isNull())
builder.run(file.toString());
return 0;
}