There is a lot of fun in making and playing your own sounds- programmatically you can create a whole synthesizer.
A sound wave is a mixture of waves of sound pressure, transmitted longitudinally. The simplest wave shape is a sine wave of constant amplitude and constant frequency.
If the frequency stays the same but the amplitude decays, we get a dying-away tone. You can also alter the 'attack' of how quickly the tone starts, and the 'sustain' or how long it stays at a constant amplitude before the decay.
Further affects are got by adding simultaneous tones ( Fourier showed us how this can generate ANY wave shape). Interesting cases include the beats we get when you add two waves of similar frequency.
WAV files are basically a digital record of any chosen wave shape. Any time-dependent wave you can make programmatically can be turned into a WAV file. BUT there are a range of WAV file types, depending on whether you want stereo or mono; how many samples per second; whether you want 8-bit or 16-bit precision, etc. HOWEVER don't expect to calculate in real-time. Generate your sounds in advance and play the resulting wav files in your chosen time!
For experimental purposes the simplest I usually use is 11,025 samples per second, mono, 8 bit. 16 bit is a bit smoother, but files are twice as big and slower to calculate. I 'cheat' by using a stored preamble of 44 bytes with the correct bits set to this or to 16 bits, then complete the file ( or display on-screen as a waveform) The screen shot shows which parts do what- here it is for a 16 bit WAV file.
One of my programs generates the correct note for all the keys. Use mouseX to find where you clicked... and you have the beginnings of a synthesizer. It could be easily modified to give attack/sustain/decay or mix in harmonics to give different voices.
There are great programs to make wav files out there- particularly Thomas and Alyce's one from near twenty years ago on her website. There are also part-correct ones like bluatigro's.
nomainwin
'open an existing wav file of length 3 seconds,
'1 channel, 16 bits/sample, 11025 samples/second
'remember the first 44 bytes of preamble
goto [skip]' _____________________________ REMOVE to strip and save the preamble.
open "original.wav" for input as #fIn
i$ =input$( #fIn, 44)
close #fIn
'save preamble for re-use.
open "preamble.wav" for output as #fOut
#fOut i$;
close #fOut
'_____________________________________________
[skip]
WindowWidth = 980
WindowHeight = 840
global fOutOpen
open "Making WAV files" for graphics_nsb as #wg
#wg "trapclose quit"
#wg "down ; fill 160 160 60"
're-load the preamble bytes...
open "preamble.wav" for input as #fIn
c$ =input$( #fIn, lof( #fIn))
close #fIn
'and add on the new data as 33075 byte-pairs, then save
'frequency =440Hz, 1 channel, 16 bits, 11025 per second
'freqy =440
for n =49 to 73
'n =int( 49 +24 *rnd( 1)) ' in range 1 to 88 for piano keyboard
#wg " up ; goto 5 "; 80 +10 *( n -49); " ; down"
color =int( ( n -49) /24 *256)
#wg "color "; color; " 50 "; 255 -color
freqy =2^( ( n -49) /12) *440
amplt =2^15
fOutOpen =0
open "newWav" +right$( "000" +str$( n), 3) +".wav" for output as #fOut
fOutOpen =1
#fOut c$;
for i =1 to 33075
amplitudeOfWave =int( amplt *sin( i /11025 *freqy)) ' +/-2^15
#fOut bytePair$( amplitudeOfWave);
if i <=5000 then #wg "goto "; int( 5 +i /5); " "; int( 80 +10 *( n -49) +( amplitudeOfWave -128) /2^9)
scan
'freqy =freqy *1.00005 ' this exponentially increases freq'y
amplt =amplt *0.99985 ' this exponentially reduces volume
next i
close #fOut
'and finally play it...
playwave "newWav" +right$( "000" +str$( n), 3) +".wav", sync
next n
wait
end
function bytePair$( A) ' receives -2^15 to +2^15
if A <=0 then A =2^16 +A -1' else A =2^15 -A
hi =int( A /256)
lo =A -256 *hi'
bytePair$ =chr$( lo) +chr$( hi)
end function
sub quit h$
if fOutOpen =1 then close #fOut
close #h$
end
end sub