2012-01-01 2 views
1

FM8을 사용합니다.MIDI : 채널 볼륨 메시지를 통한 크로스 페이드?

볼륨 2의 채널에서 플루트를 연주하고 채널 3의 오르간을 최대 볼륨으로 연주하고 싶습니다. 나는 점차적으로 장기의 볼륨을 줄이고 플루트의 볼륨을 높이고 싶습니다.

문제는 플루트 사운드가 전혀 들리지 않지만 오르간 볼륨 만 떨어지는 것입니다.

나는 MIDI에 대해 매우 근본적인 점을 잘못 이해하고있을 수 있습니까?

아래의 '음소거'값을 0으로 바꾸고 (0은 일종의 "메모 꺼짐"으로 해석 될 수 있음을 염두에두고) 아무 소용이 없다. 나는 출발점으로 Pete Goodliffe's Excellent sample code 사용하고

#define ORGAN 1 
#define FLUTE 2 

#define FULL 63 
#define MUTE 1 

#define BASE 0 
#define M2nd 2 
#define M3rd 4 
#define M4th 5 
#define M5th 7 

#define FLUTE_CHANNEL  2 
#define ORGAN_CHANNEL  3 

#define CHANNEL_VOLUME  7 

typedef enum { 

    MIDIStatusBytesNotOff   = 0x80 
, MIDIStatusBytesNotOn   = 0x90 
, MIDIStatusBytesAfterTouch  = 0xa0 
, MIDIStatusBytesControlChange = 0xb0 
, MIDIStatusBytesProgramChange = 0xc0 
, MIDIStatusBytesChannelPressure = 0xd0 
, MIDIStatusBytesPitchWheel  = 0xe0 

} MIDIStatusBytes ; 

- (void) sendSlowMo { 

    const UInt8 baseNote = 69 ; 
    const UInt8 start[] = { 
     MIDIStatusBytesProgramChange + FLUTE_CHANNEL,     FLUTE 
    , MIDIStatusBytesProgramChange + ORGAN_CHANNEL,     ORGAN 
    , MIDIStatusBytesNotOn + FLUTE_CHANNEL, baseNote+M4th,   MUTE 
    , MIDIStatusBytesNotOn + ORGAN_CHANNEL, baseNote+BASE,   FULL 
    } ; 

    const UInt8 stop[] = { 
     MIDIStatusBytesNotOff + FLUTE_CHANNEL, baseNote+M4th,   MUTE 
    , MIDIStatusBytesNotOff + ORGAN_CHANNEL, baseNote+BASE,   MUTE 
    , MIDIStatusBytesControlChange + FLUTE_CHANNEL, CHANNEL_VOLUME, FULL 
    , MIDIStatusBytesControlChange + ORGAN_CHANNEL, CHANNEL_VOLUME, FULL   
    } ; 

    UInt8 stepUpDown[] = { 
     MIDIStatusBytesControlChange + FLUTE_CHANNEL, CHANNEL_VOLUME, MUTE 
    , MIDIStatusBytesControlChange + ORGAN_CHANNEL, CHANNEL_VOLUME, FULL   
    } ; 

    [midi sendBytes:start size:sizeof(start)]; 

    for (int i = 1 ; i < 128 ; ++i) { 
     stepUpDown[2] = (UInt8) i ; 
     stepUpDown[5] = (UInt8) (127 - i) ; 

     [midi sendBytes:stepUpDown size:sizeof(stepUpDown)]; 
     [NSThread sleepForTimeInterval:0.10]; 
    } 

    [midi sendBytes:stop size:sizeof(stop)]; 
} 

:

여기에 코드의 관련 부분입니다.

아이디어가 있으십니까?

답변

1
, MIDIStatusBytesNotOn + FLUTE_CHANNEL, baseNote+M4th,   MUTE 

내가 0 속도로 NoteOn을 보내고 있다고 잘못 생각하지 않는다면. 이것은 일반적으로 MIDI 사양에 따라 NoteOff를 의미합니다. 원하는 것은 최종 속도로 NoteOn을 내기 전에 채널 볼륨의 컨트롤러 값을 0으로 설정하는 것입니다. velocity 매개 변수는 키를 얼마나 강하게 누르는 지 알려줍니다. 다른 모든 것은 애프터 터치 (채널 압력/키 압력) 또는 표현식과 같은 컨트롤러를 사용하여 수행해야합니다.

오디오 트랙 사이의 페이드와 상황을 비교할 수 있습니다. 벨로 시티는 음표의 녹음 된 볼륨에 대해 알려주고 채널 볼륨은 페이드를 수행하는 동안 사용중인 슬라이더의 값입니다.

편집 : MUTE를 1로 정의한 것을 간과했습니다. 그러나 일반적인 토론은 변경되지 않습니다. 채널 볼륨 메시지에 의해 더 크게되지 않는 (거의) 이해할 수없는 노트.

관련 문제