ならば

音とかで遊んでいたログ

2007-10-01から1ヶ月間の記事一覧

keynote

強引に無関係な英単語の覚書きを混ぜ込む。keynote:主旨、基調。昨日のメモを書いた後で気になったこと。ユニットジェネレータの中には、 .keyOn/.keyOff: (これも実はSTKからの)エンベロープ・ジェネレータのパラメータ .noteOn/.noteOff: STKの楽器系…

エンベロープ

楽器を弾いて鳴らした音は一定の音量や音高を保ったまま鳴り続けるわけではなく、時間が経過するにつれて立ち上がりや減衰がある。この変化の仕方をエンベロープといって、楽器や弾き方によって様々で音色を特徴付ける大きな要因になっている。シンセサイザ…

コマンドライン引数

始めると書いたばかりの音響とは全然関係ない。プログラムにはコマンドライン引数を渡すことができる。miniAudicleの場合はコード編集ウィンドウの上部にある「arguments」というテキストボックスに渡したいデータを入力して実行する。複数のデータを渡すと…

シンセでの音作り

ChucK以外のことは全部[その他]タグを付けるという大雑把さ。シンプルでいいか。シンセサイザーでの音作りの基本を知ろうと思って易しい解説を探していたら、「極めろ!シンセ音色研究所」というサイトにあるシンセサイザー入門が簡潔で良かった。信号の大ま…

論理演算

唐突に流れを変えて軽いメモを。 ChucKにはブーリアン型がなく、代わりに真偽は0かどうかで決まる(0以外の値は全て真)。true、falseというキーワードは用意されているが実体はint型で値はそれぞれ1、0。 当然一般的な論理演算はできて、結果はint型の1か0…

マウス

マウスの横方向の移動をパンに、縦方向の移動を音高に対応させて、音を鳴らすプログラム。左右のクリックで楽器を変更することもできる。 Hid hi; HidMsg msg; if ( !hi.openMouse(0) ) me.exit(); Shakers s => JCRev r => Pan2 p => dac; 800 => s.freq =>…

キーボード

押されたキーに対応するASCIIの値をMIDIノート番号として、その付近の音をランダムに8個鳴らすプログラム。短い間隔でキーをばしばし押していくと音がいくつも重なる。 Hid hi; HidMsg msg; // 0番目のキーボートとの接続を開く if ( !hi.openKeyboard(0) ) …

HID

HIDはHuman Interface Deviceの略語で、マンマシンインタフェースとなるコンピュータ周辺機器のこと。主なものにキーボードやマウス、ジョイスティックなどがある。ChucKでは、HIDやMIDI機器・ソフトのようなVMの外部から引き起こされるイベントも(Eventク…

meキーワード

meキーワードは現在のshredへの自己参照になっている。ここでは三つの関数についてメモ。 me.exit():現在のshredを終了する me.id():現在のshredのIDを返す me.yield():VMへ制御を渡す me.exit()は読み込みたいファイルが開けなかったときやイベントの待…

イベント

前に書いた時間の進め方は dur型 => now time型 => now の二通りで、どちらも直接的に時間を指定する方法だった。実はChucKにはもう一通り、 eventオブジェクト => now という形の時間の進め方が用意されている。この式では指定したイベントの待ち行列に現在…

型変換

tick2.ckで出てきたので補足ってことでここに書く。PDFのマニュアルには型変換についてはint型とfloat型の間のことしか載っていない。*1 int型からfloat型へ:必要なときに暗黙に変換してくれる float型からint型へ:「(変換したいfloat) $ int」と書く 他に…

周期を合わせる

プログラムからshredの追加や置き換えのタイミングを操作せずに、好きなときに"Add Shred"したりしてもshredを同期させるにはどうすればいいか。マニュアルを見ると The concurrency is 'sample-synchronous', meaning that inter-process audio timing is g…

並行性

ChucKでは複数のプロセスを並行に実行することができる。このおかげで別々に作ったメロディやパートを同時に鳴らすことができる。ChucKのVM上で動くプロセスのことをshredと呼ぶ。miniAudicleでshredを並行に動かすには、いくつかのファイルを開いて、それぞ…

miniAudicleという環境

ChucK自体の話とは違うけど今使っている開発環境についてメモ。miniAudicleはOSによって異なるパッケージが用意されていて公式サイトでそれぞれのページを見比べればわかるが、機能が豊富な順にならべるとMac OS X、Linux、Windows版になっている。特にMac版…

LFOとblackhole

PDFのマニュアルにある「ChucK Tutorials LFOs and Blackhole」を読めば変調のやり方が分かる。下手に再構成するよりそのままのほうが多分分かりやすいから、適当な訳を載せる。文中のUgenはユニットジェネレータのこと。 LFOとblackhole by Adam Tindale 音…

MML記法

はてなブックマークの人気エントリー経由で知った。試しにウェストミンスターの鐘をパルス波で。 t80l4@3v5o5 ced>g2<cdec2ecd>g2g</cdec2ecd>

マニュアル

今までChucKについて大抵は、公式サイトにある The ChucK Tutorial ChucK : Language Specification ChucK : Programmer's Reference 特にChucK : Programming Guide Unit Generators を見てやってきたんだけど今さらPDFのマニュアルを眺めてみた。そしたら…

ブラックホール

スピーカーからの出力がいらないときはdacの代わりにユニットジェネレータblackholeを使う。dacと同じくスコープはグローバル。 Noise n => WvOut w => blackhole; "foo.wav" => w.wavFilename; 2::second => now; w.closeFile();blackholeは名前の通り何も…

メディアファイル出力

WvOutというユニットジェネレータを使えば、作った音をファイルに出力できる。対応フォーマットは現在のバージョンでは「WAV, AIFF, AIFC, SND(AU), MAT-file (Matlab), and STK RAW」。 Noise n => WvOut w => dac; "foo.wav" => w.wavFilename; 2::second …

補足

上で書いた「うなり」のコードの一部とからめてChucKの文法についてメモ。 while(2::second => now) s2.freq() + 1 => s2.freq;まず公式サイトのリファレンスには一体何なのかが明記されていないdur型の「::」という表記。electro-musicという掲示板サイトの…

波の合成

一般にいくつかの波を合成して別の波を作ることができる。まずは全く同じサイン波を足して振幅(波の振動の大きさ)が二倍のサイン波を鳴らすコード。10月8日追記:複数のオシレータの出力をdacに直につなぐと歪みが生じてしまう。これを避けるには途中でGai…

サウンドバッファ

メディアファイルを処理したり再生するには、まずSndBufというユニットジェネレータにデータを読み込む。"foo.wav"というファイルを読み込んで再生するだけなら、 SndBuf buf => dac; "foo.wav" => buf.read; buf.samples()::samp => now;readにファイル名を…

サンプリング周波数

前に時間について書いたときには分からなかったdur型のsampについて。調べてみるとsampは信号(音)の標本化のとき、データを取る間隔を表しているようだ。そして一秒間にデータを取る回数はサンプリング周波数という。使用環境のサンプリング周波数は、 <<<second/samp>></second/samp>…

関数

関数は「fun 返り値の型 名前」で定義する。 fun int sqr(int x) { return x*x; }オーバーロードも可能。なのに何故かStdでは rand(), randf() と rand2(int min, int max), rand2f(float min, float max) がわざわざ別名で実装されている。開発者が使う気な…

ステレオ

ChucKではデフォルトでステレオオーディオを使える。ステレオなユニットジェネレータは、leftとrightでそれぞれのチャンネルにアクセスできる。つまり左右で違うエフェクトをかけたりできる。 JCRev rl => dac.left; JCRev rr => dac.right;Pan2というユニッ…

耳で聴くハノイの塔

「耳で聴く」という表現は当然だから変かなと一瞬思ったけど骨振動ってのがあるので無問題。

ユニットジェネレータ

SinOscやらdacやらはユニットジェネレータ。これもオブジェクト。ユニットジェネレータとは信号(音)を作ったり処理したりするもので、一覧を見ると色々な種類が用意されている。これを適当に持ってきてつないで設定してやれば好きな音が作れる。つなぎ方は…

配列

配列の仕様を全部読んでも大した量ではないが今必要で独特なところだけメモ。配列はオブジェクト。基本型の配列は明示的に初期化しない場合、要素はデフォルト値*1にセットされる。指定したいときは下のコードのようにする。演算子「@=>」はオブジェクトの参…

乱数

チュートリアルで「昔のSF映画に出てくる大型コンピュータっぽい音」を出すといってるコード。 SinOsc s => dac; while( true ) { 100::ms => now; //30.0から1000.0までのランダムな数を周波数に設定 Std.rand2f(30.0, 1000.0) => s.freq; }ぎりぎりな高周…

音を鳴らす

今のままだとジョン・ケージの有名な曲くらいしか再現できないので音の鳴らし方を。チュートリアルを見ると、まずはサイン波を作って鳴らそう、と書いてある…。音は波だそうで、波の形とか高さによって異なる音になるらしい。つまり適当な波を作ってそれをい…