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


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

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


デシベルの使用

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


AtoBサブパッチの内容

[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.Off Time(レベルがスレッショルドを下回っている場合、それを音符の終わりと考えるまでの時間の長さ)を与えています。次の例では、レベルが-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ノートの演奏、ビデオイフェクトの変更などのトリガとして使いました。