]> git.donarmstrong.com Git - qmk_firmware.git/blob - quantum/audio/voices.c
Merge branch 'master' of https://github.com/Dbroqua/qmk_firmware
[qmk_firmware.git] / quantum / audio / voices.c
1 #include "voices.h"
2 #include "audio.h"
3 #include "stdlib.h"
4
5 // these are imported from audio.c
6 extern uint16_t envelope_index;
7 extern float note_timbre;
8 extern float polyphony_rate;
9
10 voice_type voice = default_voice;
11
12 void set_voice(voice_type v) {
13     voice = v;
14 }
15
16 void voice_iterate() {
17     voice = (voice + 1) % number_of_voices;
18 }
19
20 void voice_deiterate() {
21     voice = (voice - 1 + number_of_voices) % number_of_voices;
22 }
23
24 float voice_envelope(float frequency) {
25     // envelope_index ranges from 0 to 0xFFFF, which is preserved at 880.0 Hz
26     uint16_t compensated_index = (uint16_t)((float)envelope_index * (880.0 / frequency));
27
28     switch (voice) {
29         case default_voice:
30             note_timbre = TIMBRE_50;
31             polyphony_rate = 0;
32                 break;
33
34         case something:
35             polyphony_rate = 0;
36             switch (compensated_index) {
37                 case 0 ... 9:
38                     note_timbre = TIMBRE_12;
39                     break;
40
41                 case 10 ... 19:
42                     note_timbre = TIMBRE_25;
43                     break;
44
45                 case 20 ... 200:
46                     note_timbre = .25 + .125 + pow(((float)compensated_index - 20) / (200 - 20), 2)*.125;
47                     break;
48
49                 default:
50                     note_timbre = .25;
51                     break;
52             }
53             break;
54
55         case butts_fader:
56             polyphony_rate = 0;
57             switch (compensated_index) {
58                 case 0 ... 9:
59                     frequency = frequency / 4;
60                     note_timbre = TIMBRE_12;
61                         break;
62
63                 case 10 ... 19:
64                     frequency = frequency / 2;
65                     note_timbre = TIMBRE_12;
66                         break;
67
68                 case 20 ... 200:
69                     note_timbre = .125 - pow(((float)compensated_index - 20) / (200 - 20), 2)*.125;
70                         break;
71
72                 default:
73                     note_timbre = 0;
74                         break;
75             }
76             break;
77
78         // case octave_crunch:
79         //     polyphony_rate = 0;
80         //     switch (compensated_index) {
81         //         case 0 ... 9:
82         //         case 20 ... 24:
83         //         case 30 ... 32:
84         //             frequency = frequency / 2;
85         //             note_timbre = TIMBRE_12;
86         //         break;
87
88         //         case 10 ... 19:
89         //         case 25 ... 29:
90         //         case 33 ... 35:
91         //             frequency = frequency * 2;
92         //             note_timbre = TIMBRE_12;
93                //          break;
94
95         //         default:
96         //             note_timbre = TIMBRE_12;
97         //              break;
98         //     }
99                //  break;
100
101         case duty_osc:
102             // This slows the loop down a substantial amount, so higher notes may freeze
103             polyphony_rate = 0;
104             switch (compensated_index) {
105                 default:
106                     #define OCS_SPEED 10
107                     #define OCS_AMP   .25
108                     // sine wave is slow
109                     // note_timbre = (sin((float)compensated_index/10000*OCS_SPEED) * OCS_AMP / 2) + .5;
110                     // triangle wave is a bit faster
111                     note_timbre = (float)abs((compensated_index*OCS_SPEED % 3000) - 1500) * ( OCS_AMP / 1500 ) + (1 - OCS_AMP) / 2;
112                         break;
113             }
114                 break;
115
116         case duty_octave_down:
117             polyphony_rate = 0;
118             note_timbre = (envelope_index % 2) * .125 + .375 * 2;
119             if ((envelope_index % 4) == 0)
120                 note_timbre = 0.5;
121             if ((envelope_index % 8) == 0)
122                 note_timbre = 0;
123             break;
124         case delayed_vibrato:
125             polyphony_rate = 0;
126             note_timbre = TIMBRE_50;
127             #define VOICE_VIBRATO_DELAY 150
128             #define VOICE_VIBRATO_SPEED 50
129             switch (compensated_index) {
130                 case 0 ... VOICE_VIBRATO_DELAY:
131                     break;
132                 default:
133                     frequency = frequency * vibrato_lut[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
134                     break;
135             }
136             break;
137         // case delayed_vibrato_octave:
138         //     polyphony_rate = 0;
139         //     if ((envelope_index % 2) == 1) {
140         //         note_timbre = 0.55;
141         //     } else {
142         //         note_timbre = 0.45;
143         //     }
144         //     #define VOICE_VIBRATO_DELAY 150
145         //     #define VOICE_VIBRATO_SPEED 50
146         //     switch (compensated_index) {
147         //         case 0 ... VOICE_VIBRATO_DELAY:
148         //             break;
149         //         default:
150         //             frequency = frequency * VIBRATO_LUT[(int)fmod((((float)compensated_index - (VOICE_VIBRATO_DELAY + 1))/1000*VOICE_VIBRATO_SPEED), VIBRATO_LUT_LENGTH)];
151         //             break;
152         //     }
153         //     break;
154         // case duty_fifth_down:
155         //     note_timbre = 0.5;
156         //     if ((envelope_index % 3) == 0)
157         //         note_timbre = 0.75;
158         //     break;
159         // case duty_fourth_down:
160         //     note_timbre = 0.0;
161         //     if ((envelope_index % 12) == 0)
162         //         note_timbre = 0.75;
163         //     if (((envelope_index % 12) % 4) != 1)
164         //         note_timbre = 0.75;
165         //     break;
166         // case duty_third_down:
167         //     note_timbre = 0.5;
168         //     if ((envelope_index % 5) == 0)
169         //         note_timbre = 0.75;
170         //     break;
171         // case duty_fifth_third_down:
172         //     note_timbre = 0.5;
173         //     if ((envelope_index % 5) == 0)
174         //         note_timbre = 0.75;
175         //     if ((envelope_index % 3) == 0)
176         //         note_timbre = 0.25;
177         //     break;
178
179                 default:
180                         break;
181     }
182
183     return frequency;
184 }
185
186