Sketching日記(14)
(実際のところは「Max8日記」あるいは「Gen日記」かも)長嶋 洋一
2022年8月1日(月)
怒涛の2022年度前期も終わって、成績を登録したら、当面のタスクとしては、9月の音楽情報科学研究会の予稿の執筆ぐらいとなった。 ただし今回は、その翌月の音知学会大会でゼミの吉田さんが発表する、あのネタの「予告編」に徹しているので、吉田さんの予稿の執筆よりも前にこの原稿をWebに上げておく必要がある。 そこで、明後日からの仙台出張を前にして、一気に午後の時間をかけてこれを片付けてしまった。 情報処理学会に提出してしまった4ページの予稿は これ であるが、いちばん最後に小さい画像で「ヒント」を入れておいた。(^_^;)
そして、久しぶりにLIFE2022のサイトに行ってみると、すでに確定していた タイムテーブル に続いて、ずっと「暫定」だったのが取れて プログラム というのも公開されていた。 今週の仙台に続いて、いよいよ今月下旬の札幌が見えてきた。(^_^)
2022年8月2日(火)
いよいよ明日から仙台行きということで、早くも「遠足前日」状態のテンションとなってきた。 今日はM2の中間発表会も予定されているのだが、午後にはゼミ・王さんのアポもある。 そしてEA研究会からのZOOM連絡に関連して幹事団に問い合わせをしたり、領域学生への連絡のためのmanabaシステムの運用にバグある(^_^;)と判明したこともあり、どうやら「パス」の可能性が出てきた。上のように今回の「電子情報通信学会 応用音響研究会(EA)」のプログラムを並べてみたが、なかなかに「濃い」感じで、ひたすら勉強という感じになりそうだ。 そして午前中にはフト思い立って、 この解説動画 をじっくり視聴して「GEN」を勉強してみた。 英語のYouTubeはどうしても聞き取れないのだが、なんと英語の字幕が付いているので、これはスッと入ってきた。 また、YAHOO.COMに行って「max gen cycling74」で検索して、Cycling'74のサイトからのTutorialなどとして、以下も発見した。 3番目のものは、「GENがexportするDSPアルゴリズムの商用利用について」という話題のようだが、それだけ有益なものなのだろう。 またこの解説動画から、GENのCodeBoxにDSPアルゴリズムをコピペする元として、新たに Musicdsp.org という宝庫も知ってしまった。8月4日(木) (1) 13:00-13:30 自由音場における2チャンネル2次元パノラミックサウンド収音システムのチャンネル間特性 (2) 13:30-14:00 実環境における2チャンネル2次元パノラミックサウンド収音システムの特性評価 (3) 14:00-14:30 個人用三次元音場再生用収録システムの三次元定位の評価 (4) 14:30-15:00 頭部球体ー胸部楕円体のHRTF 15:00-15:15 休憩 ( 15分 ) (5) 15:15-16:15 [招待講演]ウェーブレット変換と深層学習を融合した音源分離 16:15-16:30 休憩 ( 15分 ) (6) 16:30-17:00 低いプレート電圧に対する真空管のSPICEモデリング 〜 五極管の三極管結合と三極管に対する特性の比較 〜 (7) 17:00-17:30 コンピュータサウンド教育のためのインタラクティブ環境について 〜 Max,SuperCollider,Processing,SonicPi,およびMozziの検討 〜 8月5日(金) (8) 10:00-10:30 天頂方向のノッチ周波数の最適化による全天空個人化頭部伝達関数の生成 (9) 10:30-11:00 2次系推定誤差が能動騒音制御を不安定化させる原因と対策 (10) 11:00-11:30 スピーカアレイにおける指向性生成のための配置パターン選択法の検討 (11) 11:30-12:00 位相反転による一筐体ステレオ再生方式のパラメータに関する検討 12:00-13:00 休憩 ( 60分 ) (12) 13:00-13:30 水平面における音源間の角度が聴覚オブジェクトの知覚に及ぼす影響 (13) 13:30-14:00 頭部運動を制限した長時間刺激の音像定位精度 (14) 14:00-14:30 聴覚フィルタバンクを用いた音質評価指標の検討
さらにこの解説動画(38分)の最後の5分ほどで紹介していたのは、上の MOD Duo X というものだった。 これは内部にDSPでなくLinuxベースの高性能ARMプロセッサを搭載したリアルタイム音響処理ハードウェアであり、完全にMaxやGENとシームレスに繋がって、Maxベースで開発した音響処理アルゴリズムを内部的にロードして実現するというものだった。 2000年頃には活用していたのに過去のものとなってずっと気になっていた「Kyma」の発想が、DSPでなくこのような形で新たに実現されていたとは驚いた。 「Out of stock」となっていたのでホッとしたが、749ドルなら購入してしまうところだった(^_^;)。
午後になって、ゼミM1・王さんが研究室にやって来て、フォルマントフィルタ、MFCCフィルタ、ケプストラム・・・となかなか高度な話題と取り組んでいたのだが、その最中に突然に届いたのが、上の「LIFE2022は完全オンライン」(札幌には来るな!!)という連絡であった(;_;)(;_;)。 つい先日まで、「絶対にオンサイトでやるからね」と強気に言っていたのに、まさに青天の霹靂である。 仕方なくホテルをキャンセル(無料)して、さらにANAのサイトに行って1万円以上の手数料でフライトもキャンセルした。 このキャンセル料は研究費から出るとはいえ、「夏の札幌・ジンギスカンとビール」という夢は、儚くもアッサリと散ってしまった。 こうなったら、明日からの仙台では牛タンしかないだろう。
2022年8月3日(水)
「幻の札幌」にめげずに「久しぶりの仙台」のために、東京に向かう新幹線の車内である。 浜松駅に着いてモーニングをいただいて新幹線改札口に来てみると「人身事故で新幹線ストップ中」という掲示に驚いたが、ちょうど切符を購入していた列車の1時間前の「ひかり」がホームにいたので、指定席の空いているところに座って、約1時間遅れで出発してそのまま東京に着きそうなので、東北新幹線にはスムースに乗り継げそうだ。 そして、以下のように、明日の発表のためにMacBookAirの中のあれこれから厳選してデスクトップに「デモの材料」を並べてみたが、どうせこの半分も紹介できないのはいつもの事である。
東京駅に着いてみると、僕が乗る予定の「はやぶさ号」は予定通りに走るものの、そこに連結されて盛岡から秋田に行く「こまち」の運休が告げられていた。 関東から西では全国的に超猛暑日なのだが、なんと東北北部から北海道を強烈な雨雲が覆っていて、秋田新幹線や山形新幹線は豪雨のため全面運休なのだという。 朝から2本続けてなかなかirregularなスタートとなった。 その東京〜仙台の車中では、SuperColliderのあの「SC140」をいちいち聞いて、限られた時間の中でその凄さを紹介するための「選抜」作業を進めた。 その結果、サウンドファイルを読み出すので不適、謎のエラーで不適、しばらく音が出ないので不適、あまりに巨大な音なので不適・・・というようなものを捨てつつ、優先順位を付けて以下のようなリストに精選した。 ただしこの####と###を全てデモる余裕があるかといえば、これもなかなか厳しいだろう。
そして無事に仙台に着いて、新幹線改札口と同じ仙台駅3階の「牛たん横丁」に行ってみたところ、最初のお店では昼前ということで10人以上が並んでいた。その次のお店もその次もその次も、みんな10人以上の行列が続いていた。そこで負けずに「牛たん横丁」の奥までずんずん進んでいくと、最後の8軒目がちょうど行列ナシで僕が先頭となって、席の消毒を待つだけで入店することが出来た。 もっとも改札から遠いという意味ではメジャーではないにしても、選ばれて仙台駅構内「牛たん横丁」に出店しているからには実力派であり、その牛たんランチは絶品だった(^_^)。Nathaniel Virgo #### Ndef('x',{x=Ndef('x').ar+0.01;a=BPF.ar(x,6**Latch.ar(x,Dust.ar(x))*200,0.1).sin;9.do{a=AllpassN.ar(a,0.2,{0.2.rand}!2,9)};a+a.mean}).play; Batuhan Bozkurt #### play{AllpassC.ar(SinOsc.ar(55).tanh,0.4,TExpRand.ar(2e-4, 0.4,Impulse.ar(8)).round([2e-3,4e-3]),2)};// #supercollider with bass please... Batuhan Bozkurt ### play{f=LocalIn.ar(2).tanh;k=Latch.kr(f[0].abs,Impulse.kr(1/4));LocalOut.ar(f+CombC.ar(Blip.ar([4,6],100*k+50,0.9),1,k*0.3,50*f));f}//44.1kHz Thor Magnusson ### play{x=SinOsc;y=LFNoise0;a=y.ar(8);(x.ar(Pulse.ar(1)*24)+x.ar(90+(a*90))+MoogFF.ar(Saw.ar(y.ar(4,333,666)),a*XLine.ar(1,39,99,99,0,2)))!2/3} Julian Rohrhuber ### /*eclecticity*/ Ndef(\x, { SinOsc.ar(BrownNoise.ar(30!2, 200), Ndef(\x).ar * LFNoise1.kr(1!2,1,1)) }).play; Batuhan Bozkurt ### play{LeakDC.ar(BRF.ar(Saw.ar(8,Decay2.kr(x=Duty.kr(1/8,0,Drand([0,Drand((0.4,0.5..1))],inf)),0.01,0.3))**1.5,x*20+[45.1,45],0.1)).tanh}//#sc MCLD ### {a=[0.02,0.1,1,2,3,4]; k=LFPar.kr(a+0.5).sum; f=Latch.kr(k,Impulse.kr(a)); Splay.ar(SinOsc.ar(f*100+300)/5)}.play // #supercollider Jose Padovani ## play{x=165;b=SinOsc;p=Trig.ar(Saw.ar(x),1);y=b.ar(p*x);z=b.ar(p);(GVerb.ar(GrainIn.ar(2,y,y/2,z,p*z,-1),9))/9}//basso gettato #SuperCollider Nathaniel Virgo ## {LocalOut.ar(a=CombN.ar(BPF.ar(LocalIn.ar(2)*7.5+Saw.ar([32,33],0.2),2**LFNoise0.kr(4/3,4)*300,0.1).distort,2,2,40));a}.play Micromoog ## play{VarSaw.ar((Hasher.ar(Latch.ar(SinOsc.ar((1..4)!2),Impulse.ar([5/2,5])))*300+300).round(60),0,LFNoise2.ar(2,1/3,1/2))/5}//#supercollider MCLD ## play{a=Duty.kr(0.1,0,Dseq(fib(32).wrap(20,55).midicps,inf));HPF.ar(LeakDC.ar(Splay.ar(LFCub.ar([-1,a,a/3,-2])))*9).clip2/9};//#supercollider LFSaw # {Splay.ar(Ringz.ar(Impulse.ar([2, 1, 4], [0.1, 0.11, 0.12]), [0.1, 0.1, 0.5])) * EnvGen.kr(Env([1, 1, 0], [120, 10]), doneAction: 2)}.play Tim Walters # play{({|k|({|i|y=SinOsc;y.ar(i*k*k,y.ar(i*k**i/[4,5])*Decay.kr(Dust.kr(1/4**i),y.ar(0.1)+1*k+i,k*999))}!8).product}!16).sum}//#supercollider Charlie Hoistman # Ptpar(({|i|[i*8,Pbind(\scale,[0,2,4,7,9],\degree,Pseq(32.fib.fold(0,10),4)+(2*i+i)-10,\dur,1+2**i%2/6)]}!4).flat).play // #supercollider
午後には仙石線で事前に予約していた某見学に行ったが、その記録はもちろん、 ここ には載っていない。 実はその中身は密かに ここ に追記したのだ(^_^;)。 その後は仙台に戻ってホテルにチェックインして、夕食は国分町のいつもの居酒屋に行き、その後はずっと御無沙汰していたarpeggioに行けた。 この様子ももちろん、 ここ には載っていないのだが、いつものルールの ここ には載せてある。 もろ平日、東北地方の荒天、そしてコロナのためか、他にお客さんがいなかった(^_^;)のだが、マスターにハモッてもらいつつ11曲、充実の時間を過ごすことが出来た。 仙台の1日目はこのようになかなか充実して終わった。
2022年8月4日(木)
昨日に続いて東北地方は線状降水帯が居座って、秋田・山形・福島あたりは大変な状況なのだが、宮城県(仙台)は幸運にも「小雨」程度で済んでいた。 ところが午前10時前に宮城で震度4の地震があって、研究会当日に東京から仙台に向かう人達は時間ギリギリになっても来るか来ないか不明・・・という運営幹事にとってはハラハラする初日となった。 僕は最初から「講師席に持参するパソコンではZOOMを走らせない」と宣言していたのだが、なんと朝イチで気付いたのが「MacBookAirからプロジェクタに出すアダプタを持ってくるのを忘れた」という事実だった。 そこで慌てて「仙台 Apple ショップ」で検索してみると、なんと仙台駅から1分のところに巨大な「ヨドバシカメラ・マルチメディア仙台」というお店を発見して、無事に「miniディスプレイポート→HDMI」・「miniディスプレイポート→RGB」の2つのアダプタをゲット出来た。 やはり、しばらく出張に出かけていなかったので、いつもの準備ルーチンが機能していなかったのだ。
そして無事に研究会が始まった。 自由音場における2チャンネル2次元パノラミックサウンド収音システムのチャンネル間特性 は、ステレオのレコーダの2本の単一指向性マイクを並行でなく配置したものの話で、実際に空間情報が得られるのかどうかを検証したものである。 まぁ、SonyでもZoomでもそういう2本のマイクが交差した製品が出ているので、これは「当然のことを確認する」研究のように思うのだが、それより謎だったのは、製品の位相差の計測実験で、周波数バンドを1000Hzから「1000Hz刻み」で6つにしているのだが、「1000〜2000Hz」ではオクターブでも、「0〜1000Hz」では凄い幅があり、一方で「5000〜6000Hz」では短3度ぐらいしか幅が無いという事だった。 共著者の先生の回答としては、FFTの結果を用いた実験なので周波数としてリニアに刻んだということだったが、ちょっと謎は残った。
これに続く 実環境における2チャンネル2次元パノラミックサウンド収音システムの特性評価 も同じ研究グループで、前の実験は無響室での計測だったのに対して、こちらは残響の影響を実際に計測したものである。 データとしては予想通り、無響室に比べてかなり実環境(残響・反射)によって位相差が暴れていたので、これだとあまり使えないような気もする。
そして、次の 個人用三次元音場再生用収録システムの三次元定位の評価 では、8チャンネルの空間音響のシステムを作っていた。 立方体の8頂点にそれぞれの距離が約40cmとなるようにショットガンマイク(超指向性)を配置して、それで録音した音響を同様の配置の8個のスピーカに囲まれた個人用椅子で聞く、というものである。 インパルス応答を計測したところ、集音ポイントはショットガンマイクの先端でなくて、その先端から13.7cmだけ伸ばしたところにあるらしい。
第1セッション最後の 頭部球体ー胸部楕円体のHRTF は非常にハードな研究だった。基本線として、擬似頭の頭部伝達関数(HRTF)を3項目に分割できることを測定により試みてきたらしい。第1の項目は「耳介を削ぎ落とす前後の鼓膜上音圧の比から耳介の集音効果として検討し、第2の項目は「耳介を削ぎ落とした状態で鼓膜上音圧と外耳道閉塞時の外耳道入口音圧との比を外耳道伝達特性として検討し、第3の項目は「外耳道閉塞時の外耳道入口音圧と自由音場音圧の比を擬似頭の回折係数として検討したという。そしてこの発表はこの第3項目として、頭部球体-胸部楕円体系のHRTFとして検討するというのだが、案の定、予稿はも猛烈な「数学の嵐」だった(^_^;)。 過去の研究では1回の散乱としていたものを多重散乱として、過去の文献も包含しつつより高精度なモデルを提案できたようである。
次の[招待講演]では、音楽情報科学研究会でお馴染みの中村さんのウェーブレット変換と深層学習を融合した音源分離であった。 応用音響研究会とか聴覚研究会の皆さんにとっては、初めて聞いたのではちょっと凄い話なのだが、さすが音楽情報科学研究会の新ホープ、うまく説明してくれたので、なんだか会場の人々が皆、分かった気になった。 僕も、話としてはそこそこ難解な筈なのに、これまで何度となく音楽情報科学研究会とかICMCとかで触れてきていたので、だいぶ良く分かった。 しかしまぁ、DNNもウェーブレットも僕はあまり好きではないので(^_^;)、こういう分析系は「お任せ」で眺めている感じである。
そしていよいよ本日最後のセッションとなった。 僕は今日のオーラスなのだが、その前の 低いプレート電圧に対する真空管のSPICEモデリング 〜 五極管の三極管結合と三極管に対する特性の比較 〜 というのはオンライン発表だったものの、なかなか会場の「電気通信研究所」にふさわしい発表だった。 僕は小学生の頃に、親父に教わって真空管ラジオを半田付けで作ったり、アマチュア無線のあたりで真空管に親しんできたのだが、今の学生って「真空管」って知ってるのかなぁ。 予稿を読んでみると、SPICEでシミュレーションして、真空管を普通の電圧から1桁も低い、10Vから30V程度のプレート電圧で動作させようというものだった。 この論文 は照岡さんが喜びそうなネタかもしれない。(^_^;)
そして最後は僕の コンピュータサウンド教育のためのインタラクティブ環境について 〜 Max,SuperCollider,Processing,SonicPi,およびMozziの検討 〜 だったが、あれこれ持っていく準備に追われて、写真を撮ってもらうのを忘れてしまった。 用意したデモは、やはり半分も見せられなかったが、Maxとか知らない人も多かったようで、そこそこウケた。
無事に発表が終わったので、国分町の通りをまっすぐに北上してホテルに戻り、前夜と同じ居酒屋に行き、前夜と同じようにarpeggioに行って(この日はお客さんがたくさんだったので7曲)、熱い仙台の2夜目が過ぎ去った。 この様子ももちろん、 ここ には載っていないのだが、いつものルールの ここ には載せてある。 やはり、オンライン学会とは全く違って、リアル学会出張というのは、いいのだ。(^_^)2022年8月5日(金)
研究会の2日目も朝から小雨だったが、東北や北陸では集中豪雨でエラい事になっているので、まだまだ仙台はマシなのだった。 朝イチで早めに会場に来た人達だけ、会場の電気通信研究所にある無響室や暗室などを見学するツアーに参加できたが、そのあたりの写真は後日に追加することになる。 午前セッションの最初の 天頂方向のノッチ周波数の最適化による全天空個人化頭部伝達関数の生成 は、昨日も話題になっていた頭部伝達関数HRTFの研究で、「PNP(Parametric Notch-Peak)HRTFモデルを用いて、天頂方向で個人化したノッチ周波数から前方および後方のノッチ周波数を推定し、これらの情報から全天空の任意の方向の個人化頭部伝達関数を生成する方法」の提案だった。 ただし「全天空」といっても実は半分、「上半球」ということだった。 次第に判明してきたが、応用音響研究会では、無響室や多数のスピーカによって、かなり地道に人間の聴覚(耳に届くまで)を研究している人が集まっているのだった。 これは施設が必要になるので、ちょっとなかなか手を出せない感じである。
2件目の 2次系推定誤差が能動騒音制御を不安定化させる原因と対策 というのは、能動的騒音制御のフィードバックに関する過去の説明(証明されている)に納得できず、一人で考えてようやく解決した・・・という発表だった。 中身は騒音制御フィルタに関する「もろ数学」で、いきなりこんな話を聞いてもなかなか分からなかった。 質疑では同様のベテラン(TOA)との話が噛み合っていて面白かったが、どうも、この世界(応用音響)には息の長いベテランが跳梁跋扈しているようだ。
3件目の スピーカアレイにおける指向性生成のための配置パターン選択法の検討 は、4個のスピーカに加工した音響を与えて、全体として強い指向性を実現しようという研究らしい。 超音波振動子をずらりと並べた秋月電子の「直進スピーカ」の方は原理から分かっているのだが、この研究については「ほんまかいな」というのが第一印象である。 そしてあれこれ考えながらオンラインの発表を聞いていたのだが、結局、普通のスピーカでは直進スピーカにはならないようだった。
午前セッションの最後の 位相反転による一筐体ステレオ再生方式のパラメータに関する検討 はタイトル通りの研究で、小型で1個のスピーカ筐体(スピーカは4個)で効率的にステレオ効果を拡張させたいらしい。 ただし筐体は1個だとしても、2個のスピーカのセットを2組、合計4個が必要になる。 そのセットごとに位相反転させた信号を与えて、周波数帯域によっては同相にするとのことで、なんだかちょっと怪しい感じだった。 結論/課題として、通常のステレオより劣るという結果だったようで、なんでわざわざ逆位相にするのかが不明のままだった。 ここで休憩となり、昨日からここまでのセッションは「電気音響」だったが、午後の3件は「聴覚」セッションである、と告げられた。
昼休みの間に午後セッションの3件の予稿を眺めてみたが、さすが「聴覚」というか、音知学会などと似ていて難しそうだ、という予感がした。 1件目の 水平面における音源間の角度が聴覚オブジェクトの知覚に及ぼす影響 は、タイトルでは簡単そうだったが、無響室とマルチスピーカを使った聴覚情景分析に関する本格的な実験だった。 さすが東北大、まともに実験をしていて、被験者実験の結果の分析もきちんとしているのだが、ここで午後の悪魔(睡魔)が攻撃してきて、それほど驚く事がない(まぁ想定できる)その内容は残念ながらうっすらと頭を通過していった。
2件目の 頭部運動を制限した長時間刺激の音像定位精度 は、過去の研究を受けて追加した実験なので、その全体像としては、頭部運動の制限(固定)が「あり」と「なし」(自由に頭部を動かすと音像定位の精度が上がる)との関係として、(1)刺激が短いと「あり」「なし」いずれも成績が悪くなる、(2)刺激が十分に長いと「あり」「なし」いずれも成績が飽和する、ということから、(3)頭部運動を伴う音像定位と頭部運動を伴わない音像定位の精度に有意差が生じる刺激の長さには一定の範囲がある、という予想を追求していた。
最後の 聴覚フィルタバンクを用いた音質評価指標の検討 というのは、さすがJAIST、もろ数学の「計算モデル」の研究だった。 「まず聴覚フィルタバンクを利用したTDラウドネスモデルを構築し、その出力がISO532-2で規定されたラウドネスと一致するか検討」し、次に「TDラウドネスモデルを用いてシャープネス・ラフネス・変動強度の計算モデル(TD-SQMモデル)を構築し、SQMsに関する聴取実験の結果を説明可能か検討」したということらしい。 とても難しかった。
そして無事に研究会が終わり、仙台駅に着いてみると、東京に向かう新幹線まで1時間ほど余裕があり、午後3時ということで「牛たん通り」も混んでいなかったので、気合いで「喜助」の牛タンをいただいた。 この様子はもちろん、 ここ に載っている。 そして長い時間をかけて浜松に帰り着いた。 やはり、オンライン学会とは全く違って、リアル学会出張というのは、いいのだ。(^_^)
2022年8月6日(土)
6月の立命館大学に続いて、昨日までの東北大学での「リアル学会」に行けて満足なのだが、ある意味でこの夏のメインの筈だった札幌でのLIFE2022が「完全現地開催」から「完全オンライン」に萎んでしまったので、ややテンション低めである。 今日は3年ぶりのオープンキャンパス1日目だが、COVID-19のために完全事前予約制で、僕のお仕事(個別相談)は明日にある。 今年は出張の関係でオープンキャンパスでの作品展示に関しては完全ノータッチを貫いたので、かなり楽である。 ネットでは 政策はAIに全面委任、デンマークで「人工党」結成 というニュースとか、 京大の授業を無料で受講できる「京都大学オープンコースウェア」終了に伴い「yt-dlp」で動画のダウンロードが推奨される というニュース、さらに関連リンクで YouTubeやニコニコ動画などのムービーを最高画質・高音質でダウンロード可能な「yt-dlp」の使い方まとめ、年齢制限ムービーも一発ダウンロード可能 とかの新情報が届いたのだが、まぁ、深入りする余裕はない。 このページ (秘密ページとかを含めて)の写真を整備したり、出張報告(復命書)の提出、リンツに行く出張申請書類の作成、海外旅行保険の加入、海外モバイルWiFiルータの予約、などなどの事務仕事をしつつ、仙台出張の疲れをぼちぼち癒す1日となった。 ちょっと驚いたのは、海外旅行保険、海外レンタルWiFiルータ、いずれも以前よりだいぶ安くなっていた事である。2022年8月7日(日)
オープンキャンパス2日目、個別相談の担当だけお仕事があり、午後には「総合演習II」の2人の追加プレゼン(オンライン)があった。 その合間に、ちょっと忘れかけていたが SUACインスタレーション(5) に、「基礎演習E」の2作品と「音楽情報科学」の2作品を追記したが、もうだいぶ忘却していた。
2022年8月8日(月)
来週に予定されていた「夏の札幌」LIFE2022がオンラインに変更となったので、今週にZOOMリハとかあるものの、ぽっかり空いた心の穴は塞がらない。今日の午後にはゼミ吉田さん、明日の午後にはゼミM1王さんのアポがある程度なので、今週は「GENお勉強週間」にする事にした。 スタートラインは ここ か ここ である。 いずれもGENに初めて取り組む人向けなのだが、どっちが最初なのかがなかなか悩ましい(^_^;)。 ググッと眺めた末に、 ここ から始めることにした。 「Why Use Gen?」の「General」で挙げられている項目のうち、僕が必要なところだけ抜粋してDeepL翻訳で並べると以下のようになる。 残りの4項目はまぁ、どうでもいい。「Why Use Gen?」の「Examples」で挙げられている項目のうち、当面、この夏に僕が必要なところだけ並べると以下のようになる。 残りの3項目はまぁ、どうでもいい。
- 通常のMax/MSP/Jitterのオブジェクトでは効率的に実現できないような処理を行いたい
- 新しいアルゴリズムを設計し、それをすぐに見たり聞いたりしたい方
- arbitrary new oscillator and filter designs using single-sample feedback loops with gen~
- reverbs and physical models using networks of short feedback delays with gen~
- efficient frequency-domain processing such as spectral delays using gen~ inside pfft~
- geometry manipulation and generation with jit.gen
- particle system design with jit.gen
このページの英語はスッキリしていて、いちいちDeepL翻訳にコピペ突っ込んで変換する手間もなくサクッと読めるので以下に簡単にまとめる。 GenはこれまでのMaxの特長(箱を並べてラインで繋ぐ)を継承しつつ、Computer Musicにおけるもう一つの大きな柱「言語で記述するプログラミング」とを包含するのが特徴である。 Gen自身がMaxの新しいパッチのスタイルをとっていて、MSPもjitterも包含していて、Max Gen objectを「gen」と呼び、MSP Gen objectを「gen~」と呼び、Jitter Gen objectsを「jit.gen, jit.pix and jit.gl.pix」と呼ぶ。 Max Gen objectの全リストが これ、 MSP Gen objectの全リストが これ、 jitter Gen objectの全リストが これ である。 GenパッチはGenオブジェクトの中身の処理を記述している。 その処理は以下のように内部的には GenExpr として言語的に記述され、コンパイルされている。
「GenExpr はパッチャーとコードの世界を共通の表現で橋渡しし、Gen オブジェクトはその計算を実行するために必要なターゲットコードに変換します。gen~、jit.gen、および jit.pix は透過的にネイティブ CPU マシンコードをオンザフライで生成しコンパイルし、一方 jit.gl.pix は GPU コード (GLSL) に対して同じことを実行します。Gen オブジェクトで作業する場合、Max を離れることなく、独自のカスタムプリコンパイルされた MSP と Jitter オブジェクトを書くことになります」(DeepL翻訳)ということで、裏でオンザフライでCPUネイティブコードを生成してコンパイルするとは、凄いことなのだった。 そして試しにMax8を起動して「gen」と入れてヘルプを開くと、以下のようにGENの旅がスタートした。
ここまでで、まだ このページ の最初の10%程度のところだったのだが、その後のトピックの「The Gen Patcher Window」・「Patching in Gen」・「Auto-compile」・「Gen Operators」・「Standard Operators」・「Argument Expressions」・「Send and Receive」・「Subpatchers and Abstractions」・「Subpatcher/Abstractions and Parameters」・「Setting Parameter Defaults」・「The gen~ Object」・「gen~ Operators」・「History」・「Delay」・「Data and Buffer」・「Technical notes (gen~)」・「Jitter Gen Objects」・「Jitter Operators」・「Coordinates」・「Vectors」・「Sampling」・「Geometry」・「Color」・「jit.gen」・「jit.pix」・「jit.gl.pix」・「Numerical Values in the Kernel」・「jit.pix vs. jit.gl.pix」などの話題はサササッと斜め読みして、とりあえず このページ を終えてしまった。 もう、サンプルを触りたくてうずうずしてきたので、次の このページ に進むことにした。 その内容は以下のようなものだった。
上の品揃えのうち、いちばん最後の「Gen Code Export Tutorials」は僕には不要なものだった。 また、「Gen Patcher Collections」という このページ をチラッと見てみると、ここはなんと「GEN大喜利大会」という無法地帯だった(^_^;)。 そこで初心に戻って、「The gen~ for Beginners Series」から順に眺めていくことにした。
- Gen GenはMaxのパッチワーク環境の拡張で、ビジュアルにビルドしたものを効率的なコンパイルコードに変換しながら進めていくものです。Gen は Max の機能を拡張するだけでなく、Gen のコードは Code Export を使って Max の外部で使用することができます。Gen には、オーディオ用の gen~ オブジェクトと、マトリックスとテクスチャ処理用の jit.pix と jit.gen オブジェクトが含まれています。非常に低いレベルで効率的なオーディオとビデオ処理を行い、すぐにフィードバックを得たい場合には、Gen を使用してください
- The gen~ for Beginners Series
- gen~ for Beginners, Part 1: A Place to Start
- gen~ for Beginners, Part 2: Similarities and Differences
- gen~ for Beginners, Part 3: Counting, and a World without bang Messages
- gen~ for Beginners, Part 4: Working with buffers (and data)
- gen~ for Beginners, Part 5: The codebox Operator
- gen~ for Beginners, Part 6: Thinking Inside the Codebox
- gen~ for Beginners, Part 7: Creating Reusable Tools
- Online Tutorials
- Gen Tutorial 1 - The Garden of Earthly Delays
- Gen Tutorial 2a - The Joy of Swiz
- Gen Tutorial 2b - Adventures in Vectorland
- Gen Tutorial 3 - The Fine Art of Surfacing
- Gen Patcher Collections
- gen~ Example Patches
(ここに多数のgen~ Example Patchesが並んでいる)- Gen Code Export Tutorials
- Code Export for Audio Units
- Code Export for VST
- Code Export for iOS
- Code Export for ISF
Part 1: A Place to Start では、本当にMax初心者に向けての概要解説で、お決まりの「Why Would/Should I Learn gen~, anyway?」(→リアルタイム音響信号処理その他の性能がGENによって画期的に上がる!!)に続いて、なんと「The Reduction of Anxiety」(不安の解消)というコラムもあった。そして「The gen~ Patcher Window and gen~ help」という概説までで、これはアッサリと読み終えた。
Part 2: Similarities and Differences (類似点と相違点)は、これまでMaxを使いこなしてきた僕には逆に重要なパートである。 読み進んでいくと、「Comforting Similarities」(心地よい類似性)・「The Ins and Outs of the gen~ object」・「Setting State: Inlets, Arguments, and Attributes」と進んだが、このパートも問題なかった。 実際にExamplesを触って、何か問題があればここに戻ってくることにしよう。
Part 3: Counting, and a World without bang Messages のあたりから、ちょっとゆっくりと試してみることにした。
上のパッチは「ここでは、ミリ秒単位でカウントを指定することができる counter パッチの簡単なバリエーションを紹介します - パッチに mstosamps 演算子を追加すれば、準備は完了です。Gen パッチング環境は Max の ITM 機能について何も知らないので、入力のために音符の値をミリ秒に変換する translate オブジェクトを使用する必要があります」というものだが、どうもGenのCounterはだいぶ変わっていて、このあたり、実際に中身を作る際には これ とか これ をよく調べる必要がありそうだ。
上のパッチは従来のMSPのサウンドバッファを経由せず、サンプルポイントごとにサウンドサンプルをcounterで読み出してはそのデータごとにサウンド出力しているというもので、それだけでも十分に凄い。 ただし以下のように、さらに「スピード」で指定したり「周波数」で指定して、可変のサンプル再生が可能になるのだった。
「A World Without bang Messages」というのも大きな違いである。 「シングルサンプルGen~の世界では、バングメッセージのない世界で生きるという、ちょっと変わった特徴があるんです。Gen~の世界では、通常のMaxパッチのイベントレート(bangメッセージを使用)やMSPのオーディオレート(シグナルベクターごとに1回値を送信できる)ではなく、一度に1サンプルずつ操作しているのです。Genの世界では、パルスはバングメッセージに相当するもので、1サンプルの時間枠内で起こるゼロ値から任意の非ゼロ値への遷移を指します。Genの環境では、このシングルサンプル長のパルスをいたるところで使用しています」というのは、ちょっとした発想の転換である。 この「click~」の例として、以下の2つのサンプル(特に「Meet the latch」という下の方)はなかなか刺激的なものだった。
まさか、ここで「ラッチ」がこれほど活躍するとは思ってもいなかった。 かつて、音源LSI(DSP)を設計していた頃、システムクロックで全てのデータをその瞬間に保持するというラッチは、全ての基本だった。 作るサウンドエレクトロニクス 第5章 の主役は、ラッチであるとも言える。 以下の回路図を見れば、まさに「ラッチ(574)の山」である。MSPをオーディオレート領域で使用する場合、スレッショルド値に基づいてオーディオレート入力をサンプリングするためにsah~オペレータを使用したことがあると思います。latchオペレータも同様ですが、これはスレッショルドを使用しません。ラッチオブジェクトの右インレットに0でない値を送ると、左インレットに入力されたサンプルはすべて渡されます。ラッチオペレータは、次のゼロ入力を受け取ると、その左インレットで受け取った最後の値を出力し続けます(ラッチオペレータをインスタンス化したときのデフォルトの最後の値は0ですが、ラッチオペレータの@init属性を使用して変更することができます)。
上の例は、ランダムなソースを手動でサンプリングする方法を示しており、2番目の例は、少しのMSPパッチを使用して自動的にクリックを駆動する方法を示しています(あなたは、MSPを使用して、クリックを生成するためにITM値を使用して実験することが望ましいかもしれません)。このシンプルでわかりやすい手間いらずのデザインは、様々な場面で非常に役に立ちます。Genが動作するシングルサンプルレートより低いレートで周期的に値を出力することです(このテクニックの動作の素晴らしい例として、Genのexamplesフォルダにあるgen~.chaos.maxpatパッチャーを見てみてください)。
gen~ のパッチの中で、ラッチが何度も使われているのを見ることでしょう。このチュートリアルのサンプルパッチフォルダには latching_fun という小さなパッチが含まれており、いくつかの簡単な演算子でできることのいくつかを見て、あなたの食欲を少し刺激することでしょう。楽しんで、そしてパッチャーで何が起こっているのかを調べてみてください。
まだこの Part 3: Counting, and a World without bang Messages は続いているが、ゼミ吉田さんアポの作戦会議、そして領域の教務関係の連絡があったりしたのでここで今日はオシマイとなった。
2022年8月9日(火)
朝イチから領域の教務関係のお仕事に忙殺されたが(^_^;)、午後のゼミM1・王さんアポまでの時間にも Part 3: Counting, and a World without bang Messages を少しでも進めることにした。 「Working with Pulses」の冒頭、「gen オブジェクトの内部では、シングルサンプルパルスが広く使用されています。この考え方のコツをつかめば、gen~オブジェクトの内部でロジックを扱う際の多くのことがよりシンプルになります。加えて、ロケット手術を行わなくても、素敵なノイズを作ることができます」と書かれていれば、これは何とか頑張ってみようという気になる。
「1. Routing operators use the pulse」として、「? (comparator)という演算子は、左インレットに送られたパルスに反応します(実際には、+=演算子やplusequals演算子のように、2つの異なるエイリアスを持つ同じ演算子です)。そのパルスを見たとき、第1インレットに送られた0以外の値は、第2インレットで受信したものを通過させます。0の値は、第3のインレットで受信したものを通過させます。つまり、パルスは1サンプルのスイッチなのです」ということで、上(上)のようにOscillator Sync的に使えそうだったので、さっそく上(下)のように3つ並べてみた。 CPUの重さは激軽なので、これなら相当に多重化できそうだ。
「2. Pulses can reset an operator's state」として、「すでに見てきた多くの演算子では、カウンタ演算子、位相演算子など、演算子の初期状態をリセットするためにパルスを使用してきました。サンプルごとの非ゼロ値の出現は、Gen~のツールボックスの中で、最も地味な状況においても、強力なツールです」とあった。 上のように、こちらもサンプルのブロックを3つ並べてみたが、これらに個別に多数のセンサ情報を与えることで、何か面白い音響が生成できないか、いずれ試してみよう。
「3. Logic signals can be used to generate and compare pulses」として、上のようにcounterオブジェクトを「生のサンプリングレートで刻々と」up/dpwn/updownカウンタにする、というのも容易に実現できることが示されていた。 これもまた、Oscillator Sync的に使えそうな気がする。
「Leaving the gen~ City Limits」として、「Gen オペレータは、パルスを入力として働くだけでなく、パルスを出力することもできます。その出力がoutオペレータに送られる場合、scope~オブジェクトを使って出力を見ることができます。それらの出力から bang メッセージを導き出す必要がある場合、それらのメッセージを作成するためにちょっとした MSP ロジックを追加することができます。ここでは、gen~ パッチでレートオペレータを使用してクロックデバイダを作成する例を示します」・「この gen~パッチャーの内容は、論理演算子(この場合は less than (<) 演算子)がレート演算子の出力をゼロに戻し、チェンジ演算子がその低下を負の値として報告すると、パルス(1の数値からなる「メッセージ」と考えてください)を送ることを示しています(ところで、チェンジ演算子は任意のステップ信号を一連のパルスに変換する最も簡単な方法です)」・「クロック乗算器も同じように動作します。レート演算子に異なる引数を使用するだけです。入力にparam演算子を使用してレート演算子の値を設定できるクロック乗算器/除算器を作成できるかどうか、ちょっと試してみるのもよいかもしれません」と、上のようなサンプルがあった。 クロックデバイダをこんな風に設計するという発想は無かったが、これはどうも、だいぶ頭を柔らかくする必要がありそうだ。 ここで出てきた「history」オブジェクトは、おそらくGENの「肝」なので、今後も注目していこう。
最後の「Before We Part....」では、「ここで説明した多くの機能を使用するGen~パッチの例として、あなたがいつも使っているもの、しかしその繊細さがあまり知られていないかもしれないものをエミュレートしています:MSPゲイン~オブジェクトです。皆さんは、レベルをコントロールするためにgain~オブジェクトをいつも使っていると思います。フェーダを動かしている間、実際には進行方向を追跡し、スムーズな出力を生成するために作業している間、その入力を増加または減少させているのです。これは、実は奥が深く、微妙なMSPオブジェクトなのです。ここに、gain~オブジェクトと同じ機能を果たすgen~パッチャーがあります」ということで、上のようなサンプルがあった。
そして、これはかつて、「音楽情報科学」での「Max思い出し」教材(control系)の これ の最後のあたり「control_12.maxpat」で、入力データを「細かくサンプルしつつ指数関数的に補間する」というパッチで行っていた、上のような考え方に似ている気がした。 そこでとりあえず、「control_12.maxpat」のサブパッチ部分を「gen」で置換できるかどうか・・・とやってみたのが以下である。
エラーの嵐となったが、genの内部では「変数」(整数、不動小数点数)が使えないらしい、とは分かったものの、「if」も駄目だと判明したのは大きな収穫である。 まだまだGENを作る(過去のパッチをGEN化する)のは先だ、と判明したところで今日はオシマイとなった。 これで Part 3: Counting, and a World without bang Messages が終わって、明日はその次からである。
2022年8月10日(水)
明日は祝日、その後はお盆の連休に突入するという時期なのだが、CIVID-19は相変わらずである。 機材返却のアポを入れていた鈴木さんは家族のコロナのためアポをキャンセルして、あと同様に機材返却の小島さんのアポがあるだけで、週2のギター(20分)と午後のJoyJoyヒトカラぐらいしか他に予定の無いこの日は、実質は半日もないものの、格好のお勉強日和ということになった。 昨日までで The gen~ for Beginners Series のPart3まで終わったので、今日は gen~ for Beginners, Part 4: Working with buffers (and data) からである。
この冒頭、「あなたはGenでの作業を学ぶことに興奮し、genオブジェクトのヘルプファイルを開き、ヘルプファイルのbuffer-and-dataタブをクリックし、中身を見るためにgenオブジェクトをダブルクリックすると...というのは、よくある問題です。そして、あなたは混乱したオプションのセットに直面することになります。しかし誤解しないでください。ヘルプファイルに書かれていることは、素晴らしい可能性の全宇宙を簡潔に、そして有用な形で抽出したものです。ただ、基本的な例をいくつか見ていく方が簡単だし、その過程でちょっと楽しくなってくるかもしれません。前回と同じく、私の友人であるPerry Cookが2001年のNIME基調講演で述べた、新しい楽器をデザインするためのアドバイスを紹介しましょう」とあった。 この名前に触発されて、まず、依頼されて僕がワークショップを行った2000年のベルリンでの ICMC2000 の記録から、 2000年8月30日 の中に、以下のPerry Cook氏の写真を発掘した。
プリンストン大学で教授のポストを得るために、同領域の研究者からの推薦としてPerry Cook氏から僕に依頼のメイルが届いたのはだいぶ昔のことだった。 僕はSUAC事務局の了解を得て公式に推薦状を出したが、そのPerry Cook氏のNIME2001のKeynoteは これ である。 そして、僕は音楽情報科学研究会での 新楽器へのアプローチ という論文の中でも、このPerry Cook氏の論文を参照していた。 ちなみに上の この日の記録 には、以下のようにRadio Batonを実演している、Max Mathews先生の姿もあった。 これが数十年間にわたって、世界のComputer Music研究をリードしてきたMax Mathews先生(2011没)であり、そのIRCAMでの弟子だったMiller Puckette(→PureDataに発展)とDavid Zicarelliが作ったのがその名をとった"Max"だったのだ。 David Zicarelliは現在までCycling'74社のCEOとして、Max8までの全てのversionの現役メインプログラマーである。
まず最初は「Simple counter-based buffer access」ということで、「ここで紹介するプレイバックのテクニックは、gen~パッチャーにあるバッファ演算子とデータ演算子の両方に使えますが、ここではバッファ演算子に焦点を当てます。ここで、先週見たバッファ演算子によるアクセステクニック、つまりカウンタ演算子を使ったバッファからのサンプル取得について思い出してみましょう」と、Part3でやっていた以下のパッチが再登場していたのだが、改めてこれを眺めてみると、かつてのMSPではDSPとして必ずAudio Bufferとして32から2048までの間のサイズの「I/O Vector」を定義していたのに対して、モロにAudio Bufferを1アドレスごとにアクセスしているのに驚かされる。
そして「先週紹介した基本的な再生パッチのバリエーションをお見せしたいと思います。そして、このパッチにはクールな新しいトリックも含まれています」として出てきたのは以下のパッチなのだが、「# of sections」というパラメータが3とか10であればこれまで聞き慣れた「random_section_playback」だったものの、これを100とか200とかまで上げられるというのに驚いた。 「パッチャーの残りのロジックは、次の2つのことを行うためのものです。(1)バッファの内容を等しいセクションに分割する、(2)バッファの内容を均等に分割し、その中からランダムに1つを選んで再生する。サンプル数で数えるので、バッファを等しいセクションに分割するのは、バッファ内のサンプル数をセグメント数で割ればよいだけです」と、言われてみればその通りだが、これはDJプレイには強力な武器になりそうだ。
このパッチには、今まで見たことのない演算子、dim 演算子が含まれていることにお気づきでしょう。dim 演算子は、私たちのパッチで扱っている buffer 演算子と同じ名前の引数を取ることに気づけば、この演算子が何をするものなのか、おそらく見当がつくでしょう。 これは、あなたのパッチをもう少しスパゲッティ・パッチコードのない状態に保つのに役立ちます。
このGen~パッチャーで、ランダムセクションを選択して再生する部分では、乱数ソースとしてノイズオペレータを使用しています。カウンタ演算子が限界に達するたびに、前回のチュートリアルで紹介したラッチオブジェクトにパルスを発し、ラッチオブジェクトはノイズ演算子から値を取得して保持します(ノイズ演算子の出力は波形なので、スケール演算子を使用して適切な範囲に収め、0から最終セグメント(もちろんセグメント番号は-1)までの数値を与える必要があります)。出力は整数値である必要があるので、Gen trunc 演算子を使用します。これは、小数点の右側の部分を取り除くことによって浮動小数点数を整数値に変換するものです。
セグメント番号とセグメント内のサンプル数が分かれば、あとはピーキングオペレータに送るカウント値を、再生したいセグメントの開始位置に対応するサンプル数だけオフセットすればよいだけで、あとはちょっとした掛け算と足し算だけです。
ここで解説はさらに、「 これらのパッチで作業していると、おそらく遭遇することの1つは、ここにあるサンプルファイルがモノラルファイルであるということです。ステレオバッファ〜オブジェクトを使って作業したいかもしれません。そうするためには、もちろん、あなた自身のステレオバッファ〜オブジェクトを親Maxパッチに追加するか、replaceメッセージを使用することになります。モノラルとステレオのオーディオファイルをどのように切り替えることができるでしょうか?この違いを扱う簡単でエレガントな方法を紹介しましょう - peekオペレータの新しいアトリビュートを使います。これは、存在しない再生チャネルを選択した場合、ラップして存在するチャネルを選択することを保証するものです。つまり、チャンネル0と1を要求した場合、モノラルのファイルであれば0と0が再生されます。巧妙なトリックでしょう? 」と続いた。 この実例は後に出てくることになる。 また、「 バッファをセグメント化し、それらのセグメントを新しい順序、新しい方向、新しい速度で再生するための興味深い戦略を見つけることは、とても楽しいことです(パート3のアップ/ダウン/アップダウン・カウント・パッチを覚えていますか?このパッチのカウンタ演算子の部分にそれを代入して、ランダムモードのセグメントをランダムに再生するロジックを試してみてはいかがでしょうか......) 」と続いていて、なかなかここの著者は親切なのだった。
次のテーマは「No Peeking This Time」であり、「peek 演算子も楽しいですが、Gen 環境ではバッファやデータ演算子を扱うための興味深いメソッドが他にも用意されています。そのうちの4つは、sample/nearest、lookup、wave 演算子です。簡単に言うと、これらのメソッドは、バッファオペレータから情報を取得するために、異なる種類の信号入力を使用します」とのことで、peek以外の演算子についての話題となった。 上のサンプルでは、phasor~で基本的なサンプル読み出しスピードを自在に設定した上で、rate~で設定した値に応じてgen~内部で読み出しアドレスを変調して、第2のgen~内部のlookup演算子のパラメータを生成している。 これもまた、DJ屋であればあれこれ改造したくなる、格好の材料のようだ。 その後、「Changing the speed」・「Changing the start point」・「Altering the playback」と解説が続いたが、どうも僕にはあまり美味しい感じがしなかったので軽くパスした。(^_^;)
考えてみれば、信号処理の際に値をサンプルの集まりのインデックスとして使う場面はもうひとつある。この場合、入力信号を使って、ある種の伝達関数を含むバッファのインデックスを作り、その結果を再生に利用するのです。インデックスのために使用する入力は信号なので、インデックスのために使用する範囲は、phasor~/phasorが与える0.-1.0の出力ではなく、-1.0から1.0という標準の信号範囲になります。
それはまさに lookup 演算子が行うことです(MSP で lookup~オブジェクトを使ったことがある人は、その使い方にも慣れていることでしょう)。lookup_drawing_example パッチは、古典的なウェーブシェーピングの gen~ による実装を示し、また、独自の波形を描き、それを iter、counter、poke~オブジェクト(ハウスキーピングを処理する trigger オブジェクトと共に)を使用して buffer~ オブジェクトに転送し、multislider オブジェクトの出力を書き込む方法を示しています。buffer~がロードされたら、gen~パッチで buffer~ オブジェクトと buffer オペレータを関連付け、波形整形を行う準備ができました。ルックアップと出力を行うことは、ご覧のように Gen では非常に簡単です。
ここでちょうどPart4の半分ぐらいまで来て、後半のタイトル「Waveshaping and other forms of mayhem」となった。 上のサンプルは、自分で波形テーブルを描画して、それに従ってウェーブシェーピングを行うという、まぁ古典的な処理をGenで実装したものだという。 まぁ、僕はどちらかというとWaveShapingはお好みの範疇ではないので、ここは軽く読み流す感じになったが、「歪み好き」な人たちにとっては、ここは美味しいところなのだ。 そして次の「Not drowning, wave-ing」では、peekに続いて、遂に「poke」がやってきた。 リアルタイム(サンプリング周波数)で、波形メモリをpeekするだけでなく、ライヴ・サンプリングとして波形メモリにpokeできるとすると、これはちょっと面白い可能性が出てきた。
この解決策では、rate オブジェクトを利用し、内部的に親パッチの phasor~ オブジェクトのレートを変化させます。rateオペレータに送られる値は、スタートポイントとエンドポイントのサンプル値の一方または両方が変更されるたびに、バッファの何パーセントが再生されるかを知ることに基づいて計算されます。 このパッチのもう1つの興味深い特徴は、channels オペレータを使用していることです。dim 演算子と同様に、バッファの名前を引数として受け取ります。しかし、channels 演算子は、あたかも buffer オブジェクトの右アウトレットからの接続を使用するかのように、その名前のバッファに含まれるチャンネル数を出力します。
上のサンプルでは、サウンドとしては可変リバーブのようだが、gen~の中身を見てみると、まず刻々と「可変poke」で波形バッファに書き込みつつ(historyで遅延ループあり)、それを「可変peek」で読み出すことで遅延ループのリバーブを実現している。 これはかなり画期的で、DSPモニタのCPUも4%程度と「超軽い」処理なのだった。 今後はもう、ディレイ/リバーブ系はGENでないと駄目っぽい感じである。 ちょっと駆け足だったが、これで gen~ for Beginners, Part 4: Working with buffers (and data) も終わりである。
そしてここで思い出したが、昨日のゼミM1・王さんアポの時にGENを紹介したのだが、2018年に東京藝大で開催された Max Summer School 2018 in 藝大 の中で、IRCAMから帰国して藝大の先生になった後藤さんが担当したレクチャーの中に、 このような資料 があったのだった。 昔からMaxのトップクラスβテスタであり、直前までIRCAMの「中の人」だった後藤さんにしか書けない、とても「濃い」資料なのだった。 「GEN examples」という中には、「Karplus-Strong synthesis」とか「plucked string」とか、伝説の物理モデル音源もGenでスマートに実装されている。 これ も、今回の夏休みお勉強シリーズの最後あたりに、またザッと眺めてみることにした。 ・・・ということで、午後には気持ち良く、JoyJoyヒトカラに出かけることにしよう。
2022年8月11日(木)
昨日はJoyJoyヒトカラ6時間59曲を完走してヘロヘロになったが、なんと今日は祝日だという。 昔は無かったけど新たに作られた「海の日」は知っていたが、「山の日」なんて祝日も出来ていたらしい。 どうせ東京オリンピックに合わせて夏季の祝日を増設して、さらにオリンピック開催年には開会式とかの日に移動するために作ったのだろうが、COVID-19のために僕にとっては「幻の東京オリンピック」に終わったし、祝日感はまるで無い。 研究室に出てくると、毎年3月あたりに結果発表される世界的な「オリジナル楽器コンテスト」の Guthman Musical Instrument Competition について、「The deadline for submissions is October 3, 2022」とのアナウンスが届いた。 それより、このページの下の方にあった、Center for Music Technology, College of Design, Georgia Institute of Technologyのプロジェクト FOREST というのが、 デモビデオ がなかなか不気味で面白かった。 ニョキニョキと多数並んだロボットなどの Robotic Musicianship という解説ページ、あるいはプロジェクト全体を解説した Finding Their Groove などのページは、ぜひ学生にも精読して欲しいところだ。
そして昨日は、自宅に届いたCQ出版「トランジスタ技術」誌の今月の特集が「3Dプリンティング」だったのを契機に、大きな決断をした。 KAWAIにいた時には「インターフェース」誌とともに毎月必ず職場に届いていた「トラ技」を、翌年1993年の退社独立を視野に、1992年の秋ぐらいから地元の谷島屋書店外商部に定期購読を契約して自宅に配達してもらって、なんと30年間も続いてきた。 思えば このページ の「著作」のところを見てみると、まだサラリーマン時代の1989年、「インターフェース」誌の 第150号 に、 マイコン・システム構築技術セミナー という100ページを超える特集記事を書いたのをスタートとして、「インターフェース」誌に色々と連載記事を書いたり、CQ出版社からの単行本として 「マイコン技術者スキルアップ事典」・「プロ電子技術者のコモンセンス」・「Java & AKI-80」・「コンピュータサウンドの世界」と4冊を出していた。
その後、「トラ技」の記事も書いたりしていたが、大きなトピックとしては、この定期購読の「トラ技」の記事を読んでPropellerを知って、最終的には 「日記」シリーズ の実質的な皮切りとなった Propeller日記 を書きつつこのプロセッサを理解し(現在、日本でPropellerをここまで理解しているのはたぶん10人以下)、「トラ技」にも2号連続でPropeller関連の記事を書き、さらにはPropeller関連のネタで多くの学会発表をしたり、さらには今日まで僕とロシアが繋がるきっかけとなった(詳細省略)、パリのICEC2009での チュートリアル ★ にまで繋がった。 最近では「インターフェース」誌に 生体情報センシング の特集記事を書いて、それが現在まで共同研究が続く、辻下先生との出会いに繋がったのだから、まぁCQ出版社に足を向けて寝ることは出来ない。
しかし、過去には厖大な広告で分厚かったものを毎月カッターで切り落として薄くしていたものの、30年間というのは物凄い分量であり、2019年には「5年間、アクセスしなかった文献は捨ててよし」ということで 断捨離part1 として、20年分ぐらいをバッサリと捨てていた。 そして今回、「トラ技」というにはあまりにも情けない「3Dプリンティング」特集だったのを契機に、定期購読の解除、つまり「トラ技」との別れを決断したのである。このところ約10年間、研究室の本棚を占領していた「トラ技」を取り出して開くということが皆無だったのも後押ししている。 2024年3月まででサヨナラとなる1106研究室の本棚には現在、2013年1月号からの約10年分がズラリと並んでいるが、おそらくこれは自宅に引き取らずに「断捨離part2」ということで廃棄することになる。 1106研究室にある雑誌以外の書籍類は厖大で、とうてい自宅に持っていけないので、どこかで全てSUAC図書館に寄贈する予定(市内在住なので読みたければSUAC図書館に来ればいい)なのだ。
さて、GENのお勉強は、昨日までで The gen~ for Beginners Series のPart4まで終わったので、今日は gen~ for Beginners, Part 5: The Codebox Operator からである。 しかし、このページはザザーッといちばん下までスクロールしてみたところ、それで終わってしまった(^_^;)。 上のパッチは最後に出てくる例であるが、要するに記述言語で信号処理を記述する「Codebox」のお話なのだが、僕はここにあまり深入りするつもりはないのだった。 Codeboxを使って実際に稼働するGenを「流用」・「活用」するつもりであるものの、例の Musicdsp.org のサイトに行って、記述言語系のスクリプトを拾ってきて、自前のCodeboxの中に貼り込んで、実際に動くまでメンテするほど深入りするのは、ちょっと躊躇しているのだ。 ということでここでPart5を終わりにして、さらにPart6の gen~ for Beginners, Part 6: Thinking Inside the Codebox に行ってみることにした。
さきのPart5は「Codeboxの紹介」だったのに対して、このpart6はより深く深く、「Thinking Inside the Codebox」である。 上のように、重要な概念である「history」が中核のテーマなので読み流すわけにもいかないが、「Codeboxを書かない」という姿勢の僕としては、どこかに拘泥することなく、しかしサラッといきたいという悩ましいパートだった。 内容としては「More about GenExpr - Outlets and Attributes」ということでCodeboxの内部の詳細の解説からスタートして、「What About Operator Outlets?」・「Using Operator Attributes」と進んでいくが、なんと言ってもポイントは上の図のように、「Those Who Do Not Study History…」という部分なのだった。
そして注意して斜め読みしたところ、「Codeboxを書かない」という姿勢の僕としては、上の左側のGenを記述するのが右側のCodeboxだ、ということでとりあえず「理解」しておけば、中身の詳細はBlackBoxとして、このあたりのGenも活用出来そうだ・・・という気になった。 要は「使えるgen~」、そしてさらには「使えるjit.gen」や「使えるjit.pix」があればいいので、ここの深入りはまた時間がある時に(実際はそんな時間は無いのだが(^_^;))・・・という切り分けをした。 historyの概念は全くノータッチのままだが、内部にhistoryがあるGenがとりあえず使える状態であれば。中の詳細は問わずにGenの実戦的な実験に入りたいのだ。 ・・・ということで、比較的あっさりと gen~ for Beginners, Part 6: Thinking Inside the Codebox も終わってしまった。 残りは最後のPart7の gen~ for Beginners, Part 7: Creating Reusable Tools で、タイトルからちょっと期待していたのだが、中身はあまり使い出のないサンプルぐらいで、これもあっさりと通過した。
これで、「The gen~ for Beginners Series」はオシマイとなって、いよいよ次は実用的と期待される、上の「Online Tutorials」というシリーズに進むことになった。 明日はもうSUACも「お盆休み」に突入している時期だが、そういう邪魔の入らない時間はとても貴重なので、さらに明日、そして週末にもお勉強を進めていくことにしよう。
- Gen Tutorial 1 - The Garden of Earthly Delays
- Gen Tutorial 2a - The Joy of Swiz
- Gen Tutorial 2b - Adventures in Vectorland
- Gen Tutorial 3 - The Fine Art of Surfacing
2022年8月12日(金)
GENのお勉強シリーズはいよいよ、 ここ のメニューの最初の「The gen~ for Beginners Series」が終わって、次の「Online Tutorials」に進む。 まずは gen~: The Garden of Earthly Delays ということで、DeepL翻訳によれば意味としては「地上の楽園」であり、冒頭のコメントは以下だった。そして、「これらのパッチを見るときに知っておくと役に立つ、いくつかの簡単なことがあります」として、かなり的確にGenをまとめた記述として以下の4点を指摘しているので、ここでもDeepL翻訳丸投げで転載しておこう。Cycling '74 Expo で簡単なチュートリアルを行った後、多くの人々が、gen~オブジェクトを楽しむために超天才である必要はないことを発見して、本当に驚き、喜んでいることが明らかになりました。新しいGenのものは、日がな一日エレガントでパワフルですが、非常に少数のオブジェクトで非常に多くの楽しみを得ることができます。そこで、ここでは、あなたを怖がらせることなく、オーディオを楽しむための窓を提供することを望む、一連の小さなパッチを紹介します。これらのパッチは、どうしようもなく複雑なものでも、効率的でエレガントなものでもありません。あなたが遊び心を刺激されることを願っています。あなたの想像力を刺激するような、シンプルなプリセットもいくつか加えてあります。上の第4項目の説明として、以下の図があった。 なるほど、と納得できるスマートなサンプルである。(^_^)
- gen~オブジェクトの中のデータの流れは、MSPのように同期的ですが、サンプルのブロックに対して何らかのアクションを実行しようと考えるのではなく、一度に1つのサンプルに対して作業をしています
- gen~オブジェクトの中のデータの流れは一定です。例えば、トリガーのようなものは存在しません。また、gen~のオペレータは常に何かを送信しています。シグナルのサンプル値、パラメータの値、またはある種のテストの結果などです。私たちは、"外の世界 "からのメッセージでパッチをコントロールできるような特別なものが必要なのです。Genの世界では、そのためにparam(パラメータ)オペレータがあります。ここでは、その使い方を紹介します
- データは常に同期しているので、フィードバックループは実際には不可能です。その代わり、historyという演算子があります。これは1サンプルの遅延のような役割を果たし、データの平滑化やフィードバックなど、有用なフィードバックループを作成することができます。
- Gen オブジェクトとその Max との違いの1つは、Gen オペレータに対するアーギュメントとオペレータが持つインレットの数との関係に関係していることです。Max オブジェクトとは異なり、Gen オペレータの初期値を指定するためにアーギュメントを使用すると、オブジェクトが持つインレットの数が変わります。それは、一度指定した初期値は変更できないからです。
そしてここから、大きく4種類のテーマでの解説が始まった。 まず最初は「Ring Tones」というタイトルで、「このチュートリアルでは、ディレイラインを操作することについて説明します。gen~オブジェクトはサンプル単位でオーディオにアクセスすることができるので、MSPが提供するシグナルベクトルよりもタイトなフィードバックループを設定することができ、新しいサウンドを作成する余地がたくさんあるのです」とのことだった。 以下は最初のサンプル「drive-by1a.maxpat」をアレンジした例だが、まさになかなか凄いレゾンナスのエフェクトを軽々と(CPU=3%で)実現していた。 中心となるdelayオペレータは、可能な最大ディレイの長さを指定する引数(サンプル数)を取るところがポイントである。
上のパッチのもう1つの重要な部分は、ミックスオペレータである。 これは、ウェットシグナルとドライシグナルをミックスして出力させるだけでなく、「Gen~の愛好家がどこでも使っているデータの平滑化の方法」を導入しているという。 つまりmix演算子は、最初の2つのインプットに2つの入力値を受け取り、右インレットで受け取った0.0から1.0までの値を元に補間された値を出力するが、もちろん一度に1つのサンプルに対して動作しているのだ。 バラメータ指定だけでなく、このgen~では、第3インレットとしてMSP sig~によって内部の演算周期(遅延)を与えているのも、実用的に改訂する際の重要なサンプルになっている。
続くタイトルは「Doubling Down」である。 以下は2番目のサンプル「drive-by1b.maxpat」をアレンジした例だが、いくつかの簡単な拡張を加えて構築されている。 「1つの減衰したリンギングディレイラインがとても素晴らしいサウンドだったので、各チャンネルにもう1つ追加し(入力時に少しスムージングするためにMSP line〜オブジェクトをパッチ内に追加)、さらに全体の出力にミキサヒストリーフィードバックモジュールを追加し、結合した信号に多少のリンギングを追加してみましょう。私は、チューニングやハーモニック効果を得るために、遅延させるサンプル数について数学的に関連した入力値を使うようになりました。しばらくは、このパッチの厳しくも心地よい音と付き合ってみてください」とあったが、これまた「CPU=4%」程度で、軽々とツセの強いレゾナンスサウンドを生成してくれた。(^_^)ウェットドライミックスは、かなり分かりやすいはずですが、ここでは、フィードバックとデータスムージングにミックスオペレータを使用する一般的な例について、少し考えてみたいと思います。上は、フィードバック効果を追加する一般化された例です。
パッチのフィードバック部分でも、mixオペレータとparamオペレータを使用して、現在の信号値と以前の信号値のバランスを制御しています。Gen環境は同期式なので、mixオペレータの出力を直接その入力の1つに接続してフィードバックループを作ることはできません。しかし、心配しないでください。Gen の history fb 0. 演算子は、1 サンプルの遅延線として機能し、混合信号をそれ自身に追加することができます(history 演算子に引数を入力すると、フィードバックループの開始値をゼロに指定することもできます)。もし、前の信号の混合量を変更する必要のない、特定の種類のデータスムージングを考えているなら、mix オブジェクトに引数を追加して(例えば mix 0.5)、param オブジェクトを完全にスキップすることができます。
この例では、このフィードバックループを左右のチャンネルで2回使用しています。この例では、平均化されたサンプル値をウェット/ドライミックスの出力として送るとともに、ディレイオペレーターに再投入しています。その結果、ダンピングコントロール付きの典型的なリンギングディレイラインができあがります。このようなパッチは、あらゆる種類の有用なタスクに使用することができます。
続くタイトルは「Pitching Practice」であり、まぁここは簡単なところなのだった。 以下は3番目のサンプル「drive-by1c.maxpat」をアレンジした例だが、gen~オブジェクト自体の外側で作業をしている。 パッチ内の2つのMIDIキーボードを使って、鳴っているディレイラインを調整できるようにする、というシンプルで小さなサブパッチ「midi2period」を追加してある。 適当に両方の鍵盤をクリックすると、なかなか素晴らしいサウンドが鳴ってくれた。
ところがさらに、「皆さんの中には、Max mtofオブジェクトが生成する均整のとれた音程と暮らすのではなく、すでに単なる音程(単純な整数の周波数比として表現できる音楽の音程)について考えている人がいるかもしれませんね。自分で自由に変更してみてください(とても素晴らしいサウンドになります、私を信じてください)」とあったので、さらに以下のようにアレンジしてみた。 これはさらにさらに面白い世界となった。 さっそくどこかでこれを是非、使いたくなった。
最後のタイトルは「It's the Network, Silly....」(ネットワークだ、バカヤロー......)であり、以下は4番目のサンプル「drive-by1d.maxpat」をアレンジした例である。 ここでは、「マイナーなバリエーションを追加し、控えめながら印象的な大きな変換を管理することができるようになりました」とあったが、Gen~の内部に「feeder」というパラメータで4種類のエフェクトの切り替えをしており、「フィーダーと呼ばれるパラマウント・オペレーターによって中継された着信メッセージは、ディレイラインに再投入するために、私たちが設定した4つのディレイラインのうちの1つにディレイシグナルを送るために使用されます。つまり、信号をそれ自身に戻す(ずっとそうしてきた)ことも、同じオーディオチャンネル上の2番目にチューニングされたディレイラインに戻すことも、反対側のチャンネルの1番目または2番目のディレイラインに戻すこともできるのです。ダンピングとピッチの相互作用、そしてディレイ信号のルーティングによって、実に興味深いサウンドが生み出されるのです」とあるように、MIDI鍵盤をあれこれ弾くまでもなく放置しても、いつまでも聞き飽きない面白いサウンドが、これまた「CPU=6%」以下で実現できた。
「もちろん、他の可能性もあります。ディレイラインをもっと鳴らす? より複雑なルーティング? その通りです。振幅制御をより繊細にする? なぜでしょう? これは、このパッチで遊んでもらうための、恥知らずな試みです(正直なところ、最後の2つの例でウェット/ドライミキサーのロジックを省略したのもそうです)。幸運とハッピーパッチングを!」 ということで、 gen~: The Garden of Earthly Delays が終わった。 いやー、なかなかに素晴らしい。(^_^)
次の Gen Tutorial 2a: The Joy of Swiz から、いよいよ上のような見慣れた画像のjit.genの世界に入っていくが、その冒頭には、さらに次の Gen Tutorial 2b: Adventures in Vectorland との関係が、「この2つは密接に関連していますが、まったく異なるものです。この最初のチュートリアルでは、Jitter Gen環境での作業に関する基本的なコンセプトを、Maxの世界での経験に近い形で紹介するつもりです。チュートリアル2a を通して、スウィズリングについて学び、パッチで遊んでから、チュートリアル2b で、あなたが学んだコンセプトと私たちが示したパッチを、Jitter Gen 環境のベクター特性を利用することによって、より効率的に書き直します」と述べられていて、この2つのセクションはペアの関係にある、と分かった。 その冒頭「The Lay of the Land」には、またまた「Genオブジェクトの内部で行なうプログラミングは、通常のMaxのパッチング(データの流れを示す方法でオブジェクトボックスをパッチコードで接続する)と同じように見えますが、始めるときに知っておくと便利ないくつかの重要な違いがあります。Jitter Genオブジェクトも例外ではありません。それらは、実際、あなたがオーディオ処理に使用するgen~オブジェクトとは少し異なっています。」とあり、以下の4点が指摘されていたので、ここでもDeepL翻訳丸投げで転載しておこう。
続く「Meet the family」では、Genの冒頭で(後藤さんのレクチャーでも)紹介されていた、「Jitterの世界でGenを使うにあたって最初に気がつくことは、オブジェクトが1つではなく3つあることです。これらがどのように異なるかを説明します。jit.pix と jit.gl.pix オブジェクトは標準的なJitterの2Dイメージ処理用に作られたものです。これらは、1〜4プレーンの入力マトリックスで動作し、入力されたデータをイメージデータのように扱います。jit.gl.pixは、CPUの代わりにGPU(Graphics Processing Unit)ですべての作業を行う点でjit.pixオブジェクトとは異なります。jit.genオブジェクトは、マトリックスが含むことができるあらゆるタイプのデータ(例えば、OpenGLなど)を扱う一般的なマトリックス処理オブジェクトです。このチュートリアルでは(前半と後半で)、jit.pix オブジェクトを使用します」という確認から始まった。
- Genオブジェクトの内部で起こることは同期です。トリガはありませんし、物事が起こる順序についての概念もありません。Jitterの世界では、データの基本単位はベクター(vector)です。今のところ、このベクトルはビデオのフレームではなく、1つのピクセルのグループをまとめて記述する方法だと考えてください。実際には、マトリックス全体の個々のピクセル(データの単位)に対して、一度に同じ操作を行っていると考えた方が正しいのです。
- Jitter Genオブジェクトの内部で計算や変換に使用されるユーザ入力を提供するために、Gen paramオペレータを使用します。
- JitterファミリーのGenオブジェクトのほとんどは、オブジェクトに対して1つのアウトレットしか持つことができません。つまり、好きなだけ多くのシングルマトリックス入力(それぞれがシングルマトリックスを表します)を持つことができますが、アウトプットは1つだけです。jit.genオブジェクトはこのルールの唯一の例外です。
- ある操作から次の操作まで、作業しているピクセルの値を保持する方法はありません。gen~オブジェクトに精通しているのであれば、補間やフィルタリング、ディレイに使用するようなJitter Genオブジェクトの履歴演算子というものはありません(心配しないでください。履歴オブジェクトを使うような方法はありますが、それは別のチュートリアルでお話します)。
そしていよいよ「Maps Make the Journey More Interesting」として、「以前にも述べたように、Jitter Genオブジェクトを扱う場合、マトリックス全体の個々のピクセル(データの単位)に対して一度に同じ処理を実行すると考えるのが最も簡単です。非常に低いレベルでは、jit.opやjit.exprオブジェクトのようなものがそのように動作します。マトリックスの個々のセルやマトリックスの一部に対して一つの演算が実行され、Jitter Genオブジェクト内部の計算結果がオブジェクトの出口から一つのマトリックスとして飛び出してくるのです。まずは、本当にシンプルなJitter Genパッチから始めてみましょう。私は、視覚的な多様性を生み出す方法としてカラーマッピングの大ファンです。そこで、コサイン関数を使っていくつかのカラーリマッピングを行う簡単なGenパッチから始めたいと思います」、「jit.pixパッチの内部は、その出力を見て思ったよりもずっと単純ですが、それはパッチの内部で比較的単純な計算が、画像の各ピクセルに対して適用されているからです(実際には、アルファ、赤、緑、青の各プレーンの各ピクセルに対して計算が実行されているのですが...)」、「Jitterには色値を指定し、扱うための追加の方法があります - 0 - 1.0の範囲にある浮動小数点値です。GENLANDでは、色は常に浮動小数点数で指定されます」、「各入力画素に入力値を乗算し、コサイン関数の入力として使用します。コサイン関数は-1.0から1.0の範囲の値を出力することが分かっているので、コサイン関数の出力に0.5を掛け、さらに0.5を加えて、色に期待する0から1.0の範囲の値を生成することにします。その結果、迅速かつ簡単にカラーリマップを行うことができます。特に、アンプパラメータに大きな値を使用することで得られるような結果が気に入っています」、「もちろん、cos演算子を他の演算子で置き換えることもできます(sin演算子も出力がcos演算子と同じ範囲になるので、うまくいきます)」、「このパッチは、出力を変更せずに渡す機能、コサインまたはサインマッピングのどちらかを選択する機能を追加するだけでなく、データを変更せずに渡すか、渡されたまたは処理されたイメージの出力を反転させるかを選択することができます」と説明が続いて、以下のようなファンキーなサンプルを楽しく体験することになった。
「私たちのパッチでは、色値を渡すか処理するかを(mode パラメータに基づいて)選択し、出力を反転するかどうかを(inv パラメータに基づいて)選択できるロジックに Gen ? オペレータを使用してマッピングと反転を処理しています。 各 ? 演算子は、その左インレットにテストの結果を取ります。入力が正(1)の場合、オブジェクトの第2インレットへの入力がアウトレットに渡されます。そうでない場合は、右インレットの入力が渡されます。 処理モードを選択するためにパッチに送るパラメータ値は、mode パラメータを使用して設定します。0 で未処理の値を渡し、1 でコサイン処理を使用し、2 でサイン関数処理を使用します。同様に、inv パラメータは出力する色値を反転させるために使用されます。すべての色値は 0. - 1.0 の範囲にあるので、1.0 の引数を持つ謙虚な !- 演算子を使用して、反転を行うことができます。このパッチへの小さな追加により、出力のバリエーションが大幅に増えました」との解説も、だいたい分かったものとして次に進めそうだ。 ここでのサンプルは「colormap_2.maxpat」だったのだが、次の「colormap_3a.maxpat」に進むためには、新たに「swiz (short for “swizzle”)」という演算子が出てくるということなので、この「Fo’ Swizzle」を前にして、今日はここまでにしよう。
2022年8月13日(土)
台風8号がちょうど浜松の真上付近を通過しているこの日、GENのお勉強シリーズは ここ のメニューの「Online Tutorials」の途中、 Gen Tutorial 2a: The Joy of Swiz の後半あたりからである。
昨日の最後の実験(すぐ上のスクリーンショット)で分かったのは、「jit.grab」のWebカメラからのjitterライン出力が「jit.pix」というGenに入って、その出力のjitterラインは単に「jit.window」に出て表示されている。 そのGenの「jit.pix」の中身としては、入力の画素データ(0.0から1.0)に対してampを乗算した結果をcosあるいはsinに入れてここに「* 0.5」と「+ 0.5」、つまり同じ変域(0.0から1.0まで)の実数値を得てカラーテーブルを参照したものが、入力それぞれの画素に対応した出力の画素データになる、と『一気にまとめて』演算してくれる、というものだった。 そして今日の「Fo’ Swizzle」では、まず以下のようにポイントをまとめていた。 なるほど、これはまさにjitterそのものの考え方だ。
- 各セルの行列の個々の平面に関するデータを取り出すことができます(ビデオ用語では、画像の赤、緑、青、アルファチャンネルの値を意味します。もしOpenGLのデータを扱うのであれば、OpenGLオブジェクトに関連する各頂点の12個の属性にそれぞれアクセスすることになります
- 行列の各セルの位置に関するデータ(x、y座標)を取得することができます
- 行列内の他の個々の画素の位置を指定することで、その画素からデータを取り出すことができます
- 現在の画素にデータを書き込むことができます
そして、「前回のパッチのコサイントリックにひねりを加え、RGBの各値に対して独立して操作できるようにします」という「colormap_3a.maxpat」を改訂して実験したのが、以下の模様である。 RGBそれぞれに分けて、昨日の実験の画素処理を実現するために、入力のjitter画素情報に対して、「swiz(swizzleの略)演算子で、名前を指定してベクトルの一部を取り出す」というのをやっている事になる。技術的なコンピュータグラフィックスの言い方としては、入力されるピクセルデータは、ベクトルと呼ばれる現在のピクセルに関する情報を表す数値のグループとして表示されます。Maxの用語では、MaxオブジェクトのJitterファミリーは、マトリックス(結局のところ、イメージ/OpenGLなどに関する情報を表す数値のグループとして)を入力として受け取り、それをデータのベクトルとして処理し、標準のJitterマトリクスを出力します。
次のパッチでは、個々のピクセルに関連するカラーバリューを扱うことに注目し、それをいくつかの簡単なGenロジックと組み合わせて、前回のパッチの拡張バリエーションを作成する予定です。
ここでは、あなたの友達になるであろう2つの補完的なJitter Gen オペレータ、swiz と vec を紹介したいと思います。Jitter Genオブジェクトを使い始めたとき、swizはunpackと同等、vecはpackと同等と考えるのが最も簡単だと思いました。
注:演算子の名前は明白ではないかもしれませんが、ベクトルの個々の部分にアクセスして再結合することができるこの2つの演算の用語は、コンピュータグラフィックス界で広く使われています。
swiz(swizzleの略)演算子では、名前を指定してベクトルの一部を取り出すことができます。swiz演算子に与える引数によって、個々の項目を取得することも、単一の項目のみを取得することもできます。
vec(vectorの略)演算子は、出力用に構成要素から1つのベクトルを連結して出力します。
Jitter Genオブジェクトで画像を扱うとき、入力ベクトルを分解して個々の色値を扱うときに使う名前は、r(赤)、g(緑)、b(青)、a(アルファチャンネル)と覚えやすい名前になっています。
いわばswizというのは「unpack」みたいなものであり、これを最後にまとめる「pack」みたいなものがvec(vectorの略)なのだ。 これは昨日のにも増してファンキーモンキーベイビー(死語)であり(^_^;)、つい、これだけでパフォーマンスをしたい気になってしまう。 そして次の「Where Am I? 」では、RGBの色でなくて、2次元の座標(x,y)を取り扱うことになる。 「jit.pix2次元画像の世界では、個々のピクセルの位置はxとyの座標位置で識別されます。xとyの座標は0.-1.0の範囲の浮動小数点数(我々の色値と同じ値域)です」・「jit.exprオブジェクトに関するチュートリアルで、我々が正規化された数値と呼んでいるものを扱っていることはすでにご存じでしょう。Jitter Genオブジェクトは、norm演算子(入力マトリックスの正規化された座標にアクセスする方法を提供します)と、画像内の別のセルからのベクトルにアクセスできるsample演算子を組み合わせて、オブジェクトの位置を操作したい場合にこれらを使用します」とあるように、これまでjitterの画像はいろいろなサイズのために座標で苦労してきたのだが、ここでは「norm」で正規化されているので、別途にjitter入力した座標系(スケール)にはsampleで合わせることが出来るのだった。 以下のように確認できたが、これは素晴らしい改良である。パッチが3つのセクションからなり、それぞれのセクションの一番上にスウィズオペレータがあることにお気づきでしょう。in 1 入力演算子に新しい行列/ベクトルが到着すると、赤、緑、青の値がアンパック/スウィズルされます。これらの値はそれぞれ 0. - 1.0 の範囲の浮動小数点数で、パッチの3つの部分は、前回のパッチでお分かりののと同じロジックで、それぞれの色の値を他の色とは独立に処理します。
パッチの一番下に、vecオペレータがあります。他の Gen オペレータと同様に、それが持つインレットの数は、vec オペレータを作成するときにオブジェクトボックスに入力される引数(デフォルト値)の数に依存します。ここでは RGBA の色値を扱うので、演算子には 4 つの引数があります。また、vecオペレータのインレットのうち3つだけがパッチ内の他の場所に接続されていることに気づくでしょう。これは、このパッチではアルファチャンネル処理を行っていないためで、4番目の(アルファチャンネル)インレットの初期引数としてデフォルト値の1.0を用意すればよいのです。
追加されたチャンネル処理に対応するために必要なことは、以前のチュートリアルパッチから機能を複製する際に、パラメータオブジェクトの名前を変更することだけでした。つまり、色値を渡すか処理するか(Rmode/Gmode/Bmodeパラメータに基づいて)、出力を反転するかどうか(Rinv/Ginv/Binvパラメータに基づいて)選択できるようになりました。
そしてoffsetでのx/y移動に続いて、続く「Mirror, Mirror on the wall…」によって、ラップ機能を活用した「万華鏡」「曼荼羅」という方向に向かう。 jitterやったら誰でも「万華鏡」「曼荼羅」で遊ぶのだが、これがGenでサクッと出来るとすれば嬉しいことだ。 「0.0 - 1.0 の浮動小数点データ範囲を扱うことの1つの興味深い特徴は、x軸またはy軸にイメージを反映させるためにその範囲内でデータを修正することができるということです。swizしたxとyの値とオフセットを使って単純な万華鏡の効果を作り出します。この効果を得るために、x と y の位置の値をswizしてオフセットを与え、そのオフセット値を使って入力を水平方向と垂直方向にミラーリングしています」とのことだったが、どうもこの「xyswizzle_2a.maxpat」は僕は気に入らなかった。 というのも、万華鏡効果の4つのプレーンをミックスしてしまっているので、全体にモワッと/ゴチャッとした感じで、肝心の万華鏡効果が薄れてしまっていたのだ。 そして、まとめだという「swizzlemap_1a.maxpat」も、RGBの加工との合体なのだが、こちらも万華鏡効果が相殺されていたので、一念発起、自分なりのオリジナル化を目指した。in 1 演算子からの入力ベクトルは sample 演算子に送られ、その右側の入力には、演算を行うノルム値からの水平および垂直オフセットを指定する x および y 値を含むベクトルが入力として渡されます。ゼロのペアを含むベクトルを送信すると、入力と同じセルがサンプリングされ、出力に渡されます。
オフセット値を設定し、オフセットベクトルを構築するために、norm 演算子を使用して 0. から 1.0 までの範囲の x および y 座標を提供します。swiz 演算子は、入力行列の各セルに対する現在の x および y 座標を返します(デフォルトでは、作業中のセルの位置が表示されます)。x と y のswiz出力値に何らかの値を加えると、元の入力からオフセットした別のセルをサンプリングすることになります。swiz値に .5 の x オフセット値を加えると、入力行列の半分の長さのセルが右側に配置されることになります。同様に、y オフセット値 .5 は、入力マトリックスの半分の高さのセルを下方向に配置します(負の浮動小数点値は上/左へのオフセットを示します)。この値を sample 演算子に与えると、そのセルのベクトル値(アルファ、赤、緑、青)が取り出され、出力されます。
ノルム値とオフセット値の合計が0より小さい、あるいは1.0より大きい場合、どうなるのだろうかと思うかもしれません。パッチからは直感的にわかりませんが、Jitter Genのサンプルオブジェクトは、すべての合計を安全に境界内に保つために、期待される範囲にない入力値を自動的にラップします。このチュートリアルの後半で再び sample 演算子のこの機能を利用します。
そして、自分なりに「反転万華鏡」の部分を切り出したGen(jit.pix)と、上でやったRGB操作のGen(jit.pix)と、2つのGen(jit.pix)ボックスを持ったオリジナルのパッチを使って遊んでみたのが、上のサンプルである。 これはもう、完全にここのTutorialの中身が身に付いた感じとなった。 これで Gen Tutorial 2a: The Joy of Swiz が終わりということで、ここを区切りにする事にした。 台風は関東地方に向けてまっしぐらで進んでいる。
ネットニュースでは、「国内最大の同人誌即売会『コミックマーケット100』が13日、東京都江東区の東京ビッグサイトで開幕した。1975年から始まり、日本の漫画文化、創作活動を支えてきたサブカルチャーの祭典。2020年の新型コロナウイルス禍による開催中止などを乗り越え、100回目を迎えた」というのが流れてきた。 そして「台風がコミケを直撃した」という上の画像も流れてきたのだが、実はこれはフェイクで、AIに「台風が直撃したコミケの様子」というお題を与えて、お任せの自動で描かせたのだという。 なかなか凄い時代になったものだ。
2022年8月14日(日)
台風一過のお盆の猛暑のこの日、研究室に出て来れば空調が快適である。 GENのお勉強シリーズは ここ のメニューの「Online Tutorials」の3番目、 Gen Tutorial 2b: Adventures in Vectorland からである。 「前回のチュートリアルで作成したjit.pixベースのパッチはクールなもので、おそらく平均的なMaxユーザがアクセスできるようなパッチ技術を使用していますが、Jitter Genパッチとしてできること、すべきことの全てではありません」・「誤解しないでください - これらは意味があり、Jitter Genの世界でベクターからデータをswizzleするという考えを導入しています。そして、それらはパッチとしてうまく機能します。しかし、Jitter Genオブジェクトで作業する際に本当にクールなことの1つは、パッチを適用する際にベクターで作業することと関係があるのです」・「Jitter Genの世界では、ベクトルが頂点に君臨しています。このチュートリアルでは、(この2つのチュートリアルの最初の方で扱った個々のデータのビットとは対照的に)データの集合体としてのベクトルの考え方に慣れていただき、より流暢で効率的にパッチを適用する方法を紹介したいと思います」 と始まったが、以下のように、Examplesを見たところでは、どうも直前の Gen Tutorial 2a: The Joy of Swiz とほとんど同じ名前のパッチばかりであり、新たな内容の紹介というよりも、vectorの本質的な使い方で同じパッチを再構築しよう・・・というもののようだ。
ということで、最初の「My First Vectorization」は、前の Gen Tutorial 2a: The Joy of Swiz の中で、RGBそれぞれに対して画素単位での処理を行っていた、下(上)の「colormap_3a.maxpat」が、なんと下(下)の「colormap_3b.maxpat」のように出来るのだ、というお話だった。 これは凄いことで、ますますシンプルになった。(^_^)初心者の場合、ベクターの観点で考えることは、パッチを作成する際にどのようにデータを組み合わせたり、分割したり、再結合したりするかについて、いくつかの簡単な思考習慣を身につけることになります。Gen チュートリアル 2a で作成したパッチのいくつかを、ベクタを利用して、より「Gen ライク」で効率的になるように書き換えてみましょう。多くの場合、出来上がったパッチは、かなりコンパクトになります。
JitterファミリーのGenオブジェクトの説明で最初に述べたことの1つは、jit.pixとjit.gl.pixオブジェクトは両方とも2次元イメージを表すマトリクスを操作するということです。
ベクトルを扱う場合、パッチングの際にvecオペレータを使う必要がないことがよくあります。場合によっては、個々のデータビットをスウィズアウトする必要すらありません。もし、集約されたデータを操作するのであれば、jit.pixとjit.gl.pixオブジェクトのいくつかの特殊な機能を利用することができます。
そしてさっそく、昨日の最後に「まとめ」として作っていた「GEN_test_12.maxpat」に今回の改訂を追加して、さらに万華鏡/曼荼羅の効果を自動生成する部分に「line」を使って、以下のような「GEN_test_13.maxpat」にまとめてみた。 これはいくら遊んでいても飽きない、怪しい世界である。(^_^;)
ここまでが前半で、R/G/Bの処理をまとめてベクトルとして処理したということで、残るのはoffsetのx/yの部分についても、まとめてベクトルとして処理できる・・・という話であり、チュートリアルのページをザッと斜め読みするだけでその真意は把握できた。 jit.pixの内部では、「param mode 0 0 0」・「param amp 3.14 3.14 3.14」・「param invert 0 0 0」とスペースで繋いでR/G/Bをまとめて記述して、外部からのパラメータは「pak mode 0 0 0」・「pak invert 0 0 0」・「pak amp 3.14 3.14 3.14」として既存のMaxパッチとして与えればいいのだった。 これをoffsetのx/yでやるとすれば、以下の左の部分は以下の右のようにシンプルになるのだ。
そして、万華鏡/曼荼羅の処理に関しても、以下の上のこれまでのGenに対して、vectorの考え方を使えば、以下の下のようになるのだという。 これはさらに、シンプルなのだが、どうせ僕のオリジナルの「GEN_test_13.maxpat」では、「xもyも反転」という部分しか使っていないので、これをさらに加えることはパスしたが、今後にはこの考え方の理解があれば、まずは「前進」だろう。 ということで、これにて Gen Tutorial 2b: Adventures in Vectorland も無事に終わった。(^_^)
そして最後は、 ここ のメニューの「Online Tutorials」の4番目、 Gen 3: The Fine Art of Surfacing である。 「今回は、jit.genオブジェクトを見てみましょう。ジッターマトリックスを処理するという点ではjit.pixとjit.gl.pixオブジェクトと同じですが、jit.genオブジェクトはGenマトリックス処理の汎用オブジェクトで、あらゆるタイプ、次元、プレーン数のマトリックスを取り扱うことができます」とのことだった。 以前にザッと眺めたところでは、せっかくのOpen-GLの3D-CGのサンプルがかなり単純で面白くなかったのだが、当面はそのままサンプルをなぞる事にした。 最初の「Expressionism」では、 「Jitter Genオブジェクトが登場する以前は、行列データを面白く複雑な手続きで処理するための最良のテクニックの1つは、jit.exprオブジェクトを使用することでした。Andrew Bensonのチュートリアルでは、jit.exprオブジェクトを使用した式の操作について、正規化された数値について非常に詳しく説明しており、前回のjit.pixを使用した画像処理についてのチュートリアルでは、これらの洞察を利用してJitter Genオブジェクトがマトリクスデータでどのように動作するかを説明するのに役立てました」・「jit.genでの作業も同じような基本的なスキルを使いますが、Jitterのgenオブジェクトのファミリーに少し慣れることで、jit.exprでは不可解に見える式をいかに簡単に扱えるようになるか見ていきましょう。これから、データサーフェス(数式によって輪郭が記述されたメッシュ)を生成します。これは、Jitterファミリーのgenオブジェクトの登場があなたの生活をどれだけ快適なものにしてくれるかを把握するための簡単な方法です」・「まず始めに、jit.exprオブジェクトの動作を見て、マトリックスデータを表現するためにどのようにそれを使用するかを確認してみましょう(jit.exprとjit.genの世界の両方において)。このパッチは、Jitterでマトリックスデータを生成し、レンダリングする際に使用する標準的なオブジェクトのセットと、データサーフェスを生成するために使用するjit.exprオブジェクトを提供するもので、私たちが始めるために必要なすべてのロジックが含まれています」 ということで始まったが、要するに以下の3つのjit.glの記述法がある・・・というようなお話だと判断していると、最後まで行き着いてしまった。 つまりは、そういうことなのだ(^_^;)。
こんなシンプルなOpen-GLでも、たしか僕は 過去の作品 (リュジュンヒー君のインスタレーション作品を楽器として使用)のリアルタイム3D-CGに使ったような記憶があるが、これを再びやるつもりは今のところないので、これにて、ちっともFine Artでもなかった Gen 3: The Fine Art of Surfacing は終了となった。 これで ここ のメニューの「Online Tutorials」がとりあえず完了ということで、いよいよ次は玉石混交のGen大喜利大会、「Gen Patcher Collections」という Gen patch-a-day へと一気に進んでいくことにした。
最初のサンプルには、 「MGraphicsのパッチ・ア・デイシリーズが大好評だったので、ゲンパッチ・ア・デイの出番です! しかし、今回はいくつかの点で変更があります。まず、私が全部やるのではなく、毎日ゲストプレゼンターを迎えます。このプレゼンターは、教育コンテンツを開発するサイクリングチーム(社内ではマテリアルチームと呼ばれています)のメンバーですので、様々な視点、パッチのスタイル、複雑さのレベルを得ることができます。面白くてわかりやすいGenのコンテンツを加えたいというのが、私たちの願いです」・「私がよく使う非常にシンプルな jit.pix パッチでこれを始めます:閾値ベースのバイナリサンプリングをして、オフセットとジッターのフィードバックを提供するパッチです。言い換えれば、これは私のウェブカメラを使って、私自身の不気味で炎に包まれた画像を作成するものです。私はかなり初歩的なテクニックを使っているので、誰にとってもかなり簡単なはずです。でも、私はたまたまフィードバックがとても好きで、この結果はとても楽しいものです」 というコメントがあり、Cycling'74の「中の人」が、Genのプロモーションのために一役買っていることが判明した。 ただし、その後の展開は「Maxユーザにお任せ」というわけだ。 そして、これだけでは面白くないので、あれこれ修正して、僕のオリジナル版として、以下の「GEN_test_14.maxpat」を作ってみた。 このように、Genの内部の細部にあまり深く立ち入ることなく、道具として改編して活用する、というのが、Maxユーザーの王道なのだ。
そして、次に出てきた このサンプル も、また「中の人」の 「Genのパッチ・ア・デイシリーズへようこそ。今日は、超秘密のCycling '74アルゴリズムが私を選んだので、Jitterパッチをもう一つミックスします(Genファンへの注:Jitterパッチが2つ続けて始まったのは、単なるくじ運に過ぎません。絶望しないでください。これからたくさんのオーディオの楽しみが待っています)。今日のjit.pixパッチは非常にシンプルな手段を用いており、Jitterのgenオブジェクトがピクセルの位置をアドレスし、それをサンプリングする際に0.-1.0の範囲の浮動小数点データで動作するという事実を広範囲に利用しています。いくつかのトリガーオブジェクトと、データを合計したり、包んだり、折りたたんだりする機能を組み合わせれば、あらゆる種類のワープした楽しみを提供する余地があります。このパッチを責任を持って楽しんでください」 というものだったが、これはこれまで万華鏡/曼荼羅パッチでさんざんやってきたものだったので、暖かくパスした。(^_^;)
そして、この次に出てきた上の「3300.GenPAD03.maxpat」というのは、またサウンドねたのgen~に戻ってくれたので嬉しいのだが、なんとも不可解なパッチで、それでいてとても面白いものだった。 「このパッチは、オーディオの最後の小節をBuffershuffler風に並べ替えるという、ある種の硬質なものです。パッチ内の混乱を避けるために、古いドラムループ.aifをハードコードしていますが、他のファイルやライブ入力に対して簡単に開くことができるでしょう」というもので、さっそくこれを自前の「GEN_test_15.maxpat」として改造を試みようとしたが、これがなかなか厄介だった。 シンプルなdrumLoopなのに、これを不整脈のように再サンプリングしていて、「steps」パラメータは1/2/4/8/12/16/32とあるものの、実は3とか5とか7とか、さらには小数点以下まで指定することで、さらに謎な変拍子を生成してくれるのだった。 ちょっとパッと見にはその動作原理が不明なまま、それでもこれ自体も面白いので「今後に向けてキープ」というディレクトリに保管しておくことにした。
次に出てきた上の「3319.distancefunctions.maxpat」というのは、jitter(Open-GL)で空間の物体に対して、サウンドなど3次元の要素でライヴに「膨らませる」というもので、これもなかなかファンキーで楽しいものだった。 「このパッチは、jit.gl.isosurfで使用する3Dマトリックスを生成するためにjit.genを使用することを検討したものです。私は、blobbyでamorphousなシェイプ(http://en.wikipedia.org/wiki/Isosurface)にいつも好感を持っていますが、これらを扱うのは難しい傾向があります。」・「私は、いくつかの基本的なオブジェクトプリミティブ(球、トーラス、円錐など)に対する一握りの距離関数と、いくつかの本当にクールな距離と領域の変形を持つWebサイト(http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm)に遭遇しました」・「添付したパッチは、基本的に2つのプリミティブ(立方体と球体)を取り、それらを同じデータセットに放り込んで、球体が立方体のグリップから「脱出」しようとするモーフィングブロブラー形状を作成するものです。私は、何が起こっているのかがわかるように、これをシンプルにしておきたいと思いました」・「jit.gl.isosurfaceは微妙なオブジェクトですが、一度正しい設定を見つけると、本当に素晴らしい結果を得ることができます。私にとって、jit.genは、3Dオブジェクトを計算するためにjit.gl.isosurfaceが必要とするタイプのデータセットと対話するための、より直接的な方法です。様々な演算子を投入して、それらが出力されるマトリックスにどのような影響を与えるかを見るのは、本当に楽しいことです」 ということで、 こんなサイト があるのも初めて知ったが、いやー、オタクは世界中にいるのだった。 jitterとgen~を結びつける(ライヴのComputer Musicパフォーマンスからのサウンドにリアルタイム反応するOpen-GLライヴ3D-CG)という材料として、これも自前の「GEN_test_16.maxpat」として、これまた「今後に向けてキープ」というディレクトリに保管しておくことにした。
次に出てきた上の「3326.rotainjitgen.maxpat」というのはその名の通り、jitterの「jit.rota」をgen化したというものだが、肝心の境界処理(bound modes)の部分が無いので、とりたててソソラレルものは無かった。 まぁ、そういうものもあるのが、Forumのいいところなのだ。
次に出てきた、上の「3332.gpatchadayfeb9feedback.maxpat」というのは、「このパッチはオーディオフィードバックネットワークです。前のフィードバックネットワークの例とルーティングが似ていますが、より無入力タイプです(ほとんど)。また、音を減衰させるのではなく、チューブの中を移動させ続けようとする点でも異なります。とはいえ、実際のゲインコントロールは行われていないので、注意してください」というもので、スタートでインパルスを音源としているだけで、パラメータを初期状態としているだけで(特にいじらなくても)実に素晴らしいサウンドを自動生成してくれた。 これはもちろん、自前の「GEN_test_17.maxpat」として、これまた「今後に向けてキープ」というディレクトリに保管しておくことにしたが、ちょうど新しい作曲に関してこんなのが欲しかった・・・という、モロに直球で来た感じがある。(^_^)
これで Gen patch-a-day の半分ぐらいまで進んだが、今日はこのあたりで満腹、終了となった。 なかなか実り多いお盆休みである。2022年8月15日(月)
終戦記念日だというこの日だが、僕の親父も少年兵航空訓練場?か何かに行っている時に終戦となって実際に戦場には行っていなかったこともあり、残念ながらとりたててのコメントは無い。 ロシアとウクライナの戦争が終わらないので、個人ページと研究室ページの冒頭に置いた この画像 を片付けられないまま、もう半年も経過しているのが悲しいだけである。
ネットのニュースでは「JR西日本がサイコロの出た目で決まる行き先までの割引乗車券を発売する異例のキャンペーンを展開している」というのがあったので、「サイコロ」と「仙台」に触発されて、 この曲 を聞きながら、 こんなページ を作って1日が始まった。
GENのお勉強シリーズは ここ のメニューのGEN大喜利大会、 Gen patch-a-day の半分ぐらいまで進んだところからの続きである。 昨日のOpenGLの改訂版などもあったが、その次に出てきたのは、上のようなかなり完成された「3333.patchadayday7」というもので、「Gregory Taylorの素晴らしい7セグメントエンベロープ(examplesフォルダに含まれている)を少し修正して、セグメントごとにカーブを調整できる標準的なADSRとして動作するようにしました。私はこのエンベロープが大好きで、今後のMaxの仕事において、私のエンベロープの仕事をすべて置き換えてくれるだろう。Gregoryのエンベロープを単にパクるだけでは満足せず、彼のMOD FM gen~の例を音源として採用しました。この例では、gen~自体は変更されておらず、私は単にモジュレーションの柔軟性のために、その周りに多くのMaxを構築したに過ぎません」とのことだが、ここまで完成されていると、逆に引いてしまう(料理しにくい)。
しかし、せっかくなのでこの「3333.patchadayday7」の中の「_day7.maxpat」を、presentationモードを外して中を解析して、「Gregoryのエンベロープ」の部分は「トグルを受けたsig~」というように出しっ放しにした上で、「彼のMOD FM gen~の例」という部分だけを切り出して、上のように今後に自分なりに活用できる「GEN_simple_FM」というパッチに改訂した。 これはCPUがかなり軽いので、最近のパッチ(FMを多重で使用)でCPUが重かったものを置換するには最適である。 こういうのが、Maxユーザにとっては楽しいのである。
次に話題になったのは、jitterでのモーフィングである。 Maxに付属しているアヒルの3Dモデルデータを使って、上のようにリアルタイムにモーフィングしつつマウスで3D空間内でぐりぐりと動かせるというのは面白い。 ただし僕はこれを今後に使うという予定は、今のところ皆無なので、さらに次に進んだ。 そして、次は「daveのオーディオフィードバックネットワーク」をアレンジしているもののエラーが出て困る・・・というものだった。 試してみると本当にエラーが出るので、こういう場合には暖かく無視して次に進む(^_^;)。 その次の「3353.GenPADmultisine.maxpat」というのも、昨日にやったパッチの微改良のようだったが、パッと見に違いが分からなかったのでこれもパスした。 その次の「3361.gl.pixdistortions.maxpat」というのも、昨日にやったパッチの微改良のようだったが、あまり劇的な変化も無かったのでこれもパスした。
その次にあったのは、上のような「Variable-shape LF-Noise」という「3373.genPADlfnoise.maxpat」であり、「このパッチは、Lf-noise ジェネレータで、rand~ に似ていますが(gen.random の例を借用しています)、2つの点、つまり、非線形ランピングモードとランプスロープ制御が追加されています。ランプスロープコントロール('ramp value'と呼ばれます)は、ターゲットのランダム値が早く到着し、波形のステップ成分を作成するように、補間のスロープを'ランプアップ'させることができます。これは、パラメータをある地点まで滑空させ、しばらく停滞させ、また別の地点まで滑空させたい場合に有効です。極端に言えば、波形は純粋なノイズのステップ関数になります。また、モジュレーションをかけることで、よりワイルドなサウンドにすることもできます」とのことだった。 しかし、ちょっと触った感じでは、まぁ教科書的なサウンドという程度だったので、これもパスすることにした。 自分の作曲のために今後にキープしよう、というアンテナにひっかかるには、パラメータをちょっとイジッただけでとんでもなくヘンなサウンドが出てくれるぐらいのものが欲しいのだ。
その次にあった「3376.genPADfilters.maxpat」とは上のように、onepole~フィルタが、どうもMaxのバージョンによって性能が違っている・・・という「研究成果」だった(^_^;)。 こういうところにこだわる人もいるのだが、もうMax5だのMax6だの、というのは現在では死語なので、これは軽くパスした。
その次にあった「3377.PM.Comb」とは上のように、櫛形フィルタについて、「ICSTの論文を元に実装したコムフィルタです。オールパス補間を用いているので高域の精度は高いはずだし、サチュレーションも内蔵してます。無限のサスティーンはできませんが、あまり狂気じみたことをせずにカスケードすることができます。αパラメータはFF係数です」・・・というような「研究成果」だった(^_^;)。 こういうところにこだわる人がまたいたが、これも軽くパスした。
その次にあった「3391.NavierStokesTrio」は、上のように長い解説とともに、要するにCode Boxの活用を喚起したくて投稿されたようである。 まぁ、僕はCode Boxを使うところにはまだまだ行けないので、これも軽くパスした。Genオブジェクトのパッチ・ア・デイのツアーでは、コードボックスをあまり見ていないので、1つ投げ入れてみようと思いました。
ご存知のように、私はナビエ・ストークス方程式が特に好きです。昔のPluggo KnaveStoriesプラグインで最初のPluggoチュートリアルを書いた頃から、最後のVizzieモジュールまで、ずっとです。そこで、ナビエ・ストークス三人組を紹介したいと思います。
いや、Esbjorn Svenssonの突然の死で悲嘆にくれる私の心の隙間を埋めてくれたスモーキンジャズユニットではなく、Richard DudasのオリジナルChaosCollectionと(より最近では)Andre Sierのアップデートした移植版に基づいた、クラシックなMax chaos externalのオーディオレート版を生成するGenパッチングの進行をマップした3つのGen~パッチのセットです。
このトリオは、3つの微妙に異なるgen~の方言でNavier-Stokes方程式を実装します。1つは一般的なgen~演算子(NS-operator)を使用するバージョン、Gen expr演算子がもう少し重い仕事をするバージョン(NS-expr)、最後のcodeboxベースのバージョンでいくつかの内部ベルとホイッスル(内部オートスケール!)を含むものです。
この3つのパッチはすべて同じ計算を実装したものです(パッチ自体の中にあります)ので、パッチの進行状況を感じ取っていただければと思います。
追伸:この件に関しては、私の同僚であるGraham Wakefieldに賛辞を送りたい。彼は私のオリジナルのコードボックスワークアウトを見て、コードボックス内にヒストリー演算子を含める方法とオートスケーリングを組み込む方法を教えてくれたのだ。(彼はまた、私のsah演算子を?演算子に置き換えることについて、いくつかの有益な提案をしてくれました)。彼は今でも私のヒーローの一人であり、もう一杯飲まなければなりません。
そして次の「3447.sawcloud」では、遂に今日のご馳走というか、美味しいサウンドが登場した。 「私は、Peter のラダーフィルタの実装 (https://cycling74.com/forums/stilsons-moog-ladder-in-gen) で遊んでいて、それがノコギリ雲を供給したときにどんな音になるのか聞きたかったので、gen~ で太さを調節できるノコギリ雲を実装することにしました。genとしては、これがベストでも効率的でもない実装であることは間違いないのですが(コメントや提案を歓迎します)、でも、ほら、やってみることで学ぶことができるのです。失敗を恐れていると考えないで、もっとフロップチャンスだと考えてください」という殊勝な言葉とともに、いやいや美味しいサウンドである。 元波形は単なる鋸歯状波であるが、これをデチューン5個、さらにLEOデチューン2個、という計7個によるクラウドにしたことで、とても分厚いのにCPUは4-5%なのだ。 素晴らしい。 さっそくこれは「キープ」領域にコピーした。
続く「3416.oooahh.maxpat」というのも収穫となった。 上のように入力は鋸歯状波、ここに3バンドのフォルマントフィルタをgen~として並列に処理しているだけなのだが、いい感じに「ooo」から「ah」にモーフィングしてくれる。 さっそく「GEN_test_21.maxpat」にまとめて、これも「キープ」領域にコピーした。 これは明日に予定している、ゼミM1・王さん(ホーミーのフォルマント合成に挑戦中)に紹介するネタが出来た。(^_^)
続く「3421.genPADdupeskip」は、上のようにスクリーンショットの中に本人の説明があるが、せっかくのサウンドねたなのだが、当面はパスとなった。 とにかく多重にループさせるためにhistoryを多用しているところが、ある意味で狂気じみていて、凄い。 その後は、「バグあり」、「バグあり→アップ仕直し(イマイチ)」、というのが続いた。 そういうこともある。 そして「3453.segmentshaper」は、教科書的なパッチと共に「今回で1日1パッチの連載は終了です。一緒に楽しく遊んでいただけたら幸いです。c74のマテリアルグループのメンバーを代表して、これらのパッチに協力してくれたWesとGrahamに、そしてこの素晴らしいMaxへの追加に取り組んでくれたことに感謝したいと思います」というものだった。 これでようやく、なかなかに「濃い」 Gen patch-a-day を完走したことになる。 登場したパッチを全てまとめたzipは これ であり、その中身は以下のようになった。 いやいや、邪魔の入らないお盆休みのお勉強としては、とても収穫があった。(^_^)
これで、GENのお勉強シリーズとしては ここ の最後、「gen~ Example Patches」として、以下をチェックすることで完了する・・・という「先」が見えてきた。 おそらく、「使ってみたい」と思うのは数個に1個ぐらいなものだろうが、サウンド周りの「gen~」であるからにはここを未チェックというのは後々によくないので、まだまだチェック作業を続けていくことになる。
- gen~.7_segment_envelope.maxpat - 7-segment linear envelope generator
- gen~.band_limited_saw_using_feedback_fm.maxpat - Band-limited sawtooth with feedback
- gen~.band_limited_saw.maxpat - Band-limited sawtooth
- gen~.biquad.maxpat - An implementation of the biquad~ object
- gen~.bitcrush.maxpat - Bit crusher
- gen~.buffir.maxpat - Time-domain convolution for finite impulse responses
- gen~.centroid.maxpat - Centroid calculator
- gen~.chaos.maxpat - Some attractors
- gen~.chopper_repeat.maxpat - Waveset segmentation and repeating playback
- gen~.chopper.maxpat - Segmenting waveforms by zero crossings
- gen~.comb.maxpat - An implementation of the comb~ object
- gen~.computed_sine.maxpat - A computed sine wave
- gen~.count.maxpat - An implementation of the count~ object
- gen~.crossover.maxpat - Crossover filter
- gen~.deltaclip.maxpat - An implementation of the deltaclip~ object
- gen~.drunk.maxpat - An implementation of the drunk~ object
- gen~.edge.maxpat - An implementation of the edge~ object
- gen~.fbam.maxpat - Second order feedback FM
- gen~.ffm.maxpat - Feedback FM
- gen~.filters.maxpat - Filter implementations
- gen~.flange_chorus.maxpat - Flanger and Chorus
- gen~.flute.maxpat - Slide flute physical model
- gen~.fm_bells.maxpat - FM synthesis with decaying envelope
- gen~.freeverb.maxpat - An implementation of the freeverb
- gen~.gigaverb.maxpat - An implementation of the gigaverb
- gen~.interpolation.maxpat - Varieties of waveform interpolation
- gen~.karplus_strong_strange.maxpat - Karplus Strong string model with feedback
- gen~.karplus_strong.maxpat - Karplus Strong string model
- gen~.livelooper.maxpat - A live looper
- gen~.minmax.maxpat - Calculate minimum/mean/maximum values
- gen~.modfm.maxpat - ModFM
- gen~.moogladder.maxpat - Moog ladder filter
- gen~.overdrive.maxpat - Waveshapers
- gen~.performance.maxpat - gen~ performance comparison
- gen~.pfft_centroid.maxpat - gen~-based spectral centroid calculator
- gen~.pfft_example.maxpat - gen~-based FFT filter
- gen~.pfft.vectral.maxpat - gen~-based lowpass smoothing of FFT filter bins
- gen~.phasor.maxpat - An implementation of the phasor~ object
- gen~.pitchshift.maxpat - Overlap-add pitch shifting with stochastic blur
- gen~.pulsar.maxpat - Pulsar synthesis
- gen~.random.maxpat - An implementation of the rand~ object
- gen~.shaker.maxpat - A shaker
- gen~.sincinterpolation.forloop.maxpat - 16-Point Windowed-Sinc Interpolation
- gen~.sincinterpolation.maxpat - 16-Point windowed-sinc interpolation
- gen~.slicer.maxpat - Pitch-shift by overlap-add
- gen~.slide.maxpat - An implementation of the slide~ object
- gen~.spectraldelay_feedback.maxpat - Spectral delay with feedback
- gen~.spectraldelay.maxpat - Spectral delay
- gen~.thresh.maxpat - An implementation of the thresh~ object
- gen~.trapezoid.maxpat - An implementation of the trapezoid~ object
- gen~.vosim.maxpat - VOSIM
- gen~.waveguide.maxpat - Waveguide string physical model
- gen~.waveset.maxpat - Waveset distortion
- gen~.zerox.maxpat - Zero crossing detector/counter
2022年8月16日(火)
さて、GENのお勉強シリーズはいよいよ ここ の最後、「gen~ Example Patches」である。 ここまでの勉強によって、だいぶGenの勘所も分かってきたので、これを後回しにしておいて良かった。 全て「gen~」、つまりMSPのGenなので、新たな作曲のために新たなサウンド生成を求めている僕としては、とりあえず全てをチェックして、美味しいところをいただきたいのだ。 なお、リストはアルファベット順だったが、一部ではシンプルなものから応用編に進むために順序を変えてある。gen~.7_segment_envelope.maxpat - 7-segment linear envelope generator
これは今回のお勉強の中で、昨日の「3333.patchadayday7」という以下のパッチの中で「Gregory Taylorの素晴らしい7セグメントエンベロープ(examplesフォルダに含まれている)を少し修正して、セグメントごとにカーブを調整できる標準的なADSRとして動作するようにしました」というのにマルマル使われているものだった。
そこでは、僕はこのエンベロープジェネレータでなく、発音させるFMの部分をいただいたので、これでオシマイである。
gen~.band_limited_saw.maxpat - Band-limited sawtooth
上のようなもので「Band-limited sawtooth using Discrete Summation Formula & BLIT:」、とあったが、Genナシでphasor~に入れても出来そうなものを、言語表現(expr)でGen化しているようだった。 試しに「Compared to non-bandlimited phasor~:」の方に繋ぎ直してみるとほとんどサウンドは変わらなかったので、以下のように「Genナシ」のシンプルな実験パッチを作ってみた。
gen~.band_limited_saw_using_feedback_fm.maxpat - Band-limited sawtooth with feedback
上のようなものである。 色々なテクニックが詰まっているようだが、出てくるサウンドはそれほど美味しい感じもしなかったので、とりあえずこれは看過することにした。
gen~.biquad.maxpat - An implementation of the biquad~ object
これは凄い。 左側はパッチの下にあるGenのように、正しくbiquadフィルタをGenで実装しているので、今後はぜひともこちらを使いたい・・・とキープ領域にもコピーした(^_^)。 右側には、それぞれまさに「ディジタルフィルタの教科書」のように、expr記述のGenとして、15種類ものフィルタが並んでいて「どれでも使って」と待機している。 CPUも6%程度と軽いので、これだとQの高いフィルタを複数、ライヴでうりうり動かせそうだ。
gen~.bitcrush.maxpat - Bit crusher
このパッチには、左右2つのサンプルが並んでいるが、左側の「Crushing by reducing sample resolution」というのは、どうもイマイチ、面白い感じが無かった。 それに対して右側の「Like downsamp~」というのは、入力がシンプルな正弦波なのに、Genに単なるラッチを入れてダウンサンプルするだけで、なかなか面白いことになった。
入力に生のサウンドを入れてもOKで、リングモジュレータみたいな効果として美味しいので、こちらも上のように自前のパッチとしていただくことにした。
gen~.buffir.maxpat - Time-domain convolution for finite impulse responses
このパッチは、タイトル通りに「Buffir: time-domain convolution for finite impulse responses」ということで、信号処理の基本として有限インパルスレスポンスをきちんと時間ドメインで畳み込みしているものである。 ただし、この領域で作曲に何か使うという予定は当面は無いので(^_^;)、これはそのままスルーすることにした。
gen~.centroid.maxpat - Centroid calculator
このパッチは、FFTのエネルギー重心を計算するGenを、boxesとcodeboxの両方で実装してみた、という教育的なサンプルだった。 これもとりあえずは手元保存せずスルーである。
gen~.chaos.maxpat - Some attractors
「カオス」である(^_^)。 左側は僕もさんざんやってきたLogistic Functionであり、右側は2次元カオスの「Lorenz Attractor」である。 過去の作品 ★ ★ では、PC-9801(ふ、ふ、古い(^_^;))のC言語で2次元カオスを生成してスクリーンに出していたので、この右側のGenはちょっと興味があるのだが、当面はこれも触れないので、ここにこれがある、ということだけ記憶しておこう。
gen~.chopper.maxpat - Segmenting waveforms by zero crossings
このパッチはゼロクロス点で入力サウンドを断片化するというものだが、シンプルなのにとても面白いものなので、迷わず 手元保存してみた。 Gen~の中身もなかなかぐちゃぐちゃと試行錯誤している感じで、逆に好感が持てる。 ライヴ・サンプリングものではそこそこ使えそうだが、CPU=6%とまずまず軽い。
gen~.chopper_repeat.maxpat - Waveset segmentation and repeating playback
一つ前のパッチに「repeat」が加わったというタイトルのこのパッチは、前のものと違って上のGenのcodebox(上下にまだまだ見えていない部分がたくさんある長大な処理)が全てなのだが詳細不明である。 ただし、とにかく、あれこれ入力してあれこれ操作すると、とんでもなく面白いサウンドが出てくるので、これもキープ一択である。
gen~.chucker.maxpat - Like chucher~
このパッチは「gen~ Example Patches」のリストには並んでいなかったのだが、何故かGenサンプルパッチ群のディレクトリに入っていたもので、上がGen版、そして下がその元々の「chucker~」のヘルプ(これまで全く知らなかったもの)である。 ちょっと遊んでみればこれはなかなかご機嫌なのだが、元のMSP版ではそこそこ大変な処理なのがGen化されているというので、これまた今後に使いやすい感じに改訂してキープした。
gen~.comb.maxpat - An implementation of the comb~ object
まさに王道の「櫛形フィルタ」である。 ただし当面は使うアテがないのでスルーしておくことにした。
gen~.computed_sine.maxpat - A computed sine wave
これは「cycle~」、つまりサイン波をDDSで゛キチンと生成する、というGenの教科書的なサンプルである。 ただし使うアテがないのでスルーしておくことにした。
gen~.count.maxpat - An implementation of the count~ object
これは「count~」、つまりディジタルオーディオのサンプリング周波数のタイミングで馬鹿正直に「counter」を作る、というGenの教科書的なサンプルである。 ただしこれも使うアテがないのでスルーしておくことにした。
gen~.gen~.creepyreverb.maxpat - Creepy Reverb
このパッチも「gen~ Example Patches」のリストには並んでいなかったのだが、何故かGenサンプルパッチ群のディレクトリに入っていたもので、とても優秀なリバーブであった。 CPU=5%程度と軽く、今後にも使えそうなもので、もちろんきっちりキープした。
gen~.cross-synthesis.maxpat - Cross-Synthesis
このパッチも「gen~ Example Patches」のリストには並んでいなかったのだが、何故かGenサンプルパッチ群のディレクトリに入っていたもので、もろに2つの系統のFFT入力を畳み込みするという、教科書通りのCross-Synthesisだった。 ただしこれも当面は使うアテがないので、スルーしておくことにした。
gen~.crossover.maxpat - Crossover filter
このパッチはCross-over Filterということで、低域、中域、高域の3つの周波数帯に分割したフィルタであり、全部を加えるとAllpassになるものだった。 きちんとGenの中で教科書的に構築しているようだが、これも当面は使うアテがないので、スルーしておくことにした。
gen~.curve.maxpat - Like curve~
なかなか進んだ感じで、これぞ夏休みのお勉強である。 途中、午後イチにはゼミM1・王さんが研究室にやってきて、先週から新たに進めたプロジェクト、そして僕が今やっているGenの話、SuperColliderの話、Propellerの話、などなどを進めた。 明後日にはゼミ吉田さんのインスタレーション作品のスタジオでの記録にも協力してくれる予定で、僕もこれはちょっと楽しみなのだ。このパッチは「gen~ Example Patches」のリストには並んでいなかったのだが、何故かGenサンプルパッチ群のディレクトリに入っていたもので、上がGen版、そして下がその元々の「curve~」のヘルプ(Exponential rammp generator)である。 Genの最初のあたりで、指数関数的な補間パッチのコピペに失敗していたが、たぶんこれを使えば出来るような予感があるが、まぁ当面はパスしておいて、いずれやってみることにした。
2022年8月17日(水)
8月17日である。 この日は何の日かというと、 この日記のPart12 の「2022年3月9日(水)」から始まっていた、「夏の札幌(*^o^*)」が合言葉だったLIFE2022に、当初予定であれば「札幌初日」だった。 それが突然にオンライン(;_;)になってしまってテンションはダダ下がり、先週にあった「ZOOMリハーサル」も完全シカトで、本番は明後日から金土日と開催されるのだが、おそらく自分の発表セッションの土曜の朝イチ以外は、まったくZOOMとかを覗こうという気にもならない。 今日はそんな呪わしい日だったのだが、朝イチで届いていたメイルで一気に世界は色彩を取り戻した。
ここ によれば過去に10回訪問していた、Ars Electronicaについては この日記のPart13 の「2022年4月29日(金)」のところで、とりあえずCOVID-19にめげずに行くのだ・・・とホテルとフライトを予約していた。 そして同じ日記の「2022年5月5日(木)」のところで、Ars Electronicaの併設イベント「Expanded Animation 2022」の中の「Synaesthetic Syntax III: Gestures of Resistance」という企画公募を発見して、「2022年5月10日(火)」のとこにある内容で応募していた。 その結果は同じ日記の「2022年6月28日(火)」にあるようにacceptedで、それも講演者はArs Electronicaのフルパス(上のフェスティバルパス)を謝礼として出します・・・ということで、つまりこれは「Ars Electronicaの関連シンポジウムでの招待講演」ということになっていた(^_^)。 そして今日、その正式な続報が届いたのである。
こんなのが届いたら、もテンションは爆上がりである(^_^)。 まだ暫定だというArs Electronicaのプログラムは これ (ローカル保存版は これ )、たぶん確定だというExpanded Animation Symposiumプログラムは これ (ローカル保存版は これ )である。 まぁ、僕の出番は最終日の日曜日の午後の、それもラスト(なんと「トリ」か???)なので、いつもの感じでは来場者もだいぶ減ってきていることが予想されるが、何より単なる視察でなく「招待講演」ということが大きい。 今日は午後にはJoyJoyヒトカラ予約をしているので半日仕事であるが、気合いが入るというものだ。Dear speakers, I hope my email finds you all great and enjoining some (additional maybe for some?) vacation! I am writing to you to share the final details about what, how, when, where will the Festival and Symposium happen, so you can all have a clearer idea. ・ The Expanded Animation Symposium will be held between Friday 9.9 and Sunday 11.9, between 11:00 and 18:00. ・ The location of the event is the Skyloft (Floor 3) at the Ars Electronica Center. ・ For your participation in the Symposium, you have also Accreditation (Festival Pass) that you can receive from me directly at the Ars Electronica Center as meeting point. ・ The final program of the Festival is almost finished but not yet complete. This is the Expanded Animation Symposium program. ・ Here you have the schedule of the Expanded Animation Symposium.Additionally! Here you can find Highlights for the Festival - https://ars.electronica.art/planetb/en/highlights Check also: ・ CyberArts exhibition is at Kepler’s Garden at JKU Campus Linz (not in OK center!) ・ Deep Space 8K Program https://ars.electronica.art/planetb/en/deep-space-8k/ ・ Prix Forum is on Sunday, 11.9, starting at 11 AM ・ Here is location list & Opening Hours of the Festival - https://ars.electronica.art/planetb/en/locations/
さて、GENのお勉強シリーズの続きである。 ここ の最後、「gen~ Example Patches」をなぞっているのだが、実際にはアプリケーションのMax8のアイコンの上で右クリックして「Show Package Contents」とやって、上のように辿ったところに「gen」というディレクトリがあり、これをいちいち調べている。 そして「gen~ Example Patches」のリストには無いものもこの「gen」というディレクトリには含まれているので、一応調べてみて、意味があるものはここに追加する、という作業である。 昨日の最後の「gen~.curve.maxpat」もリストに無いもののこのディレクトリにあったので取り上げたが、アルファベット順で次に続く「gen~.data-urn.maxpat」とか「gen~.dattorro_reverb.maxpat」もリストには無いが、ここからのスタートとなった。
gen~.data-urn.maxpat - Like Urn
これは「重複ナシに出てくるrandom」である「urn」をGenで実装したものらしい。 まぁ中身としては「過去の結果と照合してダブっていなかったらOK」というのをチェックしているのは、スクリプトを眺めているとそんな感じだった。 ただし、これは当面は使うアテがないので、スルーしておくことにした。
gen~.dattorro_reverb.maxpat - Dattorro Reverb
これは「Based on Jon Dattorro's Effect Design Part 1: Reverberator and Other Filters, located here: https://ccrma.stanford.edu/~dattorro/EffectDesignPart1.pdf」ということで、 こんな凄い論文 に従ったものを実装しているのだった。 さっそく手元に「GEN_test_28」とゲットしてCPUを調べてみると、最大でも9%程度とまずまずコンパクトだが、9個のパラメータをいじってみると色々に効果が変わって、なかなか有用であると確認できた。 これは今後にも使えそうなもので、「使える候補」ディレクトリに、しっかりキープした。
gen~.deltaclip.maxpat - An implementation of the deltaclip~ object
これは、「Limit changes in signal amplitude」という「deltaclip~」をGen化したものらしいが、あまり使いでが無さそうなのでスルーしておくことにした。
gen~.drunk.maxpat - An implementation of the drunk~ object
「サウンドデザイン」のMaxアニメーション(数理造形)でも、単なる「random」ではあちこちに不自然にワープするのに、「drunk」(足の長さが有限な酔っ払いおじさんの千鳥足ランダム)にすると「生物っぽくなる」として学生たちも愛用しているdrunkだが、そのMSP版のdrunk~というのがあり、それをGen化したものらしい。 サウンド生成の局面だと、色々なパラメータに従って音響生成するアルゴリズムに対して、そのパラメータ(実数値)をdrunkで制御することはあるとしても、わざわざGenでdrunk~そのものを高速化するという必然性はちょっと不明なので、ここではスルーしておくことにした。
gen~.dynamic-smoothing
このパッチは「gen~ Example Patches」のリストには並んでいなかったのだが、「Algorithm from Andrew Simper, see https://cytomic.com/files/dsp/DynamicSmoothing.pdf」ということで、これまた こんな論文 に従ったものを実装しているのだった。 確かに、サンプル波形の尖った部分がちゃんと丸まっていたが、とりあえずここではスルーしておくことにした。
gen~.dynamicexpr
このパッチも「gen~ Example Patches」のリストには並んでいなかったのだが、これは「Live Coding」を実現するという、超面白いパッチだった。 Gen~の中身は単なるCodeboxだけであり、ここにテキスト画面から任意のサウンド生成スクリプトを書き込むと、そのスリスプトが「dynamicexpr.js」によって変換されてCodeboxの中にライブで刻々と書き換えられつつ書き込まれる。 そしてこのサンプルでは1秒ごとに、このスクリプトに従ったサウンドをライヴ生成しているので、1秒ごとにファンキーなサウンドが出てくるのである。 ちょっと「dynamicexpr.js」もあって難しいのだが、「Live Coding」のサンプルとしてキープしておくことにした。
gen~.edge.maxpat - An implementation of the edge~ object
これは「ゼロクロス点のエッジ検出」である「edge~」をGenで実装したものらしい。 立ち上がり点、立ち下がり点、それぞれをインパルスとして出力するので、ハードシンク・オシレータなどをGenで実装する時に使えそうなのだが、これも当面は使うアテがないので、スルーしておくことにした。
gen~.feedback_am.maxpat - Second order feedback FM
このパッチは「gen~ Example Patches」のリストでは「gen~.fbam.maxpat」となっていたが、実際には「gen~.feedback_am.maxpat」となっていたので注意が必要である。 「See ICMC2011 paper by Victor Lazzarini - https://quod.lib.umich.edu/i/icmc/bbp2372.2011.018/1/--aspects-of-second-order-feedback-am-synthesis "stability can be a problem"」となっていて、ICMCの研究を参考に2次のフィードバックAMをGenに実装したようである。 実際には、いきなりソースに1Hzのサイン波を加算していたりしてちょっと怪しい(^_^;)のだが、調べてみると入力の周波数成分を使っているので、一般のサウンドを入力できるわけではないと判明して、暖かくスルーした。
gen~.ffm.maxpat - Feedback FM
このパッチは「gen~ Example Patches」のリストでは「gen~.ffm.maxpat」となっていたが、実際には「gen~.feedback_fm.maxpat」となっていたので注意が必要である。 実際には上のように、左右2種類の異なる「フィードバックFM」が紹介されていた。 左側のはCodeboxで記述されている「One form of feedback FM (actually, feedback PM)」というもので、シンプルながら4つのバラメータで劇的なサウンド変化が得られる「美味しいFM」だった。 右側のは「Three oscillator indirect feedback FM」ということなのだが、「肝」としては3つのオシレータ2個ずつ、計6個のパラメータをランダム生成する「randomize」というサブパッチが呼んでいる「lfo」というサブパッチ・・・という構造が面白いものだった。 しかし、キープするかどうかあれこれ触って調べてみると、「FM is generally considered less intuitive... FFM is even weirder」とあるように、周期的に落ち着くポイントがあるものの変化がそれほど無いと判明したので、結論としてキープしないでおいた。
gen~.filters.maxpat - Filter implementations
ついに王道中の王道、「Various basic filters」ということで、5種類のフィルタがずらりと並んだ。 それぞれを構成するGen~は、2画面の左から順に、「Like onepole~」・「Like lores~」・「Like reson~」・「State Variable Filter」・「Like allpass~」・「Like biquad~」のうち最初から5つで、最後の「Like biquad~」は以下のようなサブパッチによって、既に検討してあった「gen~.biquad.maxpat」をloadして呼び出せる、というサンプルになっていた。
そして、それぞれ鳴らして試した上で、「Like lores~」・「Like reson~」・「State Variable Filter」という3種類は今後も使える・・・と判断して、キープのために「GEN_test_30.maxpat」・「GEN_test_31.maxpat」・「GEN_test_32.maxpat」として整備してみた。 それぞれCPUの軽さなども確認していて、これはsweepのサンプルを含めて、なかなか使えそうだ。(^_^)
gen~.flange_chorus.maxpat - Flanger and Chorus
・・・というところで、今日はこのあたりまでとなった。 まだまだ ここ の最後、「gen~ Example Patches」の項目の半分にも到達していないようだが、ぽこぽこと「使えそう」という美味しいパッチが出てくるので、この宝庫を簡単に通り過ぎるわけにはいかない。 まだまだこれからも、ここはじっくりと眺めていくことにしよう。このパッチは上のように、欲張って1つのパッチの上半分が「Basic Flanger」、下半分が「Basic Chorus」となっている。 ただしそれぞれのGen~を眺めてみると、パラメータの初期値は違っているものの、構造はほとんど同じで、唯一、delay(ただしdelay値は1桁違う)のたすきがけに「* -1」が入っているかどうかだけである。 まぁ、フランジャーとコーラスというのは確かにそういう関係だが、このようにハッキリ見えたのは収穫だった。 もちろんこのパッチも、ばっちりキープ領域に保存した。(^_^)
2022年8月18日(木)
昨日のJoyJoyヒトカラ6時間では62曲を完走したが、だいぶ飛ばしたので疲労感があり、いつもの朝のエクササイズをパスした。 まぁ、毎日欠かさずということでなくてもいいのだ。 そして今日の午後には、ゼミ・吉田さんが「カエルBAND」のスタジオ撮影のアポを入れていて、M1・王さんも手伝いに合流することになっている。 テンションminimumの明日からのLIFE2022では、明後日の朝イチで発表があるのだが、久しぶりに 予稿 を眺めても忘却の彼方だった(^_^;)。 まぁ、聴衆はおそらく、同じセッションの辻下先生・照岡さん・鈴木先生ぐらいなので、ZOOM越しにMax8を使うというリスキーなライブを行うことにして、プレゼン(スライドPDF)は省略する予定である。 そして、午前中のわずかな時間だが、 ここ の最後、「gen~ Example Patches」の項目のお勉強の続きを進めることにした。gen~.flute.maxpat - Slide flute physical model
このパッチは「Courtesy of Brad Garton, based on Perry Cook's original SlideFlute NeXT code」とあるので、だいぶ昔にIRCAMで作られたフルートの物理モデルをGen化したものらしい。 だいたい、今の学生は「NeXT」コンピュータというのを知らないだろうし、そのNeXTに入れるためのISPW(IRCAM Signal Processing Workstation)ボードも知らないだろうし、そのISPWボードでライブ音響処理をプログラミングするための開発ツールとして作られたのが、現在のMaxになっている・・・という事も知らないだろう。 これは残念ながらあまり美味しいサウンドでもなかったので、歴史的意義はあるものの、キープしないでおくことにした。
gen~.fm_bells.maxpat - FM synthesis with decaying envelope
このパッチは「FM synthesis with decaying envelope」とあるが、パラメータを変えてみるとなかなか美味しいものだった。 CPUも4%と軽くていい感じなので、さっそく「GEN_test_34.maxpat」としていただき、キープすることにした。
gen~.freeverb.maxpat - An implementation of the freeverb
これは王道中の王道、他のMax8パッチでも多く呼び出されていた「Freeverb」である。 実際には上の画面のように、「gen~.freeverb.maxpat」では、単に「gen~ @gen freeverb」というのが置いてあるだけで、これは同じディレクトリに置かれた「freeverb.gendsp」というのを参照する構造になっている。 さらにこの「freeverb.gendsp」からは「gen @file freeverb_comb」として同じディレクトリに置かれた「freeverb_comb.gendsp」というのを参照し、「gen @file freeverb_allpass」として同じディレクトリに置かれた「freeverb_allpass.gendsp」というのを参照している。 つまり、「Freeverb」を使うためには、これら3つの「gendsp」ファイルも同じディレクトリに置かれている必要があるのだ。 これを眺めていて気付いたが、実はすでにやっていた「gen~.crossover.maxpat」では、「gen~ @title crossover2」という方は内部的に定義したGenパッチだったが、もう一つの「gen~ crossover」という方では、やはり同じディレクトリに置かれた「crossover.gendsp」というのを参照していたのだった。 「GEN_test_35.maxpat」として実験してみると、やはりCPU=11%ほどになる時があり、あれこれ呼び出してキチンとやっていた。
gen~.gate-noclicks.maxpat - Soft Gate
このパッチは「gen~ Example Patches」のリストには並んでいなかったのだが、「gate~」でサウンドをON/OFFする時に発生するクリックノイズ(「プチッ」というやつ)を低減させるためのGenらしい。 ただし、試してみるとあまり違いが分からなかったので(^_^;)、キープしないでおくことにした。 作曲の段階でプチが気になる場合には、ちゃんと「*~」に数値を入れてミュートする癖が染み付いているので、僕にはこれは不要なのだ。
gen~.gcd_and_lcm.maxpat
このパッチは「gen~ Example Patches」のリストには並んでいなかったのだが、「Greatest Common Denominator and Least Common Multple」を翻訳してみたら「最大公約数と最小公倍数」だった。 まぁ、当面は使途がないのでパスしておくことにした。
gen~.gigaverb.maxpat - An implementation of the gigaverb
その名の通り、ギガなリバーブである。 入力がモノラルのサウンドを、ステレオでゴージャスに広げるには格好のツールのようだ。 上のスクリーンショットでは、Genブロックがあまりに巨大なので「75%」に縮尺して、ようやく画面に入った。 さっそく「GEN_test_36.maxpat」として実験してみると、色々なパラメータで装飾できるのに、CPUはピークでも9%となかなか良好で、これならfreeverbよりもこちらを活用することになりそうだ(^_^)。
gen~.haar.wavelet.maxpat - Haar wavelet analysis/resynthesis
このパッチは「gen~ Example Patches」のリストには並んでいなかったのだが、「Haar wavelet analysis/resynthesis」ということで、上の2画面のように、4つのGenパッチのうち2つは巨大なCodeboxで記述されている。 ウェーブレット解析とウェーブレット再合成を行うものだというが、パッチ内の解説は以下のようになっていた。
フーリエ解析が信号を直線間隔の正弦波の直交基底に分解するのに対し、このハール解析は信号を対数間隔の矩形波の直交基底に分解します。確かに、入力サウンドを「gen~ @title haar_encode @bins 12」でエンコードして、「gen~ @title haar_filter」でフィルタリングして、「gen~ @title haar_delay」でディレイをかけて、最後に「gen~ @title haar_decode @bins 12」でデコードして、エフェクトを加えつつ元のサウンドにちゃんと戻っていた。 ただし、ちょっとこれは難しそうなので、CPU=10%ほどだったが、パスしておくことにした。
利点は、時間領域で簡単に行えること、再合成によりオリジナルを完全に再現できること、ビンの数が管理しやすく、より自然な間隔になることです。
主な欠点は、この分析・再合成方法がほとんど使われていない理由ですが、符号化領域での変換のほとんどがエイリアシングアーチファクトを追加することです。エンコードされた各バンドは、サンプリングレートのデシメーションによる一種のバンドパスフィルタなので、驚くことではありません。
とはいえ、これはウェーブレットの簡単な入門書として機能し、必要なときにはいくつかの素晴らしいクランチーな歪みを持っています。gen~.interpolation.maxpat - Varieties of waveform interpolation
これは教科書的に、色々な「補間」について並べたカタログのようなパッチである。 上の2画面のうち、メインとなるGen~のCodeboxは「50%」で表示するほど大きなものだった。 ただしこれは教科書ということで、「使う候補」エリアとしては、パスしておくことにした。
gen~.interpolation.splinecurve.maxpat
このパッチは「gen~ Example Patches」のリストには並んでいなかったのだが、「A demonstration of using spline interpolation to create a continuous curve between multiple points」とのことだった。 考えてみれば、Max8のパッチ内でのラインもたぶんSpline curveなのだが、まぁ当面は不要ということで保存はパスした。
gen~.interpreter-calculator.maxpat
このパッチは「gen~ Example Patches」のリストには並んでいなかったのだが、Forthのように、簡単な数値計算を行うインタプリタをGen~に実装したものらしい。 さらにパッチ内には「minilisp」というサブパッチがあり、この中にはLisp版の数値計算を行うインタプリタをGen~に実装したものも入っていた。 まぁ、これも当面はパスだと思われる。
gen~.karplus_strong.maxpat - Karplus Strong string model
このパッチは「gen~ Example Patches」のリストにあるが、次の「gen~.karplus_strong_strange.maxpat」と逆順でこちらを先にした。 「Very basic Karplus-Strong string synthesis」とあるように、古典的な打弦振動の物理モデル音源をGen~で実装したものである。 これを保存するかどうか一瞬、迷ったが、次に「gen~.karplus_strong_strange」というのがあるので、そちらを調べてみることにした。
gen~.karplus_strong_strange.maxpat - Karplus Strong string model with feedback
予想した通りに、こちらの「Karplus-Strong + Hilbert + Waveshaping」という方は、なかなか面白そうなサウンドがしたので、迷うことなくゲットすることにした。 特に「rotate」パラメータを変えた時の変化がなかなか劇的で、古典的な「Karplus Strong string model」の世界から大きく飛躍している感じで、これは好きである。
gen~.livelooper.maxpat - A live looper
そして午後には約2時間、M1・王さんも加わって、撮影スタジオで このように ゼミ吉田さんのインスタレーション作品記録を行った。 久しぶりにこの作品と遊んだが、一部、Arduinoシステムのバグがあったのだが御愛嬌ということで気にせず進めた。 やはり、サウンドインスタレーションというのは、いいものである。(^_^)タイトル通りのライブLooperパッチである。 なかなかサンプルがファンキーな感じで好きなのだが、ちょっと動作の詳細は理解しきれていない。 groove~よりも軽いのだろう(CPU=6%程度)が、「注:ライブ入力録音に適したレイテンシー補正は考慮されていません。また、リバースフェーサー(逆再生)でも動作しません」との言い訳も書かれていた。 詳細不明ながら、とりあえずこれはキープしておく事にした。
gen~.minmax.maxpat - Calculate minimum/mean/maximum values
そして、 このページ を上げたところでまだ帰宅までに時間があったので、もう少し「GENお勉強」を進めることにした。 このパッチは、オーディオ信号の最小値・最大値・平均値を求めるGen~になっていて、リセットもあるのでGen~の中の理解には大きな助けとなった。 ただしこれも教科書的なものなので、キープすることなく次に進んだ。
gen~.modfm.maxpat - ModFM
これは名前から大きく期待していたが、走らせてみるとそれ以上に素晴らしいFMだった。 周波数軸上でバンド幅を指定して、その中心周波数をスラスラと移動させる事が出来て、これを複数束ねたらフォルマントにもなりそうな気がした。 CPU=5%以下ととても軽く、これは文句なく「使える」パッチとして「GEN_test_38.maxpat」にキープ保存した。
gen~.moogladder.maxpat - Moog ladder filter
名前からして期待したが、実際に素晴らしいMoogシンセサイザーのサウンドが鳴った。 原典は「poly~/gen~/GenExpr port of the CSOUND Moogladder opcode, by Victor Lazzarini.- Pete Dowling, JAN/2012.」ということで、しっかりしたものだった。 パッチを見てみると、まず原波形として「入力周波数の鋸歯状波」+「そのオクターブ下の矩形波」+「ピッチを0.99424倍した鋸歯状波」、というなかなかのノウハウのものがあり、これが「moogsnake」というサブパッチの中で「poly~ poly.moogladderx2 1 up 2 @resampling 1」ということで2系統のpoly~を呼んでいて、その中身にgen~があったが、この中身のCodeboxを見ると、中身には「require("moogLadderFilter")」と書かれていて、同じディレクトリに置かれた「moogLadderFilter.genexpr」というものを参照しているのだった。
上が、一部カットした、その「moogLadderFilter.genexpr」の中身であるが、いやいや、過去の蓄積が詰まった、素晴らしい仕事なのだと感嘆した。 これはスグには理解できないものの、ブラックボックスとして「美味しいMoogシンセサイザーの音」が得られるということで、謹んでキープ保存させてもらった。This is a new digital implementation of the Moog ladder filter based on the work of Antti Huovilainen, described in the paper "Non-Linear Digital Implementation of the Moog Ladder Filter" (Proceedings of DaFX04, Univ of Napoli). This implementation is probably a more accurate digital representation of the original analogue filter. This is version 2 (revised 14/DEC/2004), with improved amplitude/resonance scaling and frequency correction using a couple of polynomials, as suggested by Antti. moogLadder(asig, cf, res) { History z1(0), z2(0), z3(0), z4(0), z5(0), y4(0), mf(0); i2v = 40000.; akfc = cf / (samplerate / 2.); akf = cf / samplerate; fcr = 1.8730 * (pow(akfc, 3.)) + 0.4955 * (pow(akfc, 2.)) - 0.6490 * akfc + 0.9988; acr = -3.9364 * (pow(akfc, 2.)) + 1.8409 * akfc + 0.9968; twovg = i2v * (1. - exp(-2. * PI * fcr * akf)); y1 = z1 + twovg * (tanh((asig - 4. * res * mf * acr) / i2v) - tanh(z1 / i2v)); z1 = y1; y2 = z2 + twovg * (tanh(y1 / i2v) - tanh(z2 / i2v)); z2 = y2; y3 = z3 + twovg * (tanh(y2 / i2v) - tanh(z3 / i2v)); z3 = y3; y4 = z4 + twovg * (tanh(y3 / i2v) - tanh(z4 / i2v)); z4 = y4; mf = (y4 + z5) * 0.5; z5 = y4; return mf; }gen~.ola.granular.maxpat - Granular by Overlap-Add
このパッチは「gen~ Example Patches」のリストには並んでいなかったのだが、上のようにCodeboxで記述されたGen~が心臓部にあって、これでGranular Synthesisを実現しているというスグレモノだった。 CPUテストしてみると、瞬間的には12%になる事もあるが、およそ9-10%程度でこのサウンドを実現しているのは見事である。 ただし、ちょっとこのパッチのUI(波形ゾーンで始点/終点を設定するタイプ)は僕の好きなタイプのGranular Synthesisではなかったので、当面はスルーとした。
gen~.ola.pulsar.maxpat - Pulsar by Overlap-Add
このパッチも「gen~ Example Patches」のリストには並んでいなかったのだが、同じ作者による「Overlap-Add」ネタのようである。 パッチを見ていると作者のクセが出てくるが、このパッチとすぐ上のパッチは、まさにその証明となっていた。 まずまず面白いサウンドはするのだが、このPulsarというのは僕にはいまいち染み込まなかったので、こちらも当面はスルーとした。
gen~.overdrive.maxpat - Waveshapers
これは「Various Waveshapers」ということで、教科書的に3種類のOverdriveアルゴリズムをGen~化したというものである。 僕はあまりディストーション系というのは使わない(好きではない)ので、これも当面はスルーとした。
gen~.patcherscripting
このパッチは「gen~ Example Patches」のリストには並んでいなかったのだが、「gen~ patchers can also be created & modified by patcher scripting」ということで、同じディレクトリに置かれた「genpatcherscripting.js」というJavascriptで記述されたモジュールを「js」オブジェクトによって実行する。 そして「gen~」の中身を開いておくと、「js genpatcherscripting.js」に「bang」を入れるとランダムな周波数のサインが1つだけ出力されるのに対して、「biggerer」を入れると10個のランダムな周波数のサインが出るように変更される。 それも、10個のサインの周波数はあまり協和しないように構成されているのか、出てくる音響は「biggerer」を叩くたびにとても美味しいのだった。 cycle~が10個なので、CPU=2-3%程度ととてもとても軽いのも嬉しいので、これはとりあえず「謎のお手軽な音響生成」ということで、キープ保存することにした。
gen~.peaklimiter.maxpat - peak limiter
このパッチも「gen~ Example Patches」のリストには並んでいなかったのだが、教科書的にリミッターのアルゴリズムをGen~化したというものである。 僕はあまりリミッター系というのは使わない(好きではない)ので、これも当面はスルーとした。
gen~.performance.maxpat - gen~ performance comparison
スクリーンショットは訳あってナシである。 これは「Genは凄いぞ、MSPでは無理だぞ」という事を見せつけるためだけのパッチであり、「良い子は触らない」ことをお勧めする。 このパッチにはCPU処理状況のモニタがあって、どのくらいパソコンがしんどいかを表示している。 そして「poly~」で、同じディレクトリにおかれた5種類のパッチ: 「perf_null.maxpat」・「perf_gen.maxpat」・「perf_msp.maxpat」・「perf_gen_biquads.maxpat」・「perf_msp_biquads.maxpat」を読み込んだ時のCPU処理量を表示するのだが、これら5つのパッチが尋常じゃない中身となっているのだ(^_^;)。 「perf_null.maxpat」以外のどのパッチを指定してもMacは長時間「虹色グルグル」になるが、例えば「perf_msp.maxpat」だとCPU=100%で貼り付いてしまった。 その理由は中身を見てみれば分かるが、全く無意味に、多量の処理を多重に重ねまくっているのだった。 Genの優れているところを強調したいのだろうが、これはちょっと、イタズラにも程があるという感じである。・・・というところで今日はオシマイとなった。 ここ の最後、「gen~ Example Patches」の項目はまだまだ先は長いが、それでも半分は超えてきたかもしれない。 たまに美味しいものがあるので、このお勉強はさらに続くことになる。2022年8月19日(金)
幻の「夏の札幌」LIFE2022の初日である。 Proceedings.zipをダウンロードするとzipが866MBもあった。 これを解凍すると何故か「Proceedings」ディレクトリの中に「life2022proc.zip」というのがあり(^_^;)、それを解凍するとようやく、「Life2022digest.pdf」と「LIFE2022proceedings.pdf」と「papersディレクトリ」(中身は論文289本)とが出てきた。 いかに多くの人々が「夏の札幌」を渇望していたか、全面オンラインになった事への恨み節が伝わってきた。 LIFE2022は午後の「大会長講演」からスタートするので、午前中は ここ の最後、「gen~ Example Patches」の続きのお勉強である。gen~.pfft_centroid.maxpat - gen~-based spectral centroid calculator
ここから、いよいよFFTがあれこれ登場する模様である。 最初の「gen~.centroid inside pfft~」は「Calculate the spectral centroid also known as brightness」ということで、Gen~版とCodebox版の両方が並んでいたが、要するに教科書的なものであり、わざわざ「作曲用」ディレクトリにキープ保存するようなものではなかった。
gen~.pfft_example.maxpat - gen~-based FFT filter
これは実際にpfft~ということで、周波数領域での帯域を指定すると、そのようなバンドパスフィルタ、そしてバンド抑止フィルタになりますよ、というサンプルだった。 試しにCPUメータを入れてみると、平均CPU=5%、ピークではCPU=8%程度の処理量だった。 ここまでキッパリとエッジの立ったフィルタリングは作曲においてそれほど必要性を感じないので、これもスルーとした。
gen~.pfft.vectral.maxpat - gen~-based lowpass smoothing of FFT filter bins
これは「a bit like vectral~, with gen~」ということで、「It's not really like vectral~, as it just does a simple low-pass smoothing on the bins, but demonstrates the basic technique of using Data objects as per-bin history」とのことだった。 上の画面の上の方に並んでいる4つのウインドウが「pfft~ pfft.vectral」の方であり、下の方は「pfft~ pfft.vectral.expr」ということでCodeboxで実装したバージョンということになる。 これも教科書的なものであり、キープ保存するようなものではなかった。
gen~.phasor.maxpat - An implementation of the phasor~ object
名前に期待してしまったのだが、別にPfase Shifterではないので、単に「phasor~」をGenで実装しただけのものだった。 これも何ということもなく、スルーとした。
gen~.pitchshift.maxpat - Overlap-add pitch shifting with stochastic blur
ピッチシフトは使えるのでは?・・・と期待していたのだが、この「Pitch Shift By the overlap-add method, with stochastic 'blur'」というのは、かなり大仰なGenパッチであるにも関わらず、サンプルのパラメータをいじってもあまり劇的に変化しなかった。 これはちょっと「外れ」の感じなので、パスとした。
gen~.pulsar.maxpat - Pulsar synthesis
「Pulsar Synthesis」というのは知らなかったが、「Synthesize a series of windowed sine pulses. Does not support overlap」とのことで、パラメータをいじるといい感じのサウンドがしたのでキープ保存した。 CPU=3%ほどで、いいキャラクタ(→formantに通じる?)の音が生成できる。 これまでに登場したGenパッチのサンプルの中に、これを使っていたものがある・・・という確かな記憶があるものの、どれだったかは不明だった。
gen~.random.maxpat - An implementation of the rand~ object
何をいまさらrandomなのか・・・と思ったが、Gen~の中を見てみると、けっこうしっかりとランダムに向き合っている感じのパッチだった。 ただし、これを使うという局面が想像できなかったので、キープ保存はしていない。
gen~.resonator_bank.maxpat
このパッチは「gen~ Example Patches」のリストには並んでいなかったのだが、次のもの(v2とあるので明らかに改訂版)と逆順にして調べた。 「bandwidth」パラメータを1以下の小さな値にして、あとはパッチ内のテーブルをマウスでぐりぐりやると、なかなかに面白いレゾナンスサウンドが出てきて、さらにこのテーブルにゼロが書き込まれると「ゼロ除算」によって発振するのか、なかなかアナーキーな振る舞いが気に入った。 Gen~のCodeboxを眺めてみると、「Bank」らしく64データのテーブルをダブルで持ってその演算をしているらしく、CPU=12%とそこそこ頑張っているのだった。 これは文句なく、キープ領域に保存してみた。
gen~.resonator_bank_v2.maxpat
このパッチは「gen~ Example Patches」のリストには並んでいなかったのだが、上のものと同じ作者であるのは一目瞭然だった。 ただし予想外にも、こちらのパッチは色々とやっても上のバージョンほどの面白さが無かった(^_^;)。 ということで、こちらはパスとなった。
gen~.routing.maxpat
このパッチは「gen~ Example Patches」のリストには並んでいなかったのだが、「Demonstration of matrix routing for a variable topology feedback FM or PM gen~, using buffer~ to store the routing」というbuffer~を介したルーティングのサンプルということだった。 そこそこ面白いサウンドは出ているのだが、こういうシーケンサタイプのランダム演奏はあまり好きではない(といっても過去の作品にそういうものもあるけれど)ので、これは謹んでパスした。
gen~.shaker.maxpat - A shaker
これはタイトル通りのShakerである。 Gen~のCodeboxもしっかり書かれている。 ただしソースがnoise~だからか、感想としては残念ながら「面白くない(おもんない)」のである。 おもんないのでは、まぁパスである。
gen~.sincinterpolation.forloop.maxpat - 16-Point Windowed-Sinc Interpolation
「16-Point Windowed-Sinc Interpolation」ということで、buffer~のサンプル音響がスムースに任意のスピードで再生されるもののようであるが、あまり面白くない真面目なもので、なんか謎だった。(^_^;)
gen~.sincinterpolation.maxpat - 16-Point windowed-sinc interpolation
上のサンプルパッチ「gen~.sincinterpolation.forloop.maxpat」の謎が解けた。 こちらのパッチは、Gen~の中身がCodeboxでループ記述していないために、16個のブロックを愚直に並べてやっているのだった。 まぁ、いずれにしてもスルーとなった。
gen~.slicer.maxpat - Pitch-shift by overlap-add
「Pitch-shift by overlap-add」ということで、これは上のほうにもあった「overlap-add」好きな人が開発したもののようである。 パラメータの「shift」はピッチに相当し、「window」というのを上げていくとちょっとだけ面白そうなサウンドになりかけるのだが、そこまでなのだった。 やはり「使える材料」としては、大袈裟なぐらい、劇的にサウンドが変化するモノが欲しいのである。 「劇的」の程度はパラメータを抑えめにスケーリングすればいいだけなのだが、いくら持ち上げてもあまり変化しない「大人しめ」ものは使えないのだ。 ということでスルーとなった。
gen~.slide.maxpat - An implementation of the slide~ object
「slide~」と「rampsmooth~」とをGen~化したもののようで、要するにスムージングである。 生サウンドの部分で使うのかどうか不明だが、僕は作曲においてはライブ演奏パラメータについては「スムージング不要論者」であり、時にカクカクと変わるのも「味」だと思っているので、これも暖かくスルーした。
gen~.spectralbuffer.maxpat
このパッチは「gen~ Example Patches」のリストには並んでいなかったのだが、次の2つと「spectral」の部分が共通なので、もしかしたら関係するのかもしれない。 パッチとしては、入力サウンドをfftin~して周波数成分に変換して、周波数軸上の強度と位相としてレコーディングし、今度はこれを任意の再生速度で読み出してfftout~する、という馬鹿正直なものだった。 瞬間的にはCPU=11%になるなど、ちゃんとまともにやっていたが、キープ保存するほどのことはなかった。
gen~.spectraldelay.maxpat - Spectral delay
やはり、上のサンプルパッチと「兄弟分」だった。 パッチとしては、入力サウンドをfftin~して周波数成分に変換して、周波数軸上の強度と位相の特性テーブルによってDelayフィルタをかけて、その結果をfftout~する、という馬鹿正直なものだった。 これもキープ保存するほどのことはなかった。
gen~.spectraldelay_feedback.maxpat - Spectral delay with feedback
これは超絶面白い。 前の2つの真面目なサンプルは、このパッチのための単なる「前フリ」だったのだ。 基本的には同じように入力サウンドをfftin~して周波数成分に変換して、周波数軸上の強度と位相の特性テーブルによってDelayフィルタをかけて、その結果をfftout~するのだが、Delayフィルタの部分が二重(強度と位相それぞれ)のフィードバックループになっていて、「fun」というサブパッチの中のパラメータ定数群を叩いてやると、いやいや面白い効果が続出した。 文句なく手元にキープ保存してみたが、平均してCPU=9%程度(ピークで瞬間的に11-13%)というものだった。
gen~.speedlim.maxpat
この地味なパッチは「gen~ Example Patches」のリストには並んでいなかったのだが、「speedlim」のGen~版のようで、「a re-triggerable sample counter with hold time」というものらしかった。 あまりに地味なのでスルーした。
gen~.squinewave.maxpat
このパッチは「gen~ Example Patches」のリストには並んでいなかったのだが、「Squinewave」というのは「Morphs between sine, saw-like, and PWM square shapes」のことらしい。 説明としては「Handles frequency modulation, including sudden jumps and even reversals of the phasor; but doesn't yet handle phase jumps (e.g. hard sync)」とのことだが、サンプルなのにここまで(Depthノブまで)完備しているというのはちょっと違和感がある。 Gen~の中身も、厖大な説明があって、まぁいわばこれは作者のこだわりの詰まった「教科書」なので、これまたパスした。
gen~.thresh.maxpat - An implementation of the thresh~ object
この地味なパッチは「Like thresh~」というもので、「change input above 1 and then below 0 and watch the output」というものらしかった。 オーディオ入力に対してスケショルドを設定してset/resetのフリップフロップみたいな動作を行うというのをGen~で実装していたようだが、あまりに地味なのでスルーした。
gen~.trapezoid.maxpat - An implementation of the trapezoid~ object
この地味なパッチは「trapezoid~」をGenで実装したというもので、「trapezoid~」のヘルプを見ると、「Trapezoidal wavatable」を参照した変換(thresh~)に似たようなものだった。 これもあまりに地味なのでスルーした。
gen~.urn.maxpat
このパッチは「gen~ Example Patches」のリストには並んでいなかったのだが、かぶりの無いランダムである「urn」のサウンド版?というGen~だった。 これもあまりに地味なのでスルーした。
gen~.vector-wavetable
このパッチは「gen~ Example Patches」のリストには並んでいなかったのだが、「vector wavetable synthesis」という知らない名前のシンセシスだった。 サンプルは2系統(x/y)の0.2Hzと0.03Hzで揺すっているなかなか面白いサウンドだったのだが、「interpolate between wavetables stored in a buffer, rather like 2d.wave~」ということで、要するに2つのWevatableを参照してミックスしているだけなので、面白さの由来はこの「0.2Hzと0.03Hzで揺すっている」というところだったと判明した。 なので、これもスルーした。
gen~.vosim.maxpat - VOSIM
このVOCIMというのは、今回Genのお勉強を始めるより前にどこかで調べてゲットしていた。 もちろん活用する予定のものである。(^_^)
gen~.waveguide.maxpat - Waveguide string physical model
これは「Waveguide String Physical Model」というもので、「Derived from AudioMatt's patch posted to the forums here: http://cycling74.com/forums/topic.php?id=37604」と書かれていた。 かなり古典的な物理モデルで、音源部分のGen~もそうだが、「resonator」部分(75%に縮尺してもこれだけ(^_^;))の部分もなかなかの力技である。 ただし、こだわりに圧倒されたものの、物理モデルなので驚くようなサウンドはしないので、スルーとなった。
gen~.waveset.maxpat - Waveset distortion
これは「Waveset distortion」というもので、「Trevor Wishart defined a waveset as the signal between two zerocrossings. For a simple sinusoid, this corresponds to the waveform. But for signals of richer harmonic content, it produces more complex artefacts」・「Transformations can include the replacement of a waveset with another waveform」と解説されていた。 確かにサンプルの話し声に対しての効果はなかなか魅力的であり、基本的にはディストーション系は苦手な僕なのだが、これは喜んでキープ保存させてもらった。
gen~.waveset_with_amplitude.maxpat
このパッチは「gen~ Example Patches」のリストには並んでいなかったのだが、上の「gen~.waveset.maxpat」の改訂版のようなことで「Waveset distortion -- with amplitude matching」ということだった。 ただし、サンプルを聞いた感じでは、どうもこちらはあまり美味しい感じがしないので、こちらはキープしないことにした。
gen~.zerox.maxpat - Zero crossing detector/counter
そしてここで気付いてみると、アルファベット順のこのディレクトリに入っているここから下のファイル群は、全てここまでに登場したGenサンプルパッチから呼び出されているもの、つまり単体では動かないものだと判明した。 つまり、ようやくここで、 ここ の最後、「gen~ Example Patches」のチェックが全て終わったことになり、この日記で始めた「Genお勉強」は、とりあえず全ての項目をクリアしたことになる。このパッチは「Zero crossing detector/counter」というだけのもので、Gen~教科書という意味合いしかないのでパスした。
今日は朝から午後までこれに没頭したが、途中で音知学会から10月の大会の 暫定プログラム が届いたので、発表者であるゼミの吉田さんに送ったり、またSUACデザイン(技術造形学科)の僕のゼミの1期生・東堂のぞみさんから来週1106に来訪するというメイルが届いたり、事務局から借りたWiFiルータが不調で接続できないので僕のスマホのテザリングで1106の全てのMaxライセンスを更新確認したり、明日のLIFE2022での発表は考えてみればArs Electronicaでの講演と似ているのでいっそのことリンツに持参するMacBookAirでやってみようか・・・などという検討もあれこれ進めた。2022年8月21日(日)
昨日はArs Electronicaから こんな案内 も届いて、いよいよリンツが熱くなってきた。 そんな昨日、8月20日の朝イチのLIFE2022でのオーガナイズド・セッションは、辻下・照岡・鈴木・長嶋といういつもの4人が揃い踏みで無事に発表を終えて、これで幻の「夏の札幌」の夢も消え去った。 ちょうど昨夜カード会社から届いていた明細で、ANAのフライトキャンセルに伴う返金があり、その差額(キャンセル手数料)をSUAC研究費から支払うという書類も事務局に提出しておいた。
また、「GENお勉強」に関して、2018年の Max Summer School 2018 in 藝大 の中の後藤さんレクチャーの この資料 の中にあった「GEN examples」について、改めて一つずつ開いて調べてみたが、古典的アルゴリズムの「Karplus-Strong synthesis」とか「plucked string」とかがあったものの、今回のお勉強で新たに仕入れた一群の「使えそうなGenパッチ」に新たに追加するものが無い、との確認まで済ませた。 そしてその後はLIFE2022の各ZOOMセッションをチラ見で巡回などしたものの、「発表完了」という脱力感もあり、LIFE2022の2日目の土曜日はダラダラと過ぎ去った。
そして今日はLIFE2022の最終日なのだが、昨日の「発表完了」のテンションで今日の午後には4時間ながら4日インターバルでJoyJoyヒトカラの予約をしてあり、半日ほどの研究室に出てきた。 すでに「Gen~」の厖大なExamplesを試してきたのだが、フト気付いてみると、これは主としてMSPのGen~であり、色々と面白いサウンド関係のパッチをゲットしたものの、グラフィクス関係、つまりgen.pixとかgen.gl.pixとかについてはほとんどノータッチだった。 そこで再びMax8のアイコンを右クリックして「Contents」を探ってみると、なんと上のように、「gen」というディレクトリだけでなく、「jitter-examples」ディレクトリの下にも、「gen」というディレクトリ(ファイル総数=89)があった。 こうなると、「Genお勉強」シリーズとしては、というか今回の作曲のためには、ここも踏破する必要があるのだった。 「jit.gen」・「jit.pix」・「jit.gl.pix」というチェックすべきファイルは40個、そしてそれ以外、おそらく他のGenパッチから呼び出されるであろう?ファイルが49個、という感じだが、一応はこの中の「.maxpat」のファイルも調べてみることにした。
bench.compare.expr.maxpat
これはjitterにおけるベンチマークで、「jit.expr」で記述した内容とjit.genの内容が同じであるのに、約4.9倍ほどjit.genの方が高速だよ、というものだった。
bench.compare.op.maxpat
これもjitterにおけるベンチマークで、「jit.op」で記述した内容とjit.genの内容が同じであるのに、約3.3倍ほどjit.genの方が高速だよ、というものだった。
box.distance.function.maxpat
これは「see: http://www.iquilezles.org/www/articles/distfunctions/distfunctions.htm」というコメントがあり、行ってみると このように 厖大なドキュメントのサイトだった(^_^;)。 それに従ってパラメータを変化させているらしい。
charge.field.maxpat
これは電磁気学の教科書通りに、2つの電荷の間のクーロン力場をリアルタイムにグラフィック化させるもので、2次元pictsliderをうりうりすると、右上の電荷(固定)に対して左下の電荷が移動することで綺麗に変化してくれる。 まぁ、あと一捻りないとキープ保存はしないものの、なかなか面白いGenサンプルなのだった。
complex.poly.maxpat
これは素晴らしいパッチである。 どこで探していたのか不明だが、MRTI2015(10個のPAWセンサを使った触覚/触感センサ)のMaxパッチのライヴ・グラフィクスはこれを使っていたのだと思う。 あらためて眺めてみると、複素領域の乗算をダブルで重ねてフラクタルにしているようで、これはまだまだ改良して使えそうな気がした。 もちろん、改めてキープ領域にコピーである。(^_^)
fractal.explorer.maxpat
これまた素晴らしいフラクタル生成のjitterパッチである。 これもかつて見かけた記憶があるが、今回は改めてパッチを眺めると、まさにフラクタルをライヴ(マウスぐりぐり)で生成しているのだが、実は数学的(抽象的)なグラフィックでなくて、唐辛子のカラー画像を素材として利用しているのだった。 これを変えれば、これまた新たな活用法は無限大であり、ちょっと深堀りしたくなってきた。 もちろん、これも改めてキープ領域にコピーである。(^_^)
iso.field.maxpat
これは「Creating distance fields for isosurface generation」ということで、マウスでhandleできる3D空間内で「isosurface generation」する、というものである。 「jit.gl.material」というのを置くと、「jit.gl.material Editor」というのが出てきて、質感とかライティングとかを自在に設定できるようなので、そこそこ応用の可能性はありそうだ。
iterated.function.systems.maxpat
かなり盛大な(大袈裟な)jitterパッチであるが、randomに描画パターンを変えないと、ちょっと飽きてしまう感じのものだった。 とりあえずこれはパスとした。
jit.gen.erode.maxpat
ここから「jit.gen」ゾーンである。 この「jit.gen.erode.maxpat」というのは、Webカメラ画像を「jit.rgb2luma」でモノクロ化して、閾値で判定した画像、それをjit.genに入れた画像が並んでいるのだが、ほぼ両者は同じであり、このjit.genの意味は不明のままだった。(^_^;)
jit.gen.flowfield.dir2euler.maxpat
このパッチは「Flow field particle simulation with orientation along velocity vector」ということで、但し書きに「Based on a patch by micron - rajancraveri@gmail.com」とあって、 そのサイト に行くと上のように、この人は「Creating visual reactions with Max」というのをやっていて、メンバーには「Yes, I want to support this artist $5 per month」という寄付ボックスが先頭に出てくる・・・というものだった。 もしかするとこのパッチは、本人が撒き餌として提供しているのかもしれない(^_^;)。 ベクトル場で多数のパーティクルがわらわらと舞っているのはなかなか綺麗だが、しかしちょっと僕には響かなかった。
jit.gen.particles.maxpat
その名も「パーティクル」ということで期待したのだが、まぁ、ランダムなパーティクルが円周上に引っ張られていくというものだった。 マウスで3D空間をハンドリングできなかったのだが、そこを改良すると、ちょっと面白いかもしれないが。
jit.gen.spherical.inversion.maxpat
「spherical inversion」とはDeepL翻訳では「球面反転」とのことだが、ちょっと触ってみた感じではどうも全体像が把握できなかった。 まぁ、ピンとこなければそれまでということで、これもスルーとなった。
jit.gen.superformula.maxpat
これが「jit.gen」ゾーンの最後のサンプルパッチである。 パッチの中央あたりに4種類それぞれ3つのパラメータ、計12個があるのだが、これをぐりぐり変化させるとかなり劇的にグラフィックが躍動する。 これを多重センサーのパラメータと共に時間変化させると、何か生き物のようにできるかもしれない。 もしかするとこれは使えるカモ・・・ということで、キープ保存となった。
jit.gl.pix.alphablend.maxpat
ここから「jit.gl.pix」ゾーンなのだが、最初のサンプルは全く面白くなかった。 「jit.gl.pix @gen alphablend」の中でやっているのは、r/g/b/aのうちアルファ成分(透明度)だけ抽出する、というもので、まぁこれまでのJitterでも簡単なことだった。
jit.gl.pix.altern.maxpat
このパッチは動画に網目のマスクを乗せるというものらしいが、これまた面白くなかった。 こういうのはパスである。
jit.gl.pix.ameba.maxpat
何か「アメーバ」なのかと思ったが、どうやら可変のマス目に分割した領域ごとにゲインを上げて塗り潰す・・・というようなものらしい。 ポイントは「jit.gl.pix @gen ameba」ということで「ameba.genjit」という外部スクリプトをCodeboxに入れているのだが、そのサブgenパッチの中にまた4個並んだ同じgenサブパッチがあり、そこで事前にパラメータを関与させたり切り捨てしたりクランプさせたりしていたところだろう。 まぁ、これは僕は使わないだろうと思った。
jit.gl.pix.bleach.bypass.maxpat
輝度を変化させるだけのように思えるのだが、「ported from the original GLSL shaders by vade http://001.vade.info」ということで、 こんな謎なサイト に行ってみたものの、詳細は不明だった。
jit.gl.pix.bleach.bypass.mod.maxpat
これはすぐ上の「jit.gl.pix.bleach.bypass.maxpat」の亜流なのだろうが違いが不明だった。 これだけ効果が乏しいと、あまり深入りする気にならないのでパスである。
jit.gl.pix.cartopol.maxpat
そしてぼちぼち帰宅時間となって、今日はここまでである。 もはや「夏の札幌」も遠い彼方に消えていて、この日、ZOOMを立ち上げることは無かった。これは、ライヴのWebカメラ画像をぐるっと一周、捩じ曲げるという面白いエフェクトである。 その全体を拡大縮小したり平行移動する、というパラメータはあるものの、肝心の「ぐるっと一周、捩じ曲げる」という部分がgenの中で詳細不明でいじれなかった。 しかしGenパッチは編集可能なので、もしかすると使えるカモ・・・ということでキープしておいた。
2022年8月22日(月)
LIFE2022発表完了テンションで急遽追加した昨日のJoyJoyヒトカラ4時間では、攻めた41曲を完走した。 昨日は「帰ってこいよ」(松村和子)も歌ったが、これはこの曲の作詞家である平山忠夫氏の訃報が一昨日、届いたからである。 最近は昭和の歌謡界に関する訃報が多く届いて、そのたびにマイレパに入っているその曲を熱唱してきたのだった。 作詞家・岡本おさみ(2015没)では「洛陽」・「黄金の花」・「夏の少女」・「満天の星」・「襟裳岬」・「おきざりにした悲しみは」・「旅の宿」を、作詞家・阿久悠(2019没)では「勝手にしやがれ」・「北の宿から」・「津軽海峡・冬景色」・「また逢う日まで」を、作曲家・筒美京平(2020没)ではまた「また逢う日まで」・「ブルー・ライト・ヨコハマ」・「木綿のハンカチーフ」・「なんてったってアイドル」を、作曲家・中村泰士(2020没)では「喝采」・「北酒場」を、作詞家・なかにし礼(2020没)ではまた「北酒場」を、作曲家・小林亜星(2021没)ではまた「北の宿から」を、作曲家・すぎやまこういち(2021没)では「学生街の喫茶店」・「亜麻色の髪の乙女」を、作詞家・喜多條忠(2021没)では「神田川」・「妹」を、作詞作曲家・山本コウタロー(2022没)では「岬めぐり」を、それぞれニュースが届いた週には必ず再確認・熱唱していた。jit.gl.pix.circular.tiles.maxpat
というわけで「jit.gen」お勉強の続きである。 残りのjit.genパッチが29個、さらに残りのmaxpatが9個、となっていて、ぼちぼち「先」が見えているのだ。 このパッチは「A transformation that infinitely tiles the image and inverts it around the unit circle (using signed normalized coordinates, so it's more like the "unit ellipse")」ということで、フラクタルに階層化しつつ丸くしているエフェクトであり、これは是非ともさらに実験してみたいものとしてキープした。
jit.gl.pix.eclipse.maxpat
このパッチは、元画像(動画)をタイル化して敷き詰めたその全体に対して、各タイルに分割された「画素」の輝度と元の動画との輝度演算をすることで、パラメータによって全体として元画像のテイストが浮かび上がってきつつ、各画素もそれぞれ動画として動いている・・・というなかなかトリッキーなグラフィックのエフェクトだった。 面白いのは面白いけれど、しかしキープには至らなかった。
jit.gl.pix.infinite.mirror.maxpat
「無限の鏡」というタイトルからして期待していたパッチであるが、まずまず期待通りだった。 このパッチ自体はqmetroで0.06の累算値を「% 3.141519」(←こんな事が出来るとは!!!)した結果を「expr exp($f1)」に入れて、ズーミングがうまく繋がるように周期化して「無限ズーム」を実装しているが、そのパラメータ自体をぐりぐりする事も可能なのだった。 これは使えそうなので、文句なくキープ保存した。
jit.gl.pix.kaleido.maxpat
「万華鏡」というタイトルからして期待していたパッチであるが、期待以上の凄いものだった。 「divisions」パラメータによって、万華鏡の「鏡」の数を指定できるので、よくある3枚とかだけでなく、上の例では12枚としてみたが、後で実験すると10枚の方がさらに不気味で美味しかった。 これは文句なくキープだが、作曲というよりは「メディア数理造形演習」あたりで紹介してみよう。
jit.gl.pix.lighten.maxpat
タイトルからして地味っぽかったが、「Compositing operation that chooses between the lighter of the inputs using luminance」と、本当に地味なパッチだった。 2枚の動画でルミナンスの明るい方を採用するというもので、これまでだといちいちマスクを作っていたのに対して、この手法は「炎」とかを加えるためには有効かもしれない。 「テスト」領域にはコピーしたものの、「作曲用」にはコピーしなかった。
jit.gl.pix.lumadisplace.maxpat
R/G/Bとアルファチャンネルに対してdisplacementsを変化させる・・・というもののようである。 なんとなく背後霊のような効果には使えそうな気もするが、これも「テスト」領域にはコピーしたものの、「作曲用」にはコピーしなかった。
jit.gl.pix.mirror.maxpat
jitterでの「鏡」というのは、最初から「jit.rota」という素晴らしい道具があるので、このパッチは全く面白くなくて期待外れだった。
jit.gl.pix.pinch.maxpat
これは文句なく面白くて素晴らしいパッチである。 Codeboxで簡単に記述されているスクリプトでどう再帰的フラクタルにしているか・・・と見てみると、「pinch.genjit」の中の「return sample(img, vec(x, y)+origin, boundmode="mirror");」という部分であると判明した。 処理したものと入力(オリジナル)とを足してreturnで返すだけなのだった。 これは是非とも使いたくなった。(^_^)
jit.gl.pix.repos.maxpat
「repos」というのは「reposition」ということだろうか。 入力の画像をここでは6×6の領域に分割して、それぞれを過不足なくランダムに配置するというのを実装しているらしい。 まぁ面白いことは面白いので、「テスト」領域にだけコピーして、「作曲用」にはコピーしなかった。
jit.gl.pix.rubix.maxpat
面白いものと面白くないものが交互に出てくるところが面白い。 このパッチは、元画像を分割して、動的に動かすいくつかのランダムな場所の領域(画素)については平均の色情報にしてしまうというものだが、苦労の割にあまり面白いものではなく、スルーとなった。
jit.gl.pix.scalebias.maxpat
これは基本的過ぎて面白くない。R/G/B/Aのパラメータを単にGenの中で強度乗算、バイアス加算しているだけだった。
jit.gl.pix.sprinkle.maxpat
これは指定した大きさで、画素をじわじわと滲ませつつ歪ませるというようなものだった。 とりあえずパスとした。
jit.gl.pix.srcdim.dstdim.maxpat
これはソース側とディスティネーション側のそれぞれで単にスケーリングするというもののようで、パスである。
jit.gl.pix.technicolor1/2/3.maxpat
ここのサンプルとしては、実は「jit.gl.pix.technicolor1.maxpat」・「jit.gl.pix.technicolor2.maxpat」・「jit.gl.pix.technicolor3.maxpat」という3つが並んでいたのだが、実体としては同じもので、「ported from the original GLSL shaders by vade http://001.vade.info」という例のサイトから取材したもののようである。 どれも同じように面白くないものだった事を確認して、3つまとめてスルーした。
jit.gl.pix.twirl.maxpat
これはまたまた強烈に面白いパッチである。 画面をとにかく捻って捻って・・・というもので、静止画でなく動画(Webカメラの自分の顔)であれば最高に楽しい。 作曲というよりは「メディア数理造形演習」あたりで紹介するために、「テスト」領域にまずコピーしたが、結局は「作曲用」にもコピーした。
jit.gl.pix.wake.maxpat
モーションブラーのような効果を動画に対しても実現するというパッチである。 ただし保存としてはスルーした。
jit.gl.pix.xfade.maxpat
これは「jit.xfade」をGenにしてみた、というだけの何も面白くないサンプルだった。 ここまでで、「jit.gl.pix.###」という並びが終わった。
jit.pix.alphablend.maxpat
ここから「jit.pix」(glがなくなる)というゾーンであるが、glの付いたものと同じような名前が並んでいて、なんか嫌な予感がする(^_^;)。 このパッチは単に「jit.alphablend」と並べて、それをGen化したらこうなるよ、という教科書的なものだった。
jit.pix.brcosa.maxpat
これもGen化したらこうなるよ、という教科書だった。 入力画像をベクトル化して、brightnessとcontrastとsaturationのパラメータを作用させて、最後にまたベクトルをまとめている。 お勉強シリーズを続けてきたのでツーカーになったが、まさに「Genってこうやっているんだよ」というものだった。
jit.pix.circular.tiles.maxpat
これは、すでに登場していた「jit.gl.pix.circular.tiles.maxpat」を左側のGenオブジェクトとしてそのまま置きつつ、右側にはCodeboxでのGenExpr版も並べている、という教科書的なものだった。 どちらでも同じことになるので、改めて保存するほどの事はなかった。 次の「jit.pix.infinite.mirror.maxpat」は、すでに登場した「jit.gl.pix.infinite.mirror.maxpat」と同じだった。 その次の「jit.pix.kaleido.maxpat」は、すでに登場した「jit.gl.pix.kaleido.maxpat」と同じだった。 その次の「jit.pix.lumadisplace.maxpat」は、すでに登場した「jit.gl.pix.lumadisplace.maxpat」と同じだった。 その次の「jit.pix.repos.maxpat」は、すでに登場した「jit.gl.pix.repos.maxpat」と同じだった。
jit.pix.shade.maxpat
これは単に3つの入力を「mix」に入れるというサンプルだった。解説は「mix : Mixes (interpolates) between inputs a and b according to the value of the third input t, using linear interpolation. The factor (t) should vary between 0 (for a) and 1 (for b). If one argument is given, it specifies the mix (interpolation) factor」である。 次の「jit.pix.twirl.maxpat」は、すでに登場した「jit.gl.pix.twirl.maxpat」と同じだった。 その次の「jit.pix.xfade.maxpat」は、すでに登場した「jit.gl.pix.xfade.maxpat」と同じだった。 これで「jit.pix」というゾーンも終わりである。
julia.quat.raytracer.maxpat
残る「maxpat」はあと9個となったが、いきなり「julia」とか「mandelbrot」というファイル名が見えているので期待値maxである。 上はその「ジュリア集合」のパッチである。 ただしよく知られた2次元のものではなくて、3次元空間内でライヴに計算表示を続けるという「A Quaternion Julia Set Raytracer」という凄いものだった。 参考サイトとして 4D Quaternion Julia Set Ray Tracer というのが紹介されていて、その中身をGen化して実装したようである。 これは文句なく、キープすることにした。
mandelbrot.set.orbit.trap.maxpat
上は「マンデルブロ集合」のパッチである。 ただしこのパッチは、「radius」パラメータを設定してbangを叩くとフラクタル(入れ子の無限小に向かって)描画を行う、というものなので、ライヴ・グラフィクスという使い方はちょっと出来ない感じである。 さすがにこの描画(細かいところではチラチラとずっと計算描画を続けている)のbangをmetroで連打したくはないので、スルーとなった。
mesh.shatter.maxpat
3次元空間内で元になる図形(トーラス: 変更可能)を描画して、そこから爆発的に細かいパーツが飛び散るというパッチである。 Genパッチの中の「torus」を「cylinder」にしたら即刻、爆発の始点の形状が変わったのには驚いたが、何かが物足りないのだった。
pix.game.of.life.maxpat
もしかすると出てくるかな・・・と思っていた「ライフゲーム」だったが、やっぱり出てきた(^_^)。 まぁ、これは低速コンピュータでも「それなりに」出来てしまうので、ここでGen化されたといっても、何もソソラレルことはなかった。
reaction.diffusion.color.world.maxpat
これは上の「ライフゲーム」と同じ「jit.gl.slab」を使っているものの、「cf.gaussian.2p.jxs」という巨大なスクリプトも参照して、2次元平面内でランダムに成長する微生物みたいなグラフィクスをライヴ生成するものだった。 生態系に興味がある人はぜひ、この中身を解析してみて欲しい。
sampling.modes.genexpr.maxpat
これは「Codeboxの中身を書き換えてみて」というテキスト(ワークブック)というだけだった。
smear.o.vision.maxpat
これは3D空間内をメッシュの球体が動くというものだったが、いじれるパラメータが背景色しか無かったので、残念ながらパスとなった。
surfing.noise.maxpat
これは、3次元空間内にランダムに立方体のマテリアルを「穴開きチーズ」化させるようなものだった。 眺めていると面白いのだが、ここまでランダムだとちょっとつまらない・・・という点が(作曲においては)ややひっかかった。
unsharp.mask.maxpat
そして、これで遂に「jit.gen」のExamplesも全部チェックしたことになった。 「メディア数理造形演習」で紹介するものも含めて12個がピックアップできて、gen~のあたりも含めて「作曲のためにチェック」というディレクトリに保存したサンプルMaxパッチは45個となった。 ここからは、一つ一つをじっくりと眺めて再検討して、本当に「使えそう」なものを精選していくというステージに移行することになる。 なかなか充実の日となった。アンシャープマスクを作るというGenパッチだったが、あまり気持ち良いものでもないのでスルーとなった。
2022年8月23日(火)
まっさらだった昨日に続いて、今週は予定がスカスカなのだが、今日は1期生(技術造形学科)のゼミ・東堂のぞみさんの来訪アポがあるだけとなっている。 「虎の穴」の歴史 によれば、東堂さんは4虎・5虎・7虎・8虎・12虎・13虎・14虎に参加していて、さらに 5回目の沖縄 にも一緒に行っていた。 そして卒業後の東堂さんが浜松工業高校デザイン科の講師となり、そこで教わってSUACメディア造形学科に入ってきた林美緒さんは 30虎 に参加したり、 欧州ツアー2009 にも行っていた。 林さんと行ったリンツ(Ars Electronica)は4回目だったが、来月初旬には11回目のリンツに行く予定である。 そして今朝のニュースによれば、「政府は、日本への入国や帰国時に求めている72時間以内の新型コロナ検査を免除する方向で検討に入った」とのことで、当初予定では帰国日の朝にウイーン空港内のPCR検査場に行く予定だったのが不要になる可能性も出てきた。 しかし、そうなると、入国時Fast TrackのためのアプリMySOSと入国時に必要なCOVID-19近接追跡アプリCOCOAを使うためにこの5月にガラケーからスマホにしたのだが、それも実は不要だった・・・ということになるのかもしれない。
ICMAのMLからは、ポーランドのワルシャワで開催されるという「17th International Annual Conference on Tangible, Embedded, and Embodied Interaction」という国際会議のCFPが流れてきた。 ワルシャワといえば、 欧州ツアー2018 の時にクラコウからポズナンに行く国内線で乗り継ぎ(たった30分!)しただけで街に出ず、さらに僕のスーツケースは僕の飛行機に乗り遅れてエラい事になったのだった(^_^;)。 そして、この国際会議のテーマは「tangible revolutions - being together without screens」ということで、これは是非とも応募したい・・・と思ってスケジュールを確認すると、なんと「TEI 2023 conference: February 26 - March 1, 2023」だという。 来年の2月25-26日は前期入試であり、僕はマル秘業務のために2月27日「某作業」まで3日間、予定がびっしり埋まっていて、さらにこれはどうしても僕でないといけない業務なのだった。 これはどうしようもなく、応募の検討を断念バーグして届いたメイルを消去した。
そして、(旧姓)東堂のぞみさんがやって来て、久しぶりながらあれこれあれこれ、楽しく話をすることが出来た。 来訪打診メイルにあった「下心」というのは、彼女も勤務先(大平台高校)で運営に関わるようになり、例えば僕が「出前授業」・「特別講義」みたいな形で高校生を元気づけるような機会を作れれば、という話だった。 これはもう、フリーになって以来もう30年間ずっと、「呼ばれればどこにでも行きます」と言い続けている僕としては「いつでも何でもOK」という話であり、今後のリクエストを待つことになった。 可能であれば歓迎する、と来年2月あたりのMDWワークショップにも参加打診してみることにした。
午後には、懸案だった「XBee開発環境の移行」という作業に没頭して、なんとか1106にあったACERパソコン(WindowsXP)の環境(秀丸エディタを含む)をDynaBook(Windows10)に移し替えて、不要となったACERを廃棄できた。 ただし時代はぼちぼち「ポストXBee」であり(^_^;)、手元にストックしているXBeeは全てペアリング書き込み完了しているので、今後に新たにXBeeを仕入れてこれで書き込むという作業が発生するかどうかは微妙である。
さらに、台車で図書館と1106とを1往復して、1106本棚の書籍をSUAC図書館に寄贈するという遠大な作業の第1回も行った。 少なくとも過去5年間以上開いていない書籍は手元にある必要は無いので(断捨離対象)、自宅自室の本棚の本もほぼ全て捨てるのだが、1106にある本も自宅に持ち帰るスペースが無いので、基本的にはほぼ全てSUAC図書館行き(→不要なものの廃棄もお任せ)となる予定なのだ。2022年8月24日(水)
またまた「余計なお世話」が出てきた。 『カラオケ史上初!誰でもEvery Little Thingの持田香織になれる「なりきりマイク」がビッグエコーに登場!』という こういう もので、東京・大阪に加えて、浜松・有楽街のBIG ECHOでも特設ルームが出来るという。 「ヤマハは、歌声の分析・合成とAIに関係する最新技術を駆使し、人の歌声を別人の歌声にリアルタイム変換する新技術『TransVox(トランスヴォックス)』を研究開発しています。『TransVox』は、歌声の特徴や音の高低に応じた音色の変化など、歌い方の癖をAIに学習させることで、年代や性別を問わずどんな人の声でも特定の人の歌声に変換することができます」とのことで、 こんなサウンド のようだ。 しかしこれは、キーを変えた(男声であれば1オクターブ上げ?)自分の声?をどうモニターしてピッチ調整するのか、なかなか微妙な問題を提起している気がする。 僕は適正音域としてELTの曲はたいていKey=-2かKey=-3、つまり全音か短3度下げつつそのオクターブ上の実音で歌っているのだが、歌っている自分の声とオクターブ違いでない音程にライヴ移調された声(自分の頭蓋骨から聞こえる自分の声と変換された外部の声とが並行移調のまま[和声的でなく]常にハモッている(^_^;))をどう調整するのか、ちょっと想像しにくい。
3店舗で各1部屋ずつ、それも期間限定ということは、DAMのマシン(PremierDAM, LiveDAM, LiveDAM Studium, LiveDAM Studium Stage, LiveDAM Ai)のCPU/DSPでも実装しきれない外部処理(AI+DSP)のための特製パソコンが裏に置かれて連結されているだろうし、おそらく評判を様子見するだけというところだろうか。 だいぶ持田香織の歌唱力も衰えてきていて、ライヴでは過去のキーで歌えないという状況になっているので、あの過去の歌い方を保存できるというのは嬉しいかもしれないが、まぁ歌好きにとっては「余計なお世話」以外のなにものでもない。 マイレパ としてELTの曲も数曲入っている僕であるが、この特設ルームにわざわざ行くかと言えば、まぁ絶対に行かないのだった。 けっこう、ヤマハは昔から、こういう「余計なお世話」で外したりしているのだが、果たして今回はどうなるか。
午前には図書館と1106とを台車1往復(図書寄贈)の第2弾を行い、午後にはアポのあったM1・ゼミ王さんが1106にやってきて、新しい曲の提出とコメント、錯覚系Processing作品3つとコメント、その他あれこれ進めて(来週までの改訂を宿題として)終了した。 そこで飛び込んできたニュースが上のように「9月7日より入国前72時間以内のPCR陰性検査に代えて、ワクチン接種証明の利用を可能とする」というもので、ちょうどギリギリで僕の帰国の9月12日よりも前に滑り込んだ感じとなった(^_^)。 これまで厚生労働省のページとかウイーン空港PCR検査所とか、あれこれ調べて用意していた「紙」はとりあえず不要になりそうだが、なんせお役所仕事なので、土壇場で解禁延長(ズレ込み)になる可能性もあるので、やはり書類は持参することになりそうだ。
2022年8月25日(木)
アポもなく午後に通院外出の予定しかないこの日は、ちょうど王位戦第4局の2日目ということで、豊島九段の封じ手にどよめいたものの、しずしずと進む1日となった。 土日も関係なく研究室に出てくる日々なので、ド平日に実質的に精神的休日モードに入る日があってもいいだろう・・・と、今日はマッタリ過ごすことにした。
そんな中、 文化庁メディア芸術祭が今後の作品募集を行わないことを発表 というニュースが流れてきた。 世界的に「メディアアート」に入ることもないまま日本(文化庁)だけが業界の後押しのために「マンガ」をカテゴリにくわえて「アート、エンターテインメント、アニメーション、マンガ」とするなど、完全に世界の文化から取り残されたままガラパゴスで25年が経過したが、いつになっても世界はアニメやマンガを「メディア芸術」と認めないので、遂に諦めたのだろうか。 最近(ここ10年ほど)は、世界的に作品公募しても、結局は「アート」部門はArs Electronica入賞/ノミネート作品の草刈り場となっていて、リンツで見た作品を翌年に新国立美術館でデジャヴのように見る、というのが繰り返されてきたので、まぁ、当然だろう。
2022年8月26日(金)
Ars Electronicaのシンポジウム担当者から届いたメイルには正式な契約書のdraftがあって、講演者はきちんとしたこの文書をArs Electronicaと正式に取り交わすのだという。 第1項目「OBJECT」は「CO hereby confirms his*her commitment to participate in the Ars Electronica Festival 2022 "Welcome to Planet B” as a speaker as part of the Expanded Animation Symposium, at the panel ”Synaesthetic Syntax”. The abovementioned panel will take place on Sunday, September 11, 2022, at 14:00 - 18:00. Location: Skyloft (Floor 3), Ars Electronica Center, Linz, Austria」(COとは僕のこと)となっていて、以下にも「COPYRIGHT」・「RIGHTS」・「Data Protection」・「LIABILITY」・「CHANGE OF CONTRACT - TERMINATION DUE TO COVID-19」・「FORM OF AGREEMENT」・「CONCLUDING PROVISIONS」・「SEVERABILITY」という項目がズラズラと並び(いちいちDeepL翻訳にコピペで投げ込む気も失せる)、最後に両者のサインがある、というものだった。 付帯シンポジウムというよりも、これは完全にArs Electronicaの一部なのだった。 素晴らしい(^_^)。 これはぼちぼち、気合いを入れてプレゼンの準備にとりかかるとしよう。そして第3弾としてSUAC図書館に台車で山盛りの書籍類(今回は1106にあった詩集も全て寄贈)を持っていき一汗かいて、これで今日の主だったお仕事はほぼ完了である。 午後には帰宅して、インターバルを狭めてまたまたJoyJoyヒトカラの予約を入れているが、これは明日から土日月と3日間「禁酒」を続けて火曜日の人間ドックに備えるためである。 「無駄な悪あがき」と言われるが、それでもほんのわずか、この禁酒で数値がマシになって、また1年間、美味しく飲めるとすれば頑張るしかないのだった。
昨日の王位戦第4局の棋譜を今日になって眺めてみると、終盤の41銀でほぼそのまま投了になったようで、ちょっと優位になるとその後はバタバタしないでじわじわ上昇する、というAI「藤井曲線」は健在だった。 その他、天下の島津製作所が「ソニータイマー」を実際に製品に仕込んで、故障していないのに動作しなくなり部品交換で儲けていた・・・という信じられないニュースもあったが、まぁ、バレるように仕込むということはまだ元祖Sonyのレベルには到達していないという事だろう。2022年8月27日(土)
昨日のJoyJoyヒトカラ6時間では、かなり攻めた選曲で60曲を完走したが、そのダメージで今日の午前はAbemaTVの麻雀チャンネルなどをボーッと眺めて過ごした。 ゼミ3回生の日崎クンからは「後期からの計画について相談したく思い、アポをとるため連絡させて頂きました。主な内容としては後期から始まる総合演習で行う制作と、インタラクティブプロダクト演習の制作の相談になります。アナログとデジタル(プログラミング)の両方の案をいくつか持っていこうと思うので、それについて助言をいただきたいです」との前向きで意欲的なメイルが届いて、9月中旬のアポが確定した。 こうやって自分のやるべき事を切り拓いていくというのは重要なことなのだ(^_^)。
Ars Electronicaに行くまでにやっておくべき事を調べてみると、まず第一に自分のプレゼン(英語でマルマル30分、それもArs Electronicaのアーカイブに記録が残る模様)をしっかり準備する必要があり、これは明日にでも取り組んでみよう。 さらにゼミ・吉田さんが日本音楽知覚認知学会大会で発表するための予稿の執筆というのがあり、これは僕でなく吉田さんが書くものなので(僕はチェック役)、進捗について吉田さんに問い合わせのメイルを出した。
そして、あと残っているのが、帰国日のために欠席予定の9月のデザイン研究科教授会で、M1の院生については、指導する教員から中間報告書の「説明」をする・・・というお仕事があるので、YouTubeにその説明動画をアップするという作業が残っていた。 そこで、例によってアドリブ一発撮りして、教授会のためのオンデマンド報告の YouTube動画 として上げておいた(ちなみにリンク切れするので、ちょっとゴニョゴニョする必要がある(^_^;))。 そしてここで気付いたのだが、GENのお勉強をしていたために、この日記(Part14)のHTMLはもう225KBにもなっていた。 そこで、Part14はここまでとして、 Sketching日記(15) に続けていくことにしよう。 まだまだ、まだまだ「Sketching」が続くのだった。
「日記」シリーズ の記録