/// <summary> /// Splits the audio track into two separate tracks (the intro and the loop) and caches them. /// This MUST be called before the overall track can be played. /// </summary> public void CreateAndCacheClips() { try { // Sometimes the designer might want to adjust the loop points themselves. That's fine, too. // If they uncheck the Compensate for Frequency box, we'll just do everything as normal. float frequencyRatio = CompensateForFrequency ? FrequencyRatio : 1f; float[] clipData = new float[Track.samples * Channels]; int loopStartSampleCount = Convert.ToInt32(Math.Max(0, LoopStart) * Channels * frequencyRatio); int loopLengthSampleCount = Convert.ToInt32( Math.Min(Track.samples - 1, Math.Max(1, LoopLength)) * frequencyRatio ); int introLength = Convert.ToInt32(Math.Max(1, LoopStart) * frequencyRatio); Track.GetData(clipData, 0); IntroClip = AudioClip.Create( Name + " intro", introLength, Channels, Frequency, false); IntroClip.SetData(EnsoHelpers.Slice(clipData, 0, introLength * Channels), 0); LoopClip = AudioClip.Create( Name + " loop", loopLengthSampleCount, Channels, Frequency, false); int maxSafeLoopLength = clipData.Length - loopStartSampleCount; LoopClip.SetData(EnsoHelpers.Slice(clipData, loopStartSampleCount, Math.Min(loopLengthSampleCount * Channels, maxSafeLoopLength)), 0); } catch (Exception e) { Debug.LogError(string.Format(@"[Enso] An exception occurred when creating and caching the ""{0}"" music clip: {1}", Track.name, e.Message)); throw e; } }