/**/

チュートリアル 28:
オーディオによるビデオのコントロール

コントロールソースとしてのオーディオ

このチュートリアルでは、MSPオーディオシグナルの振幅をトラッキング(追跡)する方法、トラッキングされた振幅を使って、サウンド内の離散的なイベントを検出する方法、そして、その情報をイメージのトリガやビデオ効果のコントロールに適用する方法について説明します。

・Jitter Tutoriaフォルダの28jAudioControl.patというチュートリアルパッチを開いて下さい。

パッチの右上隅では、コンピュータのオーディオ入力、または録音済みのサウンドファイルという2つのオーディオソースを簡単に試してみることができるようになっています。

訳注:原文では「video source」となっていますが、内容や下の図の説明からみて「audio source」の間違いではないかと思われます。


ポップアップメニューによって2つのオーディオソース 
adc~またはsfplay~)のどちらかを選べるようになっています

このパッチでは、loadbang オブジェクト(パッチの上部中央)によってtalk.aiffというAIFF サウンドファイル、および dishes.mov という QuickTimeムービーを開き、ユーザインターフェイスオブジェクトの設定を preset によって初期化しています。そのため、上の例では ubumenu はすでにサウンドソースとして sfplay~オブジェクトを選択した状態になっていて、open talk.aiff というメッセージによってすでにサウンドファイルが開かれています。また、sfplay~ の速さは1に、アウトプットボリュームは0.5に設定されています。サウンドソースの左チャンネル(左の selector~ オブジェクトの左アウトレット)はパッチの他の部分に接続されていますが、この部分でサウンド振幅のトラッキングが行われます。

オーディオシグナルのピーク振幅のトラッキング

サウンドの振幅をMaxのコントロール用データとしてトラッキングするためには、サウンドの瞬間的な振幅を取得する snapshot~ オブジェクト、最後にチェックした時点からの振幅の平均値を取得する avg~ オブジェクト、最後にチェックした時点からのシグナルのピーク振幅値を取得する peakamp~ オブジェクトを利用することができます。ここでは、peakamp~ によってシグナルのピーク振幅をトラッキングすることを選択しました。peakamp~ は、bang メッセージを受信するたびに左インレットで受け取ったシグナルのピーク振幅の絶対値を出力します。またその代わりとして、下の例のようにゼロでないインターバル時間(ミリ秒単位)を右インレットに送信することによって、自動的に規則正しくピーク振幅値を出力するようにセットすることもできます。


右インレットへの非ゼロの値は、ミリ秒単位での出力のインターバル時間になります

peakamp~ は、10ミリ秒ごとに、前の送信から現在までの間のピークシグナル振幅値を送信します。ここでは、peakamp~ オブジェクトのタイマをオフにし、ビデオディスプレイレートをコントロールする metro を使って peakamp~ bang を送るというオプションも用意しています。しかし、peakamp~ に内臓されている時間調節の機能を使った場合には、オーディオのトラッキングタイムをビデオディスプレイレートと独立して設定することができます。

デシベルの使用

私たちが実際に音の強さとして知覚するのは、その振幅の線形な関数としてではなく、実はデシベル(dBと省略されます)で表わされる振幅の相対レベルの関数によっています。このことは、私たちが聞くことができるMSPからのサウンドの音圧レベルの半分以上は線形振幅の最も小さい1%、範囲としては0と0.01!の間に存在するということを意味しています。こういった理由から、多くの場合、サウンドレベルを線的な振幅値としてではなく対数のデシベル尺度で扱う方がより適切です。そこで、ここでは p AtoB サブパッチ(MSPチュートリアル4で用いられている AtodB サブパッチと同じものです)を用いて振幅値をデシベルに変換しています


[AtodB]サブパッチの内容

[AtoB]サブパッチは peakamp~ が出力したピーク振幅値を受け取り、デシベルに変換します。振幅1は0dBになり、それより小さな振幅値は負のデシベル値になります。


振幅値を、リファレンス振幅値1に対する比によるデシベル値に変換します

技術的な詳細:振幅をデシベルに変換する式は次のようなものです。

この式で、A0はリファレンス振幅値、Aは測定された振幅値を表わしています。デシベルスケール(尺度)に関しては、MSPマニュアルの「ディジタルオーディオ」および「チュートリアル 4 」セクションに説明があります。

振幅範囲のフォーカシング

レコーディングやライブオーディオにおける多くの状況下では、実際にはアナライズ(分析)しようとするサウンドの一部とは考えられないような非常に低いレベルのごくわずかなサウンドが存在します。実際に私たちが注意をはらうべきサウンドは、MSPがカバーするデシベル範囲の一定の部分だけを使用しているとも考えられます。(レコーディングにおける一部のケースでは、特別なエフェクトを行うために、音楽を非常に小さなレンジに圧縮することがあります。多くの圧縮されないレコーディングにおいてさえ、最も重要なサウンドは小さなダイナミック・レンジに収まると考えられます。)不必要な弱い音のレベルのことを「ノイズフロア」と呼びます。もしノイズフロアより上にあるサウンドだけをアナライズできるのなら好都合です。

patcher dBexpander サブパッチによって、トラッキングを行う振幅値のdBレベルのコントロール、そして、シグナルを無視したい位置へのノイズフロア・スレッショルド(閾値)の設定を行うことができます。このサブパッチは、私たちが処理したいレベルを取得し、0dBから下限は -120dBまでのデシベルスケールのフルレンジに拡大します。下の例では、ノイズフロア・スレッショルドを -36dBに設定しています。この瞬間のMSPシグナルの振幅は0.251189で、これは -12dBにあたります。サブパッチはこのレベル(もともとは0から-36までの範囲での -12の値)を拡大し、レベルは0〜-120までの範囲での相当する値になります。結果としてレベルは -40dBになり、これがサブパッチの右アウトレットから送信されます。サブパッチに入力されたレベルとノイズフロアとの比は、Jitterにとって実用的なコントロールレンジである0〜1の範囲の値で表わされ、左アウトレットから出力されます。この例では、入力レベルは-12dBでノイズフロアより24dB大きい値であるため、指定された36dbの範囲の最大値の2/3にあたります。


-36dBより上の範囲のリニアな振幅値をフルレンジに変換します

・この値はJitterのコントロールデータとして適用できます。Use Display Framerate と表示された toggle をオンにして下さい。これによって、一時的に peakamp~ の内部タイマはオフになり、その代わりに metro からの bang メッセージが使用されます。Audio On/Off と表示された toggle をオンにして、MSPのオーディオプロセッシングをスタートさせて下さい。 sfplay~ オブジェクトの上にある、1という数字が書かれたメッセージボックスをクリックして、サウンドファイルの再生をスタートさせて下さい。Display Movieと表示された toggle をオンにして、ビデオの再生をスタートさせて下さい。オーディオのピーク振幅はムービーのマトリックスが表示されるのと同じ速さ(25ミリ秒毎)に出力されます。トラッキングされたデシベルレベル(毎秒40個の値)は、expanded levelと表示されたグリーンと黒の multiSlider に表示されます。このレベル(0〜1の範囲にマッピングされています)は jit.opオブジェクトの val アトリビュートとして利用され、表示されるビデオに対して作用します。Effect Strengthと表示されたナンバーボックスによって、この値の範囲を拡大または縮小することができます。0.5 〜 1.5の範囲の値が、映像に対して最も効果を及ぼします。

オーディオイベントの検出

前のセクションでは、サウンドの振幅エンベロープをトラッキングし、ビデオフレームごとの新しいコントロール値を得るためにそのピーク振幅値を使用しました。サウンドの個々のイベント(楽曲の中の音符、話されるテキストの単語など)のリズムをトラッキングするという、また違った構造レベルの分析をすることも可能です。これを行うためには、振幅が一定のスレッショルドを超えて増加する場合、これをサウンドのアタックを示すものとして検出し、さらに、そのイベントにとって充分な時間、振幅がスレッショルドを下回っている場合には、これをイベントの終了と考えて検出する必要があります。patcher detectevent サブパッチではこれを行っています。メインパッチでは、この [detectevent] サブパッチに次の3つのパラメータ、Note-on Thershold(「イベント」または「音符」として認識されるためにサウンドが超えるべきレベル)、Min. Note Duration(レベルがスレッショルド以下になる点の検出を始めるまでサブパッチが待っている時間)、Min. OffTime(レベルがスレッショルドを下回っている場合、それを音符の終わりと考えるまでの時間の長さ)を与えています。次の例では、レベルが -30dBを超えたとき「ノート(音符)」イベントが伝えられ、少なくとも25ミリ秒以上レベルが -30dBを下回っている場合にのみノートはオフになったとみなされます。サブパッチがノートオフレベルを見つけようとし始めるまでに最低50ミリ秒は待機状態にありますから、個々のノートのデュレーション(持続時間)は少なくとも75ミリ秒になります。


レベルがスレッショルド(閾値)を超え極大値に達すると、オーディオイベントが出力されます

patcher detectevent オブジェクトをダブルクリックして内容を見て下さい。


振幅値がスレッショルドを超えることによるイベント検出

サブパッチのコメントは手順を簡潔に示しています。左インレットに新しいレベル値が送られる場合、2つの条件が見たされなければなりません。それは、レベルが確実にスレッショルドより大きいこと、および、すでにノートオンの状態になっていてはいないということです。この2つの条件が共に合致する場合、振幅値が増加を止める時点(極大値)まで監視を続け、そこでノートが完全にオンでになったと判断して、右アウトレットからは値1を、左アウトレットからはピークレベルを出力します。”minimum note time” の間待機した後、 gate を開いてレベルがスレッショルド以下になる徴候(> オブジェクトから出力)を探し始めます。ひとたびこのようなレベルが検出されると、これがノートオフであると判断するまで、”minimum off time” で示される時間だけ待機します。このminimum off time の間にスレッショルドを超えるレベルが入力された場合には、delay オブジェクトに stop メッセージが送られ、新しいノートオフレベルの検出が開始されます。ノートが本当にオフであった場合、右アウトレットから0が出力され、ノートがオフになったという事実が(== 0 オブジェクトで)感知されて gate は再び閉じられます。この状態で次にスレッショルドを超える値を受け入れる準備が整います。

・[detectevent]サブパッチウィンドウを閉じて下さい。この「イベント検出器」が頻繁に変化するサウンドに対してうまく働くためには、ピーク振幅が通常かなり速いレートでトラッキングされる必要があります。Use Display Rate と表示された toggle をオフにして下さい。こうすると、peakamp~ オブジェクトは10ミリ秒間隔の内部タイマを用います。

メインパッチでは、[detectevent]サブパッチの出力を用いる方法に関する3つのデモンストレーションを見ることができます。パッチの右下隅では、patcher detectevent の右アウトレットからの1を、ディスプレイウィンドウにランダムな色の点を表示するpatcher flashbulbs という他のサブパッチのトリガとして使用しています。また、patcher detectevent の左アウトレットから出力される値を取得し、オリジナルのオーディオレベルで行ったものと全く同じ方法でレンジを拡大しています。これによって "note amplitude" で示す値は有効範囲の全てをカバーすることができます。この値をMIDIノートのトリガとして、また様々な画像を選んで表示するトリガとしても使用しています。これらの手順について簡単に見てみましょう。

オーディオイベント情報の利用

オーディオイベントの最もシンプルな使い方は、イベントが生じた時にそれを何かのトリガとして利用することです。オーディオイベントが検出されるたびに、patcher flashbulbs サブパッチがトリガされます。このサブパッチはランダムな色の16×12のマトリックスを生成し、その後スケーリングを行ってほとんどの色を黒に変え、ほんのわずかな色付きのセルだけが残ります。マトリックスがメインパッチに出力されると、これらのセルは jit.window での補間によって高い解像度にサンプルし直され、ちょうど色付きのライトが点滅しているように見えます。それ以降の、peakamp~ から出力されるレベル値は [flashbulbs] サブパッチの中の bline オブジェクトに bang を送るために使われ、色付きの点は20個の bang メッセージで消えていきます。


[flashbulbs]サブパッチ

patcher pickpicture サブパッチでは、単にイベントの振幅値を5つの等しい範囲に分けて、その値を5つの異なった画像のうちの1つを表示するためのトリガとして利用しています。

次の例では、オーディオ情報をMIDIノートのトリガとして使用する方法を見ることができます。


ピークレベルによってMIDIノートのピッチとベロシティを決定します

ここでは、MIDIピッチとベロシティを得るために、patcher expander の右アウトレットから出力される拡張されたデシベル値を使っています。最初にその値を0から120の範囲に置き換え、その値をMIDIベロシティとして使用します。さらにそれらを96〜36の範囲にマップしてMIDIキーナンバとして使用しています。(ここでは、レンジを反転させて、より大きな値のイベントを、高い音を表わすMIDIノートではなく、低い音を表わすMIDIノートに割り当てていることに注意して下さい。これは低い音に、より音楽的な重みを与えるためです。)ノートのデュレーション(持続時間)はMin.Note Duration ナンバーボックスで設定してもよいですし、makenote のデュレーションインレットの真上にあるナンバーボックスに値を入力することによって独立して設定することもできます。

・このパッチを使ってさらにいろいろな方法で実験することができます。その中には、Rate ナンバーボックスによってオーディオファイルの速さを変えてみる、他のサウンドファイルやムービーを開いてみる、 ubumenuからSound Input を選択してライブサウンド入力を使ってみる、様々なトラッキングに関するパラメータ、例えば Reporting Interval、Noise Floor Threshold、Note-On Threshold、Min. Note Duration を変えてみる、といった方法があります。

まとめ

ここでは、peakamp~ オブジェクトを使ってサウンドのピーク振幅をトラッキング(追跡)する方法、リニアな振幅値をデシベルに変換する方法、振幅レベルが一定のスレッショルド(閾値)を超えるかどうかをチェックしてオーディオイベントを検出する方法について紹介しました。振幅値やピークイベントから得た情報を、アルゴリズミックなイメージ、あらかじめ読み込まれた画像の選択、MIDIノートの演奏、ビデオイフェクトの変更などのトリガとして使いました。