回答編集履歴

2

見直しキャンペーン中

2023/08/12 09:47

投稿

TN8001
TN8001

スコア9862

test 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

スコア9862

test CHANGED
@@ -1,297 +1,149 @@
1
1
  > 上記リンクを参照し、コンボボックスにマイクの名称を
2
-
3
2
  > 表示するところまでは進めることが出来ました。
4
-
5
-
6
3
 
7
4
  このコードがありませんが、どうやったのでしょう?
8
5
 
9
-
10
-
11
6
  [NAudio - C# Show Device master peak in realtime - YouTube](https://www.youtube.com/watch?v=OVkd6xIWHDc)
12
-
13
7
  この動画は`Windows Forms`で作っているので、そのままでは使えません(NAudioについては参考になります)
14
-
15
-
16
8
 
17
9
  > 上記のようなコードを書いていました。
18
10
 
19
-
20
-
21
11
  かっこの対応がずれてますしタイプミスもあり、本当に試したのかと不安になります。
22
-
23
12
  どこまでできていて、何に詰まっているかをはっきりさせてください。
24
-
25
-
26
13
 
27
14
  動画の内容をWPFで書くとこんな感じでしょうか。
28
15
 
29
-
30
-
31
- ```xaml
16
+ ```xml
32
-
33
17
  <Window
34
-
35
18
  x:Class="Questions291997.MainWindow"
36
-
37
19
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
38
-
39
20
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
40
-
41
21
  Width="800"
42
-
43
22
  Height="450">
44
-
45
23
  <StackPanel>
46
-
47
24
  <ComboBox x:Name="comboBox" DisplayMemberPath="FriendlyName" />
48
-
49
25
  <TextBlock x:Name="textBlock" />
50
-
51
26
  <ProgressBar x:Name="progressBar" Height="30" />
52
-
53
27
  </StackPanel>
54
-
55
28
  </Window>
56
-
57
29
  ```
58
-
59
- ```C#
30
+ ```cs
60
-
61
31
  using System;
62
-
63
32
  using System.Windows;
64
-
65
33
  using System.Windows.Threading;
66
-
67
34
  using NAudio.CoreAudioApi;
68
35
 
69
-
70
-
71
36
  namespace Questions291997
72
-
73
37
  {
74
-
75
38
  public partial class MainWindow : Window
76
-
77
39
  {
78
-
79
40
  private DispatcherTimer timer;
80
41
 
81
-
82
-
83
42
  public MainWindow()
84
-
85
43
  {
86
-
87
44
  InitializeComponent();
88
45
 
89
-
90
-
91
46
  var enumerator = new MMDeviceEnumerator();
92
-
93
47
  var devices = enumerator.EnumerateAudioEndPoints(DataFlow.All, DeviceState.Active);
94
-
95
48
  foreach(var device in devices)
96
-
97
49
  {
98
-
99
50
  comboBox.Items.Add(device);
100
-
101
51
  }
102
52
 
103
-
104
-
105
53
  timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(10), };
106
-
107
54
  timer.Tick += Timer_Tick;
108
-
109
55
  timer.Start();
110
-
111
56
  }
112
57
 
113
-
114
-
115
58
  private void Timer_Tick(object sender, EventArgs e)
116
-
117
59
  {
118
-
119
60
  if(comboBox.SelectedItem is MMDevice device)
120
-
121
61
  {
122
-
123
62
  var v = (int)Math.Round(device.AudioMeterInformation.MasterPeakValue * 100);
124
-
125
63
  progressBar.Value = v;
126
-
127
64
  textBlock.Text = v.ToString();
128
-
129
65
  }
130
-
131
66
  }
132
-
133
67
  }
134
-
135
68
  }
136
-
137
69
  ```
138
-
139
-
140
70
 
141
71
  ---
142
72
 
143
-
144
-
145
73
  しかしこれってピーク音量ですよね?ちょっとホールド時間が長くてカクカク?する感じで、リアルタイム値とはいえないですよね。
146
74
 
147
-
148
-
149
75
  [Unityで既定以外の録音デバイスを使う(口パク) - Qiita](https://qiita.com/nise_aoi/items/7923ab29a678aa5a9b14)
150
-
151
76
  [NAudio/RecordingLevelMeter.md at master · naudio/NAudio](https://github.com/naudio/NAudio/blob/master/Docs/RecordingLevelMeter.md)
152
-
153
77
  こちらもピークをとってるのは同じですが、ホールドが短くちょうどいい感じがしました(バッファサイズによるのでしょうが)
154
78
 
155
-
156
-
157
- ```xaml
79
+ ```xml
158
-
159
80
  <Window
160
-
161
81
  x:Class="Questions291997.MainWindow"
162
-
163
82
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
164
-
165
83
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
166
-
167
84
  Width="800"
168
-
169
85
  Height="450">
170
-
171
86
  <StackPanel>
172
-
173
87
  <ComboBox x:Name="comboBox" SelectionChanged="ComboBox_SelectionChanged" />
174
-
175
88
  <TextBlock x:Name="textBlock" />
176
-
177
89
  <ProgressBar x:Name="progressBar" Height="30" />
178
-
179
90
  </StackPanel>
180
-
181
91
  </Window>
182
-
183
92
  ```
184
-
185
- ```C#
93
+ ```cs
186
-
187
94
  using System.Windows;
188
-
189
95
  using System.Windows.Controls;
190
-
191
96
  using System.Windows.Threading;
192
-
193
97
  using NAudio.Wave;
194
98
 
195
-
196
-
197
99
  namespace Questions291997
198
-
199
100
  {
200
-
201
101
  public partial class MainWindow : Window
202
-
203
102
  {
204
-
205
103
  private WaveInEvent waveIn;
206
104
 
207
-
208
-
209
105
  public MainWindow()
210
-
211
106
  {
212
-
213
107
  InitializeComponent();
214
108
 
109
+ for(var i = 0; i < WaveIn.DeviceCount; i++)
110
+ {
111
+ comboBox.Items.Add(WaveIn.GetCapabilities(i).ProductName);
112
+ }
113
+ }
215
114
 
216
-
217
- for(var i = 0; i < WaveIn.DeviceCount; i++)
115
+ private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
218
-
116
+ {
117
+ if(waveIn != null)
219
118
  {
220
-
119
+ waveIn.StopRecording();
221
- comboBox.Items.Add(WaveIn.GetCapabilities(i).ProductName);
120
+ waveIn.DataAvailable -= OnDataAvailable;
222
-
121
+ waveIn.Dispose();
223
122
  }
224
123
 
124
+ waveIn = new WaveInEvent { DeviceNumber = comboBox.SelectedIndex };
125
+ waveIn.DataAvailable += OnDataAvailable;
126
+ waveIn.StartRecording();
225
127
  }
226
128
 
227
-
228
-
229
- private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
129
+ private void OnDataAvailable(object sender, WaveInEventArgs e)
230
-
231
130
  {
232
-
233
- if(waveIn != null)
131
+ var max = 0f;
234
-
132
+ for(var i = 0; i < e.BytesRecorded; i += 2)
235
133
  {
236
-
134
+ var sample = (short)((e.Buffer[i + 1] << 8) | e.Buffer[i + 0]);
237
- waveIn.StopRecording();
135
+ var sample32 = sample / 32768f;
238
-
239
- waveIn.DataAvailable -= OnDataAvailable;
136
+ if(sample32 < 0) sample32 = -sample32;
240
-
241
- waveIn.Dispose();
137
+ if(sample32 > max) max = sample32;
242
-
243
138
  }
244
139
 
245
-
140
+ Dispatcher.Invoke(() =>
246
-
141
+ {
247
- waveIn = new WaveInEvent { DeviceNumber = comboBox.SelectedIndex };
142
+ textBlock.Text = (100 * max).ToString("0");
248
-
249
- waveIn.DataAvailable += OnDataAvailable;
143
+ progressBar.Value = 100 * max;
250
-
251
- waveIn.StartRecording();
144
+ });
252
-
253
145
  }
254
-
255
-
256
-
257
- private void OnDataAvailable(object sender, WaveInEventArgs e)
258
-
259
- {
260
-
261
- var max = 0f;
262
-
263
- for(var i = 0; i < e.BytesRecorded; i += 2)
264
-
265
- {
266
-
267
- var sample = (short)((e.Buffer[i + 1] << 8) | e.Buffer[i + 0]);
268
-
269
- var sample32 = sample / 32768f;
270
-
271
- if(sample32 < 0) sample32 = -sample32;
272
-
273
- if(sample32 > max) max = sample32;
274
-
275
- }
276
-
277
-
278
-
279
- Dispatcher.Invoke(() =>
280
-
281
- {
282
-
283
- textBlock.Text = (100 * max).ToString("0");
284
-
285
- progressBar.Value = 100 * max;
286
-
287
- });
288
-
289
- }
290
-
291
146
  }
292
-
293
147
  }
294
-
295
148
  ```
296
-
297
149
  計算?のところは公式のコードをそのままですが、おそらく入力のフォーマットによって変更する必要があると思います(よくわかりません^^;