0

マウスカーソルの位置に基づいて連続音を再生する、テルミンのようなプログラムを作成しようとしています。これを行うために、Carl Franklin のMIDI Toolsライブラリを使用しています。

これは、ノートを再生するために使用しているコード スニペットです。

byte pitch = 0;
while (exit == false)
{
    byte newpitch = (byte)(32 + ((float)Cursor.Position.X / (float)SystemParameters.PrimaryScreenWidth) * 64);

    if (newpitch != pitch)
    {
        instrument.StopNote(pitch,0);
        instrument.PlayNote(newpitch, 53);
        pitch = newpitch;
    }
};

問題は、このように演奏されるノートがはっきりと聞こえることです。ある音から別の音への明確な移行があります。

ピッチを連続的にシフトするテルミンのような連続音を再生するにはどうすればよいですか?

4

3 に答える 3

2

この問題は MIDI とはほとんど関係がなく、サウンドを生成するシンセサイザーと関係があります。

現在の実装で 1 つのノートから次のノートにスムーズに移行するには、ポルタメントの多いシンセ パッチが必要です。初期化時に CC37 を 127 に設定すると、多くのパッチでこれを機能させることができる場合があります。

理想的には、完全に滑らかにするには、1 ステップ以上のピッチ ベンドを解釈するシンセ パッチが必要です。繰り返しますが、これは送信する値とは関係ありません。それらは何があっても14ビットになります。これらの値がどれだけ上下するかは、シンセ次第です。

シンセによっては、ピッチ ベンド感度の RPN を使用してピッチ ベンド範囲を調整できます。ここでそれについて読むことができます: http://www.hoofjaw.com/forums/Topic946-32-1.aspx#bm1254

またはこちら: http://www.philrees.co.uk/nrpnq.htm

于 2011-06-24T13:39:51.560 に答える
2

これは、MIDI ピッチ ホイール変更イベントで実行できるはずです。

  • 最初のバイトは 0xE0 + MIDI チャンネル番号 (0 はチャンネル 1 を意味します)
  • 2 バイト目と 3 バイト目は、ピッチホイールの変更値です。0x2000 は中間を意味し、0x4000 は最大値です (多くの場合、+2 半音と解釈されますが、シーケンサーはこのメッセージで好きなことを行うことができます)。

内部的には、Carl がmidiOutShortMsgを使用してメッセージを送信し、DWORD に変換された 3 バイトを取得する可能性があります。ピッチホイール変更送信機能がない場合、DWORD を直接送信できるメソッドを公開している可能性があります。

トップビットは各ピッチシフト値バイトで使用されないことに注意する必要があるため、ピッチ値を整数として持っている場合、次のような短いメッセージに変換されます:

 int pitch = 0x2000; // no pitch change
 byte byte2 = (byte)(pitch & 0x7f));
 byte byte3 = (byte)((pitch >> 7)& 0x7f));
 int shortMessage = 0xE0 + (channelNumber - 1) + (byte2 << 8) + (byte3 << 16);
于 2011-06-24T13:55:48.520 に答える
1

随分前のことですが、MIDI にはピッチ シフトを表す機能があることを覚えています。たとえば、MIDI コントローラー (シンセまたはキーボード) のピッチ ベンド ホイールを回すと、MIDI 経由で送信されます。このタイプのメッセージを使用して、連続して再生されるノートのピッチを変更することを検討できます。

于 2011-06-24T06:20:46.480 に答える