/*
* Envelope.java
* (FScape)
*
* Copyright (c) 2001-2016 Hanns Holger Rutz. All rights reserved.
*
* This software is published under the GNU General Public License v3+
*
*
* For further information, please contact Hanns Holger Rutz at
* contact@sciss.de
*
*
* Changelog:
* 21-May-05 more useful basic envelope
*/
package de.sciss.fscape.util;
import java.util.*;
/**
* @author Hanns Holger Rutz
* @version 0.71, 14-Nov-07
*/
public class Envelope
implements Cloneable
{
// -------- public variables --------
/**
* Fuer getBasicEnvelope
*/
public static final int BASIC_TIME = 0; // Mod. -100% ... +100%
public static final int BASIC_UNSIGNED_TIME = 1; // Mod. 0%.... +100%
public boolean atkState; // true = active; false = inactive
public boolean susState;
public boolean rlsState;
public int hUnit; // ABS_UNIT!
public int vUnit;
/**
* READ-ONLY!
*/
public Curve atkCurve;
public Curve susCurve;
public Curve rlsCurve;
// -------- private variables --------
// -------- public methods --------
/**
* Alle drei Kurventeile sind defaultmaessig aktiv
* ; einzelne Kurventeile duerfen null sein!
*/
public Envelope( Curve atkCurve, Curve susCurve, Curve rlsCurve )
{
this.atkCurve = atkCurve;
this.susCurve = susCurve;
this.rlsCurve = rlsCurve;
atkState = atkCurve != null;
susState = susCurve != null;
rlsState = rlsCurve != null;
if( susState ) {
hUnit = susCurve.hSpace.unit & Param.DIM_MASK;
vUnit = susCurve.vSpace.unit & Param.DIM_MASK;
} else if( atkState ) {
hUnit = atkCurve.hSpace.unit & Param.DIM_MASK;
vUnit = atkCurve.vSpace.unit & Param.DIM_MASK;
} else if( rlsState ) {
hUnit = rlsCurve.hSpace.unit & Param.DIM_MASK;
vUnit = rlsCurve.vSpace.unit & Param.DIM_MASK;
} else {
hUnit = Param.NONE;
vUnit = Param.NONE;
}
}
/**
* Clont vorgegebene Envelope
*/
public Envelope( Envelope src )
{
this.atkCurve = (Curve) src.atkCurve.clone();
this.susCurve = (Curve) src.susCurve.clone();
this.rlsCurve = (Curve) src.rlsCurve.clone();
this.atkState = src.atkState;
this.susState = src.susState;
this.rlsState = src.rlsState;
this.hUnit = src.hUnit;
this.vUnit = src.vUnit;
}
public Object clone()
{
return new Envelope( this );
}
/**
* Standard-Envelope erzeugen
*
* @param type BASIC_...
*/
public static Envelope createBasicEnvelope( int type )
{
Curve atkCurve, susCurve, rlsCurve;
ParamSpace atkHSpace, susHSpace, rlsHSpace;
ParamSpace vSpace = null;
Envelope basic;
if( type == BASIC_TIME ) {
vSpace = Constants.spaces[ Constants.modSpace ];
} else { // BASIC_UNSIGNED_TIME
vSpace = Constants.spaces[ Constants.unsignedModSpace ];
}
atkHSpace = new ParamSpace( Constants.spaces[ Constants.ratioTimeSpace ]);
// atkHSpace.max *= 0.1;
atkHSpace = new ParamSpace( atkHSpace.min, atkHSpace.max * 0.1, atkHSpace.inc, atkHSpace.unit );
susHSpace = new ParamSpace( Constants.spaces[ Constants.ratioTimeSpace ]);
// susHSpace.max *= 0.8;
rlsHSpace = new ParamSpace( Constants.spaces[ Constants.ratioTimeSpace ]);
// rlsHSpace.max *= 0.1;
rlsHSpace = new ParamSpace( rlsHSpace.min, rlsHSpace.max * 0.1, rlsHSpace.inc, rlsHSpace.unit );
atkCurve = new Curve( atkHSpace, vSpace );
atkCurve.addPoint( atkHSpace.min, 0.0 );
atkCurve.addPoint( atkHSpace.max, vSpace.max );
susCurve = new Curve( susHSpace, vSpace );
susCurve.addPoint( susHSpace.min, vSpace.min );
susCurve.addPoint( susHSpace.max, vSpace.max );
rlsCurve = new Curve( rlsHSpace, vSpace );
rlsCurve.addPoint( rlsHSpace.min, vSpace.max );
rlsCurve.addPoint( rlsHSpace.max, 0.0 );
basic = new Envelope( atkCurve, susCurve, rlsCurve );
basic.atkState = false;
basic.rlsState = false;
return basic;
}
// -------- StringComm methods --------
public String toString()
{
String atkCurveStr = "";
String susCurveStr = "";
String rlsCurveStr = "";
if( atkCurve != null ) atkCurveStr = atkCurve.toString();
if( susCurve != null ) susCurveStr = susCurve.toString();
if( rlsCurve != null ) rlsCurveStr = rlsCurve.toString();
return( "" + atkCurveStr + '|' + susCurveStr + '|' + rlsCurveStr + '|' +
atkState + '|' + susState + '|' + rlsState );
}
/**
* @param s MUST BE in the format as returned by Envelope.toString()
*/
public static Envelope valueOf( String s )
{
StringTokenizer strTok;
String tok;
Curve atkCurve = null;
Curve susCurve = null;
Curve rlsCurve = null;
Envelope env;
strTok = new StringTokenizer( s, "|" );
tok = strTok.nextToken();
if( tok.length() > 0 ) atkCurve = Curve.valueOf( tok );
tok = strTok.nextToken();
if( tok.length() > 0 ) susCurve = Curve.valueOf( tok );
tok = strTok.nextToken();
if( tok.length() > 0 ) rlsCurve = Curve.valueOf( tok );
env = new Envelope( atkCurve, susCurve, rlsCurve );
env.atkState = Boolean.valueOf( strTok.nextToken() ).booleanValue();
env.susState = Boolean.valueOf( strTok.nextToken() ).booleanValue();
env.rlsState = Boolean.valueOf( strTok.nextToken() ).booleanValue();
return env;
}
}
// class Envelope