fms1961
Well-known member
As mentioned some time before, I'm opening this thread for further discussion of the ongoing development of the "Audio System Design Tool".
After the last merge, I "killed" all my changes - but thanks to goog development and versioning tools, I was able to restore my changes.
What's going on? Some topics in short words:
1. the node definition has to be integrated as real JavaScript object, because some properties are not "transportable" via stringyfied JSON.
2. the node definition had been extended. Definition of value ranges, validation callbacks, editor component description, source generation rules ...
3. with this, the editor dialog template per node is gone. The dialogs will be build on the fly following the descriptions in the node definition object
4. A new "loop" node holds arbitrary code to put in the "loop" section of the resulting source code (first step in code gen. of a complete sketch)
As this version is unstable, I won't create any pull request - for testing, clone my fork on https://github.com/mamuesp/Audio, change to the direcgtory "gui" and open the file "index.html" direct in the browser - this should work fine.
The next steps will be:
1. complete the node definitions
2. complete the export function
3. expand the import function (which may then also interpret the parameter settings of the components
4. implement the "loop" node
Some dialog screenshots:
Here are some examples of the expanded node description: (the node definitions are not finished yet!) If questions will arise, please feel free to ask.
(is there any possibility to limit the height of a HTML box?)
After the last merge, I "killed" all my changes - but thanks to goog development and versioning tools, I was able to restore my changes.
What's going on? Some topics in short words:
1. the node definition has to be integrated as real JavaScript object, because some properties are not "transportable" via stringyfied JSON.
2. the node definition had been extended. Definition of value ranges, validation callbacks, editor component description, source generation rules ...
3. with this, the editor dialog template per node is gone. The dialogs will be build on the fly following the descriptions in the node definition object
4. A new "loop" node holds arbitrary code to put in the "loop" section of the resulting source code (first step in code gen. of a complete sketch)
As this version is unstable, I won't create any pull request - for testing, clone my fork on https://github.com/mamuesp/Audio, change to the direcgtory "gui" and open the file "index.html" direct in the browser - this should work fine.
The next steps will be:
1. complete the node definitions
2. complete the export function
3. expand the import function (which may then also interpret the parameter settings of the components
4. implement the "loop" node
Some dialog screenshots:
Here are some examples of the expanded node description: (the node definitions are not finished yet!) If questions will arise, please feel free to ask.
(is there any possibility to limit the height of a HTML box?)
HTML:
<script type="text/javascript">
var nodes = {
"AudioInputI2S": {
"type": "AudioInputI2S",
"data": {
"defaults": {
"name": {
"value": "i2s"
}
},
"shortName": "i2s",
"inputs": 0,
"outputs": 2,
"category": "input-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioInputAnalog": {
"type": "AudioInputAnalog",
"data": {
"defaults": {
"name": {
"value": "adc"
},
"pin": {
"value": "A2",
"call": "(###pin###)",
"input": "text",
"label": "Pin"
}
},
"shortName": "adc",
"inputs": 0,
"outputs": 1,
"category": "input-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioInputI2Sslave": {
"type": "AudioInputI2Sslave",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "i2ss",
"inputs": 0,
"outputs": 2,
"category": "input-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioOutputI2S": {
"type": "AudioOutputI2S",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "i2s",
"inputs": 2,
"outputs": 0,
"category": "output-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioOutputSPDIF": {
"type": "AudioOutputSPDIF",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "spdif",
"inputs": 2,
"outputs": 0,
"category": "output-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioOutputAnalog": {
"type": "AudioOutputAnalog",
"data": {
"defaults": {
"name": {
"value": "dac"
}
},
"shortName": "dac",
"inputs": 1,
"outputs": 0,
"category": "output-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioOutputPWM": {
"type": "AudioOutputPWM",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "pwm",
"inputs": 1,
"outputs": 0,
"category": "output-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioOutputI2Sslave": {
"type": "AudioOutputI2Sslave",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "i2ss",
"inputs": 2,
"outputs": 0,
"category": "output-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioMixer4": {
"type": "AudioMixer4",
"data": {
"defaults": {
"name": {
"value": "mixer"
},
"gain0": {
"value": 0.25,
"call": ".gain(0, ###gain0###)",
"validate": RED.nodes.isValidRange,
"min": 0.0,
"max": 1.0,
"input": "text",
"label": "Gain chan. 0"
},
"gain1": {
"value": 0.25,
"call": ".gain(1, ###gain1###)",
"validate": RED.nodes.isValidRange,
"min": 0.0,
"max": 1.0,
"input": "text",
"label": "Gain chan. 1"
},
"gain2": {
"value": 0.25,
"call": ".gain(2, ###gain2###)",
"validate": RED.nodes.isValidRange,
"min": 0.0,
"max": 1.0,
"input": "text",
"label": "Gain chan. 2"
},
"gain3": {
"value": 0.25,
"call": ".gain(3, ###gain3###)",
"validate": RED.nodes.isValidRange,
"min": 0.0,
"max": 1.0,
"input": "text",
"label": "Gain chan. 3"
}
},
"shortName": "mixer",
"inputs": 4,
"outputs": 1,
"category": "mixer-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioPlayMemory": {
"type": "AudioPlayMemory",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "playMem",
"inputs": 0,
"outputs": 1,
"category": "play-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioPlaySdWav": {
"type": "AudioPlaySdWav",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "playSdWav",
"inputs": 0,
"outputs": 2,
"category": "play-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioPlaySdRaw": {
"type": "AudioPlaySdRaw",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "playSdRaw",
"inputs": 0,
"outputs": 1,
"category": "play-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioPlaySerialflashRaw": {
"type": "AudioPlaySerialflashRaw",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "playFlashRaw",
"inputs": 0,
"outputs": 1,
"category": "play-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioPlayQueue": {
"type": "AudioPlayQueue",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "queue",
"inputs": 0,
"outputs": 1,
"category": "play-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioRecordQueue": {
"type": "AudioRecordQueue",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "queue",
"inputs": 1,
"outputs": 0,
"category": "record-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioSynthWaveformSine": {
"type": "AudioSynthWaveformSine",
"data": {
"defaults": {
"name": {
"value": "sine"
},
"amplitude": {
"value": "0.5",
"validate": RED.nodes.isValidRange,
"min": 0,
"max": 1,
"input": "text",
"label": "Amplitude"
},
"frequency": {
"value": "1000",
"validate": RED.nodes.isValidRange,
"min": 0,
"max": 22000,
"input": "text",
"label": "Frequency"
},
"phase": {
"value": "0",
"validate": RED.nodes.isValidRange,
"min": 0,
"max": 360,
"input": "text",
"label": "Phase"
}
},
"shortName": "sine",
"inputs": 0,
"outputs": 1,
"category": "synth-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioSynthWaveformSineModulated": {
"type": "AudioSynthWaveformSineModulated",
"data": {
"defaults": {
"name": {
"value": "sine_fm"
},
"amplitude": {
"value": "0.5",
"validate": RED.nodes.isValidRange,
"min": 0,
"max": 1,
"input": "text",
"label": "Amplitude"
},
"frequency": {
"value": "1000",
"validate": RED.nodes.isValidRange,
"min": 0,
"max": 22000,
"input": "text",
"label": "Frequency"
},
"phase": {
"value": "0",
"validate": RED.nodes.isValidRange,
"min": 0,
"max": 360,
"input": "text",
"label": "Phase"
}
},
"shortName": "sine_fm",
"inputs": 1,
"outputs": 1,
"category": "synth-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioSynthWaveform": {
"type": "AudioSynthWaveform",
"data": {
"defaults": {
"name": {
"value": "new"
},
"waveform": {
"value": 0,
"data": ["WAVEFORM_SINE", "WAVEFORM_SAWTOOTH", "WAVEFORM_SAWTOOTH_REVERSE", "WAVEFORM_SQUARE", "WAVEFORM_TRIANGLE", "WAVEFORM_ARBITRARY", "WAVEFORM_PULSE", "WAVEFORM_SAMPLE_HOLD"],
"validate": RED.nodes.isValidRange,
"min": 0,
"max": 7,
"input": "select",
"label": "Waveform"
},
"amplitude": {
"value": "0.5",
"validate": RED.nodes.isValidRange,
"min": 0,
"max": 1,
"input": "text",
"label": "Amplitude"
},
"frequency": {
"value": "1000",
"validate": RED.nodes.isValidRange,
"min": 0,
"max": 22000,
"input": "text",
"label": "Frequency"
},
"phase": {
"value": "0",
"validate": RED.nodes.isValidRange,
"min": 0,
"max": 360,
"input": "text",
"label": "Phase"
}
},
"shortName": "waveform",
"inputs": 0,
"outputs": 1,
"category": "synth-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioSynthToneSweep": {
"type": "AudioSynthToneSweep",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "tonesweep",
"inputs": 0,
"outputs": 1,
"category": "synth-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioSynthWaveformDc": {
"type": "AudioSynthWaveformDc",
"data": {
"defaults": {
"name": {
"value": "new"
},
"amplitude": {
"value": "0.5",
"validate": RED.nodes.isValidRange,
"min": 0,
"max": 1,
"input": "text",
"label": "Amplitude"
},
"period": {
"value": "10",
"call": "insert",
"validate": RED.nodes.isValidRange,
"min": 0,
"max": 100000,
"input": "text",
"label": "Period"
}
},
"shortName": "dc",
"inputs": 0,
"outputs": 1,
"category": "synth-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioSynthNoiseWhite": {
"type": "AudioSynthNoiseWhite",
"data": {
"defaults": {
"name": {
"value": "new"
},
"amplitude": {
"value": "0.5",
"validate": RED.nodes.isValidRange,
"min": 0,
"max": 1,
"input": "text",
"label": "Amplitude"
}
},
"shortName": "noise",
"inputs": 0,
"outputs": 1,
"category": "synth-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioSynthNoisePink": {
"type": "AudioSynthNoisePink",
"data": {
"defaults": {
"name": {
"value": "new"
},
"amplitude": {
"value": "0.5",
"validate": RED.nodes.isValidRange,
"min": 0,
"max": 1,
"input": "text",
"label": "Amplitude"
}
},
"shortName": "pink",
"inputs": 0,
"outputs": 1,
"category": "synth-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioEffectFade": {
"type": "AudioEffectFade",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "fade",
"inputs": 1,
"outputs": 1,
"category": "effect-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioEffectChorus": {
"type": "AudioEffectChorus",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "chorus",
"inputs": 1,
"outputs": 1,
"category": "effect-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioEffectFlange": {
"type": "AudioEffectFlange",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "flange",
"inputs": 1,
"outputs": 1,
"category": "effect-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioEffectEnvelope": {
"type": "AudioEffectEnvelope",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "envelope",
"inputs": 1,
"outputs": 1,
"category": "effect-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioEffectMultiply": {
"type": "AudioEffectMultiply",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "multiply",
"inputs": 2,
"outputs": 1,
"category": "effect-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioEffectDelay": {
"type": "AudioEffectDelay",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "delay",
"inputs": 1,
"outputs": 8,
"category": "effect-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioEffectDelayExternal": {
"type": "AudioEffectDelayExternal",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "delayExt",
"inputs": 1,
"outputs": 8,
"category": "effect-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioEffectBitcrusher": {
"type": "AudioEffectBitcrusher",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "bitcrusher",
"inputs": 1,
"outputs": 1,
"category": "effect-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioFilterBiquad": {
"type": "AudioFilterBiquad",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "biquad",
"inputs": 1,
"outputs": 1,
"category": "filter-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioFilterFIR": {
"type": "AudioFilterFIR",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "fir",
"inputs": 1,
"outputs": 1,
"category": "filter-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioFilterStateVariable": {
"type": "AudioFilterStateVariable",
"data": {
"defaults": {
"name": {
"value": "new"
},
"frequency": {
"value": 0
},
"resonance": {
"value": 0
},
"octaveControl": {
"value": 0
}
},
"shortName": "filter",
"inputs": 2,
"outputs": 3,
"category": "filter-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioAnalyzePeak": {
"type": "AudioAnalyzePeak",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "peak",
"inputs": 1,
"outputs": 0,
"category": "analyze-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioAnalyzeFFT256": {
"type": "AudioAnalyzeFFT256",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "fft256",
"inputs": 1,
"outputs": 0,
"category": "analyze-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioAnalyzeFFT1024": {
"type": "AudioAnalyzeFFT1024",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "fft1024",
"inputs": 1,
"outputs": 0,
"category": "analyze-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioAnalyzeToneDetect": {
"type": "AudioAnalyzeToneDetect",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "tone",
"inputs": 1,
"outputs": 0,
"category": "analyze-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioAnalyzePrint": {
"type": "AudioAnalyzePrint",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "print",
"inputs": 1,
"outputs": 0,
"category": "analyze-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioControlSGTL5000": {
"type": "AudioControlSGTL5000",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "sgtl5000",
"inputs": 0,
"outputs": 0,
"category": "control-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioControlAK4558": {
"type": "AudioControlAK4558",
"data": {
"defaults": {
"name": {
"value": "new"
},
"volume": {
"value": 0.25,
"validate": RED.nodes.isValidRange,
"min": 0.0,
"max": 1.0,
"input": "text",
"label": "Volume"
},
"volumeLeft": {
"value": 0.25,
"validate": RED.nodes.isValidRange,
"min": 0.0,
"max": 1.0,
"input": "text",
"label": "Left volume"
},
"volumeRight": {
"value": 0.25,
"validate": RED.nodes.isValidRange,
"min": 0.0,
"max": 1.0,
"input": "text",
"label": "Right volume"
},
"inputSelect": {
"value": "n.a.",
"input": "display",
"label": "Input select"
}
},
"shortName": "ak4558",
"inputs": 0,
"outputs": 0,
"category": "control-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioControlWM8731": {
"type": "AudioControlWM8731",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "wm8731",
"inputs": 0,
"outputs": 0,
"category": "control-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioControlWM8731master": {
"type": "AudioControlWM8731master",
"data": {
"defaults": {"name": {"value": "new"}},
"shortName": "wm8731m",
"inputs": 0,
"outputs": 0,
"category": "control-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
},
"AudioSourceLoopContainer": {
"type": "AudioSourceLoopContainer",
"data": {
"defaults": {
"name": {
"value": "loop"
},
"code": {
"value": "void loop() {\n\n\n}\n"
}
},
"shortName": "loop",
"inputs": 0,
"outputs": 0,
"category": "source-function",
"color": "#E6E0F8",
"icon": "arrow-in.png"
}
}
};
</script>
Last edited: