11月
15

javascriptでJOY DIVISIONのジャケットのような事がしたい only on Firefox

JOY DIVISIONの世代ではありませんが…

JOY DIVISIONというロックバンドをご存知でしょうか?ニュー・オーダーの前身となる70年代のイギリスのアーティストです。活動期間は短いですが、Unknown Pleasuresというアルバムが有名で、特にそのアートワークは現在も人々にインスピレーションを与えているようです。どんなジャケットかというと、こんな感じです。(この演出はイラっとするかもしれません。)

ご覧のように、周波数のスペクトルを時系列で縦に重ね並べただけの何の変哲もないグラフです。ですが、なぜかなかなかインパクトがあり、検索結果でもわかるように衣服のデザインに使われたりもします。

今回これをjavascriptで出来たらいいな、と考えて見ました。
このようなアプリケーションは私はWindowsのネイティブアプリケーションとして作ったことはありましたがブラウザ上では初めてです。そもそもできるのかどうかわかりません。でも今は21世紀です。きっと出来るに違いありません。

FireFox Experiments

ちょっと調べてみたら、
Mozilla Wiki – Audio Data API https://wiki.mozilla.org/Audio_Data_API
というのを見つけました。
Defining an Enhanced API for Audio (Draft Recommendation) Abstract
The HTML5 specification introduces the <audio> and <video> media elements, and with them the opportunity to dramatically change the way we integrate media on the web. The current HTML5 media API provides ways to play and get limited information about audio and video, but gives no way to programatically access or create such media. We present a new Mozilla extension to this API, which allows web developers to read and write raw audio data.
この概要説明によると、HTML5 media APIのMozilla独自拡張という事ですが、ウェブ開発者へ生音声データへのr/wを提供するという事なので期待できます。 そして、下の方にやりたい事ほぼそのままのサンプルコードがありました。
Complete Example: Visualizing Audio Spectrum This example calculates and displays FFT spectrum data for the playing audio:
まさにこれです。あっさり冒険が終了してしまいました。
そして、ひとまずこのソースをそのままコピペして表示させてみたのが、
こんな(音声は録音していません)感じです。なかなか良い感じですね!

HTMLのソースは、

    <audio id="audio-element"
           src="./LivingFree.wav"
           controls="true"
           style="width: 512px;">
    </audio>
    <div><canvas id="3dfft" datasrc="./3DdemoSpectrum.pjs" width="512" height="300"></canvas></div>
	<script src="./3DdemoSpectrum_audio.js"></script>
    <script>
      var audio = document.getElementById('audio-element');
      audio.addEventListener('MozAudioAvailable', audioAvailable, false);
      audio.addEventListener('loadedmetadata', loadedMetadata, false);
    </script>

このようになっていて、MozAudioAvailableとloadedmetadataに対応したイベントハンドラを追加し、javascript側で音声データのストリームを受け付けられるようにします。外出ししたjsファイル側ではこれらのイベントハンドラの実装を行なっています。

3DdemoSpectrum_audio.js(オーディオ関連のイベントハンドラとFFTを記述している)

	function loadedMetadata() {
		//(任意の処理を実装)
		//loadedmetadataイベントはHTML5標準だがMozillaはメディア要素から
		//mozChannels,mozSampleRate,mozFrameBufferLengthが取得できる
	}
	function audioAvailable(event) {
		//(任意の処理を実装)
		//MozAudioAvailableイベントはMozilla独自拡張。音声データのストリームが取得できる。
		//ここでは受け付けたストリームデータのスペクトルを求める(FFTの実行)
	}
	// FFT from dsp.js, see below
	var FFT = function(bufferSize, sampleRate) {	
		//FFT実装	
	}

javascriptソースにあるとおり、FFT部分のロジックはdsp.jsのソースの一部を流用しています。dsp.jsではFFTといった分析の他に正弦波矩形波といったアナログシンセの基本波形の発信も出来るようでjavascriptでソフトウェアシンセサイザーを作るという事も可能と思われます。

processing.jsと連動させる

そして今回はJOYDIVISIONの様に奥行きのある波のような動画を作ってみたいので、3Dを使って波形を表示して見ることにします。processingのサンプルソースでこれに近いものは無いかと探していたところ、Andor Salgaという方が立方体の各辺をランダムに揺らすアプリケーションElectric Cube(3D)を作っていましたので、これをベースに周波数表示を行うものに改変してみます。改変後のソースはこちらです。

いくつかクラスがありますが要となるメソッドは、LightningBolt#updateで、ここでaudio側のjavascriptのメソッドinitSpecとgetSpecを読みだしています。getSpecからFFTの演算結果を取得しています。

firefoxで表示してみる

3DdemoSpectrum.html(下の黒い部分に緑の線が出ない場合はページをリロードしてください。うまく行かないのは何でだろう?)

私の手元のマシンで動作させた様子は、こんな感じです(内蔵マイクの音声でスミマセン)。曲は、http://soundcloud.com/rollin-fire-cru/living-free/こちらの作品を使わせて頂きました。

JOYDIVISIONとちょっと投影法や精度が違いますが、なんとなく同じように表示させることができました!

課題

初期表示でラインが表示されないことがある。

→多分これは私の実装方法に何か問題があるのだと思います。

現在のところFirefoxでしか動かない。Chromeでもダメ。

音声データに関しては、先に上げた引用文にもあるようにHTML5とその関連技術が過渡期なので、今後どうなるのかわかりません。一方3Dに関してもWebGLについては同様に過渡期のようです。processing.jsは3DモードだとWebGLを使うようですが、2D Canvas上で3Dを再現したpre3dというプロジェクトもあるようです。速度面のデメリットがありそうですがこちらの方が環境依存しないというメリットがあるかもしれません。今回の場合は音声を扱いましたので割りきりましたが純粋に3Dの実装を行う場合にはどちらが良いのか迷いどころな気がします。

速度が遅い。

もっとパフォーマンスを良くしたいです。本当はライン一本一本をブリンブリンに光らせたいです。

11月
11

Red Bull x google コラボに感じる文化の違い

マッシュアップという言葉は元々アンダーグラウンドなDJの音楽用語で、ボーカルやドラム等の曲の一部を取り出し、合成して全く別の新たな曲を作る手法を指しますが、ウェブの世界では公開されている様々なWEBAPIを利用して新しいサービスを作る意味で使われています。そんな元々のマッシュアップ文化に通じるアングラ感のある「え、企業がそれやっていいの?」っていうような、ちょっと日本だと考えられないコラボレーションがあったので面白いので紹介します。

RED BULL STREET ART VIEW - http://streetartview.com/

RED BULLとGoogleがコラボ、ストリートビューでストリートアートが見られる!
GoogleとRED BULLがコラボした「STREET ART VIEW」では、ストリートビューで世界中のストリートアートを見ることができる。 – ITmedia記事

ということで、つまりは世界のグラフィティ(端的に言って落書き)をGoogle Mapで閲覧できるサイトです。
こんなものを世界企業googleとRed Bullがやってしまうというのが面白いですね。もし日本の企業がこんなことしたら、テレビで大バッシングじゃないでしょうか?もっともストリートからアートの世界に進出したのはバスキアが有名ですが本気のヤンキーっていう訳ではなく椎名林檎が新宿系と名乗っていたのとあまり変わりがないのかもしれませんが、賛否はともかく落書き(かもしれない)という違法性の高いコンテンツをネタにサイトを作ってしまう文化、というのは日本ではあまり見られない気がします。

投稿されているグラフィティは、さすがに欧米が多いですが、日本もチラホラ投稿されています。

ミラノ

吉祥寺

Red Bullってオサレな会社だったんですね。

んで、何やってんの大塚製薬!

11月
10

processing.jsで裸眼立体視にチャレンジ

細野晴臣もハマった?

裸眼立体視というのがかれこれ20年くらい前に流行ったのをご存知だろうか。

昨年はアバター等の3D映画や対応テレビが発売され3D元年などと言われていました。
この流行、私だけでしょうか?若干コケた感がしますが、立体で映像を見たいという欲求は古今東西、少なからずあるようです。

さて、昨今のウェブ制作においてはHTML5やjavascriptに注目が置かれるようになって久しくなりました。中でもHTML5の新要素であるcanvas要素の利用についてはユーザビリティの向上などリッチなユーザーエクスペリエンス(って書くと大変胡散臭いですが)に直結する為、注目です。このcanvas要素上で簡単に様々なデータ視覚化、メディアアート、インタラクティブアニメーション等が実現できるライブラリがprocessing.jsです。

おお、これだ。これで3Dやってみよう!それも肉眼のみをつかった根性と共に。
努力して得た立体画像はお仕着せの立体画像より感動的な筈だ。

Processingについて

Processingは元々Javaのライブラリで、メディアアートや視覚化を実現できるデザイン言語(中間言語?)でもあるのがウリです。これを元にjQueryでお馴染みのJohn Resigが作ったのが
processing.jsとなります。Processingと互換性が高い言語が用意されており、映像コンテンツそのものを作る事に注力できます。

ランダムドット裸眼立体視について

普通に考えて左右の目に対して個別の画像を用意するところをランダムドット絵ではなんと一枚の絵に収め、これを何の器具も使わず肉眼のみで立体に見せてしまう所が画期的です。実はこの題材については、現在は休刊のパソコン雑誌Oh!X 1992年12月号の丹明彦氏の特集記事を元にしています。詳しくはそちらを、と言いたいところですが21世紀の現在では、オークション等で手にいれるしかありません(国会図書館にはあるかもしれないけど)。

簡単にアルゴリズムを説明すると、

まず、乱数を使って画面幅の1/5分の基本パターンを作りこれを左端のテクスチャにします。
これとは別にモノトーンの元絵を用意しておきます。元絵のモノトーンの色情報は便宜的に高さ成分とみなします。

用意した左端のテクスチャを右へ右へ繰り返し4回コピーします。
もちろん、ただ繰り返すだけでは立体になりませんので、この画面1/5ブロック単位内で、
ピクセル単位のループを行い、その際に加工を施します。
とりあえず立体に見せるには意図的に両眼視差(つまりは差分だけ)を発生させれば良いので、
テクスチャと対応する元絵の座標から色成分(つまり便宜上の高さ)に比例した分だけ右にある座標の色情報を持ってきます。

そうすると、

n=01周目の左目画像
n=12周目の左目画像1周目の右目画像
n=23周目の左目画像2周目の右目画像
n=34周目の左目画像3周目の右目画像
n=44周目の右目画像

となり、破綻せずに一枚の絵に立体像を保存できます。
なぜ5分割が妥当(環境によって異なると思うけど)なのかは両眼の距離に関係してると思いますが、お詳しい方に説明を譲ります。

特集記事では簡単な3D図形を用意していましたが、今回は手っ取り早く
文字を浮き彫りにしてみようかと思います。しかも面倒なので無限遠か手前にあるかの二値です。白(255)なら3px右にあるドットを貰う。黒(0)ならそのままコピーという実装になっています。

何分初めてでしたのでオフスクリーン描画はprocessingだとどうやるの?とかハマりましたが、
結構簡単につくれました。

ファイルの構成としては、実際には若干異なりますが基本次のとおり、これだけです。

./index.htmlcanvas要素のあるhtml
./ragan.pjsランダムドット絵を描画する為のprocessing.js用ソース
./processingjs/processing.jsprocessingjsのライブラリ

肝心のprocessing部分のソースはこちらです。

このうち、

10
11
12
13
14
15
16
17
18
19
20
21
22
23
void setup(){
 
 	frameRate(20);
	size(g_width,g_height);
 
}
 
void draw() {
 
	if(g_old_msg != msg) {
		drawAll();
		g_old_msg = msg;
	}
}

についてはイベントハンドラとなっていて、フレームワーク側から呼び出されるメソッドです。
setup()で初期化をします。draw()はframeRateで指定された間隔毎に繰り返し呼び出されます。

draw()内でhtmlファイルに記載したjavascript側のmsg変数(INPUTタグと対応)の変化をチェックし、変更があればdrawAllを呼び出しています。
(このように通常のjavascriptの変数もprocessing.js側から参照できます。)

なお、drawAll()から更に関数を呼びだしており、
drawText()では元絵(黒地に白の文字列のイメージ)を作成し、
drawRandomDot()で前述の処理を行い、
drawMark()でドット以外の立体視の目安となるライン等描画しています。

出来上がったアプリはこちらです。(html手抜き感抜群なのをなんとかしたい。)
裸眼立体視はコツがいる、且つ、口笛のように説明が難しい?ので頑張ってください。

ウケを狙ってツィートボタンとかつけて見ましたが、そんなに公衆に耐えれる仕様では無い気がしています。あと申し訳ないですがIEは対象外です。IE9はいけるのかな?

このように拍子抜けするほど簡単な記述で立体視のアプリケーションができました。

ただ、processingの醍醐味としてはアニメーションにあると思いますので、
このような静止画であれば、サーバサイドで生成してクライアント側に画像を送りつける
というアプローチと見た目上変わりなくprocessing.jsの凄さはわかりにくい例だったかもしれません。しかしながら、サーバサイドにはhtmlファイルとjsファイル、及びprocessingの言語ファイルであるpjsファイルのみで、全てブラウザ単独で稼働している点が凄いです。
Flashも要りません。

次回、processing.jsを題材にする際は
アニメーションするコンテンツを扱ってみたいと思います。


11月
06

最も初期に印象にある音楽は?

っていうような質問を1週間くらい前の酒の席でされました。
そのときは、欧陽菲っではなくYMOとか答えた気がしますが、
よくよく考えるとバンゲリスの”南極物語”のような気がしてきました。
主旋律の核音とあのパツンと弾けるクラップ音に萌えた覚えがあります。
(お、テレビ見てないけど、図らずももしかしてタイムリーな話題?)
当時は小1か2くらいかな。

記憶があやふやなのでもしかしたら違うかもしれないが、
もっと遡るとYESの”こわれもの”辺りです。
保育園に通っているくらいの頃にデパートの婦人フロアでかかってて
かっこいいと思った。

そんな小さい頃からシンセサイザーの音が好きだった事にびっくり。
実は今はそんな好きじゃないんだけど(爆

という事で、その2曲を紹介。

ちなみに尊敬してやまないDavid Bowieの似たような質問の答えは次のとおりです。

What is your earliest musical memory? There was a piece of religious music that was always played on the radio on Sunday called “O for the Wings of a Dove.” I must have been about six. Not so far after that I heard “Inchworm,” by Danny Kaye. They are the first two pieces of music that made any impression on me. And they both have the same weight of sadness about them. For some reason I really empathized with that.
- Rolling Stone – 10th Sept 2003

”O for the Wings of a Dove”はメンデルスゾーンの曲です。
日曜(おそらく朝)のラジオから聴こえて来るなんて素敵です。
”Inchworm”は尺取虫を題材にしたイギリスの童謡(nursery rhyme)です。6歳くらいにこれらのちょっと憂いのある曲から影響を受けたと。

(私は小室哲哉が普通あまり筆頭には挙げないメンデルスゾーンを、好き、とか言っているのはこのエピソードを知っているからじゃないかと疑っている(笑))

11月
05

C++に予約語superがない理由

c++を参考(反面教師?)にして作られたJavaでは、
派生クラスの関数から継承元の基底クラスへの関数への参照を行う際superという予約語を使う。
例えば次のようなコード。

public class A  {
   public void handle(void){}
}
public class B extends A {
   public void handle(void){ super.handle(); }
}

c++を使っていると時々この便利な予約語がなぜなかったのだろう?とか考えてしまいます。
少し考えると、Javaでは多重継承が認められない一方で、それが可能なC++では
コンパイルエラーにせざるを得ない局面があることに気づきます。

struct A { virtual void handle(void); };
struct B { virtual void handle(void); };
struct C : A,B { void handle(void); };
 
void C::handle(void)
{
   A::handle();               //問題ない
   inherited::handle();   //CはAとBから派生しているため曖昧になるのでエラーとなる。
}

この為、予約語でないのだと私は勝手に解釈していました。
ただ多重継承を使わない限り有効な表記法なので、実際Visual C++には独自拡張として__superなる予約語があります。

ではなぜ標準にはないのか?

この理由が面白い。
C++標準化の際、極力無駄な予約語を増やさないという1つの指標がありました。
ただ、先に存在していた言語Smalltalkにはsuperなる同様の用途のものがあり実績もあった為、C++にも導入する動きがあったそうです。
その是非の際、一人の賢者が以下のような代替コードを提示した事により、最終的に導入が却下されたそうです。

class foreman : public employee {
   typedef employee inherited;
   void print();
};
 
class manager : public foreman {
   typedef foreman inherited;
   void print();
};
 
void manager::print()
{
   inherited::print();
}
この経緯は、C++の生みの親であるBjarne Stroustrup著の「C++の設計と進化」という本に書かれています。
私たちが見過ごしていたのは、ネステッドクラスをC++に導入した事によって、タイプ名のスコープと解決を、ほかの名前とまったく同様に制御する可能性が生まれていたことだ。
つまりわざわざ予約語を1個増やさなくてもtypedefのスコープを利用すれば同様な事が実現できるので不用であるという結論だったという事です。

この本には言語の誕生から標準化に至るまでの意見交換や本人の意志が垣間見えて面白いです。
Bjarne先生はとっても人間臭い感じがして、いい人っぽい印象ですw

11月
05

VST-Pluginをどうするか

最近すっかりメインのマシンがMacになってしまい、Cubaseも触らなくなってしましました。

一年前にWindowsで簡単なシンセをVST-Pluginとして作ってみて、それきりにしてしまっています。

これから音声処理関連のソフトウェアは仕事として受ける可能性もあるので、また開発を再開できたらな。

と思っています。

 

11月
05

スウェーデンの歌姫

この人、最近dnbで有名なPhotekのサイトをみて知りました。

ビョークっぽい雰囲気もありますが、もっとねちっこい&ビョークよりは大衆的な雰囲気です。

Karin Park – Tiger Dreams (Photek Remix)

結構一度聴くと忘れられない感じで。

オフィシャルサイト:http://www.karinpark.com/

 

Karin Park – Tiger Dreams (Photek Remix)

11月
04

Hello world!

はじめまして、rtanoteです。

若干今さら感のあるブログですが、クローズドなSNSではイマイチ世界が広がらないので、

技術ネタとか音楽ネタなど、

なんとなく気が向いたらこちらに垂流して行こうかなぁ、などと思っています。

» 新しい記事へ