3 various software synths and samples
5 Copyright (C) 2009 Evan Rinehart
7 This software comes with no warranty.
8 1. This software can be used for any purpose, good or evil.
9 2. Modifications must retain this license, at least in spirit.
18 heres a list of instrument ideas...
23 drum (probably samples)
24 bass kick (classic analog algorithm)
25 square triangle saw (polyblep ?)
26 wind instruments (additive synth via uninterpolated table)
27 sampler (perhaps a compressed array of samples)
28 rendered ambient (PADsynth)
34 static float SAMPLE_RATE
= 44100;
36 #define TABLE_SIZE (1<<8)
37 #define RELEASE_STEPS (SAMPLE_RATE/333)
38 #define RELEASE_RATE 0.999
41 float sine_table
[TABLE_SIZE
];
43 float note2tablestep(float note
){
44 /* critical formula for tuning a table */
45 /* table steps for 2pif/SAMPLE_RATE radians is...*/
46 /* TABLE_SIZE/PI2 == entries per radian */
47 /* step == 2pif/SAMPLE_RATE * (TABLE_SIZE/PI2) */
48 /* == f * TABLE_SIZE / SAMPLE_RATE */
49 /* == f_0 2^(note/12) TABLE_SIZE / SAMPLE_RATE */
50 float f
= 440 * pow(2, note
/12.0);
51 return f
*TABLE_SIZE
/ SAMPLE_RATE
;
54 float sine_table_interp(float ptr
){
55 float i0
= floor(ptr
);
59 if(I0
< 0) I0
+= TABLE_SIZE
;
60 if(I1
>= TABLE_SIZE
) I1
-= TABLE_SIZE
;
61 float _y0
= sine_table
[I0
];
62 float _y1
= sine_table
[I1
];
65 float ans
= m
*((_y1
-_y0
)/(i1
-i0
)) + _y0
;
70 float normalize(float note
){
78 const float min
= -48;
81 const float right
= 0.125;
83 if(note
< min
) return left
;
84 if(note
> max
) return right
;
86 float ans
= (note
- min
)*((right
-left
) / (max
-min
)) + left
;
88 if(ans
< 0.125) return 0.125;
94 /* ORG_DEFAULT: default fallback instrument */
105 void default_gen(struct defstate
* data
, int z
, float out
[], int count
){
106 if(data
->on
[z
] == 0) return;
108 for(i
=0; i
<count
; i
++){
109 float step
= data
->step
[z
] + data
->bendstep
[z
];
110 if(data
->on
[z
] == 2){
111 data
->release
[z
] *= RELEASE_RATE
;
112 if(data
->release
[z
] < 0.01){
118 // float factor = normalize(data->note[z] + data->bend) * data->release[z];
119 //float amp = sine_table[data->ptr[z]];
120 float amp
= sine_table_interp(data
->ptr
[z
]);
121 // out[i] += amp * factor;
122 out
[i
] += 13*(amp
/ 16.0 * data
->release
[z
]);
123 data
->ptr
[z
] += step
;
124 while(data
->ptr
[z
] >= TABLE_SIZE
){
125 data
->ptr
[z
] -= TABLE_SIZE
;
127 while(data
->ptr
[z
] < 0){
128 data
->ptr
[z
] += TABLE_SIZE
;
133 void default_mix(void* ud
, float out
[], int count
){
134 struct defstate
* data
= ud
;
137 default_gen(data
, i
, out
, count
);
142 void default_bend_gen(struct defstate
* data
, int i
, float bend
){
143 if(data
->on
[i
] == 0) return;
144 int note
= data
->note
[i
];
145 data
->bendstep
[i
] = note2tablestep(note
+ bend
) - data
->step
[i
];
148 void default_turn_on(struct defstate
* data
, int note
){
149 float step
= note2tablestep(note
);
153 data
->step
[i
] = step
;
154 data
->note
[i
] = note
;
157 data
->release
[i
] = 1.0;
158 default_bend_gen(data
, i
, data
->bend
);
164 void default_turn_off(struct defstate
* data
, int note
){
167 if(data
->note
[i
] == note
&& data
->on
[i
] == 1){
174 void default_bend(struct defstate
* data
, int amount
){
176 int relative
= amount
- max
/2;
177 float bend
= 1.0*relative
/max
* 4;
181 default_bend_gen(data
, i
, bend
);
185 void default_control(void* ud
, int type
, int val1
, int val2
, int val
){
186 struct defstate
* data
= ud
;
188 case EV_NOTEON
: default_turn_on(data
, val1
); break;
189 case EV_NOTEOFF
: default_turn_off(data
, val1
); break;
190 case EV_PITCHBEND
: default_bend(data
, val
); break;
194 void default_cleanup(void* data
){ free(data
); }
196 instrument
make_default(){
198 struct defstate
* data
= malloc(sizeof(struct defstate
));
205 data
->bendstep
[i
] = 0;
208 ins
.mix
= default_mix
;
209 ins
.control
= default_control
;
210 ins
.cleanup
= default_cleanup
;
218 /* ORG_KARPLUS: karplus strong string synth */
232 void karplus_mix(void* ud
, float out
[], int count
){
234 struct karplus
* data
= ud
;
235 for(i
=0; i
<count
; i
++){
236 int L
= data
->length
;
237 int z1
= floor(data
->ptr
);
243 //out[i] = linterp(data->buf, data->ptr) * 6;
244 out
[i
] = data
->buf
[z0
] * 10;
245 data
->buf
[z1
] = (data
->buf
[z1
] + data
->buf
[z0
]) / 2.015;
253 void karplus_control(void* ud
, int type
, int val1
, int val2
, int val
){
254 struct karplus
* data
= ud
;
261 f
= 440*(pow(2, val1
/12.0));
262 L
= SAMPLE_RATE
* 1.0 / f
;
264 for(i
=0; i
<100; i
++){
266 data
->buf
[i
] += r
/RAND_MAX
- 0.5;
270 for(i
=0; i
<KARF
; i
++){
274 // case EV_PITCHBEND: default_bend(data, val); break;
279 void karplus_cleanup(void* data
){ free(data
); }
281 instrument
make_karplus(){
283 struct karplus
* data
= malloc(sizeof(struct karplus
));
287 for(i
=0; i
<KARF
; i
++){
290 ins
.mix
= karplus_mix
;
291 ins
.control
= karplus_control
;
292 ins
.cleanup
= karplus_cleanup
;
299 /*** exported methods ***/
300 instrument
orc_load(enum instrument_name name
){
302 case ORC_DEFAULT
: return make_default();
303 case ORC_KARPLUS
: return make_karplus();
304 // case ORC_COOL: return make_cool();
305 default: return make_default();
310 void orc_init(int sample_rate
){
312 SAMPLE_RATE
= sample_rate
;
313 for(i
=0; i
<TABLE_SIZE
; i
++){
314 sine_table
[i
] = sin( (PI2
*i
) / TABLE_SIZE
);