package com.teotigraphix.caustk.core.components.subsynth;
import com.teotigraphix.caustic.osc.SubSynthOscMessage;
import com.teotigraphix.caustk.core.components.ToneComponent;
public class Osc2Component extends ToneComponent {
//--------------------------------------------------------------------------
// API :: Properties
//--------------------------------------------------------------------------
//----------------------------------
// cents
//----------------------------------
private int cents = 0;
public int getCents() {
return cents;
}
int getCents(boolean restore) {
return (int)SubSynthOscMessage.OSC2_CENTS.query(getEngine(), getToneIndex());
}
public void setCents(int value) {
if (value == cents)
return;
if (value < -50 || value > 50)
throw newRangeException(SubSynthOscMessage.OSC2_CENTS.toString(), "-50..50", value);
cents = value;
SubSynthOscMessage.OSC2_CENTS.send(getEngine(), getToneIndex(), cents);
}
//----------------------------------
// octave
//----------------------------------
private int octave = 0;
public int getOctave() {
return octave;
}
int getOctave(boolean restore) {
return (int)SubSynthOscMessage.OSC2_OCTAVE.query(getEngine(), getToneIndex());
}
public void setOctave(int value) {
if (value == octave)
return;
if (value < -3 || value > 3)
throw newRangeException(SubSynthOscMessage.OSC2_OCTAVE.toString(), "-3..3", value);
octave = value;
SubSynthOscMessage.OSC2_OCTAVE.send(getEngine(), getToneIndex(), octave);
}
//----------------------------------
// phase
//----------------------------------
private float phase = 0f;
public float getPhase() {
return phase;
}
float getPhase(boolean restore) {
return SubSynthOscMessage.OSC2_PHASE.query(getEngine(), getToneIndex());
}
public void setPhase(float value) {
if (value == phase)
return;
if (value < -0.5f || value > 0.5f)
throw newRangeException(SubSynthOscMessage.OSC2_PHASE.toString(), "-0.5..0.5", value);
phase = value;
SubSynthOscMessage.OSC2_PHASE.send(getEngine(), getToneIndex(), phase);
}
//----------------------------------
// semis
//----------------------------------
private int semis = 0;
public int getSemis() {
return semis;
}
int getSemis(boolean restore) {
return (int)SubSynthOscMessage.OSC2_SEMIS.query(getEngine(), getToneIndex());
}
public void setSemis(int value) {
if (value == semis)
return;
if (value < -12 || value > 12)
throw newRangeException(SubSynthOscMessage.OSC2_SEMIS.toString(), "-12..12", value);
semis = value;
SubSynthOscMessage.OSC2_SEMIS.send(getEngine(), getToneIndex(), semis);
}
//----------------------------------
// waveForm
//----------------------------------
private WaveForm waveForm = WaveForm.NONE;
public WaveForm getWaveform() {
return waveForm;
}
WaveForm getWaveform(boolean restore) {
return WaveForm.toType(SubSynthOscMessage.OSC2_WAVEFORM.query(getEngine(), getToneIndex()));
}
public void setWaveform(WaveForm value) {
if (value == waveForm)
return;
waveForm = value;
SubSynthOscMessage.OSC2_WAVEFORM.send(getEngine(), getToneIndex(), waveForm.getValue());
}
public Osc2Component() {
}
@Override
public void restore() {
setCents(getCents(true));
setOctave(getOctave(true));
setPhase(getPhase(true));
setSemis(getSemis(true));
setWaveform(getWaveform(true));
}
public enum WaveForm {
/**
* Inactive oscillator.
*/
NONE(0),
/**
* A sine wave (1).
*/
SINE(1),
/**
* A saw wave (2).
*/
SAW(2),
/**
* A triangle wave (3).
*/
TRIANGLE(3),
/**
* A square wave (4).
*/
SQUARE(4),
/**
* A noise wave (5).
*/
NOISE(5),
/**
* A custom wave (6) <strong>N/A</strong>.
*/
CUSTOM(6);
private final int mValue;
/**
* Returns in integer value for the {@link WaveForm}.
*/
public int getValue() {
return mValue;
}
WaveForm(int value) {
mValue = value;
}
/**
* Returns a Waveform based off the passed integer type.
*
* @param type The int type.
*/
public static WaveForm toType(Integer type) {
for (WaveForm result : values()) {
if (result.getValue() == type)
return result;
}
return null;
}
/**
* @see #toType(Integer)
*/
public static WaveForm toType(Float type) {
return toType(type.intValue());
}
}
}