びぃえるくぅと。

ガラケーは打楽器。

VVVV で masawada モデルを使って遊ぼう

この記事は masawada Advent Calendar 2019 の 14日目です。昨日は id:mazco さんでした。

というか凄いお久しぶりです。なんと私ベトナムホーチミンにいるんですよ。11月に一時帰国を挟みましたが 4ヶ月目になります。 そしてその一時帰国中のスキを突いて Surface Pro 7 とか Apple Watch series 5 とかを買ったりしました。

そういえばベトナムって日本との時差2時間ありましたね。完全に公開タイミングミスりました。

masawada-3d

大学の時の友人 masawada 氏が 本人の3Dモデルを公開 していたのでとりあえず遊ぼうかという内容なのですが、遊び方を工夫したいと思います。(Apple Watch を買ったので masawada モデルをその上で動かすことを考えたのですがスキルがありません。)

とりあえず、いつもの VVVV https://vvvv.org で遊ぼうと思います。

FBX から DAE に変換

VVVV はデフォルトで DAE 形式の取り扱いに対応しています(VVVV上で自由にボーンを動かすとかはできませんが・・・)。 いったん Blender を使って FBX ファイルを取り込み、DAE ファイルをエクスポートしましょう。

ColladaFile ノードを使ってインポートして遊ぶ

とりあえず masawada でオーディオスペクトラムを作りました。

f:id:yadex205:20191214000412p:plain

マイクで拾った音に反応して masawada モデルが伸びます。

CircularSpread を使って円状に配置することもできます。

f:id:yadex205:20191214001008p:plain

どうせなのでテクスチャにエフェクトをかけてかっこよくしましょう。

f:id:yadex205:20191214001300p:plain

音圧で普段の見た目(テクスチャ)を取り戻すようにしました。

終わりに

終わりにへったくりもないですが、VVVV を使うとテクスチャとかモデルとかにエフェクトをかけまくれたり試しまくれたりするのが好きです。 また VVVV でVJするの復活してみようかな。

明日は id:maku693 さんです。

Node.js から ffmpeg 走らせてたら pipe 書き込み量の上限でハングアップしたらしい話

備忘録です(言い訳)。 あと、書いている内容は書いている時の知識に基づくので、誤りがある可能性があります。

状況

買った・ダウンロードした VJ 素材を VDMX で使えるように一括変換するバッチ処理的なものを Node.js で書いてます。

変換には内部で ffmpeg を呼び出しているのですが、進捗を取得できるよう -progress - というオプションをつけて標準出力に情報を書き出し、 それを Node.js スクリプト側で受け取る実装にしていました。

ところが、一定時間 経過すると呼び出している ffmpeg がハングアップするも、 ffmpeg 自体は死んでいないというよくわからない状態に必ずなるようになりました。

なお、呼び出しているのと全く同じコマンドを bash で実行すると ffmpeg はちゃんと完走するため、さらによくわからん状態です。

原因(らしきもの)の特定

はじめ htop とにらめっこしたりして紆余曲折を経ていたのですが、神頼みで ffmpeg hangup で検索したところ、 下記の Stack overflow の QA にヒットしました。

stackoverflow.com

It hangs because after a certain point it can not write to it's output pipe any longer.

なるほど、ffmpeg の進捗情報を pipe 経由で大量に受け取ってたのが原因かもしれません。 ということで ChildProcess.spawn するときに { stdio: 'ignore' } をしたところ、無事に完走できるようになりました。

パイプ以外で ffmpeg の進捗を受け取る

ごめんなさい現在探っている状態なので、見つけ・思いつき次第追記したいと思います。

(追記 2019.04.30) Node.js 側のバッファの問題?

github.com

古めですがこちらの issue に気になる内容があり、適宜 proc.stdout.on('data', (chunk) => {}) してやれば止まらず実行し続けるとのことでした。

そういえばと思い、(すでに stdout の方は .on('data') で拾っていたので)stderr に対して上記の対応をしたところ、 { stdio: 'ignore' } をしなくても止まらず完走するようになりました。

zsh で cd の時に peco 使って移動先を選んだ後に移動までやってもらいたい

実は4月から社会人デビューしていたのですが、 職場で使いやすいターミナル環境整えている時に pecoディレクトリ移動をするいろんな記事を思い出し導入しました。

blog.hotolab.net

試行錯誤した結果、上記の記事を参考にしてバッファ上に

$ cd

と入力されている時だけ C-h を押すと、近い階層のディレクトリ一覧を peco で表示するところまではできました。

function peco-path-find() {
    if [[ $LBUFFER =~ \s*cd\s* ]]; then
        # バッファに cd が入力されていた場合は5階層分のディレクトリを選択できるようにする
        local filepath="$(find . -maxdepth 5 -type d -not -path '*/\.*/*' | peco --prompt 'CHANGE DIRECTORY>')"
        BUFFER=$LBUFFER$filepath
    else
        # 上記以外の場合は近場のファイルやディレクトリを選択できるようにする
        local filepath="$(find . -maxdepth 3 -not -path '*/\.*/*' | peco --prompt 'PATH>')"
        BUFFER=$LBUFFER$filepath
    fi
    CURSOR=$#BUFFER
}
zle -N peco-path-find
bindkey '^h' peco-path-find

ただ、peco で選択したディレクトリをバッファに入力してくれるところまではしてくれるものの、 どうせなら peco で選択した後は実際に移動までしてもらいたいです。

その際に

zle accept-line

をするとバッファ上にある文字列で実行してくれるということを最近ようやく知れたので (参考: https://qiita.com/ymorired/items/4b0d8e95786efc1378b4)、結果以下のようになりました。

function peco-path-find() {
    if [[ $LBUFFER =~ \s*cd\s* ]]; then
        local filepath="$(find . -maxdepth 5 -type d -not -path '*/\.*/*' | peco --prompt 'CHANGE DIRECTORY>')"
        BUFFER=$LBUFFER$filepath
        zle accept-line # これ!!!!!!
    else
        local filepath="$(find . -maxdepth 3 -not -path '*/\.*/*' | peco --prompt 'PATH>')"
        BUFFER=$LBUFFER$filepath
    fi
    CURSOR=$#BUFFER
}
zle -N peco-path-find
bindkey '^h' peco-path-find

zsh については完全に疎い人間なので改めて設定を見直してこんがらがっていますが、開発環境が改善されて気持ち良くなるのは良いですね。

iPad Pro を買ってしまいました。

なので何か書いてみたかっただけです。画面キーボードですが、ボタンが大きいのか意外と普通のキーボードを使う感覚でタイプできなくもないですね。

9.7インチ

私は絵を描く人じゃないのでこのサイズで良いかなと思ってまぁちょうど良さげです。今後はVJ用途に使うつもりなので、そこまでスペース取らずに多機能なのは期待できそうです。iPad mini 4 は流石に小さすぎるかな。。。

Pro

せっかくなら強いやつをと思って Air じゃなく Pro にした訳ですが、使いこなす自信が今のところありません。Apple Pencil が使える以外でみなさんどんな利点がありますか。。。。?

Colorcode VJ がサクサク動いたり、動画編集がぬるぬるできるとかは期待できそうです。

その他

ウェブサイト制作にあたっての検証端末としてはガンガン使っていきます。WebGL で何か書いて iPad Pro の性能を活かして楽しめそうです。後は最近 Objective-Cというか Cocoa API とかに触れるようになったので、次は Swift で iOS 向けアプリとか書いてみたいなーという気持ちもあります。せっかくなら OpenGL を使ったもので。

EC2 の Amazon Linux 2 で rbenv を使わずに Ruby 2.4 を入れる (おまけに Node.js)

気づいたら Amazon Linux のメジャーバージョン(?) が 2 になっていたんですね。おめでとうございます。

面倒なので rbenv 使わず新しい Ruby を入れたい

さて Yahoo! とかで Amazon Linux ruby 2.4 とかで検索してみると、ほとんどの記事が rbenv を使ってインストールしているのですが、 まぁ面倒だしせっかくなのでなんとか rbenv を使わずに完結させたいと思った次第です。

検索結果をよく見てみると AWS 公式の記事があったので見てみると

aws.amazon.com

Ruby 2.4 – 2.4 シリーズの最新バージョン Ruby が利用可能になりました。次のようにインストールします。

$ sudo yum install ruby24

なんだぁ yum でインストールできるんじゃ〜んとか思って意気揚々とコマンドを叩くと

[ec2-user@ip-x-x-x-x ~]$ yum search ruby24
Loaded plugins: langpacks, priorities, update-motd
Warning: No matches found for: ruby24
No matches found

おらんのです。

(ちょっと話題から逸れて) 2つの Amazon Linux

docs.aws.amazon.com

AWS には、2 つのバージョンの Amazon Linux: Amazon Linux 2 および Amazon Linux AMI が用意されています。

なるほどさっきのは Amazon Linux AMI を対象とした記事だったんですね。初見殺し。

僕が動かしてるインスタンスAmazon Linux 2 の方なので単純に yum では入れられないようです。 AMI 版(?) の方はおそらく yum でインストールできるようになっていると思われます。

Extras Library

ですが Amazon Linux 2 になってから Extras Library という仕組みが作られたようです。 どういう仕組みで動いているかは把握していませんが amazon-linux-extras コマンドで追加のソフトをインストールすることができます。

2018/02/04 現在で Extras Library 経由でインストールできる トピック (と呼ぶそうです) の一覧を出力してみると

$ amazon-linux-extras list
  0  ansible2   disabled  [ =2.4.2 ]
  1  emacs   disabled  [ =25.3 ]
  2  memcached1.5   disabled  [ =1.5.1 ]
  3  nginx1.12   disabled  [ =1.12.2 ]
  4  postgresql9.6   disabled  [ =9.6.6 ]
  5  python3   disabled  [ =3.6.2 ]
  6  redis4.0   disabled  [ =4.0.5 ]
  7  R3.4   disabled  [ =3.4.3 ]
  8  rust1   disabled  [ =1.22.1 ]
  9  vim   disabled  [ =8.0 ]
 10  golang1.9   disabled  [ =1.9.2 ]
 11  ruby2.4  disabled  [ =2.4.2 ]
 12  nano   disabled  [ =2.9.1 ]
 13  php7.2   disabled  [ =7.2.0 ]
 14  lamp-mariadb10.2-php7.2   disabled  [ =10.2.10_7.2.0 ]

想定したよりも利用可能なトピックは少なかったですが、主要なアプリケーションの最新バージョンが一通り揃っています。 yum でインストールできるバージョンと比較してみると以下の通りになりました。(これも 2018/02/04 現在)

パッケージ (トピック) yum での最新 extras での最新
Ansible N/A 2.4.2
Emacs 24.3 25.3
Memcached 1.4.15 1.5.1
Nginx N/A 1.12.2
PostgreSQL 9.2.23 9.6.6
Python 3 N/A(?) 3.6.2
Redis N/A 4.0.5
R言語 N/A(?) 3.4
Rust N/A 1.22.1
Vim 7.4 (インストール済) 8.0
Go言語 1.8.3 1.9.2
Ruby 2.0.0 2.4.2
Nano 2.3.1 (インストール済) 2.9.1
PHP 5.4.16 7.2.0

Ruby 2.4.x をインストール

ということで Extras Library を経由して Ruby 2.4 をインストールします。

$ sudo amazon-linux-extras install ruby

細かいバージョン指定もできるようなので、EC2 のドキュメントを是非チェックしてみてください。 これで Ruby 2.4 + Gem が使えるようになりました。

[ec2-user@ip-x-x-x-x ~]$ ruby -v
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-linux]
[ec2-user@ip-x-x-x-x ~]$ which ruby
/usr/bin/ruby
[ec2-user@ip-x-x-x-x ~]$ gem -v
2.6.13
[ec2-user@ip-x-x-x-x ~]$ which gem
/usr/bin/gem

めでたし。

(番外編) そういえば Node.js はどうやって入れたら良いの?

[ec2-user@ip-x-x-x-x ~]$ amazon-linux-extras list | grep node
[ec2-user@ip-x-x-x-x ~]$

・・・。

[ec2-user@ip-x-x-x-x ~]$ yum search nodejs
Loaded plugins: langpacks, priorities, update-motd
=== Matched: nodejs ===
http-parser.x86_64 : HTTP request/response parser for C
http-parser-devel.x86_64 : Development headers and libraries for http-parser
[ec2-user@ip-x-x-x-x ~]$

・・・・・・・・・・・・・・。

正解は

パッケージマネージャを利用した Node.js のインストール | Node.js

こちらを参考にしてみてください(丸投げ)。なるほどリポジトリを追加するんですね。分かるか。

VDMX で NumFX を利用した便利なレイヤー表示操作

お知らせ 1/1(月) に同様の内容の記事を投稿していましたが、中途半端なまま放置してしまったため、書き直しという形で本記事を投稿しました。

挨拶

改めまして、明けましておめでとうございます。本年も何卒よろしくお願い致します。

年越しの WEEKEND RAVERS NYE (#WRNYE) での VJ もなんとか無事に終わり、 2018年幸先よく VJ をスタートすることができたかなと思います。

さて、#WRNYE より前に 12/30 にハトトさんのお宅で開催された #HatotoHouse に招待されたので、 VDMX ヘビーユーザーに囲まれてビクビクしながら自分の VDMX プロジェクトファイルを紹介したのですが、 予想に反して反響がありました。大変嬉しい限りです。

一時的なレイヤー非表示(ミュート)や単独レイヤー表示(ソロ)

特に反響(?)が大きかったのが、一時的にあるレイヤーを非表示にしたり(以下、ミュート)、 一時的にあるレイヤーだけを表示する(以下、ソロ)仕組みでした。

全国 1億人の VDMX ユーザーのほとんどが Layer OpacityMIDI コントローラーの縦フェーダーに割り当てて操作していると思います。 もちろん縦フェーダー操作だけでもミュートやソロは可能ですが、 慌てて瞬間的にフェーダーを操作すると僕はよくミスったりフェーダーのつまみを飛ばしてしまったりします。

そこで私は縦フェーダーの他に、ボタンを押したらミュートしたりソロにできるようにしています。 KORG の nanoKontrol2 を愛用していますが、以下のように割り当てて使っています。

f:id:yadex205:20180107223844p:plain

これらを VDMX の Num FX という機能を使って実現していきます。

前提と準備

今回は 3レイヤー用意し、 それぞれの Layer Opacity をお好みのコントローラーの縦フェーダーにマッピングしているものとします。

f:id:yadex205:20180107223902p:plain

今回はコントローラーの代わりに、上の画像の様に Control Surface を使ってでっち上げたもので解説します。 頭に L1, L2, L3 とついてるボタンやフェーダーがそれぞれ レイヤー1, レイヤー2, レイヤー3 を操作します。

レイヤーミュート

簡単な方から、ミュートを実装しましょう。Resolume だと B ボタンに該当します。 具体的には、Mute ボタンを押したら縦フェーダーがどんな値であろうと、Layer Opacity の値を強制的に 0 にするようにします。

まずはレイヤー1 の Layer Opacity の UI Inspector を開きます。 下の方にボタン Edit Num FX Chain があるのでクリックすると Number FX Chain Inspector という画面が出てきます。

f:id:yadex205:20180107223924p:plainf:id:yadex205:20180107223934p:plain

さて名前からお気づきの方もいらっしゃると思いますが、 Num FX は外部のコントローラからの入力値に対してエフェクトをかけることができる機能です。

例えば 縦フェーダーの入力値に対して常に 0.5 を掛ける エフェクトを追加すれば、 縦フェーダーを目一杯上まで押し上げても VDMX 側で受け取る値は 0.5 までしか上がりません。

ということで、Number FX Chain Inspector 画面の Add Asset: から FX > Multiply を追加します。

f:id:yadex205:20180107224001p:plain f:id:yadex205:20180107224009p:plain

Multiply は外部コントローラーからの入力値に対して、指定した値を掛ける Num FX です。 初期値では 1.25 が指定されてるので、例えば縦フェーダーを真ん中の位置にスライドすると、 VDMX 側では 0.5 * 1.25、つまり 0.625 として受け取られます。

また NumFX 全部に言えますが、 VDMX で映像に対して使うエフェクト同様右上のボタンで ON, OFF が切り替えられます。

最後に、Mute ボタンを Multiply の ON, OFF に割り当てMultiplier の値を 0.00 にすると完成です。 これによって、Mute ボタンを押すと Layer Opacity を 0.00 に固定する NumFX が有効になります。

f:id:yadex205:20180107224711g:plain

あとは他の全てのレイヤーに対して同じ様に NumFX を仕込めば完成です! ちなみに、NumFX が有効になっている場合は四角にNのマークがつきます。

単独レイヤーのみ表示 (ソロ)

仕様

次に複雑になりますが、ソロ機能を実装していきます。Resolume だと S ボタンに該当します。 ここでは各レイヤーは 3つの状態を持つことになります。

  • ソロ機能が無効であり、自身のレイヤーが表示されている。
  • ソロ機能が有効であり、現在自身のレイヤーが選択されているため自身のレイヤーだけ表示されている。
  • ソロ機能が有効であり、現在他のレイヤーが選択されているため自身のレイヤーは非表示になっている。

実現するためには以下の項目について VDMX 側でデータとして持つ必要があります。

  1. 現在ソロ機能が有効になっているかどうか
  2. ソロ機能が有効になっている場合、現在選択されているレイヤーはどれか

今回は VDMX 側がデータとして持つ部分を Control Surface を使って実現し、あとはミュートの時と同じく NumFX Multiply を使っていきます。 なお Control Surface でのデータの保持の仕方は色々な方法があると思いますので、 この記事は参考程度にして自身のしっくりくる方法に落とし込んでいただけたら幸いです。

Control Surface の作り込み

まず、単独で表示するレイヤーとしてどれが指定されているかを Multi-Button で表現します。ボタンの数は レイヤーの数 + 1 用意し、Toggle Buttons? オプションと Mutually-exclusive? オプションの両方にチェックをつけ、Publishing Properties を Publish index of last button にしましょう。Toggle Buttons?Mutually-exclusive? については説明が面倒なので省きますが、ご自身で試していただけると納得の挙動をすると思います。

次にソロ機能が有効になっているかどうかを表すための Button を追加し、先程追加した Multi-Button をこのボタンの Receiving に追加します。

f:id:yadex205:20180108103317p:plain

さて、先程 Multi-Button の Publishing Properties を Publish index of last button に、つまり選択したボタンの番号を他のコントローラに伝えるようにしたわけですが、それによって番号が 1 以上のボタンを選択しているときに Button は ON の状態になります。

f:id:yadex205:20180108103853g:plain

ただし、Multi-Button の発するデータが Publish index of last button の状態だと扱いづらいため、もう一つ同じ個数の Multi-Button を用意し、こちらは Publish as many BOOLs の状態にしておきます。そして新しい Multi-ButtonNavigation > Choose by index に以前の Multi-Button を追加します。

f:id:yadex205:20180108104320p:plain

これで Control Surface の作り込みは完了です。上の画像での Solo activated? ボタンが「ソロ機能が有効になっているかどうか」、Solo activated layer output が「現在単独表示するレイヤーとして選択されているレイヤー」を表現してくれています。

コントローラーと Control Surface と Layer Opacity の連携

ソロ機能の完成に近づいてきました。まずは外部コントローラーの Solo ボタンを Control Surface の 最初に作った Multi-Button に対してマッピングします。 なお、コントローラーの L1 Solo, L2 Solo, L3 SoloToggle button? オプションのチェックを外しています。こちらもご自身で挙動を確認していただけると幸いです。

f:id:yadex205:20180108105208p:plain

次に、ミュートの時と同じ様に Layer Opacity の Number FX Chain Inspector を開き、同様に FX > Multiply を追加します。 そして以下の画像の通りマッピングを行います。注意としては、Multiplier の最大値が 1.00 になるようにフェーダーを設定しておくのを忘れずにお願いします。

f:id:yadex205:20180108105616p:plain f:id:yadex205:20180108105610p:plain

これを全レイヤーに対して行えば、ソロ機能の完成です。

f:id:yadex205:20180108110023g:plain

ちなみに先程作った Control Surface はもう見せる必要がないので僕は消してしまいます。プログラムで関数のような裏方の作業をしてくれる Control Surface のことをよく「隠し Control Surface」とか僕は言ったりしています。

最後に

拙い説明だったと思いますが、いかがでしょうか。初めはとっつきづらいと思いますが Control Surface と NumFX で VDMX はより便利になります。ちょっとしたプログラムを組む感覚だと思います。是非試してみてください。

告知

  • 1/18 (木) アッパーチューナー第2弾 #アパチュナ @ 渋谷 nagomix 告知ページ
  • 1/27(土) ??? @ 渋谷 VUENOS
  • 3/18(日) ??? @ 渋谷某所

本年もよろしくお願い致します🙇

自分の VDMX プロジェクトファイルについて (主に NumFX使ったやつの解説)

改めまして、明けましておめでとうございます。無事大晦日から元旦にかけての Weekend Ravers NYE も VJ をやりきることができました。

さて、以前 VJ さんのお宅で開催された VJ 会議 feat. 寿司 にお邪魔した際に、僕の VDMX のプロジェクトファイルを見ていただき思いの外反響 (?) があったので、 その中でも目立つ箇所とその実装方法的なのを紹介しようと思います。

この記事での前提と準備

基本的に操作は KORG の nanoKontrol2 (以下、ナノコン) で行うものとします。 フェーダー・ノブ・ボタン S M R の 1セットで 1つのレイヤー操作します。

f:id:yadex205:20180101205452p:plain

また、左から順にレイヤー1, 2, 3... を操作するものとします。

これは僕のやり方に近いというだけなので、もし参考にされる場合は各自の方法 (お持ちの MIDI コンや VDMX の Control Surface 等) に落とし込んでいただければと思います。

では説明していくにあたって、とりあえずレイヤーをいくつかとそれぞれのプレビューを用意しておきましょう。

f:id:yadex205:20180101211109p:plain

そして、それぞれの Layer Opacity にナノコンの縦フェーダーを割り当てておきましょう。それでは解説に入ります。

ミュート機能

ちょうど「Mute」の頭文字なので、ナノコンの M ボタンを押したらそのレイヤーがミュートされる、つまり Layer Opacity が強制的に 0.00 になるようにします。仕様は以下の通りです。

  • 1回 M ボタンを押すとミュートが有効になる
  • もう 1回 M ボタンを押すとミュートが解除される

これを Number FX の機能を使って用意します。今回の状況で言えば縦フェーダーの値で Layer Opacity を弄っているわけですが、その縦フェーダーの値に エフェクト をかけることができます。

例えばレイヤー2の UI Inspector を開いてみましょう。下の方に Edit Num FX Chain ボタンがあるのでクリックします。

f:id:yadex205:20180101212422p:plain

すると、Number FX Chain Inspector というウィンドウが出てくると思います。

f:id:yadex205:20180101212653p:plain

では、右上の Add Asset: から FX > Multiply を選びましょう。

f:id:yadex205:20180101213106p:plain

なんとなく想像つく方もいらっしゃると思いますが、これでナノコンの縦フェーダーの値にある数を掛け算した結果を Layer Opacity として使うことができます。初期値では 1.25 なので、縦フェーダーの値 x 1.25 が Opacity として使われます。もし Multiplier2.00 を与えておけば、縦フェーダーを半分程度上げただけで Layer Opacity1.00 になっていますし、逆に Multiplier0.50 を与えると、縦フェーダーを全部上げても Layer Opacity0.50 までしか上がりません。

また VDMX の通常のエフェクトと同じく右上の On Off ボタンを押すと、NumFX の有効無効を切り替えられます。

前置きが長くなってしまいましたが、僕のミュートの実装方法は NumFX Multiply を用意して 値を 0 にし、ナノコンの M で On Off を切り替える というものです。最終的に出来上がったものが以下のようになります。

https://user-images.githubusercontent.com/4597654/34467909-b06e7a20-ef40-11e7-8a63-58c57fd1201a.gif

ソロ機能

すみません近日中に書きます。(2018.01.01現在)

ということで

Number FX で楽しい VDMX ライフを!

余談

パーティー中に他の方の VDMX を見てふと思い立って増築した自分のプロジェクトファイルがこちらになります。

f:id:yadex205:20180101203519p:plain

そして増築直後

今年は荒れそうです。本当にメニューバー出さないよう気をつけます・・・。

Copyright © 2015 Yadex205