投稿

波形を描く

再生中の音の波形を描画したい場合があるだろうね。オーディオデータの入出力を操作するMinimの中のクラスは全てAudioSourceクラスの派生クラスだ(ただしAudioSnippetは除く)。 AudioSourceクラスは3つのAudioBufferメンバを定義し、AudioSourceクラスを拡張したクラス群に継承される。AudioPlayerクラスはまさにそのようなクラスで、AudioPlayerオブジェクトによってこれらのバッファにアクセスすることができる。バッファはleft、right、mixという名前。 それぞれ左チャンネル、右チャンネル、そして左右のミックスを含んでいる。あなたが再生しているファイルがモノラルだとしても、3つの全てのバッファは取得できるし値も返ってくる。モノラルのファイルを再生してみると、単純に全てのバッファが同じ情報を持っているということがわかるだろう。では波形を描いてみよう。 前回 (メタデータを抽出する)のdraw関数をこのように再定義する: void draw() { background(0); stroke(255); // 線で隣の値をつなぐことで波形を描く // 値は-1から1の間にノーマライズ(均一化)されているのでそれぞれ値を50倍する // 拡大しなかったらただの線にしか見えないかも for(int i = 0; i { line(i, 50 + song.left.get(i)*50, i+1, 50 + song.left.get(i+1)*50); line(i, 150 + song.right.get(i)*50, i+1, 150 + song.right.get(i+1)*50); } } この描画コードはsongクラスがどんな種類の入力や出力でも機能する。何故なら全ての入出力はAudioSourceクラスを拡張していて、バッファを提供する形式になっているから。と言っても上のコードには2つ問題点がある。setup関数はデフォルトだと100×100になってしまうのと、僕らはバッファがどれだけ長いかを知らない(つまりsong.bufferSize()がどんな数を返すのかということ)。最初の問題の解決は簡単で、ウィンドウサイズを512×200にすればいいだけ...

メタデータを抽出する

メタデータとはファイルについての情報のこと。実際のコンテンツと対応するもの。AudioPlayerに読み込んだ後、ファイルのメタデータを取得できる。これやりたい理由のほとんどはID3タグの情報を表示だと思う。短い例を示す: import ddf.minim.*; Minim minim; AudioPlayer groove; AudioMetaData meta; void setup() { size(512, 256, P3D); minim = new Minim(this); // groove.mp3はスケッチのdataフォルダに入れておくこと groove = minim.loadFile("groove.mp3"); meta = groove.getMetaData(); // serif.vlwはスケッチのdataフォルダに入れておくこと。PDEのToolsメニューからCreate Font...で。 textFont( loadFont("serif.vlw") ); textMode(SCREEN); } int ys = 15; int yi = 15; void draw() { background(0); int y = ys; text("File Name: " + meta.fileName(), 5, y); text("Length (in milliseconds): " + meta.length(), 5, y+=yi); text("Title: " + meta.title(), 5, y+=yi); text("Author: " + meta.author(), 5, y+=yi); text("Album: " + meta.album(), 5, y+=yi); text("Date: " + meta.date(), 5, y+=yi); text("Comment: " + meta.comment(), 5, y+=yi); text(...

ファイルの再生

Minimを作ったひとつの大きな動機は、Processingで使える既存のライブラリでは、どっちもオーディオファイルをステレオでプレイバックできなかったこと。それMinimでできるよ!Minimだとファイル再生はめちゃめちゃ簡単。君のスケッチのデータフォルダ(訳注:processingで画像や音声などのデータを使用する場合、作業フォルダの中にdataという名前のフォルダを作って、その中にファイルを入れます)にファイルを入れて、このコードを書くだけ: import ddf.minim.*; Minim minim; AudioPlayer song; void setup() { size(100, 100); minim = new Minim(this); // this loads mysong.wav from the data folder song = minim.loadFile("mysong.wav"); song.play(); } void draw() { background(0); } void stop() { song.close(); minim.stop(); super.stop(); } Minimは典型的な非圧縮のファイルならWAV、AIFF、AUとかは全部再生できるし、javazoomのMP3SPIパッケージのおかげでmp3だって再生できる。

セットアップとシャットダウン

Minimを使うには、まずMinimオブジェクトをインスタンス化する必要がある。そしてそれを使うことで、君はオーディオファイルを読み込んだり、入力や出力を得ることができる。あとそれから、プログラムが終わる前に、Minimから取得する音声入出力クラスは全てcloseして、minimインスタンスをstopしておくようにね。Audio IOクラスにはAudioPlayer、AudioSample、AudioSnippet、AudioInputとAudioInputがある。これが今言ってることの例: Minim minim; AudioPlayer player; AudioInput input; void setup() { size(100, 100); minim = new Minim(this); player = minim.loadFile("song.mp3"); input = minim.getLineIn(); } void draw() { // ここに処理を書く } void stop() { // Minim.loadFile()から得たAudioPlayer player.close(); // Minim.getLineIn()から得たAudioInput input.close(); minim.stop(); // これはあなたが自身で定義してオーバーライドした // stopメソッドを呼ぶ // あなたのアプリケーションが通常通り全てをクリーンアップできるように // 呼ばれなければならない super.stop(); } Ess とSoniaのユーザはこの慣習に慣れてると思う。何でこんなことするかってのは全ての音声入出力はスレッドを分けて扱われていて、通常の手順で終わることが許されなければならないから。プログラムの実行中に、保持しているリソースを解放するためにオーディオクラスをcloseすることもあるかもね。

エラーメッセージ

すぐに気づくのは、コンパイラはシンタックスやスペリング、コンマやピリオドなどに非常に厳しいってことだ。全てのコンマ、ピリオド、大文字と小文字、そしてセミコロンは正確じゃなきゃいけない。もしどこかプログラムに正しくないことがあれば、エラーメッセージがデータウィンドウに表示される。エラーメッセージは解読しにくいこともある。でもひとつの情報がとても明確で、正確にどこがおかしいかを示してくれる。これが典型的なエラーメッセージ。 • ERROR: Parse error in file 'selected text' line 1 char 45 : {SinOsc.ar(LFNoise0.ar([10, 15], 400, 800), 0 0.3•)}.play ----------------------------------- • ERROR: Command line parse failed "Parse error"は「そのコードはわかんないよ」、という意味。エラーメッセージの3行目はファイルのどこでエラーが発生したかを教えてくれてる。この場合、1行目のchar(文字)45ってのを"•"で示してる。ここで解析が失敗した。しかしながら、問題を見つけるにはたいていの場合"•"の直前の文字や行を注意深く調べる必要がある。一番良くあるのは打ち間違い。 エラーメッセージの中の行と君の最初のパッチのオリジナルを比べてエラーを見つけられるかな。 コンマが抜けてるよね。エラーメッセージにめげてはいけない。普通のことだ。僕が下の実例を書いてるとき(12行程度だよ)、エラーを正すのに6回実行しなければならなった(6つエラーがあったのではなく、実行して、エラーを直して、また実行を6回)。僕はもっと注意深くなる必要があるんだけど、言いたいことは、ほとんどが打ち間違いだってこと。コードを実行してエラーを直すのはとても簡単で、大した失敗だとは思わない。コードのスペルチェックに使ってる感じ。

物理の知識

この実例では、電話のベルの物理的な性質について考えたい。僕らがベルの音や一般的な物理についての知識を使ってね。導入が長いんだけど、加算合成で僕らが何をしてるのか理解するってところに設定した。簡単に考えると3つのトピックがある。形、構造、そして励起だ。

電話のベル2

一般論 対 特定の原理 最後の実例は特定の知識、古い電話の話題における専門的な領域の知識が必要だった。何らかの方法で非現実的な音をデザインする際に、エンジニアリングの知識を必要とすることはもう一般常識だ。ある実例はモーグフィルタ、808ドラムマシン、テルミン、1970年代のハモンドオルガンなどを作る。ほとんどの音は、元々電気または電子だ。覚えておきたいのは、AY38610サウンドチップはシフトレジスタをノイズのソースに使うと、日本のヴィンテージビデオゲームのノイズを忠実に再現するのに非常に役立つかも知れない、とかそういうこと。ある種のプリンターが24ポールのステッパーモータを使っていることを知っていれば、ドットマトリクスプリンタの音を忠実に再現するのを助けてくれるかもしれない。V8エンジンと2ストロークのモーターサイクルエンジンは広大だけど、実世界での物理的なデザインに根付いている。何故2羽の鳥が異なった音を鳴らすのか、というのは生物学の知識が役に立つ質問。でもこれらのそれぞれが限られた知識を動かす。 ときどき僕らは異なる種類の知識、僕らが”第一原理"とでも呼ぶような、もっと広範囲にわたる種類の物理的と数学的推論を使うことが必要になる。"関係する音はたいてい似たような時間フレームで再生停止される"とか、"振動する膜は常に指数関数的に減衰する"というような報告は、サウンドデザイナーにとても役立つ広い知識を語りかける。これらのルールは合成の根本における数学の基本的な法則よりも少し基礎的でなく厳密さを欠き、常に真とは限らないが、それらをデザインに採用したり、何が機能するかを理解することで沢山のものを得ることができる。