2012-01-01 1 views
1

FM8を使用しています。MIDI:チャンネルボリュームメッセージによるクロスフェード?

フルートは、ボリューム2のチャンネル2とフルボリュームのチャンネル3のオルガンで再生したいです。 その後、臓器のボリュームを徐々に減らし、フルートのボリュームを上げたいと思います。

問題は、フルートの音がまったく聞こえないのですが、オルガンの音量だけが下がってしまうことです。

MIDIに関して非常に基本的なことを誤解している可能性がありますか?

私は、0を1に置き換えて(以下、「ノートオフ」という何らかの種類として解釈される可能性があります)、無駄に「MUTE」の値を変更しました。ここで

はコードの関連部分です:

#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 

私が0速度でNoteOnを送信していると誤解されていない場合。これは通常、MIDI仕様に従ってNoteOffを意味します。あなたが望むのは、最終速度でNoteOnを発行する前に、チャンネルボリュームのコントローラー値を0に設定することです。 velocityパラメータは、キーをどれだけ強く打つかを示します。アフタータッチ(チャンネル圧力/キープレッシャー)か、表現のようなコントローラーを使用して、他のすべてを行う必要があります。

オーディオトラック間のフェードを比較することができます。ベロシティはノートの録音音量を示し、チャンネル音量はフェードを実行中に使用しているスライダの値です。

編集:MUTEを1と定義していることを見落としましたが、一般的な説明は変更されません。チャンネルの音量の大きさによってはそれほど大きくならないほどの(ほとんど)聞こえない音符です。

関連する問題