Goto: [ Program Documentation ]

//
// Programmer:    Craig Stuart Sapp <craig@ccrma.stanford.edu>
// Creation Date: Mon May 19 22:45:43 GMT-0800 1997
// Last Modified: Mon May 19 22:45:47 GMT-0800 1997
// Filename:      ...sig/doc/examples/sig/sigfile/precedence/precedence.cpp
// Syntax:        C++; sig
//
// Description:   for demonstration of the precedence effect.
//

#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 == 1) exitUsage(argv[0]);

   SoundHeader header;
   char* infilename = "";
   char* infilename2 = "";
   char* outfilename = NULL;
   float impulseAmp = 0.9;
   long numSamples = 0;

   if (argc == 2) {            // no input sound
      header.setHighStereo();
      outfilename = argv[1];
      cout << "What is the duration of the output file in seconds: ";
      float temp;
      cin >> temp;
      numSamples = (long)(temp * 44100);
   } else if (argc == 3) {     // input file specified
      header.setHeader(argv[1]);
      numSamples = header.getSamples();
      outfilename = argv[2];
      infilename = argv[1];
   } else if (argc == 4) {     // two input files specified
      header.setHeader(argv[1]);
      numSamples = header.getSamples();
      outfilename = argv[3];
      infilename = argv[1];
      infilename2 = argv[2];
   } else {
      exitUsage(argv[0]); 
   }

   int sampleDelay;
   cout << "Enter the number of samples to offset the sound by: ";
   cin  >> sampleDelay;
   cout << "That is a delay of " << (double)sampleDelay / 
           header.getSrate() * 1000 << " milliseconds." << endl;
   numSamples += sampleDelay;

   header.setChannels(2);
   // Elements:
   SoundFileIn  insound(infilename);
   SoundFileIn  insound2(infilename2);
   SoundFileOut outsound(outfilename, header);
   Delayline    delay(sampleDelay);
   Impulse      impulse(20000, impulseAmp);

   // Connections:
   if (strlen(infilename2) != 0) {               // use two input files
      outsound.connect(insound, 0);
      outsound.connect(delay, 1);
      delay.connect(insound2, 0);
   } else if (strlen(infilename) == 0) {         // use impulse
      outsound.connect(impulse, 0);      
      outsound.connect(delay, 1);
      delay.connect(impulse);
   } else {                                      // use input file
      outsound.connect(insound, 0);
      outsound.connect(delay, 1);
      delay.connect(insound, 0);
   }

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

   return 0;
}



void exitUsage(const char* command) {
   cout << endl;
   cout << 
      "Generates precedence effect examples by delaying a sound by the" << endl;
   cout <<
      "specified number of samples. Try 1-30 samples at 44.1 kHz." << endl;
   cout << endl;
   cout << "Usage: " << command << " [insound1] [insound2] outsound"<< endl;
   cout << endl;
   cout << "Program input: " << endl;
   cout << "   (a) duration of the output sound (if no input soundfile)"<< endl;
   cout << "   (b) sample delay between channels" << endl;
   cout << endl;

   exit(1);
}



// md5sum: bd05759d7e4e52824b9188c0085f5cd5 precedence.cpp [20050403]