teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

見直しキャンペーン中

2023/08/12 09:47

投稿

TN8001
TN8001

スコア10111

answer CHANGED
@@ -4,7 +4,7 @@
4
4
  このコードがありませんが、どうやったのでしょう?
5
5
 
6
6
  [NAudio - C# Show Device master peak in realtime - YouTube](https://www.youtube.com/watch?v=OVkd6xIWHDc)
7
- この動画は`Windows Forms`で作っているので、そのままでは使えません(NAudioについては参考になります)
7
+ この動画はWindows Formsで作っているので、そのままでは使えません(NAudioについては参考になります)
8
8
 
9
9
  > 上記のようなコードを書いていました。
10
10
 

1

見直しキャンペーン中

2023/07/23 05:57

投稿

TN8001
TN8001

スコア10111

answer CHANGED
@@ -1,149 +1,149 @@
1
- > 上記リンクを参照し、コンボボックスにマイクの名称を
2
- > 表示するところまでは進めることが出来ました。
3
-
4
- このコードがありませんが、どうやったのでしょう?
5
-
6
- [NAudio - C# Show Device master peak in realtime - YouTube](https://www.youtube.com/watch?v=OVkd6xIWHDc)
7
- この動画は`Windows Forms`で作っているので、そのままでは使えません(NAudioについては参考になります)
8
-
9
- > 上記のようなコードを書いていました。
10
-
11
- かっこの対応がずれてますしタイプミスもあり、本当に試したのかと不安になります。
12
- どこまでできていて、何に詰まっているかをはっきりさせてください。
13
-
14
- 動画の内容をWPFで書くとこんな感じでしょうか。
15
-
16
- ```xaml
17
- <Window
18
- x:Class="Questions291997.MainWindow"
19
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
20
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
21
- Width="800"
22
- Height="450">
23
- <StackPanel>
24
- <ComboBox x:Name="comboBox" DisplayMemberPath="FriendlyName" />
25
- <TextBlock x:Name="textBlock" />
26
- <ProgressBar x:Name="progressBar" Height="30" />
27
- </StackPanel>
28
- </Window>
29
- ```
30
- ```C#
31
- using System;
32
- using System.Windows;
33
- using System.Windows.Threading;
34
- using NAudio.CoreAudioApi;
35
-
36
- namespace Questions291997
37
- {
38
- public partial class MainWindow : Window
39
- {
40
- private DispatcherTimer timer;
41
-
42
- public MainWindow()
43
- {
44
- InitializeComponent();
45
-
46
- var enumerator = new MMDeviceEnumerator();
47
- var devices = enumerator.EnumerateAudioEndPoints(DataFlow.All, DeviceState.Active);
48
- foreach(var device in devices)
49
- {
50
- comboBox.Items.Add(device);
51
- }
52
-
53
- timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(10), };
54
- timer.Tick += Timer_Tick;
55
- timer.Start();
56
- }
57
-
58
- private void Timer_Tick(object sender, EventArgs e)
59
- {
60
- if(comboBox.SelectedItem is MMDevice device)
61
- {
62
- var v = (int)Math.Round(device.AudioMeterInformation.MasterPeakValue * 100);
63
- progressBar.Value = v;
64
- textBlock.Text = v.ToString();
65
- }
66
- }
67
- }
68
- }
69
- ```
70
-
71
- ---
72
-
73
- しかしこれってピーク音量ですよね?ちょっとホールド時間が長くてカクカク?する感じで、リアルタイム値とはいえないですよね。
74
-
75
- [Unityで既定以外の録音デバイスを使う(口パク) - Qiita](https://qiita.com/nise_aoi/items/7923ab29a678aa5a9b14)
76
- [NAudio/RecordingLevelMeter.md at master · naudio/NAudio](https://github.com/naudio/NAudio/blob/master/Docs/RecordingLevelMeter.md)
77
- こちらもピークをとってるのは同じですが、ホールドが短くちょうどいい感じがしました(バッファサイズによるのでしょうが)
78
-
79
- ```xaml
80
- <Window
81
- x:Class="Questions291997.MainWindow"
82
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
83
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
84
- Width="800"
85
- Height="450">
86
- <StackPanel>
87
- <ComboBox x:Name="comboBox" SelectionChanged="ComboBox_SelectionChanged" />
88
- <TextBlock x:Name="textBlock" />
89
- <ProgressBar x:Name="progressBar" Height="30" />
90
- </StackPanel>
91
- </Window>
92
- ```
93
- ```C#
94
- using System.Windows;
95
- using System.Windows.Controls;
96
- using System.Windows.Threading;
97
- using NAudio.Wave;
98
-
99
- namespace Questions291997
100
- {
101
- public partial class MainWindow : Window
102
- {
103
- private WaveInEvent waveIn;
104
-
105
- public MainWindow()
106
- {
107
- InitializeComponent();
108
-
109
- for(var i = 0; i < WaveIn.DeviceCount; i++)
110
- {
111
- comboBox.Items.Add(WaveIn.GetCapabilities(i).ProductName);
112
- }
113
- }
114
-
115
- private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
116
- {
117
- if(waveIn != null)
118
- {
119
- waveIn.StopRecording();
120
- waveIn.DataAvailable -= OnDataAvailable;
121
- waveIn.Dispose();
122
- }
123
-
124
- waveIn = new WaveInEvent { DeviceNumber = comboBox.SelectedIndex };
125
- waveIn.DataAvailable += OnDataAvailable;
126
- waveIn.StartRecording();
127
- }
128
-
129
- private void OnDataAvailable(object sender, WaveInEventArgs e)
130
- {
131
- var max = 0f;
132
- for(var i = 0; i < e.BytesRecorded; i += 2)
133
- {
134
- var sample = (short)((e.Buffer[i + 1] << 8) | e.Buffer[i + 0]);
135
- var sample32 = sample / 32768f;
136
- if(sample32 < 0) sample32 = -sample32;
137
- if(sample32 > max) max = sample32;
138
- }
139
-
140
- Dispatcher.Invoke(() =>
141
- {
142
- textBlock.Text = (100 * max).ToString("0");
143
- progressBar.Value = 100 * max;
144
- });
145
- }
146
- }
147
- }
148
- ```
1
+ > 上記リンクを参照し、コンボボックスにマイクの名称を
2
+ > 表示するところまでは進めることが出来ました。
3
+
4
+ このコードがありませんが、どうやったのでしょう?
5
+
6
+ [NAudio - C# Show Device master peak in realtime - YouTube](https://www.youtube.com/watch?v=OVkd6xIWHDc)
7
+ この動画は`Windows Forms`で作っているので、そのままでは使えません(NAudioについては参考になります)
8
+
9
+ > 上記のようなコードを書いていました。
10
+
11
+ かっこの対応がずれてますしタイプミスもあり、本当に試したのかと不安になります。
12
+ どこまでできていて、何に詰まっているかをはっきりさせてください。
13
+
14
+ 動画の内容をWPFで書くとこんな感じでしょうか。
15
+
16
+ ```xml
17
+ <Window
18
+ x:Class="Questions291997.MainWindow"
19
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
20
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
21
+ Width="800"
22
+ Height="450">
23
+ <StackPanel>
24
+ <ComboBox x:Name="comboBox" DisplayMemberPath="FriendlyName" />
25
+ <TextBlock x:Name="textBlock" />
26
+ <ProgressBar x:Name="progressBar" Height="30" />
27
+ </StackPanel>
28
+ </Window>
29
+ ```
30
+ ```cs
31
+ using System;
32
+ using System.Windows;
33
+ using System.Windows.Threading;
34
+ using NAudio.CoreAudioApi;
35
+
36
+ namespace Questions291997
37
+ {
38
+ public partial class MainWindow : Window
39
+ {
40
+ private DispatcherTimer timer;
41
+
42
+ public MainWindow()
43
+ {
44
+ InitializeComponent();
45
+
46
+ var enumerator = new MMDeviceEnumerator();
47
+ var devices = enumerator.EnumerateAudioEndPoints(DataFlow.All, DeviceState.Active);
48
+ foreach(var device in devices)
49
+ {
50
+ comboBox.Items.Add(device);
51
+ }
52
+
53
+ timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(10), };
54
+ timer.Tick += Timer_Tick;
55
+ timer.Start();
56
+ }
57
+
58
+ private void Timer_Tick(object sender, EventArgs e)
59
+ {
60
+ if(comboBox.SelectedItem is MMDevice device)
61
+ {
62
+ var v = (int)Math.Round(device.AudioMeterInformation.MasterPeakValue * 100);
63
+ progressBar.Value = v;
64
+ textBlock.Text = v.ToString();
65
+ }
66
+ }
67
+ }
68
+ }
69
+ ```
70
+
71
+ ---
72
+
73
+ しかしこれってピーク音量ですよね?ちょっとホールド時間が長くてカクカク?する感じで、リアルタイム値とはいえないですよね。
74
+
75
+ [Unityで既定以外の録音デバイスを使う(口パク) - Qiita](https://qiita.com/nise_aoi/items/7923ab29a678aa5a9b14)
76
+ [NAudio/RecordingLevelMeter.md at master · naudio/NAudio](https://github.com/naudio/NAudio/blob/master/Docs/RecordingLevelMeter.md)
77
+ こちらもピークをとってるのは同じですが、ホールドが短くちょうどいい感じがしました(バッファサイズによるのでしょうが)
78
+
79
+ ```xml
80
+ <Window
81
+ x:Class="Questions291997.MainWindow"
82
+ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
83
+ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
84
+ Width="800"
85
+ Height="450">
86
+ <StackPanel>
87
+ <ComboBox x:Name="comboBox" SelectionChanged="ComboBox_SelectionChanged" />
88
+ <TextBlock x:Name="textBlock" />
89
+ <ProgressBar x:Name="progressBar" Height="30" />
90
+ </StackPanel>
91
+ </Window>
92
+ ```
93
+ ```cs
94
+ using System.Windows;
95
+ using System.Windows.Controls;
96
+ using System.Windows.Threading;
97
+ using NAudio.Wave;
98
+
99
+ namespace Questions291997
100
+ {
101
+ public partial class MainWindow : Window
102
+ {
103
+ private WaveInEvent waveIn;
104
+
105
+ public MainWindow()
106
+ {
107
+ InitializeComponent();
108
+
109
+ for(var i = 0; i < WaveIn.DeviceCount; i++)
110
+ {
111
+ comboBox.Items.Add(WaveIn.GetCapabilities(i).ProductName);
112
+ }
113
+ }
114
+
115
+ private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
116
+ {
117
+ if(waveIn != null)
118
+ {
119
+ waveIn.StopRecording();
120
+ waveIn.DataAvailable -= OnDataAvailable;
121
+ waveIn.Dispose();
122
+ }
123
+
124
+ waveIn = new WaveInEvent { DeviceNumber = comboBox.SelectedIndex };
125
+ waveIn.DataAvailable += OnDataAvailable;
126
+ waveIn.StartRecording();
127
+ }
128
+
129
+ private void OnDataAvailable(object sender, WaveInEventArgs e)
130
+ {
131
+ var max = 0f;
132
+ for(var i = 0; i < e.BytesRecorded; i += 2)
133
+ {
134
+ var sample = (short)((e.Buffer[i + 1] << 8) | e.Buffer[i + 0]);
135
+ var sample32 = sample / 32768f;
136
+ if(sample32 < 0) sample32 = -sample32;
137
+ if(sample32 > max) max = sample32;
138
+ }
139
+
140
+ Dispatcher.Invoke(() =>
141
+ {
142
+ textBlock.Text = (100 * max).ToString("0");
143
+ progressBar.Value = 100 * max;
144
+ });
145
+ }
146
+ }
147
+ }
148
+ ```
149
149
  計算?のところは公式のコードをそのままですが、おそらく入力のフォーマットによって変更する必要があると思います(よくわかりません^^;