-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathSineWave.cs
105 lines (89 loc) · 2.4 KB
/
SineWave.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
using System;
namespace ManagedBass.Sample.Android
{
/// <summary>
/// Plays a Sine Wave
/// </summary>
public class SineWave
{
double _freq, _amp, _rate, _sangle;
int _length, _sample;
public int Handle { get; private set; }
public double Frequency
{
get { return _freq; }
set
{
_freq = value;
Regenerate();
}
}
public double Amplitude
{
get { return _amp; }
set
{
_amp = value;
Regenerate();
}
}
public double SampleRate
{
get { return _rate; }
set
{
_rate = value;
Regenerate();
}
}
public int Length
{
get { return _length; }
set
{
_length = value;
Regenerate();
}
}
public double StartAngle
{
get { return _sangle; }
set
{
_sangle = value;
Regenerate();
}
}
public SineWave(double Frequency, double Amplitude, double SampleRate, int Length, double StartAngle = 0)
{
this.Frequency = Frequency;
this.Amplitude = Amplitude;
this.SampleRate = SampleRate;
this.Length = Length;
this.StartAngle = StartAngle;
Regenerate();
}
void Regenerate()
{
var buffer = new float[Length];
CreateSineWave(buffer);
if (_sample != 0)
Bass.SampleFree(_sample);
_sample = Bass.CreateSample(4 * Length, 44100, 2, 1, BassFlags.Float);
Bass.SampleSetData(_sample, buffer);
Handle = Bass.SampleGetChannel(_sample);
}
void CreateSineWave(float[] Buffer)
{
var angleStep = Frequency / SampleRate * Math.PI * 2;
var currentAngle = StartAngle;
for (var i = 0; i < Length; ++i)
{
Buffer[i] = (float)Math.Sin(currentAngle) * (float)Amplitude;
currentAngle += angleStep;
while (currentAngle > Math.PI)
currentAngle -= Math.PI * 2;
}
}
}
}