2006-06-01から1ヶ月間の記事一覧

PySndObjはじめました。

ChucKも続けていきますがちょっと休憩。グループで書く日記もあるようなのでそちらのほうに移していこうかと。次はNyquistかCommonLispMusicなどの関数型の音響言語を勉強しようと思っていたんですが、なんかノイジーパイソンって事で。 さてPySndObjですが…

スレッドのイベント

以下のようなイベントというものがよくわからなかった。音楽的にMIDIキーボードやパソコンキーボードの入力待ちとごっちゃになっていて理解できていなかったのです。 Event e;このイベントはキーボードがどうだとかではなく、スレッドで効果的に使用できます…

maybe

以前はloop(6){}だったそうですが、以下のようにrepeat(回数)に変更。if(maybe)はちょっとおもしろく、実行するとわかりますが、もしかするとyes出力します、ユニーク。もしかすると他の言語とかにもあるかもしれませんね。SuperColliderには裏か表かcoinっ…

引用符のエスケープ処理できない。

Chuckでは直接に文字列を出力するとき引用符(")で囲みますが、その中に引用符を書き込むとエラーになります。 <<<"miu"jun">>>; #=>line(1).char(9): syntax errorそこでエスケープ処理を探したんですが今のところサポートしていないそうです。チッ。ちなみ…

MIDI、3つのデータ

Chuckで何かのMIDIディバイスからデータを受け取る。サンプルのgomidi.ckには以下のように <<<msg.data1, msg.data2, msg.data3>>>;3つのデータを返している部分がある。僕はキーボードなどのMIDIディバイスをもう使ってないので、PyPortMidiでMIDIデータを送ってみた。 MidiOut.Write([[[0x90</msg.data1,>…

メーリングリストから

ChucKのメーリングリストから少し拾ってみる。 以下のようにオシレータを3個繋げると振幅が合計され-3から3になります。 sinosc s => gain g => dac; sinosc s2 => g; sinosc s3 => g;ですから振幅を1にするにはs.gainに0.3333。またg.gainを1にしてもいいの…

重ね合わせ

サイン波の重ね合わせ。振幅は一定で周波数は整数倍になっています。奇数倍と偶数倍とか、さらに振幅をいろいろ変えてみたりとかできそう。 gain g => dac; fun void sinbank( int num, float f) { sinosc s[num]; for(0 => int i; i<=num-1; i++) { s[i] =>…

クラス

ChucKのソース"chuck_lang.cpp"を読むと配列のメンバはcap、size、erase、findだけです。おまけにeraseとfindは引数に文字列しかダメなので、例えばhairetu.erase(0)として最初の要素を消したりはできません、エラーになります。もちろん配列の操作は音楽的…

まねっこ(リズムの転回)

リズムの転回というブログの記事を読んで(プライベートになっていて読めなくなっちゃってますがキャッシュで残っている)、 例えば、4分音符を1にして2分音符は2にし8分音符は1/2としましょう。2分音符の逆数は8分音符となります、というかします。でも配列だ…

入力

キーボードから入力を受けたらプログラムを終了する。その時、aを押すと97をプリントしますしsだと115でした。 KBHit kb; kb => now; <<<kb.getchar()>>>;これを応用してキーボードでサイン波の周波数を変えてみよう。わざわざ関数にすることは無いんですが、今後の応用と</kb.getchar()>…

複数ファイル

今日は何をやろうかとサンプルファイル読んでいたらhanoi2.ckにある、複数ファイルを読み込む方法がイカしていたので gain g => dac; sndbuf buf[4]; "1.wav" => buf[0]; "2.wav" => buf[1]; "3.wav" => buf[2]; "4.wav" => buf[3]; for(0 => int i; i<buf.cap()-1; i++) buf[i] => g;gai</buf.cap()-1;>…

スレッド2

注:さらに多少修正しました。 スレッドを使って実際に音を出す。1つはFM7のコードをアルペジオでメロディ感を、もうひとつはFM7のコードを8オクターブからランダムに音を選び、空間を演出する。 sinosc s => WvOut w => dac; sinosc m => w; "hana.wav" => …

スレッド

スレッドってなかなか理解しにくいのですが、音楽的に考えると必要だと実感できます。ベースを関数でまとめて、関数でまとめたドラムも同時に鳴らしたい場合は以下のようでは”うまくない”。 fun void bass(){<<<"bass">>>;2::second => now;} fun void drum(…

今日はsndbuf

サウンドを読み込むには2通りあるが、今日はsndbufを。 sndbuf f => dac; "sample.wav" => f.read; f.samples()::samp => now;.samples()は音声ファイルのサイズを取得します。他にも10 =>f.loopで再生を10回繰り返したり、.pos()で再生位置を取得したり、い…

オシレータを配列に

一昨日は配列に音階、昨日は配列にタイミング、今日は配列にオシレータを。例えば4つの音が鳴るとして、その音ごとにオシレータをサイン波、矩形波、三角波、のこぎり波と順番に入れ替える。まあそんなかんじです。 ところが配列に入れるとして配列の型で何…

タイミング

昨日は配列で音階を実現しましたが、音が鳴るタイミングは定数でした。そこで音が鳴るタイミングも配列の中に入れてみる。しかし時間は 1::second => dur jikan;このようにちょっと変わっているので試しにいくつか実験してみる。 [1::second, 2::second, 3::…

引数を配列

自分で関数を作る際、引数を配列にしてみたい。そんなテーマを使ってアルペジオを表現。 sinosc s => JCRev f => dac; .5 => f.gain; .07 => f.mix; fun void arp(int num[]) { for(0 => int i; i < num.cap(); i++) { std.mtof(num[i]) => s.freq; 0.1::sec…

関数の引数

同じ名前の関数を作り引数の数を変えると、 fun void miu(int num1) { <<<num1>>>; } fun void miu(int num1, int num2) { <<<num1 + num2>>>; } miu(1); miu(1,2); miu(1, 2, 3)当然ですがmiu(1,2,3)はエラーになります。これは関数のオーバーロードと言うらしい。さあ、最後は</num1></num1>…

配列

今日は@=>と=>の違いを勉強しようと思ったがよくわからない。マニュアルにはほぼ同じ作用とあり、ちがいはオブジェクトの参照を代入をとかなんかそんなときらしい。それで断念して配列に手をつけたんですが。 [ 1, 1, 2, 3, 5, 8 ] @=> int foo[]; <<<foo[1]>>>;これ</foo[1]>…

for文

for文を試す。ブレースで囲まない場合、;までしかループの対象にはなりません。 int i; for(0 => i; i< 10; i + 1 => i) <<<"loop">>>;<<<"end">>>;ブレースで囲むと int i; for(0 => i; i < 10; i + 1 => i) { <<<"loop">>>;<<<"end">>>; }最後に模写してお…

関数

関数を作ってみましょう。 fun void miujun( int m ) { <<<m + 2>>>; } miujun(2);もちろんvoidなのでreturnはできません。何か数値を返してみたい。 fun int miujun( int m) { return m + 2; } 2 + miujun(2) => int v; <<<v>>>;6をプリントしました。楽器的にどのよ</v></m>…

オペレータを使わない

例えばsinoscの周波数を代入するのは変数sにして440 => s.freqでしたが(以前のブログをチェック)、以下のように関数を呼ぶような文法でも s.freq(440)終わりはいつもの模写で、adc.ckを adc => dac; while( true) { 100::ms => now; }マイクから音声を入力し…

振幅変調から

振幅変調を試行錯誤したけど、、、うまくいった例。他にもあると思うけど。sinosc n => c.gainではエラーになってしまうのでgainをはさんで変調させてみた。 sinosc c => gain g => dac; sinosc n => g; 10 => n.freq; 0.2 => c.gain; 10::second => now;今…

繋げる

当然FMとかやってみたくなりますが、ChucKにはいろいろな方法がありそう、あくまでも風(ふう)ですが。サンプルにも3つぐらいあります。sinoscを繋げてみましょう。 sinosc m => sinosc c => dac; 440 => c.freq; 3 => m.freq; 220 => m.gain; 10::second => …

書き出し

サイン波を10秒ファイルに書き出す。 sinosc s => WvOut w => dac; "test.wav" => w.wavFilename; 10::second => now;他の方法もあるようですが、今回はこれで。オシレータとD/Aコンバータの間にWvOutを。

サイン波

サイン波を10秒ほど鳴らそう。 sinosc a => dac; 10::second => now;サイン波のユニットジェネレータを変数aとする。このaを使って周波数を変えよう。 sinosc a => dac; 880 => a.freq; 10::second => now;他人のコードも模写しておく。exampleのdemo03.ckよ…

ChucKはじめました。

1ヶ月をめどに頑張るか。 初めにdemo0.ckを開いてみる。最初のサンプルに適切かどうかわかりませんが、これから始めてみよう。 5::second + now => time later; while( now < later) { <<<now>>>; 1::second => now; } <<<now>>>;実行はコマンドラインで chuck demo0.c</now></now>…