コード例 #1
0
        static public bool Shift(byte[] waveData, float pitchShiftCoeff)
        {
            // pitchShiftCoeff: 0.5f - 2f
            // 0.5f - на одну октаву ниже
            // 2f - на одну октаву выше

            WavePCMParser.WaveInfo waveInfo;

            if (!WavePCMParser.GetWaveInfo(waveData, out waveInfo))
            {
                return(false);
            }

            // преобразования только для 16 бит
            if (waveInfo.bytesPerSample != 2)
            {
                return(false);
            }

            float[][] channelsData = ConvertWaveDataToFloatArrays(waveData, ref waveInfo);

            foreach (var channelData in channelsData)
            {
                PitchShifter.PitchShift(pitchShiftCoeff, waveInfo.samplesCount, 1024, 10, waveInfo.sampleRate, channelData);
            }

            ConvertFloatArraysToWaveData(waveData, ref waveInfo, channelsData);

            return(true);
        }
コード例 #2
0
        //+makeLower(): returns a string for a lower pitch version of the file
        public String makeLower(String file, String newFile, float pitchShift)
        {
            // Read header, data and channels as separated data

            // Normalized data stores. Store values in the format -1.0 to 1.0
            byte[] waveheader = null;
            byte[] wavedata   = null;

            int sampleRate = 0;

            float[] in_data_l = null;
            float[] in_data_r = null;

            GetWaveData(file, out waveheader, out wavedata, out sampleRate, out in_data_l, out in_data_r);

            //
            // Apply Pitch Shifting
            //

            if (in_data_l != null)
            {
                PitchShifter.PitchShift(pitchShift, in_data_l.Length, (long)1024, (long)10, sampleRate, in_data_l);
            }

            if (in_data_r != null)
            {
                PitchShifter.PitchShift(pitchShift, in_data_r.Length, (long)1024, (long)10, sampleRate, in_data_r);
            }

            //
            // Time to save the processed data
            //

            // Backup wave data
            byte[] copydata = new byte[wavedata.Length];
            Array.Copy(wavedata, copydata, wavedata.Length);

            GetWaveData(in_data_l, in_data_r, ref wavedata);

            // Save modified wavedata

            string targetFilePath = newFile;

            if (File.Exists(targetFilePath))
            {
                File.Delete(targetFilePath);
            }

            using (BinaryWriter writer = new BinaryWriter(File.OpenWrite(targetFilePath)))
            {
                writer.Write(waveheader);
                writer.Write(wavedata);
            }

            return(newFile);
        }
コード例 #3
0
        /// <summary>
        /// Bake a new AudioClip from the original source with the given parameters
        /// </summary>
        /// <returns>The new AudioClip baked with the given parameters</returns>
        public AudioClip Bake()
        {
            // Create a new AudioClip
            AudioClip ajusted = AudioClip.Create("Footstep", source.samples, source.channels, source.frequency, false);

            // Read the samples from the source clip
            float[] samples = new float[source.samples];
            source.GetData(samples, 0);

            // Pitch the samples acording to the given pitch
            Profiler.BeginSample("Bake single AudioClip");
            PitchShifter.PitchShift(pitch, samples.Length, 32, 32, ajusted.frequency, samples);
            Profiler.EndSample();

            // Normalize the audio
            AudioNormalizer.Normalize(samples);

            // Write the ajusted samples to the new AudioClip
            ajusted.SetData(samples, 0);

            return(ajusted);
        }