2013-04-10 9 views
0

다음 코드를 사용하여 멜로디를 만들려고합니다. 문제는 에 배열을 rhythmArray에있는 리듬 값을 연주하는 것을 시도하고있다. 기본적으로 음표를 연주하고 지정된 시간 동안 벨로 시티를 실행 한 다음 시퀀스의 다음 음표를 끄고 재생합니다.MusicDevice.h에서 MusicDeviceMIDIEvent를 만드는 방법은 음표 길이에 응답합니까?

도움을 주시면 감사하겠습니다. 당신은 단순히 순서대로 미디 음을 연주하고자하는 경우

int playMidi() 
{ 
//pitch array with constants defined for pitch numbers: ex. C4 = 60 
int pitchArray[11] {C4, A5, E4, F3, D4, FS5, BF4, CS3, FS5, C3, DF4};/

//velocity array with constants defined for velocity: ex. QN = 1, EN = 0.5 
int velocityArray[11] {FORTE, PIANISSIMO, MEZZO_FORTE, PIANISSIMO, FORTISSIMO, 
MEZZO_PIANO, PIANISSIMO, FORTE, MEZZO_PIANO,FORTE, FORTISSIMO}; 

//rhythm array with constants defined for rhythm values: ex. = 110 
double rhythmArray[11] {EN, SN, SN, EN, QN, EN, EN, EN, TSN,TSN, SN}; 


for(int i=0; i<11; i++) 
{ 

    UInt32 noteOnCommand = kMidiMessage_NoteOn << 4 | midiChannelInUse; 


     std::cout<< "The current pitch is: " 
       <<pitchArray[i] << "The velocity is: " <<velocityArray[i] 
       << " and the rhythmic value is: "<<rhythmArray[i]<< "\n"; 

     MusicDeviceMIDIEvent(synthUnit, 
          noteOnCommand, 
          pitchArray[i], 
          velocityArray[i], 
          0); 

     // sleep for a second 
     sleep(1); 





} 
return 0; 
} 
+1

정확히 예상되는 일이 무엇인지 명확히 할 수 있습니까? 그런 다음 정확히 무슨 일이 일어날 수 있습니까? –

답변

3

, 당신은 가능성이 처음부터 유사한 기능을 만들려고보다가 MusicPlayer 내장하여 더 많은 진전을 이룰 것입니다. 개발자가 여러 MusicTracksMusicSequences을 즉석에서 만들고 추적 및 메모 속성을 변경하고 .mid 파일을 저장하는 매우 유연한 프레임 워크입니다. 끝점은 사운드 폰을 사용하는 MIDI 장치 또는 AUGraph 일 수 있습니다.

+0

감사합니다. 내가 찾고 있던 바로 그거야! –

0

MusicDeviceMIDIEvent의 마지막 인수는 샘플의 시간 오프셋입니다. 따라서 샘플 속도가 44.1k라면 초당 44,100 개의 샘플을 갖게됩니다. 이것은 두 개의 연속 된 음표를 1 초 간격으로 연주하려면이 방법을 4 번 호출하는 것입니다. 처음에는 시간 : 0, 그 다음에 메모를 털어 놓고, 그 다음에 44,100을 기록한 다음 메모를 둡니다.