Mercurial > hg > svcore
comparison data/fileio/MIDIFileReader.cpp @ 742:c10cb8782576 coreaudio_tests
Merge from branch "default"
author | Chris Cannam |
---|---|
date | Sun, 01 Jul 2012 11:53:00 +0100 |
parents | 1424aa29ae95 |
children | e802e550a1f2 |
comparison
equal
deleted
inserted
replaced
666:4efa7429cd85 | 742:c10cb8782576 |
---|---|
50 using std::map; | 50 using std::map; |
51 using std::set; | 51 using std::set; |
52 | 52 |
53 using namespace MIDIConstants; | 53 using namespace MIDIConstants; |
54 | 54 |
55 //#define MIDI_DEBUG 1 | 55 //#define MIDI_SVDEBUG 1 |
56 | 56 |
57 | 57 |
58 MIDIFileReader::MIDIFileReader(QString path, | 58 MIDIFileReader::MIDIFileReader(QString path, |
59 MIDIFileImportPreferenceAcquirer *acquirer, | 59 MIDIFileImportPreferenceAcquirer *acquirer, |
60 size_t mainModelSampleRate) : | 60 size_t mainModelSampleRate) : |
276 MIDIFileReader::parseFile() | 276 MIDIFileReader::parseFile() |
277 { | 277 { |
278 m_error = ""; | 278 m_error = ""; |
279 | 279 |
280 #ifdef MIDI_DEBUG | 280 #ifdef MIDI_DEBUG |
281 cerr << "MIDIFileReader::open() : fileName = " << m_fileName.c_str() << endl; | 281 SVDEBUG << "MIDIFileReader::open() : fileName = " << m_fileName.c_str() << endl; |
282 #endif | 282 #endif |
283 | 283 |
284 // Open the file | 284 // Open the file |
285 m_midiFile = new ifstream(m_path.toLocal8Bit().data(), | 285 m_midiFile = new ifstream(m_path.toLocal8Bit().data(), |
286 ios::in | ios::binary); | 286 ios::in | ios::binary); |
313 unsigned int i = 0; | 313 unsigned int i = 0; |
314 | 314 |
315 for (unsigned int j = 0; j < m_numberOfTracks; ++j) { | 315 for (unsigned int j = 0; j < m_numberOfTracks; ++j) { |
316 | 316 |
317 #ifdef MIDI_DEBUG | 317 #ifdef MIDI_DEBUG |
318 cerr << "Parsing Track " << j << endl; | 318 SVDEBUG << "Parsing Track " << j << endl; |
319 #endif | 319 #endif |
320 | 320 |
321 if (!skipToNextTrack()) { | 321 if (!skipToNextTrack()) { |
322 #ifdef MIDI_DEBUG | 322 #ifdef MIDI_DEBUG |
323 cerr << "Couldn't find Track " << j << endl; | 323 cerr << "Couldn't find Track " << j << endl; |
348 m_numberOfTracks = i; | 348 m_numberOfTracks = i; |
349 retval = true; | 349 retval = true; |
350 | 350 |
351 } catch (MIDIException e) { | 351 } catch (MIDIException e) { |
352 | 352 |
353 cerr << "MIDIFileReader::open() - caught exception - " << e.what() << endl; | 353 SVDEBUG << "MIDIFileReader::open() - caught exception - " << e.what() << endl; |
354 m_error = e.what(); | 354 m_error = e.what(); |
355 } | 355 } |
356 | 356 |
357 done: | 357 done: |
358 m_midiFile->close(); | 358 m_midiFile->close(); |
390 bool | 390 bool |
391 MIDIFileReader::parseHeader(const string &midiHeader) | 391 MIDIFileReader::parseHeader(const string &midiHeader) |
392 { | 392 { |
393 if (midiHeader.size() < 14) { | 393 if (midiHeader.size() < 14) { |
394 #ifdef MIDI_DEBUG | 394 #ifdef MIDI_DEBUG |
395 cerr << "MIDIFileReader::parseHeader() - file header undersized" << endl; | 395 SVDEBUG << "MIDIFileReader::parseHeader() - file header undersized" << endl; |
396 #endif | 396 #endif |
397 return false; | 397 return false; |
398 } | 398 } |
399 | 399 |
400 if (midiHeader.compare(0, 4, MIDI_FILE_HEADER) != 0) { | 400 if (midiHeader.compare(0, 4, MIDI_FILE_HEADER) != 0) { |
401 #ifdef MIDI_DEBUG | 401 #ifdef MIDI_DEBUG |
402 cerr << "MIDIFileReader::parseHeader()" | 402 SVDEBUG << "MIDIFileReader::parseHeader()" |
403 << "- file header not found or malformed" | 403 << "- file header not found or malformed" |
404 << endl; | 404 << endl; |
405 #endif | 405 #endif |
406 return false; | 406 return false; |
407 } | 407 } |
408 | 408 |
409 if (midiBytesToLong(midiHeader.substr(4,4)) != 6L) { | 409 if (midiBytesToLong(midiHeader.substr(4,4)) != 6L) { |
410 #ifdef MIDI_DEBUG | 410 #ifdef MIDI_DEBUG |
411 cerr << "MIDIFileReader::parseHeader()" | 411 SVDEBUG << "MIDIFileReader::parseHeader()" |
412 << " - header length incorrect" | 412 << " - header length incorrect" |
413 << endl; | 413 << endl; |
414 #endif | 414 #endif |
415 return false; | 415 return false; |
416 } | 416 } |
496 | 496 |
497 eventCode = (MIDIByte)runningStatus; | 497 eventCode = (MIDIByte)runningStatus; |
498 data1 = midiByte; | 498 data1 = midiByte; |
499 | 499 |
500 #ifdef MIDI_DEBUG | 500 #ifdef MIDI_DEBUG |
501 cerr << "using running status (byte " << int(midiByte) << " found)" << endl; | 501 SVDEBUG << "using running status (byte " << int(midiByte) << " found)" << endl; |
502 #endif | 502 #endif |
503 } else { | 503 } else { |
504 #ifdef MIDI_DEBUG | 504 #ifdef MIDI_DEBUG |
505 cerr << "have new event code " << int(midiByte) << endl; | 505 cerr << "have new event code " << int(midiByte) << endl; |
506 #endif | 506 #endif |
609 | 609 |
610 if (MIDIByte(metaMessage[metaMessage.length() - 1]) != | 610 if (MIDIByte(metaMessage[metaMessage.length() - 1]) != |
611 MIDI_END_OF_EXCLUSIVE) | 611 MIDI_END_OF_EXCLUSIVE) |
612 { | 612 { |
613 #ifdef MIDI_DEBUG | 613 #ifdef MIDI_DEBUG |
614 cerr << "MIDIFileReader::parseTrack() - " | 614 SVDEBUG << "MIDIFileReader::parseTrack() - " |
615 << "malformed or unsupported SysEx type" | 615 << "malformed or unsupported SysEx type" |
616 << endl; | 616 << endl; |
617 #endif | 617 #endif |
618 continue; | 618 continue; |
619 } | 619 } |
629 m_midiComposition[trackNum].push_back(midiEvent); | 629 m_midiComposition[trackNum].push_back(midiEvent); |
630 break; | 630 break; |
631 | 631 |
632 case MIDI_END_OF_EXCLUSIVE: | 632 case MIDI_END_OF_EXCLUSIVE: |
633 #ifdef MIDI_DEBUG | 633 #ifdef MIDI_DEBUG |
634 cerr << "MIDIFileReader::parseTrack() - " | 634 SVDEBUG << "MIDIFileReader::parseTrack() - " |
635 << "Found a stray MIDI_END_OF_EXCLUSIVE" << endl; | 635 << "Found a stray MIDI_END_OF_EXCLUSIVE" << endl; |
636 #endif | 636 #endif |
637 break; | 637 break; |
638 | 638 |
639 default: | 639 default: |
640 #ifdef MIDI_DEBUG | 640 #ifdef MIDI_DEBUG |
641 cerr << "MIDIFileReader::parseTrack()" | 641 SVDEBUG << "MIDIFileReader::parseTrack()" |
642 << " - Unsupported MIDI Event Code: " | 642 << " - Unsupported MIDI Event Code: " |
643 << (int)eventCode << endl; | 643 << (int)eventCode << endl; |
644 #endif | 644 #endif |
645 break; | 645 break; |
646 } | 646 } |
785 unsigned long melapsed = midiTime - tempoMIDITime; | 785 unsigned long melapsed = midiTime - tempoMIDITime; |
786 double quarters = double(melapsed) / double(td); | 786 double quarters = double(melapsed) / double(td); |
787 double seconds = (60.0 * quarters) / tempo; | 787 double seconds = (60.0 * quarters) / tempo; |
788 | 788 |
789 /* | 789 /* |
790 std::cerr << "MIDIFileReader::getTimeForMIDITime(" << midiTime << ")" | 790 SVDEBUG << "MIDIFileReader::getTimeForMIDITime(" << midiTime << ")" |
791 << std::endl; | 791 << endl; |
792 std::cerr << "timing division = " << td << std::endl; | 792 SVDEBUG << "timing division = " << td << endl; |
793 std::cerr << "nearest tempo event (of " << m_tempoMap.size() << ") is at " << tempoMIDITime << " (" | 793 std::cerr << "nearest tempo event (of " << m_tempoMap.size() << ") is at " << tempoMIDITime << " (" |
794 << tempoRealTime << ")" << std::endl; | 794 << tempoRealTime << ")" << std::endl; |
795 std::cerr << "quarters since then = " << quarters << std::endl; | 795 std::cerr << "quarters since then = " << quarters << std::endl; |
796 std::cerr << "tempo = " << tempo << " quarters per minute" << std::endl; | 796 std::cerr << "tempo = " << tempo << " quarters per minute" << std::endl; |
797 std::cerr << "seconds since then = " << seconds << std::endl; | 797 std::cerr << "seconds since then = " << seconds << std::endl; |
798 std::cerr << "resulting time = " << (tempoRealTime + RealTime::fromSeconds(seconds)) << std::endl; | 798 SVDEBUG << "resulting time = " << (tempoRealTime + RealTime::fromSeconds(seconds)) << endl; |
799 */ | 799 */ |
800 | 800 |
801 return tempoRealTime + RealTime::fromSeconds(seconds); | 801 return tempoRealTime + RealTime::fromSeconds(seconds); |
802 } | 802 } |
803 | 803 |
1031 float level = float((*i)->getVelocity()) / 128.f; | 1031 float level = float((*i)->getVelocity()) / 128.f; |
1032 | 1032 |
1033 Note note(startFrame, (*i)->getPitch(), | 1033 Note note(startFrame, (*i)->getPitch(), |
1034 endFrame - startFrame, level, noteLabel); | 1034 endFrame - startFrame, level, noteLabel); |
1035 | 1035 |
1036 // std::cerr << "Adding note " << startFrame << "," << (endFrame-startFrame) << " : " << int((*i)->getPitch()) << std::endl; | 1036 // SVDEBUG << "Adding note " << startFrame << "," << (endFrame-startFrame) << " : " << int((*i)->getPitch()) << endl; |
1037 | 1037 |
1038 model->addPoint(note); | 1038 model->addPoint(note); |
1039 break; | 1039 break; |
1040 } | 1040 } |
1041 | 1041 |