Skip to content

File WavWriter.cpp

File List > examples > WavWriter > WavWriter.cpp

Go to the documentation of this file

Source Code

#include "daisy_seed.h"
#include <cmath>

using namespace daisy;

static constexpr float  kTargetSr     = 48000.f;
static constexpr size_t kTransferSize = 16384;

DaisySeed                hw;
SdmmcHandler             sdmmc;
FatFSInterface           fsi;
WavWriter<kTransferSize> wav_writer;

struct SimpleOsc
{
    static constexpr float kTargetFreq = 220.f;
    static constexpr float kSignalIncrement
        = (M_TWOPI * kTargetFreq) * (1.f / kTargetSr);
    float phs_;
    SimpleOsc() : phs_(0.f) {}

    inline float RenderSample()
    {
        float signal = sin(phs_) * 0.5f;
        phs_ += kSignalIncrement;
        if(phs_ > M_TWOPI)
            phs_ -= M_TWOPI;
        return signal;
    }
};

int main(void)
{
    hw.Init();

    SdmmcHandler::Config sd_cfg;
    sd_cfg.Defaults();
    sd_cfg.width = SdmmcHandler::BusWidth::BITS_1;
    sdmmc.Init(sd_cfg);
    FatFSInterface::Config fsi_cfg;
    fsi_cfg.media = FatFSInterface::Config::MEDIA_SD;
    fsi.Init(fsi_cfg);
    if(f_mount(&fsi.GetSDFileSystem(), "/", 0) != FR_OK)
    {
        while(1)
        {
            hw.SetLed((System::GetNow() & 127) > 63);
        }
    }
    hw.SetLed(true);

    WavWriter<kTransferSize>::Config cfg;
    cfg.bitspersample = 16;
    cfg.channels      = 2;
    cfg.samplerate    = kTargetSr;
    wav_writer.Init(cfg);

    SimpleOsc oscillator;
    size_t    duration_sec      = 1;
    size_t    duration_in_samps = duration_sec * kTargetSr;

    wav_writer.OpenFile("ExampleWavFile.wav");
    for(size_t i = 0; i < duration_in_samps; i++)
    {
        // If recording Realtime Audio:
        // The rendering/sampling should occur in the realtime audio interrupt
        float sample            = oscillator.RenderSample();
        float samps_to_write[2] = {sample, sample};
        wav_writer.Sample(samps_to_write);

        // The actual DiskIO should happen outside of the realtime audio interrupt
        // For offline-rendering, it is okay to do this check on every sample.
        wav_writer.Write();
    }
    // Flush and Close
    wav_writer.SaveFile();

    while(1)
    {
        // Blink Afterwards to show success
        hw.SetLed((System::GetNow() & 511) > 255);
    }
}