Goto: [ Program Documentation ]

//
// Programmer:    Craig Stuart Sapp <craig@ccrma.stanford.edu>
// Creation Date: Wed Nov 19 00:39:03 GMT-0800 1997
// Last Modified: Wed Nov 19 00:39:00 GMT-0800 1997
// Filename:      ...sig/doc/examples/sig/sigfile/hybrid-ring/hybrid-ring.cpp
// Syntax:        C++; sig
//
// a ring modulator with additional mixing of input sound
//

#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[]) {
   char* infile = NULL;
   char* outfile = NULL;
   char* modenv = NULL;
   char* inampenv = NULL;
   char* freqenv = NULL;

   if (argc == 6) {
      freqenv = argv[1];
      modenv = argv[2];
      inampenv = argv[3];
      infile = argv[4];
      outfile = argv[5];
   } else if (argc == 5) {
      freqenv = argv[1];
      modenv = argv[2];
      inampenv = "(0 0; 1 0)";
      infile = argv[3];
      outfile = argv[4];
   } else if (argc == 4) {
      freqenv = argv[1];
      modenv = "(0 1; 1 1)";
      inampenv = "(0 0; 1 0)";
      infile = argv[2];
      outfile = argv[3];
   } else {
      exitUsage(argv[0]); 
   }

   SoundHeader header(infile);

   // Elements:
   SoundFileIn  insound(infile);
   Envelope     freqEnv(freqenv, header.getSamples());
   Envelope     modEnv(modenv, header.getSamples());
   Envelope     inampEnv(inampenv, header.getSamples());
   Osc          oscillator;
   SoundFileOut outsound(outfile, header);
   Multiply     ringmodLeft, ringmodRight;
   Add          mixLeft, mixRight;
   Multiply     mulLeft, mulRight;

   // Connections:
   outsound.connect(mixLeft);
   if (header.getChannels() == 2) {
      outsound.connect(mixRight);
   }
   mixLeft.connect(ringmodLeft);
   mixLeft.connect(mulLeft);
   mixRight.connect(ringmodRight);
   mixRight.connect(mulRight);
   mulLeft.connect(insound);
   mulLeft.connect(inampEnv);
   mulRight.connect(insound, 0, 1);
   mulRight.connect(inampEnv, 1);
   ringmodLeft.connect(insound);
   ringmodLeft.connect(oscillator);
   ringmodRight.connect(insound, 0, 1);
   ringmodRight.connect(oscillator);
   oscillator.connect(freqEnv, 0);
   oscillator.connect(modEnv, 1);

   Action action;
   action.tick(outsound, header.getSamples());


   return 0;
}



void exitUsage(const char* command) {
   cout << endl;
   cout << "A ring modulator with input sound mixing control." << endl;
   cout << "Creates an oscillator which is multiplied with the input sound." 
        << endl;
   cout << endl;
   cout << "Usage: " << command 
        << " freqEnv [modEnv [inampenv]] insound outsound" 
        << endl;
   cout << endl;
   cout << "   freqEnv  = frequency envelope of modulating oscillator" << endl;
   cout << "   modEnv   = amplitude of modulating oscillator" << endl;
   cout << "              defaults to \"(0 1; 1 1)\" if not specified." << endl;
   cout << "   inampEnv = amplitude of input soundfile mixed into output" 
   << endl;
   cout << "              defaults to \"(0 0; 1 0)\" if not specified." << endl;
   cout << endl;
   cout << "Example envelope strings: pairs of time, freq or amp" << endl;
   cout << "   constant env of 440: \"(0 440; 100 440)\"  " << endl;
   cout << "   triangle env:      \"(0 0; 1 800; 2 0)\" " << endl;
   cout << "   ramp at begin/end: \"(0 0; 1000 100; s; 2000 0)\" " << endl;
   cout << "      with stick points time is given in samples. " << endl;
   cout << endl;

   exit(1);
}



// md5sum: 77c8646f344dc1d43b0e42f03b2a599f hybrid-ring.cpp [20050403]