最新記事

MAX 7 サウンドプログラミング基礎13

P301〜P305 ・selectオブジェクト selectオブジェクトは、入力されたメッセージがアーギュメントに一致するかを調べるオブジェクトである。一致した場合はアーギュメントの順番に対応したアウトレットからbangを出力し、どのアーギュメントにも一致しない場合は、一番右のアウトレットから受け取ったメッセージをそのまま出力する。 また、各インレットに関しては、アーギュメント内の数値を変更できるもので、例えば下のパッチでは第2インレットは2、第3インレットは6、第4インレットは8をそれぞれ変えたい時にそれぞれのインレットへ違う数値を送ることで変更可能である。 また、リスト化されたメッセージから遷都の要素のみ一致を摘出することも出来る。左パッチの場合では、送られた[mammy daddy]メッセージのうち、先頭のものが摘出されるため、bangは第2アウトレットから出力されるというわけである。 ・routeオブジェクト routeオブジェクトは、selectオブジェクトと似ており、アーギュメント内の値と受け取ったメッセージの一致を調べる。 ただし、複数の要素からなるメッセージを受け取る場合には、アーギュメントと一致する数値がメッセージの先頭にあった場合、そのメッセージの2番目以降の要素を出力するところがselectとは大きく異なる。そしてメッセージ要素がもともと一つの場合にはbangメッセージのみが出力される。 例えば、左のパッチにおいては最初の[1 4 5]を受け取ると、第1アウトレットからは1を通過した[4 5]が出力され、[1]のみだと第1アウトレットからbangのみ(ちな

MAX 7 サウンドプログラミング基礎12

P299〜300 条件指定において、splitオブジェクトを用いることで、アーギュメント内で指定した範囲によって数値を振り分けて出力することが出来る。アーギュメントは、二つの整数によって最小値と最大値を指定し、その範囲の整数を第1インレットに受け取った場合は、その整数を第1アウトレットから出力。範囲外のものであれば第2アウトレットから出力を行う。 右のパッチで、sliderオブジェクトを動かして範囲内と範囲外の数値の出力のされ方を見ることが出来る。なお、splitオブジェクトの第2インレットには最小値を、第3インレットには最大値の変更したい値を入力することが可能である。 また、splitオブジェクトに似ているが、clipオブジェクトも最小値と最大値の範囲内を出力するオブジェクトである。ただし、clipp部ジェクとの方は、アウトレットが一つだけで、最小値よりも小さい数値は最小値として、最大値より大きい数値は最大値として出力される。 では、これもまたlcdオブジェクトで応用してみよう。 下図のように、x軸(left座標)の範囲を指定したドット作成であるが、splitの場合は範囲外のものが完全に無視されているのに対し、clipの場合は範囲外のものはそれぞれ最小値、最大値として出力されているのが分かる。 また、clipオブジェクトの方では、right座標にあたる[+]オブジェクトが受け取る値をclipからではなく上のrandomから引っ張ってしまうと、指定した範囲外の場合は最小値最大値の各座標から左右に広がったドットとして反映されてしまうため、ここではclipのアウトレットから出力され

MAX 7 サウンドプログラミング基礎11

P296〜p298 ==や<>などの条件判断オブジェクトでは表現しにくい条件判断は、ifオブジェクトを使って記述することが出来る。ifオブジェクトは、C言語などのif文に似た次のようなアーギュメントを与える。 ・if 条件式 then 出力1 ・if 条件式 then 出力1 else 出力2 条件式は、$i1、$f1、$s1といった記号を用いて、インレットから入力されるメッセージを扱う。既述した記号の場合、二番目の文字であるiはint(整数)、fはfloat(実数)、sはsymbol(シンボル)となる。まt,あ三番目の数値はインレット番号となる。 具体的な例で見てみよう。 [if $i1 > 0 then $i1 else 0]というアーギュメント内容であれば、第1インレットで受け取った整数が0よりも大きければその整数をそのまま出力し、そうでない場合は0を出力するということになる。 また、[if $i1 > $i2 then bang else out2 bang]であれば、第1インレットから入った整数が第2インレットには行った整数よりも大きければ第1アウトレットからbang、それ以外は第2アウトレットからbangという指示になる。 このような条件式には、exprオブジェクト(サウンドプログラミング基礎④)のように、アーギュメント内に演算式や関数を含めることが出来るため、かなり複雑な条件を表すことも可能となる。 例えば下のプログラムでは、「第1インレットからの整数の2乗+第2インレットからの整数の2乗」の平方根が第3インレットの整数よりも大きければ1を出力し、そう出なければ0

MAX 7 right-to-left問題-補足-

以前投稿したright-to-left問題における補足。 基本的に、右からインプットされたものは、最終的に最も左からくるインプットによってbangされる。それはつまり、bangしたい対象がそのオブジェクトよりも左にあった場合には未反映状態となることを示す。 gateオブジェクトにおいて簡単なプロジェクトを見てみたい。 次の図において、左側のプロジェクトでは、丈夫のナンバーボックスを徐々に上げていくと、100を上回った際、本来であれば101の時にgateを通過したいのだが、gateオブジェクトへ101が入力される瞬間にはまだgateは開かれておらず、一瞬後に入力される[>100]の条件通過を受けて初めてgateが開かれる。そのため、101時点ではまだ数値は100のままであり、102になった際に先程開いたgateを、そのまま通過するという流れになるのである。 一方、右側のプロジェクトでは、まず[>100]の条件指定がgateオブジェクトへ送られてからナンバーボックスからの数値を受け取るため、正常に条件のみを通過した数値が下のナンバーボックスへ反映される。 より分かりやすい図がこちら。 始めに、左のbangから[>100]条件にはまる数値を入力し、gateを開いた状態にし、次に右bangから条件にハマらない数値を入力しても、先程開いたgateによって、数値は通ってしまうのである。 よって下図の場合でも同じ事が起きる。 この場合、50>x>150という範囲内でx軸(left値)を規定したいわけだが、それを指定するオブジェクト自体が、paintovalよりも左にあるため、条件を満たしてい

MAX 7 サウンドプログラミング基礎10

P505 リスト化とリスト分離について。 ここでは、2パターンのリスト化、非リスト化オブジェクトをメモしておく。 まず、これまでも記述したが、数値をリスト化するには、主にpackオブジェクトを用い、またpack内のリストを個別に出力するにはunpackオブジェクトを用いる。 しかしながら、packオブジェクトはbang入力時に受け入れられるリストはその時のもののみであるのに対して、threshオブジェクトはアーギュメント値に指定されたmsec内に受け取った数値をまとめてリスト化することが可能である(※ちなみにsymbolの入力は不可)。 例えば、下の図においては、99という最初のメッセージを、それぞれthresh400,thresh1000オブジェクトが受け取るわけであるが、各オブジェクトには、0secで受け取るもの(黄,青)と、pipeオブジェクトによって50msec後に受け取るもの(橙,緑)がある。 thresh400に関しては400msec内に受け取った数値がリスト化され、thresh1000に関しては1秒内の数値がリスト化されるため、結果、[99 99] 、[99 99]という二つのリストがそれぞれ出力されることになる。 さらに、packとthreshでは特筆すべき大きな違いがある。 それは、threshオブジェクトにおいては、出力されるのは常にright-to-leftに従って右端リストもしくはメッセージの順番から出力されるということである。 下の図においては、左側のオブジェクトでは、最右の105,350,2,そしてリスト1 50の順に出力されるが、右のpackにおい

MAX 7 サウンドプログラミング基礎9

p.498 さて、MAX上で音を鳴らすための基本構造は、オシレーターの決定、周波数の決定、ボリュームの決定、そしてその数値をアナログに変換するためのDigital Analogue Converterであるdacを繋げる手順となる。 今回はそのdac~オブジェクトについて。 maxにおいて、同時に複数のパッチを開いて作業をすることは頻繁にあることである。 また、その各パッチにおいてdacを用いてサウンドプログラムを作っていることも多々あるわけであるが、max上で普通にdacオブジェクトを使って音を出そうとすると、デフォルトでは同時に現在開かれているパッチ上のdacが一斉にON状態になってしまい、限定的に使用できない。 これは非常に使いづらい。 そこで、聞きたいパッチだけ聞けるようにAudioのON/OFFを設定しておきたい。 使用するのは、startwindowというメッセージである。これを、dac~オブジェクトに直接つなげ、メッセージを送るだけで良い。 そうすると、右下のマスターボリューム表示がオレンジ色に点灯する。これが現在のパッチのみ音量ONのサインである。 また、startwindowメッセージをわざわざ使用しなくとも、dac~オブジェクトのインスペクタ上で、Switch is localを選択すれば、同じ設定にできる。 ※helpパッチは全てここにチャックが入っている。 これを知っておくだけで格段に便利であるだろう。

MAX 7 line~オブジェクトと音設定2

番外編〜その2〜 以前投稿したline~オブジェクトについて、現在進んでいるオーディオ処理項目匂いて改めて重要な点に気付いたのでメモしておく。 内容は、line~オブジェクトによるクリップノイズの回避についてである。 下のようなmtof(MIDI to Frequensy)プログラムを作成し、functionオブジェクトによって音のエンベロープ 設定を行う。 さて、ここでは、エンベロープで書かれた信号をline~オブジェクトに送るわけである。エンベロープオブジェクトについては改めてこの先記事を作っていくが、描かれたエンベロープ情報は第2アウトレットからリスト表示と鳴って出力される。 しかしそのままだと、右図のように、最初のポイントのrange(y座標)とその次のリストが同時に出力されるため、急なボリューム変化によって波形の不連続が生じ、結果よしてクリックノイズが発生してしまう。 どういうことかというと、すなわちその下に表すように、出発点をゼロに設定していたとして、0とその次の数値がほぼ同時に入力されるため、本来のlineオブジェクトの現地点から〇〇msかけてAへ到達すると いうミッションが完遂できないのである。 よって、行うべきはrouteオブジェクトを用いてリストのみを摘出することである。 これをしておけば、最初の値が入力されず、現地点から〇〇msかけて(すなわち今回のパターンであれば、1462.765..msかけて)Aへ(0.76)へ到達することがクリップノイズなしで可能となるのである。

MAX 7 right-to-left問題

前回投稿した基礎⑧における、ドットのカラーが一つ連れて反映される問題についての解答が出たので載せておく。 キーになるのはやはりright-to-leftの仕組みであった。 まず、ドットのカラーが反映される状態というものを考えなければならない。 lcdオブジェクトが、paintovalメッセージからドットの座標リストを受け取る時(というのは、そのbangが発動する前)に、カラーやサイズなどの情報は前もってlcdへ保存されておかなければならない)。 そうでなければ、次のbangまで反映されないのである。 すなわち、colorがpaintovalよりも右にあれば、最初のbangは一足先にlcdへ届いているが、cokorが左にあれば、paintovalがlcdに入力された直後に届けられるため、その数値はそのまま保存されて次のbangの際に発動されるというわけなのである。

MAX 7 サウンドプログラミング基礎8

8 p.292〜295 前回投稿したgateやswitchオブジェクトは、toggleオブジェクト等によって動作を設定していたが、それはエアコンのスイッチを手動で入れたり、切ったりすることに例えられる。 一方、温度計によってエアコンを制御すれば、自動的に適切な温度に室温を保つことが出来る。 このような一定条件に基づく判断を条件判断と呼び、それによって何らかの動作を行うことを条件処理と呼ぶ。 条件処理を行うためには、次のような条件演出オブジェクトが利用できる。 == 等しい != 等しくない < より小さい <= 等しいか小さい > より大きい >= 等しいか大きい ==オブジェクトの場合は、アーギュメントで指定した数値または、第2インレットに入力された数値と、第1インレットに入力された数値を比較して、等しければ1を、そうでなければ0を出力する。理論用語に置き換えると、1は”真”を、0は”偽”を表す。 また、二つの条件演算の結果を総合的に判断することがある。MAXで論理演算を行うためのオブジェクトは以下の通りである。 && かつ(論理積・論理AND演算) ll または(論理積・論理OR演算) こちらのオブジェクトにおいても、条件に等しければ1を、そうでなければ0を出力する。 では、以上の条件オブジェクトを用いて、限られた座標範囲内でドットを描くプログラムを作って みたい。 右図では、y座標が50-150の範囲でのみドットが描かれるプログラムになっている。 まず、y軸、すなわちtopの座標を指定する右側のrandomオブジェクトから、それぞれ>50, <150の条件処理を

MAX 7 サウンドプログラミング基礎7

p.288〜292 ・GSwitch/gateオブジェクト メッセージの流れを制御するオブジェクトとして、 Gswitchオブジェクトと、 Gswitch2オブジェクトがある。 まず、GSwitchオブジェクトに関しては、第1インレットへbangまたは0か1の数値(Toggleオブジェクトに関しては、オンで1、オフで0が出力されている)を受け取ることで、 回路が繋がっている方のインレットからのメッセージをそのまま出力することが出来る。 あるいは、直接グラフィック部分をクリックすることでの変更も可能だ。 switchオブジェクトもまた、メッセージの入力を選択できるオブジェクトであるが、初期値または第1インレットに0が入力された場合には、第2インレット以降のどのインレットからも入力を受け付けない。 そして、1が入力される場合には第2インレット、2の場合は第3インレットからの入力を受け付けることができる。 また、アーギュメント内の数値によってインレットの数を指定することも出来る(省略の場合は2となる)。 次に、GSwitch2オブジェクトに関して。 こちらは、gateオブジェクトと非常に似た働きをするオブジェクトで、第2インレットから受け取ったメッセージを繋がっている回路のアウトレットへ出力するものである。 ※多くのオブジェクトは、right-to-left のルールに則って、第2インレットにメッセージを受けた時にはオブジェクトの内部状態を変えるだけであり、第1インレットにメッセージが来た時に動作をする。 しかし、GSwitch/gateオブジェクトに関しては、第2インレットからメッ

MAX 7 lcdとピクセルドットの作成5

p.282〜283 counterオブジェクトを使用したドットの作成。 まずcounterオブジェクトは多数のインレットをもっており、 第1インレットへはbangを、 第2インレットへは、アーギュメントの最初の値と同様、0なら増加、1なら減少、2なら増加後減少と変化する。 第3・4インレットへは、リセット信号をおくるが、その違いは第3インレットのバングが送られた次の値から。第4インレットの場合はバングと同時に数値がリセットされ、第2アーギュメントの初期値に戻ることとなる。 最後に、第5インレットに関しては、カウントする最大値を指定できる。これは第3アーギュメントと同じ数値となる。 左の例においては、アーギュメント内の指定値1〜10が、第5インレッットによって1〜5に代わり、selオブジェクトによってカウントが3に至った時にbangを発動し、それが第3インレット(赤パッチ部分)へ送られた場合には、次の4が初期値の1へ変わり、第4インレット(青パッチ部分)へ送られる場合は、3がなくなって1に変わり、結果1と2のみの繰り返しになる。 さて、では次に、counterオブジェクトを使用したドット製作をしてみる。 ここでは、円の半径を中心にとどめ、半径の増加とともに、円の色も変化させる。 paintovalは以前の記事でも紹介した通り、top,leftの座標を軸に、right,bottomとの距離で円を描くものである。まず、円の中心を200×200サイズのlcd中心部、つまり100,100に常にとどめておくためには、円の半径分の距離を常に100から引いてやればよい。すなわち、counter

MAX 7 lcdとピクセルドットの作成4

p.282〜283 drunkオブジェクトを使用して、ドットの位置を変化させながら描く。 drunkオブジェクト内のアーギュメント値は、左側に最大値、右側にステップサイズの最大値(移動する最大幅)を入力する。結果、出力される値は、左の最大値までを、右側の範囲内のステップで移動することになる。 プログラム自体は非常に単純で、これまでのrandomオブジェクトの代わりに、drunkオブジェクトを用いればよいだけである。 下の図では、drunk & uziの組み合わせ、右側がdrunkのみのドット作成プログラムである。

MAX 7 lcdとカラーパレットの作成

p.281〜 uziオブジェクトと {moveto, lineメッセージ}を使用して、256色のカラー縦線を作る。 まず、movetoとlineによるメッセージが何を指定するメッセージなのか説明しよう。 {moveto x y, line α β}としたとき、その関係性は右のようなものを示す。つまり、線であるlineの長さそ指定し、それがxまたはyそれぞれどこから開始するかを指定することが出来る。 簡単に例を作ってみる。次の図を見てみると、まず、線のはじまりを示すxy座標は、100, 20であり、そこから線がのびている。 次に、そこからの線の方向性と長さであるが、150をx軸方向、 30をy軸方向へ行った先に着地する線となるので、斜め右下へ降りたようなものとなるのである。 では、実際にからパレットの作成へ移ってみよう。 まずはカラーバリエーションは256であるから、lcdのサイズを256×200に設定する。 uziは第3アウトレットから連続した数値を出力する。次に、uziオブジェクトで一気に256段階分の出力を行うなうわけであるが、uzi 256のままだと1〜256までとなるため、0が出力されない。そのため、-1オブジェクトによって0〜255段階の出力に変更する必要がある。 また、lcdオブジェクトはデフォルトでは黒ぶちの枠線があるが、これを解消したい場合には{border 0}メッセージを入力すれば枠線がなくなる。 これで、下図のような256カラーラインが表示できる。

MAX 7 lcdとピクセルドットの作成3

p.277〜 100個や1000個などのまとまった出力を用いたい場合には、uziオブジェクトを使用する。 uziオブジェクトの第1インレット、もしくはアーギュメント内に入力された数値の数だけ、アウトレットから一気に出力することが可能である。 これをlcdのドットに適用させると、右のようなプログラムが出来る。右のプログラムでは、uziによって500のbangがrandomオブジェクトへ入力され、500個ずつのドットがlcdへ出力されるようになっている。 さらに、ここでドットに色づけをしてみる。colorメッセージをlcdの第1インレットへ送ることで、ドットの色を指定できる。 ※尚、color値は0〜255の256段階ある。これを適応すると、下図のようになる(少し分かりやすいように、ドットの大きさを変えている)。 ここでは、colorを指定するアーギュメント内の数値を$1として、randomオブジェクトから入力される数値にはめ変えている。

MAX 7 line~オブジェクトと音設定

番外編 かつて数学に対して解ける楽しさを知っていた自分にとっては、 その頃の努力や好奇心が今尚続いているような気がして、どこかワクワクしているのである。 さて本日は、line~オブジェクトについて。 「〜」は音声信号を意味しており、パッチコードも、太い点線となって現れる。 基本的にlineオブジェクトは、 『現地点からAまで、○○msで移動する。』 という指示のオブジェクトである。 ここでは、LINEオブジェクトの第一インレットに、「A ○○」というメッセージを送ることで、Aの値まで、○○msで到達するという信号を作る。 また、第2インレットへ秒数(ms)を入力してから第1インレットへ数値を送ることでも、その数値へ○○msで到達するという信号を作ることができる。 右の図においては、5秒かけて0から1へ音量が上昇していくプログラムである。 ↑ また、上記のプログラムは、0.5msかけて1.0(最大値1.0、最小値0.0)に到達する信号と、10msかけてに0.0に到達する信号があり、さらに0へ到達するメッセージの方へdelay10msを送り、結果、20ms後に0.0に到達する信号が、444hz周期で発生し続けるというプログラムである。

アーカイブ
タグから検索
  • SoundCloud Social Icon

■当サイト音源や動画を著作者の許諾なく、営利目的・商用使用することを禁止します。

■著作物を個人的に楽しむ場合などを除き、著作権利者の許諾を得ないで複製 (録音)などを行うことは、著作権法で禁止されています。

Copyright © 2015 kuu-sou sound creations. All Rights Reserved.