package com.teotigraphix.caustk.core.components; import com.teotigraphix.caustic.osc.FilterMessage; public class SynthFilterComponent extends FilterComponentBase { //-------------------------------------------------------------------------- // // IFilter API :: Properties // //-------------------------------------------------------------------------- //---------------------------------- // attack //---------------------------------- private float attack = 0f; public float getAttack() { return attack; } float getAttack(boolean restore) { return FilterMessage.FILTER_ATTACK.query(getEngine(), getToneIndex()); } public void setAttack(float value) { if (value == attack) return; if (value < 0 || value > 3.0625f) throw newRangeException(FilterMessage.FILTER_ATTACK.toString(), "0..3.0625", value); attack = value; FilterMessage.FILTER_ATTACK.send(getEngine(), getToneIndex(), attack); } //---------------------------------- // decay //---------------------------------- private float decay = 0f; public float getDecay() { return decay; } float getDecay(boolean restore) { return FilterMessage.FILTER_DECAY.query(getEngine(), getToneIndex()); } public void setDecay(float value) { if (value == decay) return; if (value < 0 || value > 3.0625f) throw newRangeException(FilterMessage.FILTER_DECAY.toString(), "0..3.0625", value); decay = value; FilterMessage.FILTER_DECAY.send(getEngine(), getToneIndex(), decay); } //---------------------------------- // release //---------------------------------- private float release = 1.5f; public float getRelease() { return release; } float getRelease(boolean restore) { return FilterMessage.FILTER_RELEASE.query(getEngine(), getToneIndex()); } public void setRelease(float value) { if (value == release) return; if (value < 0 || value > 3.0625f) throw newRangeException(FilterMessage.FILTER_RELEASE.toString(), "0..3.0625", value); release = value; FilterMessage.FILTER_RELEASE.send(getEngine(), getToneIndex(), release); } //---------------------------------- // sustain //---------------------------------- private float sustain = 1.0f; public float getSustain() { return sustain; } float getSustain(boolean restore) { return FilterMessage.FILTER_SUSTAIN.query(getEngine(), getToneIndex()); } public void setSustain(float value) { if (value == sustain) return; if (value < 0 || value > 1.0f) throw newRangeException(FilterMessage.FILTER_SUSTAIN.toString(), "0..1.0", value); sustain = value; FilterMessage.FILTER_SUSTAIN.send(getEngine(), getToneIndex(), sustain); } //---------------------------------- // track //---------------------------------- private float track = 0f; public float getTrack() { return track; } float getTrack(boolean restore) { return FilterMessage.FILTER_KBTRACK.query(getEngine(), getToneIndex()); } public void setTrack(float value) { if (value == track) return; if (value < 0 || value > 1.0f) throw newRangeException(FilterMessage.FILTER_KBTRACK.toString(), "0..1.0", value); track = value; FilterMessage.FILTER_KBTRACK.send(getEngine(), getToneIndex(), track); } //---------------------------------- // type //---------------------------------- private FilterType type = FilterType.NONE; public FilterType getType() { return type; } FilterType getType(boolean restore) { return FilterType.toType(FilterMessage.FILTER_TYPE.query(getEngine(), getToneIndex())); } public void setType(FilterType value) { if (value == type) return; type = value; FilterMessage.FILTER_TYPE.send(getEngine(), getToneIndex(), type.getValue()); } public SynthFilterComponent() { } @Override public void restore() { super.restore(); setAttack(getAttack(true)); setDecay(getDecay(true)); setRelease(getRelease(true)); setSustain(getSustain(true)); try { setTrack(getTrack(true)); } catch (IllegalArgumentException e) { // PCMSynth dosn't have tracking } setType(getType(true)); } /** * The {@link IFilter#getType()} type enumeration. * * @author Michael Schmalle * @copyright Teoti Graphix, LLC * @since 1.0 */ public enum FilterType { //-------------------------------------------------------------------------- // // Public :: Values // //-------------------------------------------------------------------------- /** * No filter applied. */ NONE(0), /** * The low pass filter. */ LOW_PASS(1), /** * The high pass filter. */ HIGH_PASS(2), /** * The band pass filter. */ BAND_PASS(3), /** * The inverted low pass filter. */ INV_LP(4), /** * The inverted high pass filter. */ INV_HP(5), /** * The inverted band pass filter. */ INV_BP(6); //-------------------------------------------------------------------------- // // Public :: Properties // //-------------------------------------------------------------------------- //---------------------------------- // value //---------------------------------- private final int value; /** * The Integer value for the filter type. */ public int getValue() { return value; } FilterType(int type) { value = type; } /** * Returns a {@link FilterType} for the integer passed, null if not * found. * * @param type The filter type. */ public static FilterType toType(Integer type) { for (FilterType result : values()) { if (result.getValue() == type) return result; } return null; } /** * @see #toType(Integer) */ public static FilterType toType(Float type) { return toType(type.intValue()); } } }