ESP32で、電子音を重ねて出力、「きらきら星」を演奏してみました。
昭和の8bitパソコンやゲーム、MSXが搭載していた「PSG音源」のように、
ピコピコやブーなど、シンプルで懐かしい音です。
電子工作で音を出すというのは、
極端にいえば「低周波治療器を高速にしたようなもの」です。
1秒間に数百~数千回、電圧をアップダウンさせて、スピーカーやイヤホンを振動させます。
1音であれば、IOピンに出力→delay()で一定間隔待ち、を繰り返すだけでも音が鳴ります。
Arduino標準のtone()関数も電圧上下という点は同じです。
しかし複数の周波数の音を重ねて、和音で鳴らすとややこしくなります。
例えばド=261Hzと、ミ=329Hzと、ソ=391Hzの3つを同時出力する場合、時間軸(横方向)が不規則に。
そこで、タイマー割込みを64kHz(秒速6万回)で動かして
複数の波形の瞬間値をリアルタイムで計算し、DACポートに毎秒6万回出力してみました。
たとえばド=122.31カウント、ミ=97.07カウントの経過ごとに出力のHigh/Lowを入替えます。
我流で作った割りに、それっぽく鳴ったと思います。
今回サンプルとして5和音でプログラムしましたが、
CPUの処理能力が足りれば、理論上10和音でも20和音でも鳴らせそうです。
演奏する「きらきら星」の曲データは、こんな感じ。配列に音階・長さをベタ打ち。
適当なので、多少の間違いはご容赦を。
次は、単純なピコピコ音だけでなく、すこし手の込んだ音にも挑戦してみたいです。
おしまい。