Can also use my autogen feature, as I would need to add the new property to every object anyway.
var NodeTypeBase = {
"defaults":{
"name":{"type":"c_cpp_name_no_array"},
"id":{"noEdit":""},
"comment":{},
"color":{"type":"color"},
},
"editor":"autogen",
"shortName":"newType",
"editorhelp":"",
"inputs":0,
"outputs":0,
"category":"",
"color":"#E6E0F8",
"icon":"arrow-in.png"
};
var arraySize_Help = "selects the array size,<br>a value of 1 mean no array<br>the max value is 255";
var NodeTypeArrayBase = {
...NodeTypeBase,
"defaults":{
...NodeTypeBase.defaults,
"arraySize":{"value":1,"maxval":255,"minval":1,"type":"int",
"editor":{
"label":"Array Size","rowClass":"form-row-mid",
"help":arraySize_Help
}
}
}
};
"AudioInputI2S":{...NodeTypeBase,"shortName":"i2s","outputs":2,"category":"input-i2s1"},
"AudioOutputI2S":{...NodeTypeBase,"shortName":"i2s","inputs":2,"category":"output-i2s1"},
"AudioMixer4":{...NodeTypeArrayBase,"shortName":"mixer4","inputs":4,"outputs":1,"category":"mixer"},
"AudioSynthWaveform":{...NodeTYpeArrayBase,"shortName":"waveform","outputs":1,"category":"synth"},
class OSCVoice1grp : public OSCAudioGroup
{
public:
// the actual voice elements we want to group together
OSCAudioGroup& wav; // this would be holding the array of wav:s
OSCAudioSynthWaveform* wavs[4]; // to hold the actual instances
//OSCAudioSynthWaveform& wav1;
//OSCAudioSynthWaveform& wav2;
OSCAudioMixer4& mixer;
OSCAudioEffectEnvelope& env;
// internal patch cords
// total patchCordCount:3 including array typed ones.
OSCAudioConnection* patchCord[5];
// create as sub-group
OSCVoice1grp(const char* _name,OSCAudioGroup* parent) : // constructor
OSCAudioGroup(_name,parent), // construct our base class instance
wav(*new OSCAudioGroup{"wav", ((OSCAudioGroup*) this)}), // group is not a pointer argument here????
//wav1(*new OSCAudioSynthWaveform{"wav1",*((OSCAudioGroup*) this)}),
//wav2(*new OSCAudioSynthWaveform{"wav2",*((OSCAudioGroup*) this)}),
mixer(*new OSCAudioMixer4{"mixer",*((OSCAudioGroup*) this)}),
env(*new OSCAudioEffectEnvelope{"env",*((OSCAudioGroup*) this)})
{
int pci = 0; // used only for adding new patchcords
OSCAudioGroup& grp = *((OSCAudioGroup*) this);
char arrayItemName[5]; // ixxx'\n'
char pcName[20];
for(int i=0;i<4;i++) {
sprintf(arrayItemName, "i%d", i);
wavs[i] = new OSCAudioSynthWaveform(arrayItemName, wav);
sprintf(pcName, "wav_i%d_0_mixer_%d", i, i);
patchCord[pci++] = new OSCAudioConnection(pcName, grp, *wavs[i], 0, mixer, i);
}
patchCord[pci++] = new OSCAudioConnection("mixer_env", grp, mixer, 0, env, 0);
}
// create at root
OSCVoice1grp(const char* _name) : OSCVoice1grp(_name,NULL) {}
// no destructor needed, the base OSCAudioGroup
// destroys its members when it's destroyed
};
{"version":1,"settings":{"main":{},"OSC":{},"arduino":{"ExportForOSC":true,"useExportDialog":true,"ProjectName":"MultiTimbralLinEnv","Board":{"Platform":"","Board":"teensy41","Options":""}},"BiDirDataWebSocketBridge":{},"workspaces":{},"sidebar":{},"palette":{},"editor":{},"devTest":{},"IndexedDBfiles":{"testFileNames":"testFile.txt"},"NodeDefGenerator":{},"NodeDefManager":{},"NodeHelpManager":{}},"workspaces":[{"type":"tab","id":"Main","label":"Main","nodes":[{"id":"20220302T113319_446Z_335b","type":"AudioSynthWaveform","isClass":false,"name":"LFO","comment":"","x":90,"y":260,"z":"Main","bgColor":"#E6E0F8","wires":[["20220302T113305_119Z_4b2:0","20220302T113305_119Z_4b2:1","20220227T150834_852Z_11ed:3"]]},{"id":"20220228T194812_823Z_dfa8","type":"SampleAndHold","isClass":true,"name":"SnH[6]","x":265,"y":170,"z":"Main","bgColor":"#CCFFCC","wires":[["20220227T150834_852Z_11ed:0"]]},{"id":"Main_MinHammond1","type":"MinHammond","isClass":true,"name":"HammondVoice[8]","x":235,"y":230,"z":"Main","bgColor":"#CCFFCC","wires":[["20220227T150834_852Z_11ed:2","20220302T170700_396Z_4a3b:0"]]},{"id":"20220302T113305_119Z_4b2","type":"WaveFormVoice","isClass":true,"name":"modWaves[2]","x":240,"y":290,"z":"Main","bgColor":"#CCFFCC","wires":[["20220227T150834_852Z_11ed:1","20220227T150834_852Z_11ed:4","20220302T170700_396Z_4a3b:1"]]},{"id":"20220227T150834_852Z_11ed","type":"AudioMixerStereo","isClass":false,"name":"mixerI2S","comment":"","inputs":5,"ExtraInputs":0,"RealInputs":19,"x":475,"y":245,"z":"Main","bgColor":"#E6E0F8","wires":[["Main_i2s1:0"],["Main_i2s1:1"]]},{"id":"20220302T170700_396Z_4a3b","type":"AudioMixerStereo","isClass":false,"name":"mixerUSB","comment":"","inputs":2,"ExtraInputs":0,"RealInputs":10,"x":470,"y":315,"z":"Main","bgColor":"#E6E0F8","wires":[["Main_usb1:0"],["Main_usb1:1"]]},{"id":"Main_i2s1","type":"AudioOutputI2S","isClass":false,"name":"i2s","comment":"","x":690,"y":225,"z":"Main","bgColor":"#E6E0F8","wires":[]},{"id":"Main_usb1","type":"AudioOutputUSB","isClass":false,"name":"usb","comment":"","x":695,"y":275,"z":"Main","bgColor":"#E6E0F8","wires":[]}],"links":[],"export":true,"isMain":false,"mainNameType":"tabName","mainNameExt":".ino","isAudioMain":true,"generateCppDestructor":true,"extraClassDeclarations":"","settings":{}},{"type":"tab","id":"a47e9f.1128a16","label":"SampleAndHold","nodes":[{"id":"SampleAndHold_Out1","type":"TabOutput","isClass":false,"name":"Out","comment":"","x":865,"y":195,"z":"a47e9f.1128a16","bgColor":"#cce6ff","wires":[]},{"id":"Sheet_1_waveform1","type":"AudioSynthWaveform","isClass":false,"name":"waveform1","x":195,"y":180,"z":"a47e9f.1128a16","bgColor":"#E6E0F8","wires":[["20220227T151017_148Z_7e09:0"]]},{"id":"Sheet_1_noise1","type":"AudioSynthNoiseWhite","isClass":false,"name":"noise1","x":155,"y":315,"z":"a47e9f.1128a16","bgColor":"#E6E0F8","wires":[["Sheet_1_bitcrusher1:0"]]},{"id":"20220227T151017_148Z_7e09","type":"AudioEffectEnvelope","isClass":false,"name":"envelope","comment":"","x":345,"y":180,"z":"a47e9f.1128a16","bgColor":"#E6E0F8","wires":[["Sheet_1_filter1:0"]]},{"id":"Sheet_1_bitcrusher1","type":"AudioEffectBitcrusher","isClass":false,"name":"bitcrusher1","x":319,"y":314,"z":"a47e9f.1128a16","bgColor":"#E6E0F8","wires":[["Sheet_1_filter1:1"]]},{"id":"Sheet_1_filter1","type":"AudioFilterStateVariable","isClass":false,"name":"filter1","x":485,"y":190,"z":"a47e9f.1128a16","bgColor":"#E6E0F8","wires":[["20220227T172000_754Z_e580:0"],["20220227T172000_754Z_e580:1"],["20220227T172000_754Z_e580:2"]]},{"id":"20220227T172000_754Z_e580","type":"AudioMixer","isClass":false,"name":"mixer","comment":"","inputs":3,"ExtraInputs":0,"RealInputs":3,"x":690,"y":190,"z":"a47e9f.1128a16","bgColor":"#E6E0F8","wires":[["SampleAndHold_Out1:0"]]}],"links":[],"export":true,"isMain":false,"mainNameType":"tabName","mainNameExt":".ino","isAudioMain":false,"generateCppDestructor":true,"extraClassDeclarations":"","settings":{}},{"type":"tab","id":"6eff372d.78f988","label":"MinHammond","nodes":[{"id":"MinHammond_Out1","type":"TabOutput","isClass":false,"name":"Out1","comment":"","x":827,"y":300,"z":"6eff372d.78f988","bgColor":"#cce6ff","wires":[]},{"id":"MinHammond_waveform7","type":"AudioSynthWaveform","isClass":false,"name":"waveform1","x":263,"y":99,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_1:0"]]},{"id":"MinHammond_waveform8","type":"AudioSynthWaveform","isClass":false,"name":"waveform2","x":264,"y":144,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_1:1"]]},{"id":"MinHammond_waveform9","type":"AudioSynthWaveform","isClass":false,"name":"waveform3","x":265,"y":185,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_1:2"]]},{"id":"MinHammond_waveform5","type":"AudioSynthWaveform","isClass":false,"name":"waveform4","x":257,"y":226,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_1:3"]]},{"id":"MinHammond_waveform6","type":"AudioSynthWaveform","isClass":false,"name":"waveform5","x":257,"y":266,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_2:0"]]},{"id":"MinHammond_waveform4","type":"AudioSynthWaveform","isClass":false,"name":"waveform6","x":256,"y":310,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_2:1"]]},{"id":"MinHammond_waveform1","type":"AudioSynthWaveform","isClass":false,"name":"waveform7","x":255,"y":350,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_2:2"]]},{"id":"MinHammond_waveform2","type":"AudioSynthWaveform","isClass":false,"name":"waveform8","x":255,"y":392,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_2:3"]]},{"id":"MinHammond_waveform3","type":"AudioSynthWaveform","isClass":false,"name":"waveform9","x":255,"y":446,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_3:2"]]},{"id":"MinHammond_noise1","type":"AudioSynthNoiseWhite","isClass":false,"name":"noise1","x":258,"y":535,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_envelope1:0"]]},{"id":"MinHammond_mixer4_1","type":"AudioMixer4","isClass":false,"name":"mixer1","x":477,"y":163,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_3:0"]]},{"id":"MinHammond_mixer4_2","type":"AudioMixer4","isClass":false,"name":"mixer2","x":482,"y":290,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_3:1"]]},{"id":"MinHammond_envelope1","type":"AudioEffectEnvelope","isClass":false,"name":"envelope1","x":493,"y":523,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_3:3"]]},{"id":"MinHammond_mixer4_3","type":"AudioMixer4","isClass":false,"name":"mixer3","x":656,"y":297,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_Out1:0"]]}],"links":[],"export":true,"isMain":false,"mainNameType":"tabName","mainNameExt":".ino","isAudioMain":false,"generateCppDestructor":false,"extraClassDeclarations":"","settings":{}},{"type":"tab","id":"ea305170.fb2f9","label":"WaveFormVoice","nodes":[{"id":"20220302T113212_611Z_f670","type":"TabInput","isClass":false,"name":"freqMod","comment":"","outputs":1,"x":110,"y":283,"z":"ea305170.fb2f9","bgColor":"#cce6ff","wires":[["20220302T113145_789Z_77c0:0"]]},{"id":"WaveFormVoice_Out1","type":"TabOutput","isClass":false,"name":"Out2","comment":"","x":570,"y":320,"z":"ea305170.fb2f9","bgColor":"#cce6ff","wires":[]},{"id":"20220302T113218_689Z_d58b","type":"TabInput","isClass":false,"name":"shapeMod","comment":"","outputs":1,"x":106,"y":336,"z":"ea305170.fb2f9","bgColor":"#cce6ff","wires":[["20220302T113145_789Z_77c0:1"]]},{"id":"WaveFormVoice_vars1","type":"Variables","isClass":false,"name":"vars","comment":"// Start of variables\nprivate:\n bool isNew;\n static short wave_type[4];\npublic:\n// End of variables\n","x":290,"y":105,"z":"ea305170.fb2f9","bgColor":"#DDFFBB","wires":[]},{"id":"WaveFormVoice_constructor code1","type":"ConstructorCode","isClass":false,"name":"constructor code","comment":" env.attack(129.2);\r\n env.hold(2.1);\r\n env.decay(181.4);\r\n env.sustain(0.3);\r\n env.release(284.5);\r\n amp.gain(0.5);","x":283,"y":151,"z":"ea305170.fb2f9","bgColor":"#DDFFBB","wires":[]},{"id":"WaveFormVoice_code1","type":"Function","isClass":false,"name":"WaveFormVoice_code","comment":"// Start of voice class manually-entered code\r\n void noteOn(int MIDInote, int MIDIvel, int chan=-1){};\r\n void noteOn(float freq, float vel, int chan=-1)\r\n {\r\n if (isNew)\r\n wave.begin(vel,freq,(chan<0)?WAVEFORM_SINE:(wave_type[chan&3]));\r\n else\r\n {\r\n wave.amplitude(vel);\r\n wave.frequency(freq);\r\n }\r\n env.noteOn();\r\n isNew = false;\r\n }\r\n\r\n void noteOff(void){env.noteOff();};\r\n bool isPlaying(void) {return env.isActive();};\r\n}; // terminates class\r\n\r\nstatic short WaveformVoice::wave_type[] = {\r\n WAVEFORM_SINE,\r\n WAVEFORM_SQUARE,\r\n WAVEFORM_SAWTOOTH,\r\n WAVEFORM_TRIANGLE // no closing brace, GUI tool puts it in\r\n// End of voice class manually-entered code\r\n","x":290,"y":220,"z":"ea305170.fb2f9","bgColor":"#DDFFBB","wires":[]},{"id":"20220302T113145_789Z_77c0","type":"AudioSynthWaveformModulated","isClass":false,"name":"waveformMod","comment":"","x":285,"y":320,"z":"ea305170.fb2f9","bgColor":"#E6E0F8","wires":[["WaveFormVoice_amp1:0"]]},{"id":"WaveFormVoice_destructor code1","type":"DestructorCode","isClass":false,"name":"destructor code","comment":"// extra code for destructor","x":480,"y":148,"z":"ea305170.fb2f9","bgColor":"#DDFFBB","wires":[]},{"id":"WaveFormVoice_amp1","type":"AudioAmplifier","isClass":false,"name":"amp","comment":"","x":460,"y":320,"z":"ea305170.fb2f9","bgColor":"#E6E0F8","wires":[["WaveFormVoice_Out1:0"]]}],"links":[],"export":true,"isMain":false,"mainNameType":"tabName","mainNameExt":".ino","isAudioMain":false,"generateCppDestructor":false,"extraClassDeclarations":"","settings":{}}],"nodeAddons":{}
}
{"version":1,"settings":{"main":{},"OSC":{},"arduino":{"ExportForOSC":true,"useExportDialog":true,"ProjectName":"MultiTimbralLinEnv","StandardIncludeHeader":"#include <Arduino.h>\n#include <Audio.h>\n#include <Wire.h>\n#include <SPI.h>\n#include <SD.h>\n#include <SerialFlash.h>\n\n#include <OSCAudioBase.h>\n","Board":{"Platform":"","Board":"teensy41","Options":""}},"BiDirDataWebSocketBridge":{},"workspaces":{},"sidebar":{},"palette":{},"editor":{},"devTest":{},"IndexedDBfiles":{"testFileNames":"testFile.txt"},"NodeDefGenerator":{},"NodeDefManager":{},"NodeHelpManager":{}},"workspaces":[{"type":"tab","id":"Main","label":"Main","nodes":[{"id":"20220302T113319_446Z_335b","type":"AudioSynthWaveform","isClass":false,"name":"LFO","comment":"","x":90,"y":260,"z":"Main","bgColor":"#E6E0F8","wires":[["20220302T113305_119Z_4b2:0","20220302T113305_119Z_4b2:1","20220227T150834_852Z_11ed:3"]]},{"id":"20220228T194812_823Z_dfa8","type":"SampleAndHold","isClass":true,"name":"SnH[6]","x":265,"y":170,"z":"Main","bgColor":"#CCFFCC","wires":[["20220227T150834_852Z_11ed:0"]]},{"id":"Main_MinHammond1","type":"MinHammond","isClass":true,"name":"HammondVoice[8]","x":235,"y":230,"z":"Main","bgColor":"#CCFFCC","wires":[["20220227T150834_852Z_11ed:2","20220302T170700_396Z_4a3b:0"]]},{"id":"20220302T113305_119Z_4b2","type":"WaveFormVoice","isClass":true,"name":"modWaves[2]","x":250,"y":290,"z":"Main","bgColor":"#CCFFCC","wires":[["20220227T150834_852Z_11ed:4","20220302T170700_396Z_4a3b:2"],["20220302T170700_396Z_4a3b:1","20220227T150834_852Z_11ed:1"]]},{"id":"20220227T150834_852Z_11ed","type":"AudioMixerStereo","isClass":false,"name":"mixerI2S","comment":"","inputs":5,"ExtraInputs":0,"RealInputs":19,"x":475,"y":245,"z":"Main","bgColor":"#E6E0F8","wires":[["Main_i2s1:0"],["Main_i2s1:1"]]},{"id":"20220302T170700_396Z_4a3b","type":"AudioMixerStereo","isClass":false,"name":"mixerUSB","comment":"","inputs":3,"ExtraInputs":0,"RealInputs":12,"x":470,"y":315,"z":"Main","bgColor":"#E6E0F8","wires":[["Main_usb1:0"],["Main_usb1:1"]]},{"id":"Main_i2s1","type":"AudioOutputI2S","isClass":false,"name":"i2s","comment":"","x":600,"y":245,"z":"Main","bgColor":"#E6E0F8","wires":[]},{"id":"Main_usb1","type":"AudioOutputUSB","isClass":false,"name":"usb","comment":"","x":605,"y":315,"z":"Main","bgColor":"#E6E0F8","wires":[]}],"links":[],"export":true,"isMain":false,"mainNameType":"tabName","mainNameExt":".ino","isAudioMain":true,"generateCppDestructor":true,"extraClassDeclarations":"","settings":{}},{"type":"tab","id":"a47e9f.1128a16","label":"SampleAndHold","nodes":[{"id":"SampleAndHold_Out1","type":"TabOutput","isClass":false,"name":"Out","comment":"","x":865,"y":195,"z":"a47e9f.1128a16","bgColor":"#cce6ff","wires":[]},{"id":"Sheet_1_waveform1","type":"AudioSynthWaveform","isClass":false,"name":"waveform1","x":195,"y":180,"z":"a47e9f.1128a16","bgColor":"#E6E0F8","wires":[["20220227T151017_148Z_7e09:0"]]},{"id":"Sheet_1_noise1","type":"AudioSynthNoiseWhite","isClass":false,"name":"noise1","x":155,"y":315,"z":"a47e9f.1128a16","bgColor":"#E6E0F8","wires":[["Sheet_1_bitcrusher1:0"]]},{"id":"20220227T151017_148Z_7e09","type":"AudioEffectEnvelope","isClass":false,"name":"envelope","comment":"","x":345,"y":180,"z":"a47e9f.1128a16","bgColor":"#E6E0F8","wires":[["Sheet_1_filter1:0"]]},{"id":"Sheet_1_bitcrusher1","type":"AudioEffectBitcrusher","isClass":false,"name":"bitcrusher1","x":319,"y":314,"z":"a47e9f.1128a16","bgColor":"#E6E0F8","wires":[["Sheet_1_filter1:1"]]},{"id":"Sheet_1_filter1","type":"AudioFilterStateVariable","isClass":false,"name":"filter1","x":485,"y":190,"z":"a47e9f.1128a16","bgColor":"#E6E0F8","wires":[["20220227T172000_754Z_e580:0"],["20220227T172000_754Z_e580:1"],["20220227T172000_754Z_e580:2"]]},{"id":"20220227T172000_754Z_e580","type":"AudioMixer","isClass":false,"name":"mixer","comment":"","inputs":3,"ExtraInputs":0,"RealInputs":3,"x":690,"y":190,"z":"a47e9f.1128a16","bgColor":"#E6E0F8","wires":[["SampleAndHold_Out1:0"]]}],"links":[],"export":true,"isMain":false,"mainNameType":"tabName","mainNameExt":".ino","isAudioMain":false,"generateCppDestructor":true,"extraClassDeclarations":"","settings":{}},{"type":"tab","id":"6eff372d.78f988","label":"MinHammond","nodes":[{"id":"MinHammond_Out1","type":"TabOutput","isClass":false,"name":"Out1","comment":"","x":827,"y":300,"z":"6eff372d.78f988","bgColor":"#cce6ff","wires":[]},{"id":"MinHammond_waveform7","type":"AudioSynthWaveform","isClass":false,"name":"waveform1","x":263,"y":99,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_1:0"]]},{"id":"MinHammond_waveform8","type":"AudioSynthWaveform","isClass":false,"name":"waveform2","x":264,"y":144,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_1:1"]]},{"id":"MinHammond_waveform9","type":"AudioSynthWaveform","isClass":false,"name":"waveform3","x":265,"y":185,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_1:2"]]},{"id":"MinHammond_waveform5","type":"AudioSynthWaveform","isClass":false,"name":"waveform4","x":257,"y":226,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_1:3"]]},{"id":"MinHammond_waveform6","type":"AudioSynthWaveform","isClass":false,"name":"waveform5","x":257,"y":266,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_2:0"]]},{"id":"MinHammond_waveform4","type":"AudioSynthWaveform","isClass":false,"name":"waveform6","x":256,"y":310,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_2:1"]]},{"id":"MinHammond_waveform1","type":"AudioSynthWaveform","isClass":false,"name":"waveform7","x":255,"y":350,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_2:2"]]},{"id":"MinHammond_waveform2","type":"AudioSynthWaveform","isClass":false,"name":"waveform8","x":255,"y":392,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_2:3"]]},{"id":"MinHammond_waveform3","type":"AudioSynthWaveform","isClass":false,"name":"waveform9","x":255,"y":446,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_3:2"]]},{"id":"MinHammond_noise1","type":"AudioSynthNoiseWhite","isClass":false,"name":"noise1","x":258,"y":535,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_envelope1:0"]]},{"id":"MinHammond_mixer4_1","type":"AudioMixer4","isClass":false,"name":"mixer1","x":477,"y":163,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_3:0"]]},{"id":"MinHammond_mixer4_2","type":"AudioMixer4","isClass":false,"name":"mixer2","x":482,"y":290,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_3:1"]]},{"id":"MinHammond_envelope1","type":"AudioEffectEnvelope","isClass":false,"name":"envelope1","x":493,"y":523,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_mixer4_3:3"]]},{"id":"MinHammond_mixer4_3","type":"AudioMixer4","isClass":false,"name":"mixer3","x":656,"y":297,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_Out1:0"]]}],"links":[],"export":true,"isMain":false,"mainNameType":"tabName","mainNameExt":".ino","isAudioMain":false,"generateCppDestructor":false,"extraClassDeclarations":"","settings":{}},{"type":"tab","id":"ea305170.fb2f9","label":"WaveFormVoice","nodes":[{"id":"20220302T113212_611Z_f670","type":"TabInput","isClass":false,"name":"freqMod","comment":"","outputs":1,"x":110,"y":283,"z":"ea305170.fb2f9","bgColor":"#cce6ff","wires":[["20220302T113145_789Z_77c0:0"]]},{"id":"WaveFormVoice_Out1","type":"TabOutput","isClass":false,"name":"OutA","comment":"","inputs":"","x":570,"y":320,"z":"ea305170.fb2f9","bgColor":"#cce6ff","wires":[]},{"id":"20220302T113218_689Z_d58b","type":"TabInput","isClass":false,"name":"shapeMod","comment":"","outputs":1,"x":106,"y":336,"z":"ea305170.fb2f9","bgColor":"#cce6ff","wires":[["20220302T113145_789Z_77c0:1"]]},{"id":"20220304T200046_288Z_b82f","type":"TabOutput","isClass":false,"name":"OutW","comment":"","inputs":1,"x":570,"y":380,"z":"ea305170.fb2f9","bgColor":"#cce6ff","wires":[]},{"id":"WaveFormVoice_vars1","type":"Variables","isClass":false,"name":"vars","comment":"// Start of variables\nprivate:\n bool isNew;\n static short wave_type[4];\npublic:\n// End of variables\n","x":290,"y":105,"z":"ea305170.fb2f9","bgColor":"#DDFFBB","wires":[]},{"id":"WaveFormVoice_constructor code1","type":"ConstructorCode","isClass":false,"name":"constructor code","comment":" env.attack(129.2);\r\n env.hold(2.1);\r\n env.decay(181.4);\r\n env.sustain(0.3);\r\n env.release(284.5);\r\n amp.gain(0.5);","x":283,"y":151,"z":"ea305170.fb2f9","bgColor":"#DDFFBB","wires":[]},{"id":"WaveFormVoice_code1","type":"Function","isClass":false,"name":"WaveFormVoice_code","comment":"// Start of voice class manually-entered code\r\n void noteOn(int MIDInote, int MIDIvel, int chan=-1){};\r\n void noteOn(float freq, float vel, int chan=-1)\r\n {\r\n if (isNew)\r\n wave.begin(vel,freq,(chan<0)?WAVEFORM_SINE:(wave_type[chan&3]));\r\n else\r\n {\r\n wave.amplitude(vel);\r\n wave.frequency(freq);\r\n }\r\n env.noteOn();\r\n isNew = false;\r\n }\r\n\r\n void noteOff(void){env.noteOff();};\r\n bool isPlaying(void) {return env.isActive();};\r\n}; // terminates class\r\n\r\n/* static */ short WaveFormVoice::wave_type[] = {\r\n WAVEFORM_SINE,\r\n WAVEFORM_SQUARE,\r\n WAVEFORM_SAWTOOTH,\r\n WAVEFORM_TRIANGLE // no closing brace, GUI tool puts it in\r\n// End of voice class manually-entered code\r\n","x":290,"y":220,"z":"ea305170.fb2f9","bgColor":"#DDFFBB","wires":[]},{"id":"20220302T113145_789Z_77c0","type":"AudioSynthWaveformModulated","isClass":false,"name":"wave","comment":"","x":285,"y":320,"z":"ea305170.fb2f9","bgColor":"#E6E0F8","wires":[["WaveFormVoice_amp1:0","20220306T195324_547Z_8d5d:0"]]},{"id":"WaveFormVoice_destructor code1","type":"DestructorCode","isClass":false,"name":"destructor code","comment":"// extra code for destructor","x":480,"y":148,"z":"ea305170.fb2f9","bgColor":"#DDFFBB","wires":[]},{"id":"WaveFormVoice_amp1","type":"AudioAmplifier","isClass":false,"name":"amp","comment":"","x":460,"y":320,"z":"ea305170.fb2f9","bgColor":"#E6E0F8","wires":[["WaveFormVoice_Out1:0"]]},{"id":"20220306T195324_547Z_8d5d","type":"AudioEffectEnvelope","isClass":false,"name":"env","comment":"","x":460,"y":380,"z":"ea305170.fb2f9","bgColor":"#E6E0F8","wires":[["20220304T200046_288Z_b82f:0"]]}],"links":[],"export":true,"isMain":false,"mainNameType":"tabName","mainNameExt":".ino","isAudioMain":false,"generateCppDestructor":false,"extraClassDeclarations":"","settings":{}}],"nodeAddons":{}
}
The exported classes are rather inelegant because of the need to generate unique patchcord names: I've not thought through whether that's just a consequence of a poor design structure. If not, I suspect it may be useful to add an "auto name connection" capability to the OSCAudio library.
The best way would to have no connections at all and each audio object had it own connect function
could surely be implemented into the AudioStream base class
and the connections could just be stored into a 'linked list'(to make expansion retraction easier)
Code:struct { //sourcePort; //*destination; // just a pointer to the address so it can be looked up at disconnect //destinationPort; //acNext; } AudioConnection;
so that you could just do (just a example using ordinary objects)
Code:AudioSynthWaveform wav1; AudioSynthWaveform wav2; AudioEffectEnvelope env1; AudioEffectEnvelope env2; AudioMixer4 mix; // connect all void connectEverything() { wav1.connect(0,mix,0); wav2.connect(0,mix,1); wav1.connect(0,env1,0); wav2.connect(0,env2,0); env1.connect(0,mix,2); env2.connect(0,mix,3); } // disconnect all void disconnectEverything() { wav1.disconnect(0,mix,0); wav2.disconnect(0,mix,1); wav1.disconnect(0,env1,0); wav2.disconnect(0,env2,0); env1.disconnect(0,mix,2); env2.disconnect(0,mix,3); // or more elegant // these can be used when for example the mix object gets destroyed // could also be a automatic thing as a input can only have one source // and therefore can easily send a message to // that source to disconnect that specific connection wav1.disconnectAll(mix); wav2.disconnectAll(mix); env1.disconnectAll(mix); env2.disconnectAll(mix); // providing no parameters mean disconnect all connections going out wav1.disconnectAll(); wav2.disconnectAll(); env1.disconnectAll(); env2.disconnectAll(); }
but maybe that structure should just be implemented into the OSC lib for now
it would make the AudioConnection:s obsolete
{"version":1,"settings":{"main":{},"OSC":{},"arduino":{"ExportForOSC":true,"useExportDialog":true,"ProjectName":"MultiTimbralLinEnv2","StandardIncludeHeader":"#include <Arduino.h>\n#include <Audio.h>\n#include <Wire.h>\n#include <SPI.h>\n#include <SD.h>\n#include <SerialFlash.h>\n\n#include <OSCAudioBase.h>\n","Board":{"Platform":"","Board":"teensy41","Options":""}},"BiDirDataWebSocketBridge":{},"workspaces":{},"sidebar":{},"palette":{},"editor":{},"devTest":{},"IndexedDBfiles":{"testFileNames":"testFile.txt"},"NodeDefGenerator":{},"NodeDefManager":{},"NodeHelpManager":{}},"workspaces":[{"type":"tab","id":"Main","label":"Main","nodes":[{"id":"20220302T113319_446Z_335b","type":"AudioSynthWaveform","name":"LFO","comment":"","x":80,"y":195,"z":"Main","bgColor":"#E6E0F8","wires":[["20220302T113305_119Z_4b2:0","20220302T113305_119Z_4b2:1","20220227T150834_852Z_11ed:4"]]},{"id":"20220228T194812_823Z_dfa8","type":"SampleAndHold","name":"SnH[6]","arraySize":6,"x":265,"y":170,"z":"Main","bgColor":"#CCFFCC","wires":[["20220227T150834_852Z_11ed:0"]]},{"id":"20220316T174639_836Z_37cc","type":"MinHammond1","name":"Hammond[8]","comment":"","arraySize":8,"x":240,"y":240,"z":"Main","bgColor":"#CCFFCC","wires":[["20220227T150834_852Z_11ed:2","20220302T170700_396Z_4a3b:1","20220302T170700_396Z_4a3b:0","20220227T150834_852Z_11ed:3"]]},{"id":"20220302T113305_119Z_4b2","type":"WaveFormVoice","name":"modWaves[2]","arraySize":2,"x":245,"y":295,"z":"Main","bgColor":"#CCFFCC","wires":[["20220227T150834_852Z_11ed:5","20220302T170700_396Z_4a3b:3"],["20220227T150834_852Z_11ed:1","20220302T170700_396Z_4a3b:2"]]},{"id":"20220227T150834_852Z_11ed","type":"AudioMixerStereo","name":"mixerI2S","comment":"","inputs":6,"ExtraInputs":0,"RealInputs":27,"x":475,"y":200,"z":"Main","bgColor":"#E6E0F8","wires":[[],["Main_i2s1:1"]]},{"id":"20220302T170700_396Z_4a3b","type":"AudioMixerStereo","name":"mixerUSB","comment":"","inputs":4,"ExtraInputs":0,"RealInputs":20,"x":475,"y":330,"z":"Main","bgColor":"#E6E0F8","wires":[["Main_usb1:0"],["Main_usb1:1"]]},{"id":"Main_i2s1","type":"AudioOutputI2S","name":"i2s","comment":"","x":610,"y":200,"z":"Main","bgColor":"#E6E0F8","wires":[]},{"id":"Main_usb1","type":"AudioOutputUSB","name":"usb","comment":"","x":605,"y":330,"z":"Main","bgColor":"#E6E0F8","wires":[]}],"links":[],"export":true,"isMain":false,"mainNameType":"tabName","mainNameExt":".ino","isAudioMain":true,"generateCppDestructor":true,"extraClassDeclarations":"","settings":{}},{"type":"tab","id":"a47e9f.1128a16","label":"SampleAndHold","nodes":[{"id":"SampleAndHold_Out1","type":"TabOutput","name":"Out","comment":"","x":865,"y":195,"z":"a47e9f.1128a16","bgColor":"#cce6ff","wires":[]},{"id":"Sheet_1_waveform1","type":"AudioSynthWaveform","name":"waveform1","x":195,"y":180,"z":"a47e9f.1128a16","bgColor":"#E6E0F8","wires":[["20220227T151017_148Z_7e09:0"]]},{"id":"Sheet_1_noise1","type":"AudioSynthNoiseWhite","name":"noise1","x":155,"y":315,"z":"a47e9f.1128a16","bgColor":"#E6E0F8","wires":[["Sheet_1_bitcrusher1:0"]]},{"id":"20220227T151017_148Z_7e09","type":"AudioEffectEnvelope","name":"envelope","comment":"","x":345,"y":180,"z":"a47e9f.1128a16","bgColor":"#E6E0F8","wires":[["Sheet_1_filter1:0"]]},{"id":"Sheet_1_bitcrusher1","type":"AudioEffectBitcrusher","name":"bitcrusher1","x":319,"y":314,"z":"a47e9f.1128a16","bgColor":"#E6E0F8","wires":[["Sheet_1_filter1:1"]]},{"id":"Sheet_1_filter1","type":"AudioFilterStateVariable","name":"filter1","x":485,"y":190,"z":"a47e9f.1128a16","bgColor":"#E6E0F8","wires":[["20220227T172000_754Z_e580:0"],["20220227T172000_754Z_e580:1"],["20220227T172000_754Z_e580:2"]]},{"id":"20220227T172000_754Z_e580","type":"AudioMixer","name":"mixer","comment":"","inputs":3,"ExtraInputs":0,"RealInputs":3,"x":690,"y":190,"z":"a47e9f.1128a16","bgColor":"#E6E0F8","wires":[["SampleAndHold_Out1:0"]]}],"links":[],"export":true,"isMain":false,"mainNameType":"tabName","mainNameExt":".ino","isAudioMain":false,"generateCppDestructor":true,"extraClassDeclarations":"","settings":{}},{"type":"tab","id":"6eff372d.78f988","label":"MinHammond1","nodes":[{"id":"MinHammond_Out1","type":"TabOutput","name":"Out","comment":"","inputs":"","x":680,"y":280,"z":"6eff372d.78f988","bgColor":"#cce6ff","wires":[]},{"id":"MinHammond_waveform7","type":"AudioSynthWaveform","name":"waveform1","x":263,"y":99,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["20220307T120440_881Z_fb5:0"]]},{"id":"MinHammond_waveform8","type":"AudioSynthWaveform","name":"waveform2","x":264,"y":144,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["20220307T120440_881Z_fb5:1"]]},{"id":"MinHammond_waveform9","type":"AudioSynthWaveform","name":"waveform3","x":265,"y":185,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["20220307T120440_881Z_fb5:2"]]},{"id":"MinHammond_waveform5","type":"AudioSynthWaveform","name":"waveform4","x":257,"y":226,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["20220307T120440_881Z_fb5:3"]]},{"id":"MinHammond_waveform6","type":"AudioSynthWaveform","name":"waveform5","x":257,"y":266,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["20220307T120440_881Z_fb5:4"]]},{"id":"MinHammond_waveform4","type":"AudioSynthWaveform","name":"waveform6","x":256,"y":310,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["20220307T120440_881Z_fb5:5"]]},{"id":"MinHammond_waveform1","type":"AudioSynthWaveform","name":"waveform7","x":255,"y":350,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["20220307T120440_881Z_fb5:6"]]},{"id":"MinHammond_waveform2","type":"AudioSynthWaveform","name":"waveform8","x":255,"y":392,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["20220307T120440_881Z_fb5:7"]]},{"id":"MinHammond_waveform3","type":"AudioSynthWaveform","name":"waveform9","x":255,"y":446,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["20220307T120440_881Z_fb5:8"]]},{"id":"MinHammond_noise1","type":"AudioSynthNoiseWhite","name":"noise1","x":258,"y":535,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_envelope1:0"]]},{"id":"MinHammond_envelope1","type":"AudioEffectEnvelope","name":"env","comment":"","x":410,"y":535,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["20220307T120440_881Z_fb5:9"]]},{"id":"20220307T120440_881Z_fb5","type":"AudioMixer","name":"mixer","comment":"","inputs":10,"ExtraInputs":0,"RealInputs":10,"x":540,"y":280,"z":"6eff372d.78f988","bgColor":"#E6E0F8","wires":[["MinHammond_Out1:0"]]}],"links":[],"export":true,"isMain":false,"mainNameType":"tabName","mainNameExt":".ino","isAudioMain":false,"generateCppDestructor":false,"extraClassDeclarations":"","settings":{}},{"type":"tab","id":"20220307T120627_405Z_a479","label":"Hammond_x8","nodes":[{"id":"20220307T120721_021Z_29bd","type":"TabOutput","name":"OutL","comment":"","inputs":1,"x":510,"y":195,"z":"20220307T120627_405Z_a479","bgColor":"#cce6ff","wires":[]},{"id":"20220307T122215_132Z_aca6","type":"TabOutput","name":"OutR","comment":"","inputs":1,"x":510,"y":240,"z":"20220307T120627_405Z_a479","bgColor":"#cce6ff","wires":[]},{"id":"20220307T120648_593Z_b118","type":"MinHammond1","name":"minhammond1[8]","arraySize":8,"x":165,"y":215,"z":"20220307T120627_405Z_a479","bgColor":"#CCFFCC","wires":[["20220307T122152_547Z_8a89:0"]]},{"id":"20220307T122152_547Z_8a89","type":"AudioMixerStereo","name":"mixS","comment":"","inputs":1,"ExtraInputs":0,"RealInputs":8,"x":335,"y":215,"z":"20220307T120627_405Z_a479","bgColor":"#E6E0F8","wires":[["20220307T120721_021Z_29bd:0"],["20220307T122215_132Z_aca6:0"]]}],"links":[],"export":true,"isMain":false,"mainNameType":"tabName","mainNameExt":".ino","isAudioMain":false,"generateCppDestructor":false,"extraClassDeclarations":"","settings":{}},{"type":"tab","id":"ea305170.fb2f9","label":"WaveFormVoice","nodes":[{"id":"20220302T113212_611Z_f670","type":"TabInput","name":"freqMod","comment":"","outputs":1,"x":110,"y":283,"z":"ea305170.fb2f9","bgColor":"#cce6ff","wires":[["20220302T113145_789Z_77c0:0"]]},{"id":"WaveFormVoice_Out1","type":"TabOutput","name":"OutA","comment":"","inputs":"","x":570,"y":320,"z":"ea305170.fb2f9","bgColor":"#cce6ff","wires":[]},{"id":"20220302T113218_689Z_d58b","type":"TabInput","name":"shapeMod","comment":"","outputs":1,"x":106,"y":336,"z":"ea305170.fb2f9","bgColor":"#cce6ff","wires":[["20220302T113145_789Z_77c0:1"]]},{"id":"20220304T200046_288Z_b82f","type":"TabOutput","name":"OutW","comment":"","inputs":1,"x":570,"y":380,"z":"ea305170.fb2f9","bgColor":"#cce6ff","wires":[]},{"id":"WaveFormVoice_vars1","type":"Variables","name":"vars","comment":"// Start of variables\nprivate:\n bool isNew;\n static short wave_type[4];\npublic:\n// End of variables\n","x":290,"y":105,"z":"ea305170.fb2f9","bgColor":"#DDFFBB","wires":[]},{"id":"WaveFormVoice_constructor code1","type":"ConstructorCode","name":"constructor code","comment":" env.attack(129.2);\r\n env.hold(2.1);\r\n env.decay(181.4);\r\n env.sustain(0.3);\r\n env.release(284.5);\r\n amp.gain(0.5);","x":283,"y":151,"z":"ea305170.fb2f9","bgColor":"#DDFFBB","wires":[]},{"id":"WaveFormVoice_code1","type":"Function","name":"WaveFormVoice_code","comment":"// Start of voice class manually-entered code\r\n void noteOn(int MIDInote, int MIDIvel, int chan=-1){};\r\n void noteOn(float freq, float vel, int chan=-1)\r\n {\r\n if (isNew)\r\n wave.begin(vel,freq,(chan<0)?WAVEFORM_SINE:(wave_type[chan&3]));\r\n else\r\n {\r\n wave.amplitude(vel);\r\n wave.frequency(freq);\r\n }\r\n env.noteOn();\r\n isNew = false;\r\n }\r\n\r\n void noteOff(void){env.noteOff();};\r\n bool isPlaying(void) {return env.isActive();};","x":290,"y":220,"z":"ea305170.fb2f9","bgColor":"#DDFFBB","wires":[]},{"id":"20220302T113145_789Z_77c0","type":"AudioSynthWaveformModulated","name":"wave","comment":"","x":285,"y":320,"z":"ea305170.fb2f9","bgColor":"#E6E0F8","wires":[["WaveFormVoice_amp1:0","20220306T195324_547Z_8d5d:0"]]},{"id":"20220307T115003_039Z_3cc2","type":"EndOfFileCode","name":"eof code","comment":"/* static */ short WaveFormVoice::wave_type[] = \r\n{\r\n WAVEFORM_SINE,\r\n WAVEFORM_SQUARE,\r\n WAVEFORM_SAWTOOTH,\r\n WAVEFORM_TRIANGLE \r\n};","x":289,"y":435,"z":"ea305170.fb2f9","bgColor":"#DDFFBB","wires":[]},{"id":"WaveFormVoice_destructor code1","type":"DestructorCode","name":"destructor code","comment":"// extra code for destructor","x":480,"y":148,"z":"ea305170.fb2f9","bgColor":"#DDFFBB","wires":[]},{"id":"WaveFormVoice_amp1","type":"AudioAmplifier","name":"amp","comment":"","x":460,"y":320,"z":"ea305170.fb2f9","bgColor":"#E6E0F8","wires":[["WaveFormVoice_Out1:0"]]},{"id":"20220306T195324_547Z_8d5d","type":"AudioEffectEnvelope","name":"env","comment":"","x":460,"y":380,"z":"ea305170.fb2f9","bgColor":"#E6E0F8","wires":[["20220304T200046_288Z_b82f:0"]]}],"links":[],"export":true,"isMain":false,"mainNameType":"tabName","mainNameExt":".ino","isAudioMain":false,"generateCppDestructor":false,"extraClassDeclarations":"","settings":{}}],"nodeAddons":{}
}
Uncaught TypeError: Cannot set properties of undefined (setting 'tabOut')
at setLinkInfo (nodes.js:2602:23)
at Object.addLink (nodes.js:565:13)
at portMouseUp (view.js:2131:23)
at SVGRectElement.<anonymous> (view.js:2818:58)
at SVGRectElement.i [as __onmouseup] (d3.v3.min.js:515:23)
setLinkInfo @ nodes.js:2602
addLink @ nodes.js:565
portMouseUp @ view.js:2131
(anonymous) @ view.js:2818
i @ d3.v3.min.js:515
view.js:3042 Uncaught TypeError: Cannot read properties of undefined (reading 'isBus')
at redraw_link_notation (view.js:3042:20)
at SVGPathElement.redraw_link (view.js:3057:9)
at SVGPathElement.a (d3.v3.min.js:413:23)
at d3.v3.min.js:3959:15
at Tn (d3.v3.min.js:531:81)
at Array.Ma.each (d3.v3.min.js:3958:16)
at Array.Ma.attr (d3.v3.min.js:3808:21)
at redraw_links (view.js:3037:9)
at Object.setSelectedWorkspace [as onchange] (view.js:725:9)
at activateTab (tabs.js:357:29)
redraw_link_notation @ view.js:3042
redraw_link @ view.js:3057
a @ d3.v3.min.js:413
(anonymous) @ d3.v3.min.js:3959
Tn @ d3.v3.min.js:531
Ma.each @ d3.v3.min.js:3958
Ma.attr @ d3.v3.min.js:3808
redraw_links @ view.js:3037
setSelectedWorkspace @ view.js:725
activateTab @ tabs.js:357
onTabClick @ tabs.js:300
dispatch @ jquery-1.9.1.js:3074
elemData.handle @ jquery-1.9.1.js:2750
And here are two different errors that show in the console when I try to connect mixerI2S to i2s - one occurs when I try to make the connection immediately after an F5 refresh, the second when I try again.