
// Sfront, a SAOL to C translator
// This file: simple test instrument written in SAOL.
// This license also covers the SASL file in this directory.
//
//
// Copyright (c) 1999-2006, Regents of the University of California
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//  Redistributions of source code must retain the above copyright
//  notice, this list of conditions and the following disclaimer.
//
//  Redistributions in binary form must reproduce the above copyright
//  notice, this list of conditions and the following disclaimer in the
//  documentation and/or other materials provided with the distribution.
//
//  Neither the name of the University of California, Berkeley nor the
//  names of its contributors may be used to endorse or promote products
//  derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//    Maintainer: John Lazzaro, lazzaro@cs.berkeley.edu
//


// simple envelope follower, uses the notes held down on the
// MIDI controller connected to the MIDI In jack to set the
// note values, uses the signal energy of the microphone input
// signal on the sound card to shape the envelope of the sound.

global { 
  inchannels 1; 
  outchannels 1; 
  srate 44100; 
  krate 1050; 
  send(ampl; ; input_bus);
  ksig voice;
  } 
 

instr ampl () { 
 exports ksig voice;

 voice = 50*rms(input,0.050);
} 

instr sine (pitch, vel) preset 0 { 

  // declarations
 
  ivar a;       // sets osc f
  ivar attack,release, attlim, ktime, stime;
  ksig incr, rel, tot;
  asig x, y;    // osc state
  asig init;
  asig env;
  ksig tmp;
  imports ksig voice;

  // **********************
  // computed during i-passl
  // **********************

  ktime = 1/k_rate;
  stime = 1/s_rate;

  // change these for envelope
  // should be of k-rate granularity

  

  attack = int(0.005/ktime)*ktime;
  release = int(0.060/ktime)*ktime;

  attlim = attack - 0.5*ktime;

  // turns MIDI number into 
  // oscillator constant 

  a = 2.0*sin(3.14159*cpsmidi(pitch - 12)*stime);

  // **********************
  // computed during k-pass
  // **********************

  incr = 0;
  if (released && !rel)
    {
      rel = 1;
      extend(release);
    }
  if ((!rel) && (itime < attlim))
    {
      incr = stime/attack;
      tot = tot + ktime/attack;
    }
  if (rel)
    {
      incr = -tot*stime/(release+2*ktime);
    }
    

  // **********************
  // computed during a-pass
  // **********************

  if (init == 0)
    {
      x = 0.25;
      init = 1;
    }

  x = x - a*y;
  y = y + a*x;
  env = env + incr;
  
  output(voice*env*y);
  } 









