iOS で生の UInt16 値から14 ビットMIDI ピッチ ベンド値を手作業で組み立てる必要があります。誰かがエレガントな解決策を思い付く機会があったかどうか疑問に思っていますか? これが私の現在の状況です。これをテストする機会は、おそらく今日中に得られるでしょうが、それまでに連絡があれば、すばらしいことです。
まず、興味のある方のために MIDI の予備知識をいくつか。
MIDI ピッチベンドは 1 つのステータスバイトに分割され、その後に2 つのデータ バイトが続きます (これは 14 ビット コントローラーです)。MSB -> LSB
(編集: 更新、実際にはStatus -> LSB -> MSBです)
(つまり、1110 0000、0111 1111、0111 1111)
課題は、iOS で ARM/Intel 16 ビット UInt16 を 2 つの 7 ビット セグメントに分割し、それを MIDI で意味のあるものにする方法です。
ここでは符号なし整数を扱っているため、値 0 はニュートラル ピッチ ベンドではなく、フル ピッチ ダウン (ニュートラル ピッチ ベンドは 8192 と定義されています) であり、16,383 はフル ピッチ アップであることを覚えておいてください。
したがって、これを行う方法についての私の最善の推測は次のとおりです。
UInt16 msbAnd = base10ValueUInt16 & 16256; //clearing out LSB
UInt16 msbAndShift = msbAnd << 1; //shift into leading Byte, with 0 status bit
UInt16 lsbAnd = base10ValueUInt16 & 127; //isolating LSB
UInt16 finalTwoBytePitchWord = msbFinalAndShift | lsbAnd; //make UInt16 word
UInt16 finalTwoBytePitchWordFlipped = CFSwapInt16HostToBig(finalTwoBytePitchWord); //Endian tweak
このコードは正常に動作し、必要なゼロ ステータス ビットを使用して 2 つのデータ バイトを作成し、MIDI に必要と思われるリトル エンディアンの Intel/ARM から反転させているようです (MIDI は STATUS -> MSB -> LSB です): I can slap後で適切な MIDI チャンネルを使用して先頭のステータス バイトに書き込みます。
それで、これは理にかなっていますか?よりエレガントなソリューションを思いついた人はいますか? (私が見落としているライブラリはありますか?) ... 後でまたチェックインし、これが実際にターゲットにしなければならないサンプラーで実際に機能したかどうかを人々に知らせます。
ありがとう