private void InitSoundTouch() { // 初始化 soundTouch _soundTouch = new SoundTouchApi(); _soundTouch.CreateInstance(); _soundTouch.SetSampleRate(_waveChannel.WaveFormat.SampleRate); _soundTouch.SetChannels(_waveChannel.WaveFormat.Channels); _soundTouch.SetTempoChange(0f); _soundTouch.SetPitchSemiTones(0f); _soundTouch.SetRateChange(0f); _soundTouch.SetTempo(TempoValue); TimeStretchProfile = new TimeStretchProfile { AAFilterLength = 128, Description = "demo1", Id = "demo", Overlap = 20, SeekWindow = 80, Sequence = 20, UseAAFilter = true }; _soundTouch.SetSetting(SoundTouchApi.SoundTouchSettings.SETTING_USE_AA_FILTER, TimeStretchProfile.UseAAFilter ? 1 : 0); _soundTouch.SetSetting(SoundTouchApi.SoundTouchSettings.SETTING_AA_FILTER_LENGTH, TimeStretchProfile.AAFilterLength); _soundTouch.SetSetting(SoundTouchApi.SoundTouchSettings.SETTING_OVERLAP_MS, TimeStretchProfile.Overlap); _soundTouch.SetSetting(SoundTouchApi.SoundTouchSettings.SETTING_SEQUENCE_MS, TimeStretchProfile.Sequence); _soundTouch.SetSetting(SoundTouchApi.SoundTouchSettings.SETTING_SEEKWINDOW_MS, TimeStretchProfile.SeekWindow); _soundTouch.SetSetting(SoundTouchApi.SoundTouchSettings.SETTING_SEQUENCE_MS, 0); }
private void InitTimeStretchProfile() { TimeStretchProfile = new TimeStretchProfile(); TimeStretchProfile.AAFilterLength = 128; TimeStretchProfile.Description = "Optimum for Music and Speech"; TimeStretchProfile.Id = "Practice#_Optimum"; TimeStretchProfile.Overlap = 20; TimeStretchProfile.SeekWindow = 80; TimeStretchProfile.Sequence = 20; TimeStretchProfile.UseAAFilter = true; soundTouch.SetSetting(SoundTouchAPI.SoundTouchSettings.SETTING_USE_AA_FILTER, timeStretchProfile.UseAAFilter ? 1 : 0); soundTouch.SetSetting(SoundTouchAPI.SoundTouchSettings.SETTING_AA_FILTER_LENGTH, timeStretchProfile.AAFilterLength); soundTouch.SetSetting(SoundTouchAPI.SoundTouchSettings.SETTING_OVERLAP_MS, timeStretchProfile.Overlap); soundTouch.SetSetting(SoundTouchAPI.SoundTouchSettings.SETTING_SEQUENCE_MS, timeStretchProfile.Sequence); soundTouch.SetSetting(SoundTouchAPI.SoundTouchSettings.SETTING_SEEKWINDOW_MS, timeStretchProfile.SeekWindow); }
/// <summary> /// Loads the presets from the preset bank file /// </summary> /// <returns> /// The active preset Id /// </returns> public string LoadPresetsBank(Dictionary <string, PresetControl> presetControls) { if (!File.Exists(m_presetsBankFilename)) { return(null); } try { // Loads the presets bank XML file XmlDocument doc = new XmlDocument(); doc.Load(m_presetsBankFilename); XmlElement root = doc.DocumentElement; XmlNode presetsBankNode = root.SelectSingleNode("/" + PresetBankFile.XML_Node_Root + "/" + PresetBankFile.XML_Node_PresetsBank); string activePresetId = presetsBankNode.Attributes[PresetBankFile.XML_Attr_ActivePreset].Value; XmlNodeList presetNodes = presetsBankNode.SelectNodes(PresetBankFile.XML_Node_Preset); // Load all preset nodes foreach (XmlNode presetNode in presetNodes) { string presetId = presetNode.Attributes[PresetBankFile.XML_Attr_Id].Value; // Load XML values into PresetData object PresetData presetData = presetControls[presetId].PresetData; presetData.Tempo = ReadXMLAttributeFloat(presetNode, PresetBankFile.XML_Attr_Tempo, PresetData.DefaultTempo); presetData.Pitch = ReadXMLAttributeFloat(presetNode, PresetBankFile.XML_Attr_Pitch, PresetData.DefaultPitch); presetData.Volume = ReadXMLAttributeFloat(presetNode, PresetBankFile.XML_Attr_Volume, Properties.Settings.Default.DefaultVolume); presetData.LoEqValue = ReadXMLAttributeFloat(presetNode, PresetBankFile.XML_Attr_LoEq, PresetData.DefaultLoEq); presetData.MedEqValue = ReadXMLAttributeFloat(presetNode, PresetBankFile.XML_Attr_MedEq, PresetData.DefaultMedEq); presetData.HiEqValue = ReadXMLAttributeFloat(presetNode, PresetBankFile.XML_Attr_HiEq, PresetData.DefaultHiEq); presetData.CurrentPlayTime = TimeSpan.Parse(presetNode.Attributes[PresetBankFile.XML_Attr_PlayTime].Value); presetData.StartMarker = TimeSpan.Parse(presetNode.Attributes[PresetBankFile.XML_Attr_LoopStartMarker].Value); presetData.EndMarker = TimeSpan.Parse(presetNode.Attributes[PresetBankFile.XML_Attr_LoopEndMarker].Value); presetData.Loop = Convert.ToBoolean(presetNode.Attributes[PresetBankFile.XML_Attr_IsLoop].Value); presetData.Cue = TimeSpan.Parse(presetNode.Attributes[PresetBankFile.XML_Attr_Cue].Value); presetData.Description = Convert.ToString(presetNode.Attributes[PresetBankFile.XML_Attr_Description].Value); TimeStretchProfile timeStretchProfile = TimeStretchProfileManager.DefaultProfile; if (presetNode.Attributes[PresetBankFile.XML_Attr_TimeStretchProfileId] != null) { string timeStretchProfileId = Convert.ToString(presetNode.Attributes[PresetBankFile.XML_Attr_TimeStretchProfileId].Value); if (!TimeStretchProfileManager.TimeStretchProfiles.TryGetValue(timeStretchProfileId, out timeStretchProfile)) { // Handle a mismatched profile by using the default profile timeStretchProfile = TimeStretchProfileManager.DefaultProfile; } } presetData.TimeStretchProfile = timeStretchProfile; if (presetNode.Attributes[PresetBankFile.XML_Attr_RemoveVocals] != null) { presetData.RemoveVocals = Convert.ToBoolean(presetNode.Attributes[PresetBankFile.XML_Attr_RemoveVocals].Value); } PresetControl presetControl = presetControls[presetId]; presetControl.PresetDescription = presetData.Description; } return(activePresetId); } catch (Exception ex) { m_logger.ErrorException("Failed loading Presets Bank for file: " + m_currentAudioFilename, ex); MessageBox.Show(null, "Failed loading Presets Bank for file: " + m_currentAudioFilename, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } return(null); }