今回のチュートリアルでは、multi-seq, voice, polyについて触れる。
今までの出力結果は、クラスchord-seqを用いて解説して来た。
単純に和音の羅列としての表示結果であれば、これでも十分である。
これは時間経過の表記をms(mill seconds, ミリ秒)単位で行う。
これが適しているのは、例えば伝統的な連譜では書ききれない複雑なリズムを伴う場合などである。
例えば以下のパッチを見てみよう。
単純に和音の羅列としての表示結果であれば、これでも十分である。
これは時間経過の表記をms(mill seconds, ミリ秒)単位で行う。
これが適しているのは、例えば伝統的な連譜では書ききれない複雑なリズムを伴う場合などである。
例えば以下のパッチを見てみよう。
これはom-randomによって1から100までの数値がforloopによって順に与えられ、om*で10倍して10-1000までの範囲でランダムな数値を生み出す。
つまり確率としては、omloopが徐々に大きな数値を出すほど、ループの後の方では大きな数値が出る確率が上がる。
これをミリ秒単位のリズムとして読み込んで表示させると、画像のようになる。
つまり確率としては、omloopが徐々に大きな数値を出すほど、ループの後の方では大きな数値が出る確率が上がる。
これをミリ秒単位のリズムとして読み込んで表示させると、画像のようになる。
次はmulti-seqを見てみよう。これは複数のchord-seqをlistでまとめてひとつのクラス内に表示するものである。
次のパッチを見てみよう。これらは3つのchord-seqに違うdurationを与え、それらをlistでまとめてmulti-seqに送っている。
listにまとめる際、chord-seqのoutput 0から出力していることに注意。
listにまとめる際、chord-seqのoutput 0から出力していることに注意。
これがmulti-seqの基本であるが、先ほどのランダムなリズムを複数用意してmulti-seqでまとめて表示すると、こうなる。
ここではomloopを二重にしており、内側のomloopはワンスモードにして、dx->xとchord-seqによって2回evaluateされることで数値が異なるのを防いでいる。外側のomloopが次のループに入ると、ワンスモードの内部のomloopはまた新たにevaluateされることになる。
countはevaluateされるたびに1ずつ増えた数を出力する。listloopと組み合わせて順番に数値を送るのには有効な手段である。
ほかにも総カウント数を出力する、カウントをリセットするといった機能があるが、ひとつ気を付けなければいけないのは、先ほどの内部のomloopの例と同様、パッチ内で2度evaluateされることがあり、その場合は数値が替わってくるということに気をつけなければならない。
さもなければ、非公式チュートリアル07で触れた通り、length, forloop, nthを組み合わせるやり方を推奨する。こちらは確実にループの回数を参照できるからである。
ほかにも総カウント数を出力する、カウントをリセットするといった機能があるが、ひとつ気を付けなければいけないのは、先ほどの内部のomloopの例と同様、パッチ内で2度evaluateされることがあり、その場合は数値が替わってくるということに気をつけなければならない。
さもなければ、非公式チュートリアル07で触れた通り、length, forloop, nthを組み合わせるやり方を推奨する。こちらは確実にループの回数を参照できるからである。
なお、メインパッチに置いたctrlchgはMIDIのコントロールチェンジを送るものであり、ここでは5つのMIDIチャンネルのパンをそれぞれ左右に振り分けているが、これは必ずしも必要ではない。
――
さて今度はvoiceについて解説する。
これはリズムとテンポを伝統的な記譜法で表記する。通常の楽譜の他、連譜を何重にも組み合わせたブライアン・ファーニホウのような複雑な楽譜まで対応可能である。
これはリズムとテンポを伝統的な記譜法で表記する。通常の楽譜の他、連譜を何重にも組み合わせたブライアン・ファーニホウのような複雑な楽譜まで対応可能である。
voiceのinput 1(右から2番目)は、rhythm treeと呼ばれる多重のリストを組み合わせた表記を用いる。input 2にはchord-seqのinput 1と同じくchordsを入力する。この際chord-seqのoutput 1からの出力を入力しても良い。
rhythm treeに関しては、公式マニュアルおよび公式チュートリアルに詳細な解説があるので、詳しくはそちらを見て頂きたい。ここでは最低限の解説にとどめる。
まず冒頭には?を置く。(?の代わりに具体的な数値や分数が来ても良い。)
次は二重括弧で、拍子およびその中のリズムを表す。例えば下記の例は4/4拍子で4分音符が4つ並ぶことを意味する。
次は二重括弧で、拍子およびその中のリズムを表す。例えば下記の例は4/4拍子で4分音符が4つ並ぶことを意味する。
(? (((4 4) (1 1 1 1))))
ある拍の次に括弧を指定すれば、さらに音符を細かく分割することも出来る。また連譜の指定も可能である。
例えば下記の例では、4/4拍子で4分音符が3つ並んだ後、8分音符3つが3連譜で並ぶ。
例えば下記の例では、4/4拍子で4分音符が3つ並んだ後、8分音符3つが3連譜で並ぶ。
(? (((4 4) (1 1 1 (1(1 1 1))))))
1以外の数を指定すれば、音価を変える事が出来る。
休符は負数で指定する。
タイはそのタイのかかる音符を小数点で指定する。
上の例を少し変えると、4/4拍子で2分音符、4分音符が並んだ後、8分音符3つが3連譜で並び、その最初にはタイがかかり、2つ目は休符になる。
休符は負数で指定する。
タイはそのタイのかかる音符を小数点で指定する。
上の例を少し変えると、4/4拍子で2分音符、4分音符が並んだ後、8分音符3つが3連譜で並び、その最初にはタイがかかり、2つ目は休符になる。
(? (((4 4) (2 1 1(1.0 -1 1)))))
では上の2分音符を、付点4分音符と8分音符に分割するにはどうするかというと、まず下記は間違いである。これはevaluateするとエラーが出る。
(? (((4 4) (1.5 0.5 1 1(1.0 -1 1))))) (←誤った例)
正確には、先ほどの2を括弧でくくり、3 1で分ける。つまり (2 (3 1)) が足されるわけである。
(? (((4 4) ((2 (3 1)) 1 1(1.0 -1 1)))))
とばいえ、通常これらの表記で全てのリズムを記譜するのは大変難しい。
そこで通常は、rhythm-treeおよびmktreeのファンクションを使うことになる。
そこで通常は、rhythm-treeおよびmktreeのファンクションを使うことになる。
pulsemakerは、小節ごとの拍数(小節の分子と分母)および具体的なリズムを、3つのinputに分けて書き込む。
このpulsemakerは、実は公式チュートリアル25で作られるサブパッチRtm constrctと全く同じ構造である。
つまり、pulsemakerの内部構造を詳しく理解したい場合は、公式チュートリアル25を見れば良い。
逆に言えば、一度仕組みを分かってしまえば、複雑なサブパッチを作ったりコピーしなくても、ファンクションpulsemakerを使えば素早い処理速度で同じ結果が得られる。
つまり、pulsemakerの内部構造を詳しく理解したい場合は、公式チュートリアル25を見れば良い。
逆に言えば、一度仕組みを分かってしまえば、複雑なサブパッチを作ったりコピーしなくても、ファンクションpulsemakerを使えば素早い処理速度で同じ結果が得られる。
mktreeは、各拍ごとのリズムを分数で指定し、拍数を2つの数値の組み合わせによるリストの集合で指定する。
tree2ratio および get-signatures と組み合わせて使うと、リズムを分数単位で拡大・縮小できる。
tree2ratio および get-signatures と組み合わせて使うと、リズムを分数単位で拡大・縮小できる。
リズムに関する指定には、この他にもmaketreegroups, tie-tree, reduce-tree, remove-restsなど、様々なファンクションがある。
これらはOpenMusicに付属するサンプルパッチにて詳しく解説されているので、それを参照してほしい。
Treeに関するパッチは、以下のフォルダに収録されている。(Macの場合)
Applications/OM 6.7/tutorials/Trees
これらはOpenMusicに付属するサンプルパッチにて詳しく解説されているので、それを参照してほしい。
Treeに関するパッチは、以下のフォルダに収録されている。(Macの場合)
Applications/OM 6.7/tutorials/Trees
voiceと関連する補助クラスとして、groupとmeasureがある。これはそれぞれ、ある一かたまりのリズム、および特定の小節におけるリズムのデータだけを扱うクラスである。
またchord-seqに対してmulti-seqがあるように、複数のvoiceをまとめて表示するクラスがある。それがpolyである。
polyにおける各voiceは、それぞれ独立した小節線及びテンポを維持できる。
voiceを使った具体例は次回以降に見て行こう。