私は 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);
}