// Update is called once per frame void Update() { //reset counting variables totalEnergy1 = 0; totalEnergy2 = 0; totalEnergy3 = 0; totalRotationalMomentum1 = 0; totalRotationalMomentum2 = 0; totalRotationalMomentum3 = 0; netVelocity1 = Vector3.zero; netVelocity2 = Vector3.zero; netVelocity3 = Vector3.zero; foreach (Transform child in transform) { if (Vector3.SqrMagnitude(child.position - basinAxis1.position) <= maxCalcDistanceSqr) //if it's in the first basin { Rigidbody body = child.GetComponent <Rigidbody>(); //get rigidbody component if (body != null) //verify it's not null { totalEnergy1 += Vector3.SqrMagnitude(body.velocity) * body.mass; //calculate total particle energy where E = m * |v|^2 totalRotationalMomentum1 += Vector3.Dot(Vector3.Cross(child.position - basinAxis1.position, body.mass * body.velocity), Vector3.up); //calculate total angular momentum where L = R x mV netVelocity1 += body.velocity; //calculate net velocity in x,y,z } } else if (Vector3.SqrMagnitude(child.position - basinAxis2.position) <= maxCalcDistanceSqr) //if it's in the second basin { Rigidbody body = child.GetComponent <Rigidbody>(); //get rigidbody component if (body != null) //verify it's not null { totalEnergy2 += Vector3.SqrMagnitude(body.velocity) * body.mass; //calculate total particle energy where E = m * |v|^2 totalRotationalMomentum2 += Vector3.Dot(Vector3.Cross(child.position - basinAxis2.position, body.mass * body.velocity), Vector3.up); //calculate total angular momentum where L = R x mV netVelocity2 += body.velocity; //calculate net velocity in x,y,z } } else if (Vector3.SqrMagnitude(child.position - basinAxis3.position) <= maxCalcDistanceSqr) //if it's in the third basin { Rigidbody body = child.GetComponent <Rigidbody>(); //get rigidbody component if (body != null) //verify it's not null { totalEnergy3 += Vector3.SqrMagnitude(body.velocity) * body.mass; //calculate total particle energy where E = m * |v|^2 totalRotationalMomentum3 += Vector3.Dot(Vector3.Cross(child.position - basinAxis3.position, body.mass * body.velocity), Vector3.up); //calculate total angular momentum where L = R x mV netVelocity3 += body.velocity; //calculate net velocity in x,y,z } } } //update parameters on synthesizers based on inputs Hv_simple_sin_synth_AudioLib sinSynth = basinAxis1.GetComponent <Hv_simple_sin_synth_AudioLib>(); sinSynth.SetFloatParameter(Hv_simple_sin_synth_AudioLib.Parameter.Gain, Mathf.Lerp(gainMin, gainMax, totalEnergy1 / energyMax)); sinSynth.SetFloatParameter(Hv_simple_sin_synth_AudioLib.Parameter.Oscfreq, Mathf.Lerp(oscMin, oscMax, Mathf.Abs(totalRotationalMomentum1) / momentumMax)); sinSynth.SetFloatParameter(Hv_simple_sin_synth_AudioLib.Parameter.Freqcutoff, Mathf.Lerp(frequencyMin, frequencyMax, Mathf.Abs(netVelocity1.x) / netVelocityMax)); sinSynth.SetFloatParameter(Hv_simple_sin_synth_AudioLib.Parameter.Ringmodfreq, Mathf.Lerp(ringFreqMin, ringFreqMax, Mathf.Abs(netVelocity1.y) / netVelocityMax)); sinSynth.SetFloatParameter(Hv_simple_sin_synth_AudioLib.Parameter.Ringmodmultiplier, Mathf.Lerp(ringMultMin, ringMultMax, Mathf.Abs(netVelocity1.z) / netVelocityMax)); Hv_simple_saw_synth_AudioLib sawSynth = basinAxis2.GetComponent <Hv_simple_saw_synth_AudioLib>(); sawSynth.SetFloatParameter(Hv_simple_saw_synth_AudioLib.Parameter.Gain, Mathf.Lerp(gainMin, gainMax, totalEnergy2 / energyMax)); sawSynth.SetFloatParameter(Hv_simple_saw_synth_AudioLib.Parameter.Oscfreq, Mathf.Lerp(oscMin, oscMax, Mathf.Abs(totalRotationalMomentum2) / momentumMax)); sawSynth.SetFloatParameter(Hv_simple_saw_synth_AudioLib.Parameter.Freqcutoff, Mathf.Lerp(frequencyMin, frequencyMax, Mathf.Abs(netVelocity2.x) / netVelocityMax)); sawSynth.SetFloatParameter(Hv_simple_saw_synth_AudioLib.Parameter.Ringmodfreq, Mathf.Lerp(ringFreqMin, ringFreqMax, Mathf.Abs(netVelocity2.y) / netVelocityMax)); sawSynth.SetFloatParameter(Hv_simple_saw_synth_AudioLib.Parameter.Ringmodmultiplier, Mathf.Lerp(ringMultMin, ringMultMax, Mathf.Abs(netVelocity2.z) / netVelocityMax)); Hv_simple_square_synth_AudioLib squareSynth = basinAxis3.GetComponent <Hv_simple_square_synth_AudioLib>(); squareSynth.SetFloatParameter(Hv_simple_square_synth_AudioLib.Parameter.Gain, Mathf.Lerp(gainMin, gainMax, totalEnergy3 / energyMax)); squareSynth.SetFloatParameter(Hv_simple_square_synth_AudioLib.Parameter.Oscfreq, Mathf.Lerp(oscMin, oscMax, Mathf.Abs(totalRotationalMomentum3) / momentumMax)); squareSynth.SetFloatParameter(Hv_simple_square_synth_AudioLib.Parameter.Freqcutoff, Mathf.Lerp(frequencyMin, frequencyMax, Mathf.Abs(netVelocity3.x) / netVelocityMax)); squareSynth.SetFloatParameter(Hv_simple_square_synth_AudioLib.Parameter.Ringmodfreq, Mathf.Lerp(ringFreqMin, ringFreqMax, Mathf.Abs(netVelocity3.y) / netVelocityMax)); squareSynth.SetFloatParameter(Hv_simple_square_synth_AudioLib.Parameter.Ringmodmultiplier, Mathf.Lerp(ringMultMin, ringMultMax, Mathf.Abs(netVelocity3.z) / netVelocityMax)); }
public override void OnInspectorGUI() { bool isEnabled = _dsp.IsInstantiated(); if (!isEnabled) { EditorGUILayout.LabelField("Press Play!", EditorStyles.centeredGreyMiniLabel); } GUILayout.EndVertical(); // parameters GUI.enabled = true; GUILayout.BeginVertical(); EditorGUILayout.Space(); EditorGUI.indentLevel++; // freqCutoff GUILayout.BeginHorizontal(); float freqCutoff = _dsp.GetFloatParameter(Hv_simple_sin_synth_AudioLib.Parameter.Freqcutoff); float newFreqcutoff = EditorGUILayout.Slider("freqCutoff", freqCutoff, 0.0f, 20000.0f); if (freqCutoff != newFreqcutoff) { _dsp.SetFloatParameter(Hv_simple_sin_synth_AudioLib.Parameter.Freqcutoff, newFreqcutoff); } GUILayout.EndHorizontal(); // gain GUILayout.BeginHorizontal(); float gain = _dsp.GetFloatParameter(Hv_simple_sin_synth_AudioLib.Parameter.Gain); float newGain = EditorGUILayout.Slider("gain", gain, 0.0f, 1.0f); if (gain != newGain) { _dsp.SetFloatParameter(Hv_simple_sin_synth_AudioLib.Parameter.Gain, newGain); } GUILayout.EndHorizontal(); // oscFreq GUILayout.BeginHorizontal(); float oscFreq = _dsp.GetFloatParameter(Hv_simple_sin_synth_AudioLib.Parameter.Oscfreq); float newOscfreq = EditorGUILayout.Slider("oscFreq", oscFreq, 0.0f, 20000.0f); if (oscFreq != newOscfreq) { _dsp.SetFloatParameter(Hv_simple_sin_synth_AudioLib.Parameter.Oscfreq, newOscfreq); } GUILayout.EndHorizontal(); // ringModFreq GUILayout.BeginHorizontal(); float ringModFreq = _dsp.GetFloatParameter(Hv_simple_sin_synth_AudioLib.Parameter.Ringmodfreq); float newRingmodfreq = EditorGUILayout.Slider("ringModFreq", ringModFreq, 0.0f, 20000.0f); if (ringModFreq != newRingmodfreq) { _dsp.SetFloatParameter(Hv_simple_sin_synth_AudioLib.Parameter.Ringmodfreq, newRingmodfreq); } GUILayout.EndHorizontal(); // ringModMultiplier GUILayout.BeginHorizontal(); float ringModMultiplier = _dsp.GetFloatParameter(Hv_simple_sin_synth_AudioLib.Parameter.Ringmodmultiplier); float newRingmodmultiplier = EditorGUILayout.Slider("ringModMultiplier", ringModMultiplier, 0.0f, 1.0f); if (ringModMultiplier != newRingmodmultiplier) { _dsp.SetFloatParameter(Hv_simple_sin_synth_AudioLib.Parameter.Ringmodmultiplier, newRingmodmultiplier); } GUILayout.EndHorizontal(); EditorGUI.indentLevel--; }