Én a ChucK nevű programnyelv-szerűséget használtam, amikor hangot kellett szintetizálnom:
http://chuck.cs.princeton.edu/
A példaprogramok között konkrét DTMF is van, de ami neked kell, az annál is egyszerűbb, tényleg pár sor.
Szerk: annyira azért nem triviális, ő mindenáron a hangkártyát szeretné megszólaltatni, külön rá kell beszélni, hogy fájlba írjon:
// oscillators
[4000, 4523, 5069, 5511, 6112, 6573] @=> int freqs[];
[ .6, .5, .5, .5, .5, .5] @=> float gains[];
SinOsc oscarray[6];
for(0 => int i; i<6; i++) {
oscarray[i] => dac;
freqs[i] => oscarray[i].freq;
gains[i] => oscarray[i].gain;
}
// sound file
me.sourceDir() + "out.wav" => string filename;
if( me.args() ) me.arg(0) => filename;
// pull samples from the dac
dac => Gain g => WvOut w => blackhole;
// this is the output file name
filename => w.wavFilename;
1000::ms => now;
Futtatás:
chuck -s write_sound.ck
A sox rögtön csinál belőle spektrogramot:
sox out.wav -n spectrogram