#include <iostream>
#include <fstream>
#include <cmath>

using std::ofstream;

static const int samples_per_second = 8000;
static const double pi = 3.14159;
static const int hz = 440;
static const int length = 10;

struct Packet
{
    typedef unsigned char Storage;

    Packet() : value(0) {}
    Packet(Storage v) : value(v) {}
    Packet(double v)
    {
        value = (Storage)(((v + 1.0) / 2.0) * double(max()));
    }

    Storage value;
    static Storage max()
    {
        return 255;
    }
};

int main()
{
    ofstream output("/dev/dsp");

    int period_in_samples = samples_per_second / hz;

    for(int i = 0; i < samples_per_second * length; i++)
    {
        Packet p =
            sin(pi * i / samples_per_second / length) * (
                sin(pi * i / period_in_samples)
                + sin(pi * i / period_in_samples * 2) * 0.8
                + sin(pi * i / period_in_samples * 4) * 0.5
                + sin(pi * i / period_in_samples * 8) * 0.3) * 0.5;

        output << p.value;
    }

    output.close();

    return 0;
}
