DDSも完成したことですので、アトラクターで周波数変調をかけてみました。
感想は…思ったほど不思議な音でもないですね。注意して聞くと周期がカオス的に揺らぐのがわかります。おもしろいんだけど、はたから見ると不気味らしいです。
ダウンロード: 29KB
#include "player.h"
CPlayer::CPlayer():mcm::fwEzKit2191( )
{
        attractor = new CLorentz( 0.0, 0.01, 0.0, 1e-3 );
        osc = new dds::CSinCosDDS( 1300, 0 );
}
//**************************************************************************
//
//  CPlayer::handleBufferの定義
//
//  handleBufferメンバー関数はDMA転送が終わるたびに受信バッファと送信
//  バッファをパラメータに呼ばれる。受信バッファには直前のDMAで受信した
//  データが入っている。handleBufferから戻るときに送信バッファにデータを
//  おいておくと、次のDMA転送で送信される。
//
//  このプログラムではbufTx[i]にアトラクターのXの値を置く。
//
//**************************************************************************
void CPlayer::handleBuffer( struct mcm::sample * bufTx, 
                            struct mcm::sample * bufRx )
{
        attractor->tick();
        osc -> setFreq( ( attractor->getX()+80 )* 10.0, 0 );
        osc -> run( (int * )& bufTx[0].l, sizeof( mcm::sample ), bufSize );
        for ( int i=0; i< this->bufSize; i++ ){         // bufSizeは送受信バッファの長さ
                bufTx[i].r = bufTx[i].r = bufTx[i].l >> 3;
        }
}
上で使っているローレンツアトラクターは3次元空間での軌跡です。その軌跡からX,Y成分だけ取り出すと図1のようになります。
 
図1 ローレンツのアトラクター(x,y)
ここからさらにXだけ取り出したのが図2です。
 
図2 ローレンツのアトラクター(x)
図1ではx,y平面にある二つの中心の周りで軌跡が踊っているのがわかります。図2からももやはり+8, -8近辺にある中心が見て取れます。実際に音を聞くと二つの周波数の周りでゆれているのがわかります。
⇒次は