4

有没有什么方法可以在mp3没有扬声器的情况下使用Console.Beep

4

3 回答 3

3

那是不可能的。音乐由不同音量的许多频率组成,所有频率混合在一起形成复杂的波形。随时间变化非常快的混合。

Console.Beep() 只产生一种频率,无法控制音量。随着时间的推移改变频率的能力也受到严格限制,过渡并不平滑。它永远不会听起来像哔哔声。

播放 MP3 需要能够将数字信号转换为驱动扬声器的模拟信号的设备。今天在任何机器上都可以使用,集成在主板中。今天也用于产生 Console.Beep() 声音,现代机器不再有扬声器。

于 2013-11-06T09:53:42.317 回答
1

我试图做一些类似的事情,即给定一个 mp3 文件,我试图生成 Console.Beep 命令来表示音频信号的近似值。Goertzel 算法是查找样本频率的良好开端,并且可以使用传递给算法的样本量轻松计算持续时间。

我发现这种方法非常适用于均匀和连续的音频信号,但是如果你想转换像歌曲这样更复杂的东西,它会丢弃主要特征,为你提供给定样本的总体频率的粗略近似值反过来使其无法识别您的输入。

这是我使用的算法的代码:

private static double GoertzelAmplitude(IReadOnlyList<float> samples, double freq, int sampleRate)
{
    var tmp1 = 0.0;
    var tmp2 = 0.0;

    var normalizedfreq = freq / sampleRate;

    var coeff = 2 * Math.Cos(2 * Math.PI * normalizedfreq);

    for (var i = 0; i < samples.Count; i++)
    {
        var newTerm = samples[i] + coeff * tmp1 - tmp2;
        tmp2 = tmp1;
        tmp1 = newTerm;
    }

    var power = tmp2 * tmp2 + tmp1 * tmp1 - coeff * tmp1 * tmp2;

    return power;
}
于 2017-08-17T23:56:50.413 回答
0

http://msdn.microsoft.com/en-us/library/4fe3hdb1(v=vs.110).aspx解释了如何使用 Beep(Int32, Int32) 方法来播放歌曲的前几个音符。

但是,这有两个大问题:console.beep 在 64 位 Windows 7 和 Windows XP 上不受支持,并且在任何 ME 或更低版本上都不会出现 2 个 Int32 参数的过载。

如果你想这样做,你的歌曲有两个选项:第一个是硬编码你的歌曲。如果您希望歌曲可以互换,您可以使用 Intelliscore ( http://www.intelliscore.net/ ) 之类的 MP3 解析器将歌曲读入 .MID 文件,然后再次读取该 .MID 文件。

于 2013-11-06T08:43:31.797 回答