C#で音声を取得し波形の表示と周波数の表示
https://teratail.com/questions/296462?link=qa_related_pc
こちらの質問の回答者のように波形や周波数表示するプログラムを実行できるようにしたいです。
VScodeを使っています。
こちらのコンソールアプリケーションで実行を試みました。
[VScodeで利用しました。]
コピペをして実行しようとしたところエラーメッセージが出て実行できません
発生している問題・エラーメッセージ
下記のようなエラーメッセージが出ます
CS5001 プログラムは、エントリ ポイントに適切な静的'Main'メゾッドを含んでいません
該当のソースコード
C#
1using System; 2using System.Collections.Generic; 3using System.Data; 4using System.Linq; 5using System.Numerics; 6using System.Windows.Forms; 7using MathNet.Numerics; 8using MathNet.Numerics.IntegralTransforms; 9using NAudio.Wave; 10using OxyPlot; 11using OxyPlot.Axes; 12using OxyPlot.Series; 13 14namespace RT_fft 15{ 16 17 public partial class Form1 : Form 18 { 19 private readonly LineSeries _lineSeries1 = new LineSeries(); 20 private readonly LineSeries _lineSeries2 = new LineSeries(); 21 private readonly List<float> _recorded = new List<float>(); 22 private const int deviceNumber = 0; 23 24 public Form1() => InitializeComponent(); 25 26 private void Form1_Load(object sender, EventArgs e) 27 { 28 FormBorderStyle = FormBorderStyle.FixedSingle; 29 30 var info = WaveIn.GetCapabilities(deviceNumber); 31 micname.Text = $"Device {deviceNumber}: {info.ProductName}, {info.Channels} channels"; 32 33 InitPlot(); 34 } 35 36 private void InitPlot() 37 { 38 var model = new PlotModel(); 39 model.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, }); 40 model.Axes.Add(new LinearAxis { Minimum = -1.0, Maximum = 1.0, Position = AxisPosition.Left, }); 41 model.Series.Add(_lineSeries1); 42 plotView1.Model = model; 43 44 model = new PlotModel(); 45 model.Axes.Add(new LinearAxis { Position = AxisPosition.Bottom, }); 46 model.Axes.Add(new LinearAxis { Minimum = 0, Maximum = 5.0, Position = AxisPosition.Left, }); 47 model.Series.Add(_lineSeries2); 48 plotView2.Model = model; 49 } 50 51 private void recording_Click(object sender, EventArgs e) 52 { 53 var waveIn = new WaveIn 54 { 55 DeviceNumber = deviceNumber, 56 WaveFormat = new WaveFormat(sampleRate: 8000, channels: 1), 57 }; 58 waveIn.DataAvailable += WaveIn_DataAvailable; 59 waveIn.StartRecording(); 60 } 61 62 private void finish_Click(object sender, EventArgs e) => Application.Exit(); 63 64 private void WaveIn_DataAvailable(object sender, WaveInEventArgs e) 65 { 66 for (var index = 0; index < e.BytesRecorded; index += 2) 67 { 68 var sample = (short)((e.Buffer[index + 1] << 8) | e.Buffer[index + 0]); 69 var sample32 = sample / 32768f; 70 ProcessSample(sample32); 71 } 72 } 73 74 private void ProcessSample(float sample) 75 { 76 _recorded.Add(sample); 77 78 if (_recorded.Count == 1024) 79 { 80 // plotView1 81 var points = _recorded.Select((v, i) => new DataPoint(i, v)); 82 _lineSeries1.Points.Clear(); 83 _lineSeries1.Points.AddRange(points); 84 plotView1.InvalidatePlot(true); 85 86 // plotView2 87 var windowsize = _recorded.Count; 88 var window = Window.Hamming(windowsize); 89 var complexData = _recorded.Select((v, i) => v * (float)window[i]) 90 .Select(v => new Complex(v, 0.0)).ToArray(); 91 Fourier.Forward(complexData, FourierOptions.Matlab); 92 93 var s = windowsize * (1.0 / 8000.0); 94 var point = complexData.Take(complexData.Count() / 2) 95 .Select((v, i) => new DataPoint(i / s, Math.Sqrt(v.Real * v.Real + v.Imaginary * v.Imaginary))) 96 .ToList(); 97 98 _lineSeries2.Points.Clear(); 99 _lineSeries2.Points.AddRange(point); 100 plotView2.InvalidatePlot(true); 101 102 // Hz 103 var max = point.Aggregate((r, n) => r.Y > n.Y ? r : n); 104 label1.Text = $"{point.IndexOf(max) / s:f0} Hz"; 105 106 _recorded.Clear(); 107 } 108 } 109 } 110} 111 112
試したこと
初めに上記のサイトの回答者のソースコードをコピペして実行しましたが、上記のようなエラーメッセージが出ました。
Mainメゾッドを含んでいないというエラーメッセージだったので、下記のようにclass program{ ~ }を追加しましたが
同じエラーメッセージができました。
namespace RT_fft { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } } public partial class Form1 : Form { private readonly LineSeries _lineSeries1 = new LineSeries(); private readonly LineSeries _lineSeries2 = new LineSeries(); private readonly List<float> _recorded = new List<float>(); private const int deviceNumber = 0;
どうしたらエラーなく参考にしたような実行画面が表示できるでしょうか。
対処法を教えていただきたいです。
C#でのプログラミングが初めてのため開発環境に問題がある場合は、そちらも教えていただきたいです
参考にしたプログラム
https://teratail.com/questions/296462?link=qa_related_pc
回答を受けて
VisualStudioでWindowsフォームアプリケーションで実行を試みました。
ですが同じようなエラーメッセージが表示され、さらに追加でエラーメッセージが表示されました。
改善方法を教えていただきたいです。
ソースコードは変更していません。
参考先の方と同じコードにしてあります。