MIDI: перекрестное затухание через сообщение громкости канала? - PullRequest
1 голос
/ 01 января 2012

Использование FM8.

Я хочу сыграть на флейте на канале 2 на громкости 0 и орган на канале 3 на полной громкости.Затем я хочу постепенно уменьшить громкость органа и увеличить громкость флейты.

Проблема в том, что я вообще не слышу повышение звука флейты, а только снижение громкости органа.

Возможно, я неправильно понимаю что-то очень фундаментальное в MIDI?

Я возился со значением 'MUTE' ниже, заменив 0 на 1 (опасаясь, что 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)];
}

Я использую Отличный образец кода Пита Гудлиффа в качестве отправной точки.

Есть идеи?

1 Ответ

1 голос
/ 29 марта 2014
    ,   MIDIStatusBytesNotOn + FLUTE_CHANNEL, baseNote+M4th,            MUTE

Если я не ошибаюсь, вы отправляете NoteOn с 0 скоростью.Обычно это означает NoteOff в соответствии со спецификацией MIDI.То, что вы хотите, это установить значение контроллера громкости канала на 0 до выдачи NoteOn с конечной скоростью.Обратите внимание, параметр скорости говорит о том, как сильно вы нажимаете клавишу.Все остальное должно быть сделано либо после касания (нажатие канала / нажатие клавиши), либо с помощью контроллеров, таких как выражение.

Вы можете сравнить ситуацию с замиранием между звуковыми дорожками: Velocity говорит что-то о громкости записанной ноты, агромкость канала - это значение ползунка, который вы используете во время фейдера.

Редактировать: я упустил из виду, что вы определили MUTE равным 1. Но это не меняет общего обсуждения;это (почти) неуслышанная нота, которая не станет намного громче из-за сообщений громкости канала.

...