2017-09-25 15 views
2

JUCE 프레임 워크를 사용하여 C++에서 약간의 도구를 만들고 있습니다. MIDI를 보내고 있지만 문제가 생겼습니다. DAW에 코드를 보내고 메시지에 노트를 보내고 노트 오프 메시지를 보내고 싶습니다. noteOn 코드는 다음과 같습니다JUCE 프레임 워크에서 midi note on과 note off 메시지 사이의 지연

 void MainContentComponent::handleNoteOn (MidiKeyboardState*, int 
     midiChannel, int midiNoteNumber, float velocity) 
     { 
      timestamp = (Time::getMillisecondCounterHiRes() * 0.001); 
      MidiMessage m (MidiMessage::noteOn (midiChannel, midiNoteNumber , velocity)); 
      MidiMessage m2 (MidiMessage::noteOn (midiChannel, midiNoteNumber + 3, velocity)); 
      MidiMessage m3 (MidiMessage::noteOn (midiChannel, midiNoteNumber + 7, velocity)); 
      m.setTimeStamp (timestamp); 
      m2.setTimeStamp (timestamp); 
      m3.setTimeStamp (timestamp); 
      sendToOutputs (m); 
      sendToOutputs (m2); 
      sendToOutputs (m3); 

      handleNoteOff(midiChannel, midiNoteNumber, velocity) 
     } 

문제는, 노트 오프 메시지가 메시지에 메모 한 후 바로 다음 있음. 음표 켜기와 음표 켜기 사이에 지연이 필요합니다. 그 방법에 대한 아이디어가 있습니까? 지연 옵션에 대해 생각하고 있었지만, 전체 프로그램을 동결시킬 것입니다. JUCE는 나에게 도움이 될만한 것을 가지고 있습니까? 온라인에서 찾을 수 없었습니다.

답변

3

JUCE의 Tutorial: The MidiMessage class이 지연 메시지를 보내는 방법을 보여줍니다

MidiBuffer 클래스는 자신의 타임 스탬프에 따라 MIDI 메시지 버퍼 반복에 대한 기능을 제공합니다. 이것을 설명하기 위해 우리는 MidiMessage 객체를 특정 타임 스탬프와 함께 MidiBuffer 객체에 추가하는 간단한 스케줄링 시스템을 설정할 것입니다. 그런 다음 우리는 어떤 MIDI 메시지가 배달 될 것인지 정기적으로 검사하는 Timer 개체를 사용합니다.

Timer 클래스를 경고

고정밀 타이밍에 적합하지 않습니다. 이것은 메시지 스레드에서 모든 함수 호출을 유지함으로써 예제를 단순하게 유지하는 데 사용됩니다. 보다 견고한 타이밍을 위해서는 다른 스레드를 사용해야합니다 (대부분의 경우 오디오 스레드는 오디오에 MidiBuffer 객체를 렌더링하는 데 적합합니다).

+0

당신은 영웅입니다. 이것을 놓쳐 버렸을 것입니다. 고마워요! – Jurze