├── 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 | ![screenshot](https://github.com/schmid/MoogSynth/blob/master/screenshot.png "Screenshot") 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 --------------------------------------------------------------------------------