ならば

音とかで遊んでいたログ

ChucK

振幅変調

RMは二つの波形の掛け算だけど、これは一方の波形の振幅をもう一方の波形で変調しているとも見なせる。例えば、サイン波の振幅を決まった値じゃなくて何かの波形にするとRMだ。つまりRMは振幅変調(AM)の一種のはず。でも調べてみると、音響分野では RM:双…

吹雪の中のジングルベル

吹雪というかノイズ。今回のテストデータ。 BlowBotl blow => dac; .7 => blow.noiseGain; // ノイズ部分の強さ(0.0から1.0まで) .5 => blow.gain; [[76,2],[76,2],[76,4],[76,2],[76,2],[76,4], [76,2],[79,2],[72,3],[74,1],[76,8], [77,2],[77,2],[77,3…

リング変調

二つの波形の掛け算で新しい波形を作り出すことをリング変調(Ring Modulation)という。リング変調という名前は、昔この変調を実現する電子回路の中にリング状の部分があったことに由来するらしい。 単純に波形がどちらもサイン波なら三角関数の積和公式 そ…

負の音量、負の周波数

トレモロのプログラムではlfoの出力をそのまま.gainにセットしているので、負の値になることもある。.gainに負の値をセットすると入力波形が反転される。内部の処理としては単に入力波形と.gainの乗算をしているだけだと思う。 SinOsc ps => dac.right; SinO…

トレモロ

音を小刻みに弾き続けることをトレモロという。音色の印象に変化をつけたり減衰の速い音を長く持続させたいときに使う奏法らしい。この効果はdacにつなぐ直前の音量をLFOで変調することで得られる。 TriOsc s => ADSR amp => dac; SinOsc lfo => blackhole; …

ワウワウ

音色を周期的に変化させて文字通り「わうわう」という感じにするのをワウワウ(ワウ効果とも)という。なんて安直なネーミング…。この効果はフィルタの設定周波数をLFOで変調すると得られる。 SawOsc s => BPF f => dac; SinOsc lfo => blackhole; 2 => f.Q;…

ビブラート

音を伸ばしているときに音高を連続的に揺らすことをビブラートという。オシレータの周波数をLFOで変調するとこの効果が得られる。マニュアルにはblackholeを使った次のプログラムが載っている。 SinOsc s => dac; SinOsc lfo => blackhole; 5 => lfo.freq; w…

LPF、HPF、BPF、BRF

倍音を多く含む波形から一部の周波数成分を削っていって音色を作る方法を減算合成という。減算合成方式のシンセサイザーでオシレータから出力された波形を加工するのに使うのがフィルタ。これで倍音の一部を削ったり特定の部分を強調したりできる。フィルタ…

keynote

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

エンベロープ

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

コマンドライン引数

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

論理演算

唐突に流れを変えて軽いメモを。 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 音…

マニュアル

今まで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) がわざわざ別名で実装されている。開発者が使う気な…