第6回 - メトロノームで時間管理

Maxは音楽をターゲットとしたプログラミングですから,タイミングの管理は非常に重要なポイントです.今回は,Maxの中で時間経過を管理するオブジェクトを中心に紹介します.

Picture 7
6_1_timing.pat.zip

サンプルとして簡単なキッチンタイマーをMaxで実装します.カップラーメンとかパスタを作るときに残り時間を表示してくれるあれですね.


まずは簡単な右上の方からみてみましょう.ここでは時間を分,秒単位で設定できるようにしてあります.分の方に60を掛けて秒の値と足してあるので,でてくる数値はトータルの秒であることがわかります.

ここで秒の下に[button]を置いてあるのはなぜでしょう? これがなかったら… やってみるとわかりますが,この[button]がなければ秒を変えても,その下のトータルの秒は変わりませんよね.これは左インレットに値がはいったときのみ計算が行われるためでした.それでは困るので,ここでは[button]を置くことで,秒を表す[Number Box]の値が変化したら,[+]オブジェクトにbangがいくようにしました.bangは「やれ!」というトリガーでしたよね.+オブジェクトにbangを送ると計算が強制的に行われます.このときに使われる左インレットの値は,直前に入力された値です(もしまだ一度も値が入力されてなければ,0).これによって,秒を変えても計算が行われるようにしているわけです.

適当な時間をセットしてください.

次に左側の説明に入る前に,今回使う新しいオブジェクトの説明をしましょう.右下の[patcher objects]をダブルクリックしてください.新しいパッチが開きましたね.これは「パッチの上のパッチ」ということで,サブパッチと呼ばれています.[patcher]オブジェクトを使うと,パッチの上に入れ子上にサブパッチをつくることができます.パッチが複雑になってきたときに,こうやってサブパッチを作ることはパッチを整理する上で非常に便利です.

patcherオブジェクトでサブパッチを入れ子状に作ることが出来る!

Picture 8-2

このサブパッチでは,4つのオブジェクトを解説しています.まずは左上,[toggle]オブジェクト. これは,クリックされるたびに値が0と1の間を移り変わるボタンです.1の時は四角の中に×がつくので視覚的に確認できます.bangを受けても0と1が移り変わります.

つぎに[metro]オブジェクト. これはメトロノームを勝者久下名前です.右インレットに入力された間隔で周期的にbangを出します.周期はミリセカンド(1/1000秒,msと書く)で指定します.周期の初期値はアーギュメントで指定できます.左インレットにbangもしくは1を入力されたらスタートします.

[select]オブジェクトは,入力された値がアーギュメントで指定された値と同じならば,左アウトレットからbangを,異なっていれば右アウトレットからそのまま出力します.値の比較に使います.

そして,[counter].入力されたbangのトータルの数をカウントする(数える)オブジェクトになります.アーギュメントの与え方や,リセットの仕方はこのサブパッチ上の解説を読んで理解してください.

この四つはMaxのプログラミングでの使用頻度が非常に高いオブジェクトです.是非使い方を覚えてください.サブパッチを閉じて,もとのパッチにもどりましょう.

左上のbangをクリックすると,[toggle]が0から1になります.これによって下のmetroがスタートします.ここでは,アーギュメントが1000なので,1000ms(つまり1秒)ごとにbangがでます.これを下のcounterで数えるわけです.counterの第3インレットにもbuttonがつながっているのは,buttonをクリックしたときに(正確に言えば,次のbangで),counterがもう一度0から数え始めるようにリセットするためです.

[metro]がスタートしたら,counterが0, 1, 2と数え上げているのがわかりますか? あとはこれを設定した時間から引いてやれば残り時間ですよね.ここでは,[!-]オブジェクトを使って,

(右インレット = 設定時間) - (左インレット = 経過時間) = (残り時間) 

という計算を実現してます.普通に [-]オブジェクトを使うと,左右が逆になって,ややこしくなるのがわかりますか?

あとは残り時間が0になるタイミングを検知できればオッケー. ここで[select]を使います.0になったときに, bangを出すようにするには,アーギュメントを0にすればよかったですね.このパッチでは,0になったら大きな[button](オブジェクトの右隅をドラッグすればサイズを変えられます)を光らせると同時に,TIME UPというメッセージをMaxウィンドウにプリントしてます.

[select]の出力は,上にもどって[toggle]へと入ってます.これは[toggle]にbangをおくって1から0にすることで,[metro]を止めてます.これによって,数え上げが続いて残り時間がマイナスになるのを防いでいます.

これで曲がりなりにもMaxでちょっとは役に立つプログラムがつくれました(実際に僕の友人はカップラーメンをつくるのにMaxのキッチンタイマーを使ってましたよ).でも… そろそろ音が出したいですよね.Maxのプログラミングの細かいところをやっていたらいつまでたっても終わらないので,次からは思い切ってオーディオのプログラミングに入ります.


There are no comments on this post

Leave a Reply