チュートリアル23:
テスト 4 - 演奏の模倣

模倣の作成

今までの章で、 MIDI キーボードで演奏されたノートをトランスポーズ(移調)する方法や、ディレイさせる方法について見てきました。演奏したノートを、異なるノートから始めて模倣するような、あなた自身のパッチを作ってみて下さい。

1. 演奏の3秒後に完全5度上にトランスポーズされたノートで模倣し、6秒後に1オクターブ上にトランスポーズされたノートで模倣するパッチを作成しなさい。

ヒント

MIDI キーボード で演奏されたノートは、2つの別々な場所へ送信しなければなりません。そのうちの1ヶ所では、ピッチは 7半音上にトランスポーズされ、全てのノートのデータは 3000ミリ秒ディレイされます。もう1ヶ所では、ピッチは 12半音上にトランスポーズされ、ノートのデータは6000ミリ秒ディレイされます。

それぞれの模倣では、1つの pipe オブジェクトを使用して、ベロシティとピッチのデータをいっしょにディレイしなければなりません。

・パッチャーウィンドウ を右にスクロールして、パッチ1と書かれた問題の解答を見て下さい。+ オブジェクトと pipe オブジェクトの順番を逆にすることが可能である点に注意して下さい。トランスポーズはディレイの後に置くことができます。

ユーザが新しいディレイタイムを書き込めるようにする。

演習はやさしすぎたかもしれません。もう少し難しくしてみましょう。

2. パッチ1では、メロディーのそれぞれの模倣は、その前の模倣の3秒後に始まります。模倣している間にユーザが新しいディレイタイムを書き込むことができるようなパッチ1の新しいバージョンを作成しなさい。

これは2つの潜在的な問題を提起します。

・ユーザが -1000 や 3600000 といったような、とんでもないディレイタイムを書きこんだ場合はどうなるでしょう。

・ユーザが鍵盤を押す時間より短いディレイタイムを書き込んだらどうなるでしょう?また、ノートオフがノートオンよりも短いディレイを与えられ、ノートオンの前にノートオフが演奏されたらどうなるでしょう?

これらの問題は、あなたのプログラムを誤動作や期待しない結果から守るために、考慮しておかなければならない、ある種の極端な、またはありそうもないケースを示しています。

潜在的な問題の取り扱い

pipe オブジェクトは負のディレイタイムを 0にしてしまうため、負のディレイタイムの問題はそれほど深刻なものではありません。一方、極端に大きいディレイタイムに関する問題はより深刻です。

ディレイタイムが非常に長く、数多くのノートを演奏した場合、格納されたノートの数によっては、pipe オブジェクトのメモリ不足を引き起こすかもしれません。これにより、ノートが失われ、コンピューターのクラッシュを引き起こすことも考えられます。

この問題を取り扱うために、、ユーザが書き込むディレイタイムの数値を制限し、それが適切な数値である場合にのみpipe オブジェクトに送信するという方法があります。split オブジェクトや hslider オブジェクトを使用して、0から15000の間に数値を制限して下さい。

ノートオンの前にノートオフが演奏されてしまうという問題は、シンセサイザのキーを押す時間より短いディレイタイムをユーザが書き込んだ場合に生じます。その結果、シンセサイザ上のノートは鳴り止まなくなるでしょう。

1つの解決法は新しいディレイタイムが書き込まれる毎に、それを前のディレイタイムと比較することです。新しいディレイタイムのほうが小さい場合、シンセサイザ上で押されているピッチに対するノートオフを pipeに送信します。そのためには、ノート情報を pipe オブジェクトに送信する前に flush オブジェクトを通過させておく必要があります。またディレイタイムを比較し、書き込まれたディレイタイムの方が小さい場合、 flush オブジェクトに bang メッセージを送信する必要があります。

演習 2 の解答

・ パッチャーウィンドウを右にスクロールして、パッチ2を見て下さい。これが演習の解答です。

注:パッチ2は MIDI チャンネル2のみ受信するように設定されているため、パッチ1を試している間は演奏できません。パッチ2を聞くためには、MIDI キーボードがMIDI チャンネル2で送信するように設定して下さい。

ここでは、key オブジェクトと numkey オブジェクトの組み合わせを使って、コンピュータのキーボードでタイプされた数値を取得しています。タイプされた数値は split オブジェクトに送信され、0より小さいか、15000より大きい数の場合には Max ウィンドウにエラーメッセージを出力するようにしています。


不適切な数値によってエラーメッセージが出力されます。

書き込まれたディレイタイムは最初に関係演算子 < に送られ、現在のディレイタイムと比較されます。現在のディレイタイムより小さい場合、flush オブジェクトに bang が送信され、これによって MIDI キーボードで押し下げられたままになっているキーのノートに対するノートオフが送信されます。

その後、新しいディレイタイムは < の右インレットに送信され、現在の値として格納されます。また、このディレイタイムは2つの pipe オブジェクト の右インレットにも送信されます。右の pipeに送信する前にこの値が2倍にされている点に注意して下さい。これによって、右の pipe のディレイタイムは左の pipe の2倍になっています。

新しいディレイタイムが現在のものより小さい場合、ディレイタイムが変更される前に、押されたままになっているノートはフラッシュされます。

まとめ

ディレイとトランスポーズを組み合わせて、模倣を行なうパッチを作成することができます。

常に、望ましくない結果について考慮して下さい。例えば、ユーザに値を入力するよう促す場合には、その値を使用する前に、それが有効な値であるかどうかを確認するチェックを行なって下さい(無効な数値を受信した場合にエラーメッセージを出力したり、有効な数値に変更したりすることができます)。ノートのデータを処理する場合は、常に、ノートオンがノートオフ・メッセージを伴うことを確認して下さい。