在.NET(C#或VB.NET)中生成摩尔斯电码(或任何音频),无需第三方依赖,也无需使用音频文件

在.NET(C#或VB.NET)中生成摩尔斯电码(或任何音频),无需第三方依赖,也无需使用音频文件,c#,.net,vb.net,winforms,audio,C#,.net,Vb.net,Winforms,Audio,那么,在.NET(WinForms)中播放简单生成的摩尔斯电码的最佳方式是什么,而不需要任何外部文件,也不需要任何第三方库?我只想使用CLR,没有不必要的依赖项。欢迎使用C#或VB.NET代码。我会说多种语言;P (我真的不在乎产生什么音频。一个简单的单频音调就可以了。)使用 使用 使用 使用 有很多方法可以实现你想要的 我想对你来说最简单的方法就是演奏一些MIDI音符 见本文: NAudio库是开源的,如果你对额外的DLL不满意,你可以复制粘贴相关类到你的项目中。有很多方法可以实现你想要的 我

那么,在.NET(WinForms)中播放简单生成的摩尔斯电码的最佳方式是什么,而不需要任何外部文件,也不需要任何第三方库?我只想使用CLR,没有不必要的依赖项。欢迎使用C#或VB.NET代码。我会说多种语言;P

(我真的不在乎产生什么音频。一个简单的单频音调就可以了。)

使用

使用

使用

使用


有很多方法可以实现你想要的

我想对你来说最简单的方法就是演奏一些MIDI音符

见本文:


NAudio库是开源的,如果你对额外的DLL不满意,你可以复制粘贴相关类到你的项目中。

有很多方法可以实现你想要的

我想对你来说最简单的方法就是演奏一些MIDI音符

见本文:


NAudio库是开源的,如果你对额外的DLL不满意,你可以复制粘贴相关类到你的项目中。

有很多方法可以实现你想要的

我想对你来说最简单的方法就是演奏一些MIDI音符

见本文:


NAudio库是开源的,如果你对额外的DLL不满意,你可以复制粘贴相关类到你的项目中。

有很多方法可以实现你想要的

我想对你来说最简单的方法就是演奏一些MIDI音符

见本文:


NAudio library是开源的,如果你真的对额外的DLL不满意,你可以将相关类复制粘贴到你的项目中。

我在其他网站上找到了一半的在线帮助,大约一半是我自己找到的。对于我所需要的,这里有一个近乎理想的解决方案: 1:创建一个MemoryStream, 2:将WAV文件的字节写入MemoryStream(永远不会保存到磁盘,但会像从WAV文件播放一样播放), 3:查找到MemoryStream的开头, 4:使用
System.Media.SoundPlayer(MemoryStream.Play()
播放MemoryStream。 就这样。其中最困难的部分是创建WAV格式的字节流。。。除非你只是从像我这样的人那里复制代码P 下面是一个.NET方法,它将在没有外部DLL或任何.NET外部内容的情况下播放声音:

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

public static void PlayBeep(UInt16 frequency, int msDuration, UInt16 volume = 16383)
{
    var mStrm = new MemoryStream();
    BinaryWriter writer = new BinaryWriter(mStrm);

    const double TAU = 2 * Math.PI;
    int formatChunkSize = 16;
    int headerSize = 8;
    short formatType = 1;
    short tracks = 1;
    int samplesPerSecond = 44100;
    short bitsPerSample = 16;
    short frameSize = (short)(tracks * ((bitsPerSample + 7) / 8));
    int bytesPerSecond = samplesPerSecond * frameSize;
    int waveSize = 4;
    int samples = (int)((decimal)samplesPerSecond * msDuration / 1000);
    int dataChunkSize = samples * frameSize;
    int fileSize = waveSize + headerSize + formatChunkSize + headerSize + dataChunkSize;
    // var encoding = new System.Text.UTF8Encoding();
    writer.Write(0x46464952); // = encoding.GetBytes("RIFF")
    writer.Write(fileSize);
    writer.Write(0x45564157); // = encoding.GetBytes("WAVE")
    writer.Write(0x20746D66); // = encoding.GetBytes("fmt ")
    writer.Write(formatChunkSize);
    writer.Write(formatType);
    writer.Write(tracks);
    writer.Write(samplesPerSecond);
    writer.Write(bytesPerSecond);
    writer.Write(frameSize);
    writer.Write(bitsPerSample);
    writer.Write(0x61746164); // = encoding.GetBytes("data")
    writer.Write(dataChunkSize);
    {
        double theta = frequency * TAU / (double)samplesPerSecond;
        // 'volume' is UInt16 with range 0 thru Uint16.MaxValue ( = 65 535)
        // we need 'amp' to have the range of 0 thru Int16.MaxValue ( = 32 767)
        double amp = volume >> 2; // so we simply set amp = volume / 2
        for (int step = 0; step < samples; step++)
        {
            short s = (short)(amp * Math.Sin(theta * (double)step));
            writer.Write(s);
        }
    }

    mStrm.Seek(0, SeekOrigin.Begin);
    new System.Media.SoundPlayer(mStrm).Play();
    writer.Close();
    mStrm.Close();
} // public static void PlayBeep(UInt16 frequency, int msDuration, UInt16 volume = 16383)
使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Linq;
使用System.Windows.Forms;
公共静态无效播放蜂鸣音(UInt16频率,完整时间,UInt16音量=16383)
{
var mStrm=新内存流();
BinaryWriter=新的BinaryWriter(mStrm);
常数double TAU=2*Math.PI;
int formatChunkSize=16;
int headerSize=8;
短格式类型=1;
短轨道=1;
int samplesPerSecond=44100;
短位样本=16;
短帧大小=(短)(轨迹*((比特采样+7)/8));
int bytesPerSecond=samplesPerSecond*帧大小;
int waveSize=4;
int样本=(int)((十进制)样本数秒*msDuration/1000);
int dataChunkSize=samples*frameSize;
int fileSize=waveSize+headerSize+formatChunkSize+headerSize+dataChunkSize;
//var encoding=new System.Text.UTF8Encoding();
Write.Write(0x46464952);/=encoding.GetBytes(“RIFF”)
writer.Write(文件大小);
Write.Write(0x45564157);/=encoding.GetBytes(“WAVE”)
writer.Write(0x20746D66);/=encoding.GetBytes(“fmt”)
writer.Write(formatChunkSize);
writer.Write(格式化类型);
编剧。写作(曲目);
writer.Write(样本秒);
writer.Write(字节秒);
writer.Write(框架大小);
writer.Write(bitsPerSample);
Write.Write(0x61746164);/=encoding.GetBytes(“数据”)
writer.Write(数据块大小);
{
双θ=频率*TAU/(双)采样每秒;
//“音量”为UInt16,范围为0到UInt16.MaxValue(=65 535)
//我们需要“amp”的范围为0到Int16.MaxValue(=32767)
double amp=volume>>2;//因此我们只需设置amp=volume/2
对于(int step=0;step
快乐编码

-Humilulo我在其他网站上找到了一半的在线帮助,大约一半是我自己找到的。对于我所需要的,这里有一个近乎理想的解决方案: 1:创建一个MemoryStream, 2:将WAV文件的字节写入MemoryStream(永远不会保存到磁盘,但会像从WAV文件播放一样播放), 3:查找到MemoryStream的开头, 4:使用
System.Media.SoundPlayer(MemoryStream.Play()
播放MemoryStream。 就这样。其中最困难的部分是创建WAV格式的字节流。。。除非你只是从像我这样的人那里复制代码P 下面是一个.NET方法,它将在没有外部DLL或任何.NET外部内容的情况下播放声音:

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

public static void PlayBeep(UInt16 frequency, int msDuration, UInt16 volume = 16383)
{
    var mStrm = new MemoryStream();
    BinaryWriter writer = new BinaryWriter(mStrm);

    const double TAU = 2 * Math.PI;
    int formatChunkSize = 16;
    int headerSize = 8;
    short formatType = 1;
    short tracks = 1;
    int samplesPerSecond = 44100;
    short bitsPerSample = 16;
    short frameSize = (short)(tracks * ((bitsPerSample + 7) / 8));
    int bytesPerSecond = samplesPerSecond * frameSize;
    int waveSize = 4;
    int samples = (int)((decimal)samplesPerSecond * msDuration / 1000);
    int dataChunkSize = samples * frameSize;
    int fileSize = waveSize + headerSize + formatChunkSize + headerSize + dataChunkSize;
    // var encoding = new System.Text.UTF8Encoding();
    writer.Write(0x46464952); // = encoding.GetBytes("RIFF")
    writer.Write(fileSize);
    writer.Write(0x45564157); // = encoding.GetBytes("WAVE")
    writer.Write(0x20746D66); // = encoding.GetBytes("fmt ")
    writer.Write(formatChunkSize);
    writer.Write(formatType);
    writer.Write(tracks);
    writer.Write(samplesPerSecond);
    writer.Write(bytesPerSecond);
    writer.Write(frameSize);
    writer.Write(bitsPerSample);
    writer.Write(0x61746164); // = encoding.GetBytes("data")
    writer.Write(dataChunkSize);
    {
        double theta = frequency * TAU / (double)samplesPerSecond;
        // 'volume' is UInt16 with range 0 thru Uint16.MaxValue ( = 65 535)
        // we need 'amp' to have the range of 0 thru Int16.MaxValue ( = 32 767)
        double amp = volume >> 2; // so we simply set amp = volume / 2
        for (int step = 0; step < samples; step++)
        {
            short s = (short)(amp * Math.Sin(theta * (double)step));
            writer.Write(s);
        }
    }

    mStrm.Seek(0, SeekOrigin.Begin);
    new System.Media.SoundPlayer(mStrm).Play();
    writer.Close();
    mStrm.Close();
} // public static void PlayBeep(UInt16 frequency, int msDuration, UInt16 volume = 16383)
使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Linq;
使用System.Windows.Forms;
公共静态无效播放蜂鸣音(UInt16频率,完整时间,UInt16音量=16383)
{
var mStrm=新内存流();
BinaryWriter=新的BinaryWriter(mStrm);
常数double TAU=2*Math.PI;
int formatChunkSize=16;
int headerSize=8;
短格式类型=1;
短轨道=1;
int samplesPerSecond=44100;
短位样本=16;
短帧大小=(短)(轨迹*((比特采样+7)/8));
int bytesPerSecond=samplesPerSecond*帧大小;
int waveSize=4;
int样本=(int)((十进制)样本数秒*msDuration/1000);
int dataChunkSize=samples*frameSize;
我