2012-01-01 78 views
1

使用FM8。MIDI:通过通道音量消息进行交叉淡入?

我想在第0声道播放第2声道上的长笛,并且第3声道上的声音在全音量上播放。 然后我想逐渐减少器官的体积,并提高长笛的音量。

问题是我听不到笛声完全升高,但只有器官音量下降。

我可能会误解一些关于MIDI的非常基础的东西吗?

我用下面的'MUTE'替换0代替0(在担心0可能被解释为某种“注释”)而无济于事。

下面的代码的相关部分:

#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)]; 
} 

我使用Pete Goodliffe's Excellent sample code为出发点。

有什么想法?

回答

1
, MIDIStatusBytesNotOn + FLUTE_CHANNEL, baseNote+M4th,   MUTE 

如果我没有弄错你发送NoteOn 0速度。根据MIDI规范,这通常意味着NoteOff。你想要的是在用最终速度发出NoteOn之前将通道音量的控制器值设置为0。请注意,速度参数表示您按键的难度。其他一切都必须通过触后(通道压力/按键压力)或使用表情等控制器来完成。

您可以比较音轨之间的衰落情况:速度告诉记录的音量,而通道音量是执行淡入淡出时使用的滑块的值。

编辑:我忽略了你定义等于1的MUTE。但是这并没有改变一般的讨论;它是一个(几乎)难以忍受的音符,不会因频道音量消息而变得更响。

相关问题