チュートリアル35:
seq と follow

seq

Max には、 MIDI 演奏のレコーディングとプレイバックを行なう、seq followmtr detonate という4つのオブジェクトがあります。チュートリアルのこの章では、基本的なシーケンサ・オブジェクト seq によってMIDI データの1つのトラックをレコーディングする方法について、さらに、follow を用いて演奏者の演奏を追従し、ライブ演奏とすでにレコーディングされている演奏を比較する方法について述べます。

seq オブジェクトは midiinmidiout と連携して、生の MIDI データのレコーディング、プレイバックを行ないます。seq は、stopstartrecord といった様々なテキストメッセージを理解し、それによる操作をコントロールします。

パッチ1には、上に示したような seq を使用する場合の基本的な構成があり、さらにいくつかの便利なメッセージが追加されています。

・パッチ1の record と書かれたメッセージボックスをクリックして下さい。MIDI キーボードでノート、ピッチベンド、モジュレーションを演奏して下さい。start をクリックしてプレイバックされる演奏を聴いて下さい(start はプレイバックする前に自動的にレコーダを停止するため、start の前に stop をクリックする必要はありません)。

seq への record メッセージの送信と正確に同じタイミングで演奏を始めたわけではないため、おそらく、実際に演奏が聞こえるまでには間があいてしまっているでしょう。delay メッセージを使って、シーケンスの開始地点を変更することができます。

delay 0 と書かれたメッセージボックスをクリックしてシーケンスの開始地点を0に設定して下さい。再び start をクリックすると、シーケンスは直ちに演奏を開始します。

start メッセージの後に数値アーギュメントを続けることによって、シーケンスをプレイバックするスピードを指定できます。start のアーギュメントを1024で割った値が、テンポの増減を行なうための係数になります。そのため、例えば、メッセージ start 1024 はオリジナル(レコーディング時)のテンポを表し、メッセージ start 1536 はシーケンスを 1.5 倍の速さでプレイバック、start 512 は半分の速さでプレイバックします。それ以外の場合も同様です。

パッチ1の左上隅では、テンポの比を計算する方法を工夫し、1 を通常のテンポとして、テンポを乗算によって指定できるようになっています。

・ナンバーボックス をドラッグし、テンポの係数を選んで下さい(マウスで小数点の右側をドラッグすることによって、小数点以下の部分を変更することができます)。その後、buttonをクリックし、新しいテンポでシーケンスをプレイバックして下さい。

この方法によるプレイバックスピードの変更では、実際には、シーケンス内でレコーディングされた時間は変更しません。これは、単に seq オブジェクトが読む通すスピードを変えたに過ぎません。hook という別のメッセージ(ここでは示していません)では、シーケンス内の時間を変更します。詳細は Maxリファレンスマニュアルのseq を参照して下さい。

ファイルの保存と呼び出し

必要であれば、レコーディングしたシーケンスを別のファイルに保存し、後で使用することができます。seq にwrite メッセージを送ると、シーケンスを保存しておきたいファイルに名前を付けるために、標準の Save As ダイアログボックスが開きます。パッチャーファイルやテーブルファイルと区別するために、シーケンスファイルの名前に固有の特徴を与えておくのも良いかもしれません。(ここでは、ファイルがミュージカルスコアであることを識別できるように、名前の最後に .sc を使っています)。

訳注:このバージョンのチュートリアルでは、使用されるファイル名はbourree.sc から bourree-sc.txt に変更されています。Windows での拡張子の問題などを考慮してのことと思われます。

ファイルを保存する際に、ダイアログボックスで Save As Text をチェックした場合、File メニューから Open As Text... を選ぶことによってシーケンスをテキストウィンドウ上で見ることができます。そうでない場合、ファイルは標準MIDI ファイルとして保存されます。

保存したファイルを seq オブジェクトに読み込むためには、 seqread メッセージを送信します。標準オープンドキュメント・ダイアログボックス表示され、ロードしたいファイルを選択することができます。read メッセージの後にアーギュメントとしてファイル名を続けると、(Max が見つけることができる場所にファイルが置かれてある場合には)seq はそのファイルを自動的にロードします。

read bourree.sc と書かれたメッセージボックスをクリックし、バッハの E マイナーのブーレから抜粋したメロディをロードして下さい。seq オブジェクトに start メッセージを送信し、そのメロディを聴いて下さい。

MIDI シーケンスの処理

seq の出力は MIDI メッセージの個々のバイトの形になっていて、midiout によって直接シンセサイザに送信することができますが、 midiparse オブジェクトに送信し、データを分析して、他のMax オブジェクトによって処理を行なってからシンセサイザへ送信することも可能です。

patcher transpose オブジェクトの中では、seq から受信した生の MIDI データを分析し、ノートのピッチを一定量トランスポーズします。その後、MIDI メッセージを再フォーマットして、それを midiout に送ります。

patcher transpose オブジェクトをダブルクリックし、その中を見て下さい。

patcher transpose というサブパッチには、ネストされた(入れ子になった)サブパッチ、 notetransposer パッチが含まれています。これはチュートリアル 27で作成したものです。サブパッチはこのようにネストしておくことによって、パッチのタスクをカプセル化し、修正を容易にすることができます(このテーマに関する詳細は、 このマニュアルの「カプセル化」を参照して下さい)。

訳注:Max トピックスマニュアルの「カプセル化」(Encapsulation)を参照して下さい

patcher transposeサブパッチの中に、さらに便利な機能を追加している点に注意して下さい。flush オブジェクトは、オンのままになってしまっているノートをオフにするためにあります。シーケンスが演奏されている間にseqstop メッセージによって停止された場合、おそらく、停止はノートの演奏の途中で生じてしまうでしょう。そして、このノートに対するノートオフ・メッセージは送信されません。

パッチ 1 では、stop メッセージが、buttonのトリガも同時に行なうようにして、サブパッチ内の flush オブジェクトに bang を送信しています。

一般的に、パッチは、ノートのレコーディングやプレイバックの最中でも seq を停止させる力を持っているため、有効なノートオフ・メッセージが失われてしまう可能性があります。これは、特にパッチの中で stoprecordplay といったメッセージが、自動的な手段によって生成され、送信される場合にあてはまります。パッチを構築する場合、この潜在的な危険性を常に考慮し、flushmidiflushpolymakenote といったようなオブジェクトの中から適切なものを選んで、失われたノートオフを提供するようにして下さい。チュートリアル 13 でその例を示しています。

・シーケンスをレコーディング(あるいはブーレの抜粋を使用)して下さい。start メッセージでシーケンスをプレイバックして下さい。hslider オブジェクトを用いて、プレイバック中にトランスポーズの設定を変更してみて下さい。

follow

follow オブジェクトは MIDI データをレコーディングする機能を持つ点で seq オブジェクトに非常によく似ています。しかし、seq が MIDI メッセージをレコーディングするだけであるのに対し、followは 完全なMIDI メッセージではない単体の数値のシーケンス(例えば、MIDI ノートオンのピッチ情報)を記録することもできます。


follow は MIDI メッセージ、あるいは数値(例えば、ノートオンのピッチのみ)をレコーディングできます。

follow にシーケンスを格納する方法として、MIDI データのレコーディング、単体の数値のシリーズの記録、read メッセージによるファイルの読み込み、アーギュメントとしてファイル名を指定することによるファイルの読み込みがあります。シーケンスが格納されると、follow はそれをミュージカルスコアとして使用し、奏者が音楽演奏を行なっている間、演奏を追従することができます。奏者が、格納されたシーケンスの次のノートオンと合致したピッチを演奏する毎に、follow はそのピッチを右アウトレットから出力し、そのノートのシーケンス上の位置を表すインデックス(1、2、3、等)を左アウトレットから出力します。

この「スコアを追従する」という特別な機能は、インデックスナンバーを使って他のノートや、他の処理(例えば、15 番目のノートと合致したときに metro をオンにする等)をトリガする場合などに役に立ちます。

follow が追従する方法

followは、数値アーギュメントを伴った follow メッセージを受信すると、入力されるピッチから、スコア内部のノートと合致するものを探し始めます。スコア内部のノートは、アーギュメントで指定されたインデックスから始められます。例えば follow 10 が与えられた場合、このオブジェクトは、入力されるピッチから、スコアの10番目のノートと合致するものを探します。合致するピッチを受信した場合、follow オブジェクトは右アウトレットからそのピッチを、左アウトレットからはインデックスを送信します。

follow オブジェクトは、ノートの間違いも見越しているため、演奏者が2つまでの間違ったノートを演奏した場合や、1 つ、または2つのノートをスキップした場合でも、スコアを通して演奏者の進行を追跡し続けることができます。

next メッセージを用いてスコアを繰り返し読み通すこともできます。follow メッセージを受信した後、メッセージ next は指定されたインデックスのピッチをトリガし、次のインデックスへとポインタを進めます。

注意深い伴奏者

follow オブジェクトの左アウトレットからのインデックスナンバーを、table のアドレスや、funbuffのような他の配列オブジェクトのアドレスとして使用すれば、インデックスナンバーによって他の値をトリガすることができます。この方法によって、「スコアを理解」して、演奏者に追従する伴奏者を作ることができます。演奏者がスコアのノートを演奏するごとに、伴奏者は、同時に1つまたは複数のノートを演奏する、他の独立したメロディを演奏する、休止する、等のような特定のリアクションを行ない、これによって演奏者に追従しているように見えます。

パッチ2 には、このような伴奏者が作ってあります。伴奏者は、バッハの E マイナーのブーレの右手パートが演奏されると、その左手パートを演奏します。follow オブジェクトには bourree.sc というシーケンスファイルがロードされていて、これがスコアとして使用されます。スコアの音が演奏されるごとに、インデックスナンバーが送信され、何らかのリアクションをトリガします。

follow 0 メッセージをクリックして、スコア・フォロワーをスコアの始めからスタートさせて下さい 。ブーレの抜粋の右手パートを演奏すると、パッチ 2 が演奏に追従して左手パートを演奏します。

・メロディーを忘れてしまった場合には、パッチ1の seq オブジェクトにbourree.sc によるシーケンスを読み込ませ、それを聴いて下さい。

・再び follow 0 をクリックし、時々ノートを間違えたり、飛ばしたりしながらメロディーを演奏して下さい。それほど滅茶苦茶な演奏でなければ、follow はミスを処理して、スコアを読み続けます。

・フレーズの最後をリタルダンドさせて、再びメロディーを演奏して下さい。伴奏者が演奏するノートはそのテンポに追従します。

パッチ 2 の分析

左手には、右手と同時に演奏して欲しい場合や、何もしないでいて欲しい場合(左手が4分音符を演奏している間に、右手が8分音符のペアの2番目を演奏する場合)、また、時には右手で演奏されるノートの間で演奏して欲しい場合があります。このような、それぞれのリアクションはどのようにして行なえば良いでしょうか?

インデックスナンバーは最初に patcher silencerと呼ばれるサブパッチに送信されます。このサブパッチは、インデックスナンバーにフィルタをかけ、伴奏のノートをトリガして欲しくないものを除去するだけのものです。sel オブジェクトはこれらのインデックスナンバーを選択し、残りを通過させます。


patcher silencer サブパッチの内容

sel オブジェクトの連結によって、10 以上の数値が選択できる点に注意して下さい。ここでは、最初の sel オブジェクトに合致しなかった数値は、最も右のアウトレットから2番目の sel オブジェクトに渡されます。

残りのインデックスナンバーは funbuffにアドレスとして送信され、適切な伴奏のピッチ値が出力されます。正しく応答する funbuff オブジェクトを作成するためには、単にアドレスと値のリストを作り、それをbourree-fb.txt という名前の funbuff ファイルとして保存するだけです。

funbuff オブジェクトの内容が見たい場合には、File メニューから Open As Text... を選び、bourree-fb.txt という名前のファイルを開いて下さい。

伴奏のピッチを table、あるいは coll オブジェクトに格納することもできます。coll オブジェクトについてはチュートリアル37で説明します。

これまで、メロディノートと同時にノートを演奏する伴奏者、および、伴奏のないメロディノートでは休止する伴奏者を作ってきました。それでは、メロディノートの間で、自分自身でノートを演奏できる伴奏者を作る場合には、どのようにしたら良いでしょうか?そのような場所は、スコアの中のそれぞれのフレーズの終わり毎に1カ所、計2カ所あります。

伴奏者が自分自身でノートを演奏できるようにするために、patcher addnotes オブジェクトは演奏のテンポを測定し、そのテンポ認識に基づいたディレイタイムによってノートを演奏します。


patcher addnotes サブパッチの内容

例えば、このサブパッチはメロディーの24番目と25番目の音の間の時間(8分音符のスピード)を測定し、その後、ピッチ42をトリガする前にその時間だけディレイさせます。同様に、メロディーの41番目と43番目の音の間の時間(4分音符のスピード)は、ピッチ38を送信する前のディレイタイムとして使用されます。これは演奏者のテンポを分析し、そのテンポでノートを演奏するためのシンプルな(しかしかなり効果的な)方法です。

プログラミングでは(そして、他の場合でも)、常に、予期しない事態に対して備えておくということが優れた考え方です。テンポの分析や、伴奏をトリガするために必要なノートの1つを、たまたま演奏者がミスしてしまった場合にはどうなるでしょう?

例えば、演奏者が2つの内の最初のノートをミスした場合、2番目のノートは timerから送られる極端に大きな値をトリガし、伴奏の音は非常に長い時間ディレイされることになります。このような不測の事態からの保護のために、split オブジェクトを使用して時間の値を制限し、一定の(あまり極端すぎない)限度の範囲内のディレイを送信できるようになっています。timerから送られる値がこの限度を超えた場合、delay オブジェクトはアーギュメントとして設定されているディレイタイムを使用します。演奏者が2つの内の2番目のノートをミスした後、演奏を続けている場合には、追加されるノートは演奏されませんが、演奏者はこの地点を通過してしまっているため、演奏者への追従は続けられます。

patcher addnotesからのピッチと funbuffからのピッチは makenote オブジェクトに送信され、そこで右手のメロディノートのべロシティと組み合わせられます。そのため、伴奏者は演奏者のダイナミクスも同様に感知します。伴奏ノートのデュレーションは、アルゴリズムやルックアップテーブルを使用しているわけではなく、単に、8分音符のデュレーションと、この曲のスタイルによるスタッカートの4分音符のデュレーションの両方でうまく使用できると考えられるデュレーション値を採用しているだけです。

まとめ

seq オブジェクトを用いて MIDI データのシングルトラックのレコーディングとプレイバック(任意のスピードで)を行なうことができます。MIDI データは midiinから受信され、midioutによって送信されます。また midiparse オブジェクトを使用して seq オブジェクトからのデータを分析し、その数値を他の Max オブジェクトで処理することも可能です。

レコーディングされたシーケンスは、seqwrite メッセージを送信することによって、別のファイルとして保存することができます。Save As ダイアログボックス の Save as Text オプションをチェックした場合、後で、Open As Text... を用いてファイルを開いたり、編集したりすることができます。seqread メッセージを送ることによって、あるいはファイル名をアーギュメントとして書き込むことによって、MIDI ファイルを seq の中に読み込むことができます。

follow オブジェクトはシーケンスの中へのレコーディングや読み込みを行なうことができ、その後、そのシーケンスをミュージカルスコアとして使い、ライブ演奏に追従させることができます。インレットで受け取ったピッチがスコアのノートに合致した場合、個々のノートに対するインデックスナンバーが送信されます。これは、他のノートや処理のためのトリガとして使うことができます。

参照

follow ライブ演奏とレコーディングされた演奏を比較します。
mtr マルチ・トラック・シーケンサ。
seq MIDI レコーディング、プレイバックのためのシーケンサ。
Sequencing (Max トピックス)MIDI 演奏のレコーディングとプレイバック。