|  | @@ -291,7 +291,10 @@ void laui_ScopeNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void IDN_OutputInit(laSynthNodeOutput* n, int NoCreate){
 | 
	
		
			
				|  |  | -    if(NoCreate){ return; }
 | 
	
		
			
				|  |  | +    if(NoCreate){
 | 
	
		
			
				|  |  | +        laAudioChannel* outchannel = laGetAudioChannel(SSTR(n->SendName));
 | 
	
		
			
				|  |  | +        if(outchannel) memAssignRef(n,&n->Send,outchannel);
 | 
	
		
			
				|  |  | +    return; }
 | 
	
		
			
				|  |  |      n->In=laCreateInSocket("IN",0); strSafeSet(&n->Base.Name,"Output");
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  void IDN_OutputDestroy(laSynthNodeOutput* n){
 | 
	
	
		
			
				|  | @@ -496,11 +499,17 @@ void laui_QuantizeNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laCol
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -void laRebuildSynthGraphs(){
 | 
	
		
			
				|  |  | -    if(MAIN.Audio->CurrentSynth){
 | 
	
		
			
				|  |  | +void laRebuildSynthGraphs(int current_only){
 | 
	
		
			
				|  |  | +    if(MAIN.Audio->CurrentSynth && current_only){
 | 
	
		
			
				|  |  |          laSpinLock(&MAIN.Audio->CurrentSynth->Lock);
 | 
	
		
			
				|  |  |          laRebuildPageEval(MAIN.Audio->CurrentSynth->Page);
 | 
	
		
			
				|  |  |          laSpinUnlock(&MAIN.Audio->CurrentSynth->Lock);
 | 
	
		
			
				|  |  | +    }else{
 | 
	
		
			
				|  |  | +        for(laSynth* s=MAIN.Audio->Synths.pFirst;s;s=s->Item.pNext){
 | 
	
		
			
				|  |  | +            laSpinLock(&s->Lock);
 | 
	
		
			
				|  |  | +            laRebuildPageEval(s->Page);
 | 
	
		
			
				|  |  | +            laSpinUnlock(&s->Lock);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  int laEvalSynthGraphs(){
 | 
	
	
		
			
				|  | @@ -629,7 +638,7 @@ void laRemoveSynth(laSynth* ss){ if(!ss) return;
 | 
	
		
			
				|  |  |          laSynth* nss=ss->Item.pNext?ss->Item.pNext:ss->Item.pPrev;
 | 
	
		
			
				|  |  |          memAssignRef(MAIN.Audio,&MAIN.Audio->CurrentSynth,nss);
 | 
	
		
			
				|  |  |      }laNotifyInstanceUsers(ss);
 | 
	
		
			
				|  |  | -    while(ss->Page->Racks.pFirst){ laDestroyRack(ss->Page->Racks.pFirst); } memLeave(ss->Page); ss->Page=0;
 | 
	
		
			
				|  |  | +    while(ss->Page->Racks.pFirst){ laDestroyRack(ss->Page->Racks.pFirst); } memLeave(ss->Page); //ss->Page=0;
 | 
	
		
			
				|  |  |      lstRemoveItem(&MAIN.Audio->Synths,ss);
 | 
	
		
			
				|  |  |      laSpinDestroy(&ss->Lock);
 | 
	
		
			
				|  |  |      memLeave(ss);
 | 
	
	
		
			
				|  | @@ -665,7 +674,9 @@ int OPINV_laSynthPlay(laOperator* a, laEvent* e){
 | 
	
		
			
				|  |  |      char* str=strGetArgumentString(a->ExtraInstructionsP, "mode");
 | 
	
		
			
				|  |  |      int play=0; if(str && strSame(str,"PLAY")) play=1;
 | 
	
		
			
				|  |  |      if(play){ MAIN.Audio->AudioAny=1; }
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    laRebuildPageEval(ss->Page);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      laSpinLock(&ss->Lock); ss->Playing=play; laSpinUnlock(&ss->Lock);
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      ma_device_start(&MAIN.Audio->AudioDevice); laNotifyInstanceUsers(ss);
 | 
	
	
		
			
				|  | @@ -796,6 +807,7 @@ void* laget_FirstAudioChannel(void* unused1, void* unused2){
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  void lapost_Synth(laSynth* ss){
 | 
	
		
			
				|  |  |      laSpinInit(&ss->Lock);
 | 
	
		
			
				|  |  | +    laRebuildPageEval(ss->Page);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  int laget_SynthPlaying(laSynth* ss){
 | 
	
		
			
				|  |  |      int play=0;
 | 
	
	
		
			
				|  | @@ -813,6 +825,11 @@ void laset_OutputSendChannel(laSynthNodeOutput* n,laAudioChannel* ac){
 | 
	
		
			
				|  |  |      laAudioChannel* outchannel = laGetAudioChannel(SSTR(n->SendName));
 | 
	
		
			
				|  |  |      memAssignRef(n,&n->Send,outchannel);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +void laset_OutputSendName(laSynthNodeOutput* n,char* name){
 | 
	
		
			
				|  |  | +    strSafeSet(&n->SendName,name);
 | 
	
		
			
				|  |  | +    laAudioChannel* outchannel = laGetAudioChannel(name);
 | 
	
		
			
				|  |  | +    memAssignRef(n,&n->Send,outchannel);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  void laset_QuantizeEnabledKeys(laSynthNodeQuantize* n, int index, int val_UNUSED){
 | 
	
		
			
				|  |  |      if(n->EnabledBits[index] & 0x1){ n->EnabledBits[index]=0; }
 | 
	
		
			
				|  |  |      else{ n->EnabledBits[index]=1; }
 | 
	
	
		
			
				|  | @@ -823,7 +840,7 @@ void laset_AudioChannelMove(laAudioChannel* ac, int move){
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void la_AudioPreFrame(){
 | 
	
		
			
				|  |  | -    if(MAIN.GraphNeedsRebuild){ laRebuildSynthGraphs(); }
 | 
	
		
			
				|  |  | +    if(MAIN.GraphNeedsRebuild){ laRebuildSynthGraphs(1); }
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      int anyaudio=0;
 | 
	
		
			
				|  |  |      laSpinLock(&MAIN.Audio->AudioStatusLock);
 | 
	
	
		
			
				|  | @@ -893,7 +910,7 @@ void laInitAudio(){
 | 
	
		
			
				|  |  |      laAddFloatProperty(pc,"amp","Amptitude","Amptitude of the output signal",0,0,0,10,0,0.1,0,0,offsetof(laSynthNodeVCA,Amp),0,0,0,0,0,0,0,0,0,0,0);
 | 
	
		
			
				|  |  |      laAddFloatProperty(pc,"influence","Influence","Influence of the modulating signal",LA_WIDGET_KNOB,0,0,1,-1,0.01,0,0,offsetof(laSynthNodeVCA,rInfluence),0,0,0,0,0,0,0,0,0,0,0);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    pc=laAddPropertyContainer("la_node_synth_noise", "Noise Node", "Noise node",0,laui_NoiseNode,sizeof(laSynthNodeFM),lapost_Node,0,1);
 | 
	
		
			
				|  |  | +    pc=laAddPropertyContainer("la_node_synth_noise", "Noise Node", "Noise node",0,laui_NoiseNode,sizeof(laSynthNodeNoise),lapost_Node,0,1);
 | 
	
		
			
				|  |  |      LA_PC_IDN_NOISE=pc; laPropContainerExtraFunctions(pc,0,0,0,0,laui_DefaultNodeOperationsPropUiDefine);
 | 
	
		
			
				|  |  |      laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
 | 
	
		
			
				|  |  |      laAddSubGroup(pc,"out_white", "White","White noise output","la_out_socket",0,0,0,offsetof(laSynthNodeNoise,OutWhite),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 | 
	
	
		
			
				|  | @@ -928,7 +945,7 @@ void laInitAudio(){
 | 
	
		
			
				|  |  |      LA_PC_IDN_OUTPUT=pc; laPropContainerExtraFunctions(pc,0,0,0,0,laui_DefaultNodeOperationsPropUiDefine);
 | 
	
		
			
				|  |  |      laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
 | 
	
		
			
				|  |  |      laAddSubGroup(pc,"in", "Input","Input sound","la_in_socket",0,0,0,offsetof(laSynthNodeOutput,In),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 | 
	
		
			
				|  |  | -    laAddStringProperty(pc,"send_channel_name","Channel Name","Channel name of this send target",0,0,0,0,1,offsetof(laSynthNodeOutput,SendName),0,0,0,0,0);
 | 
	
		
			
				|  |  | +    laAddStringProperty(pc,"send_channel_name","Channel Name","Channel name of this send target",0,0,0,0,1,offsetof(laSynthNodeOutput,SendName),0,0,laset_OutputSendName,0,0);
 | 
	
		
			
				|  |  |      laAddSubGroup(pc,"send_channel_selector","Send","Send to channel","la_audio_channel",0,0,0,-1,laget_FirstAudioChannel,0,laget_ListNext,laset_OutputSendChannel,0,0,0,LA_UDF_REFER|LA_UDF_IGNORE);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      pc=laAddPropertyContainer("la_node_synth_envelope", "Envelope Node", "Sound envelope",0,laui_EnvelopeNode,sizeof(laSynthNodeEnvelope),lapost_Node,0,1);
 |