extern float current_time;
+float noise()
+{
+ return 2.0f*(rand()/(float)RAND_MAX)-1.0f;
+}
+
float detune(float base, int coarse, int fine)
{
return base*powf(2.0f, (coarse+(fine/100.0f))/12.0f);
break;
}
case NOISE:
- v->waves[wave][i] = 2.0f*(rand()/(float)RAND_MAX)-1.0f;
+ v->waves[wave][i] = noise();
break;
case SUM:
v->waves[wave][i] = 1.0f - 1.0f/(1.0f+expf(-f*(time-d)));
break;
}
+
+ /*
+ case DELAY:
+ {
+ // op1: delay (ms), op2: volume (%)
+ uint32 delay = op1*SAMPLE_RATE/1000.0f;
+ float *data = (float*)(v->data[wave]+4);
+ int *p = (int*)(v->data[wave]);
+ v->waves[wave][i] = (op2/100.0f)*data[*p];
+ // circular buffer
+ data[*p] = v->waves[wave-1][i];
+ *p = (*p + 1)%delay;
+ break;
+ }
+ */
default:
goto end;
}
// data buffer to store, for example, previous inputs/outputs for
// filtering. It is as big as the wave buffer. Anyway, voices will be
// created at bss, so they don't count for the file size :)
- uint8 data[MAX_OPS][BUFFER_SIZE*sizeof(float)];
+ uint8 data[MAX_OPS][20*BUFFER_SIZE*sizeof(float)];
// buffers generated by wave operations
float waves[MAX_OPS][BUFFER_SIZE];
#define HPF 7
#define NOISE 8
#define SIGMOID 9
+#define DELAY 10
#define ENDI 254
#define END 255
extern uint8 synth(Voice *v, int len, float *mix_buf);
extern float detune(float base, int coarse, int fine);
-
+extern float noise();
#endif // SYNTH_H