Самый простой вариант:
Можно взять два крайних значения синуса (-1, 1) и выводить их поочереди. Попробуйте откомпилять следующий код:
/* sin.c */
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/soundcard.h>
int main()
{ unsigned char c1=0, c2=255;
int format=AFMT_U8; /* формат сэмплов: U - беззнаковые значения, 8 - 8 бит на сэмпл */
int rate=2000;
int channels=1;
ioctl(1, SNDCTL_DSP_SETFMT, &format);
ioctl(1, SNDCTL_DSP_CHANNELS, &channels);
ioctl(1, SNDCTL_DSP_SPEED, &rate);
while(1)
{ write(1, &c1, 1);
write(1, &c2, 1);
}
return 0;
}
и выполнить
$ sin >/dev/dsp
Когда надоест нажмите ^C :)
Теперь поиграйтесь со значениями rate и получите разные частоты (то есть разную высоту звука).
Для паузы необходимо выводить нули (или в случае unsigned 8 bit, как описано выше - 128).
То есть примерно так:
/* space.c */
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/soundcard.h>
int main()
{ unsigned char c=128;
int format=AFMT_U8;
int rate=2000;
int channels=1;
ioctl(1, SNDCTL_DSP_SETFMT, &format);
ioctl(1, SNDCTL_DSP_CHANNELS, &channels);
ioctl(1, SNDCTL_DSP_SPEED, &rate);
while(1)
write(1, &c, 1);
return 0;
}
То есть команда
$ space >/dev/dsp
Выведет на вашу звуковую карту полную тишину :)
Для задания длительности вывода звука и частоты дескритизации используйте простой рассчёт:
rate=<частота звука>*2 (2 сэмпла в одном периоде синуса)
N=<необходимая длительность>*<частота звука> - именно столько пар (для "синуса") отсчётов нужно вывести.
Окультурить это всё в виде функций - дело 2-х минут...
Удачи!