Вообще-то способов много. Можно создать в памяти небольшой wav-файл (заголовок+данные) и проиграть его с помощью (snd)PlaySound (как, например, тут
]]>http://delphi-faq.zoxt.net/926.htm)]]>.
В софте (плейерах, эмуляторах и т.п) обычно используются более интерактивные способы генерации, позволяющие проигрывать звук потоком и менять его на лету. Например, через обычный WaveOut - открывается устройство (waveOutOpen), готовится один или несколько буферов (waveOutPrepareHeader), затем в них последовательно пишутся амплитуды, задающие колебания нужной частоты, и готовые буферы посылаются на проигрывание (waveOutWrite). Система их проигрывает и освобождает для получения в них новой информации. Можно пользовать и DirectSound - принцип примерно тот же.