MAX算数教室 #1「関数とサイン」

お疲れ様ですnanonumです。

MAXやりたいけど数学わからなくて…と相談される事がたまにありますが、数学者のようなMAXユーザーを見かける事は稀です。「何かエフェクターを作ろうと色々調べていたら数式が出てきてしまいどう組んだらいいのかわからない」とうケースがありますが、表現の仕方が違うだけでMAXパッチと数式でやってる事が全く違うという訳ではないので、数式苦手な方も試しに読み解いてみましょう。

超絶簡単スタートになりますが第1回は中学数学から復習し、関数をMAXで組んでみるところから始めてサイン波まで出してみたいと思います。初歩になるので理系の方には全く物足りないかとは思いますがお付き合いください。


関数とは何か

さて、関数というものを覚えているでしょうか。
これはxが〜の時、yは〜になる、というような関係を表すものになります。

試しにxが1の時yが3になり、xが2のときyが5になるといったxとyの関係を関数の式として表すと

f(x) = 2x + 1

という式になります。式の中にyがなくてよくわからない、f(x)とは何?という疑問があるようであればひとまずy = 2x + 1と読み替えてしまっても差し支えありませんが、f(x)という電子レンジにxという数字を入れて、何Wで何分というボタンを押すかのように「2倍してから1を足す」という設定をしてスタートボタンを押すと、yという数字になって出てくる機械のようなものをイメージしても良いでしょう。

fx

中学ではこのxを1ずつ増やしたりしながら変化していくyの値をグラフ上に点を打ち、斜線で結んだりしましたが一体それが何なのか?そもそもx、yって何なのか?と思っていた方も少なくないのではないでしょうか。

fx_graph
f(x) = 2x + 1のグラフ

これを一体maxでどう使うのかいまいちピンと来ないかもしれませんが、一旦この関数をmaxで表してみます。先ほど電子レンジの例えを出しましたが、maxっぽく言い換えると「2倍して1を足す機能をカプセル化した[ f(x)]というサブパッチャーに入出力が存在しているもの」が実装できていれば目的に合っていそうです。

想像図
スクリーンショット 2015-09-01 15.02.46
(これは単なる空patcherなので真似しても動きません)

さて、上記パッチャーは何もしてくれないので中身を実装してみます。

mathmax001_function

もはや説明するまでもないですが上の[numbox]に入力した数を2倍し、1を足した数値を下の[numbox]に出力するだけのシンプルなパッチです。が、関数として表現されているよくわからない記号もこうしてみると全くたいしたことはないように見えるのではないでしょうか。


サイン波を生成してみる

これで終わると全く面白くないと思いますので次は[cycle~]を使わずにサイン波を作ってみましょう。

サイン波を出すには三角関数を使用します。が、高校で初めて習ったサインコサインタンジェントの法則、斜辺がどうで二乗して足すと1になる….などの公式は映像のプログラミングでは非常によく使われるのですが、サイン波を生成するのにはとりあえずは使用しません。

代わりに使われるものがサイン関数、sin()です。

mathmax001_sin

試しに[sin]の前後にオブジェクトに[flonum]を繋いで見ましたがぱっと見よくわからない数値の変化をしますので、きちんとサイン波の関数を使ってみましょう。wikipediaのものはちょっと複雑なので今回は少しシンプルなものを使います。

y = sin(2π * rad)

sin()はサイン関数、2πは円周率の2倍です。(※注 この記事では円周率を3.1415925としています。)

radは突然現れましたが、常に一定である円周率と違い0から1の間で変化する予定の数字なので、さっきの関数でxだった「関数へのインプット」として扱いましょう。記号にどういう意味があるのかはまだわかりませんがとりあえずmaxで組んでみます。今回はradとして0〜1の数値を繰り返す[phasor~]に似せたものを入力に繋ぎ、視認用に[multislider]を接続、Slider Styleを”Reverse Line Scroll”モードにしておきます。

mathmax001_sintwopirad

上のグラフがphasorの出力、そして下にはどうやらサイン波が出来ています。
maxオブジェクトで組んでいるため音になりませんがmspオブジェクトで試しに組んでみましょう。せっかくなのでどこで周波数を変更するか考えてみてください。

ヒント:sinオブジェクトはmspではsinx~になります。


ラジアンとは?

サイン波が聞こえた方おめでとうございます。

せっかくなのでもう少し掘り下げてみましょう。先ほど何だかわからないけどインプットとして扱っていたradとは一体何なのでしょうか?また何故円周率の2倍をかけたのでしょうか?

y = sin(2π * rad)

radはラジアン(radian)と言い、角度の単位になっています。角度の単位といえば普通「度(英語ではdegree)」ですが、「度」が0度〜360度の範囲なのに対して、ラジアンは0〜1になっています。ただし紛らわしいのですが0〜1で1周するのではなく、0〜円周率倍の2倍、つまり0〜6.283185で1周します。諸々理由はありますが、円周率の2倍を掛けることでmax上では[phasor~]の出力0〜1をそのままラジアンとして使用することができます。

ところでなぜ突然回転するのでしょうか??

パブリックドメインで良いアニメーションGIFがあったので使わせていただきましょう。ここで注目するのは右下の円と左下の赤いグラフです。

Circle_cos_sin

右の緑の円周上を、小さい緑の点が移動していますが、この小さい点の上下位置、Y座標の値のみを抜き出し記録していったものが左下の赤いグラフになります。(緑のグラフ中心部分の黄色い点の位置がx=0, y=0になっていて、縦がY軸です)

最初に出したグラフ上でいうとこのような感じで、小さい赤い点のY座標の上下の動きがサイン波になっています。

mathmax001_plot

いかがでしたでしょうか。

DSPプログラミングでは数式部分と細かい調整がごちゃごちゃになっていたりして他の人のソースコードなどをみても何故そういう計算にしているのかわかりづらい事が多いのですが、基本的なエフェクトやシンセサイズ方式などは数式がすでにwikipediaなどネット上に存在しているものが多く、数式をmaxに変換して読む事ができるとよくわからなかった数式がだんだんと”使えるネタ”かのように見えてくるかと思います。


おまけ:ハン窓

最後に一つ例を出して今回の記事を終わりにしたいと思います。

FFTを使った合成やグラニュラーシンセなどでよく使う窓関数、ハン窓の数式は

w(x) = 0.5 – 0.5 * cos(2πr)

となっていますが、これも数式とmaxオブジェクトの対応関係がわかれば

mathmax001_hann

このようにわずか4つのmaxオブジェクトでできるのだなという事がわかって来ます。

なお次回予告はしません


MAX算数教室 #1「関数とサイン」」への2件のフィードバック

コメントを残す