LPC810メモ:疑似正弦波で和音を鳴らす

前回の続き、正弦波を重ねて和音を出してみる。

前提とする環境はこちら→LPC810メモ 共通の準備
SCTなど基本的なサンプルについてはこちら→LPC810みっかぼ自作サンプル集

ドミソ→ド#,ファ,ソ#→レ,ファ#,ラ→...という感じに半音ずつあがっていく。
他に前回と違うのは、音を減衰するようにして、ポーンポーンポーン・・と響くような音にしてみた。

サンプルコード

SctSoundUtil.h -> 前回サンプルから持ってくる。
SctSoundUtil.cpp -> 前回サンプルから持ってくる。

sample.cpp
(2016/05/29修正)

#include "LPC8xx.h"
#include "SctSoundUtil.h"

struct {
    uint8_t scale; // 音階(0 .. 47)
    uint16_t verocity; // 音階に対応する角速度
    uint16_t angle; // 現在の角度
} tone[] {{0,0,0}, {4,0,0}, {7,0,0}}; // 音3つ、ド・ミ・ソで初期化

static int count{0}; // 1/10000秒毎にカウントアップする
static int volume{0}; // ボリューム調整用変数
static void handler() { // 1/10000秒毎に呼ばれるハンドラ
    if(count % 2500 == 0) { // 250ms毎に音を更新
        for(auto &t : tone) {
            t.verocity = SctSoundUtil::toneAngularVelocity(t.scale);
            t.scale++;
            if(t.scale > 47) { t.scale = 0; }
        }
        volume = 10; // 音を更新したタイミングで、ボリュームを10に設定
    }
    count++;
    if(count % 500 == 0 && volume > 1) { volume--; } // 50ms毎にボリュームを1減らす
    int8_t duty{0};
    for(auto &t : tone) {
        t.angle += t.verocity; // 角速度分進める
        duty += SctSoundUtil::sin(t.angle); // 足し合わせて和音にする
    }
    SctSoundUtil::setDuty(60 + duty * volume / 10); // ボリュームを加味してduty設定
}

int main(void) {
    SctSoundUtil::setCallback(handler);
    SctSoundUtil::init();
    SctSoundUtil::start();
    return 0;
}

接続

前回と同じのため省略。

補足/雑感

  • 普通にうまくいった。
  • と思ったら、後日見直したらvolumeの扱いが変だったので修正。これで不自然さを感じなかったのだから、自分の耳がなんと頼りにならないことか。

みっかぼの無料Androidアプリはこちら。