|
@@ -291,7 +291,10 @@ void laui_ScopeNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn
|
|
}
|
|
}
|
|
|
|
|
|
void IDN_OutputInit(laSynthNodeOutput* n, int NoCreate){
|
|
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");
|
|
n->In=laCreateInSocket("IN",0); strSafeSet(&n->Base.Name,"Output");
|
|
}
|
|
}
|
|
void IDN_OutputDestroy(laSynthNodeOutput* n){
|
|
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);
|
|
laSpinLock(&MAIN.Audio->CurrentSynth->Lock);
|
|
laRebuildPageEval(MAIN.Audio->CurrentSynth->Page);
|
|
laRebuildPageEval(MAIN.Audio->CurrentSynth->Page);
|
|
laSpinUnlock(&MAIN.Audio->CurrentSynth->Lock);
|
|
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(){
|
|
int laEvalSynthGraphs(){
|
|
@@ -629,7 +638,7 @@ void laRemoveSynth(laSynth* ss){ if(!ss) return;
|
|
laSynth* nss=ss->Item.pNext?ss->Item.pNext:ss->Item.pPrev;
|
|
laSynth* nss=ss->Item.pNext?ss->Item.pNext:ss->Item.pPrev;
|
|
memAssignRef(MAIN.Audio,&MAIN.Audio->CurrentSynth,nss);
|
|
memAssignRef(MAIN.Audio,&MAIN.Audio->CurrentSynth,nss);
|
|
}laNotifyInstanceUsers(ss);
|
|
}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);
|
|
lstRemoveItem(&MAIN.Audio->Synths,ss);
|
|
laSpinDestroy(&ss->Lock);
|
|
laSpinDestroy(&ss->Lock);
|
|
memLeave(ss);
|
|
memLeave(ss);
|
|
@@ -665,7 +674,9 @@ int OPINV_laSynthPlay(laOperator* a, laEvent* e){
|
|
char* str=strGetArgumentString(a->ExtraInstructionsP, "mode");
|
|
char* str=strGetArgumentString(a->ExtraInstructionsP, "mode");
|
|
int play=0; if(str && strSame(str,"PLAY")) play=1;
|
|
int play=0; if(str && strSame(str,"PLAY")) play=1;
|
|
if(play){ MAIN.Audio->AudioAny=1; }
|
|
if(play){ MAIN.Audio->AudioAny=1; }
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ laRebuildPageEval(ss->Page);
|
|
|
|
+
|
|
laSpinLock(&ss->Lock); ss->Playing=play; laSpinUnlock(&ss->Lock);
|
|
laSpinLock(&ss->Lock); ss->Playing=play; laSpinUnlock(&ss->Lock);
|
|
|
|
|
|
ma_device_start(&MAIN.Audio->AudioDevice); laNotifyInstanceUsers(ss);
|
|
ma_device_start(&MAIN.Audio->AudioDevice); laNotifyInstanceUsers(ss);
|
|
@@ -796,6 +807,7 @@ void* laget_FirstAudioChannel(void* unused1, void* unused2){
|
|
}
|
|
}
|
|
void lapost_Synth(laSynth* ss){
|
|
void lapost_Synth(laSynth* ss){
|
|
laSpinInit(&ss->Lock);
|
|
laSpinInit(&ss->Lock);
|
|
|
|
+ laRebuildPageEval(ss->Page);
|
|
}
|
|
}
|
|
int laget_SynthPlaying(laSynth* ss){
|
|
int laget_SynthPlaying(laSynth* ss){
|
|
int play=0;
|
|
int play=0;
|
|
@@ -813,6 +825,11 @@ void laset_OutputSendChannel(laSynthNodeOutput* n,laAudioChannel* ac){
|
|
laAudioChannel* outchannel = laGetAudioChannel(SSTR(n->SendName));
|
|
laAudioChannel* outchannel = laGetAudioChannel(SSTR(n->SendName));
|
|
memAssignRef(n,&n->Send,outchannel);
|
|
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){
|
|
void laset_QuantizeEnabledKeys(laSynthNodeQuantize* n, int index, int val_UNUSED){
|
|
if(n->EnabledBits[index] & 0x1){ n->EnabledBits[index]=0; }
|
|
if(n->EnabledBits[index] & 0x1){ n->EnabledBits[index]=0; }
|
|
else{ n->EnabledBits[index]=1; }
|
|
else{ n->EnabledBits[index]=1; }
|
|
@@ -823,7 +840,7 @@ void laset_AudioChannelMove(laAudioChannel* ac, int move){
|
|
}
|
|
}
|
|
|
|
|
|
void la_AudioPreFrame(){
|
|
void la_AudioPreFrame(){
|
|
- if(MAIN.GraphNeedsRebuild){ laRebuildSynthGraphs(); }
|
|
|
|
|
|
+ if(MAIN.GraphNeedsRebuild){ laRebuildSynthGraphs(1); }
|
|
|
|
|
|
int anyaudio=0;
|
|
int anyaudio=0;
|
|
laSpinLock(&MAIN.Audio->AudioStatusLock);
|
|
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,"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);
|
|
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);
|
|
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,"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);
|
|
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);
|
|
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,"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);
|
|
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);
|
|
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);
|
|
pc=laAddPropertyContainer("la_node_synth_envelope", "Envelope Node", "Sound envelope",0,laui_EnvelopeNode,sizeof(laSynthNodeEnvelope),lapost_Node,0,1);
|