Enabled alternative bases.
[orgux.git] / instruments.h
blobede82b806fb53859ff99d49143ecb12409723c1a
1 /*
2 orgux - a just-for-fun real time synth
3 Copyright (C) 2009 Evan Rinehart
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 #define HARMONIC_COUNT 8
23 #define BASE_CONFIG 8
24 #define FM_CONFIG 9
25 #define FM_FREQ_CONFIG 10
26 #define LP_CONFIG 11
27 #define HP_CONFIG 12
29 #define COMPONENT_MAX 255
32 #define SINE_BASE 128
33 #define SQUARE_BASE 129
34 #define TRIANGLE_BASE 130
35 #define SAW_BASE 131
36 #define NOISE_BASE 132
38 #define FM_OFF 133
40 /* configuration of instruments
42 you may combine the first eight harmonics in whatever proportions you wish
43 to make a carrier for your instrument. magnitudes are proportional, so
44 2,1,0,0,0... means two parts harmonic zero plus one part harmonic one, for
45 a total of three parts or 0.666*f_0 + 0.333*f_1. Actually the coefficients are
46 squared to compensate for lack of dynamic range (0-255).
48 you may choose sine, square, saw, triangle or noise as the basis function or
49 choose any previously defined instrument. choosing a future instrument will
50 result in an undefined instrument.
52 you may choose a frequency modulation signal the same way as you choose a basis.
53 FM_OFF is a special value to choose no FM signal. the value after the FM signal
54 is the frequency of the FM signal. The frequency is determined logarithmically
55 via F = 2^(value/8).
57 The next two values determine cutoff frequencies for the instruments low pass
58 and high pass filter. 0 deactivates the filter, otherwise F = 2^(value/8).
60 At this the the last four numbers are useless.
65 static const unsigned char instr_config[128][16] = {
66 /*harmonics
67 0 1 2 3 4 5 6 7| basis FM FM_f LP HP*/
68 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},/*0*/
69 {2,1,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
70 {4,2,1,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
71 {8,4,2,1,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
73 {1,0,0,0,0,0,0,0, SQUARE_BASE, FM_OFF, 0, 0, 0,0,0,0},
74 {1,0,0,0,0,0,0,0, TRIANGLE_BASE, FM_OFF, 0, 0, 0,0,0,0},
75 {1,0,0,0,0,0,0,0, SAW_BASE, FM_OFF, 0, 0, 0,0,0,0},
76 {1,0,0,0,0,0,0,0, NOISE_BASE, FM_OFF, 0, 0, 0,0,0,0},
78 {2,1,0,0,0,0,0,0, SQUARE_BASE, FM_OFF, 0, 0, 0,0,0,0},/*8*/
79 {4,2,1,0,0,0,0,0, SQUARE_BASE, FM_OFF, 0, 0, 0,0,0,0},
80 {8,4,2,1,0,0,0,0, SQUARE_BASE, FM_OFF, 0, 0, 0,0,0,0},
81 {16,8,4,2,1,0,0,0, SQUARE_BASE, FM_OFF, 0, 0, 0,0,0,0},
83 {2,1,0,0,0,0,0,0, TRIANGLE_BASE, FM_OFF, 0, 0, 0,0,0,0},
84 {2,0,1,0,0,0,0,0, TRIANGLE_BASE, FM_OFF, 0, 0, 0,0,0,0},
85 {2,1,1,0,0,0,0,0, TRIANGLE_BASE, FM_OFF, 0, 0, 0,0,0,0},
86 {3,1,1,0,0,0,0,0, TRIANGLE_BASE, FM_OFF, 0, 0, 0,0,0,0},
88 {2,1,0,0,0,0,0,0, SAW_BASE, FM_OFF, 0, 0, 0,0,0,0},/*16*/
89 {4,0,1,0,0,0,0,0, SAW_BASE, FM_OFF, 0, 0, 0,0,0,0},
90 {4,2,1,0,0,0,0,0, SAW_BASE, FM_OFF, 0, 0, 0,0,0,0},
91 {2,0,1,0,0,0,0,0, SAW_BASE, FM_OFF, 0, 0, 0,0,0,0},
93 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
94 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
95 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
96 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
98 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},/*24*/
99 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
100 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
101 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
103 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
104 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
105 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
106 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
108 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},/*32*/
109 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
110 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
111 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
113 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
114 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
115 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
116 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
118 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},/*40*/
119 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
120 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
121 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
123 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
124 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
125 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
126 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
128 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},/*48*/
129 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
130 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
131 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
133 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
134 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
135 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
136 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
138 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},/*56*/
139 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
140 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
141 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
143 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
144 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
145 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
146 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
148 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},/*64*/
149 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
150 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
151 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
153 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
154 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
155 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
156 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
158 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},/*72*/
159 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
160 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
161 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
163 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
164 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
165 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
166 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
168 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},/*80*/
169 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
170 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
171 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
173 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
174 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
175 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
176 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
178 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},/*88*/
179 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
180 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
181 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
183 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
184 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
185 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
186 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
188 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},/*96*/
189 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
190 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
191 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
193 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
194 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
195 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
196 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
198 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},/*104*/
199 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
200 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
201 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
203 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
204 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
205 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
206 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
208 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},/*112*/
209 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
210 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
211 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
213 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
214 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
215 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
216 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
218 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},/*120*/
219 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
220 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
221 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
223 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
224 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
225 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0},
226 {1,0,0,0,0,0,0,0, SINE_BASE, FM_OFF, 0, 0, 0,0,0,0}