memorandums

日々のメモです。

やっとマイクトリガーのやり方がわかった。。。

1ヶ月前くらいにKZRさんのエントリーで知ったChucK(miniAudicle)。そのとき少し遊んだことを日記に記録しました。


で、その少し後に同じくKZRさんのエントリーでマイクトリガーというデモがありました。カッコええな。。。どうやってやるんだろう?とマニュアルや資料を読むものの良くわからず。。。放っていました。


昨日、たまたま見かけたChucKのあるユーザフォーラムにマイク入力の音量を取得するコードが掲載されていたため、やっとやり方がわかりました。adcのインスタンスにはアクセスできないようなので、どうやって音量をどうやって取るのかわかりませんでした。以下がそのコードです。Gainのインスタンスから取得するんですね。。。

adc => Gain g => blackhole;

float x;
while( true )
{
     g.last() => x;
     if( Std.fabs(x) >= .95 )
         <<< x, "" >>>;
     1::samp => now;
}


で、せっかくなので何か作ろうかいな。。。と無い知恵を絞って。。。とにかくKZRさんのように動いているモノ(この場合は旋律)をマイク入力でコントロールしたかったので、とりあえず手拍子でテンポを変更できるようなものを作ってみました。”とりあえず”できたのでコードと動画を掲載します。


今回作ってみて感じたのですが、Processingのように映像であれば動かしてみてデバッグができますが、音の場合(見えないので)、なぜうまくいかないのかわかりません。必然的に試行錯誤が多くなります。手をたたく音の立ち上がりだけを取ろうとしても。。。簡単ではありません。何かしらの統計処理をしてやればいいのでしょうけど、どのくらい悪いのか見えません。雑音除去にとローパスフィルタを入れていますが、カットオフ周波数がこれでいいのかわかりません(苦笑)。この手のプログラムをきちんと作るならスペアナは必須なんでしょうね。。。

SinOsc s => Gain g2 =>  dac;

adc => LPF lf => Gain g => blackhole;
800 => lf.freq;
float x;
time pre;
1::second => dur d;

fun void noteon(float f, dur len)
{
    f => s.freq;
    2.0 => g2.gain;
    len * 0.1 => now;
    0.0 => g2.gain;
    len * 0.9 => now;
}

fun void f()
{
    while (true) {
        (1000,d/4) => noteon;
        (1000,d/4) => noteon;
        (1500,d/4) => noteon;
        (1000,d/4) => noteon;
    }
}

spork ~ f();

while(true)
{
    g.last() => x;
    if (Std.fabs(x) >= .1) {
       now - pre => dur dd;
       now => pre;
       if (dd > 500::ms && dd < 2::second) {
           dd => d;
           <<< "BPM:",(1::minute / (d/2)) $ int >>>;
       }
    }
    1::samp => now;
}



ChucKのサイトは2002年から公開されているようです。論文も2004年くらいから出版されているようです。かなり以前から研究*1されていたものなんですね。。。研究成果をありがたく使わせていただきます。巨人の肩の上で遊ぶ。。。素晴らしい時代です。


あ、そうそう。この件で調べていて、素晴らしい講義資料を発見しました。メディアアートなどなど興味のある学生さんはぜひ活用させてもらってください。ソフトウェアがJavaRubyだけじゃない。。。ってことが良くわかりますよ。


もっとChucKのことを知りたい人はYouTubeでGe Wang ChucKで検索してみてください。いろいろなイベントが見れますよ。

*1:プリンストン大のGe Wang氏とPerry Cook氏によってChucKが提案された。Ge Wangさんはスタンフォード大に移られているようです。Ge WangさんのD論は一読の価値がありそうです。