ラベル sound の投稿を表示しています。 すべての投稿を表示
ラベル sound の投稿を表示しています。 すべての投稿を表示

水曜日, 9月 21, 2011

JavaScriptでSine Waveを鳴らす

連休中に色々と調べものしてて、dsp.jsというライブラリを見つけたので使ってみた。Chrome14でしか動作確認してない。Git覚えたくてgithubに上げたけど、これくらいならgistでよかったと思った。
SoundCheck

Audioletも面白そう。
最近node.jsも触ってみてるので、audiolib.jsも入れてみた。

node.jsはHomebrewからとかソースをビルドとか試してみたけど、nvm使って複数のバージョンを入れて動かすのが良さそう。

土曜日, 8月 14, 2010

YouTuBJ

結構前にYouTubeでミックスできるの作りました。
YouTuBJ
わかりにくいけど黄色いエリアの上に入力フォームがあるのでそこから検索するかIDを入れると読み込みます。

最大左と右で4つずつビデオが出てきて、それぞれ鳴らせるのが特長というか、既存のインターフェースにとらわれていないいいところです。使わないと思うけど。
地味にフルスクリーンにもできるようにしました。小さい状態での画質の切り替えにはこつが必要で、動画エリアと画質を選ぶボタンエリアのちょうど境界線あたりを狙います。使わないですよね。

あくまで自分用という感じで作っているので、サービス精神がありませんが、ざっくり何かを探して、すぐ再生できて簡単につなげればいいなという感じです。思いっきり探したい場合はタブでも切り替えてYouTube行って探してくればいいという考えです。

他にもいくつか作っている人がいて、考え方の違いみたいなのがわかると面白いと思いました。いいアイディアがあれば取り入れたいし。

Turntubelist
至れり尽くせりの完成度。このページで完結。プレイリスト書き出しができるのがいい。操作を覚える必要が少しある。

YouTubeMixer
Processing界でも有名なv3ga先生いつのまに。SearchでYouTubeページをiframeで読み込む形になってるけど、ここからID取ってくるのは困難。埋め込みプレーヤーのバージョンも古いしYouTubeリニューアル前に作ってたのかな。シンプルで綺麗。

youtube console
DJ Delicious a.k.a. 萩原くんのやつ。さすがわかってる感じ。Changeで検索結果を掘っていける。操作画面みてても楽しいんじゃないかな。

TWOYOUTUBEVIDEOSANDAMOTHERFUCKINGCROSSFADER.COM
元々これに触発されて作った。partyで背景画像が切り替わる。RECはスクリーンキャプチャの方法が書いてるWikipediaへのリンク。世界はもっとこういう風になるべきだと思う。

長らくインターフェースとかオーディオビジュアルに興味を持っているのですが、音を解析して映像にするとかだけじゃなくて、操作(演奏)しているところ自体が、視覚的に楽しめる要素になってるといいなと思います。

水曜日, 6月 16, 2010

Dropophone


縁あってLullatoneと一緒にiPhoneアプリを作りました。
Raindrop Melody MakerのiPhone版という感じですね。音数を減らして選び直したり、マルチタッチができたり、色々と調整はしてあります。iTunesにリンクして音源が買えたり!

こういう感じでミュージシャンのアイディアを実現するシステムやソフトウェアを作る、ということをずっとやりたかったのですが、ようやく一つ目標を達成した感じです。今後の動向も楽しみにしていて下さい。

アプリのダウンロードはこちらから。
Dropophone for iPhone, iPod touch, and iPad on the iTunes App Store

LullatoneのDropophone紹介ページ。
Dropophone iPhone App « Lullatone

木曜日, 9月 03, 2009

openFrameworksでSndObjを使う

Programming Interactivityに載ってた。著者のJoshua NobleさんがofxSndObjを作ってるのですね。

前回ofxMSAPhysicsでものすごく面倒なやり方をしてましたが、これは僕がXcodeの使い方をわかってなかった。
XcodeのProjectメニューからAdd to Project...して追加したいaddonのsrcフォルダとlibフォルダを選べばいいだけのことでした。それでXcodeの画面で追加したsrcとlibsをaddonsというグループにまとめておくという流れ。XcodeのGroups & Filesは実際のフォルダ構成とは別物。合わせておくとわかりやすい場合もあるというだけ。

僕のopenFrameworks関係のフォルダ構成は
+of
-addons_contributed
+of_preRelease_v0.06_xcode_FAT
-addons
+apps
-addonsExamples
-examples
-sketch
-libs
-other
-samples

という風にしていて、標準で入っているaddonとそうでないものを分けています。ofxSndObjはaddons_contributedに入れてる。samplesはネットとかで拾ってきたコードを入れておくフォルダ。

以上を踏まえて新しいemptyExampleをsketch以下にコピーして名前を変えた後、ofxSndObjのsrcとlibsを追加し、testApp.hとtestApp.cppを以下のようにすればお約束の440Hzのサイン波が鳴るはず。

testApp.h
#ifndef _TEST_APP
#define _TEST_APP


#include "ofMain.h"
#include "ofxSndObj.h"
#include "AudioDefs.h"

class testApp : public ofBaseApp{

public:
void setup();
ofxSOTable t;
ofxSOOscillator o;
ofxSndObj sndobj;
};

#endif

testApp.cpp
#include "testApp.h"

void testApp::setup(){
sndobj.startOut(true, 1);
t.init(sndobj, 2500l, SINE, 1.f);
o.init(sndobj, t, 440.f, 10000.f);
sndobj.setOutput(o, OFXSNDOBJOSCILLATOR, 1);
sndobj.startProcessing();
}

火曜日, 8月 11, 2009

Processing IDEからEcho Nest APIを使う

Echo NestのJavaクライアントが出ていたのでProcessingで動かしてみた。
Echo Nestが何なのかよくわかってないけど、とりあえずネットと音という大好きな要素が混ざっている。
曲やレビュー、記事のリコメンドからテンポ、ビート等の音響解析にも使えるらしい。

まずはdeveloper用のサイトでEcho NestのAPI Accountを取得してAPI Keyを発行してもらう。
サイトも綺麗だしブラウザから実行例を見られるので勉強しやすい。APIキーとか入れといてくれてる。

Echo NestのJava APIをダウンロードする。

Javaのライブラリなので、OSXの場合"ユーザ名/Library/Java/Extensions"以下にEchoNestAPI.jarを置いて.bash_profileにCLASSPATHを書くのでもいいけど、Documents/Processing/librariesの中にEchoNestAPIというフォルダを作り、さらにlibraryフォルダを作って、その中にEchoNestAPI.jarを入れても動く。ProcessingのIDEから簡単にimportできる。

JavaのサンプルそのままだとProcessingのIDEの場合for文のところでエラーになってしまうので書き換えた。
import com.echonest.api.v3.artist.Artist;
import com.echonest.api.v3.artist.ArtistAPI;
import com.echonest.api.v3.artist.Audio;
import com.echonest.api.v3.EchoNestException;
import com.echonest.api.v3.artist.Scored;
import java.util.List;

String API_KEY = "自分のAPI KEY";
String ARTISTNAME = "weezer";

ArtistAPI artistAPI;

try {
artistAPI = new ArtistAPI(API_KEY);
List<Artist> artists = artistAPI.searchArtist(ARTISTNAME, false);
if(artists.size()>0) {
for(int i=0; i<artists.size(); i++) {
Artist artist = artists.get(i);
List<Scored<Artist>> similars = artistAPI.getSimilarArtists(artists, 0, 10);
println(" === Similar artists for " + artist.getName() + " ===");
for(int j=0;j<similars.size(); j++) {
Scored<Artist> simArtist = similars.get(j);
println(simArtist.getItem());
}
}
}
}
catch(EchoNestException e) {
System.err.println("Trouble: " + e);
}


実行結果

=== Similar artists for Weezer ===
The Smashing Pumpkins
Ozma
Biffy Clyro
The Breeders
Rivers Cuomo
Nerf Herder
Jimmy Eat World
Foo Fighters
Veruca Salt
The Flaming Lips
=== Similar artists for Weezer Tribute ===
The Smashing Pumpkins
Ozma
Biffy Clyro
The Breeders
Rivers Cuomo
Nerf Herder
Jimmy Eat World
Foo Fighters
Veruca Salt
The Flaming Lips
=== Similar artists for Matt Sharp (of Weezer, The Rentals) ===
The Smashing Pumpkins
Ozma
Biffy Clyro
The Breeders
Rivers Cuomo
Nerf Herder
Jimmy Eat World
Foo Fighters
Veruca Salt
The Flaming Lips



開発者の人のデモがここにある。eclipseで開発してる。

*2009年11月11日追記
EchoNestAPIを使用する場合はJavaのバージョンを1.6にする必要があります。
Applications/Utilities/Java Preferencesを起動して、GeneralタブのJava ApplicationsのJava SE 6を一番上にする。

で、いつの間にかechonestp5というものができてた。

土曜日, 2月 07, 2009

mousine

前にjavaでこんなの書いた気がするけど、actionscriptでマウスの動きに合わせて
周波数と振幅変えるコードをwonderflに書いた。
mousine

普通にマウス位置を取得して周波数や音量に入れると波形が急激に変化してブツブツノイズが入ってしまうので、アニメーションを滑らかに動かすのと同じ要領で、波形を書き込む前にfreqとampの値を滑らかに変化させている。onEnterFrame()はsampleData()が実行された後で実行されるので、2048サンプル分ごとにマウスから値を取得し、新しい周波数と音量を設定していることになる。8192サンプルだと反応が遅いと感じる。この辺りは悩ましいところ。
Adobe - デベロッパーセンター : Flash Player 10で広がるFlashの音の世界
SampleDataEvent - ActionScript 3.0 言語およびコンポーネントリファレンス

滑らかな数値の変化のさせ方は結構面白くて、アニメーションで使われている手法を音にも適用してみたい。
CBCNET - 土日 Flash のススメ(4):動きをつけるということ(イージングについて考える)

日曜日, 1月 25, 2009

toxi audio!!!

以前フォルダだけはあるなーと思ってたtoxiのaudioutils、できてた。
toxiclibs - Google Code

JOALがバンドルされてて3次元音響が鳴らせる。
サンプル動かしてみ。
geomutilsとprefutilsも必要なので一緒にdownloadしてLibrariesフォルダに入れとく。

toxi rocks!

日曜日, 11月 02, 2008

non-formatize

六本木のTSUTAYAでお洒落なデザイン本などを眺めていたら発見したnon-formatの作品集。
これの左上。
で大体やりたいことはわかると思うけど、やってみました。

輝度が低い、暗いとこは振幅を大きくして、線が重なることで濃くしてある。だけ。
オリジナルに近づけるにはもうちょっと詰める必要あるな。元画像の作り方にも左右されると思うけど。

モナリザの画像探してる時に見つけたこんなんもある。錯視とかもっと勉強したい。

トラック毎に切り分けて音で聴けるようにしたいところだけど、それはまたいずれ。
最新版(0154)だとminim音鳴らないし。
Processing 1.0 (BETA) - Minim problem... I can't hear ANYTHING

flashでもできるな。BitmapDataクラスでgetPixel()して、値をSampleDataEventに渡す感じだろうか(地味に昨日flashでsine wave鳴らすの直した)。ファイル書き出しもできるからwaveファイルとかも作れるし(miztにソースいただきました)。

ビジュアルからインスパイアされて誰にでも説明できる方法で音作りに持っていけるようになったのはよかったよね。

scriptographerでやりたい。

PImage img;
int x = 0;
int y = 0;
int imgW;
int imgH;
float val;
float amp;

background(255);
colorMode(HSB, 255);
img = loadImage("lisa.jpg");
imgW = img.width;
imgH = img.height;
size(imgW*2, imgH);
image(img, 0, 0);

loadPixels();
for(y = 0; y < imgH; y++) {
for(x = 0; x < imgW; x+=5) {
val = brightness(pixels[y*imgW*2+x]);
amp = (255-val)*0.05;
stroke(100, amp+100);
line(imgW+x-amp, y, imgW+x+amp, y);
}
}
saveFrame("nonformatize.jpg");

日曜日, 5月 25, 2008

adobe made some noise

BIT-101のコード試してもSamplesCallbackEventがどこにあるのかわからず発狂しかけた。
Astro Dynamic Sound! » BIT-101 Blog
Joa Ebertがフルコードをzipでくれ!てるからそれ参考にした。
Simple Astro synthesizer at blog.je2050.de - Blog of Joa Ebert

最新のsdkをダウンロードしてパスを通す。
Download Flex 3 - Flex SDK - Confluence

flex-config.xmlも書き換えておくこと。
Targeting Flash Player 10 Beta with Flex SDK 3.0.x
osxのスタンドアローンのflash playerはないのかな。
コンパイルしたらとりあえずブラウザにdrag & dropしてる。

SDKの中にruntime/playerフォルダがあって、各OS毎のflash playerインストーラーがある。

そのうち環境構築も含めてまとまった記事を書く。

(11/1)書き直しました。不要なimportをなくして、akihiro kamijo: Flash Player 10 の動的サウンド生成機能 (Sound クラス)を参考にサンプル数を増やした。
さて、イベントハンドラ内では 2048 以上 8192 以下のサンプルデータを書き込みます。パフォーマンス上はできるだけ多くのサンプルデータを (つまり 8192 個) 書くのが有利と考えられます。


package {
import flash.display.Sprite;
import flash.media.Sound;
import flash.events.Event;
import flash.events.SampleDataEvent;

public class SoundTest extends Sprite{
private var sound:Sound;
private var freq:Number = 440;
private var rate:Number = 44100;
private var phase:Number = 0;

public function SoundTest() {
init();
}

private function init():void {
sound = new Sound();
sound.addEventListener(SampleDataEvent.SAMPLE_DATA, sineWaveGenerator);
sound.play();
}

private function sineWaveGenerator(event:SampleDataEvent):void {
for(var i:int = 0; i < 8192; i++) {
phase += freq / rate;
var phaseAngle:Number = phase * Math.PI * 2;
var sample:Number = Math.sin(phaseAngle)*0.25;
event.data.writeFloat(sample);
event.data.writeFloat(sample);
}
}
}
}

木曜日, 3月 06, 2008

sonicode by st44100

sound file

s o n i c o d e
s o n i c o d e
s o n i c o d e
s o n i c o d e
s o n i c o d e
s o n i c o d e
電子音楽
電子 楽
 子音 
電子音楽
電 音楽
 子音 
電子fdさfdさfdさ 楽
 子 楽
電子音楽
電子音楽

電子音楽
電子音楽

電子音楽
電子音楽

S
S O
SON
SONI
CODE
ODE
DE
E
C /
O /
D /
E /
C C
O O
D D
E E

S
S O/
SON/
SONI/
CODE/
ODE/
DE/
E/

S O N I C O D E

S O N I C O D E

S O N I C O D E

S O N I C O D E

S O N I C O D E
SONIC♪
CODE ♬
SONIC♪♪
CODE ♬ ♬
SONIC♪♪/
CODE ♬ ♬ /
S O N I C O D E /
S O N I C O D E / /
S O N I C O D E / / /
S O N I C O D E / / / /
S O N I C O D E / / / / /
S O N I C O D E / / / / / /
S O N I C O D E / / / / / / /

㍿ ㍿ ㍿ ㍿
㍿ ㍿ ㍿ ㍿
㍿ ㍿ ㍿ ㍿
㍿ ㍿ ㍿ ㍿
㍿ ㍿ ㍿ ㍿
㍿ ㍿ ㍿ ㍿
㍿ ㍿ ㍿ ㍿
㍿ ㍿ ㍿ ㍿
㍿ ㍿ ㍿ ㍿
㍿ ㍿ ㍿ ㍿
㍿ ㍿ ㍿ ㍿
㍿ ㍿ ㍿ ㍿

㈱ ㌕
㈱ ㌕ ㌖
へへへへへへへへへへへへへ
へへ へへ へへ へへ
 へ  へ  へ  へ

wwwwwwwwwwwww
wwwwwwwwwwwww
wwwwwwwwwwwww
IAMAS
IAMAS
IAMAS
IAMAS
IAMAS
IAMAS
I
I
I
I
I
A
A
A
A
M
M
M
M
A
A
A
A
M
M
M
M
A
A
A
A
M
M
M
M
S
S
S
S
S












2008
   8
  08
 008
2008
   8
  08
 008
2008

木曜日, 11月 22, 2007

AudioIn with MacBook built-in-microphone

MacBook Proに移行して、SuperCollider3も3.1にして、processingと連携させて遊んだりしたんだけど、
ある時マイクを使おうとしたら入力ができなかった。
解決法をwebで発見したので記録しておく。

アプリケーション>ユーティリティ>Audio MIDI設定を起動して、メニューから機器セットエディタを開く
+ボタンで機器セット追加。名前をsupercolliderとでもつけておく
内蔵マイク、内蔵出力にチェックして、完了
デフォルトの入力と出力をsupercolliderにしておく

で、SC3起動(既に起動してる場合は再起動)。
Serverをbootするとこんなメッセージが出るはず。
Number of Devices: 4
0 : "Built-in Microphone"
1 : "Built-in Input"
2 : "Built-in notification is on


"supercollider" Input Device
Streams: 1
0 channels 2

"supercollider" Output Device
Streams: 1
0 channels 2

新規ファイルを開いて、

{Out.ar(0,AudioIn.ar(1))}.play;

で無事左チャンネルから音が聞こえて録音もできましたとさ。

木曜日, 10月 18, 2007

build sndobj app

ありがとうございます!
Xヶ所村: すでにsndobjをインストールしていて、てっとりばやく自分アプリを作りたい場合。

sconsはmakeみたいなもので、ソースから実行可能ファイルを生成するのに使うコマンド。SConstructファイルがmakefileにあたる。

sconsの解説
sh1.2 pyblosxom : SConsについてちょっと調べてみた。Part.1

makeの解説
Make と Makefile の説明
MAKEの第一歩(入門)

miujunさんがおっしゃる通り、既にSndObjフォルダのsrcフォルダ内にexamplesというフォルダがあり、ソースファイルが置かれている。srcフォルダと同じ階層にはbinフォルダがあって、実行可能なファイルがいくつかできている。試しにsinusというのを実行する。

d242204:~/SndObj/bin hysysk$ ./sinus

とエラーが出る。

./sinus infile.wav outfile.wav timestr pitch thresh intracks outracks

このエラーとソースを読めば、実行ファイルに加えて引数を7つ指定する必要があることがわかる。サウンドファイルを読み込んで、タイムストレッチとかピッチチェンジするのかな。その時に綺麗に補完するアルゴリズムって感じ?

色々試す。

miujunさんのここのソースをビルドしてみる。
Xヶ所村: CygwinでSndObjなど

インクルード部分を

#include <SndObj/AudioDefs.h>

に書き直す(blogに貼る際にhtmlが書き換えられてる?)。あと、30秒は長い気がするので

int dur = 5;

にした。

で、example以下にsin.cppとか名前つけて保存。

次、Sconstructファイルの編集。

493行目の

# realtime IO examples
if rtio:

以下に他の既にあるexampleと同じような形式で書く。その上480行目で定義されてるBuildExampleメソッドに渡す処理を書けばいいのかな。何となくやってることは分かる。

sin = BuildExample('./bin/sin', './obj/sin.o', 'src/examples/sin.cpp')
Depends(sin, deplibs)

Sconstructファイルはpythonスクリプトなので、インデントなどちゃんと合わせておくこと。

terminalで/SndObjに移動して、sconsコマンド実行。こんな感じ。

d246112:~/SndObj hysysk$ scons
scons: Reading SConscript files ...
Building the Sound Object Library
Checking for Realtime IO support...
OS is MacOSX
Checking for C header file jack/jack.h... (cached) no
Host is little endian
swig doesn't exist
Python version is 2.3
Checking for C header file m_pd.h... (cached) no
Checking for C header file ladspa.h... (cached) yes
scons: done reading SConscript files.
scons: Building targets ...
g++ -o obj/sin.o -c -O3 -DMACOSX -Iinclude -Iinclude/rfftw -I/system/library/Frameworks/CoreAudio.framework/Headers src/examples/sin.cpp
g++ -o bin/sin -framework coreaudio obj/sin.o -Llib -lsndobj
scons: done building targets.

確かにgccでコンパイルする時のオプションはここからわかりそう。makeもsconsもコンパイルの詳しい仕組みもよくわかってないのでまだうまくいってないけど。要勉強。とりあえずはこれで。

ワークショップ形式で適宜説明受けながらのこういう授業があれば。。。てかIAMASの場合は直接先生のとこに行って聞くのが主体なんだから、もっと積極的になれよ僕、という話なんだけど。

miujunさん本当にありがとうございます!

木曜日, 10月 11, 2007

sonic typeface interactive


processingでは、例えばPImage型の変数imgを作って、
img = get();
とすればスクリーンをキャプチャできるので、テキスト入力しながら音を出すことは簡単にできた。
画像はHello worからHello worlになるところ。波形エディタでこれくらいにまで拡大して、再生するとアニメーションみたいなものにもなる。再生ポイントに合わせて動いてくれないと駄目だけど。
hello world.wav

波形エディタはaudacityってソフト使ってます。
フォント変えると音も違う。Helvetica Neue UltraLightとか音も細いよ。

最初気づかなかったけど、波形エディタでみると音の始めにずっと1.0が入ってた(ヘッドフォンしてるとバツッときてあと無音で圧迫感)。なんだろうと思ってたんだけど、setup()メソッドの中でbackgroundを明示的に初期化してなかったせいで、デフォルトの値がマッピングされちゃってた。processingのwindowを目で見ただけではわかんなかったけど、耳ではバツッてのがわかって、波形エディタで確認するとよくわかるのが面白い。

スポイルされちゃう部分もあるから絶対最強最高って訳じゃないし、方向性もぶれちゃったりするけど、とにかくものができると色々発見もあるし考えられる。

applet

テキストエディタ感覚で文字打てる。文字数多いとピッチも上がる。deleteで消せる。領域内をクリックしないと動かないかも。アルファベットのみ。

月曜日, 10月 08, 2007

sonic typeface src



minimで任意の波形テーブルを作るのはすごく簡単で、AudioSignalインターフェースを実装すればいい。exampleにあるので、参考に。

generate()メソッドに渡されるsamp[]の中に-1から1の値を突っ込む。
512サンプルの波形テーブルにするため、512ピクセルの画像を用意して、上から下、左から右にスキャン。

解説というか、自分でちゃんとわかってるか確認のためメモ(下のリンク先にあるソース参照)。
まずピクセル全てに番号を振る。

色が閾値以下の値を持っている場合(元画像を黒で作ってあるので、適当に赤成分が50以下、としました)、その番号。それ以外は0にして、sndArrayに入れる。

sndArrayの中で最大値と最小値を出す。最小値は0が最初に0でない数値を受け取ったときの値になるはず。boolean型の変数startで判別。

0の数はoffsetという変数に入れて最終的に振幅をそんだけ分持ち上げる。

次のif文でまずsndArray内に0でない値が入っているか(描画すべきピクセルがあるか)を判別し、
x%2==1が真のときに下のエッジ(highとlowの差+offset)、偽のときに上のエッジ(offset)をプロット。
(10/10訂正:上下が逆だったので直しました。)

あとはmap関数に任せれば、0から1の間で適当に補完してくれる。lowを1に、highを0にすることで、元画像と書き出された波形を一致させることができた。

タイポグラフィの専門用語で言うところのカウンター(counter)、文字の中の閉じられて中空になっている部分とか、入り組んだ部分、つまりhighとlowの間に0が入ってるところは潰されてしまう。描画の密度に差を持たせれば擬似的に空間を見せることは可能かもしれない。miujunさんのは多分そういう感じ。

今のところ画像読み込んでるだけだけど、テキスト編集する感じで音に直結できればいいなと。カーニングとか、長体とか、フォントを変えることによって音が変化する。それでプログラミングができて、さらにその音の解析からまたコードが生成されて、フィードバックする。

sourceの方はprocessingで実行してクリックすると画像と音を書き出します。色々試してみて下さい。minimライブラリが必要です。
applet
source(zip file)

土曜日, 10月 06, 2007

sonic typeface

先日衝撃を受けたオシロスコープに猫及びポルノ画像。

これはtex/tspの音響生成エンジンに使えるのではと思い試してみた。とりあえず文字の画像データを用意して、そいつを2値化して振幅に変換。とりあえず読めるレベルにはなってるのではないだろうか。詳しい解説はまた後で公開します。このアルゴリズムは多分最終成果物にはしない感じなので...。
Helvetica Neue 75 Boldを240ptで使用。



オシロスコープで出したいなー。

元画像。コード書き換えて反転なしでできるようにしよう。



processingではこんな画像ができる。



音はこんな感じ。ご家庭の波形エディタなどで読めるかどうか試してみて下さい。
ktkr.wav

月曜日, 8月 20, 2007

pink noise

最近全く音沙汰無しとなってるopenframeworksを動かしてみる。
色々面倒なことを先に設定しといてくれてて、Xcodeなど統合開発環境の使い方も慣れていないためフルスクラッチで書く時どうするのか全くノーアイディアなんだけど、サンプルからソースを読んで何かしら勉強するのと、使うとこだけに減らして何かやってみようと思った。

audioOutputExampleてフォルダのプロジェクトを使います。
サイン波とホワイトノイズを生成するサンプルで、これのソースを読めばサイン波の作り方とホワイトノイズの作り方はわかる。

lAudio = new float[256];
rAudio = new float[256];

ってfloat型の配列を256個作って、audioRequested関数内のfor文で全てに値を入力してる。
サンプルではboolean型の変数bNoiseがtrueならホワイトノイズ、falseならサイン波という感じで指定されているが、式の形は同じ。右辺をsample * volume * leftScale;とすればサイン波(すぐ上のところでphaseの値を変えつつsin()関数で値を取得しsampleに入れている)で、ofRandomf() * volume * leftScale;とすればホワイトノイズが鳴る。単にofRandomf()関数で乱数を作ってるだけ。

で、今回はofRandomf()でなく、自分で関数を用意して、ピンクノイズを作ってみようと。

lAudio[i] = output[i*nChannels] = pinkNoise() * volume * leftScale;
rAudio[i] = output[i*nChannels + 1] = pinkNoise() * volume * rightScale;

こんな感じでofRandomf()のように呼び出したら値を返してくれる関数を作ればいい。が、そんなものを僕が自分で作り出せる訳もないので、googleでアルゴリズムを探す。こんなん見つける。

pubs on one-over-f (1/f) noise

pink noiseが1/fの揺らぎでなんとかかんとかで作業に集中できるとかいう話は聞いていたが、色々変なノイズを研究してる人達がいる。

そっからここに飛ぶ。

DSP Generation of Pink Noise

SuperColliderの開発者であるJames McCartneyも何やらやってますね。
The Voss algorithmてやつを使ってopenframeworksでピンクノイズを鳴らす。ホワイトノイズをソースにして低いオクターヴの連続を作っていく(?)手法。

C++のクラスとかその辺のことがまだわかっておらず、processing感覚でこのままクラスを作ってインスタンス作ってpn.pinkNoise()って感じで値をとろうとしたら、errorになった。値を生成するだけのコードから移植した際に何か見落としてるのかもしれない。

という訳で、特にクラスは作らずGetNextValue()関数をpinkNoise()関数として値を返してくれるような設計にする。PinkNumberクラス内のprivate変数をopenframeworksのプロジェクト内のtestApp.hのtestAppクラスにコピー&ペースト。コンストラクタの中身はtestApp.cppのsetup()関数の中に。

で、int GetNextValue()関数を一番下にでもコピー&ペーストしてpinkNoise()って名前にしてofRandomf()をpinkNoise()にすればいけるかな。あといらないとこ消して、いるとこ残して。pinkNoise()関数はそのままだと0〜128で数値が帰ってくるので0.05fをかけてます。これは単に、音がいい感じだからってだけ。testApp.hにint pinkNoise()を宣言しておくこと。

で、ビルドしたもの(build>Release>openFrameworks)とソースをzipで圧縮してここに置きました。キーボードの+と-で音量変えられます。

noise.zip


何かインタラクション仕込みたかったらmouseMoved()関数などに書けばいいかな。ドキュメントなど参照しつつ。
openFrameworks: documentation

ビルドしたものとソースは音に関係するとこをint型からfloat型にしてあります。グラフィックもつけてるから試せばわかるし当たり前だと思いますが、縦軸の解像度が上がって音が綺麗です。int型だと小さくブツブツ鳴ってる音がある。

オーディオマニア的な世界は足を踏み入れると電源が...とか水晶が...とかこの機械で地球の磁場の歪みを補正して...みたいな世界であれですが、プログラムソースの部分でも色々言ってる人いそう...もっと深い部分でだろうけど。

「ノイズの中にクリスマスソングが聴こえるんだけど聴こえる?」とか言って単なるホワイトノイズを聴かせるとほとんどの人が「聴こえる」って答えるらしい。人間はノイズの中から何らかのパターンを見いだしてしまうとか何とか。そういう傾向が強い人は何かと何かを組み合わせたり、思いもよらぬ新しい使い道を発見したりする水平思考に向いてるんだって。ピンクノイズを聴いてると作業が捗るってのはそういう意味でもあるのかも。

細かい話は今後また勉強するとして、とりあえず何かしらのアルゴリズムを使ってopenframeworksでピンクノイズ(本当にそうなのか不安になってきたけど、音的にはそれっぽい)が鳴ってよかったなと。

これを元に次はminimのPinkNoiseクラス作る。

あと、色々な色のノイズ。
Colors of noise - Wikipedia, the free encyclopedia

日曜日, 8月 19, 2007

20070818

バイト先のwebができつつある。真のweb標準野郎からしたら大量失血しそうな感じかもしれないけど...。帰りにプリンもらった。いつもおいしい差し入れをいただけるので嬉しい。社食をちゃんと食べてればそこそこ野菜も採れるし。生活リズムを改善するにはちょうどよかったと思う。25分の自転車通勤もいい運動。今日は帰り道ハックがうまくいって、静かで安全な道を発見できた。ipodの音量を無駄に上げ過ぎることなく、しかも歌いたくなったら歌える。

学校着くと春成さんのDVDが置いてある。東京展の前にコンペとか色々諸々あれしてるらしく曲を調整する時間がなくてどーんと提供しただけになってしまったけど、今後また何かできるといいな。

早速観ようと思ったんだけど僕のマシンは壊れててDVDを読み込めないので、共有のmac miniで鑑賞しようと思ったらこんなことになってた。

マウスを動かすとこのでっかい白い四角(しかも半透明)が動く。誰かの作品かと思ったけど、何かmac本体はあれな音してるし、再起動してもまたこれがでちゃうので、一通り撮影したら仕方なく別のマシンで観ることに。

で、観た!音とアニメは付かず離れずの感じで、逆に色々しなくて良かった気もする。絵がかわいいんだー。東京展(通称いまからだもんで展)行く人は観て下さい。

ちょっと前にcollect.applyのwebがリニューアルしてる。サーバエラー出たときとか、かっこいいんだ!しかも

"Do we have to tell you not to take or use anything without asking first?
We’re reasonable people and more than likely to help and share if we can."

「事前の承諾もなしにコンテンツを持ってったり使ったりするなって僕らは君に言わなきゃなんないの?
僕らは理解ある人間だし、それよりもっと役に立ったり分け合ったり、できることならしたいと思ってるよ。」

ってね。やるー。webページ自体もナンバリングされてるし。

例えば山形浩生さんとか、hippocamp(久々に見たらv3.0になってた)とか、すげーと思うのは、売られてるものより質が高いんじゃないかっていうものを無料で配ること。単にお金節約できて嬉しいってんじゃなくて、お金で計れない価値を突きつけられてる気がする。何か、いいものを見たり、いい体験をする。それに対して、お金を払う。それはそれで良い。けど、そこでお金別にいらないよって言われた時に、どうすればいいんだって思う。

レーベルオーナーでもあるblue sky researchのSommerbokkenはオールタイムベスト。本人は消したがってるみたいだけど...。
Sommerbokken

bsrの他のお気に入り集。昔processingでsonia使って音響解析した映像作品とかもいち早く作ってたな。どうやって生活してるんだろ...。
Greenish Yellow
Northern Rainy City
Happy Samantha Live Version

さすがに時代を感じる音ではあるけど、僕は未だにほわーんて感じのシンセ、ビート、ちょっとボイスサンプルってのに弱いみたいです。Happy Samantha Live Versionはアルス行った時に調子乗ってバーで人生で初めてDJ(itunesのプレイリストかけただけ)した時にかけて盛り上がった。daito君がめっちゃ酔ってHow deep is donau? How deep is my love?とかいうラブレター書いた可愛い店員さんが踊ってたのを思い出す(確かにすげー可愛かった!)。

木曜日, 8月 09, 2007

ess vs minim

processingで音を扱うライブラリのessminimのどっちがどっちだって話。徹底比較した訳ではないので、自分が使った範囲で覚えておこうと思うところのメモです。

ess
メリット
FFTを使う場合、damp()メソッドで値を滑らかにできたりして、ビジュアライゼーションには便利。
envelopeクラスがあるので、オシレータを組み合わせて音を作っていくのには向いてるかも。フィルターなどエフェクトもminimよりかは充実してる。

デメリット
サウンドファイルを読み込む場合、モノラルでしか扱えない。
mp3ファイルを読み込みたい場合は下記のファイルが必要。
tritonus_share.jar
mp3spi1.9.2.jar
jl1.0.jar
スケッチのあるフォルダにcodeというフォルダを作って入れておく。

長いサウンドファイルを読み込む場合はAudioStreamクラスを使う。その際

void audioStreamWrite(AudioStream theStream) {
// read the next chunk
int samplesRead=myFile.read(myStream);
}

というようなメソッドを作ってFileクラスから読み込んだ音をチャンクに入れていく(theStreamという仮引数は何をしてるんだろう...)。

minim
メリット
サウンドファイルが使いやすい。mp3ファイルが外部ファイルなしでそのまま使える。AudioSnippetクラス、AudioSampleクラス、AudioPlayerクラスなど用途に合わせていくつかクラスが存在する。AudioPlayerクラスはステレオでファイルが扱えてleftやrightというフィールド変数を持っているので、FFTなどで左右の値を取得できる。

BeatDetectクラスもあったりして解析系は便利(精度は怪しいかも知れない)。

デメリット
envelopeなどがなく、複雑な音の加工には向いてないかも。envelope、自分で用意するのだろうか(pythonだけど、ここのSound11 Kick drumみたいに)...。

僕の場合、現状ではできることとかやりやすさに合わせて使うライブラリを変えてます。まだまだどちらも発展途上。

興味があるのは、相変わらず自分で波形を定義する方法。
ess
Processing 1.0 (BETA) - Functional example of ESS Generative Audio

minim
exampleにUserDefinedSignalってのがあります。UserDefinedEffectってのもある。面白そう。

知らなかったけど、processing公式サイトにライブラリのサンプルコードがありますね。ライブラリの配布元とは違う内容で、参考になります。今日記事書いて良かった!
Learning \ Processing 1.0 (BETA)

金曜日, 8月 03, 2007

iamas openhouse 2007

明日からopenhouseです。所属スタジオの有志展とプロジェクトの展示をします。
どちらもプロトタイプの展示となりますが、考えてることや、普段の生活などの話はできると思うので、興味のある方は是非。5日(日)はアルバイトのため夕方18時頃に顔出すと思います。遠路はるばる来て下さる方もいらっしゃるようなので、できる限りもてなしたいです。

展示作品tex/tspから1曲。画像から文字に変換して、さらに音に変換。狙い通り音の重なりからテクスチャが生まれてリズムが自然発生してる。javaのheap errorが出る時の音が最高にかっこいいんだけど、録音できない。ラインから出せばいいんだけど、何か邪道な気がするので。

mp3にしたら多分音がクリップしてるせいか変わっちゃうのでそのままwavで。
redsensation.wav (audio/x-wav Object)

あと、プロジェクトの展示の方はgainerからの入力をmax/mspでとってoscでprocessingに渡してさらにapplescriptでitunes制御するとかいう力技を使ってます。また後日まとめる予定。

金曜日, 7月 27, 2007

brainf*cksp

bfsp

brainf*ckをp5に移し替えて、tex/tspと混ぜ合わせてちょっと改変。現在オシレータのみ実装。ロジックの部分はbrainf*ckそのまま。while文にあたる[]を()に変えた。+-でポインタ内の数値を上げ下げして、オシレータにはその数値を渡す。ここが迷ってるなぁって感じ。[]でループを作る場合は強制的に矩形波を鳴らしてしまう、という設計にしてもいい気がする。

書き方は
> ポインタを1進める
< ポインタを1戻す
+ ポインタの指す要素の値を1増やす(インクリメント)
- ポインタの指す要素の値を1減らす(デクリメント)
. ポインタの指す要素の値を外に出力、音を鳴らす
( ポインタの指す要素の値が0であれば対応する次の)までジャンプ
) ポインタの指す要素の値が0でなければ対応する前の(までジャンプ
~ サイン波を生成
/ ノコギリ波を生成
^ 三角波を生成
[ または ] 矩形波を生成

440Hzのサイン波を鳴らすには
++++++++++++++++++++++(>++++++++++++++++++++<-)>~.
とすればいい。簡単に説明すると(の前の+の数だけ()の中を繰り返している。
以下、詳しい説明(本当に自分がわかってるか確認用)。

ソースコードのmがポインタ、mpがポインタの要素の値。初期値は0。

左から右に処理が流れる。
m[0]の要素の値mpがどんどん+で増やされていく。
+は22個なのでm[0]=22。
(にぶつかる。m[0]の要素の値は22で0ではないので、そのまま進む。
>でポインタをインクリメントしm[1]にする。以後の+はm[1]の要素の値に対して行われる。初期値は0。
+が20個。m[1]=20になったところで
<でポインタを1戻してm[0]に。
-でm[0]の数値をデクリメント。
m[0]=21
)にぶつかる。m[0]=21で0でないので(に戻る。
>でポインタがm[1]になる。
+が20個。m[1]=40になるまでインクリメント。
<でまたポインタがm[0]に戻る。
-でm[0]の数値をデクリメント。
m[0]=20
という感じで、20足すループを22回繰り返す。m[0]=0の時は)を通り抜ける。
<でポインタをm[1]にし、その数値440を~に渡してあげて、.で出力すれば440Hzのサイン波が鳴る。ついでにクという字もコンソールに出力される。

適当なエディタに上記のコードを書いて保存(拡張子はbとかtxtとか)し、processingのコードを実行してみて下さい。ウィンドウが出るので、クリックして、ファイルを選びます。
うまくいけば実行されます。元々のbrainf*ckは,でコンソールからの入力とかもとれるのですが、processingではちょっと面倒だったので実装してません。eclipseとかで動かしてれば別ですが。

音を鳴らすにはminimライブラリが必要です。
Code Log » Minim

brainf*ck参考リンク。
彼のInterpreterをほぼそのまま使ってます。
UMMO Letters » The Java Brainfuck Compiler
brainf*ckのコーディングについて参考にしたページ。
Brainf*ck
Brainfuck - Wikipedia, the free encyclopedia

もうちょっと使いながら何ができるか考えていこう...。
こういうのも面白いかもしれない。
西尾泰和のブログ: GRINEditを使ってソースコードの可視化


インタプリタ部分のライセンスです。僕のとこに関してはpublic domainで。
Copyright (C) 2002 Petter E. Stokke

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.