1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
|
/************************************************************************
FAUST Architecture File
Copyright (C) 2021 Mike Oliphant
---------------------------------------------------------------------
This Architecture section is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; If not, see <http://www.gnu.org/licenses/>.
EXCEPTION : As a special exception, you may create a larger work
that contains this FAUST architecture section and distribute
that work under terms of your choice, so long as this FAUST
architecture section is not modified.
************************************************************************
************************************************************************/
using System;
using System.Collections.Generic;
public class FaustMetaData
{
Dictionary<string, string> metaData = new Dictionary<string, string>();
public void Declare(String name, String value)
{
metaData[name] = value;
}
public string GetValue(string name)
{
if (!metaData.ContainsKey(name))
return null;
return metaData[name];
}
}
public class FaustVariableAccessor
{
public string ID { get; set; }
public Action<double> SetValue { get; set; }
public Func<double> GetValue { get; set; }
}
public enum EFaustUIBoxType
{
}
public enum EFaustUIElementType
{
TabBox,
HorizontalBox,
VerticalBox,
Button,
CheckBox,
VerticalSlider,
HorizontalSlider,
NumEntry,
HorizontalBargraph,
VerticalBargraph
}
public class FaustUIElement
{
public EFaustUIElementType ElementType { get; set; }
public string Label { get; set; }
}
public class FaustBoxElement : FaustUIElement
{
public List<FaustUIElement> Children { get; set; }
public FaustBoxElement(EFaustUIElementType elementType, string label)
{
this.ElementType = elementType;
this.Label = label;
this.Children = new List<FaustUIElement>();
}
}
public class FaustUIVariableElement : FaustUIElement
{
public FaustVariableAccessor VariableAccessor { get; set; }
public FaustUIVariableElement(EFaustUIElementType elementType, string label, FaustVariableAccessor variableAccessor)
{
this.ElementType = elementType;
this.Label = label;
this.VariableAccessor = variableAccessor;
}
}
public class FaustUIFloatElement : FaustUIVariableElement
{
public double MinValue { get; set; }
public double MaxValue { get; set; }
public FaustUIFloatElement(EFaustUIElementType elementType, string label, FaustVariableAccessor variableAccessor, double minValue, double maxValue)
: base(elementType, label, variableAccessor)
{
this.MinValue = minValue;
this.MaxValue = maxValue;
}
}
public class FaustUIWriteableFloatElement : FaustUIFloatElement
{
public double Step { get; set; }
public double DefaultValue { get; set; }
public FaustUIWriteableFloatElement(EFaustUIElementType elementType, string label, FaustVariableAccessor variableAccessor, double defaultValue, double minValue, double maxValue, double step)
: base(elementType, label, variableAccessor, minValue, maxValue)
{
this.DefaultValue = defaultValue;
this.Step = step;
}
}
public class FaustUIDefinition
{
public FaustUIElement RootElement { get; set; }
Stack<FaustBoxElement> boxStack = new Stack<FaustBoxElement>();
public void DeclareElementMetaData(string elemendID, string key, string value)
{
}
public void StartBox(FaustBoxElement box)
{
if (boxStack.Count == 0)
{
RootElement = box;
}
else
{
boxStack.Peek().Children.Add(box);
}
boxStack.Push(box);
}
public void EndBox()
{
boxStack.Pop();
}
public void AddElement(FaustUIElement element)
{
boxStack.Peek().Children.Add(element);
}
}
public interface IFaustDSP
{
FaustUIDefinition UIDefinition { get; }
FaustMetaData MetaData { get; }
int GetNumInputs();
int GetNumOutputs();
void ClassInit(int sample_rate);
void InstanceConstants(int sample_rate);
void InstanceResetUserInterface();
void InstanceClear();
void Init(int sample_rate);
void InstanceInit(int sample_rate);
void Compute(int count, double[][] inputs, double[][] outputs);
}
public class dsp
{
public FaustUIDefinition UIDefinition { get; private set; }
public FaustMetaData MetaData { get; private set; }
public dsp()
{
UIDefinition = new FaustUIDefinition();
MetaData = new FaustMetaData();
}
public static double FMod(double val1, double val2)
{
return val1 % val2;
}
public static float FModF(float val1, float val2)
{
return val1 % val2;
}
public static bool IsInfinity(double d)
{
return double.IsNegativeInfinity(d) || double.IsPositiveInfinity(d);
}
public static bool IsInfinityF(float d)
{
return float.IsNegativeInfinity(d) || float.IsPositiveInfinity(d);
}
}
|