Goto: [ Program Documentation ]

//
// Programmer:    Craig Stuart Sapp <craig@ccrma.stanford.edu>
// Creation Date: Thu Jun 12 21:08:27 GMT-0800 1997
// Last Modified: Thu Jun 12 21:08:30 GMT-0800 1997
// Filename:      ...sig/doc/examples/sig/sigfile/additive/additive.cpp
// Syntax:        C++; sig
//
// Description:   makes a soundfile with the specified moveable 
//		  frequency/cycles sinewave
//

#include "sigAudio.h"

#ifndef OLDCPP
   #include <iostream>
   using namespace std;
#else
   #include <iostream.h>
#endif

void exitUsage(const char* command);


int main(int argc, char* argv[]) {
   if (argc < 4)  exitUsage(argv[0]); 

   float duration;
   cout << "How many seconds does the sound last: ";
   cin  >> duration;

   int numSamples;
   numSamples = (int)(duration * 44100 + 0.5);
  
   SoundHeader header;
   header.setHighMono();

   int numOsc = (argc - 2)/2;

   // Elements:
   Osc          oscillator[numOsc];
   SoundFileOut outsound(argv[argc-1], header);
   Envelope     freqEnv[numOsc];
   Envelope     ampEnv[numOsc];
   Add          add;

   // Connections:
   for (int i=0; i<numOsc; i++) {
      freqEnv[i].setEnvelope(argv[2 * i + 1]);
      ampEnv[i].setEnvelope(argv[2 * i + 2]);
      freqEnv[i].setDurationSamples(numSamples);
      ampEnv[i].setDurationSamples(numSamples);

      oscillator[i].connect(freqEnv[i], 0);
      oscillator[i].connect(ampEnv[i], 1);
      add.connect(oscillator[i]);
   }
   outsound.connect(add);

   Action action;
   action.tick(outsound, numSamples);


   return 0;
}



void exitUsage(const char* command) {
   cout << endl;
   cout << 
      "Generates any number of oscillators with freq and amp envelopes."<< endl;
   cout << endl;
   cout << "Usage: " << command << " freqEnv1 ampEnv1 "
        << "[freqEnv2 ampEnv2 ...] outsound" << endl;
   cout << endl;
   cout << "Program input: " << endl;
   cout << "   (a) length of output sound in seconds" << endl;
   cout << endl;
   cout << "Example envelopes: pairs of time, amp points" << endl;
   cout << "   constant env of 1: \"(0 1; 100 1)\"  " << endl;
   cout << "   triangle env:      \"(0 0; 1 1; 2 0)\" " << endl;
   cout << "   ramp at begin/end: \"(0 0; 1000 1; s; 2000 0)\" " << endl;
   cout << "      with stick points time is given in samples. " << endl;
   cout << endl;

   exit(1);
}



// md5sum: 7b96e64136ec3ab2db63bc1214f3ae05 additive.cpp [20050403]