mirror of
https://github.com/thestk/stk
synced 2026-01-11 12:01:52 +00:00
88 lines
2.3 KiB
C++
88 lines
2.3 KiB
C++
/******************************************/
|
|
/*
|
|
Example program to write N sine tones to
|
|
an N channel soundfile.
|
|
|
|
By default, the program will write an
|
|
N channel WAV file. However, it is
|
|
simple to change the file type argument
|
|
in the FileWvOut constructor.
|
|
|
|
By Gary P. Scavone, 2000 - 2002.
|
|
*/
|
|
/******************************************/
|
|
|
|
#include "SineWave.h"
|
|
#include "FileWvOut.h"
|
|
#include <cstdlib>
|
|
|
|
using namespace stk;
|
|
|
|
void usage(void) {
|
|
// Error function in case of incorrect command-line
|
|
// argument specifications.
|
|
std::cout << "\nuseage: sine N file time fs\n";
|
|
std::cout << " where N = number of channels (sines),\n";
|
|
std::cout << " file = the .wav file to create,\n";
|
|
std::cout << " time = the amount of time to record (in seconds),\n";
|
|
std::cout << " and fs = the sample rate (in Hz).\n\n";
|
|
exit( 0 );
|
|
}
|
|
|
|
int main( int argc, char *argv[] )
|
|
{
|
|
float base_freq = 220.0;
|
|
int i;
|
|
|
|
// Minimal command-line checking.
|
|
if ( argc != 5 ) usage();
|
|
|
|
int channels = (int) atoi( argv[1] );
|
|
double time = atof( argv[3] );
|
|
double srate = atof( argv[4] );
|
|
|
|
// Create our object instances.
|
|
FileWvOut output;
|
|
SineWave **oscs = (SineWave **) malloc( channels * sizeof(SineWave *) );
|
|
for ( i=0; i<channels; i++ ) oscs[i] = 0;
|
|
|
|
// If you want to change the default sample rate (set in Stk.h), do
|
|
// it before instantiating any objects!!
|
|
Stk::setSampleRate( srate );
|
|
|
|
// Define the sinewaves.
|
|
for ( i=0; i<channels; i++ )
|
|
oscs[i] = new SineWave;
|
|
|
|
// Set oscillator frequency(ies) here ... somewhat random.
|
|
for ( i=0; i<channels; i++ )
|
|
oscs[i]->setFrequency( base_freq + i*(45.0) );
|
|
|
|
long nFrames = (long) ( time * Stk::sampleRate() );
|
|
StkFrames frames( nFrames, channels );
|
|
|
|
// Open the soundfile for output. Other file format options
|
|
// include: FILE_SND, FILE_AIF, FILE_MAT, and FILE_RAW. Other data
|
|
// type options include: STK_SINT8, STK_INT24, STK_SINT32,
|
|
// STK_FLOAT32, and STK_FLOAT64.
|
|
try {
|
|
output.openFile( argv[2], channels, FileWrite::FILE_WAV, Stk::STK_SINT16 );
|
|
}
|
|
catch ( StkError & ) {
|
|
goto cleanup;
|
|
}
|
|
|
|
// Here's the runtime code ... no loop
|
|
for ( i=0; i<channels; i++ )
|
|
oscs[i]->tick( frames, i );
|
|
|
|
output.tick( frames );
|
|
|
|
cleanup:
|
|
for ( i=0; i<channels; i++ )
|
|
delete oscs[i];
|
|
free( oscs );
|
|
|
|
return 0;
|
|
}
|