-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnotanorgan.cpp
96 lines (85 loc) · 2.04 KB
/
notanorgan.cpp
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
#include "common/sketchbook.hpp"
using namespace std::literals;
using namespace musical;
using namespace common;
using support::wrap;
constexpr std::array<std::array<float,19>,4> notes {{
{
51.91, 55.00, 58.27, 61.74, 65.41, 69.30,
73.42, 77.78, 82.41, 87.31, 92.50, 98.00,
103.83, 110.00, 116.54, 123.47, 130.81,
138.59, 146.83,
},
{
155.56, 164.81, 174.61, 185.00, 196.00,
207.65, 220.00, 233.08, 246.94, 261.63,
277.18, 293.66, 311.13, 329.63, 349.23,
369.99, 392.00, 415.30, 440.00,
},
{
466.16, 493.88, 523.25, 554.37, 587.33,
622.25, 659.25, 698.46, 739.99, 783.99,
830.61, 880.00, 932.33, 987.77, 1046.50,
1108.73, 1174.66, 1244.51, 1318.51,
},
{
1396.91, 1479.98, 1567.98, 1661.22,
1760.00, 1864.66, 1975.53, 2093.00,
2217.46, 2349.32, 2489.02, 2637.02,
2793.83, 2959.96, 3135.96, 3322.44,
3520.00, 3729.31, 3951.07,
},
}};
constexpr std::array<scancode,19> keys {
scancode::a,
scancode::w,
scancode::s,
scancode::e,
scancode::d,
scancode::r,
scancode::f,
scancode::t,
scancode::g,
scancode::y,
scancode::h,
scancode::u,
scancode::j,
scancode::i,
scancode::k,
scancode::o,
scancode::l,
scancode::p,
scancode::semicolon
};
auto get_key_index(scancode key)
{
auto it = std::find(keys.begin(), keys.end(), key);
return keys.end() != it ? std::optional(it - keys.begin()) : std::nullopt;
};
float sinus(float angle)
{
return rotate(float2::i(), protractor<>::tau(wrap(angle,1.f))).y();
}
void start(Program& program)
{
program.key_down = [&program](scancode key, auto){
auto level =
pressed(scancode::lshift) ? 1 :
pressed(scancode::lctrl) ? 2 :
pressed(scancode::lalt) ? 3 :
0;
auto index = get_key_index(key);
if(index)
{
auto wave = [note=notes[level][*index]](auto ratio)
{
constexpr float fade_in = 2;
constexpr float fade_out = 2;
float fade = std::min(ratio*fade_in, (1-ratio)*fade_out);
return way(0.f,sinus(ratio * note), std::min(fade, 1.f));
};
int canal = 32;
while(canal --> 0 && !program.request_wave({std::move(wave), 1000ms}, canal));
}
};
}