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)];
}
:
여기에 코드의 관련 부분입니다.
아이디어가 있으십니까?