├── LICENSE
├── MoogSynthUnity
├── Assets
│ ├── ADSR.cs
│ ├── ADSR.cs.meta
│ ├── CSharpSynth.unity
│ ├── CSharpSynth.unity.meta
│ ├── Editor.meta
│ ├── Editor
│ │ ├── MoogSynthInspector.cs
│ │ ├── MoogSynthInspector.cs.meta
│ │ ├── SequencerInspector.cs
│ │ └── SequencerInspector.cs.meta
│ ├── EventQueue.cs
│ ├── EventQueue.cs.meta
│ ├── MoogFilter.cs
│ ├── MoogFilter.cs.meta
│ ├── MoogSynth.cs
│ ├── MoogSynth.cs.meta
│ ├── NewAudioMixer.mixer
│ ├── NewAudioMixer.mixer.meta
│ ├── Phaser.cs
│ ├── Phaser.cs.meta
│ ├── Sequencer.cs
│ ├── Sequencer.cs.meta
│ ├── SequencerSimple.cs
│ └── SequencerSimple.cs.meta
├── Packages
│ └── manifest.json
└── ProjectSettings
│ ├── AudioManager.asset
│ ├── ClusterInputManager.asset
│ ├── DynamicsManager.asset
│ ├── EditorBuildSettings.asset
│ ├── EditorSettings.asset
│ ├── GraphicsSettings.asset
│ ├── InputManager.asset
│ ├── NavMeshAreas.asset
│ ├── NetworkManager.asset
│ ├── Physics2DSettings.asset
│ ├── PresetManager.asset
│ ├── ProjectSettings.asset
│ ├── ProjectVersion.txt
│ ├── QualitySettings.asset
│ ├── TagManager.asset
│ ├── TimeManager.asset
│ └── UnityConnectSettings.asset
├── README.md
└── screenshot.png
/LICENSE:
--------------------------------------------------------------------------------
1 | ADSR.cs
2 |
3 | License:
4 |
5 | This source code is provided as is, without warranty.
6 | You may copy and distribute verbatim copies of this document.
7 | You may modify and use this source code to create binary code for your own purposes, free or commercial.
8 |
9 | Created by Nigel Redmon on 12/18/12.
10 | EarLevel Engineering: earlevel.com
11 | Copyright 2012 Nigel Redmon
12 |
13 | Converted to C# by Jakob Schmid 2018.
14 |
15 | All other files
16 |
17 | License:
18 |
19 | Copyright (c) 2018 Jakob Schmid
20 |
21 | Permission is hereby granted, free of charge, to any person obtaining a copy
22 | of this software and associated documentation files (the "Software"), to deal
23 | in the Software without restriction, including without limitation the rights
24 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
25 | copies of the Software, and to permit persons to whom the Software is
26 | furnished to do so, subject to the following conditions:
27 |
28 | The above copyright notice and this permission notice shall be included in all
29 | copies or substantial portions of the Software.
30 |
31 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
32 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
33 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
34 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
35 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
36 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
37 | SOFTWARE."
38 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/ADSR.cs:
--------------------------------------------------------------------------------
1 | //
2 | // ADRS.h
3 | //
4 | // Created by Nigel Redmon on 12/18/12.
5 | // EarLevel Engineering: earlevel.com
6 | // Copyright 2012 Nigel Redmon
7 | //
8 | // For a complete explanation of the ADSR envelope generator and code,
9 | // read the series of articles by the author, starting here:
10 | // http://www.earlevel.com/main/2013/06/01/envelope-generators/
11 | //
12 | // License:
13 | //
14 | // This source code is provided as is, without warranty.
15 | // You may copy and distribute verbatim copies of this document.
16 | // You may modify and use this source code to create binary code for your own purposes, free or commercial.
17 | //
18 | // 1.01 2016-01-02 njr added calcCoef to SetTargetRatio functions that were in the ADSR widget but missing in this code
19 | // 1.02 2017-01-04 njr in calcCoef, checked for rate 0, to support non-IEEE compliant compilers
20 | //
21 | // Converted to C# by Jakob Schmid 2018.
22 |
23 | using UnityEngine;
24 |
25 | class ADSR
26 | {
27 | private enum envState
28 | {
29 | env_idle = 0,
30 | env_attack,
31 | env_decay,
32 | env_sustain,
33 | env_release
34 | };
35 |
36 | private envState state;
37 | private float output;
38 | private float attackRate;
39 | private float decayRate;
40 | private float releaseRate;
41 | private float attackCoef;
42 | private float decayCoef;
43 | private float releaseCoef;
44 | private float sustainLevel;
45 | private float targetRatioA;
46 | private float targetRatioDR;
47 | private float attackBase;
48 | private float decayBase;
49 | private float releaseBase;
50 |
51 | public ADSR()
52 | {
53 | reset();
54 | setAttackRate(0);
55 | setDecayRate(0);
56 | setReleaseRate(0);
57 | setSustainLevel(1.0f);
58 | setTargetRatioA(0.3f);
59 | setTargetRatioDR(0.0001f);
60 | }
61 |
62 | public void setAttackRate(float rate)
63 | {
64 | attackRate = rate;
65 | attackCoef = calcCoef(rate, targetRatioA);
66 | attackBase = (1.0f + targetRatioA) * (1.0f - attackCoef);
67 | }
68 | public void setDecayRate(float rate)
69 | {
70 | decayRate = rate;
71 | decayCoef = calcCoef(rate, targetRatioDR);
72 | decayBase = (sustainLevel - targetRatioDR) * (1.0f - decayCoef);
73 | }
74 | public void setReleaseRate(float rate)
75 | {
76 | releaseRate = rate;
77 | releaseCoef = calcCoef(rate, targetRatioDR);
78 | releaseBase = -targetRatioDR * (1.0f - releaseCoef);
79 | }
80 | public void setSustainLevel(float level)
81 | {
82 | sustainLevel = level;
83 | decayBase = (sustainLevel - targetRatioDR) * (1.0f - decayCoef);
84 | }
85 | public void setTargetRatioA(float targetRatio)
86 | {
87 | if (targetRatio < 0.000000001f)
88 | targetRatio = 0.000000001f; // -180 dB
89 | targetRatioA = targetRatio;
90 | attackCoef = calcCoef(attackRate, targetRatioA);
91 | attackBase = (1.0f + targetRatioA) * (1.0f - attackCoef);
92 | }
93 | public void setTargetRatioDR(float targetRatio)
94 | {
95 | if (targetRatio < 0.000000001f)
96 | targetRatio = 0.000000001f; // -180 dB
97 | targetRatioDR = targetRatio;
98 | decayCoef = calcCoef(decayRate, targetRatioDR);
99 | releaseCoef = calcCoef(releaseRate, targetRatioDR);
100 | decayBase = (sustainLevel - targetRatioDR) * (1.0f - decayCoef);
101 | releaseBase = -targetRatioDR * (1.0f - releaseCoef);
102 | }
103 | public void reset()
104 | {
105 | state = envState.env_idle;
106 | output = 0.0f;
107 | }
108 |
109 | private float calcCoef(float rate, float targetRatio)
110 | {
111 | return (rate <= 0) ? 0 : Mathf.Exp(-Mathf.Log((1.0f + targetRatio) / targetRatio) / rate);
112 | }
113 | public float process()
114 | {
115 | switch (state)
116 | {
117 | case envState.env_idle:
118 | break;
119 | case envState.env_attack:
120 | output = attackBase + output * attackCoef;
121 | if (output >= 1.0f)
122 | {
123 | output = 1.0f;
124 | state = envState.env_decay;
125 | }
126 | break;
127 | case envState.env_decay:
128 | output = decayBase + output * decayCoef;
129 | if (output <= sustainLevel)
130 | {
131 | output = sustainLevel;
132 | state = envState.env_sustain;
133 | }
134 | break;
135 | case envState.env_sustain:
136 | break;
137 | case envState.env_release:
138 | output = releaseBase + output * releaseCoef;
139 | if (output <= 0.0f)
140 | {
141 | output = 0.0f;
142 | state = envState.env_idle;
143 | }
144 | break;
145 | }
146 | return output;
147 | }
148 |
149 | public void gate(bool gate)
150 | {
151 | if (gate)
152 | state = envState.env_attack;
153 | else if (state != envState.env_idle)
154 | state = envState.env_release;
155 | }
156 |
157 | envState getState()
158 | {
159 | return state;
160 | }
161 |
162 | float getOutput()
163 | {
164 | return output;
165 | }
166 | }
167 |
168 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/ADSR.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 6d7282965778be640b046d1ba17ffa7c
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/CSharpSynth.unity:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!29 &1
4 | OcclusionCullingSettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 2
7 | m_OcclusionBakeSettings:
8 | smallestOccluder: 5
9 | smallestHole: 0.25
10 | backfaceThreshold: 100
11 | m_SceneGUID: 00000000000000000000000000000000
12 | m_OcclusionCullingData: {fileID: 0}
13 | --- !u!104 &2
14 | RenderSettings:
15 | m_ObjectHideFlags: 0
16 | serializedVersion: 9
17 | m_Fog: 0
18 | m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
19 | m_FogMode: 3
20 | m_FogDensity: 0.01
21 | m_LinearFogStart: 0
22 | m_LinearFogEnd: 300
23 | m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1}
24 | m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1}
25 | m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1}
26 | m_AmbientIntensity: 1
27 | m_AmbientMode: 0
28 | m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
29 | m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0}
30 | m_HaloStrength: 0.5
31 | m_FlareStrength: 1
32 | m_FlareFadeSpeed: 3
33 | m_HaloTexture: {fileID: 0}
34 | m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0}
35 | m_DefaultReflectionMode: 0
36 | m_DefaultReflectionResolution: 128
37 | m_ReflectionBounces: 1
38 | m_ReflectionIntensity: 1
39 | m_CustomReflection: {fileID: 0}
40 | m_Sun: {fileID: 0}
41 | m_IndirectSpecularColor: {r: 0.44657844, g: 0.49641222, b: 0.57481694, a: 1}
42 | m_UseRadianceAmbientProbe: 0
43 | --- !u!157 &3
44 | LightmapSettings:
45 | m_ObjectHideFlags: 0
46 | serializedVersion: 11
47 | m_GIWorkflowMode: 0
48 | m_GISettings:
49 | serializedVersion: 2
50 | m_BounceScale: 1
51 | m_IndirectOutputScale: 1
52 | m_AlbedoBoost: 1
53 | m_TemporalCoherenceThreshold: 1
54 | m_EnvironmentLightingMode: 0
55 | m_EnableBakedLightmaps: 1
56 | m_EnableRealtimeLightmaps: 1
57 | m_LightmapEditorSettings:
58 | serializedVersion: 10
59 | m_Resolution: 2
60 | m_BakeResolution: 40
61 | m_AtlasSize: 1024
62 | m_AO: 0
63 | m_AOMaxDistance: 1
64 | m_CompAOExponent: 1
65 | m_CompAOExponentDirect: 0
66 | m_Padding: 2
67 | m_LightmapParameters: {fileID: 0}
68 | m_LightmapsBakeMode: 1
69 | m_TextureCompression: 1
70 | m_FinalGather: 0
71 | m_FinalGatherFiltering: 1
72 | m_FinalGatherRayCount: 256
73 | m_ReflectionCompression: 2
74 | m_MixedBakeMode: 2
75 | m_BakeBackend: 0
76 | m_PVRSampling: 1
77 | m_PVRDirectSampleCount: 32
78 | m_PVRSampleCount: 500
79 | m_PVRBounces: 2
80 | m_PVRFilterTypeDirect: 0
81 | m_PVRFilterTypeIndirect: 0
82 | m_PVRFilterTypeAO: 0
83 | m_PVRFilteringMode: 1
84 | m_PVRCulling: 1
85 | m_PVRFilteringGaussRadiusDirect: 1
86 | m_PVRFilteringGaussRadiusIndirect: 5
87 | m_PVRFilteringGaussRadiusAO: 2
88 | m_PVRFilteringAtrousPositionSigmaDirect: 0.5
89 | m_PVRFilteringAtrousPositionSigmaIndirect: 2
90 | m_PVRFilteringAtrousPositionSigmaAO: 1
91 | m_ShowResolutionOverlay: 1
92 | m_LightingDataAsset: {fileID: 0}
93 | m_UseShadowmask: 1
94 | --- !u!196 &4
95 | NavMeshSettings:
96 | serializedVersion: 2
97 | m_ObjectHideFlags: 0
98 | m_BuildSettings:
99 | serializedVersion: 2
100 | agentTypeID: 0
101 | agentRadius: 0.5
102 | agentHeight: 2
103 | agentSlope: 45
104 | agentClimb: 0.4
105 | ledgeDropHeight: 0
106 | maxJumpAcrossDistance: 0
107 | minRegionArea: 2
108 | manualCellSize: 0
109 | cellSize: 0.16666667
110 | manualTileSize: 0
111 | tileSize: 256
112 | accuratePlacement: 0
113 | debug:
114 | m_Flags: 0
115 | m_NavMeshData: {fileID: 0}
116 | --- !u!1 &181206368
117 | GameObject:
118 | m_ObjectHideFlags: 0
119 | m_CorrespondingSourceObject: {fileID: 0}
120 | m_PrefabInternal: {fileID: 0}
121 | serializedVersion: 6
122 | m_Component:
123 | - component: {fileID: 181206370}
124 | - component: {fileID: 181206369}
125 | m_Layer: 0
126 | m_Name: Directional Light
127 | m_TagString: Untagged
128 | m_Icon: {fileID: 0}
129 | m_NavMeshLayer: 0
130 | m_StaticEditorFlags: 0
131 | m_IsActive: 1
132 | --- !u!108 &181206369
133 | Light:
134 | m_ObjectHideFlags: 0
135 | m_CorrespondingSourceObject: {fileID: 0}
136 | m_PrefabInternal: {fileID: 0}
137 | m_GameObject: {fileID: 181206368}
138 | m_Enabled: 1
139 | serializedVersion: 8
140 | m_Type: 1
141 | m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1}
142 | m_Intensity: 1
143 | m_Range: 10
144 | m_SpotAngle: 30
145 | m_CookieSize: 10
146 | m_Shadows:
147 | m_Type: 2
148 | m_Resolution: -1
149 | m_CustomResolution: -1
150 | m_Strength: 1
151 | m_Bias: 0.05
152 | m_NormalBias: 0.4
153 | m_NearPlane: 0.2
154 | m_Cookie: {fileID: 0}
155 | m_DrawHalo: 0
156 | m_Flare: {fileID: 0}
157 | m_RenderMode: 0
158 | m_CullingMask:
159 | serializedVersion: 2
160 | m_Bits: 4294967295
161 | m_Lightmapping: 4
162 | m_LightShadowCasterMode: 0
163 | m_AreaSize: {x: 1, y: 1}
164 | m_BounceIntensity: 1
165 | m_ColorTemperature: 6570
166 | m_UseColorTemperature: 0
167 | m_ShadowRadius: 0
168 | m_ShadowAngle: 0
169 | --- !u!4 &181206370
170 | Transform:
171 | m_ObjectHideFlags: 0
172 | m_CorrespondingSourceObject: {fileID: 0}
173 | m_PrefabInternal: {fileID: 0}
174 | m_GameObject: {fileID: 181206368}
175 | m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
176 | m_LocalPosition: {x: 0, y: 3, z: 0}
177 | m_LocalScale: {x: 1, y: 1, z: 1}
178 | m_Children: []
179 | m_Father: {fileID: 0}
180 | m_RootOrder: 1
181 | m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
182 | --- !u!1 &370482301
183 | GameObject:
184 | m_ObjectHideFlags: 0
185 | m_CorrespondingSourceObject: {fileID: 0}
186 | m_PrefabInternal: {fileID: 0}
187 | serializedVersion: 6
188 | m_Component:
189 | - component: {fileID: 370482307}
190 | - component: {fileID: 370482306}
191 | - component: {fileID: 370482302}
192 | - component: {fileID: 370482304}
193 | m_Layer: 0
194 | m_Name: Arp
195 | m_TagString: Untagged
196 | m_Icon: {fileID: 0}
197 | m_NavMeshLayer: 0
198 | m_StaticEditorFlags: 0
199 | m_IsActive: 1
200 | --- !u!114 &370482302
201 | MonoBehaviour:
202 | m_ObjectHideFlags: 0
203 | m_CorrespondingSourceObject: {fileID: 0}
204 | m_PrefabInternal: {fileID: 0}
205 | m_GameObject: {fileID: 370482301}
206 | m_Enabled: 1
207 | m_EditorHideFlags: 0
208 | m_Script: {fileID: 11500000, guid: ca607083fb9ba7945963d2c0c0013231, type: 3}
209 | m_Name:
210 | m_EditorClassIdentifier:
211 | synth: {fileID: 370482304}
212 | tempo: 120
213 | tempoSubdivision: 10
214 | pitch: 0000000003000000070000000c0000000f00000013000000180000001b0000001f0000002400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
215 | transpose: 64
216 | pitchRandomize: 0
217 | length: 7
218 | --- !u!114 &370482304
219 | MonoBehaviour:
220 | m_ObjectHideFlags: 0
221 | m_CorrespondingSourceObject: {fileID: 0}
222 | m_PrefabInternal: {fileID: 0}
223 | m_GameObject: {fileID: 370482301}
224 | m_Enabled: 1
225 | m_EditorHideFlags: 0
226 | m_Script: {fileID: 11500000, guid: 1e350324ae1f1b4478413f08cc0f899c, type: 3}
227 | m_Name:
228 | m_EditorClassIdentifier:
229 | filterType: 0
230 | cutoffFrequency: 24000
231 | resonance: 0.5438478
232 | filterEnvDecay: 0.626
233 | filterEnabled: 0
234 | oversampling: 2
235 | squareAmp: 0.124
236 | sawAmp: 0
237 | subSine: 0
238 | pwmStrength: 0.836
239 | pwmFrequency: 0.038
240 | aenv_attack: 0
241 | aenv_decay: 0.397
242 | aenv_sustain: 0
243 | aenv_release: 0
244 | modulationMatrix:
245 | - 0
246 | - 0
247 | - 0
248 | - 0
249 | - 0
250 | - 0
251 | - 0
252 | - 0
253 | - 0
254 | - 0
255 | - 0
256 | - 0
257 | - 0
258 | - 0
259 | - 0
260 | - 0
261 | - 0
262 | - 0
263 | - 0
264 | - 0
265 | - 0
266 | - 0
267 | - 0
268 | - 0
269 | - 0
270 | - 0
271 | - 0
272 | - 0
273 | - 0
274 | - 0
275 | - 0
276 | - 0
277 | - 0
278 | - 0
279 | - 0
280 | - 0
281 | --- !u!82 &370482306
282 | AudioSource:
283 | m_ObjectHideFlags: 0
284 | m_CorrespondingSourceObject: {fileID: 0}
285 | m_PrefabInternal: {fileID: 0}
286 | m_GameObject: {fileID: 370482301}
287 | m_Enabled: 1
288 | serializedVersion: 4
289 | OutputAudioMixerGroup: {fileID: 243755139085696720, guid: cb40aeaae2fe0654f85b5988fe789cf8,
290 | type: 2}
291 | m_audioClip: {fileID: 0}
292 | m_PlayOnAwake: 1
293 | m_Volume: 1
294 | m_Pitch: 1
295 | Loop: 0
296 | Mute: 0
297 | Spatialize: 0
298 | SpatializePostEffects: 0
299 | Priority: 128
300 | DopplerLevel: 1
301 | MinDistance: 1
302 | MaxDistance: 500
303 | Pan2D: 0
304 | rolloffMode: 0
305 | BypassEffects: 0
306 | BypassListenerEffects: 0
307 | BypassReverbZones: 0
308 | rolloffCustomCurve:
309 | serializedVersion: 2
310 | m_Curve:
311 | - serializedVersion: 3
312 | time: 0
313 | value: 1
314 | inSlope: 0
315 | outSlope: 0
316 | tangentMode: 0
317 | weightedMode: 0
318 | inWeight: 0.33333334
319 | outWeight: 0.33333334
320 | - serializedVersion: 3
321 | time: 1
322 | value: 0
323 | inSlope: 0
324 | outSlope: 0
325 | tangentMode: 0
326 | weightedMode: 0
327 | inWeight: 0.33333334
328 | outWeight: 0.33333334
329 | m_PreInfinity: 2
330 | m_PostInfinity: 2
331 | m_RotationOrder: 4
332 | panLevelCustomCurve:
333 | serializedVersion: 2
334 | m_Curve:
335 | - serializedVersion: 3
336 | time: 0
337 | value: 0
338 | inSlope: 0
339 | outSlope: 0
340 | tangentMode: 0
341 | weightedMode: 0
342 | inWeight: 0.33333334
343 | outWeight: 0.33333334
344 | m_PreInfinity: 2
345 | m_PostInfinity: 2
346 | m_RotationOrder: 0
347 | spreadCustomCurve:
348 | serializedVersion: 2
349 | m_Curve:
350 | - serializedVersion: 3
351 | time: 0
352 | value: 0
353 | inSlope: 0
354 | outSlope: 0
355 | tangentMode: 0
356 | weightedMode: 0
357 | inWeight: 0.33333334
358 | outWeight: 0.33333334
359 | m_PreInfinity: 2
360 | m_PostInfinity: 2
361 | m_RotationOrder: 4
362 | reverbZoneMixCustomCurve:
363 | serializedVersion: 2
364 | m_Curve:
365 | - serializedVersion: 3
366 | time: 0
367 | value: 1
368 | inSlope: 0
369 | outSlope: 0
370 | tangentMode: 0
371 | weightedMode: 0
372 | inWeight: 0.33333334
373 | outWeight: 0.33333334
374 | m_PreInfinity: 2
375 | m_PostInfinity: 2
376 | m_RotationOrder: 0
377 | --- !u!4 &370482307
378 | Transform:
379 | m_ObjectHideFlags: 0
380 | m_CorrespondingSourceObject: {fileID: 0}
381 | m_PrefabInternal: {fileID: 0}
382 | m_GameObject: {fileID: 370482301}
383 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
384 | m_LocalPosition: {x: 0, y: 1, z: -10}
385 | m_LocalScale: {x: 1, y: 1, z: 1}
386 | m_Children: []
387 | m_Father: {fileID: 0}
388 | m_RootOrder: 5
389 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
390 | --- !u!1 &713009998
391 | GameObject:
392 | m_ObjectHideFlags: 0
393 | m_CorrespondingSourceObject: {fileID: 0}
394 | m_PrefabInternal: {fileID: 0}
395 | serializedVersion: 6
396 | m_Component:
397 | - component: {fileID: 713010001}
398 | - component: {fileID: 713010000}
399 | - component: {fileID: 713010002}
400 | - component: {fileID: 713009999}
401 | m_Layer: 0
402 | m_Name: Bass
403 | m_TagString: Untagged
404 | m_Icon: {fileID: 0}
405 | m_NavMeshLayer: 0
406 | m_StaticEditorFlags: 0
407 | m_IsActive: 1
408 | --- !u!114 &713009999
409 | MonoBehaviour:
410 | m_ObjectHideFlags: 0
411 | m_CorrespondingSourceObject: {fileID: 0}
412 | m_PrefabInternal: {fileID: 0}
413 | m_GameObject: {fileID: 713009998}
414 | m_Enabled: 1
415 | m_EditorHideFlags: 0
416 | m_Script: {fileID: 11500000, guid: 1e350324ae1f1b4478413f08cc0f899c, type: 3}
417 | m_Name:
418 | m_EditorClassIdentifier:
419 | filterType: 0
420 | cutoffFrequency: 5650
421 | resonance: 0.07
422 | filterEnvDecay: 0.281
423 | filterEnabled: 1
424 | oversampling: 2
425 | squareAmp: 1
426 | sawAmp: 0
427 | subSine: 0.948
428 | pwmStrength: 0.94
429 | pwmFrequency: 0.129
430 | aenv_attack: 0
431 | aenv_decay: 0.786
432 | aenv_sustain: 0
433 | aenv_release: 0.138
434 | modulationMatrix:
435 | - 7
436 | - 5
437 | - 0
438 | - 0
439 | - 0
440 | - 0
441 | - 0
442 | - 0
443 | - 0
444 | - 0
445 | - 0
446 | - 0
447 | - 0
448 | - 0
449 | - 0
450 | - 0
451 | - 0
452 | - 0
453 | - 0
454 | - 0
455 | - 0
456 | - 0
457 | - 0
458 | - 0
459 | - 0
460 | - 0
461 | - 12
462 | - 0
463 | - 0
464 | - 0
465 | - 0
466 | - 0
467 | - 0
468 | - 0
469 | - 0
470 | - 0
471 | --- !u!82 &713010000
472 | AudioSource:
473 | m_ObjectHideFlags: 0
474 | m_CorrespondingSourceObject: {fileID: 0}
475 | m_PrefabInternal: {fileID: 0}
476 | m_GameObject: {fileID: 713009998}
477 | m_Enabled: 1
478 | serializedVersion: 4
479 | OutputAudioMixerGroup: {fileID: 243311110667323148, guid: cb40aeaae2fe0654f85b5988fe789cf8,
480 | type: 2}
481 | m_audioClip: {fileID: 8300000, guid: 37fac9382806a5847b98f53bccc91b8d, type: 3}
482 | m_PlayOnAwake: 1
483 | m_Volume: 1
484 | m_Pitch: 1
485 | Loop: 1
486 | Mute: 0
487 | Spatialize: 0
488 | SpatializePostEffects: 0
489 | Priority: 128
490 | DopplerLevel: 1
491 | MinDistance: 1
492 | MaxDistance: 500
493 | Pan2D: 0
494 | rolloffMode: 0
495 | BypassEffects: 0
496 | BypassListenerEffects: 0
497 | BypassReverbZones: 0
498 | rolloffCustomCurve:
499 | serializedVersion: 2
500 | m_Curve:
501 | - serializedVersion: 3
502 | time: 0
503 | value: 1
504 | inSlope: 0
505 | outSlope: 0
506 | tangentMode: 0
507 | weightedMode: 0
508 | inWeight: 0.33333334
509 | outWeight: 0.33333334
510 | - serializedVersion: 3
511 | time: 1
512 | value: 0
513 | inSlope: 0
514 | outSlope: 0
515 | tangentMode: 0
516 | weightedMode: 0
517 | inWeight: 0.33333334
518 | outWeight: 0.33333334
519 | m_PreInfinity: 2
520 | m_PostInfinity: 2
521 | m_RotationOrder: 4
522 | panLevelCustomCurve:
523 | serializedVersion: 2
524 | m_Curve:
525 | - serializedVersion: 3
526 | time: 0
527 | value: 0
528 | inSlope: 0
529 | outSlope: 0
530 | tangentMode: 0
531 | weightedMode: 0
532 | inWeight: 0.33333334
533 | outWeight: 0.33333334
534 | m_PreInfinity: 2
535 | m_PostInfinity: 2
536 | m_RotationOrder: 0
537 | spreadCustomCurve:
538 | serializedVersion: 2
539 | m_Curve:
540 | - serializedVersion: 3
541 | time: 0
542 | value: 0
543 | inSlope: 0
544 | outSlope: 0
545 | tangentMode: 0
546 | weightedMode: 0
547 | inWeight: 0.33333334
548 | outWeight: 0.33333334
549 | m_PreInfinity: 2
550 | m_PostInfinity: 2
551 | m_RotationOrder: 4
552 | reverbZoneMixCustomCurve:
553 | serializedVersion: 2
554 | m_Curve:
555 | - serializedVersion: 3
556 | time: 0
557 | value: 1
558 | inSlope: 0
559 | outSlope: 0
560 | tangentMode: 0
561 | weightedMode: 0
562 | inWeight: 0.33333334
563 | outWeight: 0.33333334
564 | m_PreInfinity: 2
565 | m_PostInfinity: 2
566 | m_RotationOrder: 0
567 | --- !u!4 &713010001
568 | Transform:
569 | m_ObjectHideFlags: 0
570 | m_CorrespondingSourceObject: {fileID: 0}
571 | m_PrefabInternal: {fileID: 0}
572 | m_GameObject: {fileID: 713009998}
573 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
574 | m_LocalPosition: {x: 0, y: 1, z: -10}
575 | m_LocalScale: {x: 1, y: 1, z: 1}
576 | m_Children: []
577 | m_Father: {fileID: 0}
578 | m_RootOrder: 2
579 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
580 | --- !u!114 &713010002
581 | MonoBehaviour:
582 | m_ObjectHideFlags: 0
583 | m_CorrespondingSourceObject: {fileID: 0}
584 | m_PrefabInternal: {fileID: 0}
585 | m_GameObject: {fileID: 713009998}
586 | m_Enabled: 1
587 | m_EditorHideFlags: 0
588 | m_Script: {fileID: 11500000, guid: ca607083fb9ba7945963d2c0c0013231, type: 3}
589 | m_Name:
590 | m_EditorClassIdentifier:
591 | synth: {fileID: 713009999}
592 | tempo: 120
593 | tempoSubdivision: 2
594 | pitch: 0000000003000000070000000c0000000e000000070000000200000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
595 | transpose: 40
596 | pitchRandomize: 0
597 | length: 8
598 | --- !u!1 &862859699
599 | GameObject:
600 | m_ObjectHideFlags: 0
601 | m_CorrespondingSourceObject: {fileID: 0}
602 | m_PrefabInternal: {fileID: 0}
603 | serializedVersion: 6
604 | m_Component:
605 | - component: {fileID: 862859704}
606 | - component: {fileID: 862859703}
607 | - component: {fileID: 862859702}
608 | - component: {fileID: 862859701}
609 | m_Layer: 0
610 | m_Name: Main Camera
611 | m_TagString: MainCamera
612 | m_Icon: {fileID: 0}
613 | m_NavMeshLayer: 0
614 | m_StaticEditorFlags: 0
615 | m_IsActive: 1
616 | --- !u!81 &862859701
617 | AudioListener:
618 | m_ObjectHideFlags: 0
619 | m_CorrespondingSourceObject: {fileID: 0}
620 | m_PrefabInternal: {fileID: 0}
621 | m_GameObject: {fileID: 862859699}
622 | m_Enabled: 1
623 | --- !u!124 &862859702
624 | Behaviour:
625 | m_ObjectHideFlags: 0
626 | m_CorrespondingSourceObject: {fileID: 0}
627 | m_PrefabInternal: {fileID: 0}
628 | m_GameObject: {fileID: 862859699}
629 | m_Enabled: 1
630 | --- !u!20 &862859703
631 | Camera:
632 | m_ObjectHideFlags: 0
633 | m_CorrespondingSourceObject: {fileID: 0}
634 | m_PrefabInternal: {fileID: 0}
635 | m_GameObject: {fileID: 862859699}
636 | m_Enabled: 1
637 | serializedVersion: 2
638 | m_ClearFlags: 1
639 | m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
640 | m_projectionMatrixMode: 1
641 | m_SensorSize: {x: 36, y: 24}
642 | m_LensShift: {x: 0, y: 0}
643 | m_FocalLength: 50
644 | m_NormalizedViewPortRect:
645 | serializedVersion: 2
646 | x: 0
647 | y: 0
648 | width: 1
649 | height: 1
650 | near clip plane: 0.3
651 | far clip plane: 1000
652 | field of view: 60
653 | orthographic: 0
654 | orthographic size: 5
655 | m_Depth: -1
656 | m_CullingMask:
657 | serializedVersion: 2
658 | m_Bits: 4294967295
659 | m_RenderingPath: -1
660 | m_TargetTexture: {fileID: 0}
661 | m_TargetDisplay: 0
662 | m_TargetEye: 3
663 | m_HDR: 1
664 | m_AllowMSAA: 1
665 | m_AllowDynamicResolution: 0
666 | m_ForceIntoRT: 0
667 | m_OcclusionCulling: 1
668 | m_StereoConvergence: 10
669 | m_StereoSeparation: 0.022
670 | --- !u!4 &862859704
671 | Transform:
672 | m_ObjectHideFlags: 0
673 | m_CorrespondingSourceObject: {fileID: 0}
674 | m_PrefabInternal: {fileID: 0}
675 | m_GameObject: {fileID: 862859699}
676 | m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
677 | m_LocalPosition: {x: 0, y: 1, z: -10}
678 | m_LocalScale: {x: 1, y: 1, z: 1}
679 | m_Children: []
680 | m_Father: {fileID: 0}
681 | m_RootOrder: 0
682 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
683 | --- !u!1 &1497248668
684 | GameObject:
685 | m_ObjectHideFlags: 0
686 | m_CorrespondingSourceObject: {fileID: 0}
687 | m_PrefabInternal: {fileID: 0}
688 | serializedVersion: 6
689 | m_Component:
690 | - component: {fileID: 1497248672}
691 | - component: {fileID: 1497248671}
692 | - component: {fileID: 1497248670}
693 | - component: {fileID: 1497248669}
694 | m_Layer: 0
695 | m_Name: Theme
696 | m_TagString: Untagged
697 | m_Icon: {fileID: 0}
698 | m_NavMeshLayer: 0
699 | m_StaticEditorFlags: 0
700 | m_IsActive: 1
701 | --- !u!114 &1497248669
702 | MonoBehaviour:
703 | m_ObjectHideFlags: 0
704 | m_CorrespondingSourceObject: {fileID: 0}
705 | m_PrefabInternal: {fileID: 0}
706 | m_GameObject: {fileID: 1497248668}
707 | m_Enabled: 1
708 | m_EditorHideFlags: 0
709 | m_Script: {fileID: 11500000, guid: 1e350324ae1f1b4478413f08cc0f899c, type: 3}
710 | m_Name:
711 | m_EditorClassIdentifier:
712 | filterType: 0
713 | cutoffFrequency: 16249
714 | resonance: 0.14
715 | filterEnvDecay: 1
716 | filterEnabled: 1
717 | oversampling: 2
718 | squareAmp: 0
719 | sawAmp: 1
720 | subSine: 0.904
721 | pwmStrength: 0
722 | pwmFrequency: 0
723 | aenv_attack: 0.9
724 | aenv_decay: 0.83
725 | aenv_sustain: 0
726 | aenv_release: 0.865
727 | modulationMatrix:
728 | - 0
729 | - 0
730 | - 0
731 | - 0
732 | - 0
733 | - 0
734 | - 0
735 | - 0
736 | - 0
737 | - 0
738 | - 0
739 | - 0
740 | - 0
741 | - 0
742 | - 0
743 | - 0
744 | - 0
745 | - 0
746 | - 0
747 | - 0
748 | - 0
749 | - 0
750 | - 0
751 | - 0
752 | - 0
753 | - 0
754 | - 0
755 | - 0
756 | - 0
757 | - 0
758 | - 0
759 | - 0
760 | - 0
761 | - 0
762 | - 0
763 | - 0
764 | --- !u!114 &1497248670
765 | MonoBehaviour:
766 | m_ObjectHideFlags: 0
767 | m_CorrespondingSourceObject: {fileID: 0}
768 | m_PrefabInternal: {fileID: 0}
769 | m_GameObject: {fileID: 1497248668}
770 | m_Enabled: 1
771 | m_EditorHideFlags: 0
772 | m_Script: {fileID: 11500000, guid: ca607083fb9ba7945963d2c0c0013231, type: 3}
773 | m_Name:
774 | m_EditorClassIdentifier:
775 | synth: {fileID: 1497248669}
776 | tempo: 15
777 | tempoSubdivision: 1
778 | pitch: 07000000030000000a0000000e00000002000000feffffff0a0000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
779 | transpose: 52
780 | pitchRandomize: 0
781 | length: 8
782 | --- !u!82 &1497248671
783 | AudioSource:
784 | m_ObjectHideFlags: 0
785 | m_CorrespondingSourceObject: {fileID: 0}
786 | m_PrefabInternal: {fileID: 0}
787 | m_GameObject: {fileID: 1497248668}
788 | m_Enabled: 1
789 | serializedVersion: 4
790 | OutputAudioMixerGroup: {fileID: 243835790171793730, guid: cb40aeaae2fe0654f85b5988fe789cf8,
791 | type: 2}
792 | m_audioClip: {fileID: 0}
793 | m_PlayOnAwake: 1
794 | m_Volume: 1
795 | m_Pitch: 1
796 | Loop: 0
797 | Mute: 0
798 | Spatialize: 0
799 | SpatializePostEffects: 0
800 | Priority: 128
801 | DopplerLevel: 1
802 | MinDistance: 1
803 | MaxDistance: 500
804 | Pan2D: 0
805 | rolloffMode: 0
806 | BypassEffects: 0
807 | BypassListenerEffects: 0
808 | BypassReverbZones: 0
809 | rolloffCustomCurve:
810 | serializedVersion: 2
811 | m_Curve:
812 | - serializedVersion: 3
813 | time: 0
814 | value: 1
815 | inSlope: 0
816 | outSlope: 0
817 | tangentMode: 0
818 | weightedMode: 0
819 | inWeight: 0.33333334
820 | outWeight: 0.33333334
821 | - serializedVersion: 3
822 | time: 1
823 | value: 0
824 | inSlope: 0
825 | outSlope: 0
826 | tangentMode: 0
827 | weightedMode: 0
828 | inWeight: 0.33333334
829 | outWeight: 0.33333334
830 | m_PreInfinity: 2
831 | m_PostInfinity: 2
832 | m_RotationOrder: 4
833 | panLevelCustomCurve:
834 | serializedVersion: 2
835 | m_Curve:
836 | - serializedVersion: 3
837 | time: 0
838 | value: 0
839 | inSlope: 0
840 | outSlope: 0
841 | tangentMode: 0
842 | weightedMode: 0
843 | inWeight: 0.33333334
844 | outWeight: 0.33333334
845 | m_PreInfinity: 2
846 | m_PostInfinity: 2
847 | m_RotationOrder: 0
848 | spreadCustomCurve:
849 | serializedVersion: 2
850 | m_Curve:
851 | - serializedVersion: 3
852 | time: 0
853 | value: 0
854 | inSlope: 0
855 | outSlope: 0
856 | tangentMode: 0
857 | weightedMode: 0
858 | inWeight: 0.33333334
859 | outWeight: 0.33333334
860 | m_PreInfinity: 2
861 | m_PostInfinity: 2
862 | m_RotationOrder: 4
863 | reverbZoneMixCustomCurve:
864 | serializedVersion: 2
865 | m_Curve:
866 | - serializedVersion: 3
867 | time: 0
868 | value: 1
869 | inSlope: 0
870 | outSlope: 0
871 | tangentMode: 0
872 | weightedMode: 0
873 | inWeight: 0.33333334
874 | outWeight: 0.33333334
875 | m_PreInfinity: 2
876 | m_PostInfinity: 2
877 | m_RotationOrder: 0
878 | --- !u!4 &1497248672
879 | Transform:
880 | m_ObjectHideFlags: 0
881 | m_CorrespondingSourceObject: {fileID: 0}
882 | m_PrefabInternal: {fileID: 0}
883 | m_GameObject: {fileID: 1497248668}
884 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
885 | m_LocalPosition: {x: 0, y: 1, z: -10}
886 | m_LocalScale: {x: 1, y: 1, z: 1}
887 | m_Children: []
888 | m_Father: {fileID: 0}
889 | m_RootOrder: 4
890 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
891 | --- !u!1 &2015964820
892 | GameObject:
893 | m_ObjectHideFlags: 0
894 | m_CorrespondingSourceObject: {fileID: 0}
895 | m_PrefabInternal: {fileID: 0}
896 | serializedVersion: 6
897 | m_Component:
898 | - component: {fileID: 2015964824}
899 | - component: {fileID: 2015964823}
900 | - component: {fileID: 2015964822}
901 | - component: {fileID: 2015964821}
902 | m_Layer: 0
903 | m_Name: Bass 5th
904 | m_TagString: Untagged
905 | m_Icon: {fileID: 0}
906 | m_NavMeshLayer: 0
907 | m_StaticEditorFlags: 0
908 | m_IsActive: 1
909 | --- !u!114 &2015964821
910 | MonoBehaviour:
911 | m_ObjectHideFlags: 0
912 | m_CorrespondingSourceObject: {fileID: 0}
913 | m_PrefabInternal: {fileID: 0}
914 | m_GameObject: {fileID: 2015964820}
915 | m_Enabled: 1
916 | m_EditorHideFlags: 0
917 | m_Script: {fileID: 11500000, guid: 1e350324ae1f1b4478413f08cc0f899c, type: 3}
918 | m_Name:
919 | m_EditorClassIdentifier:
920 | filterType: 0
921 | cutoffFrequency: 4463
922 | resonance: 0
923 | filterEnvDecay: 0.769
924 | filterEnabled: 1
925 | oversampling: 2
926 | squareAmp: 0
927 | sawAmp: 0.512
928 | subSine: 0
929 | pwmStrength: 0.94
930 | pwmFrequency: 0.129
931 | aenv_attack: 0.277
932 | aenv_decay: 0.159
933 | aenv_sustain: 0.453
934 | aenv_release: 0.138
935 | modulationMatrix:
936 | - 7
937 | - 5
938 | - 0
939 | - 0
940 | - 0
941 | - 0
942 | - 0
943 | - 0
944 | - 0
945 | - 0
946 | - 0
947 | - 0
948 | - 0
949 | - 0
950 | - 0
951 | - 0
952 | - 0
953 | - 0
954 | - 0
955 | - 0
956 | - 0
957 | - 0
958 | - 0
959 | - 0
960 | - 0
961 | - 0
962 | - 12
963 | - 0
964 | - 0
965 | - 0
966 | - 0
967 | - 0
968 | - 0
969 | - 0
970 | - 0
971 | - 0
972 | --- !u!114 &2015964822
973 | MonoBehaviour:
974 | m_ObjectHideFlags: 0
975 | m_CorrespondingSourceObject: {fileID: 0}
976 | m_PrefabInternal: {fileID: 0}
977 | m_GameObject: {fileID: 2015964820}
978 | m_Enabled: 1
979 | m_EditorHideFlags: 0
980 | m_Script: {fileID: 11500000, guid: ca607083fb9ba7945963d2c0c0013231, type: 3}
981 | m_Name:
982 | m_EditorClassIdentifier:
983 | synth: {fileID: 2015964821}
984 | tempo: 120
985 | tempoSubdivision: 2
986 | pitch: 0000000003000000070000000c0000000e000000070000000200000018000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
987 | transpose: 47
988 | pitchRandomize: 0
989 | length: 8
990 | --- !u!82 &2015964823
991 | AudioSource:
992 | m_ObjectHideFlags: 0
993 | m_CorrespondingSourceObject: {fileID: 0}
994 | m_PrefabInternal: {fileID: 0}
995 | m_GameObject: {fileID: 2015964820}
996 | m_Enabled: 1
997 | serializedVersion: 4
998 | OutputAudioMixerGroup: {fileID: 243316727705101024, guid: cb40aeaae2fe0654f85b5988fe789cf8,
999 | type: 2}
1000 | m_audioClip: {fileID: 8300000, guid: 37fac9382806a5847b98f53bccc91b8d, type: 3}
1001 | m_PlayOnAwake: 1
1002 | m_Volume: 1
1003 | m_Pitch: 1
1004 | Loop: 1
1005 | Mute: 0
1006 | Spatialize: 0
1007 | SpatializePostEffects: 0
1008 | Priority: 128
1009 | DopplerLevel: 1
1010 | MinDistance: 1
1011 | MaxDistance: 500
1012 | Pan2D: 0
1013 | rolloffMode: 0
1014 | BypassEffects: 0
1015 | BypassListenerEffects: 0
1016 | BypassReverbZones: 0
1017 | rolloffCustomCurve:
1018 | serializedVersion: 2
1019 | m_Curve:
1020 | - serializedVersion: 3
1021 | time: 0
1022 | value: 1
1023 | inSlope: 0
1024 | outSlope: 0
1025 | tangentMode: 0
1026 | weightedMode: 0
1027 | inWeight: 0.33333334
1028 | outWeight: 0.33333334
1029 | - serializedVersion: 3
1030 | time: 1
1031 | value: 0
1032 | inSlope: 0
1033 | outSlope: 0
1034 | tangentMode: 0
1035 | weightedMode: 0
1036 | inWeight: 0.33333334
1037 | outWeight: 0.33333334
1038 | m_PreInfinity: 2
1039 | m_PostInfinity: 2
1040 | m_RotationOrder: 4
1041 | panLevelCustomCurve:
1042 | serializedVersion: 2
1043 | m_Curve:
1044 | - serializedVersion: 3
1045 | time: 0
1046 | value: 0
1047 | inSlope: 0
1048 | outSlope: 0
1049 | tangentMode: 0
1050 | weightedMode: 0
1051 | inWeight: 0.33333334
1052 | outWeight: 0.33333334
1053 | m_PreInfinity: 2
1054 | m_PostInfinity: 2
1055 | m_RotationOrder: 0
1056 | spreadCustomCurve:
1057 | serializedVersion: 2
1058 | m_Curve:
1059 | - serializedVersion: 3
1060 | time: 0
1061 | value: 0
1062 | inSlope: 0
1063 | outSlope: 0
1064 | tangentMode: 0
1065 | weightedMode: 0
1066 | inWeight: 0.33333334
1067 | outWeight: 0.33333334
1068 | m_PreInfinity: 2
1069 | m_PostInfinity: 2
1070 | m_RotationOrder: 4
1071 | reverbZoneMixCustomCurve:
1072 | serializedVersion: 2
1073 | m_Curve:
1074 | - serializedVersion: 3
1075 | time: 0
1076 | value: 1
1077 | inSlope: 0
1078 | outSlope: 0
1079 | tangentMode: 0
1080 | weightedMode: 0
1081 | inWeight: 0.33333334
1082 | outWeight: 0.33333334
1083 | m_PreInfinity: 2
1084 | m_PostInfinity: 2
1085 | m_RotationOrder: 0
1086 | --- !u!4 &2015964824
1087 | Transform:
1088 | m_ObjectHideFlags: 0
1089 | m_CorrespondingSourceObject: {fileID: 0}
1090 | m_PrefabInternal: {fileID: 0}
1091 | m_GameObject: {fileID: 2015964820}
1092 | m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
1093 | m_LocalPosition: {x: 0, y: 1, z: -10}
1094 | m_LocalScale: {x: 1, y: 1, z: 1}
1095 | m_Children: []
1096 | m_Father: {fileID: 0}
1097 | m_RootOrder: 3
1098 | m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
1099 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/CSharpSynth.unity.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 718d67aad9f758c42bad24aa9a075be8
3 | timeCreated: 1535575764
4 | licenseType: Free
5 | DefaultImporter:
6 | externalObjects: {}
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/Editor.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 683bc1950f9cf914198990f24727302a
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/Editor/MoogSynthInspector.cs:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018 Jakob Schmid
2 | //
3 | // Permission is hereby granted, free of charge, to any person obtaining a copy
4 | // of this software and associated documentation files (the "Software"), to deal
5 | // in the Software without restriction, including without limitation the rights
6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | // copies of the Software, and to permit persons to whom the Software is
8 | // furnished to do so, subject to the following conditions:
9 | //
10 | // The above copyright notice and this permission notice shall be included in all
11 | // copies or substantial portions of the Software.
12 | //
13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19 | // SOFTWARE."
20 |
21 | using UnityEngine;
22 | using UnityEditor;
23 |
24 | [CustomEditor(typeof(MoogSynth)), CanEditMultipleObjects]
25 | public class MoogSynthInspector : Editor
26 | {
27 | private enum OscilloscopeMode
28 | {
29 | None = 1,
30 | Small = 2,
31 | Large = 3
32 | }
33 |
34 | Texture2D tex = null;
35 | int t = 0;
36 | const int bufSize = 1024;
37 | private float[] testBuf = null;
38 | float[] bufCopy = null;
39 | string[] sourceNames = null;
40 | string[] targetNames = null;
41 | //float[] testMatrix = new float[8 * 8];
42 |
43 | /// Static Cache
44 | private static OscilloscopeMode oscilloscopeMode = OscilloscopeMode.None;
45 |
46 |
47 | public override void OnInspectorGUI()
48 | {
49 | MoogSynth parent = target as MoogSynth;
50 |
51 | //serializedObject.Update();
52 |
53 | DrawDefaultInspector();
54 |
55 | GUILayout.Space(8);
56 | GUILayout.Label("Visualization", EditorStyles.boldLabel);
57 | int modeInt = EditorPrefs.GetInt("MoogSynth:oscMode");
58 | oscilloscopeMode = (OscilloscopeMode) EditorGUILayout.EnumPopup("Oscilloscope", (OscilloscopeMode)modeInt);
59 | if (((int)oscilloscopeMode) != modeInt)
60 | {
61 | EditorPrefs.SetInt("MoogSynth:oscMode", (int)oscilloscopeMode);
62 | }
63 | parent.SetDebugBufferEnabled(oscilloscopeMode != OscilloscopeMode.None);
64 |
65 | if (oscilloscopeMode != OscilloscopeMode.None)
66 | {
67 | if (Event.current.type == EventType.Repaint)
68 | {
69 | int oscHeight = 256;
70 | int oscWidth = 512;
71 | if (oscilloscopeMode == OscilloscopeMode.Small)
72 | {
73 | oscHeight = 64;
74 | }
75 |
76 | float[] buf = null;
77 | if (Application.isPlaying)
78 | {
79 | if (bufCopy == null)
80 | {
81 | bufCopy = new float[bufSize];
82 | }
83 | lock (parent.GetBufferMutex())
84 | {
85 | System.Array.Copy(parent.GetLastBuffer(), bufCopy, bufSize);
86 | }
87 | buf = bufCopy;
88 | }
89 | else
90 | {
91 | if (testBuf == null || testBuf.Length < bufSize)
92 | {
93 | testBuf = new float[bufSize];
94 | for (int x = 0; x < bufSize; ++x)
95 | {
96 | testBuf[x] = 0.0f; // Mathf.Sin(((float)x) / oscWidth * Mathf.PI * 2.0f);
97 | }
98 | }
99 | buf = testBuf;
100 | }
101 |
102 | RenderBuffer(buf, ref tex, oscWidth, oscHeight, 1);
103 | }
104 |
105 | GUILayout.Box(tex);
106 | }
107 |
108 | if (targetNames == null)
109 | {
110 | targetNames = System.Enum.GetNames(typeof(MoogSynth.Parameters));
111 | sourceNames = System.Enum.GetNames(typeof(MoogSynth.Modulators));
112 | }
113 | int matrixsize = targetNames.Length * sourceNames.Length;
114 | if (parent.modulationMatrix == null)
115 | {
116 | parent.modulationMatrix = new float[matrixsize];
117 | }
118 | else if (parent.modulationMatrix.Length < matrixsize)
119 | {
120 | System.Array.Resize(ref parent.modulationMatrix, matrixsize);
121 | }
122 | //ModulationMatrix(parent.modulationMatrix, sourceNames, targetNames);
123 |
124 | if (GUILayout.Button("Reset Cache"))
125 | {
126 | tex = null;
127 | }
128 | }
129 |
130 | private void RenderBuffer(float[] buf, ref Texture2D tex, int width, int height, int stride)
131 | {
132 | if (tex == null || tex.width != width || tex.height != height)
133 | {
134 | tex = new Texture2D(width, height, TextureFormat.RGB24, false);
135 | tex.filterMode = FilterMode.Point;
136 | tex.wrapMode = TextureWrapMode.Clamp;
137 | }
138 |
139 | // Check zero crossing
140 | float valueOld = 0.0f;
141 | int offset = 0;
142 | for (int i = 0; i < bufSize; ++i)
143 | {
144 | float valueNew = buf[i*stride];
145 | if (valueOld < 0 && valueNew > 0)
146 | {
147 | offset = i;
148 | break;
149 | }
150 | valueOld = valueNew;
151 | }
152 |
153 | Color col = Color.green;
154 | float yScale = 1.0f / height;
155 | float lineFocus = height * 0.3f;
156 | for (int y = 0; y < height; ++y)
157 | {
158 | for (int x = 0; x < width; ++x)
159 | {
160 | float yNorm = y * yScale * 2.0f - 1.0f; // [-1;+1]
161 | float oscValue = -1.0f;
162 | if ((x + offset) < bufSize)
163 | {
164 | oscValue = buf[(x+offset)*stride]; // stereo interleaved
165 | }
166 | float intensity = Mathf.Pow(1.0f - Mathf.Abs(oscValue - yNorm), lineFocus);
167 | col = new Color(intensity, intensity, intensity);
168 | tex.SetPixel(x, y, col);
169 | }
170 | t++;
171 | }
172 | tex.Apply(false);
173 | }
174 |
175 | // Sources are vertical, targets are horizontal
176 | private void ModulationMatrix(float[] matrix, string[] sources, string[] targets)
177 | {
178 | const int guiWidth = 34;
179 | int width = targets.Length;
180 | int height = sources.Length;
181 | Debug.Assert(matrix.Length >= width * height);
182 |
183 | EditorGUILayout.BeginHorizontal();
184 | GUILayout.Label("src/tgt", GUILayout.Width(guiWidth));
185 | for (int x = 0; x < width; ++x)
186 | {
187 | GUILayout.Label(targets[x], GUILayout.Width(guiWidth));
188 | }
189 | EditorGUILayout.EndHorizontal();
190 | for (int y = 0; y < height; ++y)
191 | {
192 | EditorGUILayout.BeginHorizontal();
193 | GUILayout.Label(sources[y], GUILayout.Width(guiWidth));
194 | for (int x = 0; x < width; ++x)
195 | {
196 | matrix[y*width+x] = EditorGUILayout.FloatField(matrix[y*width+x], GUILayout.Width(guiWidth));
197 | }
198 | EditorGUILayout.EndHorizontal();
199 | }
200 | }
201 |
202 | public override bool RequiresConstantRepaint()
203 | {
204 | return oscilloscopeMode != OscilloscopeMode.None;
205 | }
206 | }
207 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/Editor/MoogSynthInspector.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 07604fa7544788347be97cd2010efd00
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/Editor/SequencerInspector.cs:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018 Jakob Schmid
2 | //
3 | // Permission is hereby granted, free of charge, to any person obtaining a copy
4 | // of this software and associated documentation files (the "Software"), to deal
5 | // in the Software without restriction, including without limitation the rights
6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | // copies of the Software, and to permit persons to whom the Software is
8 | // furnished to do so, subject to the following conditions:
9 | //
10 | // The above copyright notice and this permission notice shall be included in all
11 | // copies or substantial portions of the Software.
12 | //
13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19 | // SOFTWARE."
20 |
21 | using UnityEngine;
22 | using UnityEditor;
23 |
24 | [CustomEditor(typeof(Sequencer)), CanEditMultipleObjects]
25 | public class SequencerInspector : Editor
26 | {
27 | /// Static config
28 | const int matrixMaxX = 32;
29 | const int matrixMaxY = 25;
30 |
31 | const int gridSize = 5;
32 | const int matrixScale = 3;
33 | const int texturePadding = 2;
34 |
35 | const int textureSizeX = matrixMaxX * gridSize;
36 | const int textureSizeY = matrixMaxY * gridSize;
37 |
38 | const int matrixGuiSizeX = textureSizeX * matrixScale;
39 | const int matrixGuiSizeY = textureSizeY * matrixScale;
40 |
41 | /// State
42 | private bool editMatrix = false;
43 |
44 | /// Cache
45 | [System.NonSerialized]
46 | static Texture2D matrixTexture = null;
47 | [System.NonSerialized]
48 | static GUIStyle boxStyle = null;
49 |
50 |
51 | public override void OnInspectorGUI()
52 | {
53 | Sequencer parent = target as Sequencer;
54 |
55 | if (parent.pitch == null || parent.pitch.Length != Sequencer.maxLength)
56 | {
57 | System.Array.Resize(ref parent.pitch, Sequencer.maxLength);
58 | }
59 |
60 | EnsureInit();
61 | DrawDefaultInspector();
62 | editMatrix = EditorGUILayout.Toggle("Edit matrix", editMatrix);
63 |
64 | var rect = GUILayoutUtility.GetRect (matrixGuiSizeX, matrixGuiSizeY, GUILayout.ExpandWidth(false));
65 |
66 | Vector2 mousePosRelative = Event.current.mousePosition - rect.min;
67 | float mouseX = mousePosRelative.x;
68 | float mouseY = matrixGuiSizeY - mousePosRelative.y;
69 | int length = parent.length;
70 |
71 | if (Event.current.type == EventType.Repaint)
72 | {
73 | UpdateMatrix(parent, new Vector2(mouseX, mouseY));
74 | }
75 | if(editMatrix && (Event.current.type == EventType.MouseDown))
76 | {
77 | int mouseCellX = (int)mouseX / gridSize / matrixScale;
78 | int mouseCellY = (int)mouseY / gridSize / matrixScale;
79 | if (mouseCellX >= 0 && mouseCellX < length)
80 | {
81 | int pitchCurrent = parent.pitch[mouseCellX];
82 |
83 | Undo.RecordObject(parent, "modified note");
84 | if (pitchCurrent != mouseCellY)
85 | {
86 | parent.pitch[mouseCellX] = mouseCellY;
87 | }
88 | else
89 | {
90 | parent.pitch[mouseCellX] = Sequencer.restPitch;
91 | }
92 | }
93 | }
94 | boxStyle.normal.background = matrixTexture;
95 | GUI.Box(rect, GUIContent.none, boxStyle);
96 |
97 | if (GUILayout.Button("Reset cache"))
98 | {
99 | ResetCache();
100 | }
101 | }
102 |
103 | private void UpdateMatrix(Sequencer parent, Vector2 cursorPos)
104 | {
105 | int columns = parent.length;
106 | int seqIdx = -1;
107 | if (Application.isPlaying)
108 | {
109 | seqIdx = parent.getCurrentSeqIdx();
110 | }
111 |
112 | // mouse cell coords in matrix
113 | int mouseCellX = (int)cursorPos.x / gridSize / matrixScale;
114 | int mouseCellY = (int)cursorPos.y / gridSize / matrixScale;
115 |
116 | Color color;
117 | for (int y = 0; y < 25 * gridSize; ++y)
118 | {
119 | for (int x = 0; x < matrixMaxX * gridSize; ++x)
120 | {
121 | int mx = x / gridSize; // cell coords in matrix
122 | int my = y / gridSize;
123 | int cx = x % gridSize; // pixel coords in cell
124 | int cy = y % gridSize;
125 |
126 | bool isMouseInCell = (mouseCellX == mx && mouseCellY == my);
127 |
128 | int sn = my % 12; // scale note
129 | bool isBlackKey = (sn == 1 || sn == 3 || sn == 6 || sn == 8 || sn == 10);
130 | bool isInsideMatrix = mx < columns;
131 | bool isNote = isInsideMatrix && (parent.pitch[mx] == my);
132 | bool isCurrentSeqIdx = mx == seqIdx;
133 |
134 | Color shade = Color.HSVToRGB(0.0f, 0.0f, ((float)(y % gridSize)) / gridSize * 0.2f);
135 |
136 | if (isBlackKey)
137 | {
138 | color = new Color(0.4f, 0.4f, 0.4f);
139 | }
140 | else
141 | {
142 | color = new Color(0.8f, 0.8f, 0.8f);
143 | }
144 |
145 | if (cx == 0 || cy == 0)
146 | {
147 | color = new Color(0.4f, 0.4f, 0.4f);
148 | }
149 | else
150 | {
151 | color += shade;
152 | }
153 |
154 | bool isGridLine = (cx == 0 || cy == 0);
155 |
156 | if (isInsideMatrix)
157 | {
158 | if (isNote && (!isGridLine))
159 | {
160 | if (editMatrix)
161 | {
162 | color = Color.Lerp(color, Color.red, 0.7f);
163 | }
164 | else
165 | {
166 | color = Color.Lerp(color, new Color(0.7f, 0.2f, 1.0f), 0.7f);
167 | }
168 | }
169 | if (isMouseInCell && editMatrix && (!isGridLine))
170 | {
171 | color = Color.Lerp(color, Color.blue, 0.4f);
172 | }
173 | if (isCurrentSeqIdx)
174 | {
175 | color = Color.Lerp(color, Color.green, 0.2f);
176 | }
177 | }
178 | else
179 | {
180 | color = Color.Lerp(color, Color.black, 0.8f);
181 | }
182 |
183 | matrixTexture.SetPixel(x + texturePadding, y + texturePadding, color);
184 | }
185 | }
186 |
187 | matrixTexture.Apply();
188 | }
189 |
190 | private void EnsureInit()
191 | {
192 | if (matrixTexture == null)
193 | {
194 | matrixTexture = new Texture2D(textureSizeX + texturePadding * 2, textureSizeY + texturePadding * 2);
195 | matrixTexture.filterMode = FilterMode.Point;
196 | }
197 | if (boxStyle == null)
198 | {
199 | boxStyle = new GUIStyle(GUI.skin.box);
200 | boxStyle.padding = new RectOffset(0, 0, 0, 0);
201 | }
202 | }
203 |
204 | private void ResetCache()
205 | {
206 | matrixTexture = null;
207 | boxStyle = null;
208 | }
209 |
210 | public override bool RequiresConstantRepaint()
211 | {
212 | return false;
213 | }
214 | }
215 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/Editor/SequencerInspector.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: f598b390b2e8c8d439c49ff761892f92
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/EventQueue.cs:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018 Jakob Schmid
2 | //
3 | // Permission is hereby granted, free of charge, to any person obtaining a copy
4 | // of this software and associated documentation files (the "Software"), to deal
5 | // in the Software without restriction, including without limitation the rights
6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | // copies of the Software, and to permit persons to whom the Software is
8 | // furnished to do so, subject to the following conditions:
9 | //
10 | // The above copyright notice and this permission notice shall be included in all
11 | // copies or substantial portions of the Software.
12 | //
13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19 | // SOFTWARE."
20 |
21 | using System;
22 |
23 | // empty queue queue queue pop
24 | // [ | | ] [x| | ] [x|x| ] [x|x|x] [ |x|x]
25 | // B F B F B B B F
26 | // F F
27 | public class EventQueue
28 | {
29 | public enum EventType
30 | {
31 | None = 0,
32 | Note_on = 1,
33 | Note_off = 2,
34 | };
35 |
36 | public struct QueuedEvent
37 | {
38 | public int data;
39 | public Int64 time_smp;
40 | public EventType eventType;
41 | public QueuedEvent(EventType type, int data, Int64 time_smp)
42 | {
43 | this.eventType = type;
44 | this.data = data;
45 | this.time_smp = time_smp;
46 | }
47 | public void Set(EventType type, int data, Int64 time_smp)
48 | {
49 | this.eventType = type;
50 | this.data = data;
51 | this.time_smp = time_smp;
52 | }
53 | }
54 |
55 | /// State
56 | private QueuedEvent[] events;
57 | private int back = 0;
58 | private int front = 0;
59 | private int size = 0;
60 | private int capacity = -1;
61 | private object mutexLock = new object();
62 |
63 | public EventQueue(int capacity)
64 | {
65 | events = new QueuedEvent[capacity];
66 | this.capacity = capacity;
67 | }
68 |
69 | public bool Enqueue(EventType type, int data, Int64 time_smp)
70 | {
71 | bool didEnqueue = false;
72 | lock (mutexLock)
73 | {
74 | if (size < capacity)
75 | {
76 | events[back].Set(type, data, time_smp);
77 | back = (back + 1) % capacity;
78 | size++;
79 | didEnqueue = true;
80 | }
81 | }
82 | return didEnqueue;
83 | }
84 | public void Dequeue()
85 | {
86 | lock (mutexLock)
87 | {
88 | if (size > 0)
89 | {
90 | front = (front + 1) % capacity;
91 | --size;
92 | }
93 | }
94 | }
95 | public bool GetFront(ref QueuedEvent result)
96 | {
97 | if (size == 0)
98 | return false;
99 | result = events[front];
100 | return true;
101 | }
102 | public bool GetFrontAndDequeue(ref QueuedEvent result)
103 | {
104 | if (size == 0)
105 | return false;
106 |
107 | lock (mutexLock)
108 | {
109 | result = events[front];
110 | front = (front + 1) % capacity;
111 | --size;
112 | }
113 | return true;
114 | }
115 | public void Clear()
116 | {
117 | front = 0;
118 | back = 0;
119 | size = 0;
120 | }
121 | public bool IsEmpty
122 | {
123 | get { return size == 0; }
124 | }
125 | public int GetSize()
126 | {
127 | return size;
128 | }
129 | }
130 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/EventQueue.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: fb45db7744563bb489fc9f92fb770ce9
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/MoogFilter.cs:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018 Jakob Schmid
2 | //
3 | // Permission is hereby granted, free of charge, to any person obtaining a copy
4 | // of this software and associated documentation files (the "Software"), to deal
5 | // in the Software without restriction, including without limitation the rights
6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | // copies of the Software, and to permit persons to whom the Software is
8 | // furnished to do so, subject to the following conditions:
9 | //
10 | // The above copyright notice and this permission notice shall be included in all
11 | // copies or substantial portions of the Software.
12 | //
13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19 | // SOFTWARE."
20 |
21 | // Huovilainen moog filter:
22 | //
23 | // I_ctl x(n) - 4 r y_d(n-1)
24 | // y_a(n) = y_a(n-1) + ----- ( tanh ( ------------------- ) - W_a(n-1) )
25 | // C Fs 2V_t
26 | //
27 | // I_ctl
28 | // y_b(n) = y_b(n-1) + ----- ( W_a(n) - W_b(n-1) )
29 | // C Fs
30 | //
31 | // I_ctl
32 | // y_c(n) = y_c(n-1) + ----- ( W_b(n) - W_c(n-1) )
33 | // C Fs
34 | //
35 | // I_ctl y_d(n-1)
36 | // y_d(n) = y_d(n-1) + ----- ( W_c(n) - tanh( -------- ) )
37 | // C Fs 2V_t
38 | //
39 | //
40 | // where x(n) : input
41 | // y_{a,b,c,d}(n) : outputs of individual filter stages
42 | // r : resonance amount in ]0;1]
43 | // I_ctl : control current
44 | // C : capacitance ?
45 | // V_t : transistor thermal voltage (constant) ?
46 | // Fs : sample rate
47 | //
48 | // y_{a,b,c}(n)
49 | // W_{a,b,c}(n) = tanh( ------------ )
50 | // 2Vt
51 | //
52 | // also
53 | //
54 | // tanh x = -i tan( ix )
55 | //
56 | // - see Huovilainen's paper:
57 | // 'Non-linear Digital Implementation of the Moog Ladder Filter' (2004)
58 | //
59 | // Performance notes from the paper:
60 | //
61 | // It can be seen that each stage uses as input the tanh of the output
62 | // of the previous stage. This is also used by the previous stage
63 | // during the next sample. The calculation result can be stored and
64 | // thus only five tanh calculations per sample are required. These can
65 | // be implemented efficiently with table lookups or polynomial
66 | // approximation.
67 | //
68 | // Algorithm:
69 | //
70 | // x = input sample
71 | // reso = resonance
72 | // cutoff = cutoff frequency (I_ctl)
73 | // Fs = sample rate
74 | // v = 1 / (2 * V_t) = 0.5 * V_t
75 | //
76 | // s = cutoff / C / Fs
77 | //
78 | // y_a += s * ( tanh( x - 4 * reso * y_d * v ) - w_a
79 | // w_a = tanh( y_a * v ); y_b += s * ( w_a - w_b )
80 | // w_b = tanh( y_b * v ); y_c += s * ( w_b - w_c )
81 | // w_c = tanh( y_c * v ); y_d += s * ( w_c - tanh( y_d * v )
82 | //
83 | // output = y_d
84 | //
85 | // Quality notes:
86 | //
87 | // Huovilainen suggests using oversampling to avoid artifacts.
88 | // He also suggests a half sample delay as phase compensation, which
89 | // is not implemented yet.
90 |
91 | using static System.Math;
92 |
93 | public class MoogFilter
94 | {
95 | /// Static config
96 | const float C = 1.0f; // ????
97 | const float V_t = 1.22070313f; // From Diakopoulos
98 |
99 | /// Config
100 | float reso, Fs;
101 | int oversampling = 1; // 1 means don't oversample
102 |
103 | /// State
104 | double y_a, y_b, y_c, y_d;
105 | double w_a, w_b, w_c;
106 |
107 | /// Cache
108 | double s, v;
109 | float cutoff;
110 |
111 | public MoogFilter(float sampleRate)
112 | {
113 | Fs = sampleRate;
114 | v = V_t * 0.5f; // 1/2V_t
115 | }
116 |
117 | public void process_mono(float[] samples, uint n)
118 | {
119 | for (int i = 0; i < n; ++i)
120 | {
121 | float x = samples[i]; // x = input sample
122 | for (int j = 0; j < oversampling; ++j)
123 | {
124 | y_a += s * (Tanh(x - 4 * reso * y_d * v) - w_a);
125 | w_a = Tanh(y_a * v); y_b += s * (w_a - w_b);
126 | w_b = Tanh(y_b * v); y_c += s * (w_b - w_c);
127 | w_c = Tanh(y_c * v); y_d += s * (w_c - Tanh(y_d * v));
128 | }
129 | samples[i] = (float)y_d; // y_d = output sample
130 | }
131 | }
132 |
133 | public void process_mono_stride(float[] samples, int sample_count, int offset, int stride)
134 | {
135 | int idx = offset;
136 | for (int i = 0; i < sample_count; ++i)
137 | {
138 | float x = samples[idx]; // x = input sample
139 | for (int j = 0; j < oversampling; ++j)
140 | {
141 | y_a += s * (Tanh(x - 4 * reso * y_d * v) - w_a);
142 | w_a = Tanh(y_a * v); y_b += s * (w_a - w_b);
143 | w_b = Tanh(y_b * v); y_c += s * (w_b - w_c);
144 | w_c = Tanh(y_c * v); y_d += s * (w_c - Tanh(y_d * v));
145 | }
146 | samples[idx] = (float)y_d; // y_d = output sample
147 | idx += stride;
148 | }
149 | }
150 |
151 | public void SetResonance(float r)
152 | {
153 | reso = r;
154 | }
155 |
156 | public void SetCutoff(float c)
157 | {
158 | const float PI2 = 6.28318530717959f;
159 | const float iDontUnderstandWhyThisNeedsToBeHere = PI2;
160 |
161 | cutoff = c;
162 | s = c / C / Fs / oversampling * iDontUnderstandWhyThisNeedsToBeHere;
163 | }
164 |
165 | public void SetOversampling(int iterationCount)
166 | {
167 | oversampling = iterationCount;
168 | if (oversampling < 1)
169 | oversampling = 1;
170 | SetCutoff(cutoff);
171 | }
172 | }
173 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/MoogFilter.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: cda4c9ad10ca0464695c6387982603a6
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/MoogSynth.cs:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018 Jakob Schmid
2 | //
3 | // Permission is hereby granted, free of charge, to any person obtaining a copy
4 | // of this software and associated documentation files (the "Software"), to deal
5 | // in the Software without restriction, including without limitation the rights
6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | // copies of the Software, and to permit persons to whom the Software is
8 | // furnished to do so, subject to the following conditions:
9 | //
10 | // The above copyright notice and this permission notice shall be included in all
11 | // copies or substantial portions of the Software.
12 | //
13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19 | // SOFTWARE."
20 |
21 | using System;
22 | using UnityEngine;
23 |
24 | [RequireComponent(typeof(AudioSource))]
25 | public class MoogSynth : MonoBehaviour
26 | {
27 | public enum Parameters
28 | {
29 | Cutoff = 0,
30 | Resonance,
31 | Decay,
32 | Filter_enabled,
33 |
34 | Square_amp,
35 | Sub_amp,
36 |
37 | PWM_str,
38 | PWM_freq,
39 |
40 | AENV_attack,
41 | AENV_decay,
42 | AENV_sustain,
43 | AENV_release,
44 | };
45 | public enum Modulators
46 | {
47 | ENV1 = 0,
48 | LFO1,
49 | LFO2,
50 | };
51 | public enum FilterType
52 | {
53 | Schmid,
54 | #if LAZZARINI_FILTER
55 | Lazzarini
56 | #endif
57 | }
58 |
59 | MoogFilter filter1, filter2;
60 | #if LAZZARINI_FILTER
61 | MoogFilter_Lazzarini filter1Laz, filter2Laz;
62 | #endif
63 |
64 | // Parameters
65 | [Header("Filter")]
66 | public FilterType filterType = FilterType.Schmid;
67 | [Range(10, 24000)]
68 | public float cutoffFrequency;
69 | [Range(0, 1)]
70 | public float resonance;
71 | [Range(0, 1)]
72 | public float filterEnvDecay;
73 | [Range(0, 1)]
74 | public float filterEnabled;
75 | [Range(1, 4)]
76 | public int oversampling = 1;
77 |
78 | [Header("Amplitude")]
79 | //[Range(0, 1)]
80 | //public float squareAmp = 0.4f;
81 | [Range(0, 1)]
82 | public float squareAmp = 0.0f;
83 | [Range(0, 1)]
84 | public float sawAmp = 0.0f;
85 | [Range(0, 1)]
86 | public float subSine = 0.4f;
87 |
88 | //[Range(0, 1)]
89 | //public float sawDPWAmp = 0.4f;
90 | //[Range(0, 1)]
91 | //public float sawAmp = 0.4f;
92 |
93 | [Header("Pulse-width Modulation")]
94 | [Range(0, 1)]
95 | public float pwmStrength;
96 | [Range(0, 1)]
97 | public float pwmFrequency;
98 |
99 | [Header("AENV")]
100 | [Range(0, 1)]
101 | public float aenv_attack;
102 | [Range(0, 1)]
103 | public float aenv_decay;
104 | [Range(0, 1)]
105 | public float aenv_sustain;
106 | [Range(0, 1)]
107 | public float aenv_release;
108 |
109 | [HideInInspector]
110 | public float[] modulationMatrix = null;
111 |
112 | // Synth state
113 | Phaser osc1, osc2, lfo;
114 | Phaser fenv;
115 | ADSR aenv;
116 | // when note_is_on = true, wait for current_delta samples and set note_is_playing = true
117 | //bool note_is_playing;
118 | bool is_initialized = false;
119 |
120 | // Current MIDI evt
121 | bool note_is_on;
122 | int current_note;
123 | int current_velocity;
124 |
125 | EventQueue queue;
126 |
127 | int sample_rate;
128 |
129 | float[] freqtab = new float[128];
130 |
131 | private const int QueueCapacity = 320;
132 | private float[] lastBuffer = new float[2048];
133 | private readonly object bufferMutex = new object();
134 | private bool debugBufferEnabled = false;
135 |
136 | private EventQueue.QueuedEvent nextEvent;
137 | private bool eventIsWaiting = false;
138 |
139 |
140 | /// Public interface
141 | public bool queue_event(EventQueue.EventType evtType, int data, Int64 time_smp)
142 | {
143 | //queueLock = true;
144 | bool result = queue.Enqueue(evtType, data, time_smp);
145 | //queueLock = false;
146 | return result;
147 | }
148 | public void ClearQueue()
149 | {
150 | queue.Clear();
151 | }
152 | public bool set_parameter(int param_id, float value)
153 | {
154 | switch (param_id)
155 | {
156 | case (int)Parameters.Cutoff: cutoffFrequency = value; break;
157 | case (int)Parameters.Resonance: resonance = value; break;
158 | case (int)Parameters.Decay: filterEnvDecay = value; break;
159 | case (int)Parameters.Filter_enabled: filterEnabled = value; break;
160 | case (int)Parameters.Square_amp: squareAmp = value; break;
161 | case (int)Parameters.Sub_amp: subSine = value; break;
162 | case (int)Parameters.PWM_str: pwmStrength = value; break;
163 | case (int)Parameters.PWM_freq: pwmFrequency = value; break;
164 | case (int)Parameters.AENV_attack: aenv_attack = value; break;
165 | case (int)Parameters.AENV_decay: aenv_decay = value; break;
166 | case (int)Parameters.AENV_sustain: aenv_sustain = value; break;
167 | case (int)Parameters.AENV_release: aenv_release = value; break;
168 | }
169 | return true;
170 | }
171 | public float get_parameter(int param_id)
172 | {
173 | switch (param_id)
174 | {
175 | case (int)Parameters.Cutoff: return cutoffFrequency;
176 | case (int)Parameters.Resonance: return resonance;
177 | case (int)Parameters.Decay: return filterEnvDecay;
178 | case (int)Parameters.Filter_enabled: return filterEnabled;
179 | case (int)Parameters.Square_amp: return squareAmp;
180 | case (int)Parameters.Sub_amp: return subSine;
181 | case (int)Parameters.PWM_str: return pwmStrength;
182 | case (int)Parameters.PWM_freq: return pwmFrequency;
183 | case (int)Parameters.AENV_attack: return aenv_attack;
184 | case (int)Parameters.AENV_decay: return aenv_decay;
185 | case (int)Parameters.AENV_sustain: return aenv_sustain;
186 | case (int)Parameters.AENV_release: return aenv_release;
187 | default: return -1.0f;
188 | }
189 | }
190 |
191 | // This should only be called from OnAudioFilterRead
192 | public void HandleEventNow(EventQueue.QueuedEvent currentEvent)
193 | {
194 | note_is_on = (currentEvent.eventType == EventQueue.EventType.Note_on);
195 |
196 | if (note_is_on)
197 | {
198 | current_note = currentEvent.data;
199 | osc1.phase = 0u;
200 | osc2.phase = 0u;
201 | fenv.restart();
202 | update_params();
203 | }
204 |
205 | aenv.gate(note_is_on);
206 | }
207 |
208 | public Int64 GetTime_smp()
209 | {
210 | //return masterClock_smp;
211 | return time_smp;
212 | }
213 |
214 | /// Debug
215 | public void SetDebugBufferEnabled(bool enabled)
216 | {
217 | this.debugBufferEnabled = enabled;
218 | }
219 | public float[] GetLastBuffer()
220 | {
221 | return lastBuffer;
222 | }
223 | public object GetBufferMutex()
224 | {
225 | return bufferMutex;
226 | }
227 |
228 | //public bool bufferLock = false;
229 | //public bool queueLock = false;
230 |
231 | /// Unity
232 | private void Start()
233 | {
234 | init(1, 48000);
235 | }
236 |
237 | //private static MoogSynth clockMaster = null;
238 | //private bool isClockMaster = false;
239 | //private Int64 masterClock_smp = 0;
240 | private Int64 time_smp = 0;
241 |
242 | private void OnAudioFilterRead(float[] data, int channels)
243 | {
244 | //if (clockMaster == null)
245 | //{
246 | // clockMaster = this;
247 | // isClockMaster = true;
248 | // masterClock_smp = 0;
249 | //}
250 | //else if (isClockMaster) // not first frame, increment
251 | //{
252 | // masterClock_smp += sampleFrames;
253 | //}
254 |
255 | if (is_initialized)
256 | {
257 | if (channels == 2)
258 | {
259 | int sampleFrames = data.Length / 2;
260 | render_float32_stereo_interleaved(data, sampleFrames);
261 |
262 | if (debugBufferEnabled)
263 | {
264 | //bufferLock = true;
265 | lock (bufferMutex)
266 | {
267 | Array.Copy(data, lastBuffer, data.Length);
268 | }
269 | //bufferLock = false;
270 | }
271 | }
272 | }
273 | }
274 |
275 | /// Internal
276 | private void init(int queue_length, int sample_rate)
277 | {
278 | osc1 = new Phaser();
279 | osc2 = new Phaser();
280 | lfo = new Phaser();
281 | fenv = new Phaser();
282 | aenv = new ADSR();
283 |
284 | note_is_on = false;
285 |
286 | for (int i = 0; i < 128; i++)
287 | { // 128 midi notes
288 | freqtab[i] = midi2freq(i % 12, i / 12 - 2);
289 | }
290 |
291 | this.sample_rate = sample_rate;
292 |
293 | filter1 = new MoogFilter(sample_rate);
294 | filter2 = new MoogFilter(sample_rate);
295 | #if LAZZARINI_FILTER
296 | filter1Laz = new MoogFilter_Lazzarini(sample_rate);
297 | filter2Laz = new MoogFilter_Lazzarini(sample_rate);
298 | #endif
299 |
300 | queue = new EventQueue(QueueCapacity);
301 |
302 | update_params();
303 |
304 | Reset();
305 |
306 | is_initialized = true;
307 | }
308 |
309 | private void Reset()
310 | {
311 | osc1.phase = 0u;
312 | osc2.phase = 0u;
313 | lfo.phase = 0u;
314 |
315 | aenv.reset();
316 | update_params();
317 | }
318 |
319 | private void update_params()
320 | {
321 | // Set synth params
322 | float freq = freqtab[current_note & 0x7f];
323 | osc1.set_freq(freq, sample_rate);
324 | osc2.set_freq(freq * 0.5f, sample_rate);
325 | fenv.set_freq(1.0f / filterEnvDecay, sample_rate);
326 | lfo.set_freq(pwmFrequency * 2.3f, sample_rate);
327 |
328 | float env01 = fenv.quad_down01();
329 |
330 | if (filterType == FilterType.Schmid)
331 | {
332 | filter1.SetResonance(resonance);
333 | filter2.SetResonance(resonance);
334 | filter1.SetCutoff(cutoffFrequency * env01); // 0 Hz cutoff is bad
335 | filter2.SetCutoff(cutoffFrequency * env01);
336 | filter1.SetOversampling(oversampling);
337 | filter2.SetOversampling(oversampling);
338 | }
339 | #if LAZZARINI_FILTER
340 | else if (filterType == FilterType.Lazzarini)
341 | {
342 | filter1Laz.SetResonance(resonance);
343 | filter2Laz.SetResonance(resonance);
344 | filter1Laz.SetCutoff(cutoffFrequency * env01);
345 | filter2Laz.SetCutoff(cutoffFrequency * env01);
346 | }
347 | #endif
348 |
349 | aenv.setAttackRate(aenv_attack * sample_rate);
350 | aenv.setDecayRate(aenv_decay * sample_rate);
351 | aenv.setReleaseRate(aenv_release * sample_rate);
352 | aenv.setSustainLevel(aenv_sustain);
353 | }
354 |
355 | private void render_float32_stereo_interleaved(float[] buffer, int sample_frames)
356 | {
357 | int smp = 0;
358 | int buf_idx = 0;
359 | //int time_smp = masterClock_smp;
360 |
361 | update_params();
362 |
363 | // Cache this for the entire buffer, we don't need to check for
364 | // every sample if new events have been enqueued.
365 | // This assumes that no other metdods call GetFrontAndDequeue.
366 | int queueSize = queue.GetSize();
367 |
368 | // Render loop
369 | for (; smp < sample_frames; ++smp)
370 | {
371 | // Event handling
372 | // This is sample accurate event handling.
373 | // If it's too slow, we can decide to only handle 1 event per buffer and
374 | // move this code outside the loop.
375 | while(true)
376 | {
377 | if (eventIsWaiting == false && queueSize > 0)
378 | {
379 | //queueLock = true;
380 | if (queue.GetFrontAndDequeue(ref nextEvent))
381 | {
382 | eventIsWaiting = true;
383 | queueSize--;
384 | }
385 | //queueLock = false;
386 | }
387 |
388 | if (eventIsWaiting)
389 | {
390 | if (nextEvent.time_smp <= time_smp)
391 | {
392 | HandleEventNow(nextEvent);
393 | eventIsWaiting = false;
394 | }
395 | else
396 | {
397 | // we assume that queued events are in order, so if it's not
398 | // now, we stop getting events from the queue
399 | break;
400 | }
401 | }
402 | else
403 | {
404 | // no more events
405 | break;
406 | }
407 | }
408 |
409 | // Rendering
410 | if (note_is_on)
411 | {
412 | // Render sample
413 | float amp = aenv.process() * 0.5f;
414 |
415 | float lfo_val = lfo.sin() * 0.48f * pwmStrength + 0.5f;
416 |
417 | //float saw = osc1.saw() * sawAmp;
418 | //float square = osc1.square(lfo_val) * squareAmp;
419 | //float sawDPW = osc1.sawDPW() * sawDPWAmp;
420 | float sine = osc2.sin() * subSine;
421 | float sawPolyBLEP = osc1.sawPolyBLEP() * sawAmp;
422 | float squarePolyBLEP = osc1.squarePolyBLEP(lfo_val) * squareAmp;
423 |
424 | float sample = (sine + sawPolyBLEP + squarePolyBLEP)
425 | * /*(current_velocity * 0.0079f) **/ amp;
426 |
427 | buffer[buf_idx++] = sample;
428 | buffer[buf_idx++] = sample;
429 |
430 | // Update oscillators
431 | osc1.update();
432 | osc2.update();
433 | lfo.update();
434 | fenv.update_oneshot();
435 | }
436 | else
437 | {
438 | buffer[buf_idx++] = 0.0f;
439 | buffer[buf_idx++] = 0.0f;
440 | }
441 | time_smp++;
442 | }
443 |
444 | // Filter entire buffer
445 | if (filterEnabled >= 0.5f)
446 | {
447 | if (filterType == FilterType.Schmid)
448 | {
449 | filter1.process_mono_stride(buffer, sample_frames, 0, 2);
450 | filter2.process_mono_stride(buffer, sample_frames, 1, 2);
451 | }
452 | #if LAZZARINI_FILTER
453 | else if (filterType == FilterType.Lazzarini)
454 | {
455 | filter1Laz.process_mono_stride(buffer, sample_frames, 0, 2);
456 | filter2Laz.process_mono_stride(buffer, sample_frames, 1, 2);
457 | }
458 | #endif
459 | }
460 | }
461 |
462 | /// Internals
463 | private float midi2freq(int note, int octave)
464 | {
465 | return 32.70319566257483f * Mathf.Pow(2.0f, note / 12.0f + octave);
466 | }
467 | };
468 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/MoogSynth.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 1e350324ae1f1b4478413f08cc0f899c
3 | timeCreated: 1535573446
4 | licenseType: Free
5 | MonoImporter:
6 | externalObjects: {}
7 | serializedVersion: 2
8 | defaultReferences: []
9 | executionOrder: 0
10 | icon: {instanceID: 0}
11 | userData:
12 | assetBundleName:
13 | assetBundleVariant:
14 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/NewAudioMixer.mixer:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!241 &24100000
4 | AudioMixerController:
5 | m_ObjectHideFlags: 0
6 | m_CorrespondingSourceObject: {fileID: 0}
7 | m_PrefabInternal: {fileID: 0}
8 | m_Name: NewAudioMixer
9 | m_OutputGroup: {fileID: 0}
10 | m_MasterGroup: {fileID: 24300002}
11 | m_Snapshots:
12 | - {fileID: 24500006}
13 | m_StartSnapshot: {fileID: 24500006}
14 | m_SuspendThreshold: -80
15 | m_EnableSuspend: 1
16 | m_UpdateMode: 0
17 | m_ExposedParameters: []
18 | m_AudioMixerGroupViews:
19 | - guids:
20 | - 202d3858f13a812448f56614de431262
21 | - 983c31fdbca5a2247bf26a44f413571c
22 | - 07fd43f8a8bd09245887daecc456261c
23 | - 4f333e283939c104687bbd0750e7f9b7
24 | - 8961d07ffd2e5c7469ad3a79d7aa8064
25 | - 5c0d150cf4349c842b15e44d99ab1a68
26 | name: View
27 | m_CurrentViewIndex: 0
28 | m_TargetSnapshot: {fileID: 24500006}
29 | --- !u!243 &24300002
30 | AudioMixerGroupController:
31 | m_ObjectHideFlags: 0
32 | m_CorrespondingSourceObject: {fileID: 0}
33 | m_PrefabInternal: {fileID: 0}
34 | m_Name: Master
35 | m_AudioMixer: {fileID: 24100000}
36 | m_GroupID: 202d3858f13a812448f56614de431262
37 | m_Children:
38 | - {fileID: 243311110667323148}
39 | - {fileID: 243316727705101024}
40 | - {fileID: 243835790171793730}
41 | - {fileID: 243755139085696720}
42 | - {fileID: 243987332395796422}
43 | m_Volume: 8e5d4b71582666140afeb433b5b68352
44 | m_Pitch: e256739a1bbaba74fac1fa27291dcba9
45 | m_Effects:
46 | - {fileID: 244775195484389626}
47 | - {fileID: 24400004}
48 | m_UserColorIndex: 0
49 | m_Mute: 0
50 | m_Solo: 0
51 | m_BypassEffects: 0
52 | --- !u!244 &24400004
53 | AudioMixerEffectController:
54 | m_ObjectHideFlags: 3
55 | m_CorrespondingSourceObject: {fileID: 0}
56 | m_PrefabInternal: {fileID: 0}
57 | m_Name:
58 | m_EffectID: 79a51dcd80f24904893fba917cd354e6
59 | m_EffectName: Attenuation
60 | m_MixLevel: 04b4a41ea40efa14eb863fef28081828
61 | m_Parameters: []
62 | m_SendTarget: {fileID: 0}
63 | m_EnableWetMix: 0
64 | m_Bypass: 0
65 | --- !u!245 &24500006
66 | AudioMixerSnapshotController:
67 | m_ObjectHideFlags: 0
68 | m_CorrespondingSourceObject: {fileID: 0}
69 | m_PrefabInternal: {fileID: 0}
70 | m_Name: Snapshot
71 | m_AudioMixer: {fileID: 24100000}
72 | m_SnapshotID: 83620837ebc118a42a993ac083e26cce
73 | m_FloatValues:
74 | 0a0eea001f3ce444b91aa7cf8faa5891: 318
75 | b375ce207a5b96d44b70a02345fe2d60: 0.389
76 | 6367bd30e4e1b9f4f923f7ea29c0a91d: -4504
77 | f9241560b7aa32f41a819aaeedc6cf48: 0.75
78 | c61e0590c2c2486489f4eee78bb43c9e: 2122
79 | 484264a07703f264da5f1834ed0c6aa5: 1.8999993
80 | 8d105e4166c7a3649a934062416cc0e3: 0.389
81 | 8e5d4b71582666140afeb433b5b68352: -0.02577656
82 | 0d6854911d538964e9fabcd077a55902: 0.75
83 | b249e5e109ffb0a458c4c86869a4e56e: 9316
84 | e92ceb22ac31aff43924b64731b65cbb: 19.8
85 | 1cf21c327474f624cb1c2616704098f1: -995
86 | 14be5882d708baf40b80a171a3756ea5: 1.42
87 | c8973692585fa7040b23aafc0b93ac06: -4504
88 | 1326e3b22e7bba648bf262e7eb1a273c: 1.25
89 | adf28ec2fea3f464ab850bd3710e1644: 1.1
90 | 10e697d29f16d4840b154e82605e632a: 61
91 | 8152c0e23f21f6f42b427ace360af399: 0
92 | 4f7b5ae25fdbea847ae31ee7ad6e955d: 1459
93 | 6a980d03e9c408841a2d062fcee5aa6b: 1.035
94 | 60e58013b2d5a6341b02db45bd32116e: 20000
95 | 2b9bce136fbda1e46a3cb130481c8e40: -10000
96 | 05228c3374961274d8d65f313edc4d94: 7.01
97 | 8d186b43fe1421c43a686655ac16593c: 10340
98 | b56182634a8e5e142b650c2df7714124: 1.289
99 | 31c497732e3271d459e4bcae88be3e79: 61
100 | bb2826a3c6a1bce4a901f671856f3a96: -565
101 | 9aa6527475ecc4c49a3a9c27c2e412ba: 3.26
102 | 2153a1a4dc04f834d9403dac904d1142: 0
103 | 2c8268b4d38687c4892dff12778d0dcc: 17.54
104 | cf72e5c4b37951b4e89eea9c8cfc9351: 0.519
105 | 8fa397f41ec27044f8b0f75a49d6212b: 55
106 | 92d975353c2436f46976d999d2f2dc51: 7.01
107 | 7803493502f882749b23d10e7328ef0e: 9316
108 | eda525958f275a64b8fcd3acfb262088: 0
109 | f657f1b551b674d49944def37e160904: 0.28
110 | 093958c5fb8f66d40bff88a4e37f44fb: 0.471
111 | ea67352640bc6b147beb64fa37826796: 3875.3757
112 | 0d87ba264b8ef444fb5741babe98cdc8: -16.2
113 | c5adad26f6ac69544af07708dc82d1e2: -12.638586
114 | 88cf68c621cffe84eb14991dd746e50b: -5.4218063
115 | f88df117014094e46960fb1facf1c7ab: -36.04027
116 | 94b41217404c3fa438830fb47feb40b4: 0
117 | 704b4997fd0c8ee4d9d44e824f6b445d: 2.2
118 | 5b9913b76aa0de44aad8dcc99b5151fa: -19.2
119 | df3391d75209cfc4582d94c903aa53da: 0.393
120 | 9f3692d7a1b899a48a3168bc07c46250: -3215
121 | 95928d18c80396346a2674524e4e4783: 6.1
122 | cf47658833405e44287d903df1453f6b: 0
123 | 5fadd888367678d45bb1d22395678e9d: 750
124 | 93c78a2957256c049aeac94a5402a2ac: -19.422981
125 | d26b3a69e4b22c74ab6a95e958a8c6f2: 1.1
126 | bea86b993121c174ea70d28599c52d62: 1.32
127 | 6f5f75a95ce063442ae2e55dc251a7b2: -2607
128 | 856e17a99783aa14ca865aeb2bca6203: 1
129 | 9010a3c98219c20418b7e2023ec1a521: -6
130 | 397fd4c9aa147dd45a092ff307d80f67: 162
131 | 896298c96d42dd9458fc79002180c209: 4.0477877
132 | b9fa64d94de55e84994b08291c7430ac: -33.2
133 | e4676edaf0dbedf468e98ad24bbfb6d7: 17
134 | eb89695b52703744c910c0c7fc049d47: 0.674
135 | bcb46e8ba533e3241b74580518d3b045: 0
136 | 1bfb1cbbc94f6684ab00dcbba39d14a5: 4129
137 | 0b7a8bcbc3b128f449b2251442d100f0: -0.47
138 | 0731caeb74e307248bf21e10e589e58a: 0.534
139 | b51d336c1d7f911499e1e17213dc4f10: 6.1
140 | be4d5a9c59718d94da12fe5518c5cf8d: 716
141 | 2624d0cc16daaaf41bc696ae2700f0ea: 0
142 | bd8a4e1d46a7ee24aa782c4dc4dd76c4: -0.47
143 | 7105a64d09125ad41b395fe8369b9165: 58
144 | 675bc3bd992552d4ba4043758325c993: -10000
145 | d610b2edde7f1214aab223d9bb135c6a: 111
146 | ef75a20e87d1b064886c0ba634a6de12: 10.9
147 | 2feed91ee1a7f644b995193ab377ccad: 0.674
148 | 8051644e7c02a78448ce831852166952: 0
149 | 00ac086e1b951c44daae49d2931270bc: 1
150 | 88876cbe50f07bc4dbacef51a483dc52: 0
151 | 1e28d1ceb809efe4d9fa2dc2ae23e5cd: 0.335
152 | 292e778f05589e94ea5c942ddf126cea: 41
153 | de4c989f772b2c1498e143fcb47f4193: -5108
154 | a2c4799f3b3ffe44abddac73fc376378: -8.010126
155 | 95cd6a9f62f9fe044af0336fe7cb7fc7: 0.216
156 | m_TransitionOverrides: {}
157 | --- !u!243 &243311110667323148
158 | AudioMixerGroupController:
159 | m_ObjectHideFlags: 0
160 | m_CorrespondingSourceObject: {fileID: 0}
161 | m_PrefabInternal: {fileID: 0}
162 | m_Name: Bass
163 | m_AudioMixer: {fileID: 24100000}
164 | m_GroupID: 983c31fdbca5a2247bf26a44f413571c
165 | m_Children: []
166 | m_Volume: 88cf68c621cffe84eb14991dd746e50b
167 | m_Pitch: 4322ce44b5a5d144e903f3158885321f
168 | m_Effects:
169 | - {fileID: 244851246490729992}
170 | - {fileID: 244021391188680222}
171 | - {fileID: 244164760595349764}
172 | - {fileID: 244235115567962766}
173 | - {fileID: 244351518626770214}
174 | m_UserColorIndex: 0
175 | m_Mute: 0
176 | m_Solo: 0
177 | m_BypassEffects: 0
178 | --- !u!243 &243316727705101024
179 | AudioMixerGroupController:
180 | m_ObjectHideFlags: 0
181 | m_CorrespondingSourceObject: {fileID: 0}
182 | m_PrefabInternal: {fileID: 0}
183 | m_Name: Bass 5th
184 | m_AudioMixer: {fileID: 24100000}
185 | m_GroupID: 5c0d150cf4349c842b15e44d99ab1a68
186 | m_Children: []
187 | m_Volume: a2c4799f3b3ffe44abddac73fc376378
188 | m_Pitch: 12d53f576e824c345acf43444681c6ea
189 | m_Effects:
190 | - {fileID: 244265198703492144}
191 | - {fileID: 244183019576961810}
192 | - {fileID: 244919519950917176}
193 | - {fileID: 244081233238952010}
194 | - {fileID: 244253991675556422}
195 | m_UserColorIndex: 0
196 | m_Mute: 0
197 | m_Solo: 0
198 | m_BypassEffects: 0
199 | --- !u!243 &243755139085696720
200 | AudioMixerGroupController:
201 | m_ObjectHideFlags: 0
202 | m_CorrespondingSourceObject: {fileID: 0}
203 | m_PrefabInternal: {fileID: 0}
204 | m_Name: Arp
205 | m_AudioMixer: {fileID: 24100000}
206 | m_GroupID: 07fd43f8a8bd09245887daecc456261c
207 | m_Children: []
208 | m_Volume: 93c78a2957256c049aeac94a5402a2ac
209 | m_Pitch: acc165bd0cd4051458cb034e3666cec3
210 | m_Effects:
211 | - {fileID: 244223586858897242}
212 | - {fileID: 244652878153638326}
213 | - {fileID: 244019155623328270}
214 | - {fileID: 244751887533692142}
215 | m_UserColorIndex: 0
216 | m_Mute: 0
217 | m_Solo: 0
218 | m_BypassEffects: 0
219 | --- !u!243 &243835790171793730
220 | AudioMixerGroupController:
221 | m_ObjectHideFlags: 0
222 | m_CorrespondingSourceObject: {fileID: 0}
223 | m_PrefabInternal: {fileID: 0}
224 | m_Name: Theme
225 | m_AudioMixer: {fileID: 24100000}
226 | m_GroupID: 4f333e283939c104687bbd0750e7f9b7
227 | m_Children: []
228 | m_Volume: 896298c96d42dd9458fc79002180c209
229 | m_Pitch: 06886e63b5b85dd41abe701c8fb89ced
230 | m_Effects:
231 | - {fileID: 244971391832164886}
232 | - {fileID: 244910270510570344}
233 | - {fileID: 244582577707114228}
234 | - {fileID: 244842515314359462}
235 | - {fileID: 244609244370836212}
236 | - {fileID: 244074554680691934}
237 | m_UserColorIndex: 0
238 | m_Mute: 0
239 | m_Solo: 0
240 | m_BypassEffects: 0
241 | --- !u!243 &243987332395796422
242 | AudioMixerGroupController:
243 | m_ObjectHideFlags: 0
244 | m_CorrespondingSourceObject: {fileID: 0}
245 | m_PrefabInternal: {fileID: 0}
246 | m_Name: Delay
247 | m_AudioMixer: {fileID: 24100000}
248 | m_GroupID: 8961d07ffd2e5c7469ad3a79d7aa8064
249 | m_Children: []
250 | m_Volume: c5adad26f6ac69544af07708dc82d1e2
251 | m_Pitch: bda12bf49026e4740a48394ad34b59cf
252 | m_Effects:
253 | - {fileID: 244067647079717730}
254 | - {fileID: 244400139010438402}
255 | - {fileID: 244764984255157650}
256 | m_UserColorIndex: 0
257 | m_Mute: 0
258 | m_Solo: 0
259 | m_BypassEffects: 0
260 | --- !u!244 &244019155623328270
261 | AudioMixerEffectController:
262 | m_ObjectHideFlags: 3
263 | m_CorrespondingSourceObject: {fileID: 0}
264 | m_PrefabInternal: {fileID: 0}
265 | m_Name:
266 | m_EffectID: 6a182230f90767243b355c0efaf12be7
267 | m_EffectName: SFX Reverb
268 | m_MixLevel: 263a161f4cc149446bca9f0c7787c4aa
269 | m_Parameters:
270 | - m_ParameterName: Dry Level
271 | m_GUID: 2b9bce136fbda1e46a3cb130481c8e40
272 | - m_ParameterName: Room
273 | m_GUID: 94b41217404c3fa438830fb47feb40b4
274 | - m_ParameterName: Room HF
275 | m_GUID: de4c989f772b2c1498e143fcb47f4193
276 | - m_ParameterName: Decay Time
277 | m_GUID: 9aa6527475ecc4c49a3a9c27c2e412ba
278 | - m_ParameterName: Decay HF Ratio
279 | m_GUID: 0d6854911d538964e9fabcd077a55902
280 | - m_ParameterName: Reflections
281 | m_GUID: 675bc3bd992552d4ba4043758325c993
282 | - m_ParameterName: Reflect Delay
283 | m_GUID: 4a244b01d2f2e8148a00acf735ae735a
284 | - m_ParameterName: Reverb
285 | m_GUID: 4f7b5ae25fdbea847ae31ee7ad6e955d
286 | - m_ParameterName: Reverb Delay
287 | m_GUID: eda525958f275a64b8fcd3acfb262088
288 | - m_ParameterName: Diffusion
289 | m_GUID: 9b98de72b81df3e4292a9d2dfb57b310
290 | - m_ParameterName: Density
291 | m_GUID: 2e6bd5b479772b543ac23a68741daf34
292 | - m_ParameterName: HF Reference
293 | m_GUID: 60e58013b2d5a6341b02db45bd32116e
294 | - m_ParameterName: Room LF
295 | m_GUID: 9f3692d7a1b899a48a3168bc07c46250
296 | - m_ParameterName: LF Reference
297 | m_GUID: 397fd4c9aa147dd45a092ff307d80f67
298 | m_SendTarget: {fileID: 0}
299 | m_EnableWetMix: 0
300 | m_Bypass: 0
301 | --- !u!244 &244021391188680222
302 | AudioMixerEffectController:
303 | m_ObjectHideFlags: 3
304 | m_CorrespondingSourceObject: {fileID: 0}
305 | m_PrefabInternal: {fileID: 0}
306 | m_Name:
307 | m_EffectID: 0da676daf25151b42b47d3cdd6d77079
308 | m_EffectName: Send
309 | m_MixLevel: 0d87ba264b8ef444fb5741babe98cdc8
310 | m_Parameters: []
311 | m_SendTarget: {fileID: 244067647079717730}
312 | m_EnableWetMix: 0
313 | m_Bypass: 0
314 | --- !u!244 &244067647079717730
315 | AudioMixerEffectController:
316 | m_ObjectHideFlags: 3
317 | m_CorrespondingSourceObject: {fileID: 0}
318 | m_PrefabInternal: {fileID: 0}
319 | m_Name:
320 | m_EffectID: 62a397057e5c05642bd9bcb44ae524ad
321 | m_EffectName: Receive
322 | m_MixLevel: 97cb3f7e7828578428d2e653268173af
323 | m_Parameters: []
324 | m_SendTarget: {fileID: 0}
325 | m_EnableWetMix: 0
326 | m_Bypass: 0
327 | --- !u!244 &244074554680691934
328 | AudioMixerEffectController:
329 | m_ObjectHideFlags: 3
330 | m_CorrespondingSourceObject: {fileID: 0}
331 | m_PrefabInternal: {fileID: 0}
332 | m_Name:
333 | m_EffectID: e43f0d68a9122bf4d871ef380e47a6e7
334 | m_EffectName: Send
335 | m_MixLevel: 8051644e7c02a78448ce831852166952
336 | m_Parameters: []
337 | m_SendTarget: {fileID: 244751887533692142}
338 | m_EnableWetMix: 0
339 | m_Bypass: 0
340 | --- !u!244 &244081233238952010
341 | AudioMixerEffectController:
342 | m_ObjectHideFlags: 3
343 | m_CorrespondingSourceObject: {fileID: 0}
344 | m_PrefabInternal: {fileID: 0}
345 | m_Name: Chorus
346 | m_EffectID: 30573400142a9d94bbadd60b51200b6a
347 | m_EffectName: Chorus
348 | m_MixLevel: 097718e42df31b94b944abae18ef579c
349 | m_Parameters:
350 | - m_ParameterName: Dry mix
351 | m_GUID: 30559f5f35f038f44aa47d26d78af761
352 | - m_ParameterName: Wet mix tap 1
353 | m_GUID: 8c189bc843f66354d8ec7362edc0514a
354 | - m_ParameterName: Wet mix tap 2
355 | m_GUID: c92e68bc76034fc488e175820f03c641
356 | - m_ParameterName: Wet mix tap 3
357 | m_GUID: 1b911d2896af45446a892321edd89a6f
358 | - m_ParameterName: Delay
359 | m_GUID: 95928d18c80396346a2674524e4e4783
360 | - m_ParameterName: Rate
361 | m_GUID: d26b3a69e4b22c74ab6a95e958a8c6f2
362 | - m_ParameterName: Depth
363 | m_GUID: 2feed91ee1a7f644b995193ab377ccad
364 | - m_ParameterName: Feedback
365 | m_GUID: 0b7a8bcbc3b128f449b2251442d100f0
366 | m_SendTarget: {fileID: 0}
367 | m_EnableWetMix: 0
368 | m_Bypass: 0
369 | --- !u!244 &244164760595349764
370 | AudioMixerEffectController:
371 | m_ObjectHideFlags: 3
372 | m_CorrespondingSourceObject: {fileID: 0}
373 | m_PrefabInternal: {fileID: 0}
374 | m_Name:
375 | m_EffectID: 8a2e9f22437215347bda2ba76e210ebe
376 | m_EffectName: Chorus
377 | m_MixLevel: 74f50e0e5260cc9419f7d43947cd9bda
378 | m_Parameters:
379 | - m_ParameterName: Dry mix
380 | m_GUID: 9d2bb6a0ad40d464f96d370bf812727c
381 | - m_ParameterName: Wet mix tap 1
382 | m_GUID: df3391d75209cfc4582d94c903aa53da
383 | - m_ParameterName: Wet mix tap 2
384 | m_GUID: b375ce207a5b96d44b70a02345fe2d60
385 | - m_ParameterName: Wet mix tap 3
386 | m_GUID: 8d105e4166c7a3649a934062416cc0e3
387 | - m_ParameterName: Delay
388 | m_GUID: b51d336c1d7f911499e1e17213dc4f10
389 | - m_ParameterName: Rate
390 | m_GUID: adf28ec2fea3f464ab850bd3710e1644
391 | - m_ParameterName: Depth
392 | m_GUID: eb89695b52703744c910c0c7fc049d47
393 | - m_ParameterName: Feedback
394 | m_GUID: bd8a4e1d46a7ee24aa782c4dc4dd76c4
395 | m_SendTarget: {fileID: 0}
396 | m_EnableWetMix: 0
397 | m_Bypass: 0
398 | --- !u!244 &244183019576961810
399 | AudioMixerEffectController:
400 | m_ObjectHideFlags: 3
401 | m_CorrespondingSourceObject: {fileID: 0}
402 | m_PrefabInternal: {fileID: 0}
403 | m_Name: Send
404 | m_EffectID: 7c6baddbd4d796e4993e4c766b9de2c9
405 | m_EffectName: Send
406 | m_MixLevel: 5b9913b76aa0de44aad8dcc99b5151fa
407 | m_Parameters: []
408 | m_SendTarget: {fileID: 244067647079717730}
409 | m_EnableWetMix: 0
410 | m_Bypass: 0
411 | --- !u!244 &244223586858897242
412 | AudioMixerEffectController:
413 | m_ObjectHideFlags: 3
414 | m_CorrespondingSourceObject: {fileID: 0}
415 | m_PrefabInternal: {fileID: 0}
416 | m_Name:
417 | m_EffectID: c8a4a56d694bdab4b8510d85ae12fdd2
418 | m_EffectName: Attenuation
419 | m_MixLevel: 2f84ad75c47c92e4eab2cb16a725708d
420 | m_Parameters: []
421 | m_SendTarget: {fileID: 0}
422 | m_EnableWetMix: 0
423 | m_Bypass: 0
424 | --- !u!244 &244235115567962766
425 | AudioMixerEffectController:
426 | m_ObjectHideFlags: 3
427 | m_CorrespondingSourceObject: {fileID: 0}
428 | m_PrefabInternal: {fileID: 0}
429 | m_Name:
430 | m_EffectID: 32334d37f6ffa6e4184e7ccbebe23f8e
431 | m_EffectName: SFX Reverb
432 | m_MixLevel: 554d3ba681156ba4d89b2b5e7a4eb6e1
433 | m_Parameters:
434 | - m_ParameterName: Dry Level
435 | m_GUID: 587d5e5960e283b4f92dc614797860ed
436 | - m_ParameterName: Room
437 | m_GUID: 1cf21c327474f624cb1c2616704098f1
438 | - m_ParameterName: Room HF
439 | m_GUID: cf47658833405e44287d903df1453f6b
440 | - m_ParameterName: Decay Time
441 | m_GUID: 92d975353c2436f46976d999d2f2dc51
442 | - m_ParameterName: Decay HF Ratio
443 | m_GUID: ee3727a2c7780c84b883b8bad7f24df8
444 | - m_ParameterName: Reflections
445 | m_GUID: 23e1b4bf8bbdf6340a7fe729f9adab66
446 | - m_ParameterName: Reflect Delay
447 | m_GUID: 4147979789c7a924da70876df52540e0
448 | - m_ParameterName: Reverb
449 | m_GUID: 64489858d07ac5e4d997773e15b4c8ff
450 | - m_ParameterName: Reverb Delay
451 | m_GUID: d97efb4a2d2671b47afcdb4ebfdd7b3b
452 | - m_ParameterName: Diffusion
453 | m_GUID: f738d14f10a23ae4ca940c054d9a7eac
454 | - m_ParameterName: Density
455 | m_GUID: 33b99cf2318d7a5488ff5df0ce46443a
456 | - m_ParameterName: HF Reference
457 | m_GUID: b249e5e109ffb0a458c4c86869a4e56e
458 | - m_ParameterName: Room LF
459 | m_GUID: c8973692585fa7040b23aafc0b93ac06
460 | - m_ParameterName: LF Reference
461 | m_GUID: 10e697d29f16d4840b154e82605e632a
462 | m_SendTarget: {fileID: 0}
463 | m_EnableWetMix: 0
464 | m_Bypass: 0
465 | --- !u!244 &244253991675556422
466 | AudioMixerEffectController:
467 | m_ObjectHideFlags: 3
468 | m_CorrespondingSourceObject: {fileID: 0}
469 | m_PrefabInternal: {fileID: 0}
470 | m_Name: SFX Reverb
471 | m_EffectID: 8c1c201b45fddac449bfe1569e661429
472 | m_EffectName: SFX Reverb
473 | m_MixLevel: 5e00d3a04bfa0c6449da3bdb1b44734d
474 | m_Parameters:
475 | - m_ParameterName: Dry Level
476 | m_GUID: c979861ad799fc943a712530379b09fa
477 | - m_ParameterName: Room
478 | m_GUID: bb2826a3c6a1bce4a901f671856f3a96
479 | - m_ParameterName: Room HF
480 | m_GUID: 2153a1a4dc04f834d9403dac904d1142
481 | - m_ParameterName: Decay Time
482 | m_GUID: 05228c3374961274d8d65f313edc4d94
483 | - m_ParameterName: Decay HF Ratio
484 | m_GUID: 37584591b38873d4bacf5bdba7274136
485 | - m_ParameterName: Reflections
486 | m_GUID: d9a351749f406af478909740c88c9638
487 | - m_ParameterName: Reflect Delay
488 | m_GUID: 9c3a5073d5e35ba4d9c55d84655b6043
489 | - m_ParameterName: Reverb
490 | m_GUID: 6e9b45abe48334e46924e0c3e4c030f8
491 | - m_ParameterName: Reverb Delay
492 | m_GUID: 3fd04cf6cee536346be5f7c851fc6f12
493 | - m_ParameterName: Diffusion
494 | m_GUID: 0242ba1da754ef141be2ce620b978952
495 | - m_ParameterName: Density
496 | m_GUID: db5165ace51423c46a05c7f2d2047590
497 | - m_ParameterName: HF Reference
498 | m_GUID: 7803493502f882749b23d10e7328ef0e
499 | - m_ParameterName: Room LF
500 | m_GUID: 6367bd30e4e1b9f4f923f7ea29c0a91d
501 | - m_ParameterName: LF Reference
502 | m_GUID: 31c497732e3271d459e4bcae88be3e79
503 | m_SendTarget: {fileID: 0}
504 | m_EnableWetMix: 0
505 | m_Bypass: 0
506 | --- !u!244 &244265198703492144
507 | AudioMixerEffectController:
508 | m_ObjectHideFlags: 3
509 | m_CorrespondingSourceObject: {fileID: 0}
510 | m_PrefabInternal: {fileID: 0}
511 | m_Name: Attenuation
512 | m_EffectID: aeed98b4f90849c4fa6bd3d64479fbc1
513 | m_EffectName: Attenuation
514 | m_MixLevel: 894ad9066578d3c4f88889af8fa3b975
515 | m_Parameters: []
516 | m_SendTarget: {fileID: 0}
517 | m_EnableWetMix: 0
518 | m_Bypass: 0
519 | --- !u!244 &244351518626770214
520 | AudioMixerEffectController:
521 | m_ObjectHideFlags: 3
522 | m_CorrespondingSourceObject: {fileID: 0}
523 | m_PrefabInternal: {fileID: 0}
524 | m_Name:
525 | m_EffectID: 5a3847cb018b8d446b60ad7eca96d23d
526 | m_EffectName: ParamEQ
527 | m_MixLevel: da09f6e13bf5fb943a33c122e3077ffd
528 | m_Parameters:
529 | - m_ParameterName: Center freq
530 | m_GUID: 8fa397f41ec27044f8b0f75a49d6212b
531 | - m_ParameterName: Octave range
532 | m_GUID: a132260e3e4cef54996b50c7a855cba0
533 | - m_ParameterName: Frequency gain
534 | m_GUID: 1326e3b22e7bba648bf262e7eb1a273c
535 | m_SendTarget: {fileID: 0}
536 | m_EnableWetMix: 0
537 | m_Bypass: 0
538 | --- !u!244 &244400139010438402
539 | AudioMixerEffectController:
540 | m_ObjectHideFlags: 3
541 | m_CorrespondingSourceObject: {fileID: 0}
542 | m_PrefabInternal: {fileID: 0}
543 | m_Name:
544 | m_EffectID: b8c283319d432e94ca3e9b1a938ae6e8
545 | m_EffectName: Echo
546 | m_MixLevel: 63a264beac9499444aece301ce570f62
547 | m_Parameters:
548 | - m_ParameterName: Delay
549 | m_GUID: 5fadd888367678d45bb1d22395678e9d
550 | - m_ParameterName: Decay
551 | m_GUID: 1e28d1ceb809efe4d9fa2dc2ae23e5cd
552 | - m_ParameterName: Max channels
553 | m_GUID: 88876cbe50f07bc4dbacef51a483dc52
554 | - m_ParameterName: Drymix
555 | m_GUID: 2624d0cc16daaaf41bc696ae2700f0ea
556 | - m_ParameterName: Wetmix
557 | m_GUID: 00ac086e1b951c44daae49d2931270bc
558 | m_SendTarget: {fileID: 0}
559 | m_EnableWetMix: 0
560 | m_Bypass: 0
561 | --- !u!244 &244582577707114228
562 | AudioMixerEffectController:
563 | m_ObjectHideFlags: 3
564 | m_CorrespondingSourceObject: {fileID: 0}
565 | m_PrefabInternal: {fileID: 0}
566 | m_Name:
567 | m_EffectID: 3c800e9409e958d4c9e0d451adb48332
568 | m_EffectName: Highpass Simple
569 | m_MixLevel: 4e9cb8f93897ee2498af35283d624512
570 | m_Parameters:
571 | - m_ParameterName: Cutoff freq
572 | m_GUID: 1bfb1cbbc94f6684ab00dcbba39d14a5
573 | m_SendTarget: {fileID: 0}
574 | m_EnableWetMix: 0
575 | m_Bypass: 0
576 | --- !u!244 &244609244370836212
577 | AudioMixerEffectController:
578 | m_ObjectHideFlags: 3
579 | m_CorrespondingSourceObject: {fileID: 0}
580 | m_PrefabInternal: {fileID: 0}
581 | m_Name:
582 | m_EffectID: 8ee7a76195ab81b429cb30e518b3f1f4
583 | m_EffectName: SFX Reverb
584 | m_MixLevel: bfdcaf91543e42b47b38894669f5af9e
585 | m_Parameters:
586 | - m_ParameterName: Dry Level
587 | m_GUID: 6f5f75a95ce063442ae2e55dc251a7b2
588 | - m_ParameterName: Room
589 | m_GUID: 8152c0e23f21f6f42b427ace360af399
590 | - m_ParameterName: Room HF
591 | m_GUID: 9b86301f61cebc04c9fe76106b7c9bb7
592 | - m_ParameterName: Decay Time
593 | m_GUID: 2c8268b4d38687c4892dff12778d0dcc
594 | - m_ParameterName: Decay HF Ratio
595 | m_GUID: 6a980d03e9c408841a2d062fcee5aa6b
596 | - m_ParameterName: Reflections
597 | m_GUID: 6fda6bbc089be8e429195e146e996c29
598 | - m_ParameterName: Reflect Delay
599 | m_GUID: df5a6ce0a706c6a4a9166b1bcb5de800
600 | - m_ParameterName: Reverb
601 | m_GUID: fa851e91093029c45ba6ce80988b3d28
602 | - m_ParameterName: Reverb Delay
603 | m_GUID: 27900a8393488da4698853cc4c9a3e69
604 | - m_ParameterName: Diffusion
605 | m_GUID: 9250a3d69a30a6640b9c1e9cc93f3d2a
606 | - m_ParameterName: Density
607 | m_GUID: b28cfb481aa878942a84ecf2dd81b1e6
608 | - m_ParameterName: HF Reference
609 | m_GUID: 8d186b43fe1421c43a686655ac16593c
610 | - m_ParameterName: Room LF
611 | m_GUID: ae857cb94d1ffb849b715f9ab827f5e9
612 | - m_ParameterName: LF Reference
613 | m_GUID: 81a34bb9a939e9a44af58b6d620aaff6
614 | m_SendTarget: {fileID: 0}
615 | m_EnableWetMix: 0
616 | m_Bypass: 0
617 | --- !u!244 &244652878153638326
618 | AudioMixerEffectController:
619 | m_ObjectHideFlags: 3
620 | m_CorrespondingSourceObject: {fileID: 0}
621 | m_PrefabInternal: {fileID: 0}
622 | m_Name:
623 | m_EffectID: 8b99d9b1c28d12d4f9ec043d5ce59de2
624 | m_EffectName: Highpass
625 | m_MixLevel: ccaf753156e708f44ab8fdb070859185
626 | m_Parameters:
627 | - m_ParameterName: Cutoff freq
628 | m_GUID: c61e0590c2c2486489f4eee78bb43c9e
629 | - m_ParameterName: Resonance
630 | m_GUID: 7553c9b26cc694f4ea8fdbb1501624bf
631 | m_SendTarget: {fileID: 0}
632 | m_EnableWetMix: 0
633 | m_Bypass: 0
634 | --- !u!244 &244751887533692142
635 | AudioMixerEffectController:
636 | m_ObjectHideFlags: 3
637 | m_CorrespondingSourceObject: {fileID: 0}
638 | m_PrefabInternal: {fileID: 0}
639 | m_Name:
640 | m_EffectID: 6679ba4e77b9db44399dcf2e4a968e70
641 | m_EffectName: Duck Volume
642 | m_MixLevel: 2b0094a5dc759a94586c1639410a2754
643 | m_Parameters:
644 | - m_ParameterName: Threshold
645 | m_GUID: b9fa64d94de55e84994b08291c7430ac
646 | - m_ParameterName: Ratio
647 | m_GUID: f677523d7b5ce6741a46a31b0f39a26c
648 | - m_ParameterName: Attack Time
649 | m_GUID: c1593c26168f7034cbb96cd368c8a3e2
650 | - m_ParameterName: Release Time
651 | m_GUID: f657f1b551b674d49944def37e160904
652 | - m_ParameterName: Make-up Gain
653 | m_GUID: e4676edaf0dbedf468e98ad24bbfb6d7
654 | - m_ParameterName: Knee
655 | m_GUID: 54a8d620b1f7d6c418814245f259292a
656 | - m_ParameterName: Sidechain Mix
657 | m_GUID: 4b16f2fa7b01d3d46898f093cd12e69a
658 | m_SendTarget: {fileID: 0}
659 | m_EnableWetMix: 0
660 | m_Bypass: 0
661 | --- !u!244 &244764984255157650
662 | AudioMixerEffectController:
663 | m_ObjectHideFlags: 3
664 | m_CorrespondingSourceObject: {fileID: 0}
665 | m_PrefabInternal: {fileID: 0}
666 | m_Name:
667 | m_EffectID: 77da46cdf3b21aa42888e7f6cf1c80bb
668 | m_EffectName: Attenuation
669 | m_MixLevel: 976c585a0ae97924eaf9492475af0092
670 | m_Parameters: []
671 | m_SendTarget: {fileID: 0}
672 | m_EnableWetMix: 0
673 | m_Bypass: 0
674 | --- !u!244 &244775195484389626
675 | AudioMixerEffectController:
676 | m_ObjectHideFlags: 3
677 | m_CorrespondingSourceObject: {fileID: 0}
678 | m_PrefabInternal: {fileID: 0}
679 | m_Name:
680 | m_EffectID: 1d87f6796cbd1614eaa0c6729dc2ca7e
681 | m_EffectName: Compressor
682 | m_MixLevel: f9afa1d6e90975f419bea05f636ca12a
683 | m_Parameters:
684 | - m_ParameterName: Threshold
685 | m_GUID: 9010a3c98219c20418b7e2023ec1a521
686 | - m_ParameterName: Attack
687 | m_GUID: e92ceb22ac31aff43924b64731b65cbb
688 | - m_ParameterName: Release
689 | m_GUID: d610b2edde7f1214aab223d9bb135c6a
690 | - m_ParameterName: Make up gain
691 | m_GUID: 704b4997fd0c8ee4d9d44e824f6b445d
692 | m_SendTarget: {fileID: 0}
693 | m_EnableWetMix: 0
694 | m_Bypass: 0
695 | --- !u!244 &244842515314359462
696 | AudioMixerEffectController:
697 | m_ObjectHideFlags: 3
698 | m_CorrespondingSourceObject: {fileID: 0}
699 | m_PrefabInternal: {fileID: 0}
700 | m_Name:
701 | m_EffectID: e5b68306cbd21bf45995fa3678207cdd
702 | m_EffectName: Send
703 | m_MixLevel: bcb46e8ba533e3241b74580518d3b045
704 | m_Parameters: []
705 | m_SendTarget: {fileID: 244067647079717730}
706 | m_EnableWetMix: 0
707 | m_Bypass: 0
708 | --- !u!244 &244851246490729992
709 | AudioMixerEffectController:
710 | m_ObjectHideFlags: 3
711 | m_CorrespondingSourceObject: {fileID: 0}
712 | m_PrefabInternal: {fileID: 0}
713 | m_Name:
714 | m_EffectID: 880aa331db6b8e040a32fa52cffb0e7e
715 | m_EffectName: Attenuation
716 | m_MixLevel: fac9e43d1ad216f458fd3de9437d5f32
717 | m_Parameters: []
718 | m_SendTarget: {fileID: 0}
719 | m_EnableWetMix: 0
720 | m_Bypass: 0
721 | --- !u!244 &244910270510570344
722 | AudioMixerEffectController:
723 | m_ObjectHideFlags: 3
724 | m_CorrespondingSourceObject: {fileID: 0}
725 | m_PrefabInternal: {fileID: 0}
726 | m_Name:
727 | m_EffectID: 26f84874d4a56d040a330371d8dfc563
728 | m_EffectName: Chorus
729 | m_MixLevel: 9f8dca6cebfdc8246aa824a0f762a1bd
730 | m_Parameters:
731 | - m_ParameterName: Dry mix
732 | m_GUID: 5c299e94b9513af42922e7285a6cfaeb
733 | - m_ParameterName: Wet mix tap 1
734 | m_GUID: 61f6391fd3603f1429cddc2566373587
735 | - m_ParameterName: Wet mix tap 2
736 | m_GUID: 67f776467f264d143814bd3d0b4f99e3
737 | - m_ParameterName: Wet mix tap 3
738 | m_GUID: 0e0d381a85fc5114887da66165ea3c7e
739 | - m_ParameterName: Delay
740 | m_GUID: ef75a20e87d1b064886c0ba634a6de12
741 | - m_ParameterName: Rate
742 | m_GUID: 14be5882d708baf40b80a171a3756ea5
743 | - m_ParameterName: Depth
744 | m_GUID: 0731caeb74e307248bf21e10e589e58a
745 | - m_ParameterName: Feedback
746 | m_GUID: 093958c5fb8f66d40bff88a4e37f44fb
747 | m_SendTarget: {fileID: 0}
748 | m_EnableWetMix: 0
749 | m_Bypass: 0
750 | --- !u!244 &244919519950917176
751 | AudioMixerEffectController:
752 | m_ObjectHideFlags: 3
753 | m_CorrespondingSourceObject: {fileID: 0}
754 | m_PrefabInternal: {fileID: 0}
755 | m_Name: Highpass
756 | m_EffectID: ab4edb7e7c3555f49bc134d147a9bea2
757 | m_EffectName: Highpass
758 | m_MixLevel: c86ebe8bc8b7d084895a11cebffe836f
759 | m_Parameters:
760 | - m_ParameterName: Cutoff freq
761 | m_GUID: be4d5a9c59718d94da12fe5518c5cf8d
762 | - m_ParameterName: Resonance
763 | m_GUID: df1ae584eb68dcc40be3408572bcb1ec
764 | m_SendTarget: {fileID: 0}
765 | m_EnableWetMix: 0
766 | m_Bypass: 0
767 | --- !u!244 &244971391832164886
768 | AudioMixerEffectController:
769 | m_ObjectHideFlags: 3
770 | m_CorrespondingSourceObject: {fileID: 0}
771 | m_PrefabInternal: {fileID: 0}
772 | m_Name:
773 | m_EffectID: 8affb32388eace34c97121811543cdb4
774 | m_EffectName: Attenuation
775 | m_MixLevel: bc8be72acec7fc544b67132aee4375a9
776 | m_Parameters: []
777 | m_SendTarget: {fileID: 0}
778 | m_EnableWetMix: 0
779 | m_Bypass: 0
780 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/NewAudioMixer.mixer.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: cb40aeaae2fe0654f85b5988fe789cf8
3 | NativeFormatImporter:
4 | externalObjects: {}
5 | mainObjectFileID: 24100000
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/Phaser.cs:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018 Jakob Schmid
2 | //
3 | // Permission is hereby granted, free of charge, to any person obtaining a copy
4 | // of this software and associated documentation files (the "Software"), to deal
5 | // in the Software without restriction, including without limitation the rights
6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | // copies of the Software, and to permit persons to whom the Software is
8 | // furnished to do so, subject to the following conditions:
9 | //
10 | // The above copyright notice and this permission notice shall be included in all
11 | // copies or substantial portions of the Software.
12 | //
13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19 | // SOFTWARE."
20 |
21 | using System;
22 | using UnityEngine;
23 |
24 | // Originally, this was designed with a float phase that ran between 0 and 1.
25 | // The code was simplified and made more robust by using a 16-bit integer.
26 | // It turns out that 16-bit integers are too small for slow LFOs:
27 | //
28 | // A 0.3 Hz LFO:
29 | // freq = 0.3 [per/s] / 48000 [smp/s] = 0.000006 [per/smp]
30 | // freq_int16 = 0.00006 [per/smp] * (1<<16) ~ 0.41
31 | // ^ which is rounded down to 0
32 | //
33 | // In comparison, the same LFO using 32-bit integers:
34 | // freq_int32 = 0.00006 [per/smp] * (1<<32) ~ 26843.5 [per/smp]
35 | // which is rounded down to 26843
36 | class Phaser
37 | {
38 | public UInt32 phase = 0u; // using an integer type automatically ensures limits
39 | // phase is in [0 ; 2^(32-1)]
40 |
41 | const float PHASE_MAX = 4294967296;
42 | float amp = 1.0f;
43 | UInt32 freq__ph_p_smp = 0u;
44 | float freq__hz = 0.0f;
45 | bool is_active = true;
46 |
47 | public Phaser(float amp = 1.0f)
48 | {
49 | this.amp = amp;
50 | }
51 |
52 | public void restart()
53 | {
54 | phase = 0u;
55 | is_active = true;
56 | }
57 | public void update()
58 | {
59 | phase += freq__ph_p_smp;
60 | }
61 | public void update_oneshot() // envelope-like behaviour
62 | {
63 | UInt32 phase_old = phase;
64 | phase += freq__ph_p_smp;
65 |
66 | // Stop
67 | if (phase < phase_old)
68 | {
69 | is_active = false;
70 | phase = 0u;
71 | }
72 | }
73 | public void set_freq(float freq__hz, int sample_rate = 48000)
74 | {
75 | this.freq__hz = freq__hz;
76 | float freq__ppsmp = freq__hz / sample_rate; // periods per sample
77 | freq__ph_p_smp = (uint)(freq__ppsmp * PHASE_MAX);
78 |
79 | // // sawDPW stuff
80 | // dpwScale = 48000 / (4 * freq__hz * (1 - freq__hz / 48000));
81 | // // recompute z^-1 to avoid horrible clicks when changing frequency
82 | // float ph01 = (phase - freq__ph_p_smp) / PHASE_MAX;
83 | // float bphase = 2.0f * ph01 - 1.0f; // phasor in [-1;+1] : saw
84 | // float sq = bphase * bphase; // squared saw : parabola
85 | // float dsq = sq - z1; // differentiated parabola : bandlimited saw
86 | // z1 = sq; // store next frame's z^-1
87 | }
88 |
89 | /// Basic oscillators
90 | ///
91 | // Library sine
92 | // - possibly slow
93 | public float sin()
94 | {
95 | if (is_active == false) return 0.0f;
96 | float ph01 = phase / PHASE_MAX;
97 | return Mathf.Sin(ph01 * 6.28318530717959f) * amp;
98 | }
99 |
100 | // Differentiated Polynomial Waveform (DPW)
101 | // Based on Valimaki & Huovilainen: 'Oscillator and Filter Algorithms for Virtual Analog Synthesis'
102 | // 2nd degree, meaning that the polynomial is 2nd degree
103 | // public float sawDPW()
104 | // {
105 | // if (is_active == false) return 0.0f;
106 | // float ph01 = phase / PHASE_MAX;
107 | // float bphase = 2.0f * ph01 - 1.0f; // phasor in [-1;+1] : saw
108 | // float sq = bphase * bphase; // squared saw : parabola
109 | // float dsq = sq - z1; // differentiated parabola : bandlimited saw
110 | // z1 = sq; // store next frame's z^-1
111 | // return dsq * dpwScale * amp;
112 | // }
113 | // float z1 = 0;
114 | // float dpwScale = 1.0f;
115 |
116 | /// PolyBLEP oscillators
117 | // Polynomial Band-Limited Step Function (PolyBLEP)
118 | // Based on Valimaki 2007: 'Antialiasing Oscillators in Subtractive Synthesis'
119 | // and https://steemit.com/ableton/@metafunction/all-about-digital-oscillators-part-2-blits-and-bleps
120 | public float sawPolyBLEP()
121 | {
122 | if (is_active == false) return 0.0f;
123 | float ph01 = phase / PHASE_MAX;
124 | float result = 2.0f * ph01 - 1.0f; // phasor in [-1;+1] : saw
125 |
126 | result -= polyBLEP(ph01);
127 | return result;
128 | }
129 |
130 | // FIXME: DC offset when pulseWidth != 0.5, should be fixable by a simple offset
131 | public float squarePolyBLEP(float pulseWidth)
132 | {
133 | if (is_active == false) return 0.0f;
134 | float ph01 = phase / PHASE_MAX;
135 |
136 | float value;
137 | if (ph01 < pulseWidth)
138 | {
139 | value = amp;
140 | }
141 | else
142 | {
143 | value = -amp;
144 | }
145 | value += polyBLEP(ph01); // Layer output of Poly BLEP on top (flip)
146 | value -= polyBLEP((ph01 + 1.0f - pulseWidth) % 1.0f); // Layer output of Poly BLEP on top (flop)
147 |
148 | return value;
149 | }
150 |
151 | private float polyBLEP(float t)
152 | {
153 | // phase step in [0;1]
154 | float dt = freq__ph_p_smp / PHASE_MAX;
155 |
156 | // t-t^2/2 +1/2
157 | // 0 < t <= 1
158 | // discontinuities between 0 & 1
159 | if (t < dt) // one sample width at the start of period
160 | {
161 | t /= dt;
162 | return t + t - t * t - 1.0f;
163 | }
164 | // t^2/2 +t +1/2
165 | // -1 <= t <= 0
166 | // discontinuities between -1 & 0
167 | else if (t > 1.0f - dt) // one sample width at the end of period
168 | {
169 | t = (t - 1.0f) / dt;
170 | return t * t + t + t + 1.0f;
171 | }
172 | else return 0.0f;
173 | }
174 |
175 | // (1-x)^2
176 | // s=2: parabolic
177 | public float quad_down01()
178 | {
179 | if (is_active == false) return 0.0f;
180 | float ph01 = phase / PHASE_MAX;
181 | float x = 1.0f - ph01;
182 | return x * x;
183 | }
184 |
185 | /// Obsolete
186 | // Non-bandlimited square, will sound very noisy at higher frequencies (aliasing)
187 | public float squareUgly(float pulse_width)
188 | {
189 | float ph01 = phase / PHASE_MAX;
190 | return ph01 > pulse_width ? amp : -amp;
191 | }
192 |
193 | // Non-bandlimited saw, will sound very noisy at higher frequencies (aliasing)
194 | public float sawUgly()
195 | {
196 | float ph01 = phase / PHASE_MAX;
197 | float bphase = 2.0f * ph01 - 1.0f;
198 | return bphase * amp;
199 | }
200 | };
201 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/Phaser.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: c0d637a8f79c4e646a50bd12639d2b81
3 | timeCreated: 1535574889
4 | licenseType: Free
5 | MonoImporter:
6 | externalObjects: {}
7 | serializedVersion: 2
8 | defaultReferences: []
9 | executionOrder: 0
10 | icon: {instanceID: 0}
11 | userData:
12 | assetBundleName:
13 | assetBundleVariant:
14 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/Sequencer.cs:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018 Jakob Schmid
2 | //
3 | // Permission is hereby granted, free of charge, to any person obtaining a copy
4 | // of this software and associated documentation files (the "Software"), to deal
5 | // in the Software without restriction, including without limitation the rights
6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | // copies of the Software, and to permit persons to whom the Software is
8 | // furnished to do so, subject to the following conditions:
9 | //
10 | // The above copyright notice and this permission notice shall be included in all
11 | // copies or substantial portions of the Software.
12 | //
13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19 | // SOFTWARE."
20 |
21 | using System;
22 | using UnityEngine;
23 |
24 | public class Sequencer : MonoBehaviour
25 | {
26 | /// Static config
27 | private const Int64 queueBufferTime = 4096; // queue this amount of samples ahead
28 | public const int maxLength = 32;
29 | public const int restPitch = int.MinValue;
30 |
31 | /// Config
32 | public MoogSynth synth;
33 | [Range(1, 2000)]
34 | public float tempo = 60;
35 | [Range(1, 32)]
36 | public int tempoSubdivision = 1;
37 | [HideInInspector]
38 | public int[] pitch;
39 | [Range(0,120)]
40 | public int transpose = 48;
41 | [Range(0,120)]
42 | public int pitchRandomize = 0;
43 | [Range(1,maxLength)]
44 | public int length = 8;
45 |
46 | /// State
47 | private Int64 nextNoteTime = 0;
48 | private float tempoOld = 60;
49 | private int seqIdx = 0;
50 |
51 |
52 | private void Start()
53 | {
54 | if (synth == null)
55 | synth = GetComponent();
56 | nextNoteTime = synth.GetTime_smp() + queueBufferTime;
57 | }
58 |
59 | private void Update()
60 | {
61 | int sampleRate = AudioSettings.outputSampleRate;
62 | tempo = Mathf.Clamp(tempo, 1, 2000);
63 | // sample rate: Fs = x smp/s
64 | // tempo : x beat/m = x/60 beat/s = 60/x s/beat = 60 * Fs / x smp/beat
65 | Int64 tempo_smpPerNote = (Int64)(60 * sampleRate / tempo / tempoSubdivision);
66 |
67 | if (tempo != tempoOld)
68 | {
69 | nextNoteTime = synth.GetTime_smp() + queueBufferTime;
70 | synth.ClearQueue();
71 | tempoOld = tempo;
72 | }
73 |
74 | Int64 time = synth.GetTime_smp();
75 | bool queueSuccess = false;
76 | while(time + queueBufferTime >= nextNoteTime)
77 | {
78 | int seqLength = length;
79 | if (seqIdx >= seqLength)
80 | {
81 | seqIdx = 0;
82 | Debug.Log("seqIdx out of range, resetting");
83 | }
84 |
85 | int seqPitch = pitch[seqIdx];
86 |
87 | if (seqPitch != restPitch) // skip rests
88 | {
89 | int notePitch = seqPitch + transpose + UnityEngine.Random.Range(-pitchRandomize, pitchRandomize);
90 |
91 | Int64 noteOnTime = nextNoteTime;
92 | Int64 noteOffTime = nextNoteTime + (Int64)(tempo_smpPerNote * 0.75f);
93 | queueSuccess = synth.queue_event(EventQueue.EventType.Note_on, notePitch, noteOnTime);
94 | //queueSuccess &= synth.queue_event(EventQueue.EventType.Note_off, 0, noteOffTime);
95 | if (queueSuccess == false)
96 | {
97 | Debug.LogError("Event enqueue failed", this);
98 | break;
99 | }
100 | }
101 | seqIdx = (seqIdx + 1) % seqLength;
102 | nextNoteTime += tempo_smpPerNote;
103 | }
104 | }
105 |
106 | public int getCurrentSeqIdx()
107 | {
108 | return (seqIdx + length - 2) % length; // FIXME, this is crap
109 | }
110 | }
111 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/Sequencer.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: ca607083fb9ba7945963d2c0c0013231
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/SequencerSimple.cs:
--------------------------------------------------------------------------------
1 | // Copyright (c) 2018 Jakob Schmid
2 | //
3 | // Permission is hereby granted, free of charge, to any person obtaining a copy
4 | // of this software and associated documentation files (the "Software"), to deal
5 | // in the Software without restriction, including without limitation the rights
6 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 | // copies of the Software, and to permit persons to whom the Software is
8 | // furnished to do so, subject to the following conditions:
9 | //
10 | // The above copyright notice and this permission notice shall be included in all
11 | // copies or substantial portions of the Software.
12 | //
13 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19 | // SOFTWARE."
20 |
21 | using UnityEngine;
22 |
23 | public class SequencerSimple : MonoBehaviour
24 | {
25 | /// Config
26 | public MoogSynth synth;
27 |
28 | [Header("Note: modifying sequence length while running can lead to errors")]
29 | public int[] sequence = null;
30 | public int speed = 10;
31 | [Range(0, 256)]
32 | public int pitch = 32;
33 |
34 | // LFOs
35 | [Header("LFO 1")]
36 | public bool lfo1enabled = false;
37 | [Range(0, 6)]
38 | public int lfo1Param;
39 | [Range(0, 10000)]
40 | public float lfo1Strength;
41 | [Range(0, 10)]
42 | public float lfo1Freq = 1;
43 |
44 | [Header("LFO 2")]
45 | public bool lfo2enabled = false;
46 | [Range(0, 6)]
47 | public int lfo2Param;
48 | [Range(0, 10000)]
49 | public float lfo2Strength;
50 | [Range(0, 10)]
51 | public float lfo2Freq = 1;
52 |
53 | /// State
54 | private float lfo1BaseValue;
55 | private float lfo2BaseValue;
56 | private int sequenceIdx = 0;
57 | private int audioFrameCount = 0;
58 |
59 | /// Components
60 | private Phaser lfo1;
61 | private Phaser lfo2;
62 |
63 |
64 | private void Awake()
65 | {
66 | lfo1 = new Phaser();
67 | lfo2 = new Phaser();
68 | lfo1BaseValue = synth.get_parameter(lfo1Param);
69 | lfo2BaseValue = synth.get_parameter(lfo2Param);
70 | }
71 |
72 | // No audio is rendered in this method.
73 | // This code is only here to get updates synchronized in audio frame time.
74 | private void OnAudioFilterRead(float[] data, int channels)
75 | {
76 | bool playNote = (audioFrameCount % speed) == 0;
77 | if (playNote)
78 | {
79 | int note = sequence[sequenceIdx++];
80 | sequenceIdx %= sequence.Length;
81 | if (note != -1)
82 | {
83 | note += pitch;
84 |
85 | synth.HandleEventNow(new EventQueue.QueuedEvent(EventQueue.EventType.Note_off, 0, -1));
86 | synth.HandleEventNow(new EventQueue.QueuedEvent(EventQueue.EventType.Note_on, note, -1));
87 | }
88 | }
89 |
90 | if (lfo1enabled)
91 | {
92 | lfo1.set_freq(lfo1Freq * 1024);
93 | lfo1.update();
94 | synth.set_parameter(lfo1Param, lfo1BaseValue + lfo1.sin() * lfo1Strength);
95 | }
96 | if (lfo2enabled)
97 | {
98 | lfo2.set_freq(lfo2Freq * 1024);
99 | lfo2.update();
100 | synth.set_parameter(lfo2Param, lfo2BaseValue + lfo2.sin() * lfo2Strength);
101 | }
102 |
103 | audioFrameCount++;
104 | }
105 | }
106 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Assets/SequencerSimple.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 293ee25f74d88654584e42f7990d50f6
3 | timeCreated: 1535575591
4 | licenseType: Free
5 | MonoImporter:
6 | externalObjects: {}
7 | serializedVersion: 2
8 | defaultReferences: []
9 | executionOrder: 0
10 | icon: {instanceID: 0}
11 | userData:
12 | assetBundleName:
13 | assetBundleVariant:
14 |
--------------------------------------------------------------------------------
/MoogSynthUnity/Packages/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "com.unity.ads": "2.0.8",
4 | "com.unity.analytics": "2.0.16",
5 | "com.unity.package-manager-ui": "1.9.11",
6 | "com.unity.purchasing": "2.0.3",
7 | "com.unity.textmeshpro": "1.2.4",
8 | "com.unity.modules.ai": "1.0.0",
9 | "com.unity.modules.animation": "1.0.0",
10 | "com.unity.modules.assetbundle": "1.0.0",
11 | "com.unity.modules.audio": "1.0.0",
12 | "com.unity.modules.cloth": "1.0.0",
13 | "com.unity.modules.director": "1.0.0",
14 | "com.unity.modules.imageconversion": "1.0.0",
15 | "com.unity.modules.imgui": "1.0.0",
16 | "com.unity.modules.jsonserialize": "1.0.0",
17 | "com.unity.modules.particlesystem": "1.0.0",
18 | "com.unity.modules.physics": "1.0.0",
19 | "com.unity.modules.physics2d": "1.0.0",
20 | "com.unity.modules.screencapture": "1.0.0",
21 | "com.unity.modules.terrain": "1.0.0",
22 | "com.unity.modules.terrainphysics": "1.0.0",
23 | "com.unity.modules.tilemap": "1.0.0",
24 | "com.unity.modules.ui": "1.0.0",
25 | "com.unity.modules.uielements": "1.0.0",
26 | "com.unity.modules.umbra": "1.0.0",
27 | "com.unity.modules.unityanalytics": "1.0.0",
28 | "com.unity.modules.unitywebrequest": "1.0.0",
29 | "com.unity.modules.unitywebrequestassetbundle": "1.0.0",
30 | "com.unity.modules.unitywebrequestaudio": "1.0.0",
31 | "com.unity.modules.unitywebrequesttexture": "1.0.0",
32 | "com.unity.modules.unitywebrequestwww": "1.0.0",
33 | "com.unity.modules.vehicles": "1.0.0",
34 | "com.unity.modules.video": "1.0.0",
35 | "com.unity.modules.vr": "1.0.0",
36 | "com.unity.modules.wind": "1.0.0",
37 | "com.unity.modules.xr": "1.0.0"
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/MoogSynthUnity/ProjectSettings/AudioManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!11 &1
4 | AudioManager:
5 | m_ObjectHideFlags: 0
6 | m_Volume: 1
7 | Rolloff Scale: 1
8 | Doppler Factor: 1
9 | Default Speaker Mode: 2
10 | m_SampleRate: 0
11 | m_DSPBufferSize: 0
12 | m_VirtualVoiceCount: 512
13 | m_RealVoiceCount: 32
14 | m_SpatializerPlugin:
15 | m_AmbisonicDecoderPlugin:
16 | m_DisableAudio: 0
17 | m_VirtualizeEffects: 1
18 |
--------------------------------------------------------------------------------
/MoogSynthUnity/ProjectSettings/ClusterInputManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!236 &1
4 | ClusterInputManager:
5 | m_ObjectHideFlags: 0
6 | m_Inputs: []
7 |
--------------------------------------------------------------------------------
/MoogSynthUnity/ProjectSettings/DynamicsManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!55 &1
4 | PhysicsManager:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 3
7 | m_Gravity: {x: 0, y: -9.81, z: 0}
8 | m_DefaultMaterial: {fileID: 0}
9 | m_BounceThreshold: 2
10 | m_SleepThreshold: 0.005
11 | m_DefaultContactOffset: 0.01
12 | m_DefaultSolverIterations: 6
13 | m_DefaultSolverVelocityIterations: 1
14 | m_QueriesHitBackfaces: 0
15 | m_QueriesHitTriggers: 1
16 | m_EnableAdaptiveForce: 0
17 | m_EnablePCM: 1
18 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
19 | m_AutoSimulation: 1
20 | m_AutoSyncTransforms: 1
21 |
--------------------------------------------------------------------------------
/MoogSynthUnity/ProjectSettings/EditorBuildSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!1045 &1
4 | EditorBuildSettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 2
7 | m_Scenes: []
8 |
--------------------------------------------------------------------------------
/MoogSynthUnity/ProjectSettings/EditorSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!159 &1
4 | EditorSettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 5
7 | m_ExternalVersionControlSupport: Hidden Meta Files
8 | m_SerializationMode: 2
9 | m_DefaultBehaviorMode: 0
10 | m_SpritePackerMode: 0
11 | m_SpritePackerPaddingPower: 1
12 | m_EtcTextureCompressorBehavior: 1
13 | m_EtcTextureFastCompressor: 1
14 | m_EtcTextureNormalCompressor: 2
15 | m_EtcTextureBestCompressor: 4
16 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd
17 | m_ProjectGenerationRootNamespace:
18 | m_UserGeneratedProjectSuffix:
19 | m_CollabEditorSettings:
20 | inProgressEnabled: 1
21 |
--------------------------------------------------------------------------------
/MoogSynthUnity/ProjectSettings/GraphicsSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!30 &1
4 | GraphicsSettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 12
7 | m_Deferred:
8 | m_Mode: 1
9 | m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0}
10 | m_DeferredReflections:
11 | m_Mode: 1
12 | m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0}
13 | m_ScreenSpaceShadows:
14 | m_Mode: 1
15 | m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0}
16 | m_LegacyDeferred:
17 | m_Mode: 1
18 | m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0}
19 | m_DepthNormals:
20 | m_Mode: 1
21 | m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0}
22 | m_MotionVectors:
23 | m_Mode: 1
24 | m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0}
25 | m_LightHalo:
26 | m_Mode: 1
27 | m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0}
28 | m_LensFlare:
29 | m_Mode: 1
30 | m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0}
31 | m_AlwaysIncludedShaders:
32 | - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0}
33 | - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0}
34 | - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0}
35 | - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0}
36 | - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0}
37 | - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0}
38 | m_PreloadedShaders: []
39 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000,
40 | type: 0}
41 | m_CustomRenderPipeline: {fileID: 0}
42 | m_TransparencySortMode: 0
43 | m_TransparencySortAxis: {x: 0, y: 0, z: 1}
44 | m_DefaultRenderingPath: 1
45 | m_DefaultMobileRenderingPath: 1
46 | m_TierSettings: []
47 | m_LightmapStripping: 0
48 | m_FogStripping: 0
49 | m_InstancingStripping: 0
50 | m_LightmapKeepPlain: 1
51 | m_LightmapKeepDirCombined: 1
52 | m_LightmapKeepDynamicPlain: 1
53 | m_LightmapKeepDynamicDirCombined: 1
54 | m_LightmapKeepShadowMask: 1
55 | m_LightmapKeepSubtractive: 1
56 | m_FogKeepLinear: 1
57 | m_FogKeepExp: 1
58 | m_FogKeepExp2: 1
59 | m_AlbedoSwatchInfos: []
60 | m_LightsUseLinearIntensity: 0
61 | m_LightsUseColorTemperature: 0
62 |
--------------------------------------------------------------------------------
/MoogSynthUnity/ProjectSettings/InputManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!13 &1
4 | InputManager:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 2
7 | m_Axes:
8 | - serializedVersion: 3
9 | m_Name: Horizontal
10 | descriptiveName:
11 | descriptiveNegativeName:
12 | negativeButton: left
13 | positiveButton: right
14 | altNegativeButton: a
15 | altPositiveButton: d
16 | gravity: 3
17 | dead: 0.001
18 | sensitivity: 3
19 | snap: 1
20 | invert: 0
21 | type: 0
22 | axis: 0
23 | joyNum: 0
24 | - serializedVersion: 3
25 | m_Name: Vertical
26 | descriptiveName:
27 | descriptiveNegativeName:
28 | negativeButton: down
29 | positiveButton: up
30 | altNegativeButton: s
31 | altPositiveButton: w
32 | gravity: 3
33 | dead: 0.001
34 | sensitivity: 3
35 | snap: 1
36 | invert: 0
37 | type: 0
38 | axis: 0
39 | joyNum: 0
40 | - serializedVersion: 3
41 | m_Name: Fire1
42 | descriptiveName:
43 | descriptiveNegativeName:
44 | negativeButton:
45 | positiveButton: left ctrl
46 | altNegativeButton:
47 | altPositiveButton: mouse 0
48 | gravity: 1000
49 | dead: 0.001
50 | sensitivity: 1000
51 | snap: 0
52 | invert: 0
53 | type: 0
54 | axis: 0
55 | joyNum: 0
56 | - serializedVersion: 3
57 | m_Name: Fire2
58 | descriptiveName:
59 | descriptiveNegativeName:
60 | negativeButton:
61 | positiveButton: left alt
62 | altNegativeButton:
63 | altPositiveButton: mouse 1
64 | gravity: 1000
65 | dead: 0.001
66 | sensitivity: 1000
67 | snap: 0
68 | invert: 0
69 | type: 0
70 | axis: 0
71 | joyNum: 0
72 | - serializedVersion: 3
73 | m_Name: Fire3
74 | descriptiveName:
75 | descriptiveNegativeName:
76 | negativeButton:
77 | positiveButton: left shift
78 | altNegativeButton:
79 | altPositiveButton: mouse 2
80 | gravity: 1000
81 | dead: 0.001
82 | sensitivity: 1000
83 | snap: 0
84 | invert: 0
85 | type: 0
86 | axis: 0
87 | joyNum: 0
88 | - serializedVersion: 3
89 | m_Name: Jump
90 | descriptiveName:
91 | descriptiveNegativeName:
92 | negativeButton:
93 | positiveButton: space
94 | altNegativeButton:
95 | altPositiveButton:
96 | gravity: 1000
97 | dead: 0.001
98 | sensitivity: 1000
99 | snap: 0
100 | invert: 0
101 | type: 0
102 | axis: 0
103 | joyNum: 0
104 | - serializedVersion: 3
105 | m_Name: Mouse X
106 | descriptiveName:
107 | descriptiveNegativeName:
108 | negativeButton:
109 | positiveButton:
110 | altNegativeButton:
111 | altPositiveButton:
112 | gravity: 0
113 | dead: 0
114 | sensitivity: 0.1
115 | snap: 0
116 | invert: 0
117 | type: 1
118 | axis: 0
119 | joyNum: 0
120 | - serializedVersion: 3
121 | m_Name: Mouse Y
122 | descriptiveName:
123 | descriptiveNegativeName:
124 | negativeButton:
125 | positiveButton:
126 | altNegativeButton:
127 | altPositiveButton:
128 | gravity: 0
129 | dead: 0
130 | sensitivity: 0.1
131 | snap: 0
132 | invert: 0
133 | type: 1
134 | axis: 1
135 | joyNum: 0
136 | - serializedVersion: 3
137 | m_Name: Mouse ScrollWheel
138 | descriptiveName:
139 | descriptiveNegativeName:
140 | negativeButton:
141 | positiveButton:
142 | altNegativeButton:
143 | altPositiveButton:
144 | gravity: 0
145 | dead: 0
146 | sensitivity: 0.1
147 | snap: 0
148 | invert: 0
149 | type: 1
150 | axis: 2
151 | joyNum: 0
152 | - serializedVersion: 3
153 | m_Name: Horizontal
154 | descriptiveName:
155 | descriptiveNegativeName:
156 | negativeButton:
157 | positiveButton:
158 | altNegativeButton:
159 | altPositiveButton:
160 | gravity: 0
161 | dead: 0.19
162 | sensitivity: 1
163 | snap: 0
164 | invert: 0
165 | type: 2
166 | axis: 0
167 | joyNum: 0
168 | - serializedVersion: 3
169 | m_Name: Vertical
170 | descriptiveName:
171 | descriptiveNegativeName:
172 | negativeButton:
173 | positiveButton:
174 | altNegativeButton:
175 | altPositiveButton:
176 | gravity: 0
177 | dead: 0.19
178 | sensitivity: 1
179 | snap: 0
180 | invert: 1
181 | type: 2
182 | axis: 1
183 | joyNum: 0
184 | - serializedVersion: 3
185 | m_Name: Fire1
186 | descriptiveName:
187 | descriptiveNegativeName:
188 | negativeButton:
189 | positiveButton: joystick button 0
190 | altNegativeButton:
191 | altPositiveButton:
192 | gravity: 1000
193 | dead: 0.001
194 | sensitivity: 1000
195 | snap: 0
196 | invert: 0
197 | type: 0
198 | axis: 0
199 | joyNum: 0
200 | - serializedVersion: 3
201 | m_Name: Fire2
202 | descriptiveName:
203 | descriptiveNegativeName:
204 | negativeButton:
205 | positiveButton: joystick button 1
206 | altNegativeButton:
207 | altPositiveButton:
208 | gravity: 1000
209 | dead: 0.001
210 | sensitivity: 1000
211 | snap: 0
212 | invert: 0
213 | type: 0
214 | axis: 0
215 | joyNum: 0
216 | - serializedVersion: 3
217 | m_Name: Fire3
218 | descriptiveName:
219 | descriptiveNegativeName:
220 | negativeButton:
221 | positiveButton: joystick button 2
222 | altNegativeButton:
223 | altPositiveButton:
224 | gravity: 1000
225 | dead: 0.001
226 | sensitivity: 1000
227 | snap: 0
228 | invert: 0
229 | type: 0
230 | axis: 0
231 | joyNum: 0
232 | - serializedVersion: 3
233 | m_Name: Jump
234 | descriptiveName:
235 | descriptiveNegativeName:
236 | negativeButton:
237 | positiveButton: joystick button 3
238 | altNegativeButton:
239 | altPositiveButton:
240 | gravity: 1000
241 | dead: 0.001
242 | sensitivity: 1000
243 | snap: 0
244 | invert: 0
245 | type: 0
246 | axis: 0
247 | joyNum: 0
248 | - serializedVersion: 3
249 | m_Name: Submit
250 | descriptiveName:
251 | descriptiveNegativeName:
252 | negativeButton:
253 | positiveButton: return
254 | altNegativeButton:
255 | altPositiveButton: joystick button 0
256 | gravity: 1000
257 | dead: 0.001
258 | sensitivity: 1000
259 | snap: 0
260 | invert: 0
261 | type: 0
262 | axis: 0
263 | joyNum: 0
264 | - serializedVersion: 3
265 | m_Name: Submit
266 | descriptiveName:
267 | descriptiveNegativeName:
268 | negativeButton:
269 | positiveButton: enter
270 | altNegativeButton:
271 | altPositiveButton: space
272 | gravity: 1000
273 | dead: 0.001
274 | sensitivity: 1000
275 | snap: 0
276 | invert: 0
277 | type: 0
278 | axis: 0
279 | joyNum: 0
280 | - serializedVersion: 3
281 | m_Name: Cancel
282 | descriptiveName:
283 | descriptiveNegativeName:
284 | negativeButton:
285 | positiveButton: escape
286 | altNegativeButton:
287 | altPositiveButton: joystick button 1
288 | gravity: 1000
289 | dead: 0.001
290 | sensitivity: 1000
291 | snap: 0
292 | invert: 0
293 | type: 0
294 | axis: 0
295 | joyNum: 0
296 |
--------------------------------------------------------------------------------
/MoogSynthUnity/ProjectSettings/NavMeshAreas.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!126 &1
4 | NavMeshProjectSettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 2
7 | areas:
8 | - name: Walkable
9 | cost: 1
10 | - name: Not Walkable
11 | cost: 1
12 | - name: Jump
13 | cost: 2
14 | - name:
15 | cost: 1
16 | - name:
17 | cost: 1
18 | - name:
19 | cost: 1
20 | - name:
21 | cost: 1
22 | - name:
23 | cost: 1
24 | - name:
25 | cost: 1
26 | - name:
27 | cost: 1
28 | - name:
29 | cost: 1
30 | - name:
31 | cost: 1
32 | - name:
33 | cost: 1
34 | - name:
35 | cost: 1
36 | - name:
37 | cost: 1
38 | - name:
39 | cost: 1
40 | - name:
41 | cost: 1
42 | - name:
43 | cost: 1
44 | - name:
45 | cost: 1
46 | - name:
47 | cost: 1
48 | - name:
49 | cost: 1
50 | - name:
51 | cost: 1
52 | - name:
53 | cost: 1
54 | - name:
55 | cost: 1
56 | - name:
57 | cost: 1
58 | - name:
59 | cost: 1
60 | - name:
61 | cost: 1
62 | - name:
63 | cost: 1
64 | - name:
65 | cost: 1
66 | - name:
67 | cost: 1
68 | - name:
69 | cost: 1
70 | - name:
71 | cost: 1
72 | m_LastAgentTypeID: -887442657
73 | m_Settings:
74 | - serializedVersion: 2
75 | agentTypeID: 0
76 | agentRadius: 0.5
77 | agentHeight: 2
78 | agentSlope: 45
79 | agentClimb: 0.75
80 | ledgeDropHeight: 0
81 | maxJumpAcrossDistance: 0
82 | minRegionArea: 2
83 | manualCellSize: 0
84 | cellSize: 0.16666667
85 | manualTileSize: 0
86 | tileSize: 256
87 | accuratePlacement: 0
88 | debug:
89 | m_Flags: 0
90 | m_SettingNames:
91 | - Humanoid
92 |
--------------------------------------------------------------------------------
/MoogSynthUnity/ProjectSettings/NetworkManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!149 &1
4 | NetworkManager:
5 | m_ObjectHideFlags: 0
6 | m_DebugLevel: 0
7 | m_Sendrate: 15
8 | m_AssetToPrefab: {}
9 |
--------------------------------------------------------------------------------
/MoogSynthUnity/ProjectSettings/Physics2DSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!19 &1
4 | Physics2DSettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 3
7 | m_Gravity: {x: 0, y: -9.81}
8 | m_DefaultMaterial: {fileID: 0}
9 | m_VelocityIterations: 8
10 | m_PositionIterations: 3
11 | m_VelocityThreshold: 1
12 | m_MaxLinearCorrection: 0.2
13 | m_MaxAngularCorrection: 8
14 | m_MaxTranslationSpeed: 100
15 | m_MaxRotationSpeed: 360
16 | m_BaumgarteScale: 0.2
17 | m_BaumgarteTimeOfImpactScale: 0.75
18 | m_TimeToSleep: 0.5
19 | m_LinearSleepTolerance: 0.01
20 | m_AngularSleepTolerance: 2
21 | m_DefaultContactOffset: 0.01
22 | m_AutoSimulation: 1
23 | m_QueriesHitTriggers: 1
24 | m_QueriesStartInColliders: 1
25 | m_ChangeStopsCallbacks: 0
26 | m_CallbacksOnDisable: 1
27 | m_AutoSyncTransforms: 1
28 | m_AlwaysShowColliders: 0
29 | m_ShowColliderSleep: 1
30 | m_ShowColliderContacts: 0
31 | m_ShowColliderAABB: 0
32 | m_ContactArrowScale: 0.2
33 | m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412}
34 | m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432}
35 | m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745}
36 | m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804}
37 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
38 |
--------------------------------------------------------------------------------
/MoogSynthUnity/ProjectSettings/PresetManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!1386491679 &1
4 | PresetManager:
5 | m_ObjectHideFlags: 0
6 | m_DefaultList: []
7 |
--------------------------------------------------------------------------------
/MoogSynthUnity/ProjectSettings/ProjectSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!129 &1
4 | PlayerSettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 15
7 | productGUID: a9aca1b132fc486428dddbe56a23e0e9
8 | AndroidProfiler: 0
9 | AndroidFilterTouchesWhenObscured: 0
10 | AndroidEnableSustainedPerformanceMode: 0
11 | defaultScreenOrientation: 4
12 | targetDevice: 2
13 | useOnDemandResources: 0
14 | accelerometerFrequency: 60
15 | companyName: DefaultCompany
16 | productName: GeneralSynthTest
17 | defaultCursor: {fileID: 0}
18 | cursorHotspot: {x: 0, y: 0}
19 | m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1}
20 | m_ShowUnitySplashScreen: 1
21 | m_ShowUnitySplashLogo: 1
22 | m_SplashScreenOverlayOpacity: 1
23 | m_SplashScreenAnimation: 1
24 | m_SplashScreenLogoStyle: 1
25 | m_SplashScreenDrawMode: 0
26 | m_SplashScreenBackgroundAnimationZoom: 1
27 | m_SplashScreenLogoAnimationZoom: 1
28 | m_SplashScreenBackgroundLandscapeAspect: 1
29 | m_SplashScreenBackgroundPortraitAspect: 1
30 | m_SplashScreenBackgroundLandscapeUvs:
31 | serializedVersion: 2
32 | x: 0
33 | y: 0
34 | width: 1
35 | height: 1
36 | m_SplashScreenBackgroundPortraitUvs:
37 | serializedVersion: 2
38 | x: 0
39 | y: 0
40 | width: 1
41 | height: 1
42 | m_SplashScreenLogos: []
43 | m_VirtualRealitySplashScreen: {fileID: 0}
44 | m_HolographicTrackingLossScreen: {fileID: 0}
45 | defaultScreenWidth: 1024
46 | defaultScreenHeight: 768
47 | defaultScreenWidthWeb: 960
48 | defaultScreenHeightWeb: 600
49 | m_StereoRenderingPath: 0
50 | m_ActiveColorSpace: 0
51 | m_MTRendering: 1
52 | m_StackTraceTypes: 010000000100000001000000010000000100000001000000
53 | iosShowActivityIndicatorOnLoading: -1
54 | androidShowActivityIndicatorOnLoading: -1
55 | iosAppInBackgroundBehavior: 0
56 | displayResolutionDialog: 1
57 | iosAllowHTTPDownload: 1
58 | allowedAutorotateToPortrait: 1
59 | allowedAutorotateToPortraitUpsideDown: 1
60 | allowedAutorotateToLandscapeRight: 1
61 | allowedAutorotateToLandscapeLeft: 1
62 | useOSAutorotation: 1
63 | use32BitDisplayBuffer: 1
64 | preserveFramebufferAlpha: 0
65 | disableDepthAndStencilBuffers: 0
66 | androidBlitType: 0
67 | defaultIsNativeResolution: 1
68 | macRetinaSupport: 1
69 | runInBackground: 1
70 | captureSingleScreen: 0
71 | muteOtherAudioSources: 0
72 | Prepare IOS For Recording: 0
73 | Force IOS Speakers When Recording: 0
74 | deferSystemGesturesMode: 0
75 | hideHomeButton: 0
76 | submitAnalytics: 1
77 | usePlayerLog: 1
78 | bakeCollisionMeshes: 0
79 | forceSingleInstance: 0
80 | resizableWindow: 0
81 | useMacAppStoreValidation: 0
82 | macAppStoreCategory: public.app-category.games
83 | gpuSkinning: 0
84 | graphicsJobs: 0
85 | xboxPIXTextureCapture: 0
86 | xboxEnableAvatar: 0
87 | xboxEnableKinect: 0
88 | xboxEnableKinectAutoTracking: 0
89 | xboxEnableFitness: 0
90 | visibleInBackground: 1
91 | allowFullscreenSwitch: 1
92 | graphicsJobMode: 0
93 | fullscreenMode: 1
94 | xboxSpeechDB: 0
95 | xboxEnableHeadOrientation: 0
96 | xboxEnableGuest: 0
97 | xboxEnablePIXSampling: 0
98 | metalFramebufferOnly: 0
99 | n3dsDisableStereoscopicView: 0
100 | n3dsEnableSharedListOpt: 1
101 | n3dsEnableVSync: 0
102 | xboxOneResolution: 0
103 | xboxOneSResolution: 0
104 | xboxOneXResolution: 3
105 | xboxOneMonoLoggingLevel: 0
106 | xboxOneLoggingLevel: 1
107 | xboxOneDisableEsram: 0
108 | xboxOnePresentImmediateThreshold: 0
109 | switchQueueCommandMemory: 0
110 | videoMemoryForVertexBuffers: 0
111 | psp2PowerMode: 0
112 | psp2AcquireBGM: 1
113 | vulkanEnableSetSRGBWrite: 0
114 | vulkanUseSWCommandBuffers: 0
115 | m_SupportedAspectRatios:
116 | 4:3: 1
117 | 5:4: 1
118 | 16:10: 1
119 | 16:9: 1
120 | Others: 1
121 | bundleVersion: 1.0
122 | preloadedAssets: []
123 | metroInputSource: 0
124 | wsaTransparentSwapchain: 0
125 | m_HolographicPauseOnTrackingLoss: 1
126 | xboxOneDisableKinectGpuReservation: 0
127 | xboxOneEnable7thCore: 0
128 | vrSettings:
129 | cardboard:
130 | depthFormat: 0
131 | enableTransitionView: 0
132 | daydream:
133 | depthFormat: 0
134 | useSustainedPerformanceMode: 0
135 | enableVideoLayer: 0
136 | useProtectedVideoMemory: 0
137 | minimumSupportedHeadTracking: 0
138 | maximumSupportedHeadTracking: 1
139 | hololens:
140 | depthFormat: 1
141 | depthBufferSharingEnabled: 0
142 | oculus:
143 | sharedDepthBuffer: 0
144 | dashSupport: 0
145 | enable360StereoCapture: 0
146 | protectGraphicsMemory: 0
147 | useHDRDisplay: 0
148 | m_ColorGamuts: 00000000
149 | targetPixelDensity: 30
150 | resolutionScalingMode: 0
151 | androidSupportedAspectRatio: 1
152 | androidMaxAspectRatio: 2.1
153 | applicationIdentifier: {}
154 | buildNumber: {}
155 | AndroidBundleVersionCode: 1
156 | AndroidMinSdkVersion: 16
157 | AndroidTargetSdkVersion: 0
158 | AndroidPreferredInstallLocation: 1
159 | aotOptions:
160 | stripEngineCode: 1
161 | iPhoneStrippingLevel: 0
162 | iPhoneScriptCallOptimization: 0
163 | ForceInternetPermission: 0
164 | ForceSDCardPermission: 0
165 | CreateWallpaper: 0
166 | APKExpansionFiles: 0
167 | keepLoadedShadersAlive: 0
168 | StripUnusedMeshComponents: 0
169 | VertexChannelCompressionMask: 214
170 | iPhoneSdkVersion: 988
171 | iOSTargetOSVersionString: 8.0
172 | tvOSSdkVersion: 0
173 | tvOSRequireExtendedGameController: 0
174 | tvOSTargetOSVersionString: 9.0
175 | uIPrerenderedIcon: 0
176 | uIRequiresPersistentWiFi: 0
177 | uIRequiresFullScreen: 1
178 | uIStatusBarHidden: 1
179 | uIExitOnSuspend: 0
180 | uIStatusBarStyle: 0
181 | iPhoneSplashScreen: {fileID: 0}
182 | iPhoneHighResSplashScreen: {fileID: 0}
183 | iPhoneTallHighResSplashScreen: {fileID: 0}
184 | iPhone47inSplashScreen: {fileID: 0}
185 | iPhone55inPortraitSplashScreen: {fileID: 0}
186 | iPhone55inLandscapeSplashScreen: {fileID: 0}
187 | iPhone58inPortraitSplashScreen: {fileID: 0}
188 | iPhone58inLandscapeSplashScreen: {fileID: 0}
189 | iPadPortraitSplashScreen: {fileID: 0}
190 | iPadHighResPortraitSplashScreen: {fileID: 0}
191 | iPadLandscapeSplashScreen: {fileID: 0}
192 | iPadHighResLandscapeSplashScreen: {fileID: 0}
193 | appleTVSplashScreen: {fileID: 0}
194 | appleTVSplashScreen2x: {fileID: 0}
195 | tvOSSmallIconLayers: []
196 | tvOSSmallIconLayers2x: []
197 | tvOSLargeIconLayers: []
198 | tvOSLargeIconLayers2x: []
199 | tvOSTopShelfImageLayers: []
200 | tvOSTopShelfImageLayers2x: []
201 | tvOSTopShelfImageWideLayers: []
202 | tvOSTopShelfImageWideLayers2x: []
203 | iOSLaunchScreenType: 0
204 | iOSLaunchScreenPortrait: {fileID: 0}
205 | iOSLaunchScreenLandscape: {fileID: 0}
206 | iOSLaunchScreenBackgroundColor:
207 | serializedVersion: 2
208 | rgba: 0
209 | iOSLaunchScreenFillPct: 100
210 | iOSLaunchScreenSize: 100
211 | iOSLaunchScreenCustomXibPath:
212 | iOSLaunchScreeniPadType: 0
213 | iOSLaunchScreeniPadImage: {fileID: 0}
214 | iOSLaunchScreeniPadBackgroundColor:
215 | serializedVersion: 2
216 | rgba: 0
217 | iOSLaunchScreeniPadFillPct: 100
218 | iOSLaunchScreeniPadSize: 100
219 | iOSLaunchScreeniPadCustomXibPath:
220 | iOSUseLaunchScreenStoryboard: 0
221 | iOSLaunchScreenCustomStoryboardPath:
222 | iOSDeviceRequirements: []
223 | iOSURLSchemes: []
224 | iOSBackgroundModes: 0
225 | iOSMetalForceHardShadows: 0
226 | metalEditorSupport: 1
227 | metalAPIValidation: 1
228 | iOSRenderExtraFrameOnPause: 0
229 | appleDeveloperTeamID:
230 | iOSManualSigningProvisioningProfileID:
231 | tvOSManualSigningProvisioningProfileID:
232 | iOSManualSigningProvisioningProfileType: 0
233 | tvOSManualSigningProvisioningProfileType: 0
234 | appleEnableAutomaticSigning: 0
235 | iOSRequireARKit: 0
236 | appleEnableProMotion: 0
237 | vulkanEditorSupport: 0
238 | clonedFromGUID: 00000000000000000000000000000000
239 | templatePackageId:
240 | templateDefaultScene:
241 | AndroidTargetArchitectures: 5
242 | AndroidSplashScreenScale: 0
243 | androidSplashScreen: {fileID: 0}
244 | AndroidKeystoreName:
245 | AndroidKeyaliasName:
246 | AndroidBuildApkPerCpuArchitecture: 0
247 | AndroidTVCompatibility: 1
248 | AndroidIsGame: 1
249 | AndroidEnableTango: 0
250 | androidEnableBanner: 1
251 | androidUseLowAccuracyLocation: 0
252 | m_AndroidBanners:
253 | - width: 320
254 | height: 180
255 | banner: {fileID: 0}
256 | androidGamepadSupportLevel: 0
257 | resolutionDialogBanner: {fileID: 0}
258 | m_BuildTargetIcons: []
259 | m_BuildTargetPlatformIcons: []
260 | m_BuildTargetBatching: []
261 | m_BuildTargetGraphicsAPIs: []
262 | m_BuildTargetVRSettings: []
263 | m_BuildTargetEnableVuforiaSettings: []
264 | openGLRequireES31: 0
265 | openGLRequireES31AEP: 0
266 | m_TemplateCustomTags: {}
267 | mobileMTRendering:
268 | Android: 1
269 | iPhone: 1
270 | tvOS: 1
271 | m_BuildTargetGroupLightmapEncodingQuality:
272 | - m_BuildTarget: Standalone
273 | m_EncodingQuality: 1
274 | - m_BuildTarget: XboxOne
275 | m_EncodingQuality: 1
276 | - m_BuildTarget: PS4
277 | m_EncodingQuality: 1
278 | m_BuildTargetGroupLightmapSettings: []
279 | playModeTestRunnerEnabled: 0
280 | runPlayModeTestAsEditModeTest: 0
281 | actionOnDotNetUnhandledException: 1
282 | enableInternalProfiler: 0
283 | logObjCUncaughtExceptions: 1
284 | enableCrashReportAPI: 0
285 | cameraUsageDescription:
286 | locationUsageDescription:
287 | microphoneUsageDescription:
288 | switchNetLibKey:
289 | switchSocketMemoryPoolSize: 6144
290 | switchSocketAllocatorPoolSize: 128
291 | switchSocketConcurrencyLimit: 14
292 | switchScreenResolutionBehavior: 2
293 | switchUseCPUProfiler: 0
294 | switchApplicationID: 0x01004b9000490000
295 | switchNSODependencies:
296 | switchTitleNames_0:
297 | switchTitleNames_1:
298 | switchTitleNames_2:
299 | switchTitleNames_3:
300 | switchTitleNames_4:
301 | switchTitleNames_5:
302 | switchTitleNames_6:
303 | switchTitleNames_7:
304 | switchTitleNames_8:
305 | switchTitleNames_9:
306 | switchTitleNames_10:
307 | switchTitleNames_11:
308 | switchTitleNames_12:
309 | switchTitleNames_13:
310 | switchTitleNames_14:
311 | switchPublisherNames_0:
312 | switchPublisherNames_1:
313 | switchPublisherNames_2:
314 | switchPublisherNames_3:
315 | switchPublisherNames_4:
316 | switchPublisherNames_5:
317 | switchPublisherNames_6:
318 | switchPublisherNames_7:
319 | switchPublisherNames_8:
320 | switchPublisherNames_9:
321 | switchPublisherNames_10:
322 | switchPublisherNames_11:
323 | switchPublisherNames_12:
324 | switchPublisherNames_13:
325 | switchPublisherNames_14:
326 | switchIcons_0: {fileID: 0}
327 | switchIcons_1: {fileID: 0}
328 | switchIcons_2: {fileID: 0}
329 | switchIcons_3: {fileID: 0}
330 | switchIcons_4: {fileID: 0}
331 | switchIcons_5: {fileID: 0}
332 | switchIcons_6: {fileID: 0}
333 | switchIcons_7: {fileID: 0}
334 | switchIcons_8: {fileID: 0}
335 | switchIcons_9: {fileID: 0}
336 | switchIcons_10: {fileID: 0}
337 | switchIcons_11: {fileID: 0}
338 | switchIcons_12: {fileID: 0}
339 | switchIcons_13: {fileID: 0}
340 | switchIcons_14: {fileID: 0}
341 | switchSmallIcons_0: {fileID: 0}
342 | switchSmallIcons_1: {fileID: 0}
343 | switchSmallIcons_2: {fileID: 0}
344 | switchSmallIcons_3: {fileID: 0}
345 | switchSmallIcons_4: {fileID: 0}
346 | switchSmallIcons_5: {fileID: 0}
347 | switchSmallIcons_6: {fileID: 0}
348 | switchSmallIcons_7: {fileID: 0}
349 | switchSmallIcons_8: {fileID: 0}
350 | switchSmallIcons_9: {fileID: 0}
351 | switchSmallIcons_10: {fileID: 0}
352 | switchSmallIcons_11: {fileID: 0}
353 | switchSmallIcons_12: {fileID: 0}
354 | switchSmallIcons_13: {fileID: 0}
355 | switchSmallIcons_14: {fileID: 0}
356 | switchManualHTML:
357 | switchAccessibleURLs:
358 | switchLegalInformation:
359 | switchMainThreadStackSize: 1048576
360 | switchPresenceGroupId:
361 | switchLogoHandling: 0
362 | switchReleaseVersion: 0
363 | switchDisplayVersion: 1.0.0
364 | switchStartupUserAccount: 0
365 | switchTouchScreenUsage: 0
366 | switchSupportedLanguagesMask: 0
367 | switchLogoType: 0
368 | switchApplicationErrorCodeCategory:
369 | switchUserAccountSaveDataSize: 0
370 | switchUserAccountSaveDataJournalSize: 0
371 | switchApplicationAttribute: 0
372 | switchCardSpecSize: -1
373 | switchCardSpecClock: -1
374 | switchRatingsMask: 0
375 | switchRatingsInt_0: 0
376 | switchRatingsInt_1: 0
377 | switchRatingsInt_2: 0
378 | switchRatingsInt_3: 0
379 | switchRatingsInt_4: 0
380 | switchRatingsInt_5: 0
381 | switchRatingsInt_6: 0
382 | switchRatingsInt_7: 0
383 | switchRatingsInt_8: 0
384 | switchRatingsInt_9: 0
385 | switchRatingsInt_10: 0
386 | switchRatingsInt_11: 0
387 | switchLocalCommunicationIds_0:
388 | switchLocalCommunicationIds_1:
389 | switchLocalCommunicationIds_2:
390 | switchLocalCommunicationIds_3:
391 | switchLocalCommunicationIds_4:
392 | switchLocalCommunicationIds_5:
393 | switchLocalCommunicationIds_6:
394 | switchLocalCommunicationIds_7:
395 | switchParentalControl: 0
396 | switchAllowsScreenshot: 1
397 | switchAllowsVideoCapturing: 1
398 | switchAllowsRuntimeAddOnContentInstall: 0
399 | switchDataLossConfirmation: 0
400 | switchSupportedNpadStyles: 3
401 | switchNativeFsCacheSize: 32
402 | switchIsHoldTypeHorizontal: 0
403 | switchSupportedNpadCount: 8
404 | switchSocketConfigEnabled: 0
405 | switchTcpInitialSendBufferSize: 32
406 | switchTcpInitialReceiveBufferSize: 64
407 | switchTcpAutoSendBufferSizeMax: 256
408 | switchTcpAutoReceiveBufferSizeMax: 256
409 | switchUdpSendBufferSize: 9
410 | switchUdpReceiveBufferSize: 42
411 | switchSocketBufferEfficiency: 4
412 | switchSocketInitializeEnabled: 1
413 | switchNetworkInterfaceManagerInitializeEnabled: 1
414 | switchPlayerConnectionEnabled: 1
415 | ps4NPAgeRating: 12
416 | ps4NPTitleSecret:
417 | ps4NPTrophyPackPath:
418 | ps4ParentalLevel: 11
419 | ps4ContentID: ED1633-NPXX51362_00-0000000000000000
420 | ps4Category: 0
421 | ps4MasterVersion: 01.00
422 | ps4AppVersion: 01.00
423 | ps4AppType: 0
424 | ps4ParamSfxPath:
425 | ps4VideoOutPixelFormat: 0
426 | ps4VideoOutInitialWidth: 1920
427 | ps4VideoOutBaseModeInitialWidth: 1920
428 | ps4VideoOutReprojectionRate: 60
429 | ps4PronunciationXMLPath:
430 | ps4PronunciationSIGPath:
431 | ps4BackgroundImagePath:
432 | ps4StartupImagePath:
433 | ps4StartupImagesFolder:
434 | ps4IconImagesFolder:
435 | ps4SaveDataImagePath:
436 | ps4SdkOverride:
437 | ps4BGMPath:
438 | ps4ShareFilePath:
439 | ps4ShareOverlayImagePath:
440 | ps4PrivacyGuardImagePath:
441 | ps4NPtitleDatPath:
442 | ps4RemotePlayKeyAssignment: -1
443 | ps4RemotePlayKeyMappingDir:
444 | ps4PlayTogetherPlayerCount: 0
445 | ps4EnterButtonAssignment: 1
446 | ps4ApplicationParam1: 0
447 | ps4ApplicationParam2: 0
448 | ps4ApplicationParam3: 0
449 | ps4ApplicationParam4: 0
450 | ps4DownloadDataSize: 0
451 | ps4GarlicHeapSize: 2048
452 | ps4ProGarlicHeapSize: 2560
453 | ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ
454 | ps4pnSessions: 1
455 | ps4pnPresence: 1
456 | ps4pnFriends: 1
457 | ps4pnGameCustomData: 1
458 | playerPrefsSupport: 0
459 | enableApplicationExit: 0
460 | restrictedAudioUsageRights: 0
461 | ps4UseResolutionFallback: 0
462 | ps4ReprojectionSupport: 0
463 | ps4UseAudio3dBackend: 0
464 | ps4SocialScreenEnabled: 0
465 | ps4ScriptOptimizationLevel: 0
466 | ps4Audio3dVirtualSpeakerCount: 14
467 | ps4attribCpuUsage: 0
468 | ps4PatchPkgPath:
469 | ps4PatchLatestPkgPath:
470 | ps4PatchChangeinfoPath:
471 | ps4PatchDayOne: 0
472 | ps4attribUserManagement: 0
473 | ps4attribMoveSupport: 0
474 | ps4attrib3DSupport: 0
475 | ps4attribShareSupport: 0
476 | ps4attribExclusiveVR: 0
477 | ps4disableAutoHideSplash: 0
478 | ps4videoRecordingFeaturesUsed: 0
479 | ps4contentSearchFeaturesUsed: 0
480 | ps4attribEyeToEyeDistanceSettingVR: 0
481 | ps4IncludedModules: []
482 | monoEnv:
483 | psp2Splashimage: {fileID: 0}
484 | psp2NPTrophyPackPath:
485 | psp2NPSupportGBMorGJP: 0
486 | psp2NPAgeRating: 12
487 | psp2NPTitleDatPath:
488 | psp2NPCommsID:
489 | psp2NPCommunicationsID:
490 | psp2NPCommsPassphrase:
491 | psp2NPCommsSig:
492 | psp2ParamSfxPath:
493 | psp2ManualPath:
494 | psp2LiveAreaGatePath:
495 | psp2LiveAreaBackroundPath:
496 | psp2LiveAreaPath:
497 | psp2LiveAreaTrialPath:
498 | psp2PatchChangeInfoPath:
499 | psp2PatchOriginalPackage:
500 | psp2PackagePassword: F69AzBlax3CF3EDNhm3soLBPh71Yexui
501 | psp2KeystoneFile:
502 | psp2MemoryExpansionMode: 0
503 | psp2DRMType: 0
504 | psp2StorageType: 0
505 | psp2MediaCapacity: 0
506 | psp2DLCConfigPath:
507 | psp2ThumbnailPath:
508 | psp2BackgroundPath:
509 | psp2SoundPath:
510 | psp2TrophyCommId:
511 | psp2TrophyPackagePath:
512 | psp2PackagedResourcesPath:
513 | psp2SaveDataQuota: 10240
514 | psp2ParentalLevel: 1
515 | psp2ShortTitle: Not Set
516 | psp2ContentID: IV0000-ABCD12345_00-0123456789ABCDEF
517 | psp2Category: 0
518 | psp2MasterVersion: 01.00
519 | psp2AppVersion: 01.00
520 | psp2TVBootMode: 0
521 | psp2EnterButtonAssignment: 2
522 | psp2TVDisableEmu: 0
523 | psp2AllowTwitterDialog: 1
524 | psp2Upgradable: 0
525 | psp2HealthWarning: 0
526 | psp2UseLibLocation: 0
527 | psp2InfoBarOnStartup: 0
528 | psp2InfoBarColor: 0
529 | psp2ScriptOptimizationLevel: 0
530 | splashScreenBackgroundSourceLandscape: {fileID: 0}
531 | splashScreenBackgroundSourcePortrait: {fileID: 0}
532 | spritePackerPolicy:
533 | webGLMemorySize: 256
534 | webGLExceptionSupport: 1
535 | webGLNameFilesAsHashes: 0
536 | webGLDataCaching: 0
537 | webGLDebugSymbols: 0
538 | webGLEmscriptenArgs:
539 | webGLModulesDirectory:
540 | webGLTemplate: APPLICATION:Default
541 | webGLAnalyzeBuildSize: 0
542 | webGLUseEmbeddedResources: 0
543 | webGLCompressionFormat: 1
544 | webGLLinkerTarget: 1
545 | scriptingDefineSymbols: {}
546 | platformArchitecture: {}
547 | scriptingBackend:
548 | Standalone: 1
549 | il2cppCompilerConfiguration: {}
550 | incrementalIl2cppBuild: {}
551 | allowUnsafeCode: 0
552 | additionalIl2CppArgs:
553 | scriptingRuntimeVersion: 1
554 | apiCompatibilityLevelPerPlatform: {}
555 | m_RenderingPath: 1
556 | m_MobileRenderingPath: 1
557 | metroPackageName: GeneralSynthTest
558 | metroPackageVersion:
559 | metroCertificatePath:
560 | metroCertificatePassword:
561 | metroCertificateSubject:
562 | metroCertificateIssuer:
563 | metroCertificateNotAfter: 0000000000000000
564 | metroApplicationDescription: GeneralSynthTest
565 | wsaImages: {}
566 | metroTileShortName:
567 | metroTileShowName: 0
568 | metroMediumTileShowName: 0
569 | metroLargeTileShowName: 0
570 | metroWideTileShowName: 0
571 | metroDefaultTileSize: 1
572 | metroTileForegroundText: 2
573 | metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0}
574 | metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628,
575 | a: 1}
576 | metroSplashScreenUseBackgroundColor: 0
577 | platformCapabilities: {}
578 | metroFTAName:
579 | metroFTAFileTypes: []
580 | metroProtocolName:
581 | metroCompilationOverrides: 1
582 | n3dsUseExtSaveData: 0
583 | n3dsCompressStaticMem: 1
584 | n3dsExtSaveDataNumber: 0x12345
585 | n3dsStackSize: 131072
586 | n3dsTargetPlatform: 2
587 | n3dsRegion: 7
588 | n3dsMediaSize: 0
589 | n3dsLogoStyle: 3
590 | n3dsTitle: GameName
591 | n3dsProductCode:
592 | n3dsApplicationId: 0xFF3FF
593 | XboxOneProductId:
594 | XboxOneUpdateKey:
595 | XboxOneSandboxId:
596 | XboxOneContentId:
597 | XboxOneTitleId:
598 | XboxOneSCId:
599 | XboxOneGameOsOverridePath:
600 | XboxOnePackagingOverridePath:
601 | XboxOneAppManifestOverridePath:
602 | XboxOneVersion: 1.0.0.0
603 | XboxOnePackageEncryption: 0
604 | XboxOnePackageUpdateGranularity: 2
605 | XboxOneDescription:
606 | XboxOneLanguage:
607 | - enus
608 | XboxOneCapability: []
609 | XboxOneGameRating: {}
610 | XboxOneIsContentPackage: 0
611 | XboxOneEnableGPUVariability: 0
612 | XboxOneSockets: {}
613 | XboxOneSplashScreen: {fileID: 0}
614 | XboxOneAllowedProductIds: []
615 | XboxOnePersistentLocalStorageSize: 0
616 | XboxOneXTitleMemory: 8
617 | xboxOneScriptCompiler: 0
618 | vrEditorSettings:
619 | daydream:
620 | daydreamIconForeground: {fileID: 0}
621 | daydreamIconBackground: {fileID: 0}
622 | cloudServicesEnabled: {}
623 | facebookSdkVersion: 7.9.4
624 | apiCompatibilityLevel: 3
625 | cloudProjectId:
626 | projectName:
627 | organizationId:
628 | cloudEnabled: 0
629 | enableNativePlatformBackendsForNewInputSystem: 0
630 | disableOldInputManagerSupport: 0
631 |
--------------------------------------------------------------------------------
/MoogSynthUnity/ProjectSettings/ProjectVersion.txt:
--------------------------------------------------------------------------------
1 | m_EditorVersion: 2018.2.5f1
2 |
--------------------------------------------------------------------------------
/MoogSynthUnity/ProjectSettings/QualitySettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!47 &1
4 | QualitySettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 5
7 | m_CurrentQuality: 5
8 | m_QualitySettings:
9 | - serializedVersion: 2
10 | name: Very Low
11 | pixelLightCount: 0
12 | shadows: 0
13 | shadowResolution: 0
14 | shadowProjection: 1
15 | shadowCascades: 1
16 | shadowDistance: 15
17 | shadowNearPlaneOffset: 3
18 | shadowCascade2Split: 0.33333334
19 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
20 | shadowmaskMode: 0
21 | blendWeights: 1
22 | textureQuality: 1
23 | anisotropicTextures: 0
24 | antiAliasing: 0
25 | softParticles: 0
26 | softVegetation: 0
27 | realtimeReflectionProbes: 0
28 | billboardsFaceCameraPosition: 0
29 | vSyncCount: 0
30 | lodBias: 0.3
31 | maximumLODLevel: 0
32 | particleRaycastBudget: 4
33 | asyncUploadTimeSlice: 2
34 | asyncUploadBufferSize: 4
35 | resolutionScalingFixedDPIFactor: 1
36 | excludedTargetPlatforms: []
37 | - serializedVersion: 2
38 | name: Low
39 | pixelLightCount: 0
40 | shadows: 0
41 | shadowResolution: 0
42 | shadowProjection: 1
43 | shadowCascades: 1
44 | shadowDistance: 20
45 | shadowNearPlaneOffset: 3
46 | shadowCascade2Split: 0.33333334
47 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
48 | shadowmaskMode: 0
49 | blendWeights: 2
50 | textureQuality: 0
51 | anisotropicTextures: 0
52 | antiAliasing: 0
53 | softParticles: 0
54 | softVegetation: 0
55 | realtimeReflectionProbes: 0
56 | billboardsFaceCameraPosition: 0
57 | vSyncCount: 0
58 | lodBias: 0.4
59 | maximumLODLevel: 0
60 | particleRaycastBudget: 16
61 | asyncUploadTimeSlice: 2
62 | asyncUploadBufferSize: 4
63 | resolutionScalingFixedDPIFactor: 1
64 | excludedTargetPlatforms: []
65 | - serializedVersion: 2
66 | name: Medium
67 | pixelLightCount: 1
68 | shadows: 1
69 | shadowResolution: 0
70 | shadowProjection: 1
71 | shadowCascades: 1
72 | shadowDistance: 20
73 | shadowNearPlaneOffset: 3
74 | shadowCascade2Split: 0.33333334
75 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
76 | shadowmaskMode: 0
77 | blendWeights: 2
78 | textureQuality: 0
79 | anisotropicTextures: 1
80 | antiAliasing: 0
81 | softParticles: 0
82 | softVegetation: 0
83 | realtimeReflectionProbes: 0
84 | billboardsFaceCameraPosition: 0
85 | vSyncCount: 1
86 | lodBias: 0.7
87 | maximumLODLevel: 0
88 | particleRaycastBudget: 64
89 | asyncUploadTimeSlice: 2
90 | asyncUploadBufferSize: 4
91 | resolutionScalingFixedDPIFactor: 1
92 | excludedTargetPlatforms: []
93 | - serializedVersion: 2
94 | name: High
95 | pixelLightCount: 2
96 | shadows: 2
97 | shadowResolution: 1
98 | shadowProjection: 1
99 | shadowCascades: 2
100 | shadowDistance: 40
101 | shadowNearPlaneOffset: 3
102 | shadowCascade2Split: 0.33333334
103 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
104 | shadowmaskMode: 1
105 | blendWeights: 2
106 | textureQuality: 0
107 | anisotropicTextures: 1
108 | antiAliasing: 0
109 | softParticles: 0
110 | softVegetation: 1
111 | realtimeReflectionProbes: 1
112 | billboardsFaceCameraPosition: 1
113 | vSyncCount: 1
114 | lodBias: 1
115 | maximumLODLevel: 0
116 | particleRaycastBudget: 256
117 | asyncUploadTimeSlice: 2
118 | asyncUploadBufferSize: 4
119 | resolutionScalingFixedDPIFactor: 1
120 | excludedTargetPlatforms: []
121 | - serializedVersion: 2
122 | name: Very High
123 | pixelLightCount: 3
124 | shadows: 2
125 | shadowResolution: 2
126 | shadowProjection: 1
127 | shadowCascades: 2
128 | shadowDistance: 70
129 | shadowNearPlaneOffset: 3
130 | shadowCascade2Split: 0.33333334
131 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
132 | shadowmaskMode: 1
133 | blendWeights: 4
134 | textureQuality: 0
135 | anisotropicTextures: 2
136 | antiAliasing: 2
137 | softParticles: 1
138 | softVegetation: 1
139 | realtimeReflectionProbes: 1
140 | billboardsFaceCameraPosition: 1
141 | vSyncCount: 1
142 | lodBias: 1.5
143 | maximumLODLevel: 0
144 | particleRaycastBudget: 1024
145 | asyncUploadTimeSlice: 2
146 | asyncUploadBufferSize: 4
147 | resolutionScalingFixedDPIFactor: 1
148 | excludedTargetPlatforms: []
149 | - serializedVersion: 2
150 | name: Ultra
151 | pixelLightCount: 4
152 | shadows: 2
153 | shadowResolution: 2
154 | shadowProjection: 1
155 | shadowCascades: 4
156 | shadowDistance: 150
157 | shadowNearPlaneOffset: 3
158 | shadowCascade2Split: 0.33333334
159 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
160 | shadowmaskMode: 1
161 | blendWeights: 4
162 | textureQuality: 0
163 | anisotropicTextures: 2
164 | antiAliasing: 2
165 | softParticles: 1
166 | softVegetation: 1
167 | realtimeReflectionProbes: 1
168 | billboardsFaceCameraPosition: 1
169 | vSyncCount: 1
170 | lodBias: 2
171 | maximumLODLevel: 0
172 | particleRaycastBudget: 4096
173 | asyncUploadTimeSlice: 2
174 | asyncUploadBufferSize: 4
175 | resolutionScalingFixedDPIFactor: 1
176 | excludedTargetPlatforms: []
177 | m_PerPlatformDefaultQuality:
178 | Android: 2
179 | Nintendo 3DS: 5
180 | Nintendo Switch: 5
181 | PS4: 5
182 | PSM: 5
183 | PSP2: 2
184 | Samsung TV: 2
185 | Standalone: 5
186 | Tizen: 2
187 | WebGL: 3
188 | WiiU: 5
189 | Windows Store Apps: 5
190 | XboxOne: 5
191 | iPhone: 2
192 | tvOS: 2
193 |
--------------------------------------------------------------------------------
/MoogSynthUnity/ProjectSettings/TagManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!78 &1
4 | TagManager:
5 | serializedVersion: 2
6 | tags: []
7 | layers:
8 | - Default
9 | - TransparentFX
10 | - Ignore Raycast
11 | -
12 | - Water
13 | - UI
14 | -
15 | -
16 | -
17 | -
18 | -
19 | -
20 | -
21 | -
22 | -
23 | -
24 | -
25 | -
26 | -
27 | -
28 | -
29 | -
30 | -
31 | -
32 | -
33 | -
34 | -
35 | -
36 | -
37 | -
38 | -
39 | -
40 | m_SortingLayers:
41 | - name: Default
42 | uniqueID: 0
43 | locked: 0
44 |
--------------------------------------------------------------------------------
/MoogSynthUnity/ProjectSettings/TimeManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!5 &1
4 | TimeManager:
5 | m_ObjectHideFlags: 0
6 | Fixed Timestep: 0.02
7 | Maximum Allowed Timestep: 0.33333334
8 | m_TimeScale: 1
9 | Maximum Particle Timestep: 0.03
10 |
--------------------------------------------------------------------------------
/MoogSynthUnity/ProjectSettings/UnityConnectSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!310 &1
4 | UnityConnectSettings:
5 | m_ObjectHideFlags: 0
6 | m_Enabled: 0
7 | m_TestMode: 0
8 | m_TestEventUrl:
9 | m_TestConfigUrl:
10 | m_TestInitMode: 0
11 | CrashReportingSettings:
12 | m_EventUrl: https://perf-events.cloud.unity3d.com/api/events/crashes
13 | m_NativeEventUrl: https://perf-events.cloud.unity3d.com/symbolicate
14 | m_Enabled: 0
15 | m_CaptureEditorExceptions: 1
16 | UnityPurchasingSettings:
17 | m_Enabled: 0
18 | m_TestMode: 0
19 | UnityAnalyticsSettings:
20 | m_Enabled: 0
21 | m_InitializeOnStartup: 1
22 | m_TestMode: 0
23 | m_TestEventUrl:
24 | m_TestConfigUrl:
25 | UnityAdsSettings:
26 | m_Enabled: 0
27 | m_InitializeOnStartup: 1
28 | m_TestMode: 0
29 | m_IosGameId:
30 | m_AndroidGameId:
31 | m_GameIds: {}
32 | m_GameId:
33 | PerformanceReportingSettings:
34 | m_Enabled: 0
35 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # MoogSynth
2 |
3 | 
4 |
5 | This is an example of a real-time Unity synthesizer with a Moog filter simulation.
6 |
7 | It has a monophonic pulse-width modulated square wave and a saw wave (using polyBLEP for band-limiting), with a sub sine wave (one octave lower), and a resonant Moog-simulation filter based on the Huovilainen model. The filter frequency is controlled by a simple ramp envelope, and the amplitude is controlled by an ADSR envelope.
8 |
9 | The synthesizer is controlled using a thread safe event queue, and note events can be sent from normal Unity MonoBehaviours.
10 | Note events can be note on and off, have a pitch, and a time stamp, which is measured in samples.
11 |
12 | `Sequencer.cs` is a step sequencer component that demonstrates how to implement sequencing and how to convert BPM to sample ticks.
13 |
14 | # Sample-accurate Sequencing
15 |
16 | Here is an example of how to compute time stamps corresponding to a given tempo (in BPM):
17 |
18 | MoogSynth synth;
19 | const Int64 bufferTime = 2048; // experiment to find the lowest value that works on everything (in samples)
20 | float tempo_bpm = 120;
21 | Int64 tempo_smpPerNote;
22 | Int64 nextNoteTime; // (in samples)
23 |
24 | void Start()
25 | {
26 | tempo_smpPerNote = (Int64)(60 * AudioSettings.outputSampleRate / tempo_bpm);
27 |
28 | // First note is played at a reasonable point in the near future
29 | nextNoteTime = synth.GetTime_smp() + buffertime; // as soon as possible
30 | }
31 |
32 | void Update()
33 | {
34 | Int64 time = synth.GetTime_smp();
35 |
36 | // Time to queue a new note?
37 | while(time + bufferTime >= nextNoteTime)
38 | {
39 | int pitch = UnityEngine.Random.Range(30,90);
40 | synth.queue_event(EventQueue.EventType.Note_on, pitch, nextNoteTime);
41 |
42 | // From here on, all notes are sample accurate in relation to the first note
43 | noteOnTime += tempo_smpPerNote;
44 | }
45 | }
46 |
47 |
48 |
--------------------------------------------------------------------------------
/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/schmid/Unity-Moog-Synth/8df762d904985764072ec0e447294f2bf39bd6fd/screenshot.png
--------------------------------------------------------------------------------