2014-06-12 34 views
2

我對聲音鍛造中的腳本完全陌生。我有要求混合2 .wav文件。聲音鍛造中的腳本

例如,1.wav文件與反轉 2.wav文件混合。 我需要得到最終的混合輸出文件的統計數據。

統計如最小採樣值,所有通道的最大采樣值。

下面我有代碼混合2 .wav文件。但第二個不是倒置的。

任何人都可以請幫我在C#上面的腳本嗎? 或者如果任何人都可以與標準API共享一個可用於聲音僞造腳本的文檔,這也會有所幫助。

using System; 
using System.IO; 
using System.Windows.Forms; 
using System.Collections.Generic; 
using SoundForge; 


public class EntryPoint 
{ 
public void Begin(IScriptableApp app) 
{ 
//choose the first file. 
OpenFileDialog openFile = new OpenFileDialog(); 

     openFile.Title = "Open the input file."; 

     String inputFilePath = String.Empty; 

     if (openFile.ShowDialog() == DialogResult.OK) 
     { 
      inputFilePath = openFile.FileName.ToString(); 
     } 


     OpenFileDialog openOutputFile = new OpenFileDialog(); 

     openOutputFile.Title = "Open the output file."; 

     String outputFilePath = String.Empty; 

    if (openOutputFile.ShowDialog() == DialogResult.OK) 
    { 
     outputFilePath = openOutputFile.FileName.ToString(); 
    } 

    ISfFileHost backFile = app.OpenFile(outputFilePath, true, false); 
    ISfFileHost file = app.OpenFile(inputFilePath, false, false); 

    long fileLen = file.Length; 
    SfAudioSelection asel = new SfAudioSelection(file); 
    file.DoMixReplace(SfAudioSelection.All, 1, 1, backFile, new SfAudioSelection(0, file.Length), null, null, EffectOptions.EffectOnly | EffectOptions.WaitForDoneOrCancel); 


backFile.Close(CloseOptions.DiscardChanges); 

} 

public void FromSoundForge(IScriptableApp app) 
{ 
    ForgeApp = app; //execution begins here 
    app.SetStatusText(String.Format("Script '{0}' is running.", Script.Name)); 
    Begin(app); 
    app.SetStatusText(String.Format("Script '{0}' is done.", Script.Name)); 
} 
public static IScriptableApp ForgeApp = null; 
public static void DPF(string sz) { ForgeApp.OutputText(sz); } 
public static void DPF(string fmt, params object[] args) { 
    ForgeApp.OutputText(String.Format(fmt, args)); } 
} //EntryPoint 

回答

1

使用下面的代碼可以達到要求。

要求是: 1.wav文件與INVERTED 2.wav文件混合使用。獲取生成的混合輸出文件的統計信息。

統計如最小採樣值,所有通道的最大采樣值。

using System; 
using System.IO; 
using System.Windows.Forms; 
using System.Collections.Generic; 
using SoundForge; 

public class EntryPoint 
{ 
    public void Begin(IScriptableApp app) 
    { 

    string strOutFile = GETARG("outfile", "path to save file at"); 

    if ("" == strOutFile) 
    { 
     MessageBox.Show("invald output path"); 
     return; 
    } 

    OpenFileDialog openFile = new OpenFileDialog(); 

    openFile.Title = "Open the input file."; 

    ////string to hold the path of input file. 
    String strFile1 = String.Empty; 

    if (openFile.ShowDialog() == DialogResult.OK) 
    { 
     strFile1 = openFile.FileName.ToString(); 
    } 


    OpenFileDialog openOutputFile = new OpenFileDialog(); 

    openOutputFile.Title = "Open the output file."; 

    ////string to hold the path of output file. 
    String strFile2 = String.Empty; 

    if (openOutputFile.ShowDialog() == DialogResult.OK) 
    { 
     strFile2 = openOutputFile.FileName.ToString(); 
    } 

    ISfFileHost fhOne = app.OpenFile(strFile1, true, true); 
    if (null == fhOne) 
     return; 

    ISfFileHost fhTwo = app.OpenFile(strFile2, true, true); 
    if (null == fhTwo) 
    { 
     fhOne.Close(CloseOptions.DiscardChanges); 
     return; 
    } 

    ISfFileHost fhOut = app.NewFile(fhOne.DataFormat, false); 

    fhOut.ReplaceAudio(new SfAudioSelection(0, 0), fhOne, new SfAudioSelection(fhOne)); 
    fhOut.DoEffect("Invert/Flip", 0, new SfAudioSelection(fhOut), EffectOptions.EffectOnly); 
    fhOut.WaitForDoneOrCancel(); 

    fhOut.MixAudio(new SfAudioSelection(fhOut), 1.0, 1.0, fhTwo, new SfAudioSelection(fhTwo)); 
    fhOut.WaitForDoneOrCancel(); 

    fhOut.SaveAs(strOutFile, fhOne.SaveFormat.Guid, "Default Template", RenderOptions.RenderOnly); 
    fhOut.WaitForDoneOrCancel(); 

    fhOne.Close(CloseOptions.DiscardChanges); 
    fhTwo.Close(CloseOptions.DiscardChanges); 


    SfAudioStatistics[] stat = new SfAudioStatistics[fhOut.Channels]; 
    fhOut.UpdateStatistics(SfAudioSelection.All); 
    stat[0] = fhOut.GetStatistics(0); 
    stat[1] = fhOut.GetStatistics(1); 
    stat[2] = fhOut.GetStatistics(2); 
    stat[3] = fhOut.GetStatistics(3); 
    stat[4] = fhOut.GetStatistics(4); 
    stat[5] = fhOut.GetStatistics(5); 
    stat[6] = fhOut.GetStatistics(6); 
    stat[7] = fhOut.GetStatistics(7); 

    MessageBox.Show(String.Format("Max Sample Value Channel 1 - {0},Channel 2 - {1},Channel 3 - {2},Channel 4 - {3},Channel 5 - {4},Channel 6 - {5},Channel 7 - {6},Channel 8 - {7}", stat[0].MaxValue, stat[1].MaxValue, stat[2].MaxValue, stat[3].MaxValue, stat[4].MaxValue, stat[5].MaxValue, stat[6].MaxValue, stat[7].MaxValue)); 
    MessageBox.Show(String.Format("Min Sample Value Channel 1 - {0},Channel 2 - {1},Channel 3 - {2},Channel 4 - {3},Channel 5 - {4},Channel 6 - {5}, Channel 7 - {6}, Channel 8 - {7}", stat[0].MinValue, stat[1].MinValue, stat[2].MinValue, stat[3].MinValue, stat[4].MaxValue, stat[5].MinValue, stat[6].MinValue, stat[7].MinValue)); 

    System.Diagnostics.Process curr = System.Diagnostics.Process.GetCurrentProcess(); 
} 

public void FromSoundForge(IScriptableApp app) 
{ 
    ForgeApp = app; //execution begins here 
    app.SetStatusText(String.Format("Script '{0}' is running.", Script.Name)); 
    Begin(app); 
    app.SetStatusText(String.Format("Script '{0}' is done.", Script.Name)); 
} 
public static IScriptableApp ForgeApp = null; 
public static void DPF(string sz) { ForgeApp.OutputText(sz); } 
public static void DPF(string fmt, object o) { ForgeApp.OutputText(String.Format(fmt, o)); } 
public static void DPF(string fmt, object o, object o2) { ForgeApp.OutputText(String.Format(fmt, o, o2)); } 
public static void DPF(string fmt, object o, object o2, object o3) { ForgeApp.OutputText(String.Format(fmt, o, o2, o3)); } 
public static string GETARG(string k, string d) { string val = Script.Args.ValueOf(k); if (val == null || val.Length == 0) val = d; return val; } 
public static int GETARG(string k, int d) { string s = Script.Args.ValueOf(k); if (s == null || s.Length == 0) return d; else return Script.Args.AsInt(k); } 
public static bool GETARG(string k, bool d) { string s = Script.Args.ValueOf(k); if (s == null || s.Length == 0) return d; else return Script.Args.AsBool(k); } 
} //EntryPoint 
+0

如果有人知道如何修改上述腳本以顯示最小採樣值等統計信息,那麼所有通道的最大采樣值將會有所幫助。 – mario