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の扱いが変だったので修正。これで不自然さを感じなかったのだから、自分の耳がなんと頼りにならないことか。