2014-09-16 2 views
0

거의 하루 반을 보내고 iOS를 사용하여 midi 파일에서 4와 4 (4/4)의 값을 얻는 방법을 이해할 수 없습니다midi 파일의 시간 서명 (예 : 4/4)을 읽으십시오. IOS

MusicTimeStamp inBeats; 
UInt32 inSubbeatDivisor; 
CABarBeatTime outBarBeatTime; 
MusicSequenceBeatsToBarBeatTime(aSequence, inBeats, inSubbeatDivisor, &outBarBeatTime); 

NSLog(@"%i, %i, %i, %i, %i, %f", outBarBeatTime.bar, outBarBeatTime.beat, outBarBeatTime.reserved, outBarBeatTime.subbeat, outBarBeatTime.subbeatDivisor, inBeats); 

NSLOG 결과 : : 대물 C, CoreMIDI)

I 미디 파일 4/4 19 바 120 BMP

는 I 코드 다음 시도가 5, 3, 755, 0, 50,617, 0.000000

이 정보를 어떻게 처리해야할지 잘 모릅니다. f rom NSLog.

midi 파일이 6/2 또는 4/2 또는 5/8 인 경우. 그런 다음이 값 (두 번째/첫 번째)을 얻고 싶습니다.

계산할 수 있습니까? 고맙습니다!

답변

2

MusicSequenceBeatsToBarBeatTime은 두 가지 형식간에 타임 스탬프를 변환하지만 변환에 사용한 시한표를 알려주지 않습니다.

박자 기호는 템포 트랙에 박자 기호 메타 이벤트로 지정됩니다. MusicSequenceGetTempoTrack으로 템포 트랙을 가져와야하는 경우 유형을 사용하여 이벤트를 검색하고 해당 이벤트가 박자 기호 메타 이벤트인지 확인하십시오.

0

CL을 이용해 주셔서 감사합니다. 사용자 소규모 실험 후 나는했고, 다음 얻을 :

가 여기에 우리가 미디 파일로드 :

+(void) openMidiFile: (NSString *) path{ 

    MusicSequence s; 
    NewMusicSequence(&s); 


    NSURL * midiFileURL = [NSURL fileURLWithPath:path]; 

    MusicSequenceFileLoad(s, (CFURLRef)midiFileURL, 0, 0); 

    //Get tempo and time signature 
    [self getSequenceTempo:s]; 
} 

을 그리고 여기에 우리가 템포 트랙에서 정보를 필요로하기.

+(MusicTrack) getSequenceTempo: (MusicSequence) aSequence{ 
    OSStatus result = noErr; 

    MusicTrack tempoTrack; 

    result = MusicSequenceGetTempoTrack(aSequence, &tempoTrack); 
    if (noErr != result) { 
     NSLog(@"MusicSequenceGetTempoTrack, %d", (int)result); 
    } 

    // Create an interator 
    MusicEventIterator iterator = NULL; 
    NewMusicEventIterator(tempoTrack, &iterator); 
    MusicTimeStamp timestamp = 0; 
    MusicEventType eventType = 0; 

    const void *eventData = NULL; 
    UInt32 eventDataSize = 0; 

    Boolean hasNext = YES; 

    // A variable to store note messages 
    ExtendedTempoEvent * message; 
    MIDIMetaEvent *metaEvent; 

    // Iterate over events 
    while (hasNext) { 

     // See if there are any more events 
     MusicEventIteratorHasNextEvent(iterator, &hasNext); 

     // Copy the event data into the variables we prepaired earlier 
     MusicEventIteratorGetEventInfo(iterator, &timestamp, &eventType, &eventData, &eventDataSize); 

     // Process Midi Note messages 
     if(eventType==kMusicEventType_ExtendedTempo) { 
      // Cast the midi event data as a midi note message 
      message = (ExtendedTempoEvent*) eventData; 
      // NSLog(@"%f", message->bpm); //TEMPO VALUE 

     } 
     if (eventType == kMusicEventType_Meta){ 
      metaEvent = (MIDIMetaEvent *) eventData; 

      for (int i = 0; i < metaEvent->dataLength;i++){ 
       NSLog(@"%i, %i, %i, %i, %i", metaEvent->metaEventType, metaEvent->data[i], metaEvent->unused1, metaEvent->unused2, metaEvent->unused3); 
      } 
      NSLog(@"..."); 
     } 

     MusicEventIteratorNextEvent(iterator); 
    } 


    return tempoTrack; 
} 

결과는 우리가 7/4 예를 보면

**For 7/8:** 
2014-09-17 14:03:14.073 MidiSequencer[1959:907] 88, **7**, 224, 215, 47 
2014-09-17 14:03:14.075 MidiSequencer[1959:907] 88, **3**, 224, 215, 47 
2014-09-17 14:03:14.077 MidiSequencer[1959:907] 88, 36, 224, 215, 47 
2014-09-17 14:03:14.079 MidiSequencer[1959:907] 88, 8, 224, 215, 47 
2014-09-17 14:03:14.080 MidiSequencer[1959:907] ... 
2014-09-17 14:03:14.081 MidiSequencer[1959:907] 88, **7**, 224, 215, 47 
2014-09-17 14:03:14.083 MidiSequencer[1959:907] 88, **3**, 224, 215, 47 
2014-09-17 14:03:14.084 MidiSequencer[1959:907] 88, 36, 224, 215, 47 
2014-09-17 14:03:14.086 MidiSequencer[1959:907] 88, 8, 224, 215, 47 


**For 7/4** 
2014-09-17 13:59:45.455 MidiSequencer[1922:907] 88, **7**, 32, 220, 47 
2014-09-17 13:59:45.457 MidiSequencer[1922:907] 88, **2**, 32, 220, 47 
2014-09-17 13:59:45.459 MidiSequencer[1922:907] 88, 36, 32, 220, 47 
2014-09-17 13:59:45.461 MidiSequencer[1922:907] 88, 8, 32, 220, 47 
2014-09-17 13:59:45.462 MidiSequencer[1922:907] 88, **7**, 32, 220, 47 
2014-09-17 13:59:45.464 MidiSequencer[1922:907] 88, **2**, 32, 220, 47 
2014-09-17 13:59:45.465 MidiSequencer[1922:907] 88, 36, 32, 220, 47 
2014-09-17 13:59:45.466 MidiSequencer[1922:907] 88, 8, 32, 220, 47 

그래서, 여기에 우리가 값이 7과 가치를 : 2. 두 번째 값의 의미 : 0은 1입니다. 1은 2이고; 2는 4이고; 3은 8이고 4는 16입니다.