Mercurial > hg > svcore
comparison data/fileio/MIDIFileReader.cpp @ 1363:39271c98cbdd 3.0-integration
Fix compiler warning, remove some debug out
author | Chris Cannam |
---|---|
date | Tue, 10 Jan 2017 16:56:48 +0000 |
parents | 26cf6d5251ec |
children | 48e9f538e6e9 |
comparison
equal
deleted
inserted
replaced
1362:1bf38a4b91c4 | 1363:39271c98cbdd |
---|---|
51 using std::map; | 51 using std::map; |
52 using std::set; | 52 using std::set; |
53 | 53 |
54 using namespace MIDIConstants; | 54 using namespace MIDIConstants; |
55 | 55 |
56 //#define MIDI_SVDEBUG 1 | 56 //#define MIDI_DEBUG 1 |
57 | 57 |
58 | 58 |
59 MIDIFileReader::MIDIFileReader(QString path, | 59 MIDIFileReader::MIDIFileReader(QString path, |
60 MIDIFileImportPreferenceAcquirer *acquirer, | 60 MIDIFileImportPreferenceAcquirer *acquirer, |
61 sv_samplerate_t mainModelSampleRate) : | 61 sv_samplerate_t mainModelSampleRate) : |
321 SVDEBUG << "Parsing Track " << j << endl; | 321 SVDEBUG << "Parsing Track " << j << endl; |
322 #endif | 322 #endif |
323 | 323 |
324 if (!skipToNextTrack()) { | 324 if (!skipToNextTrack()) { |
325 #ifdef MIDI_DEBUG | 325 #ifdef MIDI_DEBUG |
326 cerr << "Couldn't find Track " << j << endl; | 326 SVDEBUG << "Couldn't find Track " << j << endl; |
327 #endif | 327 #endif |
328 m_error = "File corrupted or in non-standard format?"; | 328 m_error = "File corrupted or in non-standard format?"; |
329 m_format = MIDI_FILE_BAD_FORMAT; | 329 m_format = MIDI_FILE_BAD_FORMAT; |
330 goto done; | 330 goto done; |
331 } | 331 } |
332 | 332 |
333 #ifdef MIDI_DEBUG | 333 #ifdef MIDI_DEBUG |
334 cerr << "Track has " << m_trackByteCount << " bytes" << endl; | 334 SVDEBUG << "Track has " << m_trackByteCount << " bytes" << endl; |
335 #endif | 335 #endif |
336 | 336 |
337 // Run through the events taking them into our internal | 337 // Run through the events taking them into our internal |
338 // representation. | 338 // representation. |
339 if (!parseTrack(i)) { | 339 if (!parseTrack(i)) { |
340 #ifdef MIDI_DEBUG | 340 #ifdef MIDI_DEBUG |
341 cerr << "Track " << j << " parsing failed" << endl; | 341 SVDEBUG << "Track " << j << " parsing failed" << endl; |
342 #endif | 342 #endif |
343 m_error = "File corrupted or in non-standard format?"; | 343 m_error = "File corrupted or in non-standard format?"; |
344 m_format = MIDI_FILE_BAD_FORMAT; | 344 m_format = MIDI_FILE_BAD_FORMAT; |
345 goto done; | 345 goto done; |
346 } | 346 } |
474 | 474 |
475 while (!m_midiFile->eof() && (m_trackByteCount > 0)) { | 475 while (!m_midiFile->eof() && (m_trackByteCount > 0)) { |
476 | 476 |
477 if (eventCode < 0x80) { | 477 if (eventCode < 0x80) { |
478 #ifdef MIDI_DEBUG | 478 #ifdef MIDI_DEBUG |
479 cerr << "WARNING: Invalid event code " << eventCode | 479 SVDEBUG << "WARNING: Invalid event code " << eventCode |
480 << " in MIDI file" << endl; | 480 << " in MIDI file" << endl; |
481 #endif | 481 #endif |
482 throw MIDIException(tr("Invalid event code %1 found").arg(int(eventCode))); | 482 throw MIDIException(tr("Invalid event code %1 found").arg(int(eventCode))); |
483 } | 483 } |
484 | 484 |
485 deltaTime = getNumberFromMIDIBytes(); | 485 deltaTime = getNumberFromMIDIBytes(); |
486 | 486 |
487 #ifdef MIDI_DEBUG | 487 #ifdef MIDI_DEBUG |
488 cerr << "read delta time " << deltaTime << endl; | 488 SVDEBUG << "read delta time " << deltaTime << endl; |
489 #endif | 489 #endif |
490 | 490 |
491 // Get a single byte | 491 // Get a single byte |
492 midiByte = getMIDIByte(); | 492 midiByte = getMIDIByte(); |
493 | 493 |
503 #ifdef MIDI_DEBUG | 503 #ifdef MIDI_DEBUG |
504 SVDEBUG << "using running status (byte " << int(midiByte) << " found)" << endl; | 504 SVDEBUG << "using running status (byte " << int(midiByte) << " found)" << endl; |
505 #endif | 505 #endif |
506 } else { | 506 } else { |
507 #ifdef MIDI_DEBUG | 507 #ifdef MIDI_DEBUG |
508 cerr << "have new event code " << int(midiByte) << endl; | 508 SVDEBUG << "have new event code " << int(midiByte) << endl; |
509 #endif | 509 #endif |
510 eventCode = midiByte; | 510 eventCode = midiByte; |
511 data1 = getMIDIByte(); | 511 data1 = getMIDIByte(); |
512 } | 512 } |
513 | 513 |
515 | 515 |
516 metaEventCode = data1; | 516 metaEventCode = data1; |
517 messageLength = getNumberFromMIDIBytes(); | 517 messageLength = getNumberFromMIDIBytes(); |
518 | 518 |
519 //#ifdef MIDI_DEBUG | 519 //#ifdef MIDI_DEBUG |
520 cerr << "Meta event of type " << int(metaEventCode) << " and " << messageLength << " bytes found, putting on track " << metaTrack << endl; | 520 SVDEBUG << "Meta event of type " << int(metaEventCode) << " and " << messageLength << " bytes found, putting on track " << metaTrack << endl; |
521 //#endif | 521 //#endif |
522 metaMessage = getMIDIBytes(messageLength); | 522 metaMessage = getMIDIBytes(messageLength); |
523 | 523 |
524 long gap = accumulatedTime - trackTimeMap[metaTrack]; | 524 long gap = accumulatedTime - trackTimeMap[metaTrack]; |
525 accumulatedTime += deltaTime; | 525 accumulatedTime += deltaTime; |
570 | 570 |
571 // create and store our event | 571 // create and store our event |
572 midiEvent = new MIDIEvent(deltaTime, eventCode, data1, data2); | 572 midiEvent = new MIDIEvent(deltaTime, eventCode, data1, data2); |
573 | 573 |
574 /* | 574 /* |
575 cerr << "MIDI event for channel " << channel << " (track " | 575 SVDEBUG << "MIDI event for channel " << channel << " (track " |
576 << trackNum << ")" << endl; | 576 << trackNum << ")" << endl; |
577 midiEvent->print(); | 577 midiEvent->print(); |
578 */ | 578 */ |
579 | 579 |
580 | 580 |
603 | 603 |
604 case MIDI_SYSTEM_EXCLUSIVE: | 604 case MIDI_SYSTEM_EXCLUSIVE: |
605 messageLength = getNumberFromMIDIBytes(data1); | 605 messageLength = getNumberFromMIDIBytes(data1); |
606 | 606 |
607 #ifdef MIDI_DEBUG | 607 #ifdef MIDI_DEBUG |
608 cerr << "SysEx of " << messageLength << " bytes found" << endl; | 608 SVDEBUG << "SysEx of " << messageLength << " bytes found" << endl; |
609 #endif | 609 #endif |
610 | 610 |
611 metaMessage= getMIDIBytes(messageLength); | 611 metaMessage= getMIDIBytes(messageLength); |
612 | 612 |
613 if (MIDIByte(metaMessage[metaMessage.length() - 1]) != | 613 if (MIDIByte(metaMessage[metaMessage.length() - 1]) != |
707 // Add any tempo events found in the given track to the global tempo map. | 707 // Add any tempo events found in the given track to the global tempo map. |
708 // | 708 // |
709 void | 709 void |
710 MIDIFileReader::updateTempoMap(unsigned int track) | 710 MIDIFileReader::updateTempoMap(unsigned int track) |
711 { | 711 { |
712 cerr << "updateTempoMap for track " << track << " (" << m_midiComposition[track].size() << " events)" << endl; | 712 SVDEBUG << "updateTempoMap for track " << track << " (" << m_midiComposition[track].size() << " events)" << endl; |
713 | 713 |
714 for (MIDITrack::iterator i = m_midiComposition[track].begin(); | 714 for (MIDITrack::iterator i = m_midiComposition[track].begin(); |
715 i != m_midiComposition[track].end(); ++i) { | 715 i != m_midiComposition[track].end(); ++i) { |
716 | 716 |
717 if ((*i)->isMeta() && | 717 if ((*i)->isMeta() && |
721 MIDIByte m1 = (*i)->getMetaMessage()[1]; | 721 MIDIByte m1 = (*i)->getMetaMessage()[1]; |
722 MIDIByte m2 = (*i)->getMetaMessage()[2]; | 722 MIDIByte m2 = (*i)->getMetaMessage()[2]; |
723 | 723 |
724 long tempo = (((m0 << 8) + m1) << 8) + m2; | 724 long tempo = (((m0 << 8) + m1) << 8) + m2; |
725 | 725 |
726 cerr << "updateTempoMap: have tempo, it's " << tempo << " at " << (*i)->getTime() << endl; | 726 SVDEBUG << "updateTempoMap: have tempo, it's " << tempo << " at " << (*i)->getTime() << endl; |
727 | 727 |
728 if (tempo != 0) { | 728 if (tempo != 0) { |
729 double qpm = 60000000.0 / double(tempo); | 729 double qpm = 60000000.0 / double(tempo); |
730 m_tempoMap[(*i)->getTime()] = | 730 m_tempoMap[(*i)->getTime()] = |
731 TempoChange(RealTime::zeroTime, qpm); | 731 TempoChange(RealTime::zeroTime, qpm); |
784 | 784 |
785 /* | 785 /* |
786 SVDEBUG << "MIDIFileReader::getTimeForMIDITime(" << midiTime << ")" | 786 SVDEBUG << "MIDIFileReader::getTimeForMIDITime(" << midiTime << ")" |
787 << endl; | 787 << endl; |
788 SVDEBUG << "timing division = " << td << endl; | 788 SVDEBUG << "timing division = " << td << endl; |
789 cerr << "nearest tempo event (of " << m_tempoMap.size() << ") is at " << tempoMIDITime << " (" | 789 SVDEBUG << "nearest tempo event (of " << m_tempoMap.size() << ") is at " << tempoMIDITime << " (" |
790 << tempoRealTime << ")" << endl; | 790 << tempoRealTime << ")" << endl; |
791 cerr << "quarters since then = " << quarters << endl; | 791 SVDEBUG << "quarters since then = " << quarters << endl; |
792 cerr << "tempo = " << tempo << " quarters per minute" << endl; | 792 SVDEBUG << "tempo = " << tempo << " quarters per minute" << endl; |
793 cerr << "seconds since then = " << seconds << endl; | 793 SVDEBUG << "seconds since then = " << seconds << endl; |
794 SVDEBUG << "resulting time = " << (tempoRealTime + RealTime::fromSeconds(seconds)) << endl; | 794 SVDEBUG << "resulting time = " << (tempoRealTime + RealTime::fromSeconds(seconds)) << endl; |
795 */ | 795 */ |
796 | 796 |
797 return tempoRealTime + RealTime::fromSeconds(seconds); | 797 return tempoRealTime + RealTime::fromSeconds(seconds); |
798 } | 798 } |
926 NoteModel *model = 0; | 926 NoteModel *model = 0; |
927 | 927 |
928 if (existingModel) { | 928 if (existingModel) { |
929 model = dynamic_cast<NoteModel *>(existingModel); | 929 model = dynamic_cast<NoteModel *>(existingModel); |
930 if (!model) { | 930 if (!model) { |
931 cerr << "WARNING: MIDIFileReader::loadTrack: Existing model given, but it isn't a NoteModel -- ignoring it" << endl; | 931 SVDEBUG << "WARNING: MIDIFileReader::loadTrack: Existing model given, but it isn't a NoteModel -- ignoring it" << endl; |
932 } | 932 } |
933 } | 933 } |
934 | 934 |
935 if (!model) { | 935 if (!model) { |
936 model = new NoteModel(m_mainModelSampleRate, 1, 0.0, 0.0, false); | 936 model = new NoteModel(m_mainModelSampleRate, 1, 0.0, 0.0, false); |