c# - 在 Sound forge 中编写脚本

标签 c# audio

我对在 Sound Forge 中编写脚本完全陌生。我需要混合 2 个 .wav 文件。

例如,1.wav 文件与INVERTED 2.wav 文件混合。 我需要获取生成的混合输出文件的统计信息。

统计所有 channel 的最小样本值、最大样本值。

下面我有混合 2 个 .wav 文件的代码。但是 2 没有反转。

任何人都可以帮我用 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.wav 文件与 INVERTED 2.wav 文件混合。获取生成的混合输出文件的统计信息。

统计所有 channel 的最小样本值、最大样本值。

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

关于c# - 在 Sound forge 中编写脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24177232/

相关文章:

c# - 将 kendo ui 网格中的列默认值设置为 DateTime.Now

c# - 如何通过魔数(Magic Number)检测查看 WMA 和 WMV 文件之间的差异?

c# - 无法使用 jQuery ajax 调用页面方法

javascript - 如何为 <audio> 标签设置特定的起始音量

c - 在 Linux 中用 C 语言获取主音量

java - 为什么我的程序的声音在 Eclipse 中可以工作,但在 jar 中生成时却不能

c# - JSON.Net DeserializeObject 文本编码

c# - 简单更新工具

iphone - iOS:具有暂停、前进功能的流式音频文件

java - 如何使用 Sphinx 从音频中获取单词结果