1
1
//=========================================================
3
3
// Linux Music Editor
4
// $Id: midi.cpp,v 1.2 2002/02/05 14:15:56 muse Exp $
4
// $Id: midi.cpp,v 1.3 2003/11/19 17:59:21 wschweer Exp $
6
6
// (C) Copyright 1999/2000 Werner Schweer (ws@seh.de)
7
7
//=========================================================
10
10
#include <values.h>
451
printf("xg part mode channel %d to %d\n", buf[4], buf[6]);
452
printf("xg set part mode channel %d to %d\n", buf[4]+1, buf[6]);
453
454
track->setType(Track::DRUM);
560
559
if (port != track->outPort())
561
560
printf("2 HALOOOO %d %d\n", port, track->outPort());
563
event->setPort(track->outPort());
564
event->setChannel(track->outChannel());
567
564
if (lastchan != channel) {
728
721
--len; // don't count 0xf7
729
722
if (checkSysex(track, len, buffer)) {
730
723
event->setType(MidiEvent::Sysex);
731
event->setDataLen(len);
732
event->setData(buffer);
724
EvData* ed = new EvData(buffer, len);
726
event->setEvData(ed);
737
731
return (MidiEvent*)-1;
755
749
if (read(buffer, len)) {
756
750
printf("readEvent: error 7\n");
759
753
return (MidiEvent*)-2;
763
757
if (type == 0x2f) { // End of Track
769
763
case 0x03: // Sequence-/TrackName
771
765
QString s((char*)buffer);
776
770
return (MidiEvent*)-1; // DEBUG: eigentlich n�chsten Event lesen
825
819
track->scale.set(buffer[0]);
826
820
track->scale.setMajorMinor(buffer[1]);
830
824
return (MidiEvent*)-1; // DEBUG: eigentlich n�chsten Event lesen
831
825
case 0x6: // Marker
832
826
song->addMarker(QString((const char*)(buffer)), event->posTick(), false);
835
829
return (MidiEvent*)-1; // DEBUG: eigentlich n�chsten Event lesen
837
831
case 0: // Sequence Number
967
964
// Setup Measure:
968
965
// Trackname, Comment, Instrument, Volume, Pan
970
if (!track->tname().isEmpty()) {
971
const char* name = track->tname().latin1();
967
if (!track->name().isEmpty()) {
968
const char* name = track->name().latin1();
972
969
int len = strlen(name);
973
MidiEvent* ev = new MidiEvent(port, channel, 0, MidiEvent::Meta, len, (unsigned char*)name);
970
MidiEvent* ev = new MidiEvent(0, MidiEvent::Meta, len, (unsigned char*)name);
974
971
ev->setA(0x3); // Meta Sequence/Track Name
977
974
if (!track->comment().isEmpty()) {
978
975
const char* comment = track->comment().latin1();
979
976
int len = strlen(comment);
980
MidiEvent* ev = new MidiEvent(port, channel, 0, MidiEvent::Meta, len, (unsigned char*)comment);
977
MidiEvent* ev = new MidiEvent(0, MidiEvent::Meta, len, (unsigned char*)comment);
981
978
ev->setA(0x0f); // Meta Text
988
985
if (state->controller[CTRL_HBANK] != -1) {
989
events->add(new MidiEvent(port, channel, tick, MidiEvent::Ctrl7, CTRL_HBANK,
986
events->add(new MidiEvent(tick, MidiEvent::Ctrl7, CTRL_HBANK,
990
987
state->controller[CTRL_HBANK], 0, 0));
993
990
if (state->controller[CTRL_LBANK] != -1) {
994
events->add(new MidiEvent(port, channel, tick, MidiEvent::Ctrl7, CTRL_LBANK,
991
events->add(new MidiEvent(tick, MidiEvent::Ctrl7, CTRL_LBANK,
995
992
state->controller[CTRL_LBANK], 0, 0));
998
995
if (state->program != -1) {
999
events->add(new MidiEvent(port, channel, tick, MidiEvent::Program, state->program,
996
events->add(new MidiEvent(tick, MidiEvent::Program, state->program,
1003
1000
if (state->controller[CTRL_VOLUME] != -1) {
1004
events->add(new MidiEvent(port, channel, tick, MidiEvent::Ctrl7, CTRL_VOLUME,
1001
events->add(new MidiEvent(tick, MidiEvent::Ctrl7, CTRL_VOLUME,
1005
1002
state->controller[CTRL_VOLUME], 0, 0));
1008
1005
if (state->controller[CTRL_PANPOT] != -1) {
1009
events->add(new MidiEvent(port, channel, tick, MidiEvent::Ctrl7, CTRL_PANPOT,
1006
events->add(new MidiEvent(tick, MidiEvent::Ctrl7, CTRL_PANPOT,
1010
1007
state->controller[CTRL_PANPOT], 0, 0));
1020
1017
MidiPart* part = (MidiPart*) (p->second);
1021
1018
EventList* evlist = part->events();
1022
1019
for (iEvent i = evlist->begin(); i != evlist->end(); ++i) {
1023
MidiEvent* ev = (MidiEvent*)i->second;
1025
if (ev->velo() == 0) {
1020
MidiEvent* ev = (MidiEvent*)i->second;
1021
int tick = ev->posTick() + part->posTick();
1022
MidiEvent* event = new MidiEvent(*ev);
1023
event->setPosTick(tick);
1025
if (event->isNote()) {
1026
if (event->velo() == 0) {
1026
1027
printf("Warning: midi note has velocity 0, (ignored)\n");
1029
MidiEvent* event = new MidiEvent(*ev);
1030
int len = ev->lenTick();
1030
int len = event->lenTick();
1032
1032
//---------------------------------------
1033
1033
// apply trackinfo values
1097
1096
for (ciMarker m = ml->begin(); m != ml->end(); ++m) {
1098
1097
const char* name = m->second.name().latin1();
1099
1098
int len = strlen(name);
1100
MidiEvent* ev = new MidiEvent(port, channel,
1099
MidiEvent* ev = new MidiEvent(
1101
1100
m->first, MidiEvent::Meta,
1102
1101
len, (unsigned char*)name);
1110
1109
const char* copyright = song->copyright().latin1();
1111
1110
if (copyright && *copyright) {
1112
1111
int len = strlen(copyright);
1113
MidiEvent* ev = new MidiEvent(port, channel, 0, MidiEvent::Meta,
1112
MidiEvent* ev = new MidiEvent(0, MidiEvent::Meta,
1114
1113
len, (unsigned char*)copyright);
1116
1115
events->add(ev);
1121
1120
switch(song->mtype()) {
1123
events->add(new MidiEvent(port, channel, 0, MidiEvent::Sysex, gmOnMsgLen, gmOnMsg));
1122
events->add(new MidiEvent(0, MidiEvent::Sysex, gmOnMsgLen, gmOnMsg));
1126
events->add(new MidiEvent(port, channel, 0, MidiEvent::Sysex, gmOnMsgLen, gmOnMsg));
1127
events->add(new MidiEvent(port, channel, 250, MidiEvent::Sysex, gsOnMsgLen, gsOnMsg));
1125
events->add(new MidiEvent(0, MidiEvent::Sysex, gmOnMsgLen, gmOnMsg));
1126
events->add(new MidiEvent(250, MidiEvent::Sysex, gsOnMsgLen, gsOnMsg));
1130
events->add(new MidiEvent(port, channel, 0, MidiEvent::Sysex, gmOnMsgLen, gmOnMsg));
1131
events->add(new MidiEvent(port, channel, 250, MidiEvent::Sysex, xgOnMsgLen, xgOnMsg));
1129
events->add(new MidiEvent(0, MidiEvent::Sysex, gmOnMsgLen, gmOnMsg));
1130
events->add(new MidiEvent(250, MidiEvent::Sysex, xgOnMsgLen, xgOnMsg));
1133
1132
case MT_UNKNOWN:
1145
1144
data[1] = (tempo >> 8) & 0xff;
1146
1145
data[0] = (tempo >> 16) & 0xff;
1147
1146
MidiEvent* ev = new MidiEvent(
1149
1147
event->tick, MidiEvent::Meta, 3, data);
1150
1148
ev->setA(0x51);
1151
1149
events->add(ev);
1241
1238
track->setType(Track::DRUM);
1243
1240
MidiPort* port = &midiPorts[track->outPort()];
1244
int channel = track->outChannel();
1245
port->resetIstate(channel, false);
1247
int trackno = song->tracks()->index(track);
1248
bool karaoke = song->karaokeFlag();
1241
int channel = track->outChannel();
1242
int trackno = song->tracks()->index(track);
1243
bool karaoke = song->karaokeFlag();
1250
1245
//---------------------------------------------------
1251
1246
// get initial controller state
1292
1287
if (trackno == 1 && memcmp(ev->data(), "@KMID", 5) == 0) {
1293
1288
karaoke = true;
1294
1289
song->setKaraokeFlag(true);
1295
song->setKaraokeChannel(ev->channel());
1290
song->setKaraokeChannel(channel);
1296
1291
tevents->erase(i);
1298
1293
if ((trackno == 2) && karaoke) {
1306
1301
case 1: // expect titel
1307
1302
++karaokeState; // language
1303
song->setName(QString(p+2));
1310
1305
case 2: // expect interpret
1311
1306
++karaokeState;
1312
song->setKomponist1(p+2);
1307
song->setKomponist1(QString(p+2));
1315
1310
printf("unexpected @ in karaoke\n");
1341
1336
//---------------------------------------------------
1342
// NoteOff Events aufl�sen
1337
// resolve NoteOff events
1343
1338
//---------------------------------------------------
1345
1340
for (iEvent i = tevents->begin(); i != tevents->end(); ++i) {
1376
1371
if (k == tevents->end()) {
1377
printf("-kein note-off! %d channel %d pitch %d velo %d\n",
1378
i->first, ev->channel(), ev->pitch(), ev->velo());
1372
printf("-kein note-off! %d pitch %d velo %d\n",
1373
i->first, ev->pitch(), ev->velo());
1380
1375
// ton am Taktende abschalten
1387
// remap drum pitch with drumInmap
1389
if (track->type() == Track::DRUM) {
1390
for (iEvent i = tevents->begin(); i != tevents->end(); ++i) {
1391
MidiEvent* ev = (MidiEvent*)i->second;
1393
int pitch = drumInmap[ev->pitch()];
1394
ev->setPitch(pitch);
1391
1399
// DEBUG: any note offs left?
1393
1401
for (iEvent i = tevents->begin(); i != tevents->end(); ++i) {
1394
1402
MidiEvent* ev = (MidiEvent*)i->second;
1395
1403
if (ev->isNoteOff()) {
1396
printf("+extra note-off! %d channel %d pitch %d velo %d\n",
1397
i->first, ev->channel(), ev->pitch(), ev->velo());
1404
printf("+extra note-off! %d pitch %d velo %d\n",
1405
i->first, ev->pitch(), ev->velo());
1492
1500
int etick = part->posTick() + part->lenTick();
1493
1501
iEvent r1 = tevents->lower_bound(stick);
1494
1502
iEvent r2 = tevents->lower_bound(etick);
1495
part->events()->insert(r1, r2);
1503
int startTick = part->posTick();
1505
EventList* el = part->events();
1506
for (iEvent i = r1; i != r2; ++i) {
1507
MidiEvent* ev = (MidiEvent*)(i->second);
1508
int ntick = ev->posTick() - startTick;
1509
ev->setPosTick(ntick);
1496
1512
tevents->erase(r1, r2);
1578
for (int i = 0; i < 16; ++i)
1579
midiPorts[0].resetIstate(i, false);
1562
1581
TrackList* tl = song->tracks();
1563
1582
for (iTrack t = tl->begin(); t != tl->end(); ++t) {
1564
1583
MidiTrack* track = dynamic_cast<MidiTrack*>(*t);