mbed LPC1114手習い03 / PWMでPCMの目処がたつ
ようやくLPC1114で思っていた方法で音がコントロール出来ました。
他の人のソースとか読むとパルス幅変換の周波数を変えて音程を変えているのが多かったのですが、それだとパルス幅変換のメリットがないので、周波数は一定で、その中で改めてデューティ比を変えて音程と音色を変える方法を取りました。前者は等間隔で塗りつぶして目盛り自体の幅を変える感じで、自分がやったのは目盛りに沿って塗りつぶす数を変える感じ。
今はまだ矩形波だけですが、とりあえずプログラムはこんな感じに。アナログ入力のvoltage1で音程、voltage2で音量をコントールしています。この音量コントロールをパルス幅変換と同じくらいの早さで変化させればPCM再生にもなるという寸法。
/*
my pcm test
*/
#include "mbed.h"
float smpl_frq = 11025; //set 11kHz
float smpl_rate = 255; //8bit sampling
float clk = 1 / smpl_frq;
float snd_frq = 220; //tone A3 to A6
float vol = 0;
float max_vol = 255;
float min_vol = 0;
Ticker timer;
AnalogIn voltage1(dp4); //set dp4 pin -> sound frq
AnalogIn voltage2(dp9); //set dp9 pin -> sound vol
PwmOut snd_out (dp18); //set dp18 pin -> sound out
int main() {
snd_out.period (clk);
float cnt_frq = 0;
float pls_frq = smpl_frq / snd_frq;
while(1) {
for (int i = 0; i < smpl_frq; i++) {
cnt_frq = cnt_frq + 1 ;
snd_frq = ( voltage1.read() * 660 ) + 220;
pls_frq = smpl_frq / snd_frq;
vol = voltage2.read() / smpl_frq;
if (cnt_frq <= ( pls_frq / 2 )) {
snd_out.pulsewidth(vol);
} else {
snd_out.pulsewidth(min_vol);
}
if (cnt_frq >= pls_frq) {
cnt_frq = 0;
}
wait(clk);
}
}
}
学んだこと色々
- mbedは色々ライブラリが用意されているので便利なのだけれど、人のソースを読むだけでは、結局ライブラリの使い方の理解が中途半端になる。ちなみにPwmOutというパルス幅変調を出力するクラスは”object = 0.5”でも”object.pulsewidth(0.5)”でも音が出るけれど何に対する「0.5」なのか判らない。結局、大元の情報を読むことになる。
- よく判ってなかったのだけれど、LPC1114は内部発振器は12MHzでも、PLLという仕組みで48Mhzで動いている。なので44.1kHzのサンプリング周波数でも余裕。抵抗とコンデンサの簡易ローパスフィルターだと11kHzだと音を小さくしようとすると変な倍音が乗るが、44.1kHzだとそれが小さくなる。むしろもっと高い周波数にすべき。
- サンプリングレートを8bitで想定しているけど、数値の型が浮動小数点なので今のところ8bitに限定している意味ない。後々影響してくる予定。
- カウンタで割り込み処理をするときにはアドレスまたはレジスタに値を入れておいて、ソフトウェアからは特に動かずハードウェアの機能で出力するというパターンが多いのかしら?確かこれプロペラチップでも出てきたパターン。今ならもっとプロペラチップの音の扱い方が判りそう。あっちはΣΔ変換だけど。
- 上のプログラムだけでもコンパイルすると14kバイトもある。Monolistの記事だとmbed使って10kのプログラムがハード直叩きで1kになるという例が出ていた。となると、mbedの枠組みでやるより、ちゃんとCPUのアーキテクチャを理解して、ハード直叩きをしたほうが良さそう。何時の時代の話だって感じだけれど、プログラムできる領域が32kしかないので、後々節約する必要は間違いなく出てきそう。
- とはいえ、ゆくゆくは容量や性能の拡張と、プロトコルの勉強も兼ねて複数個のLPC1114を使う感じにしたい。IchigoJamとPanCakeみたいに。これはシリアル通信でつないでいるけど、SPIを使ってみたい。(LPC1114だと4個の連動は出来ないのかな?出来て欲しい。)
- 今回は車輪の再発明というより車輪の再発見ぐらいのレベルな話ではありましたが、自力で解決するのは勉強になりますね。
- とはいえ、自力だけでも中々大変なので、トラ技の中古を入手したりしました。オマケのLPC1114本体は要らないので中古も安いやつで十分でした。
あと、GNPの新曲が心躍ります。
こんなに凄いPVじゃなくて良いので、動画サイトに自曲をアップするのに、ちょっとしたループ動画を作りたい。イメージとしてはこんな感じ。これはセンス炸裂してますが。
まえ、context freeとかstructure synth(名前がいいよね)でちょっと試しに動画作ったりしたんだけど、そんな感じでこちょこちょっとできると良いな。あとそういう使い方が本来ではないと思いますがPayMolとかでも。
以前作ってみた動画。
pymolでタンパク質の分子構造を動画にしたやつ
context freeの作例の"underground"を動画にしてみたもの
ちなみに自分のSoundCloudページトップの"NEO ONBANGDO"の画像はstructure synthで作ってます。