ESP32でWAVファイルをFlashメモリから再生する
ESP32にはDACが(8bitですが)搭載されています。
ので、そこからWAVファイルの音源をなんとかして再生したい、と思った際のメモです。
ざっくりした手順
- WAVファイルを Audacity などで、unsigned 8-bit の RAW (header-less) にする
- RAWファイルのバイナリデータをテキストでヘッダーファイルにし、Flashに配置する
- サンプリングレートを考慮したタイミングでDACから再生する
以下、詳細手順メモです。
1. WAVファイルを unsigned 8-bit の RAW (header-less) にする
AudacityでWAVファイルを開く
Export as WAV
2. RAWファイルをテキストでヘッダーファイルにし、Flashに配置する
HxDなどのバイナリエディタで.rawファイルを開く
配列にできるように体裁を整える
サウンドの配列をつくる
const PROGMEM
を追加することでFlashに配置される。
また、配列のサイズをRAWファイルのサイズに合わせること。
raw_audio.h
const PROGMEM unsigned char raw_audio[/* size of raw file */] =
{
// copy & paste raw data here
};
3. サンプリングレートを考慮したタイミングでDACから再生する
play_wav_raw.ino
const uint32_t SAMPLE_DELAY_US = (uint32_t)(1000000. / 44100.);
void play(const unsigned char* ptr, uint32_t size)
{
uint64_t count = 0;
while (count < size)
{
dacWrite(25, ptr[count]);
ets_delay_us(SAMPLE_DELAY_US); // 44.1kHzになるよう待つ
++count;
}
}
void setup()
{
}
void loop()
{
play(audio_raw_array, sizeof(audio_raw_array));
delay(2000);
}
参考にさせていただいた記事
http://kghr.blog.fc2.com/blog-entry-126.html
https://github.com/kghrlabo/esp32_simple_wav_player