4

私は AudioUnits に関してはかなりの初心者なので、私の質問が非常に基本的なものである場合はご容赦ください。

MusicDevice AudioUnit を使用してノートを再生しています。私は MusicDeviceMIDIEvent を使用して、ノートオンとノートオフのメッセージを送信しています。それはうまくいきます。同時に複数のノートが鳴らなければならない場合もあるため、2 つのノートオン メッセージを続けて送信することがあります。時々、これらの音符はたまたま同じピッチを持っています。次に、ノートの 1 つをオフにしたい場合は、このピッチのノートオフ イベントを送信します。しかし、このメッセージはピッチのすべてのノートをオフにします。もちろん、この振る舞いは非常に理にかなっていますが、人々が通常この問題にどのように対処しているかを尋ねたかったのです。

同時ノートには異なるチャネルを使用する必要がありますか? または、現在再生中のピッチを保持するカウントされたセットを使用して、手動でノートを管理し、ピッチの最後のインスタンスが再生を停止した後にのみノートオフ イベントを送信しますか? それともまったく別のものですか?

編集:

これは iOS 上にあるため、kAudioUnitSubType_Sampler を AudioUnit サブタイプとして使用する必要があります。ドキュメントには、このタイプがモノティンバーであるとしか記載されていませんが、今ではモノフォニックでもあるのではないかと疑っています。もちろん、これは動作を説明します。それでも、実際にポリフォニック楽器を持っていたら、これをどのように行うのだろうかと思います。

編集2:

さらにいくつかのテストを行ったところ、任意のチャネルでノートオフ メッセージを送信すると、すべてのチャネルで同じピッチのすべてのノートが停止するように思えます。http://developer.apple.com/library/ios/#samplecode/LoadPresetDemo/Introduction/Intro.htmlにあるアップルのサンプル コードを使用し、stopPlay[low/mid/high]Note メソッドを変更してノートオフを送信しました。いくつかのランダムなチャネル (知っておく必要がある場合は、それぞれチャネル 7、8、および 9) のメッセージ。ノートオン メッセージがチャネル 0 で送信されているにもかかわらず、ノートは停止します。これは予期された動作ですか?

愚かな間違いを犯していないことを確認するために、これらはノートオンおよびノー​​トオフメッセージを送信するメソッドです。

- (IBAction) startPlayLowNote:(id)sender {

    UInt32 noteNum = kLowNote;
    UInt32 onVelocity = 127;
    UInt32 noteCommand =    kMIDIMessage_NoteOn << 4 | 0;

    OSStatus result = noErr;
    require_noerr (result = MusicDeviceMIDIEvent (self.samplerUnit, noteCommand, noteNum, onVelocity, 0), logTheError);

    logTheError:
    if (result != noErr) NSLog (@"Unable to start playing the low note. Error code: %d '%.4s'\n", (int) result, (const char *)&result);
}



- (IBAction) stopPlayLowNote:(id)sender {

    //note the channel!
    UInt32 noteNum = kLowNote;
    UInt32 noteCommand =    kMIDIMessage_NoteOff << 4 | 7;

    OSStatus result = noErr;
    require_noerr (result = MusicDeviceMIDIEvent (self.samplerUnit, noteCommand, noteNum, 0, 0), logTheError);

    logTheError:
    if (result != noErr) NSLog (@"Unable to stop playing the low note. Error code: %d '%.4s'\n", (int) result, (const char *)&result);
}
4

2 に答える 2

4

同じチャンネルで同じピッチの 2 つのノート オン イベントの後のノート オフの動作は未定義であると確信しています。両方の音をオフにする楽器もあれば、一方をオフにしてもう一方をオフにするために 2 つ目の音をオフにする必要がある楽器もあります。

同じピッチの 2 つのノートを同時に使用する必要がある場合は、それらを異なるチャンネルに配置する必要があります。

投稿されたコードに関する編集

リンクでサンプル プロジェクトを試し、投稿されたコードと同じ方法でチャネルを変更しました。kAudioUnitSubType_Samplerこれは確かにモノティンバーであることが判明したため、MIDI チャンネル パラメータは無視されます。したがって、 で同じピッチの 2 つの音符を同時に使用したい場合は、kAudioUnitSubType_Sampler2 つの別個のインスタンスを作成する必要があります。

kAudioUnitSubType_Samplerモノフォニックではないことに注意してください。複数のピッチを同時に演奏できるのでポリフォニックです。

于 2012-09-24T17:34:20.807 に答える
0

MusicDevice.hMusicDeviceStartNote()との使用についてはどうMusicDeviceStopNote()ですか? ノートに一意のトークンを使用するため、同じピッチの 2 つを区別できるはずです。

于 2012-12-02T05:36:08.570 に答える