本文整理汇总了C++中MidiTrack::events方法的典型用法代码示例。如果您正苦于以下问题:C++ MidiTrack::events方法的具体用法?C++ MidiTrack::events怎么用?C++ MidiTrack::events使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MidiTrack
的用法示例。
在下文中一共展示了MidiTrack::events方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: writeTrack
bool MidiFile::writeTrack(const MidiTrack &t)
{
write("MTrk", 4);
qint64 lenpos = fp->pos();
writeLong(0); // dummy len
status = -1;
int tick = 0;
for (auto i : t.events()) {
int ntick = i.first;
putvl(ntick - tick); // write tick delta
//
// if track channel != -1, then use this
// channel for all events in this track
//
if (t.outChannel() != -1)
writeEvent(i.second);
tick = ntick;
}
//---------------------------------------------------
// write "End Of Track" Meta
// write Track Len
//
putvl(1);
put(0xff); // Meta
put(0x2f); // EOT
putvl(0); // len 0
qint64 endpos = fp->pos();
fp->seek(lenpos);
writeLong(endpos-lenpos-4); // tracklen
fp->seek(endpos);
return false;
}
示例2: toMuseScoreTicks
std::multimap<ReducedFraction, std::string>
extractLyricsFromTrack(const MidiTrack &lyricsTrack, int division)
{
std::multimap<ReducedFraction, std::string> lyrics;
for (const auto &i: lyricsTrack.events()) {
const auto& e = i.second;
if (isLyricEvent(e)) {
const uchar* data = (uchar*)e.edata();
std::string text = MidiCharset::fromUchar(data);
if (isLyricText(text)) {
const auto tick = toMuseScoreTicks(i.first, division);
// no charset handling here
lyrics.insert({tick, text});
}
}
}
return lyrics;
}
示例3: isLyricsTrack
bool isLyricsTrack(const MidiTrack &lyricsTrack)
{
bool lyricsFlag = false;
for (const auto &i: lyricsTrack.events()) {
const auto& e = i.second;
if (isLyricEvent(e)) {
const uchar* data = (uchar*)e.edata();
// no charset handling here
std::string text = MidiCharset::fromUchar(data);
if (isLyricText(text)) {
if (!lyricsFlag)
lyricsFlag = true;
}
}
else if (e.type() == ME_NOTE)
return false;
}
return lyricsFlag;
}
示例4: main
int main(int argc, char* argv[])
{
int c;
while ((c = getopt(argc, argv, "vdD:r")) != EOF) {
switch (c) {
case 'v':
printVersion();
return 0;
case 'd':
debugMode = true;
break;
default:
usage();
return -1;
}
}
QIODevice* in = 0;
QIODevice* out = 0;
switch (argc - optind) {
case 2:
out = new QFile(argv[1 + optind]);
if (!out->open(QIODevice::WriteOnly)) {
printf("cannot open output file <%s>: %s\n", argv[optind+1], strerror(errno));
return -3;
}
case 1:
in = new QFile(argv[optind]);
if (!in->open(QIODevice::ReadOnly)) {
printf("cannot open input file <%s>: %s\n", argv[optind], strerror(errno));
return -4;
}
break;
case 0:
break;
default:
usage();
return -2;
break;
}
if (in == 0) {
in = new QFile;
((QFile*)in)->open(stdin, QIODevice::ReadOnly);
}
if (out == 0) {
out = new QFile;
((QFile*)out)->open(stdout, QIODevice::WriteOnly);
}
MidiFile mf;
mf.setFormat(1);
XmlReader e(in);
while (e.readNextStartElement()) {
const QStringRef& tag(e.name());
if (tag == "SMF") {
while (e.readNextStartElement()) {
const QStringRef& tag(e.name());
if (tag == "Track") {
MidiTrack* track = new MidiTrack(&mf);
while (e.readNextStartElement()) {
const QStringRef& tag(e.name());
if (tag == "NoteOff") {
MidiEventType t = MidiEventType::NOTEOFF;
int tick = e.intAttribute("tick");
uchar c = e.intAttribute("c");
uchar a = e.intAttribute("a", 0, 16);
uchar b = e.intAttribute("b", 0, 16);
track->events().insert(std::pair<int,MidiEvent>(tick, MidiEvent(t, c, a, b)));
e.skipCurrentElement();
}
else if (tag == "NoteOn") {
MidiEventType t = MidiEventType::NOTEON;
int tick = e.intAttribute("tick");
uchar c = e.intAttribute("c");
uchar a = e.intAttribute("a", 0, 16);
uchar b = e.intAttribute("b", 0, 16);
track->events().insert(std::pair<int,MidiEvent>(tick, MidiEvent(t, c, a, b)));
e.skipCurrentElement();
}
else if (tag == "Ctrl") {
MidiEventType t = MidiEventType::CONTROLLER;
int tick = e.intAttribute("tick");
uchar c = e.intAttribute("c");
uchar a = e.intAttribute("a", 0, 16);
uchar b = e.intAttribute("b", 0, 16);
track->events().insert(std::pair<int,MidiEvent>(tick, MidiEvent(t, c, a, b)));
e.skipCurrentElement();
}
else if (tag == "Program") {
MidiEventType t = MidiEventType::PROGRAM;
int tick = e.intAttribute("tick");
uchar c = e.intAttribute("c");
uchar a = e.intAttribute("a", 0, 16);
track->events().insert(std::pair<int,MidiEvent>(tick, MidiEvent(t, c, a, 0)));
e.skipCurrentElement();
}
else if (tag == "Event") {
uchar t = e.intAttribute("t");
int tick = e.intAttribute("tick");
//.........这里部分代码省略.........
示例5: importMidi
bool LOS::importMidi(const QString name, bool merge)/*{{{*/
{
bool popenFlag;
FILE* fp = fileOpen(this, name, QString(".mid"), "r", popenFlag);
if (fp == 0)
return true;
MidiFile mf(fp);
bool rv = mf.read();
popenFlag ? pclose(fp) : fclose(fp);
if (rv)
{
QString s(tr("reading midifile\n "));
s += name;
s += tr("\nfailed: ");
s += mf.error();
QMessageBox::critical(this, QString("LOS"), s);
return rv;
}
//
// evaluate song Type (GM, XG, GS, unknown)
//
MType t = song->midiType();
if (!merge)
{
t = mf.mtype();
song->setMType(t);
}
MidiInstrument* instr = 0;
for (iMidiInstrument i = midiInstruments.begin(); i != midiInstruments.end(); ++i)
{
MidiInstrument* mi = *i;
if ((mi->iname() == "GM" && ((t == MT_UNKNOWN) || (t == MIDI_TYPE_GM)))
|| ((mi->iname() == "GS") && (t == MT_GS))
|| ((mi->iname() == "XG") && (t == MT_XG)))
{
instr = mi;
break;
}
}
if (instr == 0)
{
// the standard instrument files (GM, GS, XG) must be present
printf("no instrument, type %d\n", t);
return true;
//abort();
}
MidiFileTrackList* etl = mf.trackList();
int division = mf.division();
//
// create MidiTrack and copy events to ->events()
// - combine note on/off events
// - calculate tick value for internal resolution
//
for (iMidiFileTrack t = etl->begin(); t != etl->end(); ++t)
{
MPEventList* el = &((*t)->events);
if (el->empty())
continue;
//
// if we split the track, SYSEX and META events go into
// the first target track
bool first = true;
// somewhat silly and slooow:
for (int port = 0; port < kMaxMidiPorts; ++port)
{
for (int channel = 0; channel < kMaxMidiChannels; ++channel)
{
//
// check if there are any events for port/channel in track:
//
iMPEvent i;
for (i = el->begin(); i != el->end(); ++i)
{
MidiPlayEvent ev = *i;
if (ev.type() != ME_SYSEX && ev.type() != ME_META
&& ev.channel() == channel && ev.port() == port)
break;
}
if (i == el->end())
continue;
MidiTrack* track = new MidiTrack();
if ((*t)->isDrumTrack)
{
track->setType(Track::DRUM);
}
track->setOutChannel(channel);
track->setOutPort(port);
MidiPort* mport = &midiPorts[track->outPort()];
// this overwrites any instrument set for this port:
mport->setInstrument(instr);
EventList* mel = track->events();
//buildMidiEventList(mel, el, track, division, first);
// Don't do loops.
buildMidiEventList(mel, el, track, division, first, false);
//.........这里部分代码省略.........